LyoKICogdGVzdGFwaS5jOiBsaWJ4bWwyIEFQSSB0ZXN0ZXIgcHJvZ3JhbS4KICoKICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgZ2VudGVzdC5weSBmcm9tIGxpYnhtbDItYXBpLnhtbAogKgogKiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIGRhbmllbEB2ZWlsbGFyZC5jb20KICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bGlieG1sL3htbGVycm9yLmg+CiNpbmNsdWRlIDxsaWJ4bWwvcmVsYXhuZy5oPgoKc3RhdGljIGludCB0ZXN0bGlieG1sMih2b2lkKTsKc3RhdGljIGludCB0ZXN0X21vZHVsZShjb25zdCBjaGFyICptb2R1bGUpOwoKc3RhdGljIGludCBnZW5lcmljX2Vycm9ycyA9IDA7CnN0YXRpYyBpbnQgY2FsbF90ZXN0cyA9IDA7CnN0YXRpYyBpbnQgZnVuY3Rpb25fdGVzdHMgPSAwOwoKc3RhdGljIHhtbENoYXIgY2hhcnRhYlsxMDI0XTsKc3RhdGljIGludCBpbnR0YWJbMTAyNF07CnN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmd0YWJbMTAyNF07CgpzdGF0aWMgeG1sRG9jUHRyIGFwaV9kb2MgPSBOVUxMOwpzdGF0aWMgeG1sRHRkUHRyIGFwaV9kdGQgPSBOVUxMOwpzdGF0aWMgeG1sTm9kZVB0ciBhcGlfcm9vdCA9IE5VTEw7CnN0YXRpYyB4bWxBdHRyUHRyIGFwaV9hdHRyID0gTlVMTDsKc3RhdGljIHhtbE5zUHRyIGFwaV9ucyA9IE5VTEw7CgpzdGF0aWMgdm9pZApzdHJ1Y3R1cmVkX2Vycm9ycyh2b2lkICp1c2VyRGF0YSBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgICAgICB4bWxFcnJvclB0ciBlcnJvciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBnZW5lcmljX2Vycm9ycysrOwp9CgpzdGF0aWMgdm9pZApmcmVlX2FwaV9kb2Modm9pZCkgewogICAgeG1sRnJlZURvYyhhcGlfZG9jKTsKICAgIGFwaV9kb2MgPSBOVUxMOwogICAgYXBpX2R0ZCA9IE5VTEw7CiAgICBhcGlfcm9vdCA9IE5VTEw7CiAgICBhcGlfYXR0ciA9IE5VTEw7CiAgICBhcGlfbnMgPSBOVUxMOwp9CgpzdGF0aWMgeG1sRG9jUHRyCmdldF9hcGlfZG9jKHZvaWQpIHsKICAgIGlmIChhcGlfZG9jID09IE5VTEwpIHsKICAgICAgICBhcGlfZG9jID0geG1sUmVhZE1lbW9yeSgiPCFET0NUWVBFIHJvb3QgWzwhRUxFTUVOVCByb290IEVNUFRZPl0+PHJvb3QgeG1sbnM6aD0naHR0cDovL2V4YW1wbGUuY29tLycgaDpmb289J2JhcicvPiIsIDg4LCAicm9vdF90ZXN0IiwgTlVMTCwgMCk7CglhcGlfcm9vdCA9IE5VTEw7CglhcGlfYXR0ciA9IE5VTEw7CiAgICB9CiAgICByZXR1cm4oYXBpX2RvYyk7Cn0KCnN0YXRpYyB4bWxEdGRQdHIKZ2V0X2FwaV9kdGQodm9pZCkgewogICAgaWYgKChhcGlfZHRkID09IE5VTEwpIHx8IChhcGlfZHRkLT50eXBlICE9IFhNTF9EVERfTk9ERSkpIHsKICAgICAgICBnZXRfYXBpX2RvYygpOwoJaWYgKChhcGlfZG9jICE9IE5VTEwpICYmIChhcGlfZG9jLT5jaGlsZHJlbiAhPSBOVUxMKSAmJgoJICAgIChhcGlfZG9jLT5jaGlsZHJlbi0+dHlwZSA9PSBYTUxfRFREX05PREUpKQoJICAgIGFwaV9kdGQgPSAoeG1sRHRkUHRyKSBhcGlfZG9jLT5jaGlsZHJlbjsKICAgIH0KICAgIHJldHVybihhcGlfZHRkKTsKfQoKc3RhdGljIHhtbE5vZGVQdHIKZ2V0X2FwaV9yb290KHZvaWQpIHsKICAgIGlmICgoYXBpX3Jvb3QgPT0gTlVMTCkgfHwgKGFwaV9yb290LT50eXBlICE9IFhNTF9FTEVNRU5UX05PREUpKSB7CiAgICAgICAgZ2V0X2FwaV9kb2MoKTsKCWlmICgoYXBpX2RvYyAhPSBOVUxMKSAmJiAoYXBpX2RvYy0+Y2hpbGRyZW4gIT0gTlVMTCkgJiYKCSAgICAoYXBpX2RvYy0+Y2hpbGRyZW4tPm5leHQgIT0gTlVMTCkgJiYKCSAgICAoYXBpX2RvYy0+Y2hpbGRyZW4tPm5leHQtPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkpCgkgICAgYXBpX3Jvb3QgPSBhcGlfZG9jLT5jaGlsZHJlbi0+bmV4dDsKICAgIH0KICAgIHJldHVybihhcGlfcm9vdCk7Cn0KCnN0YXRpYyB4bWxOc1B0cgpnZXRfYXBpX25zKHZvaWQpIHsKICAgIGdldF9hcGlfcm9vdCgpOwogICAgaWYgKGFwaV9yb290ICE9IE5VTEwpCiAgICAgICAgYXBpX25zID0gYXBpX3Jvb3QtPm5zRGVmOwogICAgcmV0dXJuKGFwaV9ucyk7Cn0KCnN0YXRpYyB4bWxBdHRyUHRyCmdldF9hcGlfYXR0cih2b2lkKSB7CiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1hJTkNMVURFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgc3RhdGljIGludCBuciA9IDA7CiAgICB4bWxDaGFyIG5hbWVbMjBdOwojZW5kaWYKCiAgICBpZiAoKGFwaV9yb290ID09IE5VTEwpIHx8IChhcGlfcm9vdC0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKSkgewogICAgICAgIGdldF9hcGlfcm9vdCgpOwogICAgfQogICAgaWYgKGFwaV9yb290ID09IE5VTEwpIAogICAgICAgIHJldHVybihOVUxMKTsKICAgIGlmIChhcGlfcm9vdC0+cHJvcGVydGllcyAhPSBOVUxMKSB7CiAgICAgICAgYXBpX2F0dHIgPSBhcGlfcm9vdC0+cHJvcGVydGllczsKICAgICAgICByZXR1cm4oYXBpX3Jvb3QtPnByb3BlcnRpZXMpOwogICAgfQogICAgYXBpX2F0dHIgPSBOVUxMOwojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9YSU5DTFVERV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIHNucHJpbnRmKChjaGFyICopIG5hbWUsIDIwLCAiZm9vJWQiLCBucisrKTsKICAgIGFwaV9hdHRyID0geG1sU2V0UHJvcChhcGlfcm9vdCwgbmFtZSwgKGNvbnN0IHhtbENoYXIgKikgImJhciIpOwojZW5kaWYKICAgIHJldHVybihhcGlfYXR0cik7Cn0KCnN0YXRpYyBpbnQgcXVpZXQgPSAwOwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBpbnQgcmV0OwogICAgaW50IGJsb2NrcywgbWVtOwoKICAgIG1lbXNldChjaGFydGFiLCAwLCBzaXplb2YoY2hhcnRhYikpOwogICAgc3RybmNweSgoY2hhciAqKSBjaGFydGFiLCAiICBjaGFydGFiXG4iLCAyMCk7CiAgICBtZW1zZXQoaW50dGFiLCAwLCBzaXplb2YoaW50dGFiKSk7CiAgICBtZW1zZXQobG9uZ3RhYiwgMCwgc2l6ZW9mKGxvbmd0YWIpKTsKCiAgICB4bWxJbml0UGFyc2VyKCk7CiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECiAgICB4bWxSZWxheE5HSW5pdFR5cGVzKCk7CiNlbmRpZgoKICAgIExJQlhNTF9URVNUX1ZFUlNJT04KCiAgICB4bWxTZXRTdHJ1Y3R1cmVkRXJyb3JGdW5jKE5VTEwsIHN0cnVjdHVyZWRfZXJyb3JzKTsKCiAgICBpZiAoYXJnYyA+PSAyKSB7CiAgICAgICAgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1xIikpIHsKCSAgICBxdWlldCA9IDE7CgkgICAgaWYgKGFyZ2MgPj0gMykKCSAgICAgICAgcmV0ID0gdGVzdF9tb2R1bGUoYXJndlsyXSk7CgkgICAgZWxzZQoJCXJldCA9IHRlc3RsaWJ4bWwyKCk7CiAgICAgICAgfSBlbHNlIHsKCSAgIHJldCA9IHRlc3RfbW9kdWxlKGFyZ3ZbMV0pOwoJfQogICAgfSBlbHNlCglyZXQgPSB0ZXN0bGlieG1sMigpOwoKICAgIHhtbENsZWFudXBQYXJzZXIoKTsKICAgIGJsb2NrcyA9IHhtbE1lbUJsb2NrcygpOwogICAgbWVtID0geG1sTWVtVXNlZCgpOwogICAgaWYgKChibG9ja3MgIT0gMCkgfHwgKG1lbSAhPSAwKSkgewogICAgICAgIHByaW50ZigidGVzdGFwaSBsZWFrZWQgJWQgYnl0ZXMgaW4gJWQgYmxvY2tzXG4iLCBtZW0sIGJsb2Nrcyk7CiAgICB9CiAgICB4bWxNZW1vcnlEdW1wKCk7CgogICAgcmV0dXJuIChyZXQgIT0gMCk7Cn0KCiNpbmNsdWRlIDxsaWJ4bWwvSFRNTHBhcnNlci5oPgojaW5jbHVkZSA8bGlieG1sL0hUTUx0cmVlLmg+CiNpbmNsdWRlIDxsaWJ4bWwvY2F0YWxvZy5oPgojaW5jbHVkZSA8bGlieG1sL2NodmFsaWQuaD4KI2luY2x1ZGUgPGxpYnhtbC9kaWN0Lmg+CiNpbmNsdWRlIDxsaWJ4bWwvZW5jb2RpbmcuaD4KI2luY2x1ZGUgPGxpYnhtbC9lbnRpdGllcy5oPgojaW5jbHVkZSA8bGlieG1sL2hhc2guaD4KI2luY2x1ZGUgPGxpYnhtbC9saXN0Lmg+CiNpbmNsdWRlIDxsaWJ4bWwvbmFub2Z0cC5oPgojaW5jbHVkZSA8bGlieG1sL25hbm9odHRwLmg+CiNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CiNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VySW50ZXJuYWxzLmg+CiNpbmNsdWRlIDxsaWJ4bWwvcGF0dGVybi5oPgojaW5jbHVkZSA8bGlieG1sL3JlbGF4bmcuaD4KI2luY2x1ZGUgPGxpYnhtbC9zY2hlbWFzSW50ZXJuYWxzLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdHJlZS5oPgojaW5jbHVkZSA8bGlieG1sL3VyaS5oPgojaW5jbHVkZSA8bGlieG1sL3ZhbGlkLmg+CiNpbmNsdWRlIDxsaWJ4bWwveGluY2x1ZGUuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxJTy5oPgojaW5jbHVkZSA8bGlieG1sL3htbGVycm9yLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1scmVhZGVyLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sc2F2ZS5oPgojaW5jbHVkZSA8bGlieG1sL3htbHNjaGVtYXMuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxzY2hlbWFzdHlwZXMuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxzdHJpbmcuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWx3cml0ZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC94cGF0aC5oPgojaW5jbHVkZSA8bGlieG1sL3hwb2ludGVyLmg+CiNpbmNsdWRlIDxsaWJ4bWwvZGVidWdYTUwuaD4KCi8qIAogIFdlIG1hbnVhbGx5IGRlZmluZSB4bWxFcnJNZW1vcnkgYmVjYXVzZSBpdCdzIG5vcm1hbCBkZWNsYXJhdGlvbgogIGlzICJoaWRkZW4iIGJ5ICNpZmRlZiBJTl9MSUJYTUwKKi8Kdm9pZCB4bWxFcnJNZW1vcnkoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCBjb25zdCBjaGFyICpleHRyYSk7CgovKgogV2UgbmVlZCBzb21lICJyZW1vdGUiIGFkZHJlc3NlcywgYnV0IHdhbnQgdG8gYXZvaWQgZ2V0dGluZyBpbnRvCiBuYW1lIHJlc29sdXRpb24gZGVsYXlzLCBzbyB3ZSB1c2UgdGhlc2UKKi8KI2RlZmluZQlSRU1PVEUxR09PRAkiaHR0cDovL2xvY2FsaG9zdC8iCiNkZWZpbmUJUkVNT1RFMUJBRAkiaHR0cDovL21pc3NpbmcuIGV4YW1wbGUub3JnLyIKI2RlZmluZQlSRU1PVEUyR09PRAkiZnRwOi8vbG9jYWxob3N0L2ZvbyIKCiNkZWZpbmUgZ2VuX25iX3ZvaWRfcHRyIDIKCnN0YXRpYyB2b2lkICpnZW5fdm9pZF9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3ZvaWRfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB2b2lkICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2lmIDAKI2RlZmluZSBnZW5fbmJfY29uc3Rfdm9pZF9wdHIgMgoKc3RhdGljIGNvbnN0IHZvaWQgKmdlbl9jb25zdF92b2lkX3B0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKChjb25zdCB2b2lkICopICJpbW11dGFibGUgc3RyaW5nIik7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X3ZvaWRfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB2b2lkICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCiNkZWZpbmUgZ2VuX25iX3VzZXJkYXRhIDMKCnN0YXRpYyB2b2lkICpnZW5fdXNlcmRhdGEoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybigodm9pZCAqKSAmY2FsbF90ZXN0cyk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKCh2b2lkICopIC0xKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfdXNlcmRhdGEoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHZvaWQgKnZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgoKI2RlZmluZSBnZW5fbmJfaW50IDQKCnN0YXRpYyBpbnQgZ2VuX2ludChpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKDApOwogICAgaWYgKG5vID09IDEpIHJldHVybigxKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oLTEpOwogICAgaWYgKG5vID09IDMpIHJldHVybigxMjIpOwogICAgcmV0dXJuKC0xKTsKfQoKc3RhdGljIHZvaWQgZGVzX2ludChpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl9wYXJzZXJvcHRpb25zIDUKCnN0YXRpYyBpbnQgZ2VuX3BhcnNlcm9wdGlvbnMoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybihYTUxfUEFSU0VfTk9CTEFOS1MgfCBYTUxfUEFSU0VfUkVDT1ZFUik7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKFhNTF9QQVJTRV9OT0VOVCB8IFhNTF9QQVJTRV9EVERMT0FEIHwgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfRFREVkFMSUQgfCBYTUxfUEFSU0VfTk9DREFUQSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFhNTF9QQVJTRV9YSU5DTFVERSB8IFhNTF9QQVJTRV9OT1hJTkNOT0RFIHwgWE1MX1BBUlNFX05TQ0xFQU4pOwogICAgaWYgKG5vID09IDMpIHJldHVybihYTUxfUEFSU0VfWElOQ0xVREUgfCBYTUxfUEFSU0VfTk9ESUNUKTsKICAgIHJldHVybihYTUxfUEFSU0VfU0FYMSk7Cn0KCnN0YXRpYyB2b2lkIGRlc19wYXJzZXJvcHRpb25zKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNpZiAwCiNkZWZpbmUgZ2VuX25iX2xvbmcgNQoKc3RhdGljIGxvbmcgZ2VuX2xvbmcoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybigwKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oMSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKC0xKTsKICAgIGlmIChubyA9PSAzKSByZXR1cm4oMTIyKTsKICAgIHJldHVybigtMSk7Cn0KCnN0YXRpYyB2b2lkIGRlc19sb25nKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBsb25nIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKI2RlZmluZSBnZW5fbmJfeG1sQ2hhciA0CgpzdGF0aWMgeG1sQ2hhciBnZW5feG1sQ2hhcihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKCdhJyk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKCcgJyk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKCf4Jyk7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxDaGFyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxDaGFyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl91bnNpZ25lZF9pbnQgMwoKc3RhdGljIHVuc2lnbmVkIGludCBnZW5fdW5zaWduZWRfaW50KGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oMCk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKDEpOwogICAgaWYgKG5vID09IDIpIHJldHVybigxMjIpOwogICAgcmV0dXJuKC0xKTsKfQoKc3RhdGljIHZvaWQgZGVzX3Vuc2lnbmVkX2ludChpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgdW5zaWduZWQgaW50IHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl91bnNpZ25lZF9sb25nIDQKCnN0YXRpYyB1bnNpZ25lZCBsb25nIGdlbl91bnNpZ25lZF9sb25nKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oMCk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKDEpOwogICAgaWYgKG5vID09IDIpIHJldHVybigxMjIpOwogICAgcmV0dXJuKC0xKTsKfQoKc3RhdGljIHZvaWQgZGVzX3Vuc2lnbmVkX2xvbmcoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHVuc2lnbmVkIGxvbmcgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX2RvdWJsZSA0CgpzdGF0aWMgZG91YmxlIGdlbl9kb3VibGUoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybigwKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oLTEuMSk7CiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaWYgKG5vID09IDIpIHJldHVybih4bWxYUGF0aE5BTik7CiNlbmRpZgogICAgcmV0dXJuKC0xKTsKfQoKc3RhdGljIHZvaWQgZGVzX2RvdWJsZShpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgZG91YmxlIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl91bnNpZ25lZF9sb25nX3B0ciAyCgpzdGF0aWMgdW5zaWduZWQgbG9uZyAqZ2VuX3Vuc2lnbmVkX2xvbmdfcHRyKGludCBubywgaW50IG5yKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKCZsb25ndGFiW25yXSk7CiAgICByZXR1cm4oTlVMTCk7Cn0KCnN0YXRpYyB2b2lkIGRlc191bnNpZ25lZF9sb25nX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgdW5zaWduZWQgbG9uZyAqdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX2ludF9wdHIgMgoKc3RhdGljIGludCAqZ2VuX2ludF9wdHIoaW50IG5vLCBpbnQgbnIpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oJmludHRhYltucl0pOwogICAgcmV0dXJuKE5VTEwpOwp9CgpzdGF0aWMgdm9pZCBkZXNfaW50X3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50ICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfY29uc3RfY2hhcl9wdHIgNAoKc3RhdGljIGNoYXIgKmdlbl9jb25zdF9jaGFyX3B0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKChjaGFyICopICJmb28iKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oKGNoYXIgKikgIjxmb28vPiIpOwogICAgaWYgKG5vID09IDIpIHJldHVybigoY2hhciAqKSAidGVzdC9lbnQyIik7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X2NoYXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfeG1sQ2hhcl9wdHIgMgoKc3RhdGljIHhtbENoYXIgKmdlbl94bWxDaGFyX3B0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKCZjaGFydGFiWzBdKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sQ2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbENoYXIgKnZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl9GSUxFX3B0ciAyCgpzdGF0aWMgRklMRSAqZ2VuX0ZJTEVfcHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oZm9wZW4oInRlc3Qub3V0IiwgImErIikpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19GSUxFX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgRklMRSAqdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSBmY2xvc2UodmFsKTsKfQoKI2RlZmluZSBnZW5fbmJfZGVidWdfRklMRV9wdHIgMgpzdGF0aWMgRklMRSAqZ2VuX2RlYnVnX0ZJTEVfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKGZvcGVuKCJ0ZXN0Lm91dCIsICJhKyIpKTsKfQpzdGF0aWMgdm9pZCBkZXNfZGVidWdfRklMRV9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIEZJTEUgKnZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgZmNsb3NlKHZhbCk7Cn0KCiNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyIDUKCnN0YXRpYyB4bWxDaGFyICpnZW5fY29uc3RfeG1sQ2hhcl9wdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybigoeG1sQ2hhciAqKSAiZm9vIik7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKCh4bWxDaGFyICopICI8Zm9vLz4iKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oKHhtbENoYXIgKikgIm74bmUiKTsKICAgIGlmIChubyA9PSAzKSByZXR1cm4oKHhtbENoYXIgKikgIiAyYWIgIik7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbENoYXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfZmlsZXBhdGggOAoKc3RhdGljIGNvbnN0IGNoYXIgKmdlbl9maWxlcGF0aChpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKCJtaXNzaW5nLnhtbCIpOwogICAgaWYgKG5vID09IDEpIHJldHVybigiPGZvby8+Iik7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKCJ0ZXN0L2VudDIiKTsKICAgIGlmIChubyA9PSAzKSByZXR1cm4oInRlc3QvdmFsaWQvUkVDLXhtbC0xOTk4MDIxMC54bWwiKTsKICAgIGlmIChubyA9PSA0KSByZXR1cm4oInRlc3QvdmFsaWQvZHRkcy94aHRtbDEtc3RyaWN0LmR0ZCIpOwogICAgaWYgKG5vID09IDUpIHJldHVybihSRU1PVEUxR09PRCk7CiAgICBpZiAobm8gPT0gNikgcmV0dXJuKFJFTU9URTFCQUQpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19maWxlcGF0aChpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX2VhdGVuX25hbWUgMgoKc3RhdGljIHhtbENoYXIgKmdlbl9lYXRlbl9uYW1lKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sU3RyZHVwKEJBRF9DQVNUICJlYXRlbiIpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfZWF0ZW5fbmFtZShpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2hhciAqdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX2ZpbGVvdXRwdXQgNgoKc3RhdGljIGNvbnN0IGNoYXIgKmdlbl9maWxlb3V0cHV0KGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oIi9taXNzaW5nLnhtbCIpOwogICAgaWYgKG5vID09IDEpIHJldHVybigiPGZvby8+Iik7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFJFTU9URTJHT09EKTsKICAgIGlmIChubyA9PSAzKSByZXR1cm4oUkVNT1RFMUdPT0QpOwogICAgaWYgKG5vID09IDQpIHJldHVybihSRU1PVEUxQkFEKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfZmlsZW91dHB1dChpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX3htbFBhcnNlckN0eHRQdHIgMwpzdGF0aWMgeG1sUGFyc2VyQ3R4dFB0ciBnZW5feG1sUGFyc2VyQ3R4dFB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbE5ld1BhcnNlckN0eHQoKSk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKHhtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQoIjxkb2MvPiIsIDYpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sUGFyc2VyQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUGFyc2VyQ3R4dFB0ciB2YWwsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAodmFsICE9IE5VTEwpCiAgICAgICAgeG1sRnJlZVBhcnNlckN0eHQodmFsKTsKfQoKI2RlZmluZSBnZW5fbmJfeG1sU0FYSGFuZGxlclB0ciAyCnN0YXRpYyB4bWxTQVhIYW5kbGVyUHRyIGdlbl94bWxTQVhIYW5kbGVyUHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGlmIChubyA9PSAwKSByZXR1cm4oKHhtbFNBWEhhbmRsZXJQdHIpICZ4bWxEZWZhdWx0U0FYSGFuZGxlcik7CiNlbmRpZgogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxTQVhIYW5kbGVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTQVhIYW5kbGVyUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl94bWxWYWxpZEN0eHRQdHIgMgpzdGF0aWMgeG1sVmFsaWRDdHh0UHRyIGdlbl94bWxWYWxpZEN0eHRQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewojaWZkZWYgTElCWE1MX1ZBTElEX0VOQUJMRUQKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sTmV3VmFsaWRDdHh0KCkpOwojZW5kaWYKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sVmFsaWRDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxWYWxpZEN0eHRQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewojaWZkZWYgTElCWE1MX1ZBTElEX0VOQUJMRUQKICAgIGlmICh2YWwgIT0gTlVMTCkKICAgICAgICB4bWxGcmVlVmFsaWRDdHh0KHZhbCk7CiNlbmRpZgp9CgojZGVmaW5lIGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciA4CgpzdGF0aWMgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgZ2VuX3htbFBhcnNlcklucHV0QnVmZmVyUHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZSgibWlzc2luZy54bWwiLCBYTUxfQ0hBUl9FTkNPRElOR19OT05FKSk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWUoIjxmb28vPiIsIFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZSgidGVzdC9lbnQyIiwgWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSkpOwogICAgaWYgKG5vID09IDMpIHJldHVybih4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKCJ0ZXN0L3ZhbGlkL1JFQy14bWwtMTk5ODAyMTAueG1sIiwgWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSkpOwogICAgaWYgKG5vID09IDQpIHJldHVybih4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKCJ0ZXN0L3ZhbGlkL2R0ZHMveGh0bWwxLXN0cmljdC5kdGQiLCBYTUxfQ0hBUl9FTkNPRElOR19OT05FKSk7CiAgICBpZiAobm8gPT0gNSkgcmV0dXJuKHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWUoUkVNT1RFMUdPT0QsIFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpKTsKICAgIGlmIChubyA9PSA2KSByZXR1cm4oeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZShSRU1PVEUxQkFELCBYTUxfQ0hBUl9FTkNPRElOR19OT05FKSk7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFBhcnNlcklucHV0QnVmZmVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciB2YWwsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICB4bWxGcmVlUGFyc2VySW5wdXRCdWZmZXIodmFsKTsKfQoKI2RlZmluZSBnZW5fbmJfeG1sRG9jUHRyIDMKc3RhdGljIHhtbERvY1B0ciBnZW5feG1sRG9jUHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sTmV3RG9jKEJBRF9DQVNUICIxLjAiKSk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKHhtbFJlYWRNZW1vcnkoIjxmb28vPiIsIDYsICJ0ZXN0IiwgTlVMTCwgMCkpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxEb2NQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbERvY1B0ciB2YWwsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAoKHZhbCAhPSBOVUxMKSAmJiAodmFsICE9IGFwaV9kb2MpICYmICh2YWwtPmRvYyAhPSBhcGlfZG9jKSkKICAgICAgICB4bWxGcmVlRG9jKHZhbCk7Cn0KCiNkZWZpbmUgZ2VuX25iX3htbEF0dHJQdHIgMgpzdGF0aWMgeG1sQXR0clB0ciBnZW5feG1sQXR0clB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKGdldF9hcGlfYXR0cigpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sQXR0clB0cihpbnQgbm8sIHhtbEF0dHJQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgZnJlZV9hcGlfZG9jKCk7Cn0KCiNkZWZpbmUgZ2VuX25iX3htbERpY3RQdHIgMgpzdGF0aWMgeG1sRGljdFB0ciBnZW5feG1sRGljdFB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbERpY3RDcmVhdGUoKSk7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbERpY3RQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbERpY3RQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKQogICAgICAgIHhtbERpY3RGcmVlKHZhbCk7Cn0KCiNkZWZpbmUgZ2VuX25iX3htbE5vZGVQdHIgMwpzdGF0aWMgeG1sTm9kZVB0ciBnZW5feG1sTm9kZVB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbE5ld1BJKEJBRF9DQVNUICJ0ZXN0IiwgTlVMTCkpOwogICAgaWYgKG5vID09IDEpIHJldHVybihnZXRfYXBpX3Jvb3QoKSk7CiAgICByZXR1cm4oTlVMTCk7Ci8qICAgICBpZiAobm8gPT0gMikgcmV0dXJuKCh4bWxOb2RlUHRyKSBnZXRfYXBpX2RvYygpKTsgKi8KfQpzdGF0aWMgdm9pZCBkZXNfeG1sTm9kZVB0cihpbnQgbm8sIHhtbE5vZGVQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIGZyZWVfYXBpX2RvYygpOwogICAgZWxzZSBpZiAodmFsICE9IE5VTEwpIHsKICAgICAgICB4bWxVbmxpbmtOb2RlKHZhbCk7CiAgICAgICAgeG1sRnJlZU5vZGUodmFsKTsKICAgIH0KfQoKI2RlZmluZSBnZW5fbmJfeG1sRHRkUHRyIDMKc3RhdGljIHhtbER0ZFB0ciBnZW5feG1sRHRkUHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSAKICAgICAgICByZXR1cm4oeG1sTmV3RHRkKE5VTEwsIEJBRF9DQVNUICJkdGQiLCBCQURfQ0FTVCJmb28iLCBCQURfQ0FTVCJiYXIiKSk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKGdldF9hcGlfZHRkKCkpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxEdGRQdHIoaW50IG5vLCB4bWxEdGRQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIGZyZWVfYXBpX2RvYygpOwogICAgZWxzZSBpZiAodmFsICE9IE5VTEwpIHsKICAgICAgICB4bWxVbmxpbmtOb2RlKCh4bWxOb2RlUHRyKSB2YWwpOwogICAgICAgIHhtbEZyZWVOb2RlKCh4bWxOb2RlUHRyKSB2YWwpOwogICAgfQp9CgojZGVmaW5lIGdlbl9uYl94bWxOc1B0ciAyCnN0YXRpYyB4bWxOc1B0ciBnZW5feG1sTnNQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybihnZXRfYXBpX25zKCkpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxOc1B0cihpbnQgbm8sIHhtbE5zUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIGZyZWVfYXBpX2RvYygpOwp9CgojZGVmaW5lIGdlbl9uYl94bWxOb2RlUHRyX2luIDMKc3RhdGljIHhtbE5vZGVQdHIgZ2VuX3htbE5vZGVQdHJfaW4oaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxOZXdQSShCQURfQ0FTVCAidGVzdCIsIE5VTEwpKTsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sTmV3VGV4dChCQURfQ0FTVCAidGV4dCIpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sTm9kZVB0cl9pbihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTm9kZVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2lmZGVmIExJQlhNTF9XUklURVJfRU5BQkxFRAojZGVmaW5lIGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyIDIKc3RhdGljIHhtbFRleHRXcml0ZXJQdHIgZ2VuX3htbFRleHRXcml0ZXJQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxOZXdUZXh0V3JpdGVyRmlsZW5hbWUoInRlc3Qub3V0IiwgMCkpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxUZXh0V3JpdGVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxUZXh0V3JpdGVyUHRyIHZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgeG1sRnJlZVRleHRXcml0ZXIodmFsKTsKfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sVGV4dFJlYWRlclB0ciA0CnN0YXRpYyB4bWxUZXh0UmVhZGVyUHRyIGdlbl94bWxUZXh0UmVhZGVyUHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sTmV3VGV4dFJlYWRlckZpbGVuYW1lKCJ0ZXN0L2VudDIiKSk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKHhtbE5ld1RleHRSZWFkZXJGaWxlbmFtZSgidGVzdC92YWxpZC9SRUMteG1sLTE5OTgwMjEwLnhtbCIpKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oeG1sTmV3VGV4dFJlYWRlckZpbGVuYW1lKCJ0ZXN0L3ZhbGlkL2R0ZHMveGh0bWwxLXN0cmljdC5kdGQiKSk7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFRleHRSZWFkZXJQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFRleHRSZWFkZXJQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB4bWxGcmVlVGV4dFJlYWRlcih2YWwpOwp9CiNlbmRpZgoKI2RlZmluZSBnZW5fbmJfeG1sQnVmZmVyUHRyIDMKc3RhdGljIHhtbEJ1ZmZlclB0ciBnZW5feG1sQnVmZmVyUHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sQnVmZmVyQ3JlYXRlKCkpOwogICAgaWYgKG5vID09IDEpIHJldHVybih4bWxCdWZmZXJDcmVhdGVTdGF0aWMoKHZvaWQgKikiYSBzdGF0aWMgYnVmZmVyIiwgMTMpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sQnVmZmVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxCdWZmZXJQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7CiAgICAgICAgeG1sQnVmZmVyRnJlZSh2YWwpOwogICAgfQp9CgojZGVmaW5lIGdlbl9uYl94bWxMaXN0UHRyIDIKc3RhdGljIHhtbExpc3RQdHIgZ2VuX3htbExpc3RQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxMaXN0Q3JlYXRlKE5VTEwsIE5VTEwpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sTGlzdFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTGlzdFB0ciB2YWwsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAodmFsICE9IE5VTEwpIHsKICAgICAgICB4bWxMaXN0RGVsZXRlKHZhbCk7CiAgICB9Cn0KCiNkZWZpbmUgZ2VuX25iX3htbEhhc2hUYWJsZVB0ciAyCnN0YXRpYyB4bWxIYXNoVGFibGVQdHIgZ2VuX3htbEhhc2hUYWJsZVB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbEhhc2hDcmVhdGUoMTApKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sSGFzaFRhYmxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxIYXNoVGFibGVQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7CiAgICAgICAgeG1sSGFzaEZyZWUodmFsLCBOVUxMKTsKICAgIH0KfQoKI2luY2x1ZGUgPGxpYnhtbC94cGF0aEludGVybmFscy5oPgoKI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECiNkZWZpbmUgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyIDUKc3RhdGljIHhtbFhQYXRoT2JqZWN0UHRyIGdlbl94bWxYUGF0aE9iamVjdFB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbFhQYXRoTmV3U3RyaW5nKEJBRF9DQVNUICJzdHJpbmcgb2JqZWN0IikpOwogICAgaWYgKG5vID09IDEpIHJldHVybih4bWxYUGF0aE5ld0Zsb2F0KDEuMSkpOwogICAgaWYgKG5vID09IDIpIHJldHVybih4bWxYUGF0aE5ld0Jvb2xlYW4oMSkpOwogICAgaWYgKG5vID09IDMpIHJldHVybih4bWxYUGF0aE5ld05vZGVTZXQoTlVMTCkpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxYUGF0aE9iamVjdFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sWFBhdGhPYmplY3RQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7CiAgICAgICAgeG1sWFBhdGhGcmVlT2JqZWN0KHZhbCk7CiAgICB9Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECiNkZWZpbmUgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0ciAyCnN0YXRpYyB4bWxPdXRwdXRCdWZmZXJQdHIgZ2VuX3htbE91dHB1dEJ1ZmZlclB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKCJ0ZXN0Lm91dCIsIE5VTEwsIDApKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxPdXRwdXRCdWZmZXJQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7CiAgICAgICAgeG1sT3V0cHV0QnVmZmVyQ2xvc2UodmFsKTsKICAgIH0KfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfRlRQX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sTmFub0ZUUEN0eHRQdHIgNApzdGF0aWMgdm9pZCAqZ2VuX3htbE5hbm9GVFBDdHh0UHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sTmFub0ZUUE5ld0N0eHQoUkVNT1RFMkdPT0QpKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oeG1sTmFub0ZUUE5ld0N0eHQoUkVNT1RFMUdPT0QpKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oeG1sTmFub0ZUUE5ld0N0eHQoImZvbyIpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sTmFub0ZUUEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHZvaWQgKnZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgewogICAgICAgIHhtbE5hbm9GVFBGcmVlQ3R4dCh2YWwpOwogICAgfQp9CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9IVFRQX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sTmFub0hUVFBDdHh0UHRyIDEKc3RhdGljIHZvaWQgKmdlbl94bWxOYW5vSFRUUEN0eHRQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxOYW5vSFRUUE9wZW4oUkVNT1RFMUdPT0QsIE5VTEwpKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oeG1sTmFub0hUVFBPcGVuKFJFTU9URTJHT09ELCBOVUxMKSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKHhtbE5hbm9IVFRQT3BlbihSRU1PVEUxQkFELCBOVUxMKSk7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbE5hbm9IVFRQQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgdm9pZCAqdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7Cgl4bWxOYW5vSFRUUENsb3NlKHZhbCk7CiAgICB9Cn0KI2VuZGlmCgojZGVmaW5lIGdlbl9uYl94bWxDaGFyRW5jb2RpbmcgNApzdGF0aWMgeG1sQ2hhckVuY29kaW5nIGdlbl94bWxDaGFyRW5jb2RpbmcoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybihYTUxfQ0hBUl9FTkNPRElOR19VVEY4KTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFhNTF9DSEFSX0VOQ09ESU5HXzg4NTlfMSk7CiAgICByZXR1cm4oWE1MX0NIQVJfRU5DT0RJTkdfRVJST1IpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxDaGFyRW5jb2RpbmcoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbENoYXJFbmNvZGluZyB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfeG1sSGFzaERlYWxsb2NhdG9yIDIKc3RhdGljIHZvaWQgCnRlc3RfeG1sSGFzaERlYWxsb2NhdG9yKHZvaWQgKnBheWxvYWQgQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyB4bWxIYXNoRGVhbGxvY2F0b3IgZ2VuX3htbEhhc2hEZWFsbG9jYXRvcihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHRlc3RfeG1sSGFzaERlYWxsb2NhdG9yKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sSGFzaERlYWxsb2NhdG9yKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxIYXNoRGVhbGxvY2F0b3IgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCgpzdGF0aWMgdm9pZCBkZXNyZXRfaW50KGludCB2YWwgQVRUUklCVVRFX1VOVVNFRCkgewp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxDaGFyKHhtbENoYXIgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQpzdGF0aWMgdm9pZCBkZXNyZXRfbG9uZyhsb25nIHZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3Vuc2lnbmVkX2xvbmcodW5zaWduZWQgbG9uZyB2YWwgQVRUUklCVVRFX1VOVVNFRCkgewp9CnN0YXRpYyB2b2lkIGRlc3JldF9kb3VibGUoZG91YmxlIHZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3htbENoYXJFbmNvZGluZyh4bWxDaGFyRW5jb2RpbmcgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojaWYgMApzdGF0aWMgdm9pZCBkZXNyZXRfY29uc3Rfdm9pZF9wdHIodm9pZCAqdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKc3RhdGljIHZvaWQgZGVzcmV0X3ZvaWRfcHRyKHZvaWQgKnZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X2NvbnN0X2NoYXJfcHRyKGNvbnN0IGNoYXIgKnZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKGNvbnN0IHhtbENoYXIgKnZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3htbENoYXJfcHRyKHhtbENoYXIgKnZhbCkgewogICAgaWYgKHZhbCAhPSBOVUxMKQoJeG1sRnJlZSh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxEb2NQdHIoeG1sRG9jUHRyIHZhbCkgewogICAgaWYgKHZhbCAhPSBhcGlfZG9jKQoJeG1sRnJlZURvYyh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxEaWN0UHRyKHhtbERpY3RQdHIgdmFsKSB7CiAgICB4bWxEaWN0RnJlZSh2YWwpOwp9CiNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKc3RhdGljIHZvaWQgZGVzcmV0X3htbE91dHB1dEJ1ZmZlclB0cih4bWxPdXRwdXRCdWZmZXJQdHIgdmFsKSB7CiAgICB4bWxPdXRwdXRCdWZmZXJDbG9zZSh2YWwpOwp9CiNlbmRpZgojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECnN0YXRpYyB2b2lkIGRlc3JldF94bWxUZXh0UmVhZGVyUHRyKHhtbFRleHRSZWFkZXJQdHIgdmFsKSB7CiAgICB4bWxGcmVlVGV4dFJlYWRlcih2YWwpOwp9CiNlbmRpZgpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sTm9kZVB0cih4bWxOb2RlUHRyIHZhbCkgewogICAgaWYgKCh2YWwgIT0gTlVMTCkgJiYgKHZhbCAhPSBhcGlfcm9vdCkgJiYgKHZhbCAhPSAoeG1sTm9kZVB0cikgYXBpX2RvYykpIHsKCXhtbFVubGlua05vZGUodmFsKTsKCXhtbEZyZWVOb2RlKHZhbCk7CiAgICB9Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3htbEF0dHJQdHIoeG1sQXR0clB0ciB2YWwpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgewoJeG1sVW5saW5rTm9kZSgoeG1sTm9kZVB0cikgdmFsKTsKCXhtbEZyZWVOb2RlKCh4bWxOb2RlUHRyKSB2YWwpOwogICAgfQp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxFbnRpdHlQdHIoeG1sRW50aXR5UHRyIHZhbCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7Cgl4bWxVbmxpbmtOb2RlKCh4bWxOb2RlUHRyKSB2YWwpOwoJeG1sRnJlZU5vZGUoKHhtbE5vZGVQdHIpIHZhbCk7CiAgICB9Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3htbEVsZW1lbnRQdHIoeG1sRWxlbWVudFB0ciB2YWwpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgewoJeG1sVW5saW5rTm9kZSgoeG1sTm9kZVB0cikgdmFsKTsKICAgIH0KfQpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sQXR0cmlidXRlUHRyKHhtbEF0dHJpYnV0ZVB0ciB2YWwpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgewoJeG1sVW5saW5rTm9kZSgoeG1sTm9kZVB0cikgdmFsKTsKICAgIH0KfQpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sTnNQdHIoeG1sTnNQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sRHRkUHRyKHhtbER0ZFB0ciB2YWwpIHsKICAgIGRlc3JldF94bWxOb2RlUHRyKCh4bWxOb2RlUHRyKXZhbCk7Cn0KI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECnN0YXRpYyB2b2lkIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cih4bWxYUGF0aE9iamVjdFB0ciB2YWwpIHsKICAgIHhtbFhQYXRoRnJlZU9iamVjdCh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxOb2RlU2V0UHRyKHhtbE5vZGVTZXRQdHIgdmFsKSB7CiAgICB4bWxYUGF0aEZyZWVOb2RlU2V0KHZhbCk7Cn0KI2VuZGlmCnN0YXRpYyB2b2lkIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHhtbFBhcnNlckN0eHRQdHIgdmFsKSB7CiAgICB4bWxGcmVlUGFyc2VyQ3R4dCh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cih4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciB2YWwpIHsKICAgIHhtbEZyZWVQYXJzZXJJbnB1dEJ1ZmZlcih2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxQYXJzZXJJbnB1dFB0cih4bWxQYXJzZXJJbnB1dFB0ciB2YWwpIHsKICAgIHhtbEZyZWVJbnB1dFN0cmVhbSh2YWwpOwp9CiNpZmRlZiBMSUJYTUxfV1JJVEVSX0VOQUJMRUQKc3RhdGljIHZvaWQgZGVzcmV0X3htbFRleHRXcml0ZXJQdHIoeG1sVGV4dFdyaXRlclB0ciB2YWwpIHsKICAgIHhtbEZyZWVUZXh0V3JpdGVyKHZhbCk7Cn0KI2VuZGlmCnN0YXRpYyB2b2lkIGRlc3JldF94bWxCdWZmZXJQdHIoeG1sQnVmZmVyUHRyIHZhbCkgewogICAgeG1sQnVmZmVyRnJlZSh2YWwpOwp9CiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECnN0YXRpYyB2b2lkIGRlc3JldF94bWxTY2hlbWFQYXJzZXJDdHh0UHRyKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgdmFsKSB7CiAgICB4bWxTY2hlbWFGcmVlUGFyc2VyQ3R4dCh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxTY2hlbWFUeXBlUHRyKHhtbFNjaGVtYVR5cGVQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIoeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgdmFsKSB7CiAgICB4bWxSZWxheE5HRnJlZVBhcnNlckN0eHQodmFsKTsKfQojZW5kaWYKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKc3RhdGljIHZvaWQgZGVzcmV0X2NvbnN0X2h0bWxFbnRpdHlEZXNjX3B0cihjb25zdCBodG1sRW50aXR5RGVzYyAqIHZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3htbE5hbm9IVFRQQ3R4dFB0cih2b2lkICp2YWwpIHsKICAgIHhtbE5hbm9IVFRQQ2xvc2UodmFsKTsKfQojZW5kaWYKI2lmZGVmIExJQlhNTF9GVFBfRU5BQkxFRApzdGF0aWMgdm9pZCBkZXNyZXRfeG1sTmFub0ZUUEN0eHRQdHIodm9pZCAqdmFsKSB7CiAgICB4bWxOYW5vRlRQQ2xvc2UodmFsKTsKfQojZW5kaWYKLyogY3V0IGFuZCBwYXN0ZWQgZnJvbSBhdXRvZ2VuZXJhdGVkIHRvIGF2b2lkIHRyb3VibGVzICovCiNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyX3B0ciAxCnN0YXRpYyB4bWxDaGFyICoqIGdlbl9jb25zdF94bWxDaGFyX3B0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbENoYXJfcHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfdW5zaWduZWRfY2hhcl9wdHIgMQpzdGF0aWMgdW5zaWduZWQgY2hhciAqIGdlbl91bnNpZ25lZF9jaGFyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfdW5zaWduZWRfY2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHVuc2lnbmVkIGNoYXIgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIgMQpzdGF0aWMgdW5zaWduZWQgY2hhciAqIGdlbl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfY29uc3RfaHRtbE5vZGVQdHIgMQpzdGF0aWMgaHRtbE5vZGVQdHIgZ2VuX2NvbnN0X2h0bWxOb2RlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19jb25zdF9odG1sTm9kZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgaHRtbE5vZGVQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAojZGVmaW5lIGdlbl9uYl9odG1sRG9jUHRyIDMKc3RhdGljIGh0bWxEb2NQdHIgZ2VuX2h0bWxEb2NQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKGh0bWxOZXdEb2MoTlVMTCwgTlVMTCkpOwogICAgaWYgKG5vID09IDEpIHJldHVybihodG1sUmVhZE1lbW9yeSgiPGh0bWwvPiIsIDcsICJ0ZXN0IiwgTlVMTCwgMCkpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19odG1sRG9jUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBodG1sRG9jUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKCh2YWwgIT0gTlVMTCkgJiYgKHZhbCAhPSBhcGlfZG9jKSAmJiAodmFsLT5kb2MgIT0gYXBpX2RvYykpCiAgICAgICAgeG1sRnJlZURvYyh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF9odG1sRG9jUHRyKGh0bWxEb2NQdHIgdmFsKSB7CiAgICBpZiAoKHZhbCAhPSBOVUxMKSAmJiAodmFsICE9IGFwaV9kb2MpICYmICh2YWwtPmRvYyAhPSBhcGlfZG9jKSkKICAgICAgICB4bWxGcmVlRG9jKHZhbCk7Cn0KI2RlZmluZSBnZW5fbmJfaHRtbFBhcnNlckN0eHRQdHIgMwpzdGF0aWMgaHRtbFBhcnNlckN0eHRQdHIgZ2VuX2h0bWxQYXJzZXJDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxOZXdQYXJzZXJDdHh0KCkpOwogICAgaWYgKG5vID09IDEpIHJldHVybihodG1sQ3JlYXRlTWVtb3J5UGFyc2VyQ3R4dCgiPGh0bWwvPiIsIDcpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfaHRtbFBhcnNlckN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGh0bWxQYXJzZXJDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKQogICAgICAgIGh0bWxGcmVlUGFyc2VyQ3R4dCh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF9odG1sUGFyc2VyQ3R4dFB0cihodG1sUGFyc2VyQ3R4dFB0ciB2YWwpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkKICAgICAgICBodG1sRnJlZVBhcnNlckN0eHQodmFsKTsKfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAojZGVmaW5lIGdlbl9uYl94bWxOb2RlU2V0UHRyIDEKc3RhdGljIHhtbE5vZGVTZXRQdHIgZ2VuX3htbE5vZGVTZXRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbE5vZGVTZXRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbE5vZGVTZXRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX0RFQlVHX0VOQUJMRUQKI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECiNkZWZpbmUgZ2VuX25iX3htbFNoZWxsQ3R4dFB0ciAxCnN0YXRpYyB4bWxTaGVsbEN0eHRQdHIgZ2VuX3htbFNoZWxsQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2hlbGxDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTaGVsbEN0eHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCiNlbmRpZgoKI2lmZGVmIExJQlhNTF9QQVRURVJOX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sUGF0dGVyblB0ciAxCnN0YXRpYyB4bWxQYXR0ZXJuUHRyIGdlbl94bWxQYXR0ZXJuUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxQYXR0ZXJuUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxQYXR0ZXJuUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKI2RlZmluZSBnZW5fbmJfeG1sRWxlbWVudENvbnRlbnRQdHIgMQpzdGF0aWMgeG1sRWxlbWVudENvbnRlbnRQdHIgZ2VuX3htbEVsZW1lbnRDb250ZW50UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxFbGVtZW50Q29udGVudFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRWxlbWVudENvbnRlbnRQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKQogICAgICAgIHhtbEZyZWVFbGVtZW50Q29udGVudCh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxFbGVtZW50Q29udGVudFB0cih4bWxFbGVtZW50Q29udGVudFB0ciB2YWwpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkKICAgICAgICB4bWxGcmVlRWxlbWVudENvbnRlbnQodmFsKTsKfQoKI2RlZmluZSBnZW5fbmJfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIgMQpzdGF0aWMgeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIgZ2VuX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxQYXJzZXJOb2RlSW5mb1NlcVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyB2b2lkIGRlc3JldF9jb25zdF94bWxQYXJzZXJOb2RlSW5mb19wdHIoY29uc3QgeG1sUGFyc2VyTm9kZUluZm8gKnZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqICAgV0FSTklORzogZW5kIG9mIHRoZSBtYW51YWxseSBtYWludGFpbmVkIHBhcnQgb2YgdGhlIHRlc3QgY29kZQkqCiAqICAgICAgICAgICAgZG8gbm90IHJlbW92ZSBvciBhbHRlciB0aGUgQ1VUIEhFUkUgbGluZQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBDVVQgSEVSRTogZXZlcnl0aGluZyBiZWxvdyB0aGF0IGxpbmUgaXMgZ2VuZXJhdGVkICovCiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECnN0YXRpYyB2b2lkIGRlc3JldF9odG1sU3RhdHVzKGh0bWxTdGF0dXMgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2VuZGlmCgojZGVmaW5lIGdlbl9uYl94bWxBdHRyaWJ1dGVEZWZhdWx0IDQKc3RhdGljIHhtbEF0dHJpYnV0ZURlZmF1bHQgZ2VuX3htbEF0dHJpYnV0ZURlZmF1bHQoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIHJldHVybihYTUxfQVRUUklCVVRFX0ZJWEVEKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX0FUVFJJQlVURV9JTVBMSUVEKTsKICAgIGlmIChubyA9PSAzKSByZXR1cm4oWE1MX0FUVFJJQlVURV9OT05FKTsKICAgIGlmIChubyA9PSA0KSByZXR1cm4oWE1MX0FUVFJJQlVURV9SRVFVSVJFRCk7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxBdHRyaWJ1dGVEZWZhdWx0KGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxBdHRyaWJ1dGVEZWZhdWx0IHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl94bWxBdHRyaWJ1dGVUeXBlIDQKc3RhdGljIHhtbEF0dHJpYnV0ZVR5cGUgZ2VuX3htbEF0dHJpYnV0ZVR5cGUoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIHJldHVybihYTUxfQVRUUklCVVRFX0NEQVRBKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX0FUVFJJQlVURV9FTlRJVElFUyk7CiAgICBpZiAobm8gPT0gMykgcmV0dXJuKFhNTF9BVFRSSUJVVEVfRU5USVRZKTsKICAgIGlmIChubyA9PSA0KSByZXR1cm4oWE1MX0FUVFJJQlVURV9FTlVNRVJBVElPTik7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxBdHRyaWJ1dGVUeXBlKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxBdHRyaWJ1dGVUeXBlIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl94bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIDMKc3RhdGljIHhtbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUgZ2VuX3htbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIHJldHVybihYTUxfQlVGRkVSX0FMTE9DX0RPVUJMRUlUKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX0JVRkZFUl9BTExPQ19FWEFDVCk7CiAgICBpZiAobm8gPT0gMykgcmV0dXJuKFhNTF9CVUZGRVJfQUxMT0NfSU1NVVRBQkxFKTsKICAgIHJldHVybigwKTsKfQoKc3RhdGljIHZvaWQgZGVzX3htbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyB2b2lkIGRlc3JldF94bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lKHhtbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2lmZGVmIExJQlhNTF9DQVRBTE9HX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sQ2F0YWxvZ0FsbG93IDQKc3RhdGljIHhtbENhdGFsb2dBbGxvdyBnZW5feG1sQ2F0YWxvZ0FsbG93KGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oWE1MX0NBVEFfQUxMT1dfQUxMKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX0NBVEFfQUxMT1dfRE9DVU1FTlQpOwogICAgaWYgKG5vID09IDMpIHJldHVybihYTUxfQ0FUQV9BTExPV19HTE9CQUwpOwogICAgaWYgKG5vID09IDQpIHJldHVybihYTUxfQ0FUQV9BTExPV19OT05FKTsKICAgIHJldHVybigwKTsKfQoKc3RhdGljIHZvaWQgZGVzX3htbENhdGFsb2dBbGxvdyhpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2F0YWxvZ0FsbG93IHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sQ2F0YWxvZ0FsbG93KHhtbENhdGFsb2dBbGxvdyB2YWwgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZW5kaWYKCiNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECiNkZWZpbmUgZ2VuX25iX3htbENhdGFsb2dQcmVmZXIgMwpzdGF0aWMgeG1sQ2F0YWxvZ1ByZWZlciBnZW5feG1sQ2F0YWxvZ1ByZWZlcihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKFhNTF9DQVRBX1BSRUZFUl9OT05FKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX0NBVEFfUFJFRkVSX1BVQkxJQyk7CiAgICBpZiAobm8gPT0gMykgcmV0dXJuKFhNTF9DQVRBX1BSRUZFUl9TWVNURU0pOwogICAgcmV0dXJuKDApOwp9CgpzdGF0aWMgdm9pZCBkZXNfeG1sQ2F0YWxvZ1ByZWZlcihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2F0YWxvZ1ByZWZlciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIHZvaWQgZGVzcmV0X3htbENhdGFsb2dQcmVmZXIoeG1sQ2F0YWxvZ1ByZWZlciB2YWwgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZW5kaWYKCiNkZWZpbmUgZ2VuX25iX3htbEVsZW1lbnRDb250ZW50VHlwZSA0CnN0YXRpYyB4bWxFbGVtZW50Q29udGVudFR5cGUgZ2VuX3htbEVsZW1lbnRDb250ZW50VHlwZShpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKFhNTF9FTEVNRU5UX0NPTlRFTlRfRUxFTUVOVCk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFhNTF9FTEVNRU5UX0NPTlRFTlRfT1IpOwogICAgaWYgKG5vID09IDMpIHJldHVybihYTUxfRUxFTUVOVF9DT05URU5UX1BDREFUQSk7CiAgICBpZiAobm8gPT0gNCkgcmV0dXJuKFhNTF9FTEVNRU5UX0NPTlRFTlRfU0VRKTsKICAgIHJldHVybigwKTsKfQoKc3RhdGljIHZvaWQgZGVzX3htbEVsZW1lbnRDb250ZW50VHlwZShpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRWxlbWVudENvbnRlbnRUeXBlIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl94bWxFbGVtZW50VHlwZVZhbCA0CnN0YXRpYyB4bWxFbGVtZW50VHlwZVZhbCBnZW5feG1sRWxlbWVudFR5cGVWYWwoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIHJldHVybihYTUxfRUxFTUVOVF9UWVBFX0FOWSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFhNTF9FTEVNRU5UX1RZUEVfRUxFTUVOVCk7CiAgICBpZiAobm8gPT0gMykgcmV0dXJuKFhNTF9FTEVNRU5UX1RZUEVfRU1QVFkpOwogICAgaWYgKG5vID09IDQpIHJldHVybihYTUxfRUxFTUVOVF9UWVBFX01JWEVEKTsKICAgIHJldHVybigwKTsKfQoKc3RhdGljIHZvaWQgZGVzX3htbEVsZW1lbnRUeXBlVmFsKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbGVtZW50VHlwZVZhbCB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIHZvaWQgZGVzcmV0X3htbFBhcnNlckVycm9ycyh4bWxQYXJzZXJFcnJvcnMgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hVmFsVHlwZSA0CnN0YXRpYyB4bWxTY2hlbWFWYWxUeXBlIGdlbl94bWxTY2hlbWFWYWxUeXBlKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oWE1MX1NDSEVNQVNfQU5ZU0lNUExFVFlQRSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFhNTF9TQ0hFTUFTX0FOWVRZUEUpOwogICAgaWYgKG5vID09IDMpIHJldHVybihYTUxfU0NIRU1BU19BTllVUkkpOwogICAgaWYgKG5vID09IDQpIHJldHVybihYTUxfU0NIRU1BU19CQVNFNjRCSU5BUlkpOwogICAgcmV0dXJuKDApOwp9CgpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hVmFsVHlwZShpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hVmFsVHlwZSB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIHZvaWQgZGVzcmV0X3htbFNjaGVtYVZhbFR5cGUoeG1sU2NoZW1hVmFsVHlwZSB2YWwgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZW5kaWYKCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECiNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUgNApzdGF0aWMgeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZSBnZW5feG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZShpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKFhNTF9TQ0hFTUFfV0hJVEVTUEFDRV9DT0xMQVBTRSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFhNTF9TQ0hFTUFfV0hJVEVTUEFDRV9QUkVTRVJWRSk7CiAgICBpZiAobm8gPT0gMykgcmV0dXJuKFhNTF9TQ0hFTUFfV0hJVEVTUEFDRV9SRVBMQUNFKTsKICAgIGlmIChubyA9PSA0KSByZXR1cm4oWE1MX1NDSEVNQV9XSElURVNQQUNFX1VOS05PV04pOwogICAgcmV0dXJuKDApOwp9CgpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZShpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZSB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2VuZGlmCgojaW5jbHVkZSA8bGlieG1sL0hUTUxwYXJzZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC9IVE1MdHJlZS5oPgojaW5jbHVkZSA8bGlieG1sL1NBWDIuaD4KI2luY2x1ZGUgPGxpYnhtbC9jMTRuLmg+CiNpbmNsdWRlIDxsaWJ4bWwvY2F0YWxvZy5oPgojaW5jbHVkZSA8bGlieG1sL2NodmFsaWQuaD4KI2luY2x1ZGUgPGxpYnhtbC9kZWJ1Z1hNTC5oPgojaW5jbHVkZSA8bGlieG1sL2RpY3QuaD4KI2luY2x1ZGUgPGxpYnhtbC9lbmNvZGluZy5oPgojaW5jbHVkZSA8bGlieG1sL2VudGl0aWVzLmg+CiNpbmNsdWRlIDxsaWJ4bWwvaGFzaC5oPgojaW5jbHVkZSA8bGlieG1sL2xpc3QuaD4KI2luY2x1ZGUgPGxpYnhtbC9uYW5vZnRwLmg+CiNpbmNsdWRlIDxsaWJ4bWwvbmFub2h0dHAuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXJJbnRlcm5hbHMuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXR0ZXJuLmg+CiNpbmNsdWRlIDxsaWJ4bWwvcmVsYXhuZy5oPgojaW5jbHVkZSA8bGlieG1sL3NjaGVtYXNJbnRlcm5hbHMuaD4KI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdXJpLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdmFsaWQuaD4KI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgojaW5jbHVkZSA8bGlieG1sL3htbElPLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sYXV0b21hdGEuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxlcnJvci5oPgojaW5jbHVkZSA8bGlieG1sL3htbG1vZHVsZS5oPgojaW5jbHVkZSA8bGlieG1sL3htbHJlYWRlci5oPgojaW5jbHVkZSA8bGlieG1sL3htbHJlZ2V4cC5oPgojaW5jbHVkZSA8bGlieG1sL3htbHNhdmUuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxzY2hlbWFzLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sc2NoZW1hc3R5cGVzLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sc3RyaW5nLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sdW5pY29kZS5oPgojaW5jbHVkZSA8bGlieG1sL3htbHdyaXRlci5oPgojaW5jbHVkZSA8bGlieG1sL3hwYXRoLmg+CiNpbmNsdWRlIDxsaWJ4bWwveHBhdGhJbnRlcm5hbHMuaD4KI2luY2x1ZGUgPGxpYnhtbC94cG9pbnRlci5oPgpzdGF0aWMgaW50IHRlc3RfSFRNTHBhcnNlcih2b2lkKTsKc3RhdGljIGludCB0ZXN0X0hUTUx0cmVlKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfU0FYMih2b2lkKTsKc3RhdGljIGludCB0ZXN0X2MxNG4odm9pZCk7CnN0YXRpYyBpbnQgdGVzdF9jYXRhbG9nKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfY2h2YWxpZCh2b2lkKTsKc3RhdGljIGludCB0ZXN0X2RlYnVnWE1MKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfZGljdCh2b2lkKTsKc3RhdGljIGludCB0ZXN0X2VuY29kaW5nKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfZW50aXRpZXModm9pZCk7CnN0YXRpYyBpbnQgdGVzdF9oYXNoKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfbGlzdCh2b2lkKTsKc3RhdGljIGludCB0ZXN0X25hbm9mdHAodm9pZCk7CnN0YXRpYyBpbnQgdGVzdF9uYW5vaHR0cCh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3BhcnNlcih2b2lkKTsKc3RhdGljIGludCB0ZXN0X3BhcnNlckludGVybmFscyh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3BhdHRlcm4odm9pZCk7CnN0YXRpYyBpbnQgdGVzdF9yZWxheG5nKHZvaWQpOwpzdGF0aWMgaW50IHRlc3Rfc2NoZW1hc0ludGVybmFscyh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3RyZWUodm9pZCk7CnN0YXRpYyBpbnQgdGVzdF91cmkodm9pZCk7CnN0YXRpYyBpbnQgdGVzdF92YWxpZCh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3hpbmNsdWRlKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeG1sSU8odm9pZCk7CnN0YXRpYyBpbnQgdGVzdF94bWxhdXRvbWF0YSh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3htbGVycm9yKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeG1sbW9kdWxlKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeG1scmVhZGVyKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeG1scmVnZXhwKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeG1sc2F2ZSh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3htbHNjaGVtYXModm9pZCk7CnN0YXRpYyBpbnQgdGVzdF94bWxzY2hlbWFzdHlwZXModm9pZCk7CnN0YXRpYyBpbnQgdGVzdF94bWxzdHJpbmcodm9pZCk7CnN0YXRpYyBpbnQgdGVzdF94bWx1bmljb2RlKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeG1sd3JpdGVyKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeHBhdGgodm9pZCk7CnN0YXRpYyBpbnQgdGVzdF94cGF0aEludGVybmFscyh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3hwb2ludGVyKHZvaWQpOwoKLyoqCiAqIHRlc3RsaWJ4bWwyOgogKgogKiBNYWluIGVudHJ5IHBvaW50IG9mIHRoZSB0ZXN0ZXIgZm9yIHRoZSBmdWxsIGxpYnhtbDIgbW9kdWxlLAogKiBpdCBjYWxscyBhbGwgdGhlIHRlc3RlciBlbnRyeSBwb2ludCBmb3IgZWFjaCBtb2R1bGUuCiAqCiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlcnJvciBmb3VuZAogKi8Kc3RhdGljIGludAp0ZXN0bGlieG1sMih2b2lkKQp7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIHRlc3RfcmV0ICs9IHRlc3RfSFRNTHBhcnNlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9IVE1MdHJlZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9TQVgyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2MxNG4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfY2F0YWxvZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9jaHZhbGlkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2RlYnVnWE1MKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2RpY3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfZW5jb2RpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfZW50aXRpZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaGFzaCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9saXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X25hbm9mdHAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfbmFub2h0dHAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfcGFyc2VyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3BhcnNlckludGVybmFscygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9wYXR0ZXJuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3JlbGF4bmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3Rfc2NoZW1hc0ludGVybmFscygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF90cmVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3VyaSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF92YWxpZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94aW5jbHVkZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJTygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxhdXRvbWF0YSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxlcnJvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxtb2R1bGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1scmVhZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbHJlZ2V4cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxzYXZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbHNjaGVtYXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sc2NoZW1hc3R5cGVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbHN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWx1bmljb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbHdyaXRlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94cGF0aCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94cGF0aEludGVybmFscygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94cG9pbnRlcigpOwoKICAgIHByaW50ZigiVG90YWw6ICVkIGZ1bmN0aW9ucywgJWQgdGVzdHMsICVkIGVycm9yc1xuIiwKICAgICAgICAgICBmdW5jdGlvbl90ZXN0cywgY2FsbF90ZXN0cywgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9VVEY4VG9IdG1sKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB1bnNpZ25lZCBjaGFyICogb3V0OyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIHJlc3VsdCAqLwogICAgaW50IG5fb3V0OwogICAgaW50ICogb3V0bGVuOyAvKiB0aGUgbGVuZ3RoIG9mIEBvdXQgKi8KICAgIGludCBuX291dGxlbjsKICAgIHVuc2lnbmVkIGNoYXIgKiBpbjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFVURi04IGNoYXJzICovCiAgICBpbnQgbl9pbjsKICAgIGludCAqIGlubGVuOyAvKiB0aGUgbGVuZ3RoIG9mIEBpbiAqLwogICAgaW50IG5faW5sZW47CgogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfdW5zaWduZWRfY2hhcl9wdHI7bl9vdXQrKykgewogICAgZm9yIChuX291dGxlbiA9IDA7bl9vdXRsZW4gPCBnZW5fbmJfaW50X3B0cjtuX291dGxlbisrKSB7CiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHI7bl9pbisrKSB7CiAgICBmb3IgKG5faW5sZW4gPSAwO25faW5sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2lubGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dCA9IGdlbl91bnNpZ25lZF9jaGFyX3B0cihuX291dCwgMCk7CiAgICAgICAgb3V0bGVuID0gZ2VuX2ludF9wdHIobl9vdXRsZW4sIDEpOwogICAgICAgIGluID0gZ2VuX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5faW4sIDIpOwogICAgICAgIGlubGVuID0gZ2VuX2ludF9wdHIobl9pbmxlbiwgMyk7CgogICAgICAgIHJldF92YWwgPSBVVEY4VG9IdG1sKG91dCwgb3V0bGVuLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWluLCBpbmxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2NoYXJfcHRyKG5fb3V0LCBvdXQsIDApOwogICAgICAgIGRlc19pbnRfcHRyKG5fb3V0bGVuLCBvdXRsZW4sIDEpOwogICAgICAgIGRlc19jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX2luLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWluLCAyKTsKICAgICAgICBkZXNfaW50X3B0cihuX2lubGVuLCBpbmxlbiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBVVEY4VG9IdG1sIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRsZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIgMQpzdGF0aWMgaHRtbEVsZW1EZXNjICogZ2VuX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGh0bWxFbGVtRGVzYyAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF9odG1sQXR0ckFsbG93ZWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sU3RhdHVzIHJldF92YWw7CiAgICBodG1sRWxlbURlc2MgKiBlbHQ7IC8qIEhUTUwgZWxlbWVudCAqLwogICAgaW50IG5fZWx0OwogICAgeG1sQ2hhciAqIGF0dHI7IC8qIEhUTUwgYXR0cmlidXRlICovCiAgICBpbnQgbl9hdHRyOwogICAgaW50IGxlZ2FjeTsgLyogd2hldGhlciB0byBhbGxvdyBkZXByZWNhdGVkIGF0dHJpYnV0ZXMgKi8KICAgIGludCBuX2xlZ2FjeTsKCiAgICBmb3IgKG5fZWx0ID0gMDtuX2VsdCA8IGdlbl9uYl9jb25zdF9odG1sRWxlbURlc2NfcHRyO25fZWx0KyspIHsKICAgIGZvciAobl9hdHRyID0gMDtuX2F0dHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9hdHRyKyspIHsKICAgIGZvciAobl9sZWdhY3kgPSAwO25fbGVnYWN5IDwgZ2VuX25iX2ludDtuX2xlZ2FjeSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBlbHQgPSBnZW5fY29uc3RfaHRtbEVsZW1EZXNjX3B0cihuX2VsdCwgMCk7CiAgICAgICAgYXR0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2F0dHIsIDEpOwogICAgICAgIGxlZ2FjeSA9IGdlbl9pbnQobl9sZWdhY3ksIDIpOwoKICAgICAgICByZXRfdmFsID0gaHRtbEF0dHJBbGxvd2VkKChjb25zdCBodG1sRWxlbURlc2MgKillbHQsIChjb25zdCB4bWxDaGFyICopYXR0ciwgbGVnYWN5KTsKICAgICAgICBkZXNyZXRfaHRtbFN0YXR1cyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIobl9lbHQsIChjb25zdCBodG1sRWxlbURlc2MgKillbHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2F0dHIsIChjb25zdCB4bWxDaGFyICopYXR0ciwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlZ2FjeSwgbGVnYWN5LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxBdHRyQWxsb3dlZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZWdhY3kpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX2h0bWxOb2RlUHRyIDEKc3RhdGljIGh0bWxOb2RlUHRyIGdlbl9odG1sTm9kZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfaHRtbE5vZGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGh0bWxOb2RlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF9odG1sQXV0b0Nsb3NlVGFnKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBodG1sRG9jUHRyIGRvYzsgLyogdGhlIEhUTUwgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBUaGUgdGFnIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICBodG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgSFRNTCBlbGVtZW50ICovCiAgICBpbnQgbl9lbGVtOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX2h0bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl9odG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX2h0bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBlbGVtID0gZ2VuX2h0bWxOb2RlUHRyKG5fZWxlbSwgMik7CgogICAgICAgIHJldF92YWwgPSBodG1sQXV0b0Nsb3NlVGFnKGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCBlbGVtKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19odG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbEF1dG9DbG9zZVRhZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKCiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAwKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQoKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUpOwogICAgICAgIGRlc3JldF9odG1sUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgMCk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX2h0bWxTQVhIYW5kbGVyUHRyIDEKc3RhdGljIGh0bWxTQVhIYW5kbGVyUHRyIGdlbl9odG1sU0FYSGFuZGxlclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfaHRtbFNBWEhhbmRsZXJQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGh0bWxTQVhIYW5kbGVyUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF9odG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1BVU0hfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICBodG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIGEgU0FYIGhhbmRsZXIgKi8KICAgIGludCBuX3NheDsKICAgIHZvaWQgKiB1c2VyX2RhdGE7IC8qIFRoZSB1c2VyIGRhdGEgcmV0dXJuZWQgb24gU0FYIGNhbGxiYWNrcyAqLwogICAgaW50IG5fdXNlcl9kYXRhOwogICAgY2hhciAqIGNodW5rOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2hhcnMgKi8KICAgIGludCBuX2NodW5rOwogICAgaW50IHNpemU7IC8qIG51bWJlciBvZiBjaGFycyBpbiB0aGUgYXJyYXkgKi8KICAgIGludCBuX3NpemU7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIGFuIG9wdGlvbmFsIGZpbGUgbmFtZSBvciBVUkkgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogYW4gb3B0aW9uYWwgZW5jb2RpbmcgKi8KICAgIGludCBuX2VuYzsKCiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl9odG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fdXNlcl9kYXRhID0gMDtuX3VzZXJfZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJfZGF0YSsrKSB7CiAgICBmb3IgKG5fY2h1bmsgPSAwO25fY2h1bmsgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9jaHVuaysrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fZW5jID0gMDtuX2VuYyA8IGdlbl9uYl94bWxDaGFyRW5jb2Rpbmc7bl9lbmMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc2F4ID0gZ2VuX2h0bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAwKTsKICAgICAgICB1c2VyX2RhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyX2RhdGEsIDEpOwogICAgICAgIGNodW5rID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fY2h1bmssIDIpOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMyk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZW91dHB1dChuX2ZpbGVuYW1lLCA0KTsKICAgICAgICBlbmMgPSBnZW5feG1sQ2hhckVuY29kaW5nKG5fZW5jLCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dChzYXgsIHVzZXJfZGF0YSwgKGNvbnN0IGNoYXIgKiljaHVuaywgc2l6ZSwgZmlsZW5hbWUsIGVuYyk7CiAgICAgICAgZGVzcmV0X2h0bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMCk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCB1c2VyX2RhdGEsIDEpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2NodW5rLCAoY29uc3QgY2hhciAqKWNodW5rLCAyKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMyk7CiAgICAgICAgZGVzX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgZmlsZW5hbWUsIDQpOwogICAgICAgIGRlc194bWxDaGFyRW5jb2Rpbmcobl9lbmMsIGVuYywgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJfZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jaHVuayk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxDdHh0UmVhZERvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIEhUTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nICovCiAgICBpbnQgbl9jdXI7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX1VSTDsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIGh0bWxQYXJzZXJPcHRpb24ocykgKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl9odG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jdXIrKykgewogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9pbnQ7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5faHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIDEpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMik7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMyk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9pbnQobl9vcHRpb25zLCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxDdHh0UmVhZERvYyhjdHh0LCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgVVJMLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaHRtbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMSk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICBkZXNfaW50KG5fb3B0aW9ucywgb3B0aW9ucywgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sQ3R4dFJlYWREb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sQ3R4dFJlYWRGaWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaHRtbERvY1B0ciByZXRfdmFsOwogICAgaHRtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gSFRNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfaHRtbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfaW50O25fb3B0aW9ucysrKSB7CiAgICAgICAgY3R4dCA9IGdlbl9odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIG9wdGlvbnMgPSBnZW5faW50KG5fb3B0aW9ucywgMyk7CgogICAgICAgIHJldF92YWwgPSBodG1sQ3R4dFJlYWRGaWxlKGN0eHQsIGZpbGVuYW1lLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaHRtbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgZGVzX2ludChuX29wdGlvbnMsIG9wdGlvbnMsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxDdHh0UmVhZE1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIEhUTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfaHRtbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX2ludDtuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl9odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgMSk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAyKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDMpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDQpOwogICAgICAgIG9wdGlvbnMgPSBnZW5faW50KG5fb3B0aW9ucywgNSk7CgogICAgICAgIHJldF92YWwgPSBodG1sQ3R4dFJlYWRNZW1vcnkoY3R4dCwgKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUsIFVSTCwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X2h0bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIDEpOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAyKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMyk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDQpOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxDdHh0UmVhZE1lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbEN0eHRSZXNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIEhUTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl9odG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl9odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICBodG1sQ3R4dFJlc2V0KGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxDdHh0UmVzZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxDdHh0VXNlT3B0aW9ucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaHRtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gSFRNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIGh0bWxQYXJzZXJPcHRpb24ocykgKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl9odG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9pbnQ7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5faHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBvcHRpb25zID0gZ2VuX2ludChuX29wdGlvbnMsIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbEN0eHRVc2VPcHRpb25zKGN0eHQsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxDdHh0VXNlT3B0aW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sRWxlbWVudEFsbG93ZWRIZXJlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBodG1sRWxlbURlc2MgKiBwYXJlbnQ7IC8qIEhUTUwgcGFyZW50IGVsZW1lbnQgKi8KICAgIGludCBuX3BhcmVudDsKICAgIHhtbENoYXIgKiBlbHQ7IC8qIEhUTUwgZWxlbWVudCAqLwogICAgaW50IG5fZWx0OwoKICAgIGZvciAobl9wYXJlbnQgPSAwO25fcGFyZW50IDwgZ2VuX25iX2NvbnN0X2h0bWxFbGVtRGVzY19wdHI7bl9wYXJlbnQrKykgewogICAgZm9yIChuX2VsdCA9IDA7bl9lbHQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9lbHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcGFyZW50ID0gZ2VuX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIobl9wYXJlbnQsIDApOwogICAgICAgIGVsdCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2VsdCwgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sRWxlbWVudEFsbG93ZWRIZXJlKChjb25zdCBodG1sRWxlbURlc2MgKilwYXJlbnQsIChjb25zdCB4bWxDaGFyICopZWx0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfaHRtbEVsZW1EZXNjX3B0cihuX3BhcmVudCwgKGNvbnN0IGh0bWxFbGVtRGVzYyAqKXBhcmVudCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fZWx0LCAoY29uc3QgeG1sQ2hhciAqKWVsdCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sRWxlbWVudEFsbG93ZWRIZXJlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BhcmVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sRWxlbWVudFN0YXR1c0hlcmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sU3RhdHVzIHJldF92YWw7CiAgICBodG1sRWxlbURlc2MgKiBwYXJlbnQ7IC8qIEhUTUwgcGFyZW50IGVsZW1lbnQgKi8KICAgIGludCBuX3BhcmVudDsKICAgIGh0bWxFbGVtRGVzYyAqIGVsdDsgLyogSFRNTCBlbGVtZW50ICovCiAgICBpbnQgbl9lbHQ7CgogICAgZm9yIChuX3BhcmVudCA9IDA7bl9wYXJlbnQgPCBnZW5fbmJfY29uc3RfaHRtbEVsZW1EZXNjX3B0cjtuX3BhcmVudCsrKSB7CiAgICBmb3IgKG5fZWx0ID0gMDtuX2VsdCA8IGdlbl9uYl9jb25zdF9odG1sRWxlbURlc2NfcHRyO25fZWx0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhcmVudCA9IGdlbl9jb25zdF9odG1sRWxlbURlc2NfcHRyKG5fcGFyZW50LCAwKTsKICAgICAgICBlbHQgPSBnZW5fY29uc3RfaHRtbEVsZW1EZXNjX3B0cihuX2VsdCwgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sRWxlbWVudFN0YXR1c0hlcmUoKGNvbnN0IGh0bWxFbGVtRGVzYyAqKXBhcmVudCwgKGNvbnN0IGh0bWxFbGVtRGVzYyAqKWVsdCk7CiAgICAgICAgZGVzcmV0X2h0bWxTdGF0dXMocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9odG1sRWxlbURlc2NfcHRyKG5fcGFyZW50LCAoY29uc3QgaHRtbEVsZW1EZXNjICopcGFyZW50LCAwKTsKICAgICAgICBkZXNfY29uc3RfaHRtbEVsZW1EZXNjX3B0cihuX2VsdCwgKGNvbnN0IGh0bWxFbGVtRGVzYyAqKWVsdCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sRWxlbWVudFN0YXR1c0hlcmUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGFyZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxFbmNvZGVFbnRpdGllcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgY2hhciAqIG91dDsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHN0b3JlIHRoZSByZXN1bHQgKi8KICAgIGludCBuX291dDsKICAgIGludCAqIG91dGxlbjsgLyogdGhlIGxlbmd0aCBvZiBAb3V0ICovCiAgICBpbnQgbl9vdXRsZW47CiAgICB1bnNpZ25lZCBjaGFyICogaW47IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBVVEYtOCBjaGFycyAqLwogICAgaW50IG5faW47CiAgICBpbnQgKiBpbmxlbjsgLyogdGhlIGxlbmd0aCBvZiBAaW4gKi8KICAgIGludCBuX2lubGVuOwogICAgaW50IHF1b3RlQ2hhcjsgLyogdGhlIHF1b3RlIGNoYXJhY3RlciB0byBlc2NhcGUgKCcgb3IgIikgb3IgemVyby4gKi8KICAgIGludCBuX3F1b3RlQ2hhcjsKCiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl91bnNpZ25lZF9jaGFyX3B0cjtuX291dCsrKSB7CiAgICBmb3IgKG5fb3V0bGVuID0gMDtuX291dGxlbiA8IGdlbl9uYl9pbnRfcHRyO25fb3V0bGVuKyspIHsKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cjtuX2luKyspIHsKICAgIGZvciAobl9pbmxlbiA9IDA7bl9pbmxlbiA8IGdlbl9uYl9pbnRfcHRyO25faW5sZW4rKykgewogICAgZm9yIChuX3F1b3RlQ2hhciA9IDA7bl9xdW90ZUNoYXIgPCBnZW5fbmJfaW50O25fcXVvdGVDaGFyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dCA9IGdlbl91bnNpZ25lZF9jaGFyX3B0cihuX291dCwgMCk7CiAgICAgICAgb3V0bGVuID0gZ2VuX2ludF9wdHIobl9vdXRsZW4sIDEpOwogICAgICAgIGluID0gZ2VuX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5faW4sIDIpOwogICAgICAgIGlubGVuID0gZ2VuX2ludF9wdHIobl9pbmxlbiwgMyk7CiAgICAgICAgcXVvdGVDaGFyID0gZ2VuX2ludChuX3F1b3RlQ2hhciwgNCk7CgogICAgICAgIHJldF92YWwgPSBodG1sRW5jb2RlRW50aXRpZXMob3V0LCBvdXRsZW4sIChjb25zdCB1bnNpZ25lZCBjaGFyICopaW4sIGlubGVuLCBxdW90ZUNoYXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9jaGFyX3B0cihuX291dCwgb3V0LCAwKTsKICAgICAgICBkZXNfaW50X3B0cihuX291dGxlbiwgb3V0bGVuLCAxKTsKICAgICAgICBkZXNfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilpbiwgMik7CiAgICAgICAgZGVzX2ludF9wdHIobl9pbmxlbiwgaW5sZW4sIDMpOwogICAgICAgIGRlc19pbnQobl9xdW90ZUNoYXIsIHF1b3RlQ2hhciwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sRW5jb2RlRW50aXRpZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dGxlbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbmxlbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9xdW90ZUNoYXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sRW50aXR5TG9va3VwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgaHRtbEVudGl0eURlc2MgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMCk7CgogICAgICAgIHJldF92YWwgPSBodG1sRW50aXR5TG9va3VwKChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X2NvbnN0X2h0bWxFbnRpdHlEZXNjX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxFbnRpdHlMb29rdXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxFbnRpdHlWYWx1ZUxvb2t1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IGh0bWxFbnRpdHlEZXNjICogcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGludCB2YWx1ZTsgLyogdGhlIGVudGl0eSdzIHVuaWNvZGUgdmFsdWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl91bnNpZ25lZF9pbnQobl92YWx1ZSwgMCk7CgogICAgICAgIHJldF92YWwgPSBodG1sRW50aXR5VmFsdWVMb29rdXAodmFsdWUpOwogICAgICAgIGRlc3JldF9jb25zdF9odG1sRW50aXR5RGVzY19wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9pbnQobl92YWx1ZSwgdmFsdWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbEVudGl0eVZhbHVlTG9va3VwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbEhhbmRsZU9taXR0ZWRFbGVtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgdmFsOyAvKiBpbnQgMCBvciAxICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9pbnQobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0gaHRtbEhhbmRsZU9taXR0ZWRFbGVtKHZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxIYW5kbGVPbWl0dGVkRWxlbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sSXNBdXRvQ2xvc2VkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBodG1sRG9jUHRyIGRvYzsgLyogdGhlIEhUTUwgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIGh0bWxOb2RlUHRyIGVsZW07IC8qIHRoZSBIVE1MIGVsZW1lbnQgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfaHRtbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX2h0bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5faHRtbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgZWxlbSA9IGdlbl9odG1sTm9kZVB0cihuX2VsZW0sIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbElzQXV0b0Nsb3NlZChkb2MsIGVsZW0pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19odG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19odG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbElzQXV0b0Nsb3NlZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxJc1NjcmlwdEF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIGFuIGF0dHJpYnV0ZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxJc1NjcmlwdEF0dHJpYnV0ZSgoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sSXNTY3JpcHRBdHRyaWJ1dGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxOb2RlU3RhdHVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaHRtbFN0YXR1cyByZXRfdmFsOwogICAgaHRtbE5vZGVQdHIgbm9kZTsgLyogYW4gaHRtbE5vZGVQdHIgaW4gYSB0cmVlICovCiAgICBpbnQgbl9ub2RlOwogICAgaW50IGxlZ2FjeTsgLyogd2hldGhlciB0byBhbGxvdyBkZXByZWNhdGVkIGVsZW1lbnRzIChZRVMgaXMgZmFzdGVyIGhlcmUgZm9yIEVsZW1lbnQgbm9kZXMpICovCiAgICBpbnQgbl9sZWdhY3k7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl9jb25zdF9odG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX2xlZ2FjeSA9IDA7bl9sZWdhY3kgPCBnZW5fbmJfaW50O25fbGVnYWN5KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5fY29uc3RfaHRtbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBsZWdhY3kgPSBnZW5faW50KG5fbGVnYWN5LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxOb2RlU3RhdHVzKChjb25zdCBodG1sTm9kZVB0cilub2RlLCBsZWdhY3kpOwogICAgICAgIGRlc3JldF9odG1sU3RhdHVzKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfaHRtbE5vZGVQdHIobl9ub2RlLCAoY29uc3QgaHRtbE5vZGVQdHIpbm9kZSwgMCk7CiAgICAgICAgZGVzX2ludChuX2xlZ2FjeSwgbGVnYWN5LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxOb2RlU3RhdHVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVnYWN5KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFBhcnNlQ2hhclJlZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaHRtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gSFRNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX2h0bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSBodG1sUGFyc2VDaGFyUmVmKGN0eHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbFBhcnNlQ2hhclJlZiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFBhcnNlQ2h1bmsodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1BVU0hfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaHRtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gSFRNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBjaHVuazsgLyogYW4gY2hhciBhcnJheSAqLwogICAgaW50IG5fY2h1bms7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgaW4gYnl0ZSBvZiB0aGUgY2h1bmsgKi8KICAgIGludCBuX3NpemU7CiAgICBpbnQgdGVybWluYXRlOyAvKiBsYXN0IGNodW5rIGluZGljYXRvciAqLwogICAgaW50IG5fdGVybWluYXRlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfaHRtbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jaHVuayA9IDA7bl9jaHVuayA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2NodW5rKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fdGVybWluYXRlID0gMDtuX3Rlcm1pbmF0ZSA8IGdlbl9uYl9pbnQ7bl90ZXJtaW5hdGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl9odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGNodW5rID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fY2h1bmssIDEpOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMik7CiAgICAgICAgdGVybWluYXRlID0gZ2VuX2ludChuX3Rlcm1pbmF0ZSwgMyk7CgogICAgICAgIHJldF92YWwgPSBodG1sUGFyc2VDaHVuayhjdHh0LCAoY29uc3QgY2hhciAqKWNodW5rLCBzaXplLCB0ZXJtaW5hdGUpOwogICAgICAgIGlmIChjdHh0ICE9IE5VTEwpIHt4bWxGcmVlRG9jKGN0eHQtPm15RG9jKTsgY3R4dC0+bXlEb2MgPSBOVUxMO30KICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9jaHVuaywgKGNvbnN0IGNoYXIgKiljaHVuaywgMSk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDIpOwogICAgICAgIGRlc19pbnQobl90ZXJtaW5hdGUsIHRlcm1pbmF0ZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sUGFyc2VDaHVuayIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NodW5rKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGVybWluYXRlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFBhcnNlRG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaHRtbERvY1B0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHhtbENoYXIgKi8KICAgIGludCBuX2N1cjsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogYSBmcmVlIGZvcm0gQyBzdHJpbmcgZGVzY3JpYmluZyB0aGUgSFRNTCBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sQ2hhcl9wdHI7bl9jdXIrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbENoYXJfcHRyKG5fY3VyLCAwKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxQYXJzZURvYyhjdXIsIChjb25zdCBjaGFyICopZW5jb2RpbmcpOwogICAgICAgIGRlc3JldF9odG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbFBhcnNlRG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxQYXJzZURvY3VtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBodG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBIVE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfaHRtbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5faHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxQYXJzZURvY3VtZW50KGN0eHQpOwogICAgICAgIGlmIChjdHh0ICE9IE5VTEwpIHt4bWxGcmVlRG9jKGN0eHQtPm15RG9jKTsgY3R4dC0+bXlEb2MgPSBOVUxMO30KICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxQYXJzZURvY3VtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sUGFyc2VFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaHRtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gSFRNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX2h0bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIGh0bWxQYXJzZUVsZW1lbnQoY3R4dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbFBhcnNlRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFBhcnNlRW50aXR5UmVmKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgaHRtbEVudGl0eURlc2MgKiByZXRfdmFsOwogICAgaHRtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gSFRNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbENoYXIgKiogc3RyOyAvKiBsb2NhdGlvbiB0byBzdG9yZSB0aGUgZW50aXR5IG5hbWUgKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX2h0bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHI7bl9zdHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl9odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cl9wdHIobl9zdHIsIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbFBhcnNlRW50aXR5UmVmKGN0eHQsIChjb25zdCB4bWxDaGFyICoqKXN0cik7CiAgICAgICAgZGVzcmV0X2NvbnN0X2h0bWxFbnRpdHlEZXNjX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKiopc3RyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxQYXJzZUVudGl0eVJlZiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxQYXJzZUZpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBodG1sRG9jUHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIGEgZnJlZSBmb3JtIEMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIEhUTUwgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxQYXJzZUZpbGUoZmlsZW5hbWUsIChjb25zdCBjaGFyICopZW5jb2RpbmcpOwogICAgICAgIGRlc3JldF9odG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sUmVhZERvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjdXI7IC8qIGEgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcgKi8KICAgIGludCBuX2N1cjsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIHRoZSBiYXNlIFVSTCB0byB1c2UgZm9yIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fVVJMOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgaHRtbFBhcnNlck9wdGlvbihzKSAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX2ludDtuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAwKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIG9wdGlvbnMgPSBnZW5faW50KG5fb3B0aW9ucywgMyk7CgogICAgICAgIHJldF92YWwgPSBodG1sUmVhZERvYygoY29uc3QgeG1sQ2hhciAqKWN1ciwgVVJMLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaHRtbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDEpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAyKTsKICAgICAgICBkZXNfaW50KG5fb3B0aW9ucywgb3B0aW9ucywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sUmVhZERvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sUmVhZEZpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sRG9jUHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIGEgZmlsZSBvciBVUkwgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgaHRtbFBhcnNlck9wdGlvbihzKSAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX2ludDtuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMCk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMSk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9pbnQobl9vcHRpb25zLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxSZWFkRmlsZShmaWxlbmFtZSwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X2h0bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDEpOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxSZWFkRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFJlYWRNZW1vcnkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sRG9jUHRyIHJldF92YWw7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX2ludDtuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAwKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDEpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMik7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMyk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9pbnQobl9vcHRpb25zLCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxSZWFkTWVtb3J5KChjb25zdCBjaGFyICopYnVmZmVyLCBzaXplLCBVUkwsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF9odG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAwKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMSk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICBkZXNfaW50KG5fb3B0aW9ucywgb3B0aW9ucywgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sUmVhZE1lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxTQVhQYXJzZURvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjdXI7IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB4bWxDaGFyICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIGEgZnJlZSBmb3JtIEMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIEhUTUwgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaHRtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvY2sgKi8KICAgIGludCBuX3NheDsKICAgIHZvaWQgKiB1c2VyRGF0YTsgLyogaWYgdXNpbmcgU0FYLCB0aGlzIHBvaW50ZXIgd2lsbCBiZSBwcm92aWRlZCBvbiBjYWxsYmFja3MuICovCiAgICBpbnQgbl91c2VyRGF0YTsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxDaGFyX3B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl9odG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fdXNlckRhdGEgPSAwO25fdXNlckRhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyRGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sQ2hhcl9wdHIobl9jdXIsIDApOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDEpOwogICAgICAgIHNheCA9IGdlbl9odG1sU0FYSGFuZGxlclB0cihuX3NheCwgMik7CiAgICAgICAgdXNlckRhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyRGF0YSwgMyk7CgogICAgICAgIHJldF92YWwgPSBodG1sU0FYUGFyc2VEb2MoY3VyLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBzYXgsIHVzZXJEYXRhKTsKICAgICAgICBkZXNyZXRfaHRtbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENoYXJfcHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAxKTsKICAgICAgICBkZXNfaHRtbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMik7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlckRhdGEsIHVzZXJEYXRhLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxTQVhQYXJzZURvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJEYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFNBWFBhcnNlRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogYSBmcmVlIGZvcm0gQyBzdHJpbmcgZGVzY3JpYmluZyB0aGUgSFRNTCBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBodG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jayAqLwogICAgaW50IG5fc2F4OwogICAgdm9pZCAqIHVzZXJEYXRhOyAvKiBpZiB1c2luZyBTQVgsIHRoaXMgcG9pbnRlciB3aWxsIGJlIHByb3ZpZGVkIG9uIGNhbGxiYWNrcy4gKi8KICAgIGludCBuX3VzZXJEYXRhOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX2h0bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl91c2VyRGF0YSA9IDA7bl91c2VyRGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJEYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDEpOwogICAgICAgIHNheCA9IGdlbl9odG1sU0FYSGFuZGxlclB0cihuX3NheCwgMik7CiAgICAgICAgdXNlckRhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyRGF0YSwgMyk7CgogICAgICAgIHJldF92YWwgPSBodG1sU0FYUGFyc2VGaWxlKGZpbGVuYW1lLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBzYXgsIHVzZXJEYXRhKTsKICAgICAgICBkZXNyZXRfaHRtbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMSk7CiAgICAgICAgZGVzX2h0bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDIpOwogICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJEYXRhLCB1c2VyRGF0YSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sU0FYUGFyc2VGaWxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91c2VyRGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxUYWdMb29rdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9IVE1McGFyc2VyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBIVE1McGFyc2VyIDogMzEgb2YgMzcgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X1VURjhUb0h0bWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbEF0dHJBbGxvd2VkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxBdXRvQ2xvc2VUYWcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbENyZWF0ZVB1c2hQYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxDdHh0UmVhZERvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sQ3R4dFJlYWRGaWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxDdHh0UmVhZE1lbW9yeSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sQ3R4dFJlc2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxDdHh0VXNlT3B0aW9ucygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sRWxlbWVudEFsbG93ZWRIZXJlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxFbGVtZW50U3RhdHVzSGVyZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sRW5jb2RlRW50aXRpZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbEVudGl0eUxvb2t1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sRW50aXR5VmFsdWVMb29rdXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbEhhbmRsZU9taXR0ZWRFbGVtKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxJc0F1dG9DbG9zZWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbElzU2NyaXB0QXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxOb2RlU3RhdHVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxQYXJzZUNoYXJSZWYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFBhcnNlQ2h1bmsoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFBhcnNlRG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxQYXJzZURvY3VtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxQYXJzZUVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFBhcnNlRW50aXR5UmVmKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxQYXJzZUZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFJlYWREb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFJlYWRGaWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxSZWFkTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxTQVhQYXJzZURvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sU0FYUGFyc2VGaWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxUYWdMb29rdXAoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIEhUTUxwYXJzZXI6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2h0bWxEb2NDb250ZW50RHVtcEZvcm1hdE91dHB1dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxPdXRwdXRCdWZmZXJQdHIgYnVmOyAvKiB0aGUgSFRNTCBidWZmZXIgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX2Zvcm1hdCA9IDA7bl9mb3JtYXQgPCBnZW5fbmJfaW50O25fZm9ybWF0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDMpOwoKICAgICAgICBodG1sRG9jQ29udGVudER1bXBGb3JtYXRPdXRwdXQoYnVmLCBjdXIsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIGZvcm1hdCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgZGVzX2ludChuX2Zvcm1hdCwgZm9ybWF0LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxEb2NDb250ZW50RHVtcEZvcm1hdE91dHB1dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxEb2NDb250ZW50RHVtcE91dHB1dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxPdXRwdXRCdWZmZXJQdHIgYnVmOyAvKiB0aGUgSFRNTCBidWZmZXIgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sT3V0cHV0QnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbERvY1B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sT3V0cHV0QnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sRG9jUHRyKG5fY3VyLCAxKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAyKTsKCiAgICAgICAgaHRtbERvY0NvbnRlbnREdW1wT3V0cHV0KGJ1ZiwgY3VyLCAoY29uc3QgY2hhciAqKWVuY29kaW5nKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxEb2NDb250ZW50RHVtcE91dHB1dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbERvY0R1bXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBGSUxFICogZjsgLyogdGhlIEZJTEUqICovCiAgICBpbnQgbl9mOwogICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2YgPSAwO25fZiA8IGdlbl9uYl9GSUxFX3B0cjtuX2YrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGYgPSBnZW5fRklMRV9wdHIobl9mLCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sRG9jUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxEb2NEdW1wKGYsIGN1cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fZiwgZiwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxEb2NEdW1wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2YpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxDaGFyX3B0cl9wdHIgMQpzdGF0aWMgeG1sQ2hhciAqKiBnZW5feG1sQ2hhcl9wdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxDaGFyX3B0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbENoYXIgKiogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF9odG1sRG9jRHVtcE1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbENoYXIgKiogbWVtOyAvKiBPVVQ6IHRoZSBtZW1vcnkgcG9pbnRlciAqLwogICAgaW50IG5fbWVtOwogICAgaW50ICogc2l6ZTsgLyogT1VUOiB0aGUgbWVtb3J5IGxlbmd0aCAqLwogICAgaW50IG5fc2l6ZTsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX21lbSA9IDA7bl9tZW0gPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25fbWVtKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50X3B0cjtuX3NpemUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMCk7CiAgICAgICAgbWVtID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX21lbSwgMSk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnRfcHRyKG5fc2l6ZSwgMik7CgogICAgICAgIGh0bWxEb2NEdW1wTWVtb3J5KGN1ciwgbWVtLCBzaXplKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5fbWVtLCBtZW0sIDEpOwogICAgICAgIGRlc19pbnRfcHRyKG5fc2l6ZSwgc2l6ZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sRG9jRHVtcE1lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbWVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sR2V0TWV0YUVuY29kaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICBodG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfaHRtbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5faHRtbERvY1B0cihuX2RvYywgMCk7CgogICAgICAgIHJldF92YWwgPSBodG1sR2V0TWV0YUVuY29kaW5nKGRvYyk7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxHZXRNZXRhRW5jb2RpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbElzQm9vbGVhbkF0dHIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGNoZWNrICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxJc0Jvb2xlYW5BdHRyKChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxJc0Jvb2xlYW5BdHRyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sTmV3RG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaHRtbERvY1B0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIFVSSTsgLyogVVJJIGZvciB0aGUgZHRkLCBvciBOVUxMICovCiAgICBpbnQgbl9VUkk7CiAgICB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogdGhlIGV4dGVybmFsIElEIG9mIHRoZSBEVEQsIG9yIE5VTEwgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CgogICAgZm9yIChuX1VSSSA9IDA7bl9VUkkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9VUkkrKykgewogICAgZm9yIChuX0V4dGVybmFsSUQgPSAwO25fRXh0ZXJuYWxJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0V4dGVybmFsSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAwKTsKICAgICAgICBFeHRlcm5hbElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sTmV3RG9jKChjb25zdCB4bWxDaGFyICopVVJJLCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQpOwogICAgICAgIGRlc3JldF9odG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIChjb25zdCB4bWxDaGFyICopVVJJLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5ld0RvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fRXh0ZXJuYWxJRCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxOZXdEb2NOb0R0RCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBVUkk7IC8qIFVSSSBmb3IgdGhlIGR0ZCwgb3IgTlVMTCAqLwogICAgaW50IG5fVVJJOwogICAgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIHRoZSBleHRlcm5hbCBJRCBvZiB0aGUgRFRELCBvciBOVUxMICovCiAgICBpbnQgbl9FeHRlcm5hbElEOwoKICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJJKyspIHsKICAgIGZvciAobl9FeHRlcm5hbElEID0gMDtuX0V4dGVybmFsSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9FeHRlcm5hbElEKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSSSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1VSSSwgMCk7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbE5ld0RvY05vRHREKChjb25zdCB4bWxDaGFyICopVVJJLCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQpOwogICAgICAgIGRlc3JldF9odG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIChjb25zdCB4bWxDaGFyICopVVJJLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5ld0RvY05vRHREIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9FeHRlcm5hbElEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbE5vZGVEdW1wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIEhUTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMik7CgogICAgICAgIHJldF92YWwgPSBodG1sTm9kZUR1bXAoYnVmLCBkb2MsIGN1cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5vZGVEdW1wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbE5vZGVEdW1wRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0OyAvKiB0aGUgRklMRSBwb2ludGVyICovCiAgICBpbnQgbl9vdXQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfRklMRV9wdHI7bl9vdXQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0ID0gZ2VuX0ZJTEVfcHRyKG5fb3V0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMik7CgogICAgICAgIGh0bWxOb2RlRHVtcEZpbGUob3V0LCBkb2MsIGN1cik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dCwgb3V0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5vZGVEdW1wRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxOb2RlRHVtcEZpbGVGb3JtYXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBGSUxFICogb3V0OyAvKiB0aGUgRklMRSBwb2ludGVyICovCiAgICBpbnQgbl9vdXQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX0ZJTEVfcHRyO25fb3V0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXQgPSBnZW5fRklMRV9wdHIobl9vdXQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAyKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAzKTsKICAgICAgICBmb3JtYXQgPSBnZW5faW50KG5fZm9ybWF0LCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxOb2RlRHVtcEZpbGVGb3JtYXQob3V0LCBkb2MsIGN1ciwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgZm9ybWF0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfRklMRV9wdHIobl9vdXQsIG91dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAyKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMyk7CiAgICAgICAgZGVzX2ludChuX2Zvcm1hdCwgZm9ybWF0LCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxOb2RlRHVtcEZpbGVGb3JtYXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZm9ybWF0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbE5vZGVEdW1wRm9ybWF0T3V0cHV0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBIVE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgKi8KICAgIGludCBuX2N1cjsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fZm9ybWF0ID0gMDtuX2Zvcm1hdCA8IGdlbl9uYl9pbnQ7bl9mb3JtYXQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDIpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDMpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDQpOwoKICAgICAgICBodG1sTm9kZUR1bXBGb3JtYXRPdXRwdXQoYnVmLCBkb2MsIGN1ciwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgZm9ybWF0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICBkZXNfaW50KG5fZm9ybWF0LCBmb3JtYXQsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5vZGVEdW1wRm9ybWF0T3V0cHV0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxOb2RlRHVtcE91dHB1dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxPdXRwdXRCdWZmZXJQdHIgYnVmOyAvKiB0aGUgSFRNTCBidWZmZXIgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBzdHJpbmcgKi8KICAgIGludCBuX2VuY29kaW5nOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sT3V0cHV0QnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMik7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMyk7CgogICAgICAgIGh0bWxOb2RlRHVtcE91dHB1dChidWYsIGRvYywgY3VyLCAoY29uc3QgY2hhciAqKWVuY29kaW5nKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxOb2RlRHVtcE91dHB1dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxTYXZlRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lIChvciBVUkwpICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sU2F2ZUZpbGUoZmlsZW5hbWUsIGN1cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sU2F2ZUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFNhdmVGaWxlRW5jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZW91dHB1dChuX2ZpbGVuYW1lLCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sRG9jUHRyKG5fY3VyLCAxKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxTYXZlRmlsZUVuYyhmaWxlbmFtZSwgY3VyLCAoY29uc3QgY2hhciAqKWVuY29kaW5nKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sU2F2ZUZpbGVFbmMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFNhdmVGaWxlRm9ybWF0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDMpOwoKICAgICAgICByZXRfdmFsID0gaHRtbFNhdmVGaWxlRm9ybWF0KGZpbGVuYW1lLCBjdXIsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIGZvcm1hdCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIGRlc19pbnQobl9mb3JtYXQsIGZvcm1hdCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sU2F2ZUZpbGVGb3JtYXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxTZXRNZXRhRW5jb2Rpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGh0bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfaHRtbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5faHRtbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9lbmNvZGluZywgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sU2V0TWV0YUVuY29kaW5nKGRvYywgKGNvbnN0IHhtbENoYXIgKillbmNvZGluZyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2h0bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCB4bWxDaGFyICopZW5jb2RpbmcsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbFNldE1ldGFFbmNvZGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X0hUTUx0cmVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBIVE1MdHJlZSA6IDE3IG9mIDE3IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sRG9jQ29udGVudER1bXBGb3JtYXRPdXRwdXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbERvY0NvbnRlbnREdW1wT3V0cHV0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxEb2NEdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxEb2NEdW1wTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxHZXRNZXRhRW5jb2RpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbElzQm9vbGVhbkF0dHIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbE5ld0RvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sTmV3RG9jTm9EdEQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbE5vZGVEdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxOb2RlRHVtcEZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbE5vZGVEdW1wRmlsZUZvcm1hdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sTm9kZUR1bXBGb3JtYXRPdXRwdXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbE5vZGVEdW1wT3V0cHV0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxTYXZlRmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sU2F2ZUZpbGVFbmMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFNhdmVGaWxlRm9ybWF0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxTZXRNZXRhRW5jb2RpbmcoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIEhUTUx0cmVlOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9kb2NiRGVmYXVsdFNBWEhhbmRsZXJJbml0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRE9DQl9FTkFCTEVEKQojaWZkZWYgTElCWE1MX0RPQ0JfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICBkb2NiRGVmYXVsdFNBWEhhbmRsZXJJbml0KCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gZG9jYkRlZmF1bHRTQVhIYW5kbGVySW5pdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sRGVmYXVsdFNBWEhhbmRsZXJJbml0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICBodG1sRGVmYXVsdFNBWEhhbmRsZXJJbml0KCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbERlZmF1bHRTQVhIYW5kbGVySW5pdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEZWZhdWx0U0FYSGFuZGxlckluaXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbERlZmF1bHRTQVhIYW5kbGVySW5pdCgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERlZmF1bHRTQVhIYW5kbGVySW5pdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxFbnVtZXJhdGlvblB0ciAxCnN0YXRpYyB4bWxFbnVtZXJhdGlvblB0ciBnZW5feG1sRW51bWVyYXRpb25QdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEVudW1lcmF0aW9uUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbnVtZXJhdGlvblB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJBdHRyaWJ1dGVEZWNsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIGVsZW07IC8qIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50ICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQ2hhciAqIGZ1bGxuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX2Z1bGxuYW1lOwogICAgaW50IHR5cGU7IC8qIHRoZSBhdHRyaWJ1dGUgdHlwZSAqLwogICAgaW50IG5fdHlwZTsKICAgIGludCBkZWY7IC8qIHRoZSB0eXBlIG9mIGRlZmF1bHQgdmFsdWUgKi8KICAgIGludCBuX2RlZjsKICAgIHhtbENoYXIgKiBkZWZhdWx0VmFsdWU7IC8qIHRoZSBhdHRyaWJ1dGUgZGVmYXVsdCB2YWx1ZSAqLwogICAgaW50IG5fZGVmYXVsdFZhbHVlOwogICAgeG1sRW51bWVyYXRpb25QdHIgdHJlZTsgLyogdGhlIHRyZWUgb2YgZW51bWVyYXRlZCB2YWx1ZSBzZXQgKi8KICAgIGludCBuX3RyZWU7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2VsZW0rKykgewogICAgZm9yIChuX2Z1bGxuYW1lID0gMDtuX2Z1bGxuYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fZnVsbG5hbWUrKykgewogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl9pbnQ7bl90eXBlKyspIHsKICAgIGZvciAobl9kZWYgPSAwO25fZGVmIDwgZ2VuX25iX2ludDtuX2RlZisrKSB7CiAgICBmb3IgKG5fZGVmYXVsdFZhbHVlID0gMDtuX2RlZmF1bHRWYWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2RlZmF1bHRWYWx1ZSsrKSB7CiAgICBmb3IgKG5fdHJlZSA9IDA7bl90cmVlIDwgZ2VuX25iX3htbEVudW1lcmF0aW9uUHRyO25fdHJlZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIGVsZW0gPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9lbGVtLCAxKTsKICAgICAgICBmdWxsbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2Z1bGxuYW1lLCAyKTsKICAgICAgICB0eXBlID0gZ2VuX2ludChuX3R5cGUsIDMpOwogICAgICAgIGRlZiA9IGdlbl9pbnQobl9kZWYsIDQpOwogICAgICAgIGRlZmF1bHRWYWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2RlZmF1bHRWYWx1ZSwgNSk7CiAgICAgICAgdHJlZSA9IGdlbl94bWxFbnVtZXJhdGlvblB0cihuX3RyZWUsIDYpOwoKICAgICAgICB4bWxTQVgyQXR0cmlidXRlRGVjbChjdHgsIChjb25zdCB4bWxDaGFyICopZWxlbSwgKGNvbnN0IHhtbENoYXIgKilmdWxsbmFtZSwgdHlwZSwgZGVmLCAoY29uc3QgeG1sQ2hhciAqKWRlZmF1bHRWYWx1ZSwgdHJlZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9lbGVtLCAoY29uc3QgeG1sQ2hhciAqKWVsZW0sIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2Z1bGxuYW1lLCAoY29uc3QgeG1sQ2hhciAqKWZ1bGxuYW1lLCAyKTsKICAgICAgICBkZXNfaW50KG5fdHlwZSwgdHlwZSwgMyk7CiAgICAgICAgZGVzX2ludChuX2RlZiwgZGVmLCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9kZWZhdWx0VmFsdWUsIChjb25zdCB4bWxDaGFyICopZGVmYXVsdFZhbHVlLCA1KTsKICAgICAgICBkZXNfeG1sRW51bWVyYXRpb25QdHIobl90cmVlLCB0cmVlLCA2KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJBdHRyaWJ1dGVEZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Z1bGxuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlZmF1bHRWYWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90cmVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyQ0RhdGFCbG9jayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogVGhlIHBjZGF0YSBjb250ZW50ICovCiAgICBpbnQgbl92YWx1ZTsKICAgIGludCBsZW47IC8qIHRoZSBibG9jayBsZW5ndGggKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgeG1sU0FYMkNEYXRhQmxvY2soY3R4LCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCBsZW4pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyQ0RhdGFCbG9jayIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyQ2hhcmFjdGVycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBjaDsgLyogYSB4bWxDaGFyIHN0cmluZyAqLwogICAgaW50IG5fY2g7CiAgICBpbnQgbGVuOyAvKiB0aGUgbnVtYmVyIG9mIHhtbENoYXIgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fY2ggPSAwO25fY2ggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jaCsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBjaCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NoLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgeG1sU0FYMkNoYXJhY3RlcnMoY3R4LCAoY29uc3QgeG1sQ2hhciAqKWNoLCBsZW4pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY2gsIChjb25zdCB4bWxDaGFyICopY2gsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyQ2hhcmFjdGVycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2gpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyQ29tbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHhtbFNBWDJDb21tZW50IGNvbnRlbnQgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CgogICAgICAgIHhtbFNBWDJDb21tZW50KGN0eCwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyQ29tbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJFbGVtZW50RGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZWxlbWVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgaW50IHR5cGU7IC8qIHRoZSBlbGVtZW50IHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxFbGVtZW50Q29udGVudFB0ciBjb250ZW50OyAvKiB0aGUgZWxlbWVudCB2YWx1ZSB0cmVlICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfaW50O25fdHlwZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX3htbEVsZW1lbnRDb250ZW50UHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB0eXBlID0gZ2VuX2ludChuX3R5cGUsIDIpOwogICAgICAgIGNvbnRlbnQgPSBnZW5feG1sRWxlbWVudENvbnRlbnRQdHIobl9jb250ZW50LCAzKTsKCiAgICAgICAgeG1sU0FYMkVsZW1lbnREZWNsKGN0eCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCB0eXBlLCBjb250ZW50KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2ludChuX3R5cGUsIHR5cGUsIDIpOwogICAgICAgIGRlc194bWxFbGVtZW50Q29udGVudFB0cihuX2NvbnRlbnQsIGNvbnRlbnQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkVsZW1lbnREZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkVuZERvY3VtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHhtbFNBWDJFbmREb2N1bWVudChjdHgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyRW5kRG9jdW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyRW5kRWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIFRoZSBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHhtbFNBWDJFbmRFbGVtZW50KGN0eCwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyRW5kRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyRW5kRWxlbWVudE5zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIGxvY2FsbmFtZTsgLyogdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQgKi8KICAgIGludCBuX2xvY2FsbmFtZTsKICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIHRoZSBlbGVtZW50IG5hbWVzcGFjZSBwcmVmaXggaWYgYXZhaWxhYmxlICovCiAgICBpbnQgbl9wcmVmaXg7CiAgICB4bWxDaGFyICogVVJJOyAvKiB0aGUgZWxlbWVudCBuYW1lc3BhY2UgbmFtZSBpZiBhdmFpbGFibGUgKi8KICAgIGludCBuX1VSSTsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fbG9jYWxuYW1lID0gMDtuX2xvY2FsbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2xvY2FsbmFtZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSSSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIGxvY2FsbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2xvY2FsbmFtZSwgMSk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAyKTsKICAgICAgICBVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIDMpOwoKICAgICAgICB4bWxTQVgyRW5kRWxlbWVudE5zKGN0eCwgKGNvbnN0IHhtbENoYXIgKilsb2NhbG5hbWUsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKVVSSSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9sb2NhbG5hbWUsIChjb25zdCB4bWxDaGFyICopbG9jYWxuYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIChjb25zdCB4bWxDaGFyICopVVJJLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJFbmRFbGVtZW50TnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xvY2FsbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyRW50aXR5RGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZW50aXR5IG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICBpbnQgdHlwZTsgLyogdGhlIGVudGl0eSB0eXBlICovCiAgICBpbnQgbl90eXBlOwogICAgeG1sQ2hhciAqIHB1YmxpY0lkOyAvKiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3B1YmxpY0lkOwogICAgeG1sQ2hhciAqIHN5c3RlbUlkOyAvKiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3N5c3RlbUlkOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBlbnRpdHkgdmFsdWUgKHdpdGhvdXQgcHJvY2Vzc2luZykuICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfaW50O25fdHlwZSsrKSB7CiAgICBmb3IgKG5fcHVibGljSWQgPSAwO25fcHVibGljSWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJsaWNJZCsrKSB7CiAgICBmb3IgKG5fc3lzdGVtSWQgPSAwO25fc3lzdGVtSWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXN0ZW1JZCsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB0eXBlID0gZ2VuX2ludChuX3R5cGUsIDIpOwogICAgICAgIHB1YmxpY0lkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHVibGljSWQsIDMpOwogICAgICAgIHN5c3RlbUlkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSWQsIDQpOwogICAgICAgIGNvbnRlbnQgPSBnZW5feG1sQ2hhcl9wdHIobl9jb250ZW50LCA1KTsKCiAgICAgICAgeG1sU0FYMkVudGl0eURlY2woY3R4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIHR5cGUsIChjb25zdCB4bWxDaGFyICopcHVibGljSWQsIChjb25zdCB4bWxDaGFyICopc3lzdGVtSWQsIGNvbnRlbnQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfaW50KG5fdHlwZSwgdHlwZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHVibGljSWQsIChjb25zdCB4bWxDaGFyICopcHVibGljSWQsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c3RlbUlkLCAoY29uc3QgeG1sQ2hhciAqKXN5c3RlbUlkLCA0KTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHIobl9jb250ZW50LCBjb250ZW50LCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJFbnRpdHlEZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHVibGljSWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzdGVtSWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkV4dGVybmFsU3Vic2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSByb290IGVsZW1lbnQgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiB0aGUgZXh0ZXJuYWwgSUQgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CiAgICB4bWxDaGFyICogU3lzdGVtSUQ7IC8qIHRoZSBTWVNURU0gSUQgKGUuZy4gZmlsZW5hbWUgb3IgVVJMKSAqLwogICAgaW50IG5fU3lzdGVtSUQ7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX0V4dGVybmFsSUQgPSAwO25fRXh0ZXJuYWxJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0V4dGVybmFsSUQrKykgewogICAgZm9yIChuX1N5c3RlbUlEID0gMDtuX1N5c3RlbUlEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fU3lzdGVtSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDIpOwogICAgICAgIFN5c3RlbUlEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIDMpOwoKICAgICAgICB4bWxTQVgyRXh0ZXJuYWxTdWJzZXQoY3R4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopRXh0ZXJuYWxJRCwgKGNvbnN0IHhtbENoYXIgKilTeXN0ZW1JRCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopRXh0ZXJuYWxJRCwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkV4dGVybmFsU3Vic2V0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX0V4dGVybmFsSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fU3lzdGVtSUQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJHZXRDb2x1bW5OdW1iZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU0FYMkdldENvbHVtbk51bWJlcihjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJHZXRDb2x1bW5OdW1iZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyR2V0RW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRW50aXR5UHRyIHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogVGhlIGVudGl0eSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU0FYMkdldEVudGl0eShjdHgsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbEVudGl0eVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyR2V0RW50aXR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyR2V0TGluZU51bWJlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVgyR2V0TGluZU51bWJlcihjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJHZXRMaW5lTnVtYmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkdldFBhcmFtZXRlckVudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVudGl0eVB0ciByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIFRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWDJHZXRQYXJhbWV0ZXJFbnRpdHkoY3R4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxFbnRpdHlQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkdldFBhcmFtZXRlckVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkdldFB1YmxpY0lkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWDJHZXRQdWJsaWNJZChjdHgpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkdldFB1YmxpY0lkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkdldFN5c3RlbUlkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWDJHZXRTeXN0ZW1JZChjdHgpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkdldFN5c3RlbUlkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkhhc0V4dGVybmFsU3Vic2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWDJIYXNFeHRlcm5hbFN1YnNldChjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJIYXNFeHRlcm5hbFN1YnNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJIYXNJbnRlcm5hbFN1YnNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVgySGFzSW50ZXJuYWxTdWJzZXQoY3R4KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgySGFzSW50ZXJuYWxTdWJzZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgySWdub3JhYmxlV2hpdGVzcGFjZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBjaDsgLyogYSB4bWxDaGFyIHN0cmluZyAqLwogICAgaW50IG5fY2g7CiAgICBpbnQgbGVuOyAvKiB0aGUgbnVtYmVyIG9mIHhtbENoYXIgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fY2ggPSAwO25fY2ggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jaCsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBjaCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NoLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgeG1sU0FYMklnbm9yYWJsZVdoaXRlc3BhY2UoY3R4LCAoY29uc3QgeG1sQ2hhciAqKWNoLCBsZW4pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY2gsIChjb25zdCB4bWxDaGFyICopY2gsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgySWdub3JhYmxlV2hpdGVzcGFjZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2gpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbFNBWEhhbmRsZXJfcHRyIDEKc3RhdGljIHhtbFNBWEhhbmRsZXIgKiBnZW5feG1sU0FYSGFuZGxlcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFNBWEhhbmRsZXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTQVhIYW5kbGVyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgySW5pdERlZmF1bHRTQVhIYW5kbGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sU0FYSGFuZGxlciAqIGhkbHI7IC8qIHRoZSBTQVggaGFuZGxlciAqLwogICAgaW50IG5faGRscjsKICAgIGludCB3YXJuaW5nOyAvKiBmbGFnIGlmIG5vbi16ZXJvIHNldHMgdGhlIGhhbmRsZXIgd2FybmluZyBwcm9jZWR1cmUgKi8KICAgIGludCBuX3dhcm5pbmc7CgogICAgZm9yIChuX2hkbHIgPSAwO25faGRsciA8IGdlbl9uYl94bWxTQVhIYW5kbGVyX3B0cjtuX2hkbHIrKykgewogICAgZm9yIChuX3dhcm5pbmcgPSAwO25fd2FybmluZyA8IGdlbl9uYl9pbnQ7bl93YXJuaW5nKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGhkbHIgPSBnZW5feG1sU0FYSGFuZGxlcl9wdHIobl9oZGxyLCAwKTsKICAgICAgICB3YXJuaW5nID0gZ2VuX2ludChuX3dhcm5pbmcsIDEpOwoKICAgICAgICB4bWxTQVgySW5pdERlZmF1bHRTQVhIYW5kbGVyKGhkbHIsIHdhcm5pbmcpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlcl9wdHIobl9oZGxyLCBoZGxyLCAwKTsKICAgICAgICBkZXNfaW50KG5fd2FybmluZywgd2FybmluZywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgySW5pdERlZmF1bHRTQVhIYW5kbGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hkbHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd2FybmluZyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkluaXREb2NiRGVmYXVsdFNBWEhhbmRsZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ET0NCX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxTQVhIYW5kbGVyICogaGRscjsgLyogdGhlIFNBWCBoYW5kbGVyICovCiAgICBpbnQgbl9oZGxyOwoKICAgIGZvciAobl9oZGxyID0gMDtuX2hkbHIgPCBnZW5fbmJfeG1sU0FYSGFuZGxlcl9wdHI7bl9oZGxyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGhkbHIgPSBnZW5feG1sU0FYSGFuZGxlcl9wdHIobl9oZGxyLCAwKTsKCiAgICAgICAgeG1sU0FYMkluaXREb2NiRGVmYXVsdFNBWEhhbmRsZXIoaGRscik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyX3B0cihuX2hkbHIsIGhkbHIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkluaXREb2NiRGVmYXVsdFNBWEhhbmRsZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faGRscik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJJbml0SHRtbERlZmF1bHRTQVhIYW5kbGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sU0FYSGFuZGxlciAqIGhkbHI7IC8qIHRoZSBTQVggaGFuZGxlciAqLwogICAgaW50IG5faGRscjsKCiAgICBmb3IgKG5faGRsciA9IDA7bl9oZGxyIDwgZ2VuX25iX3htbFNBWEhhbmRsZXJfcHRyO25faGRscisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBoZGxyID0gZ2VuX3htbFNBWEhhbmRsZXJfcHRyKG5faGRsciwgMCk7CgogICAgICAgIHhtbFNBWDJJbml0SHRtbERlZmF1bHRTQVhIYW5kbGVyKGhkbHIpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlcl9wdHIobl9oZGxyLCBoZGxyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJJbml0SHRtbERlZmF1bHRTQVhIYW5kbGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hkbHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgySW50ZXJuYWxTdWJzZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHJvb3QgZWxlbWVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIHRoZSBleHRlcm5hbCBJRCAqLwogICAgaW50IG5fRXh0ZXJuYWxJRDsKICAgIHhtbENoYXIgKiBTeXN0ZW1JRDsgLyogdGhlIFNZU1RFTSBJRCAoZS5nLiBmaWxlbmFtZSBvciBVUkwpICovCiAgICBpbnQgbl9TeXN0ZW1JRDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fRXh0ZXJuYWxJRCA9IDA7bl9FeHRlcm5hbElEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fRXh0ZXJuYWxJRCsrKSB7CiAgICBmb3IgKG5fU3lzdGVtSUQgPSAwO25fU3lzdGVtSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9TeXN0ZW1JRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBFeHRlcm5hbElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgMik7CiAgICAgICAgU3lzdGVtSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9TeXN0ZW1JRCwgMyk7CgogICAgICAgIHhtbFNBWDJJbnRlcm5hbFN1YnNldChjdHgsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlEKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9TeXN0ZW1JRCwgKGNvbnN0IHhtbENoYXIgKilTeXN0ZW1JRCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgySW50ZXJuYWxTdWJzZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fRXh0ZXJuYWxJRCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9TeXN0ZW1JRCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMklzU3RhbmRhbG9uZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVgySXNTdGFuZGFsb25lKGN0eCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMklzU3RhbmRhbG9uZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJOb3RhdGlvbkRlY2wodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogVGhlIG5hbWUgb2YgdGhlIG5vdGF0aW9uICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHB1YmxpY0lkOyAvKiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3B1YmxpY0lkOwogICAgeG1sQ2hhciAqIHN5c3RlbUlkOyAvKiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3N5c3RlbUlkOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9wdWJsaWNJZCA9IDA7bl9wdWJsaWNJZCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3B1YmxpY0lkKyspIHsKICAgIGZvciAobl9zeXN0ZW1JZCA9IDA7bl9zeXN0ZW1JZCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N5c3RlbUlkKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHB1YmxpY0lkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHVibGljSWQsIDIpOwogICAgICAgIHN5c3RlbUlkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSWQsIDMpOwoKICAgICAgICB4bWxTQVgyTm90YXRpb25EZWNsKGN0eCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXB1YmxpY0lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c3RlbUlkKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHVibGljSWQsIChjb25zdCB4bWxDaGFyICopcHVibGljSWQsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c3RlbUlkLCAoY29uc3QgeG1sQ2hhciAqKXN5c3RlbUlkLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJOb3RhdGlvbkRlY2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHVibGljSWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzdGVtSWQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxDaGFyICogdGFyZ2V0OyAvKiB0aGUgdGFyZ2V0IG5hbWUgKi8KICAgIGludCBuX3RhcmdldDsKICAgIHhtbENoYXIgKiBkYXRhOyAvKiB0aGUgUEkgZGF0YSdzICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl90YXJnZXQgPSAwO25fdGFyZ2V0IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdGFyZ2V0KyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CiAgICAgICAgdGFyZ2V0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdGFyZ2V0LCAxKTsKICAgICAgICBkYXRhID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fZGF0YSwgMik7CgogICAgICAgIHhtbFNBWDJQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY3R4LCAoY29uc3QgeG1sQ2hhciAqKXRhcmdldCwgKGNvbnN0IHhtbENoYXIgKilkYXRhKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3RhcmdldCwgKGNvbnN0IHhtbENoYXIgKil0YXJnZXQsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2RhdGEsIChjb25zdCB4bWxDaGFyICopZGF0YSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyUHJvY2Vzc2luZ0luc3RydWN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YXJnZXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMlJlZmVyZW5jZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBUaGUgZW50aXR5IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHhtbFNBWDJSZWZlcmVuY2UoY3R4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJSZWZlcmVuY2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJSZXNvbHZlRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBwdWJsaWNJZDsgLyogVGhlIHB1YmxpYyBJRCBvZiB0aGUgZW50aXR5ICovCiAgICBpbnQgbl9wdWJsaWNJZDsKICAgIHhtbENoYXIgKiBzeXN0ZW1JZDsgLyogVGhlIHN5c3RlbSBJRCBvZiB0aGUgZW50aXR5ICovCiAgICBpbnQgbl9zeXN0ZW1JZDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fcHVibGljSWQgPSAwO25fcHVibGljSWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJsaWNJZCsrKSB7CiAgICBmb3IgKG5fc3lzdGVtSWQgPSAwO25fc3lzdGVtSWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXN0ZW1JZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIHB1YmxpY0lkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHVibGljSWQsIDEpOwogICAgICAgIHN5c3RlbUlkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSWQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU0FYMlJlc29sdmVFbnRpdHkoY3R4LCAoY29uc3QgeG1sQ2hhciAqKXB1YmxpY0lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c3RlbUlkKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJsaWNJZCwgKGNvbnN0IHhtbENoYXIgKilwdWJsaWNJZCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSWQsIChjb25zdCB4bWxDaGFyICopc3lzdGVtSWQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMlJlc29sdmVFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3B1YmxpY0lkKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5c3RlbUlkKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbFNBWExvY2F0b3JQdHIgMQpzdGF0aWMgeG1sU0FYTG9jYXRvclB0ciBnZW5feG1sU0FYTG9jYXRvclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU0FYTG9jYXRvclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU0FYTG9jYXRvclB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJTZXREb2N1bWVudExvY2F0b3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxTQVhMb2NhdG9yUHRyIGxvYzsgLyogQSBTQVggTG9jYXRvciAqLwogICAgaW50IG5fbG9jOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9sb2MgPSAwO25fbG9jIDwgZ2VuX25iX3htbFNBWExvY2F0b3JQdHI7bl9sb2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBsb2MgPSBnZW5feG1sU0FYTG9jYXRvclB0cihuX2xvYywgMSk7CgogICAgICAgIHhtbFNBWDJTZXREb2N1bWVudExvY2F0b3IoY3R4LCBsb2MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX3htbFNBWExvY2F0b3JQdHIobl9sb2MsIGxvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyU2V0RG9jdW1lbnRMb2NhdG9yIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJTdGFydERvY3VtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHhtbFNBWDJTdGFydERvY3VtZW50KGN0eCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJTdGFydERvY3VtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMlN0YXJ0RWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIGZ1bGxuYW1lOyAvKiBUaGUgZWxlbWVudCBuYW1lLCBpbmNsdWRpbmcgbmFtZXNwYWNlIHByZWZpeCAqLwogICAgaW50IG5fZnVsbG5hbWU7CiAgICB4bWxDaGFyICoqIGF0dHM7IC8qIEFuIGFycmF5IG9mIG5hbWUvdmFsdWUgYXR0cmlidXRlcyBwYWlycywgTlVMTCB0ZXJtaW5hdGVkICovCiAgICBpbnQgbl9hdHRzOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9mdWxsbmFtZSA9IDA7bl9mdWxsbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2Z1bGxuYW1lKyspIHsKICAgIGZvciAobl9hdHRzID0gMDtuX2F0dHMgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHJfcHRyO25fYXR0cysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIGZ1bGxuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fZnVsbG5hbWUsIDEpOwogICAgICAgIGF0dHMgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fYXR0cywgMik7CgogICAgICAgIHhtbFNBWDJTdGFydEVsZW1lbnQoY3R4LCAoY29uc3QgeG1sQ2hhciAqKWZ1bGxuYW1lLCAoY29uc3QgeG1sQ2hhciAqKilhdHRzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2Z1bGxuYW1lLCAoY29uc3QgeG1sQ2hhciAqKWZ1bGxuYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fYXR0cywgKGNvbnN0IHhtbENoYXIgKiopYXR0cywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyU3RhcnRFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mdWxsbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hdHRzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJTdGFydEVsZW1lbnROcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBsb2NhbG5hbWU7IC8qIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50ICovCiAgICBpbnQgbl9sb2NhbG5hbWU7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgZWxlbWVudCBuYW1lc3BhY2UgcHJlZml4IGlmIGF2YWlsYWJsZSAqLwogICAgaW50IG5fcHJlZml4OwogICAgeG1sQ2hhciAqIFVSSTsgLyogdGhlIGVsZW1lbnQgbmFtZXNwYWNlIG5hbWUgaWYgYXZhaWxhYmxlICovCiAgICBpbnQgbl9VUkk7CiAgICBpbnQgbmJfbmFtZXNwYWNlczsgLyogbnVtYmVyIG9mIG5hbWVzcGFjZSBkZWZpbml0aW9ucyBvbiB0aGF0IG5vZGUgKi8KICAgIGludCBuX25iX25hbWVzcGFjZXM7CiAgICB4bWxDaGFyICoqIG5hbWVzcGFjZXM7IC8qIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHByZWZpeC9VUkkgcGFpcnMgbmFtZXNwYWNlIGRlZmluaXRpb25zICovCiAgICBpbnQgbl9uYW1lc3BhY2VzOwogICAgaW50IG5iX2F0dHJpYnV0ZXM7IC8qIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBvbiB0aGF0IG5vZGUgKi8KICAgIGludCBuX25iX2F0dHJpYnV0ZXM7CiAgICBpbnQgbmJfZGVmYXVsdGVkOyAvKiB0aGUgbnVtYmVyIG9mIGRlZmF1bHRlZCBhdHRyaWJ1dGVzLiAqLwogICAgaW50IG5fbmJfZGVmYXVsdGVkOwogICAgeG1sQ2hhciAqKiBhdHRyaWJ1dGVzOyAvKiBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiAobG9jYWxuYW1lL3ByZWZpeC9VUkkvdmFsdWUvZW5kKSBhdHRyaWJ1dGUgdmFsdWVzLiAqLwogICAgaW50IG5fYXR0cmlidXRlczsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fbG9jYWxuYW1lID0gMDtuX2xvY2FsbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2xvY2FsbmFtZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSSSsrKSB7CiAgICBmb3IgKG5fbmJfbmFtZXNwYWNlcyA9IDA7bl9uYl9uYW1lc3BhY2VzIDwgZ2VuX25iX2ludDtuX25iX25hbWVzcGFjZXMrKykgewogICAgZm9yIChuX25hbWVzcGFjZXMgPSAwO25fbmFtZXNwYWNlcyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHI7bl9uYW1lc3BhY2VzKyspIHsKICAgIGZvciAobl9uYl9hdHRyaWJ1dGVzID0gMDtuX25iX2F0dHJpYnV0ZXMgPCBnZW5fbmJfaW50O25fbmJfYXR0cmlidXRlcysrKSB7CiAgICBmb3IgKG5fbmJfZGVmYXVsdGVkID0gMDtuX25iX2RlZmF1bHRlZCA8IGdlbl9uYl9pbnQ7bl9uYl9kZWZhdWx0ZWQrKykgewogICAgZm9yIChuX2F0dHJpYnV0ZXMgPSAwO25fYXR0cmlidXRlcyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHI7bl9hdHRyaWJ1dGVzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CiAgICAgICAgbG9jYWxuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbG9jYWxuYW1lLCAxKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDIpOwogICAgICAgIFVSSSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1VSSSwgMyk7CiAgICAgICAgbmJfbmFtZXNwYWNlcyA9IGdlbl9pbnQobl9uYl9uYW1lc3BhY2VzLCA0KTsKICAgICAgICBuYW1lc3BhY2VzID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX25hbWVzcGFjZXMsIDUpOwogICAgICAgIG5iX2F0dHJpYnV0ZXMgPSBnZW5faW50KG5fbmJfYXR0cmlidXRlcywgNik7CiAgICAgICAgbmJfZGVmYXVsdGVkID0gZ2VuX2ludChuX25iX2RlZmF1bHRlZCwgNyk7CiAgICAgICAgYXR0cmlidXRlcyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cl9wdHIobl9hdHRyaWJ1dGVzLCA4KTsKCiAgICAgICAgeG1sU0FYMlN0YXJ0RWxlbWVudE5zKGN0eCwgKGNvbnN0IHhtbENoYXIgKilsb2NhbG5hbWUsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKVVSSSwgbmJfbmFtZXNwYWNlcywgKGNvbnN0IHhtbENoYXIgKiopbmFtZXNwYWNlcywgbmJfYXR0cmlidXRlcywgbmJfZGVmYXVsdGVkLCAoY29uc3QgeG1sQ2hhciAqKilhdHRyaWJ1dGVzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2xvY2FsbmFtZSwgKGNvbnN0IHhtbENoYXIgKilsb2NhbG5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1VSSSwgKGNvbnN0IHhtbENoYXIgKilVUkksIDMpOwogICAgICAgIGRlc19pbnQobl9uYl9uYW1lc3BhY2VzLCBuYl9uYW1lc3BhY2VzLCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fbmFtZXNwYWNlcywgKGNvbnN0IHhtbENoYXIgKiopbmFtZXNwYWNlcywgNSk7CiAgICAgICAgZGVzX2ludChuX25iX2F0dHJpYnV0ZXMsIG5iX2F0dHJpYnV0ZXMsIDYpOwogICAgICAgIGRlc19pbnQobl9uYl9kZWZhdWx0ZWQsIG5iX2RlZmF1bHRlZCwgNyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX2F0dHJpYnV0ZXMsIChjb25zdCB4bWxDaGFyICoqKWF0dHJpYnV0ZXMsIDgpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMlN0YXJ0RWxlbWVudE5zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sb2NhbG5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYl9uYW1lc3BhY2VzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVzcGFjZXMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmJfYXR0cmlidXRlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYl9kZWZhdWx0ZWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cmlidXRlcyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMlVucGFyc2VkRW50aXR5RGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBUaGUgbmFtZSBvZiB0aGUgZW50aXR5ICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHB1YmxpY0lkOyAvKiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3B1YmxpY0lkOwogICAgeG1sQ2hhciAqIHN5c3RlbUlkOyAvKiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3N5c3RlbUlkOwogICAgeG1sQ2hhciAqIG5vdGF0aW9uTmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIG5vdGF0aW9uICovCiAgICBpbnQgbl9ub3RhdGlvbk5hbWU7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3B1YmxpY0lkID0gMDtuX3B1YmxpY0lkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHVibGljSWQrKykgewogICAgZm9yIChuX3N5c3RlbUlkID0gMDtuX3N5c3RlbUlkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzdGVtSWQrKykgewogICAgZm9yIChuX25vdGF0aW9uTmFtZSA9IDA7bl9ub3RhdGlvbk5hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9ub3RhdGlvbk5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgcHVibGljSWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJsaWNJZCwgMik7CiAgICAgICAgc3lzdGVtSWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXN0ZW1JZCwgMyk7CiAgICAgICAgbm90YXRpb25OYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbm90YXRpb25OYW1lLCA0KTsKCiAgICAgICAgeG1sU0FYMlVucGFyc2VkRW50aXR5RGVjbChjdHgsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilwdWJsaWNJZCwgKGNvbnN0IHhtbENoYXIgKilzeXN0ZW1JZCwgKGNvbnN0IHhtbENoYXIgKilub3RhdGlvbk5hbWUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJsaWNJZCwgKGNvbnN0IHhtbENoYXIgKilwdWJsaWNJZCwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSWQsIChjb25zdCB4bWxDaGFyICopc3lzdGVtSWQsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25vdGF0aW9uTmFtZSwgKGNvbnN0IHhtbENoYXIgKilub3RhdGlvbk5hbWUsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMlVucGFyc2VkRW50aXR5RGVjbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wdWJsaWNJZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zeXN0ZW1JZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub3RhdGlvbk5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWERlZmF1bHRWZXJzaW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgdmVyc2lvbjsgLyogdGhlIHZlcnNpb24sIDEgb3IgMiAqLwogICAgaW50IG5fdmVyc2lvbjsKCiAgICBmb3IgKG5fdmVyc2lvbiA9IDA7bl92ZXJzaW9uIDwgZ2VuX25iX2ludDtuX3ZlcnNpb24rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmVyc2lvbiA9IGdlbl9pbnQobl92ZXJzaW9uLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWERlZmF1bHRWZXJzaW9uKHZlcnNpb24pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl92ZXJzaW9uLCB2ZXJzaW9uLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWERlZmF1bHRWZXJzaW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZlcnNpb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYVmVyc2lvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU0FYSGFuZGxlciAqIGhkbHI7IC8qIHRoZSBTQVggaGFuZGxlciAqLwogICAgaW50IG5faGRscjsKICAgIGludCB2ZXJzaW9uOyAvKiB0aGUgdmVyc2lvbiwgMSBvciAyICovCiAgICBpbnQgbl92ZXJzaW9uOwoKICAgIGZvciAobl9oZGxyID0gMDtuX2hkbHIgPCBnZW5fbmJfeG1sU0FYSGFuZGxlcl9wdHI7bl9oZGxyKyspIHsKICAgIGZvciAobl92ZXJzaW9uID0gMDtuX3ZlcnNpb24gPCBnZW5fbmJfaW50O25fdmVyc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBoZGxyID0gZ2VuX3htbFNBWEhhbmRsZXJfcHRyKG5faGRsciwgMCk7CiAgICAgICAgdmVyc2lvbiA9IGdlbl9pbnQobl92ZXJzaW9uLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWFZlcnNpb24oaGRsciwgdmVyc2lvbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJfcHRyKG5faGRsciwgaGRsciwgMCk7CiAgICAgICAgZGVzX2ludChuX3ZlcnNpb24sIHZlcnNpb24sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYVmVyc2lvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9oZGxyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZlcnNpb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfU0FYMih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgU0FYMiA6IDM4IG9mIDM4IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9kb2NiRGVmYXVsdFNBWEhhbmRsZXJJbml0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxEZWZhdWx0U0FYSGFuZGxlckluaXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGVmYXVsdFNBWEhhbmRsZXJJbml0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJBdHRyaWJ1dGVEZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJDRGF0YUJsb2NrKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJDaGFyYWN0ZXJzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJDb21tZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJFbGVtZW50RGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyRW5kRG9jdW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkVuZEVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkVuZEVsZW1lbnROcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyRW50aXR5RGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyRXh0ZXJuYWxTdWJzZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkdldENvbHVtbk51bWJlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyR2V0RW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJHZXRMaW5lTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJHZXRQYXJhbWV0ZXJFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkdldFB1YmxpY0lkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJHZXRTeXN0ZW1JZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgySGFzRXh0ZXJuYWxTdWJzZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkhhc0ludGVybmFsU3Vic2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJJZ25vcmFibGVXaGl0ZXNwYWNlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJJbml0RGVmYXVsdFNBWEhhbmRsZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkluaXREb2NiRGVmYXVsdFNBWEhhbmRsZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkluaXRIdG1sRGVmYXVsdFNBWEhhbmRsZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkludGVybmFsU3Vic2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJJc1N0YW5kYWxvbmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMk5vdGF0aW9uRGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyUHJvY2Vzc2luZ0luc3RydWN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJSZWZlcmVuY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMlJlc29sdmVFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMlNldERvY3VtZW50TG9jYXRvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyU3RhcnREb2N1bWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyU3RhcnRFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJTdGFydEVsZW1lbnROcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyVW5wYXJzZWRFbnRpdHlEZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWERlZmF1bHRWZXJzaW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFZlcnNpb24oKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIFNBWDI6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbEMxNE5Eb2NEdW1wTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQzE0Tl9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIFhNTCBkb2N1bWVudCBmb3IgY2Fub25pemF0aW9uICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiB0aGUgbm9kZXMgc2V0IHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjYW5vbml6ZWQgaW1hZ2Ugb3IgTlVMTCBpZiBhbGwgZG9jdW1lbnQgbm9kZXMgc2hvdWxkIGJlIGluY2x1ZGVkICovCiAgICBpbnQgbl9ub2RlczsKICAgIGludCBleGNsdXNpdmU7IC8qIHRoZSBleGNsdXNpdmUgZmxhZyAoMCAtIG5vbi1leGNsdXNpdmUgY2Fub25pY2FsaXphdGlvbjsgb3RoZXJ3aXNlIC0gZXhjbHVzaXZlIGNhbm9uaWNhbGl6YXRpb24pICovCiAgICBpbnQgbl9leGNsdXNpdmU7CiAgICB4bWxDaGFyICoqIGluY2x1c2l2ZV9uc19wcmVmaXhlczsgLyogdGhlIGxpc3Qgb2YgaW5jbHVzaXZlIG5hbWVzcGFjZSBwcmVmaXhlcyBlbmRlZCB3aXRoIGEgTlVMTCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vIGluY2x1c2l2ZSBuYW1lc3BhY2VzIChvbmx5IGZvciBleGNsdXNpdmUgY2Fub25pY2FsaXphdGlvbiwgaWdub3JlZCBvdGhlcndpc2UpICovCiAgICBpbnQgbl9pbmNsdXNpdmVfbnNfcHJlZml4ZXM7CiAgICBpbnQgd2l0aF9jb21tZW50czsgLyogaW5jbHVkZSBjb21tZW50cyBpbiB0aGUgcmVzdWx0ICghPTApIG9yIG5vdCAoPT0wKSAqLwogICAgaW50IG5fd2l0aF9jb21tZW50czsKICAgIHhtbENoYXIgKiogZG9jX3R4dF9wdHI7IC8qIHRoZSBtZW1vcnkgcG9pbnRlciBmb3IgYWxsb2NhdGVkIGNhbm9uaWNhbCBYTUwgdGV4dDsgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9ucyBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB4bWxGcmVlKCkgdG8gZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCiAgICBpbnQgbl9kb2NfdHh0X3B0cjsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CiAgICBmb3IgKG5fZXhjbHVzaXZlID0gMDtuX2V4Y2x1c2l2ZSA8IGdlbl9uYl9pbnQ7bl9leGNsdXNpdmUrKykgewogICAgZm9yIChuX2luY2x1c2l2ZV9uc19wcmVmaXhlcyA9IDA7bl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMgPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25faW5jbHVzaXZlX25zX3ByZWZpeGVzKyspIHsKICAgIGZvciAobl93aXRoX2NvbW1lbnRzID0gMDtuX3dpdGhfY29tbWVudHMgPCBnZW5fbmJfaW50O25fd2l0aF9jb21tZW50cysrKSB7CiAgICBmb3IgKG5fZG9jX3R4dF9wdHIgPSAwO25fZG9jX3R4dF9wdHIgPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25fZG9jX3R4dF9wdHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbm9kZXMgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzLCAxKTsKICAgICAgICBleGNsdXNpdmUgPSBnZW5faW50KG5fZXhjbHVzaXZlLCAyKTsKICAgICAgICBpbmNsdXNpdmVfbnNfcHJlZml4ZXMgPSBnZW5feG1sQ2hhcl9wdHJfcHRyKG5faW5jbHVzaXZlX25zX3ByZWZpeGVzLCAzKTsKICAgICAgICB3aXRoX2NvbW1lbnRzID0gZ2VuX2ludChuX3dpdGhfY29tbWVudHMsIDQpOwogICAgICAgIGRvY190eHRfcHRyID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX2RvY190eHRfcHRyLCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEMxNE5Eb2NEdW1wTWVtb3J5KGRvYywgbm9kZXMsIGV4Y2x1c2l2ZSwgaW5jbHVzaXZlX25zX3ByZWZpeGVzLCB3aXRoX2NvbW1lbnRzLCBkb2NfdHh0X3B0cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzLCBub2RlcywgMSk7CiAgICAgICAgZGVzX2ludChuX2V4Y2x1c2l2ZSwgZXhjbHVzaXZlLCAyKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5faW5jbHVzaXZlX25zX3ByZWZpeGVzLCBpbmNsdXNpdmVfbnNfcHJlZml4ZXMsIDMpOwogICAgICAgIGRlc19pbnQobl93aXRoX2NvbW1lbnRzLCB3aXRoX2NvbW1lbnRzLCA0KTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5fZG9jX3R4dF9wdHIsIGRvY190eHRfcHRyLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEMxNE5Eb2NEdW1wTWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2Rlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leGNsdXNpdmUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5jbHVzaXZlX25zX3ByZWZpeGVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dpdGhfY29tbWVudHMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jX3R4dF9wdHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDMTRORG9jU2F2ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0MxNE5fRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBYTUwgZG9jdW1lbnQgZm9yIGNhbm9uaXphdGlvbiAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVNldFB0ciBub2RlczsgLyogdGhlIG5vZGVzIHNldCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY2Fub25pemVkIGltYWdlIG9yIE5VTEwgaWYgYWxsIGRvY3VtZW50IG5vZGVzIHNob3VsZCBiZSBpbmNsdWRlZCAqLwogICAgaW50IG5fbm9kZXM7CiAgICBpbnQgZXhjbHVzaXZlOyAvKiB0aGUgZXhjbHVzaXZlIGZsYWcgKDAgLSBub24tZXhjbHVzaXZlIGNhbm9uaWNhbGl6YXRpb247IG90aGVyd2lzZSAtIGV4Y2x1c2l2ZSBjYW5vbmljYWxpemF0aW9uKSAqLwogICAgaW50IG5fZXhjbHVzaXZlOwogICAgeG1sQ2hhciAqKiBpbmNsdXNpdmVfbnNfcHJlZml4ZXM7IC8qIHRoZSBsaXN0IG9mIGluY2x1c2l2ZSBuYW1lc3BhY2UgcHJlZml4ZXMgZW5kZWQgd2l0aCBhIE5VTEwgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBpbmNsdXNpdmUgbmFtZXNwYWNlcyAob25seSBmb3IgZXhjbHVzaXZlIGNhbm9uaWNhbGl6YXRpb24sIGlnbm9yZWQgb3RoZXJ3aXNlKSAqLwogICAgaW50IG5faW5jbHVzaXZlX25zX3ByZWZpeGVzOwogICAgaW50IHdpdGhfY29tbWVudHM7IC8qIGluY2x1ZGUgY29tbWVudHMgaW4gdGhlIHJlc3VsdCAoIT0wKSBvciBub3QgKD09MCkgKi8KICAgIGludCBuX3dpdGhfY29tbWVudHM7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSB0byBzdG9yZSBjYW5vbmljYWwgWE1MIGltYWdlICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIGludCBjb21wcmVzc2lvbjsgLyogdGhlIGNvbXByZXNzaW9uIGxldmVsICh6bGliIHJlcXVyZWQpOiAtMSAtIGxpYnhtbCBkZWZhdWx0LCAwIC0gdW5jb21wcmVzc2VkLCA+MCAtIGNvbXByZXNzaW9uIGxldmVsICovCiAgICBpbnQgbl9jb21wcmVzc2lvbjsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CiAgICBmb3IgKG5fZXhjbHVzaXZlID0gMDtuX2V4Y2x1c2l2ZSA8IGdlbl9uYl9pbnQ7bl9leGNsdXNpdmUrKykgewogICAgZm9yIChuX2luY2x1c2l2ZV9uc19wcmVmaXhlcyA9IDA7bl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMgPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25faW5jbHVzaXZlX25zX3ByZWZpeGVzKyspIHsKICAgIGZvciAobl93aXRoX2NvbW1lbnRzID0gMDtuX3dpdGhfY29tbWVudHMgPCBnZW5fbmJfaW50O25fd2l0aF9jb21tZW50cysrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZW91dHB1dDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9jb21wcmVzc2lvbiA9IDA7bl9jb21wcmVzc2lvbiA8IGdlbl9uYl9pbnQ7bl9jb21wcmVzc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBub2RlcyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMsIDEpOwogICAgICAgIGV4Y2x1c2l2ZSA9IGdlbl9pbnQobl9leGNsdXNpdmUsIDIpOwogICAgICAgIGluY2x1c2l2ZV9uc19wcmVmaXhlcyA9IGdlbl94bWxDaGFyX3B0cl9wdHIobl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMsIDMpOwogICAgICAgIHdpdGhfY29tbWVudHMgPSBnZW5faW50KG5fd2l0aF9jb21tZW50cywgNCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZW91dHB1dChuX2ZpbGVuYW1lLCA1KTsKICAgICAgICBjb21wcmVzc2lvbiA9IGdlbl9pbnQobl9jb21wcmVzc2lvbiwgNik7CgogICAgICAgIHJldF92YWwgPSB4bWxDMTRORG9jU2F2ZShkb2MsIG5vZGVzLCBleGNsdXNpdmUsIGluY2x1c2l2ZV9uc19wcmVmaXhlcywgd2l0aF9jb21tZW50cywgZmlsZW5hbWUsIGNvbXByZXNzaW9uKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMsIG5vZGVzLCAxKTsKICAgICAgICBkZXNfaW50KG5fZXhjbHVzaXZlLCBleGNsdXNpdmUsIDIpOwogICAgICAgIGRlc194bWxDaGFyX3B0cl9wdHIobl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMsIGluY2x1c2l2ZV9uc19wcmVmaXhlcywgMyk7CiAgICAgICAgZGVzX2ludChuX3dpdGhfY29tbWVudHMsIHdpdGhfY29tbWVudHMsIDQpOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fZmlsZW5hbWUsIGZpbGVuYW1lLCA1KTsKICAgICAgICBkZXNfaW50KG5fY29tcHJlc3Npb24sIGNvbXByZXNzaW9uLCA2KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEMxNE5Eb2NTYXZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2Rlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leGNsdXNpdmUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5jbHVzaXZlX25zX3ByZWZpeGVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dpdGhfY29tbWVudHMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcHJlc3Npb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDMTRORG9jU2F2ZVRvKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQzE0Tl9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIFhNTCBkb2N1bWVudCBmb3IgY2Fub25pemF0aW9uICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiB0aGUgbm9kZXMgc2V0IHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjYW5vbml6ZWQgaW1hZ2Ugb3IgTlVMTCBpZiBhbGwgZG9jdW1lbnQgbm9kZXMgc2hvdWxkIGJlIGluY2x1ZGVkICovCiAgICBpbnQgbl9ub2RlczsKICAgIGludCBleGNsdXNpdmU7IC8qIHRoZSBleGNsdXNpdmUgZmxhZyAoMCAtIG5vbi1leGNsdXNpdmUgY2Fub25pY2FsaXphdGlvbjsgb3RoZXJ3aXNlIC0gZXhjbHVzaXZlIGNhbm9uaWNhbGl6YXRpb24pICovCiAgICBpbnQgbl9leGNsdXNpdmU7CiAgICB4bWxDaGFyICoqIGluY2x1c2l2ZV9uc19wcmVmaXhlczsgLyogdGhlIGxpc3Qgb2YgaW5jbHVzaXZlIG5hbWVzcGFjZSBwcmVmaXhlcyBlbmRlZCB3aXRoIGEgTlVMTCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vIGluY2x1c2l2ZSBuYW1lc3BhY2VzIChvbmx5IGZvciBleGNsdXNpdmUgY2Fub25pY2FsaXphdGlvbiwgaWdub3JlZCBvdGhlcndpc2UpICovCiAgICBpbnQgbl9pbmNsdXNpdmVfbnNfcHJlZml4ZXM7CiAgICBpbnQgd2l0aF9jb21tZW50czsgLyogaW5jbHVkZSBjb21tZW50cyBpbiB0aGUgcmVzdWx0ICghPTApIG9yIG5vdCAoPT0wKSAqLwogICAgaW50IG5fd2l0aF9jb21tZW50czsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIGNhbm9uaWNhbCBYTUw7IHRoaXMgYnVmZmVyIE1VU1QgaGF2ZSBlbmNvZGVyPT1OVUxMIGJlY2F1c2UgQzE0TiByZXF1aXJlcyBVVEYtOCBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CiAgICBmb3IgKG5fZXhjbHVzaXZlID0gMDtuX2V4Y2x1c2l2ZSA8IGdlbl9uYl9pbnQ7bl9leGNsdXNpdmUrKykgewogICAgZm9yIChuX2luY2x1c2l2ZV9uc19wcmVmaXhlcyA9IDA7bl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMgPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25faW5jbHVzaXZlX25zX3ByZWZpeGVzKyspIHsKICAgIGZvciAobl93aXRoX2NvbW1lbnRzID0gMDtuX3dpdGhfY29tbWVudHMgPCBnZW5fbmJfaW50O25fd2l0aF9jb21tZW50cysrKSB7CiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxPdXRwdXRCdWZmZXJQdHI7bl9idWYrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbm9kZXMgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzLCAxKTsKICAgICAgICBleGNsdXNpdmUgPSBnZW5faW50KG5fZXhjbHVzaXZlLCAyKTsKICAgICAgICBpbmNsdXNpdmVfbnNfcHJlZml4ZXMgPSBnZW5feG1sQ2hhcl9wdHJfcHRyKG5faW5jbHVzaXZlX25zX3ByZWZpeGVzLCAzKTsKICAgICAgICB3aXRoX2NvbW1lbnRzID0gZ2VuX2ludChuX3dpdGhfY29tbWVudHMsIDQpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIDUpOwoKICAgICAgICByZXRfdmFsID0geG1sQzE0TkRvY1NhdmVUbyhkb2MsIG5vZGVzLCBleGNsdXNpdmUsIGluY2x1c2l2ZV9uc19wcmVmaXhlcywgd2l0aF9jb21tZW50cywgYnVmKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMsIG5vZGVzLCAxKTsKICAgICAgICBkZXNfaW50KG5fZXhjbHVzaXZlLCBleGNsdXNpdmUsIDIpOwogICAgICAgIGRlc194bWxDaGFyX3B0cl9wdHIobl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMsIGluY2x1c2l2ZV9uc19wcmVmaXhlcywgMyk7CiAgICAgICAgZGVzX2ludChuX3dpdGhfY29tbWVudHMsIHdpdGhfY29tbWVudHMsIDQpOwogICAgICAgIGRlc194bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIGJ1ZiwgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDMTRORG9jU2F2ZVRvIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2Rlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leGNsdXNpdmUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5jbHVzaXZlX25zX3ByZWZpeGVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dpdGhfY29tbWVudHMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQzE0TkV4ZWN1dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9jMTRuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBjMTRuIDogMyBvZiA0IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDMTRORG9jRHVtcE1lbW9yeSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDMTRORG9jU2F2ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDMTRORG9jU2F2ZVRvKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEMxNE5FeGVjdXRlKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBjMTRuOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KI2lmZGVmIExJQlhNTF9DQVRBTE9HX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbENhdGFsb2dQdHIgMQpzdGF0aWMgeG1sQ2F0YWxvZ1B0ciBnZW5feG1sQ2F0YWxvZ1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sQ2F0YWxvZ1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2F0YWxvZ1B0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sQUNhdGFsb2dBZGQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENhdGFsb2dQdHIgY2F0YWw7IC8qIGEgQ2F0YWxvZyAqLwogICAgaW50IG5fY2F0YWw7CiAgICB4bWxDaGFyICogdHlwZTsgLyogdGhlIHR5cGUgb2YgcmVjb3JkIHRvIGFkZCB0byB0aGUgY2F0YWxvZyAqLwogICAgaW50IG5fdHlwZTsKICAgIHhtbENoYXIgKiBvcmlnOyAvKiB0aGUgc3lzdGVtLCBwdWJsaWMgb3IgcHJlZml4IHRvIG1hdGNoICovCiAgICBpbnQgbl9vcmlnOwogICAgeG1sQ2hhciAqIHJlcGxhY2U7IC8qIHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmb3IgdGhlIG1hdGNoICovCiAgICBpbnQgbl9yZXBsYWNlOwoKICAgIGZvciAobl9jYXRhbCA9IDA7bl9jYXRhbCA8IGdlbl9uYl94bWxDYXRhbG9nUHRyO25fY2F0YWwrKykgewogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3R5cGUrKykgewogICAgZm9yIChuX29yaWcgPSAwO25fb3JpZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX29yaWcrKykgewogICAgZm9yIChuX3JlcGxhY2UgPSAwO25fcmVwbGFjZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3JlcGxhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY2F0YWwgPSBnZW5feG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCAwKTsKICAgICAgICB0eXBlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdHlwZSwgMSk7CiAgICAgICAgb3JpZyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX29yaWcsIDIpOwogICAgICAgIHJlcGxhY2UgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9yZXBsYWNlLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFDYXRhbG9nQWRkKGNhdGFsLCAoY29uc3QgeG1sQ2hhciAqKXR5cGUsIChjb25zdCB4bWxDaGFyICopb3JpZywgKGNvbnN0IHhtbENoYXIgKilyZXBsYWNlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCBjYXRhbCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdHlwZSwgKGNvbnN0IHhtbENoYXIgKil0eXBlLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9vcmlnLCAoY29uc3QgeG1sQ2hhciAqKW9yaWcsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3JlcGxhY2UsIChjb25zdCB4bWxDaGFyICopcmVwbGFjZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBQ2F0YWxvZ0FkZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29yaWcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVwbGFjZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFDYXRhbG9nRHVtcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDYXRhbG9nUHRyIGNhdGFsOyAvKiBhIENhdGFsb2cgKi8KICAgIGludCBuX2NhdGFsOwogICAgRklMRSAqIG91dDsgLyogdGhlIGZpbGUuICovCiAgICBpbnQgbl9vdXQ7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl9GSUxFX3B0cjtuX291dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwogICAgICAgIG91dCA9IGdlbl9GSUxFX3B0cihuX291dCwgMSk7CgogICAgICAgIHhtbEFDYXRhbG9nRHVtcChjYXRhbCwgb3V0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENhdGFsb2dQdHIobl9jYXRhbCwgY2F0YWwsIDApOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dCwgb3V0LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFDYXRhbG9nRHVtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBQ2F0YWxvZ1JlbW92ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2F0YWxvZ1B0ciBjYXRhbDsgLyogYSBDYXRhbG9nICovCiAgICBpbnQgbl9jYXRhbDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIHRvIHJlbW92ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQUNhdGFsb2dSZW1vdmUoY2F0YWwsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDYXRhbG9nUHRyKG5fY2F0YWwsIGNhdGFsLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBQ2F0YWxvZ1JlbW92ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFDYXRhbG9nUmVzb2x2ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2F0YWxvZ1B0ciBjYXRhbDsgLyogYSBDYXRhbG9nICovCiAgICBpbnQgbl9jYXRhbDsKICAgIHhtbENoYXIgKiBwdWJJRDsgLyogdGhlIHB1YmxpYyBJRCBzdHJpbmcgKi8KICAgIGludCBuX3B1YklEOwogICAgeG1sQ2hhciAqIHN5c0lEOyAvKiB0aGUgc3lzdGVtIElEIHN0cmluZyAqLwogICAgaW50IG5fc3lzSUQ7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICBmb3IgKG5fcHViSUQgPSAwO25fcHViSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJJRCsrKSB7CiAgICBmb3IgKG5fc3lzSUQgPSAwO25fc3lzSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXNJRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwogICAgICAgIHB1YklEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIDEpOwogICAgICAgIHN5c0lEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzSUQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sQUNhdGFsb2dSZXNvbHZlKGNhdGFsLCAoY29uc3QgeG1sQ2hhciAqKXB1YklELCAoY29uc3QgeG1sQ2hhciAqKXN5c0lEKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDYXRhbG9nUHRyKG5fY2F0YWwsIGNhdGFsLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJJRCwgKGNvbnN0IHhtbENoYXIgKilwdWJJRCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzSUQsIChjb25zdCB4bWxDaGFyICopc3lzSUQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQUNhdGFsb2dSZXNvbHZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3B1YklEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5c0lEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQUNhdGFsb2dSZXNvbHZlUHVibGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDYXRhbG9nUHRyIGNhdGFsOyAvKiBhIENhdGFsb2cgKi8KICAgIGludCBuX2NhdGFsOwogICAgeG1sQ2hhciAqIHB1YklEOyAvKiB0aGUgcHVibGljIElEIHN0cmluZyAqLwogICAgaW50IG5fcHViSUQ7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICBmb3IgKG5fcHViSUQgPSAwO25fcHViSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJJRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwogICAgICAgIHB1YklEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQUNhdGFsb2dSZXNvbHZlUHVibGljKGNhdGFsLCAoY29uc3QgeG1sQ2hhciAqKXB1YklEKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDYXRhbG9nUHRyKG5fY2F0YWwsIGNhdGFsLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJJRCwgKGNvbnN0IHhtbENoYXIgKilwdWJJRCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBQ2F0YWxvZ1Jlc29sdmVQdWJsaWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2F0YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViSUQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBQ2F0YWxvZ1Jlc29sdmVTeXN0ZW0odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENhdGFsb2dQdHIgY2F0YWw7IC8qIGEgQ2F0YWxvZyAqLwogICAgaW50IG5fY2F0YWw7CiAgICB4bWxDaGFyICogc3lzSUQ7IC8qIHRoZSBzeXN0ZW0gSUQgc3RyaW5nICovCiAgICBpbnQgbl9zeXNJRDsKCiAgICBmb3IgKG5fY2F0YWwgPSAwO25fY2F0YWwgPCBnZW5fbmJfeG1sQ2F0YWxvZ1B0cjtuX2NhdGFsKyspIHsKICAgIGZvciAobl9zeXNJRCA9IDA7bl9zeXNJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N5c0lEKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNhdGFsID0gZ2VuX3htbENhdGFsb2dQdHIobl9jYXRhbCwgMCk7CiAgICAgICAgc3lzSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxBQ2F0YWxvZ1Jlc29sdmVTeXN0ZW0oY2F0YWwsIChjb25zdCB4bWxDaGFyICopc3lzSUQpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENhdGFsb2dQdHIobl9jYXRhbCwgY2F0YWwsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c0lELCAoY29uc3QgeG1sQ2hhciAqKXN5c0lELCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFDYXRhbG9nUmVzb2x2ZVN5c3RlbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zeXNJRCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFDYXRhbG9nUmVzb2x2ZVVSSSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2F0YWxvZ1B0ciBjYXRhbDsgLyogYSBDYXRhbG9nICovCiAgICBpbnQgbl9jYXRhbDsKICAgIHhtbENoYXIgKiBVUkk7IC8qIHRoZSBVUkkgKi8KICAgIGludCBuX1VSSTsKCiAgICBmb3IgKG5fY2F0YWwgPSAwO25fY2F0YWwgPCBnZW5fbmJfeG1sQ2F0YWxvZ1B0cjtuX2NhdGFsKyspIHsKICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJJKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNhdGFsID0gZ2VuX3htbENhdGFsb2dQdHIobl9jYXRhbCwgMCk7CiAgICAgICAgVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFDYXRhbG9nUmVzb2x2ZVVSSShjYXRhbCwgKGNvbnN0IHhtbENoYXIgKilVUkkpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENhdGFsb2dQdHIobl9jYXRhbCwgY2F0YWwsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1VSSSwgKGNvbnN0IHhtbENoYXIgKilVUkksIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQUNhdGFsb2dSZXNvbHZlVVJJIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dBZGQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB0eXBlOyAvKiB0aGUgdHlwZSBvZiByZWNvcmQgdG8gYWRkIHRvIHRoZSBjYXRhbG9nICovCiAgICBpbnQgbl90eXBlOwogICAgeG1sQ2hhciAqIG9yaWc7IC8qIHRoZSBzeXN0ZW0sIHB1YmxpYyBvciBwcmVmaXggdG8gbWF0Y2ggKi8KICAgIGludCBuX29yaWc7CiAgICB4bWxDaGFyICogcmVwbGFjZTsgLyogdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZvciB0aGUgbWF0Y2ggKi8KICAgIGludCBuX3JlcGxhY2U7CgogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3R5cGUrKykgewogICAgZm9yIChuX29yaWcgPSAwO25fb3JpZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX29yaWcrKykgewogICAgZm9yIChuX3JlcGxhY2UgPSAwO25fcmVwbGFjZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3JlcGxhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdHlwZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3R5cGUsIDApOwogICAgICAgIG9yaWcgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9vcmlnLCAxKTsKICAgICAgICByZXBsYWNlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcmVwbGFjZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxDYXRhbG9nQWRkKChjb25zdCB4bWxDaGFyICopdHlwZSwgKGNvbnN0IHhtbENoYXIgKilvcmlnLCAoY29uc3QgeG1sQ2hhciAqKXJlcGxhY2UpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3R5cGUsIChjb25zdCB4bWxDaGFyICopdHlwZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fb3JpZywgKGNvbnN0IHhtbENoYXIgKilvcmlnLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9yZXBsYWNlLCAoY29uc3QgeG1sQ2hhciAqKXJlcGxhY2UsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2F0YWxvZ0FkZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29yaWcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVwbGFjZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dDbGVhbnVwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKQoKCiAgICAgICAgeG1sQ2F0YWxvZ0NsZWFudXAoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2F0YWxvZ0NvbnZlcnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgcmV0X3ZhbDsKCgogICAgICAgIHJldF92YWwgPSB4bWxDYXRhbG9nQ29udmVydCgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dEdW1wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXQ7IC8qIHRoZSBmaWxlLiAqLwogICAgaW50IG5fb3V0OwoKICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX0ZJTEVfcHRyO25fb3V0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dCA9IGdlbl9GSUxFX3B0cihuX291dCwgMCk7CgogICAgICAgIHhtbENhdGFsb2dEdW1wKG91dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dCwgb3V0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENhdGFsb2dEdW1wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dHZXREZWZhdWx0cyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENhdGFsb2dBbGxvdyByZXRfdmFsOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ0dldERlZmF1bHRzKCk7CiAgICAgICAgZGVzcmV0X3htbENhdGFsb2dBbGxvdyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDYXRhbG9nR2V0RGVmYXVsdHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDYXRhbG9nSXNFbXB0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2F0YWxvZ1B0ciBjYXRhbDsgLyogc2hvdWxkIHRoaXMgY3JlYXRlIGFuIFNHTUwgY2F0YWxvZyAqLwogICAgaW50IG5fY2F0YWw7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ0lzRW1wdHkoY2F0YWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDYXRhbG9nUHRyKG5fY2F0YWwsIGNhdGFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENhdGFsb2dJc0VtcHR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2F0YWxvZ0xvY2FsUmVzb2x2ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgdm9pZCAqIGNhdGFsb2dzOyAvKiBhIGRvY3VtZW50J3MgbGlzdCBvZiBjYXRhbG9ncyAqLwogICAgaW50IG5fY2F0YWxvZ3M7CiAgICB4bWxDaGFyICogcHViSUQ7IC8qIHRoZSBwdWJsaWMgSUQgc3RyaW5nICovCiAgICBpbnQgbl9wdWJJRDsKICAgIHhtbENoYXIgKiBzeXNJRDsgLyogdGhlIHN5c3RlbSBJRCBzdHJpbmcgKi8KICAgIGludCBuX3N5c0lEOwoKICAgIGZvciAobl9jYXRhbG9ncyA9IDA7bl9jYXRhbG9ncyA8IGdlbl9uYl92b2lkX3B0cjtuX2NhdGFsb2dzKyspIHsKICAgIGZvciAobl9wdWJJRCA9IDA7bl9wdWJJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3B1YklEKyspIHsKICAgIGZvciAobl9zeXNJRCA9IDA7bl9zeXNJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N5c0lEKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNhdGFsb2dzID0gZ2VuX3ZvaWRfcHRyKG5fY2F0YWxvZ3MsIDApOwogICAgICAgIHB1YklEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIDEpOwogICAgICAgIHN5c0lEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzSUQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ0xvY2FsUmVzb2x2ZShjYXRhbG9ncywgKGNvbnN0IHhtbENoYXIgKilwdWJJRCwgKGNvbnN0IHhtbENoYXIgKilzeXNJRCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jYXRhbG9ncywgY2F0YWxvZ3MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3B1YklELCAoY29uc3QgeG1sQ2hhciAqKXB1YklELCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgKGNvbnN0IHhtbENoYXIgKilzeXNJRCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDYXRhbG9nTG9jYWxSZXNvbHZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsb2dzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3B1YklEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5c0lEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2F0YWxvZ0xvY2FsUmVzb2x2ZVVSSSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgdm9pZCAqIGNhdGFsb2dzOyAvKiBhIGRvY3VtZW50J3MgbGlzdCBvZiBjYXRhbG9ncyAqLwogICAgaW50IG5fY2F0YWxvZ3M7CiAgICB4bWxDaGFyICogVVJJOyAvKiB0aGUgVVJJICovCiAgICBpbnQgbl9VUkk7CgogICAgZm9yIChuX2NhdGFsb2dzID0gMDtuX2NhdGFsb2dzIDwgZ2VuX25iX3ZvaWRfcHRyO25fY2F0YWxvZ3MrKykgewogICAgZm9yIChuX1VSSSA9IDA7bl9VUkkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9VUkkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY2F0YWxvZ3MgPSBnZW5fdm9pZF9wdHIobl9jYXRhbG9ncywgMCk7CiAgICAgICAgVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENhdGFsb2dMb2NhbFJlc29sdmVVUkkoY2F0YWxvZ3MsIChjb25zdCB4bWxDaGFyICopVVJJKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2NhdGFsb2dzLCBjYXRhbG9ncywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAoY29uc3QgeG1sQ2hhciAqKVVSSSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDYXRhbG9nTG9jYWxSZXNvbHZlVVJJIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsb2dzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dSZW1vdmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIHRvIHJlbW92ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ1JlbW92ZSgoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2F0YWxvZ1Jlc29sdmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBwdWJJRDsgLyogdGhlIHB1YmxpYyBJRCBzdHJpbmcgKi8KICAgIGludCBuX3B1YklEOwogICAgeG1sQ2hhciAqIHN5c0lEOyAvKiB0aGUgc3lzdGVtIElEIHN0cmluZyAqLwogICAgaW50IG5fc3lzSUQ7CgogICAgZm9yIChuX3B1YklEID0gMDtuX3B1YklEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHViSUQrKykgewogICAgZm9yIChuX3N5c0lEID0gMDtuX3N5c0lEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcHViSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJJRCwgMCk7CiAgICAgICAgc3lzSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDYXRhbG9nUmVzb2x2ZSgoY29uc3QgeG1sQ2hhciAqKXB1YklELCAoY29uc3QgeG1sQ2hhciAqKXN5c0lEKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3B1YklELCAoY29uc3QgeG1sQ2hhciAqKXB1YklELCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgKGNvbnN0IHhtbENoYXIgKilzeXNJRCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDYXRhbG9nUmVzb2x2ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wdWJJRCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zeXNJRCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dSZXNvbHZlUHVibGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogcHViSUQ7IC8qIHRoZSBwdWJsaWMgSUQgc3RyaW5nICovCiAgICBpbnQgbl9wdWJJRDsKCiAgICBmb3IgKG5fcHViSUQgPSAwO25fcHViSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJJRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwdWJJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3B1YklELCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENhdGFsb2dSZXNvbHZlUHVibGljKChjb25zdCB4bWxDaGFyICopcHViSUQpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIChjb25zdCB4bWxDaGFyICopcHViSUQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2F0YWxvZ1Jlc29sdmVQdWJsaWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViSUQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDYXRhbG9nUmVzb2x2ZVN5c3RlbSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIHN5c0lEOyAvKiB0aGUgc3lzdGVtIElEIHN0cmluZyAqLwogICAgaW50IG5fc3lzSUQ7CgogICAgZm9yIChuX3N5c0lEID0gMDtuX3N5c0lEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3lzSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDYXRhbG9nUmVzb2x2ZVN5c3RlbSgoY29uc3QgeG1sQ2hhciAqKXN5c0lEKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c0lELCAoY29uc3QgeG1sQ2hhciAqKXN5c0lELCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENhdGFsb2dSZXNvbHZlU3lzdGVtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5c0lEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2F0YWxvZ1Jlc29sdmVVUkkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBVUkk7IC8qIHRoZSBVUkkgKi8KICAgIGludCBuX1VSSTsKCiAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSSSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ1Jlc29sdmVVUkkoKGNvbnN0IHhtbENoYXIgKilVUkkpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAoY29uc3QgeG1sQ2hhciAqKVVSSSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDYXRhbG9nUmVzb2x2ZVVSSSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDYXRhbG9nU2V0RGVmYXVsdFByZWZlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENhdGFsb2dQcmVmZXIgcmV0X3ZhbDsKICAgIHhtbENhdGFsb2dQcmVmZXIgcHJlZmVyOyAvKiB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIGZvciBkZWxlZ2F0aW9uICovCiAgICBpbnQgbl9wcmVmZXI7CgogICAgZm9yIChuX3ByZWZlciA9IDA7bl9wcmVmZXIgPCBnZW5fbmJfeG1sQ2F0YWxvZ1ByZWZlcjtuX3ByZWZlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwcmVmZXIgPSBnZW5feG1sQ2F0YWxvZ1ByZWZlcihuX3ByZWZlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDYXRhbG9nU2V0RGVmYXVsdFByZWZlcihwcmVmZXIpOwogICAgICAgIGRlc3JldF94bWxDYXRhbG9nUHJlZmVyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2F0YWxvZ1ByZWZlcihuX3ByZWZlciwgcHJlZmVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENhdGFsb2dTZXREZWZhdWx0UHJlZmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dTZXREZWZhdWx0cyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENhdGFsb2dBbGxvdyBhbGxvdzsgLyogd2hhdCBjYXRhbG9ncyBzaG91bGQgYmUgYWNjZXB0ZWQgKi8KICAgIGludCBuX2FsbG93OwoKICAgIGZvciAobl9hbGxvdyA9IDA7bl9hbGxvdyA8IGdlbl9uYl94bWxDYXRhbG9nQWxsb3c7bl9hbGxvdysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBhbGxvdyA9IGdlbl94bWxDYXRhbG9nQWxsb3cobl9hbGxvdywgMCk7CgogICAgICAgIHhtbENhdGFsb2dTZXREZWZhdWx0cyhhbGxvdyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDYXRhbG9nQWxsb3cobl9hbGxvdywgYWxsb3csIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2F0YWxvZ1NldERlZmF1bHRzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FsbG93KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29udmVydFNHTUxDYXRhbG9nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDYXRhbG9nUHRyIGNhdGFsOyAvKiB0aGUgY2F0YWxvZyAqLwogICAgaW50IG5fY2F0YWw7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ29udmVydFNHTUxDYXRhbG9nKGNhdGFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCBjYXRhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb252ZXJ0U0dNTENhdGFsb2ciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2F0YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJbml0aWFsaXplQ2F0YWxvZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sSW5pdGlhbGl6ZUNhdGFsb2coKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJbml0aWFsaXplQ2F0YWxvZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExvYWRBQ2F0YWxvZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMb2FkQ2F0YWxvZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiBhIGZpbGUgcGF0aCAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTG9hZENhdGFsb2coZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTG9hZENhdGFsb2dzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKQogICAgY2hhciAqIHBhdGhzczsgLyogYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHNlcGFyYXRlZCBieSBhIGNvbG9uIG9yIGEgc3BhY2UuICovCiAgICBpbnQgbl9wYXRoc3M7CgogICAgZm9yIChuX3BhdGhzcyA9IDA7bl9wYXRoc3MgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9wYXRoc3MrKykgewogICAgICAgIHBhdGhzcyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3BhdGhzcywgMCk7CgogICAgICAgIHhtbExvYWRDYXRhbG9ncygoY29uc3QgY2hhciAqKXBhdGhzcyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3BhdGhzcywgKGNvbnN0IGNoYXIgKilwYXRoc3MsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExvYWRTR01MU3VwZXJDYXRhbG9nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0NhdGFsb2codm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VDYXRhbG9nRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VDYXRhbG9nRmlsZShmaWxlbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlQ2F0YWxvZ0ZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2NhdGFsb2codm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIGNhdGFsb2cgOiAyNyBvZiAzNiBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQUNhdGFsb2dBZGQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQUNhdGFsb2dEdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFDYXRhbG9nUmVtb3ZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFDYXRhbG9nUmVzb2x2ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBQ2F0YWxvZ1Jlc29sdmVQdWJsaWMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQUNhdGFsb2dSZXNvbHZlU3lzdGVtKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFDYXRhbG9nUmVzb2x2ZVVSSSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nQWRkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENhdGFsb2dDbGVhbnVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENhdGFsb2dDb252ZXJ0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENhdGFsb2dEdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENhdGFsb2dHZXREZWZhdWx0cygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nSXNFbXB0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nTG9jYWxSZXNvbHZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENhdGFsb2dMb2NhbFJlc29sdmVVUkkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2F0YWxvZ1JlbW92ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nUmVzb2x2ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nUmVzb2x2ZVB1YmxpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nUmVzb2x2ZVN5c3RlbSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nUmVzb2x2ZVVSSSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nU2V0RGVmYXVsdFByZWZlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nU2V0RGVmYXVsdHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29udmVydFNHTUxDYXRhbG9nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEluaXRpYWxpemVDYXRhbG9nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExvYWRBQ2F0YWxvZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMb2FkQ2F0YWxvZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMb2FkQ2F0YWxvZ3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTG9hZFNHTUxTdXBlckNhdGFsb2coKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3Q2F0YWxvZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZUNhdGFsb2dGaWxlKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBjYXRhbG9nOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbENoUmFuZ2VHcm91cFB0ciAxCnN0YXRpYyB4bWxDaFJhbmdlR3JvdXBQdHIgZ2VuX2NvbnN0X3htbENoUmFuZ2VHcm91cFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY29uc3RfeG1sQ2hSYW5nZUdyb3VwUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaFJhbmdlR3JvdXBQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxDaGFySW5SYW5nZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgaW50IHZhbDsgLyogY2hhcmFjdGVyIHRvIGJlIHZhbGlkYXRlZCAqLwogICAgaW50IG5fdmFsOwogICAgeG1sQ2hSYW5nZUdyb3VwUHRyIHJwdHI7IC8qIHBvaW50ZXIgdG8gcmFuZ2UgdG8gYmUgdXNlZCB0byB2YWxpZGF0ZSAqLwogICAgaW50IG5fcnB0cjsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl92YWwrKykgewogICAgZm9yIChuX3JwdHIgPSAwO25fcnB0ciA8IGdlbl9uYl9jb25zdF94bWxDaFJhbmdlR3JvdXBQdHI7bl9ycHRyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl91bnNpZ25lZF9pbnQobl92YWwsIDApOwogICAgICAgIHJwdHIgPSBnZW5fY29uc3RfeG1sQ2hSYW5nZUdyb3VwUHRyKG5fcnB0ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDaGFySW5SYW5nZSh2YWwsIChjb25zdCB4bWxDaFJhbmdlR3JvdXBQdHIpcnB0cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2ludChuX3ZhbCwgdmFsLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hSYW5nZUdyb3VwUHRyKG5fcnB0ciwgKGNvbnN0IHhtbENoUmFuZ2VHcm91cFB0cilycHRyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoYXJJblJhbmdlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ycHRyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJc0Jhc2VDaGFyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB1bnNpZ25lZCBpbnQgY2g7IC8qIGNoYXJhY3RlciB0byB2YWxpZGF0ZSAqLwogICAgaW50IG5fY2g7CgogICAgZm9yIChuX2NoID0gMDtuX2NoIDwgZ2VuX25iX3Vuc2lnbmVkX2ludDtuX2NoKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNoID0gZ2VuX3Vuc2lnbmVkX2ludChuX2NoLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzQmFzZUNoYXIoY2gpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9pbnQobl9jaCwgY2gsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSXNCYXNlQ2hhciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jaCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNCbGFuayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgaW50IGNoOyAvKiBjaGFyYWN0ZXIgdG8gdmFsaWRhdGUgKi8KICAgIGludCBuX2NoOwoKICAgIGZvciAobl9jaCA9IDA7bl9jaCA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl9jaCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjaCA9IGdlbl91bnNpZ25lZF9pbnQobl9jaCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJc0JsYW5rKGNoKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdW5zaWduZWRfaW50KG5fY2gsIGNoLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzQmxhbmsiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2gpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElzQ2hhcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgaW50IGNoOyAvKiBjaGFyYWN0ZXIgdG8gdmFsaWRhdGUgKi8KICAgIGludCBuX2NoOwoKICAgIGZvciAobl9jaCA9IDA7bl9jaCA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl9jaCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjaCA9IGdlbl91bnNpZ25lZF9pbnQobl9jaCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJc0NoYXIoY2gpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9pbnQobl9jaCwgY2gsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSXNDaGFyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJc0NvbWJpbmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgaW50IGNoOyAvKiBjaGFyYWN0ZXIgdG8gdmFsaWRhdGUgKi8KICAgIGludCBuX2NoOwoKICAgIGZvciAobl9jaCA9IDA7bl9jaCA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl9jaCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjaCA9IGdlbl91bnNpZ25lZF9pbnQobl9jaCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJc0NvbWJpbmluZyhjaCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2ludChuX2NoLCBjaCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJc0NvbWJpbmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jaCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNEaWdpdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgaW50IGNoOyAvKiBjaGFyYWN0ZXIgdG8gdmFsaWRhdGUgKi8KICAgIGludCBuX2NoOwoKICAgIGZvciAobl9jaCA9IDA7bl9jaCA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl9jaCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjaCA9IGdlbl91bnNpZ25lZF9pbnQobl9jaCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJc0RpZ2l0KGNoKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdW5zaWduZWRfaW50KG5fY2gsIGNoLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzRGlnaXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2gpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElzRXh0ZW5kZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGludCBjaDsgLyogY2hhcmFjdGVyIHRvIHZhbGlkYXRlICovCiAgICBpbnQgbl9jaDsKCiAgICBmb3IgKG5fY2ggPSAwO25fY2ggPCBnZW5fbmJfdW5zaWduZWRfaW50O25fY2grKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY2ggPSBnZW5fdW5zaWduZWRfaW50KG5fY2gsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSXNFeHRlbmRlcihjaCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2ludChuX2NoLCBjaCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJc0V4dGVuZGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJc0lkZW9ncmFwaGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB1bnNpZ25lZCBpbnQgY2g7IC8qIGNoYXJhY3RlciB0byB2YWxpZGF0ZSAqLwogICAgaW50IG5fY2g7CgogICAgZm9yIChuX2NoID0gMDtuX2NoIDwgZ2VuX25iX3Vuc2lnbmVkX2ludDtuX2NoKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNoID0gZ2VuX3Vuc2lnbmVkX2ludChuX2NoLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzSWRlb2dyYXBoaWMoY2gpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9pbnQobl9jaCwgY2gsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSXNJZGVvZ3JhcGhpYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jaCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNQdWJpZENoYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGludCBjaDsgLyogY2hhcmFjdGVyIHRvIHZhbGlkYXRlICovCiAgICBpbnQgbl9jaDsKCiAgICBmb3IgKG5fY2ggPSAwO25fY2ggPCBnZW5fbmJfdW5zaWduZWRfaW50O25fY2grKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY2ggPSBnZW5fdW5zaWduZWRfaW50KG5fY2gsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSXNQdWJpZENoYXIoY2gpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9pbnQobl9jaCwgY2gsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSXNQdWJpZENoYXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2gpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfY2h2YWxpZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgY2h2YWxpZCA6IDkgb2YgOSBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2hhckluUmFuZ2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSXNCYXNlQ2hhcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJc0JsYW5rKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElzQ2hhcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJc0NvbWJpbmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJc0RpZ2l0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElzRXh0ZW5kZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSXNJZGVvZ3JhcGhpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJc1B1YmlkQ2hhcigpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgY2h2YWxpZDogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sQm9vbFRvVGV4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCBjaGFyICogcmV0X3ZhbDsKICAgIGludCBib29sdmFsOyAvKiBhIGJvb2wgdG8gdHVybiBpbnRvIHRleHQgKi8KICAgIGludCBuX2Jvb2x2YWw7CgogICAgZm9yIChuX2Jvb2x2YWwgPSAwO25fYm9vbHZhbCA8IGdlbl9uYl9pbnQ7bl9ib29sdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJvb2x2YWwgPSBnZW5faW50KG5fYm9vbHZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxCb29sVG9UZXh0KGJvb2x2YWwpOwogICAgICAgIGRlc3JldF9jb25zdF9jaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2Jvb2x2YWwsIGJvb2x2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQm9vbFRvVGV4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ib29sdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGVidWdDaGVja0RvY3VtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIEZJTEUgKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfZGVidWdfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dHB1dCA9IGdlbl9kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxEZWJ1Z0NoZWNrRG9jdW1lbnQob3V0cHV0LCBkb2MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGVidWdDaGVja0RvY3VtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEZWJ1Z0R1bXBBdHRyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbEF0dHJQdHIgYXR0cjsgLyogdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fYXR0cjsKICAgIGludCBkZXB0aDsgLyogdGhlIGluZGVudGF0aW9uIGxldmVsLiAqLwogICAgaW50IG5fZGVwdGg7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfZGVidWdfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX2F0dHIgPSAwO25fYXR0ciA8IGdlbl9uYl94bWxBdHRyUHRyO25fYXR0cisrKSB7CiAgICBmb3IgKG5fZGVwdGggPSAwO25fZGVwdGggPCBnZW5fbmJfaW50O25fZGVwdGgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBhdHRyID0gZ2VuX3htbEF0dHJQdHIobl9hdHRyLCAxKTsKICAgICAgICBkZXB0aCA9IGdlbl9pbnQobl9kZXB0aCwgMik7CgogICAgICAgIHhtbERlYnVnRHVtcEF0dHIob3V0cHV0LCBhdHRyLCBkZXB0aCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sQXR0clB0cihuX2F0dHIsIGF0dHIsIDEpOwogICAgICAgIGRlc19pbnQobl9kZXB0aCwgZGVwdGgsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGVidWdEdW1wQXR0ciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZXB0aCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERlYnVnRHVtcEF0dHJMaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbEF0dHJQdHIgYXR0cjsgLyogdGhlIGF0dHJpYnV0ZSBsaXN0ICovCiAgICBpbnQgbl9hdHRyOwogICAgaW50IGRlcHRoOyAvKiB0aGUgaW5kZW50YXRpb24gbGV2ZWwuICovCiAgICBpbnQgbl9kZXB0aDsKCiAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9kZWJ1Z19GSUxFX3B0cjtuX291dHB1dCsrKSB7CiAgICBmb3IgKG5fYXR0ciA9IDA7bl9hdHRyIDwgZ2VuX25iX3htbEF0dHJQdHI7bl9hdHRyKyspIHsKICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIGF0dHIgPSBnZW5feG1sQXR0clB0cihuX2F0dHIsIDEpOwogICAgICAgIGRlcHRoID0gZ2VuX2ludChuX2RlcHRoLCAyKTsKCiAgICAgICAgeG1sRGVidWdEdW1wQXR0ckxpc3Qob3V0cHV0LCBhdHRyLCBkZXB0aCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sQXR0clB0cihuX2F0dHIsIGF0dHIsIDEpOwogICAgICAgIGRlc19pbnQobl9kZXB0aCwgZGVwdGgsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGVidWdEdW1wQXR0ckxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2F0dHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVwdGgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEZWJ1Z0R1bXBEVEQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIEZJTEUgKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sRHRkUHRyIGR0ZDsgLyogdGhlIERURCAqLwogICAgaW50IG5fZHRkOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX2RlYnVnX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9kdGQgPSAwO25fZHRkIDwgZ2VuX25iX3htbER0ZFB0cjtuX2R0ZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIGR0ZCA9IGdlbl94bWxEdGRQdHIobl9kdGQsIDEpOwoKICAgICAgICB4bWxEZWJ1Z0R1bXBEVEQob3V0cHV0LCBkdGQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX3htbER0ZFB0cihuX2R0ZCwgZHRkLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERlYnVnRHVtcERURCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZHRkKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGVidWdEdW1wRG9jdW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIEZJTEUgKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfZGVidWdfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dHB1dCA9IGdlbl9kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CgogICAgICAgIHhtbERlYnVnRHVtcERvY3VtZW50KG91dHB1dCwgZG9jKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEZWJ1Z0R1bXBEb2N1bWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGVidWdEdW1wRG9jdW1lbnRIZWFkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX2RlYnVnX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwoKICAgICAgICB4bWxEZWJ1Z0R1bXBEb2N1bWVudEhlYWQob3V0cHV0LCBkb2MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERlYnVnRHVtcERvY3VtZW50SGVhZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGVidWdEdW1wRW50aXRpZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIEZJTEUgKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfZGVidWdfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dHB1dCA9IGdlbl9kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CgogICAgICAgIHhtbERlYnVnRHVtcEVudGl0aWVzKG91dHB1dCwgZG9jKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEZWJ1Z0R1bXBFbnRpdGllcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGVidWdEdW1wTm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0cHV0OyAvKiB0aGUgRklMRSAqIGZvciB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl9vdXRwdXQ7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgaW50IGRlcHRoOyAvKiB0aGUgaW5kZW50YXRpb24gbGV2ZWwuICovCiAgICBpbnQgbl9kZXB0aDsKCiAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9kZWJ1Z19GSUxFX3B0cjtuX291dHB1dCsrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDEpOwogICAgICAgIGRlcHRoID0gZ2VuX2ludChuX2RlcHRoLCAyKTsKCiAgICAgICAgeG1sRGVidWdEdW1wTm9kZShvdXRwdXQsIG5vZGUsIGRlcHRoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CiAgICAgICAgZGVzX2ludChuX2RlcHRoLCBkZXB0aCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEZWJ1Z0R1bXBOb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlcHRoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGVidWdEdW1wTm9kZUxpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIEZJTEUgKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSBsaXN0ICovCiAgICBpbnQgbl9ub2RlOwogICAgaW50IGRlcHRoOyAvKiB0aGUgaW5kZW50YXRpb24gbGV2ZWwuICovCiAgICBpbnQgbl9kZXB0aDsKCiAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9kZWJ1Z19GSUxFX3B0cjtuX291dHB1dCsrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDEpOwogICAgICAgIGRlcHRoID0gZ2VuX2ludChuX2RlcHRoLCAyKTsKCiAgICAgICAgeG1sRGVidWdEdW1wTm9kZUxpc3Qob3V0cHV0LCBub2RlLCBkZXB0aCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOwogICAgICAgIGRlc19pbnQobl9kZXB0aCwgZGVwdGgsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGVidWdEdW1wTm9kZUxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVwdGgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEZWJ1Z0R1bXBPbmVOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICBpbnQgZGVwdGg7IC8qIHRoZSBpbmRlbnRhdGlvbiBsZXZlbC4gKi8KICAgIGludCBuX2RlcHRoOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX2RlYnVnX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX2RlcHRoID0gMDtuX2RlcHRoIDwgZ2VuX25iX2ludDtuX2RlcHRoKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dHB1dCA9IGdlbl9kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgMCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CiAgICAgICAgZGVwdGggPSBnZW5faW50KG5fZGVwdGgsIDIpOwoKICAgICAgICB4bWxEZWJ1Z0R1bXBPbmVOb2RlKG91dHB1dCwgbm9kZSwgZGVwdGgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKICAgICAgICBkZXNfaW50KG5fZGVwdGgsIGRlcHRoLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERlYnVnRHVtcE9uZU5vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVwdGgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEZWJ1Z0R1bXBTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIEZJTEUgKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHN0cmluZyAqLwogICAgaW50IG5fc3RyOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX2RlYnVnX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dHB1dCA9IGdlbl9kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAxKTsKCiAgICAgICAgeG1sRGVidWdEdW1wU3RyaW5nKG91dHB1dCwgKGNvbnN0IHhtbENoYXIgKilzdHIpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEZWJ1Z0R1bXBTdHJpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExzQ291bnROb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSB0byBjb3VudCAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTHNDb3VudE5vZGUobm9kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExzQ291bnROb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMc09uZU5vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIEZJTEUgKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSB0byBkdW1wICovCiAgICBpbnQgbl9ub2RlOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX2RlYnVnX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKCiAgICAgICAgeG1sTHNPbmVOb2RlKG91dHB1dCwgbm9kZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTHNPbmVOb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl9jaGFyX3B0ciAxCnN0YXRpYyBjaGFyICogZ2VuX2NoYXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19jaGFyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgY2hhciAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sU2hlbGwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2hlbGxCYXNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2hlbGxDdHh0UHRyIGN0eHQ7IC8qIHRoZSBzaGVsbCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIGFyZzsgLyogdW51c2VkICovCiAgICBpbnQgbl9hcmc7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbE5vZGVQdHIgbm9kZTI7IC8qIHVudXNlZCAqLwogICAgaW50IG5fbm9kZTI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTaGVsbEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9hcmcgPSAwO25fYXJnIDwgZ2VuX25iX2NoYXJfcHRyO25fYXJnKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25vZGUyID0gMDtuX25vZGUyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGFyZyA9IGdlbl9jaGFyX3B0cihuX2FyZywgMSk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMik7CiAgICAgICAgbm9kZTIgPSBnZW5feG1sTm9kZVB0cihuX25vZGUyLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNoZWxsQmFzZShjdHh0LCBhcmcsIG5vZGUsIG5vZGUyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NoYXJfcHRyKG5fYXJnLCBhcmcsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMik7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlMiwgbm9kZTIsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2hlbGxCYXNlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXJnKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTaGVsbENhdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTaGVsbEN0eHRQdHIgY3R4dDsgLyogdGhlIHNoZWxsIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogYXJnOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX2FyZzsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTm9kZVB0ciBub2RlMjsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlMjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNoZWxsQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2FyZyA9IDA7bl9hcmcgPCBnZW5fbmJfY2hhcl9wdHI7bl9hcmcrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbm9kZTIgPSAwO25fbm9kZTIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgYXJnID0gZ2VuX2NoYXJfcHRyKG5fYXJnLCAxKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAyKTsKICAgICAgICBub2RlMiA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZTIsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2hlbGxDYXQoY3R4dCwgYXJnLCBub2RlLCBub2RlMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jaGFyX3B0cihuX2FyZywgYXJnLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDIpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNoZWxsQ2F0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXJnKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTaGVsbERpcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNoZWxsQ3R4dFB0ciBjdHh0OyAvKiB0aGUgc2hlbGwgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBhcmc7IC8qIHVudXNlZCAqLwogICAgaW50IG5fYXJnOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxOb2RlUHRyIG5vZGUyOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX25vZGUyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2hlbGxDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fYXJnID0gMDtuX2FyZyA8IGdlbl9uYl9jaGFyX3B0cjtuX2FyZysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ub2RlMiA9IDA7bl9ub2RlMiA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZTIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTaGVsbEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBhcmcgPSBnZW5fY2hhcl9wdHIobl9hcmcsIDEpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDIpOwogICAgICAgIG5vZGUyID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlMiwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxTaGVsbERpcihjdHh0LCBhcmcsIG5vZGUsIG5vZGUyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NoYXJfcHRyKG5fYXJnLCBhcmcsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMik7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlMiwgbm9kZTIsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2hlbGxEaXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hcmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNoZWxsRHUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTaGVsbEN0eHRQdHIgY3R4dDsgLyogdGhlIHNoZWxsIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogYXJnOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX2FyZzsKICAgIHhtbE5vZGVQdHIgdHJlZTsgLyogYSBub2RlIGRlZmluaW5nIGEgc3VidHJlZSAqLwogICAgaW50IG5fdHJlZTsKICAgIHhtbE5vZGVQdHIgbm9kZTI7IC8qIHVudXNlZCAqLwogICAgaW50IG5fbm9kZTI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTaGVsbEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9hcmcgPSAwO25fYXJnIDwgZ2VuX25iX2NoYXJfcHRyO25fYXJnKyspIHsKICAgIGZvciAobl90cmVlID0gMDtuX3RyZWUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3RyZWUrKykgewogICAgZm9yIChuX25vZGUyID0gMDtuX25vZGUyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGFyZyA9IGdlbl9jaGFyX3B0cihuX2FyZywgMSk7CiAgICAgICAgdHJlZSA9IGdlbl94bWxOb2RlUHRyKG5fdHJlZSwgMik7CiAgICAgICAgbm9kZTIgPSBnZW5feG1sTm9kZVB0cihuX25vZGUyLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNoZWxsRHUoY3R4dCwgYXJnLCB0cmVlLCBub2RlMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jaGFyX3B0cihuX2FyZywgYXJnLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3RyZWUsIHRyZWUsIDIpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNoZWxsRHUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hcmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHJlZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNoZWxsTGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNoZWxsQ3R4dFB0ciBjdHh0OyAvKiB0aGUgc2hlbGwgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBhcmc7IC8qIHVudXNlZCAqLwogICAgaW50IG5fYXJnOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxOb2RlUHRyIG5vZGUyOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX25vZGUyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2hlbGxDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fYXJnID0gMDtuX2FyZyA8IGdlbl9uYl9jaGFyX3B0cjtuX2FyZysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ub2RlMiA9IDA7bl9ub2RlMiA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZTIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTaGVsbEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBhcmcgPSBnZW5fY2hhcl9wdHIobl9hcmcsIDEpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDIpOwogICAgICAgIG5vZGUyID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlMiwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxTaGVsbExpc3QoY3R4dCwgYXJnLCBub2RlLCBub2RlMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jaGFyX3B0cihuX2FyZywgYXJnLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDIpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNoZWxsTGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FyZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2hlbGxMb2FkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2hlbGxDdHh0UHRyIGN0eHQ7IC8qIHRoZSBzaGVsbCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZSBuYW1lICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTm9kZVB0ciBub2RlMjsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlMjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNoZWxsQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2NoYXJfcHRyO25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbm9kZTIgPSAwO25fbm9kZTIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fY2hhcl9wdHIobl9maWxlbmFtZSwgMSk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMik7CiAgICAgICAgbm9kZTIgPSBnZW5feG1sTm9kZVB0cihuX25vZGUyLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNoZWxsTG9hZChjdHh0LCBmaWxlbmFtZSwgbm9kZSwgbm9kZTIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTaGVsbEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHIobl9maWxlbmFtZSwgZmlsZW5hbWUsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMik7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlMiwgbm9kZTIsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2hlbGxMb2FkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNoZWxsUHJpbnRYUGF0aFJlc3VsdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciBsaXN0OyAvKiBhIHZhbGlkIHJlc3VsdCBnZW5lcmF0ZWQgYnkgYW4geHBhdGggZXZhbHVhdGlvbiAqLwogICAgaW50IG5fbGlzdDsKCiAgICBmb3IgKG5fbGlzdCA9IDA7bl9saXN0IDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fbGlzdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsaXN0ID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fbGlzdCwgMCk7CgogICAgICAgIHhtbFNoZWxsUHJpbnRYUGF0aFJlc3VsdChsaXN0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fbGlzdCwgbGlzdCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTaGVsbFByaW50WFBhdGhSZXN1bHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGlzdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNoZWxsUHdkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2hlbGxDdHh0UHRyIGN0eHQ7IC8qIHRoZSBzaGVsbCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIGJ1ZmZlcjsgLyogdGhlIG91dHB1dCBidWZmZXIgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTm9kZVB0ciBub2RlMjsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlMjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNoZWxsQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbm9kZTIgPSAwO25fbm9kZTIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NoYXJfcHRyKG5fYnVmZmVyLCAxKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAyKTsKICAgICAgICBub2RlMiA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZTIsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2hlbGxQd2QoY3R4dCwgYnVmZmVyLCBub2RlLCBub2RlMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jaGFyX3B0cihuX2J1ZmZlciwgYnVmZmVyLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDIpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNoZWxsUHdkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTaGVsbFNhdmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2hlbGxDdHh0UHRyIGN0eHQ7IC8qIHRoZSBzaGVsbCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZSBuYW1lIChvcHRpb25hbCkgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxOb2RlUHRyIG5vZGUyOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX25vZGUyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2hlbGxDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfY2hhcl9wdHI7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ub2RlMiA9IDA7bl9ub2RlMiA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZTIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTaGVsbEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9jaGFyX3B0cihuX2ZpbGVuYW1lLCAxKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAyKTsKICAgICAgICBub2RlMiA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZTIsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2hlbGxTYXZlKGN0eHQsIGZpbGVuYW1lLCBub2RlLCBub2RlMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jaGFyX3B0cihuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAyKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUyLCBub2RlMiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTaGVsbFNhdmUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2hlbGxWYWxpZGF0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNoZWxsQ3R4dFB0ciBjdHh0OyAvKiB0aGUgc2hlbGwgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBkdGQ7IC8qIHRoZSBEVEQgVVJJIChvcHRpb25hbCkgKi8KICAgIGludCBuX2R0ZDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTm9kZVB0ciBub2RlMjsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlMjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNoZWxsQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2R0ZCA9IDA7bl9kdGQgPCBnZW5fbmJfY2hhcl9wdHI7bl9kdGQrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbm9kZTIgPSAwO25fbm9kZTIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZHRkID0gZ2VuX2NoYXJfcHRyKG5fZHRkLCAxKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAyKTsKICAgICAgICBub2RlMiA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZTIsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2hlbGxWYWxpZGF0ZShjdHh0LCBkdGQsIG5vZGUsIG5vZGUyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NoYXJfcHRyKG5fZHRkLCBkdGQsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMik7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlMiwgbm9kZTIsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2hlbGxWYWxpZGF0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2R0ZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2hlbGxXcml0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTaGVsbEN0eHRQdHIgY3R4dDsgLyogdGhlIHNoZWxsIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlIG5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgaW4gdGhlIHRyZWUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxOb2RlUHRyIG5vZGUyOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX25vZGUyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2hlbGxDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfY2hhcl9wdHI7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ub2RlMiA9IDA7bl9ub2RlMiA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZTIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTaGVsbEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9jaGFyX3B0cihuX2ZpbGVuYW1lLCAxKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAyKTsKICAgICAgICBub2RlMiA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZTIsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2hlbGxXcml0ZShjdHh0LCBmaWxlbmFtZSwgbm9kZSwgbm9kZTIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTaGVsbEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHIobl9maWxlbmFtZSwgZmlsZW5hbWUsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMik7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlMiwgbm9kZTIsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2hlbGxXcml0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2RlYnVnWE1MKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBkZWJ1Z1hNTCA6IDI1IG9mIDI4IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxCb29sVG9UZXh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERlYnVnQ2hlY2tEb2N1bWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEZWJ1Z0R1bXBBdHRyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERlYnVnRHVtcEF0dHJMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERlYnVnRHVtcERURCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEZWJ1Z0R1bXBEb2N1bWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEZWJ1Z0R1bXBEb2N1bWVudEhlYWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGVidWdEdW1wRW50aXRpZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGVidWdEdW1wTm9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEZWJ1Z0R1bXBOb2RlTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEZWJ1Z0R1bXBPbmVOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERlYnVnRHVtcFN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMc0NvdW50Tm9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMc09uZU5vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2hlbGwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2hlbGxCYXNlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsQ2F0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsRGlyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsRHUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2hlbGxMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsTG9hZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTaGVsbFByaW50WFBhdGhSZXN1bHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2hlbGxQd2QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2hlbGxTYXZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsVmFsaWRhdGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2hlbGxXcml0ZSgpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgZGVidWdYTUw6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbERpY3RDbGVhbnVwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICB4bWxEaWN0Q2xlYW51cCgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERpY3RDbGVhbnVwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEaWN0Q3JlYXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRGljdFB0ciByZXRfdmFsOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICByZXRfdmFsID0geG1sRGljdENyZWF0ZSgpOwogICAgICAgIGRlc3JldF94bWxEaWN0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERpY3RDcmVhdGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERpY3RDcmVhdGVTdWIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEaWN0UHRyIHJldF92YWw7CiAgICB4bWxEaWN0UHRyIHN1YjsgLyogYW4gZXhpc3RpbmcgZGljdGlvbm5hcnkgKi8KICAgIGludCBuX3N1YjsKCiAgICBmb3IgKG5fc3ViID0gMDtuX3N1YiA8IGdlbl9uYl94bWxEaWN0UHRyO25fc3ViKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN1YiA9IGdlbl94bWxEaWN0UHRyKG5fc3ViLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERpY3RDcmVhdGVTdWIoc3ViKTsKICAgICAgICBkZXNyZXRfeG1sRGljdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERpY3RQdHIobl9zdWIsIHN1YiwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEaWN0Q3JlYXRlU3ViIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N1Yik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGljdEV4aXN0cyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sRGljdFB0ciBkaWN0OyAvKiB0aGUgZGljdGlvbm5hcnkgKi8KICAgIGludCBuX2RpY3Q7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwogICAgaW50IGxlbjsgLyogdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSwgaWYgLTEgaXQgaXMgcmVjb21wdXRlZCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9kaWN0ID0gMDtuX2RpY3QgPCBnZW5fbmJfeG1sRGljdFB0cjtuX2RpY3QrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRpY3QgPSBnZW5feG1sRGljdFB0cihuX2RpY3QsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERpY3RFeGlzdHMoZGljdCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCBsZW4pOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERpY3RQdHIobl9kaWN0LCBkaWN0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEaWN0RXhpc3RzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RpY3QpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERpY3RMb29rdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbERpY3RQdHIgZGljdDsgLyogdGhlIGRpY3Rpb25uYXJ5ICovCiAgICBpbnQgbl9kaWN0OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTsKICAgIGludCBsZW47IC8qIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUsIGlmIC0xIGl0IGlzIHJlY29tcHV0ZWQgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fZGljdCA9IDA7bl9kaWN0IDwgZ2VuX25iX3htbERpY3RQdHI7bl9kaWN0KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkaWN0ID0gZ2VuX3htbERpY3RQdHIobl9kaWN0LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxEaWN0TG9va3VwKGRpY3QsIChjb25zdCB4bWxDaGFyICopbmFtZSwgbGVuKTsKICAgICAgICBkZXNyZXRfY29uc3RfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEaWN0UHRyKG5fZGljdCwgZGljdCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGljdExvb2t1cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kaWN0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEaWN0T3ducyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRGljdFB0ciBkaWN0OyAvKiB0aGUgZGljdGlvbm5hcnkgKi8KICAgIGludCBuX2RpY3Q7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgc3RyaW5nICovCiAgICBpbnQgbl9zdHI7CgogICAgZm9yIChuX2RpY3QgPSAwO25fZGljdCA8IGdlbl9uYl94bWxEaWN0UHRyO25fZGljdCsrKSB7CiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkaWN0ID0gZ2VuX3htbERpY3RQdHIobl9kaWN0LCAwKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sRGljdE93bnMoZGljdCwgKGNvbnN0IHhtbENoYXIgKilzdHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEaWN0UHRyKG5fZGljdCwgZGljdCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEaWN0T3ducyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kaWN0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGljdFFMb29rdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbERpY3RQdHIgZGljdDsgLyogdGhlIGRpY3Rpb25uYXJ5ICovCiAgICBpbnQgbl9kaWN0OwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCAqLwogICAgaW50IG5fcHJlZml4OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9kaWN0ID0gMDtuX2RpY3QgPCBnZW5fbmJfeG1sRGljdFB0cjtuX2RpY3QrKykgewogICAgZm9yIChuX3ByZWZpeCA9IDA7bl9wcmVmaXggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wcmVmaXgrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZGljdCA9IGdlbl94bWxEaWN0UHRyKG5fZGljdCwgMCk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxEaWN0UUxvb2t1cChkaWN0LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfY29uc3RfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEaWN0UHRyKG5fZGljdCwgZGljdCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERpY3RRTG9va3VwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RpY3QpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERpY3RSZWZlcmVuY2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERpY3RQdHIgZGljdDsgLyogdGhlIGRpY3Rpb25uYXJ5ICovCiAgICBpbnQgbl9kaWN0OwoKICAgIGZvciAobl9kaWN0ID0gMDtuX2RpY3QgPCBnZW5fbmJfeG1sRGljdFB0cjtuX2RpY3QrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZGljdCA9IGdlbl94bWxEaWN0UHRyKG5fZGljdCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxEaWN0UmVmZXJlbmNlKGRpY3QpOwogICAgICAgIHhtbERpY3RGcmVlKGRpY3QpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEaWN0UHRyKG5fZGljdCwgZGljdCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEaWN0UmVmZXJlbmNlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RpY3QpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERpY3RTaXplKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxEaWN0UHRyIGRpY3Q7IC8qIHRoZSBkaWN0aW9ubmFyeSAqLwogICAgaW50IG5fZGljdDsKCiAgICBmb3IgKG5fZGljdCA9IDA7bl9kaWN0IDwgZ2VuX25iX3htbERpY3RQdHI7bl9kaWN0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRpY3QgPSBnZW5feG1sRGljdFB0cihuX2RpY3QsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sRGljdFNpemUoZGljdCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERpY3RQdHIobl9kaWN0LCBkaWN0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERpY3RTaXplIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RpY3QpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfZGljdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgZGljdCA6IDkgb2YgMTAgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERpY3RDbGVhbnVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERpY3RDcmVhdGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGljdENyZWF0ZVN1YigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEaWN0RXhpc3RzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERpY3RMb29rdXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGljdE93bnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGljdFFMb29rdXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGljdFJlZmVyZW5jZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEaWN0U2l6ZSgpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgZGljdDogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfVVRGOFRvaXNvbGF0MSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQojaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGNoYXIgKiBvdXQ7IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgcmVzdWx0ICovCiAgICBpbnQgbl9vdXQ7CiAgICBpbnQgKiBvdXRsZW47IC8qIHRoZSBsZW5ndGggb2YgQG91dCAqLwogICAgaW50IG5fb3V0bGVuOwogICAgdW5zaWduZWQgY2hhciAqIGluOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgVVRGLTggY2hhcnMgKi8KICAgIGludCBuX2luOwogICAgaW50ICogaW5sZW47IC8qIHRoZSBsZW5ndGggb2YgQGluICovCiAgICBpbnQgbl9pbmxlbjsKCiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl91bnNpZ25lZF9jaGFyX3B0cjtuX291dCsrKSB7CiAgICBmb3IgKG5fb3V0bGVuID0gMDtuX291dGxlbiA8IGdlbl9uYl9pbnRfcHRyO25fb3V0bGVuKyspIHsKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cjtuX2luKyspIHsKICAgIGZvciAobl9pbmxlbiA9IDA7bl9pbmxlbiA8IGdlbl9uYl9pbnRfcHRyO25faW5sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0ID0gZ2VuX3Vuc2lnbmVkX2NoYXJfcHRyKG5fb3V0LCAwKTsKICAgICAgICBvdXRsZW4gPSBnZW5faW50X3B0cihuX291dGxlbiwgMSk7CiAgICAgICAgaW4gPSBnZW5fY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgMik7CiAgICAgICAgaW5sZW4gPSBnZW5faW50X3B0cihuX2lubGVuLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IFVURjhUb2lzb2xhdDEob3V0LCBvdXRsZW4sIChjb25zdCB1bnNpZ25lZCBjaGFyICopaW4sIGlubGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdW5zaWduZWRfY2hhcl9wdHIobl9vdXQsIG91dCwgMCk7CiAgICAgICAgZGVzX2ludF9wdHIobl9vdXRsZW4sIG91dGxlbiwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5faW4sIChjb25zdCB1bnNpZ25lZCBjaGFyICopaW4sIDIpOwogICAgICAgIGRlc19pbnRfcHRyKG5faW5sZW4sIGlubGVuLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIFVURjhUb2lzb2xhdDEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dGxlbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbmxlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9pc29sYXQxVG9VVEY4KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB1bnNpZ25lZCBjaGFyICogb3V0OyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIHJlc3VsdCAqLwogICAgaW50IG5fb3V0OwogICAgaW50ICogb3V0bGVuOyAvKiB0aGUgbGVuZ3RoIG9mIEBvdXQgKi8KICAgIGludCBuX291dGxlbjsKICAgIHVuc2lnbmVkIGNoYXIgKiBpbjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIElTTyBMYXRpbiAxIGNoYXJzICovCiAgICBpbnQgbl9pbjsKICAgIGludCAqIGlubGVuOyAvKiB0aGUgbGVuZ3RoIG9mIEBpbiAqLwogICAgaW50IG5faW5sZW47CgogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfdW5zaWduZWRfY2hhcl9wdHI7bl9vdXQrKykgewogICAgZm9yIChuX291dGxlbiA9IDA7bl9vdXRsZW4gPCBnZW5fbmJfaW50X3B0cjtuX291dGxlbisrKSB7CiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHI7bl9pbisrKSB7CiAgICBmb3IgKG5faW5sZW4gPSAwO25faW5sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2lubGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dCA9IGdlbl91bnNpZ25lZF9jaGFyX3B0cihuX291dCwgMCk7CiAgICAgICAgb3V0bGVuID0gZ2VuX2ludF9wdHIobl9vdXRsZW4sIDEpOwogICAgICAgIGluID0gZ2VuX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5faW4sIDIpOwogICAgICAgIGlubGVuID0gZ2VuX2ludF9wdHIobl9pbmxlbiwgMyk7CgogICAgICAgIHJldF92YWwgPSBpc29sYXQxVG9VVEY4KG91dCwgb3V0bGVuLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWluLCBpbmxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2NoYXJfcHRyKG5fb3V0LCBvdXQsIDApOwogICAgICAgIGRlc19pbnRfcHRyKG5fb3V0bGVuLCBvdXRsZW4sIDEpOwogICAgICAgIGRlc19jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX2luLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWluLCAyKTsKICAgICAgICBkZXNfaW50X3B0cihuX2lubGVuLCBpbmxlbiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBpc29sYXQxVG9VVEY4IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRsZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFkZEVuY29kaW5nQWxpYXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgcmV0X3ZhbDsKICAgIGNoYXIgKiBuYW1lOyAvKiB0aGUgZW5jb2RpbmcgbmFtZSBhcyBwYXJzZWQsIGluIFVURi04IGZvcm1hdCAoQVNDSUkgYWN0dWFsbHkpICovCiAgICBpbnQgbl9uYW1lOwogICAgY2hhciAqIGFsaWFzOyAvKiB0aGUgYWxpYXMgbmFtZSBhcyBwYXJzZWQsIGluIFVURi04IGZvcm1hdCAoQVNDSUkgYWN0dWFsbHkpICovCiAgICBpbnQgbl9hbGlhczsKCiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fYWxpYXMgPSAwO25fYWxpYXMgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9hbGlhcysrKSB7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF9jaGFyX3B0cihuX25hbWUsIDApOwogICAgICAgIGFsaWFzID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYWxpYXMsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQWRkRW5jb2RpbmdBbGlhcygoY29uc3QgY2hhciAqKW5hbWUsIChjb25zdCBjaGFyICopYWxpYXMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX25hbWUsIChjb25zdCBjaGFyICopbmFtZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYWxpYXMsIChjb25zdCBjaGFyICopYWxpYXMsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0ciAxCnN0YXRpYyB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyICogZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2hhckVuY29kaW5nSGFuZGxlciAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sQ2hhckVuY0Nsb3NlRnVuYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhckVuY29kaW5nSGFuZGxlciAqIGhhbmRsZXI7IC8qIGNoYXIgZW5jb25kaW5nIHRyYW5zZm9ybWF0aW9uIGRhdGEgc3RydWN0dXJlICovCiAgICBpbnQgbl9oYW5kbGVyOwoKICAgIGZvciAobl9oYW5kbGVyID0gMDtuX2hhbmRsZXIgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHI7bl9oYW5kbGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGhhbmRsZXIgPSBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIobl9oYW5kbGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENoYXJFbmNDbG9zZUZ1bmMoaGFuZGxlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyKG5faGFuZGxlciwgaGFuZGxlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDaGFyRW5jQ2xvc2VGdW5jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hhbmRsZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENoYXJFbmNGaXJzdExpbmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXIgKiBoYW5kbGVyOyAvKiBjaGFyIGVuY29uZGluZyB0cmFuc2Zvcm1hdGlvbiBkYXRhIHN0cnVjdHVyZSAqLwogICAgaW50IG5faGFuZGxlcjsKICAgIHhtbEJ1ZmZlclB0ciBvdXQ7IC8qIGFuIHhtbEJ1ZmZlciBmb3IgdGhlIG91dHB1dC4gKi8KICAgIGludCBuX291dDsKICAgIHhtbEJ1ZmZlclB0ciBpbjsgLyogYW4geG1sQnVmZmVyIGZvciB0aGUgaW5wdXQgKi8KICAgIGludCBuX2luOwoKICAgIGZvciAobl9oYW5kbGVyID0gMDtuX2hhbmRsZXIgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHI7bl9oYW5kbGVyKyspIHsKICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX291dCsrKSB7CiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25faW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgaGFuZGxlciA9IGdlbl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihuX2hhbmRsZXIsIDApOwogICAgICAgIG91dCA9IGdlbl94bWxCdWZmZXJQdHIobl9vdXQsIDEpOwogICAgICAgIGluID0gZ2VuX3htbEJ1ZmZlclB0cihuX2luLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENoYXJFbmNGaXJzdExpbmUoaGFuZGxlciwgb3V0LCBpbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyKG5faGFuZGxlciwgaGFuZGxlciwgMCk7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX291dCwgb3V0LCAxKTsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5faW4sIGluLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoYXJFbmNGaXJzdExpbmUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faGFuZGxlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENoYXJFbmNJbkZ1bmModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXIgKiBoYW5kbGVyOyAvKiBjaGFyIGVuY29kaW5nIHRyYW5zZm9ybWF0aW9uIGRhdGEgc3RydWN0dXJlICovCiAgICBpbnQgbl9oYW5kbGVyOwogICAgeG1sQnVmZmVyUHRyIG91dDsgLyogYW4geG1sQnVmZmVyIGZvciB0aGUgb3V0cHV0LiAqLwogICAgaW50IG5fb3V0OwogICAgeG1sQnVmZmVyUHRyIGluOyAvKiBhbiB4bWxCdWZmZXIgZm9yIHRoZSBpbnB1dCAqLwogICAgaW50IG5faW47CgogICAgZm9yIChuX2hhbmRsZXIgPSAwO25faGFuZGxlciA8IGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cjtuX2hhbmRsZXIrKykgewogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fb3V0KyspIHsKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9pbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBoYW5kbGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyKG5faGFuZGxlciwgMCk7CiAgICAgICAgb3V0ID0gZ2VuX3htbEJ1ZmZlclB0cihuX291dCwgMSk7CiAgICAgICAgaW4gPSBnZW5feG1sQnVmZmVyUHRyKG5faW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sQ2hhckVuY0luRnVuYyhoYW5kbGVyLCBvdXQsIGluKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIobl9oYW5kbGVyLCBoYW5kbGVyLCAwKTsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fb3V0LCBvdXQsIDEpOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9pbiwgaW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2hhckVuY0luRnVuYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9oYW5kbGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2hhckVuY091dEZ1bmModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXIgKiBoYW5kbGVyOyAvKiBjaGFyIGVuY29uZGluZyB0cmFuc2Zvcm1hdGlvbiBkYXRhIHN0cnVjdHVyZSAqLwogICAgaW50IG5faGFuZGxlcjsKICAgIHhtbEJ1ZmZlclB0ciBvdXQ7IC8qIGFuIHhtbEJ1ZmZlciBmb3IgdGhlIG91dHB1dC4gKi8KICAgIGludCBuX291dDsKICAgIHhtbEJ1ZmZlclB0ciBpbjsgLyogYW4geG1sQnVmZmVyIGZvciB0aGUgaW5wdXQgKi8KICAgIGludCBuX2luOwoKICAgIGZvciAobl9oYW5kbGVyID0gMDtuX2hhbmRsZXIgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHI7bl9oYW5kbGVyKyspIHsKICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX291dCsrKSB7CiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25faW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgaGFuZGxlciA9IGdlbl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihuX2hhbmRsZXIsIDApOwogICAgICAgIG91dCA9IGdlbl94bWxCdWZmZXJQdHIobl9vdXQsIDEpOwogICAgICAgIGluID0gZ2VuX3htbEJ1ZmZlclB0cihuX2luLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENoYXJFbmNPdXRGdW5jKGhhbmRsZXIsIG91dCwgaW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihuX2hhbmRsZXIsIGhhbmRsZXIsIDApOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9vdXQsIG91dCwgMSk7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2luLCBpbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDaGFyRW5jT3V0RnVuYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9oYW5kbGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2xlYW51cENoYXJFbmNvZGluZ0hhbmRsZXJzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKCiAgICAgICAgeG1sQ2xlYW51cENoYXJFbmNvZGluZ0hhbmRsZXJzKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2xlYW51cEVuY29kaW5nQWxpYXNlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sQ2xlYW51cEVuY29kaW5nQWxpYXNlcygpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENsZWFudXBFbmNvZGluZ0FsaWFzZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERlbEVuY29kaW5nQWxpYXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNoYXIgKiBhbGlhczsgLyogdGhlIGFsaWFzIG5hbWUgYXMgcGFyc2VkLCBpbiBVVEYtOCBmb3JtYXQgKEFTQ0lJIGFjdHVhbGx5KSAqLwogICAgaW50IG5fYWxpYXM7CgogICAgZm9yIChuX2FsaWFzID0gMDtuX2FsaWFzIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYWxpYXMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYWxpYXMgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9hbGlhcywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxEZWxFbmNvZGluZ0FsaWFzKChjb25zdCBjaGFyICopYWxpYXMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2FsaWFzLCAoY29uc3QgY2hhciAqKWFsaWFzLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERlbEVuY29kaW5nQWxpYXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYWxpYXMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERldGVjdENoYXJFbmNvZGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXJFbmNvZGluZyByZXRfdmFsOwogICAgdW5zaWduZWQgY2hhciAqIGluOyAvKiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGVzIG9mIHRoZSBYTUwgZW50aXR5LCBtdXN0IGJlIGF0IGxlYXN0IDIgYnl0ZXMgbG9uZyAoYXQgbGVhc3QgNCBpZiBlbmNvZGluZyBpcyBVVEY0IHZhcmlhbnQpLiAqLwogICAgaW50IG5faW47CiAgICBpbnQgbGVuOyAvKiBwb2ludGVyIHRvIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cjtuX2luKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBpbiA9IGdlbl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX2luLCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERldGVjdENoYXJFbmNvZGluZygoY29uc3QgdW5zaWduZWQgY2hhciAqKWluLCBsZW4pOwogICAgICAgIGRlc3JldF94bWxDaGFyRW5jb2RpbmcocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX2luLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWluLCAwKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGV0ZWN0Q2hhckVuY29kaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRmluZENoYXJFbmNvZGluZ0hhbmRsZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0Q2hhckVuY29kaW5nSGFuZGxlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRDaGFyRW5jb2RpbmdOYW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgY2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyRW5jb2RpbmcgZW5jOyAvKiB0aGUgZW5jb2RpbmcgKi8KICAgIGludCBuX2VuYzsKCiAgICBmb3IgKG5fZW5jID0gMDtuX2VuYyA8IGdlbl9uYl94bWxDaGFyRW5jb2Rpbmc7bl9lbmMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZW5jID0gZ2VuX3htbENoYXJFbmNvZGluZyhuX2VuYywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXRDaGFyRW5jb2RpbmdOYW1lKGVuYyk7CiAgICAgICAgZGVzcmV0X2NvbnN0X2NoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nKG5fZW5jLCBlbmMsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0Q2hhckVuY29kaW5nTmFtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldEVuY29kaW5nQWxpYXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCBjaGFyICogcmV0X3ZhbDsKICAgIGNoYXIgKiBhbGlhczsgLyogdGhlIGFsaWFzIG5hbWUgYXMgcGFyc2VkLCBpbiBVVEYtOCBmb3JtYXQgKEFTQ0lJIGFjdHVhbGx5KSAqLwogICAgaW50IG5fYWxpYXM7CgogICAgZm9yIChuX2FsaWFzID0gMDtuX2FsaWFzIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYWxpYXMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYWxpYXMgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9hbGlhcywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXRFbmNvZGluZ0FsaWFzKChjb25zdCBjaGFyICopYWxpYXMpOwogICAgICAgIGRlc3JldF9jb25zdF9jaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYWxpYXMsIChjb25zdCBjaGFyICopYWxpYXMsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0RW5jb2RpbmdBbGlhcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hbGlhcyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSW5pdENoYXJFbmNvZGluZ0hhbmRsZXJzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKCiAgICAgICAgeG1sSW5pdENoYXJFbmNvZGluZ0hhbmRsZXJzKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3Q2hhckVuY29kaW5nSGFuZGxlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZUNoYXJFbmNvZGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXJFbmNvZGluZyByZXRfdmFsOwogICAgY2hhciAqIG5hbWU7IC8qIHRoZSBlbmNvZGluZyBuYW1lIGFzIHBhcnNlZCwgaW4gVVRGLTggZm9ybWF0IChBU0NJSSBhY3R1YWxseSkgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF9jaGFyX3B0cihuX25hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VDaGFyRW5jb2RpbmcoKGNvbnN0IGNoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhckVuY29kaW5nKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9uYW1lLCAoY29uc3QgY2hhciAqKW5hbWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VDaGFyRW5jb2RpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIDEKc3RhdGljIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxSZWdpc3RlckNoYXJFbmNvZGluZ0hhbmRsZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGhhbmRsZXI7IC8qIHRoZSB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGhhbmRsZXIgYmxvY2sgKi8KICAgIGludCBuX2hhbmRsZXI7CgogICAgZm9yIChuX2hhbmRsZXIgPSAwO25faGFuZGxlciA8IGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyO25faGFuZGxlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBoYW5kbGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9oYW5kbGVyLCAwKTsKCiAgICAgICAgeG1sUmVnaXN0ZXJDaGFyRW5jb2RpbmdIYW5kbGVyKGhhbmRsZXIpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihuX2hhbmRsZXIsIGhhbmRsZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVnaXN0ZXJDaGFyRW5jb2RpbmdIYW5kbGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hhbmRsZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfZW5jb2Rpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIGVuY29kaW5nIDogMTYgb2YgMTkgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X1VURjhUb2lzb2xhdDEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaXNvbGF0MVRvVVRGOCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGRFbmNvZGluZ0FsaWFzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENoYXJFbmNDbG9zZUZ1bmMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2hhckVuY0ZpcnN0TGluZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDaGFyRW5jSW5GdW5jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENoYXJFbmNPdXRGdW5jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENsZWFudXBDaGFyRW5jb2RpbmdIYW5kbGVycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDbGVhbnVwRW5jb2RpbmdBbGlhc2VzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERlbEVuY29kaW5nQWxpYXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGV0ZWN0Q2hhckVuY29kaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEZpbmRDaGFyRW5jb2RpbmdIYW5kbGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldENoYXJFbmNvZGluZ0hhbmRsZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0Q2hhckVuY29kaW5nTmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRFbmNvZGluZ0FsaWFzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEluaXRDaGFyRW5jb2RpbmdIYW5kbGVycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdDaGFyRW5jb2RpbmdIYW5kbGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlQ2hhckVuY29kaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlZ2lzdGVyQ2hhckVuY29kaW5nSGFuZGxlcigpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgZW5jb2Rpbmc6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbEFkZERvY0VudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVudGl0eVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGVudGl0eSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgaW50IHR5cGU7IC8qIHRoZSBlbnRpdHkgdHlwZSBYTUxfeHh4X3l5eV9FTlRJVFkgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogdGhlIGVudGl0eSBleHRlcm5hbCBJRCBpZiBhdmFpbGFibGUgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CiAgICB4bWxDaGFyICogU3lzdGVtSUQ7IC8qIHRoZSBlbnRpdHkgc3lzdGVtIElEIGlmIGF2YWlsYWJsZSAqLwogICAgaW50IG5fU3lzdGVtSUQ7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIGVudGl0eSBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX2ludDtuX3R5cGUrKykgewogICAgZm9yIChuX0V4dGVybmFsSUQgPSAwO25fRXh0ZXJuYWxJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0V4dGVybmFsSUQrKykgewogICAgZm9yIChuX1N5c3RlbUlEID0gMDtuX1N5c3RlbUlEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fU3lzdGVtSUQrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHR5cGUgPSBnZW5faW50KG5fdHlwZSwgMik7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDMpOwogICAgICAgIFN5c3RlbUlEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIDQpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFkZERvY0VudGl0eShkb2MsIChjb25zdCB4bWxDaGFyICopbmFtZSwgdHlwZSwgKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlELCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF94bWxFbnRpdHlQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfaW50KG5fdHlwZSwgdHlwZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAzKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9TeXN0ZW1JRCwgKGNvbnN0IHhtbENoYXIgKilTeXN0ZW1JRCwgNCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFkZERvY0VudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX0V4dGVybmFsSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fU3lzdGVtSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQWRkRHRkRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRW50aXR5UHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZW50aXR5IG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICBpbnQgdHlwZTsgLyogdGhlIGVudGl0eSB0eXBlIFhNTF94eHhfeXl5X0VOVElUWSAqLwogICAgaW50IG5fdHlwZTsKICAgIHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiB0aGUgZW50aXR5IGV4dGVybmFsIElEIGlmIGF2YWlsYWJsZSAqLwogICAgaW50IG5fRXh0ZXJuYWxJRDsKICAgIHhtbENoYXIgKiBTeXN0ZW1JRDsgLyogdGhlIGVudGl0eSBzeXN0ZW0gSUQgaWYgYXZhaWxhYmxlICovCiAgICBpbnQgbl9TeXN0ZW1JRDsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgZW50aXR5IGNvbnRlbnQgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfaW50O25fdHlwZSsrKSB7CiAgICBmb3IgKG5fRXh0ZXJuYWxJRCA9IDA7bl9FeHRlcm5hbElEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fRXh0ZXJuYWxJRCsrKSB7CiAgICBmb3IgKG5fU3lzdGVtSUQgPSAwO25fU3lzdGVtSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9TeXN0ZW1JRCsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgdHlwZSA9IGdlbl9pbnQobl90eXBlLCAyKTsKICAgICAgICBFeHRlcm5hbElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgMyk7CiAgICAgICAgU3lzdGVtSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9TeXN0ZW1JRCwgNCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDUpOwoKICAgICAgICByZXRfdmFsID0geG1sQWRkRHRkRW50aXR5KGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCB0eXBlLCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X3htbEVudGl0eVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19pbnQobl90eXBlLCB0eXBlLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1N5c3RlbUlELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlELCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDUpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQWRkRHRkRW50aXR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fRXh0ZXJuYWxJRCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9TeXN0ZW1JRCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDbGVhbnVwUHJlZGVmaW5lZEVudGl0aWVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfTEVHQUNZX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfTEVHQUNZX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sQ2xlYW51cFByZWRlZmluZWRFbnRpdGllcygpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENsZWFudXBQcmVkZWZpbmVkRW50aXRpZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxFbnRpdGllc1RhYmxlUHRyIDEKc3RhdGljIHhtbEVudGl0aWVzVGFibGVQdHIgZ2VuX3htbEVudGl0aWVzVGFibGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEVudGl0aWVzVGFibGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEVudGl0aWVzVGFibGVQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5RW50aXRpZXNUYWJsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDcmVhdGVFbnRpdGllc1RhYmxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbER1bXBFbnRpdGllc1RhYmxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiBBbiBYTUwgYnVmZmVyLiAqLwogICAgaW50IG5fYnVmOwogICAgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZTsgLyogQW4gZW50aXR5IHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEVudGl0aWVzVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxFbnRpdGllc1RhYmxlUHRyKG5fdGFibGUsIDEpOwoKICAgICAgICB4bWxEdW1wRW50aXRpZXNUYWJsZShidWYsIHRhYmxlKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRW50aXRpZXNUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEdW1wRW50aXRpZXNUYWJsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbEVudGl0eVB0ciAxCnN0YXRpYyB4bWxFbnRpdHlQdHIgZ2VuX3htbEVudGl0eVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sRW50aXR5UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbnRpdHlQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxEdW1wRW50aXR5RGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogQW4gWE1MIGJ1ZmZlci4gKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbEVudGl0eVB0ciBlbnQ7IC8qIEFuIGVudGl0eSB0YWJsZSAqLwogICAgaW50IG5fZW50OwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fZW50ID0gMDtuX2VudCA8IGdlbl9uYl94bWxFbnRpdHlQdHI7bl9lbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgZW50ID0gZ2VuX3htbEVudGl0eVB0cihuX2VudCwgMSk7CgogICAgICAgIHhtbER1bXBFbnRpdHlEZWNsKGJ1ZiwgZW50KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRW50aXR5UHRyKG5fZW50LCBlbnQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRHVtcEVudGl0eURlY2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgY29udGFpbmluZyB0aGUgc3RyaW5nICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogaW5wdXQ7IC8qIEEgc3RyaW5nIHRvIGNvbnZlcnQgdG8gWE1MLiAqLwogICAgaW50IG5faW5wdXQ7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9pbnB1dCA9IDA7bl9pbnB1dCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2lucHV0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGlucHV0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5faW5wdXQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQoZG9jLCAoY29uc3QgeG1sQ2hhciAqKWlucHV0KTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5faW5wdXQsIChjb25zdCB4bWxDaGFyICopaW5wdXQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2lucHV0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxFbmNvZGVTcGVjaWFsQ2hhcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzdHJpbmcgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBpbnB1dDsgLyogQSBzdHJpbmcgdG8gY29udmVydCB0byBYTUwuICovCiAgICBpbnQgbl9pbnB1dDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2lucHV0ID0gMDtuX2lucHV0IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25faW5wdXQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgaW5wdXQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9pbnB1dCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxFbmNvZGVTcGVjaWFsQ2hhcnMoZG9jLCAoY29uc3QgeG1sQ2hhciAqKWlucHV0KTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5faW5wdXQsIChjb25zdCB4bWxDaGFyICopaW5wdXQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRW5jb2RlU3BlY2lhbENoYXJzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbnB1dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0RG9jRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRW50aXR5UHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNpbmcgdGhlIGVudGl0eSAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0RG9jRW50aXR5KGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfeG1sRW50aXR5UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXREb2NFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldER0ZEVudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVudGl0eVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50IHJlZmVyZW5jaW5nIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZW50aXR5IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldER0ZEVudGl0eShkb2MsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbEVudGl0eVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0RHRkRW50aXR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRQYXJhbWV0ZXJFbnRpdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxFbnRpdHlQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCByZWZlcmVuY2luZyB0aGUgZW50aXR5ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGVudGl0eSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXRQYXJhbWV0ZXJFbnRpdHkoZG9jLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxFbnRpdHlQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldFBhcmFtZXRlckVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0UHJlZGVmaW5lZEVudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVudGl0eVB0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXRQcmVkZWZpbmVkRW50aXR5KChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbEVudGl0eVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldFByZWRlZmluZWRFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSW5pdGlhbGl6ZVByZWRlZmluZWRFbnRpdGllcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0xFR0FDWV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX0xFR0FDWV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXMoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJbml0aWFsaXplUHJlZGVmaW5lZEVudGl0aWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfZW50aXRpZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIGVudGl0aWVzIDogMTIgb2YgMTYgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFkZERvY0VudGl0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGREdGRFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2xlYW51cFByZWRlZmluZWRFbnRpdGllcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDb3B5RW50aXRpZXNUYWJsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDcmVhdGVFbnRpdGllc1RhYmxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbER1bXBFbnRpdGllc1RhYmxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbER1bXBFbnRpdHlEZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEVuY29kZVNwZWNpYWxDaGFycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXREb2NFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0RHRkRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldFBhcmFtZXRlckVudGl0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRQcmVkZWZpbmVkRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXMoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIGVudGl0aWVzOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoQWRkRW50cnkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgIGludCBuX3RhYmxlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTsKICAgIHZvaWQgKiB1c2VyZGF0YTsgLyogYSBwb2ludGVyIHRvIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fdXNlcmRhdGE7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl91c2VyZGF0YSA9IDA7bl91c2VyZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJkYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgdXNlcmRhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyZGF0YSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoQWRkRW50cnkodGFibGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgdXNlcmRhdGEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcmRhdGEsIHVzZXJkYXRhLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc2hBZGRFbnRyeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJkYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoQWRkRW50cnkyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lMjsKICAgIHZvaWQgKiB1c2VyZGF0YTsgLyogYSBwb2ludGVyIHRvIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fdXNlcmRhdGE7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lMiA9IDA7bl9uYW1lMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUyKyspIHsKICAgIGZvciAobl91c2VyZGF0YSA9IDA7bl91c2VyZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJkYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbmFtZTIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgMik7CiAgICAgICAgdXNlcmRhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyZGF0YSwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoQWRkRW50cnkyKHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIHVzZXJkYXRhKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyLCAyKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyZGF0YSwgdXNlcmRhdGEsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzaEFkZEVudHJ5MiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJkYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoQWRkRW50cnkzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lMjsKICAgIHhtbENoYXIgKiBuYW1lMzsgLyogYSB0aGlyZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTM7CiAgICB2b2lkICogdXNlcmRhdGE7IC8qIGEgcG9pbnRlciB0byB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX3VzZXJkYXRhOwoKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbmFtZTIgPSAwO25fbmFtZTIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lMisrKSB7CiAgICBmb3IgKG5fbmFtZTMgPSAwO25fbmFtZTMgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lMysrKSB7CiAgICBmb3IgKG5fdXNlcmRhdGEgPSAwO25fdXNlcmRhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyZGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIG5hbWUyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIDIpOwogICAgICAgIG5hbWUzID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTMsIDMpOwogICAgICAgIHVzZXJkYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcmRhdGEsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaEFkZEVudHJ5Myh0YWJsZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUzLCB1c2VyZGF0YSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTMsIChjb25zdCB4bWxDaGFyICopbmFtZTMsIDMpOwogICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJkYXRhLCB1c2VyZGF0YSwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoQWRkRW50cnkzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZTIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZTMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcmRhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hDb3B5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hDcmVhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaENyZWF0ZURpY3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaExvb2t1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaExvb2t1cCh0YWJsZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfdm9pZF9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoTG9va3VwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hMb29rdXAyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lMjsKCiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25hbWUyID0gMDtuX25hbWUyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZTIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBuYW1lMiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUyLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEhhc2hMb29rdXAyKHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZTIpOwogICAgICAgIGRlc3JldF92b2lkX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoTG9va3VwMiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoTG9va3VwMyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTI7CiAgICB4bWxDaGFyICogbmFtZTM7IC8qIGEgdGhpcmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWUzOwoKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbmFtZTIgPSAwO25fbmFtZTIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lMisrKSB7CiAgICBmb3IgKG5fbmFtZTMgPSAwO25fbmFtZTMgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lMysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIG5hbWUyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIDIpOwogICAgICAgIG5hbWUzID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTMsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaExvb2t1cDModGFibGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMyk7CiAgICAgICAgZGVzcmV0X3ZvaWRfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMywgKGNvbnN0IHhtbENoYXIgKiluYW1lMywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoTG9va3VwMyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoUUxvb2t1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgcHJlZml4IG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fcHJlZml4OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewogICAgZm9yIChuX3ByZWZpeCA9IDA7bl9wcmVmaXggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wcmVmaXgrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIDApOwogICAgICAgIHByZWZpeCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgMSk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaFFMb29rdXAodGFibGUsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF92b2lkX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc2hRTG9va3VwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoUUxvb2t1cDIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogcmV0X3ZhbDsKICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgIGludCBuX3RhYmxlOwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogcHJlZml4MjsgLyogdGhlIHNlY29uZCBwcmVmaXggb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9wcmVmaXgyOwogICAgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTI7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9wcmVmaXgyID0gMDtuX3ByZWZpeDIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wcmVmaXgyKyspIHsKICAgIGZvciAobl9uYW1lMiA9IDA7bl9uYW1lMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBwcmVmaXgyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4MiwgMyk7CiAgICAgICAgbmFtZTIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoUUxvb2t1cDIodGFibGUsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopcHJlZml4MiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMik7CiAgICAgICAgZGVzcmV0X3ZvaWRfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeDIsIChjb25zdCB4bWxDaGFyICopcHJlZml4MiwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzaFFMb29rdXAyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeDIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZTIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hRTG9va3VwMyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgcHJlZml4IG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fcHJlZml4OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBwcmVmaXgyOyAvKiB0aGUgc2Vjb25kIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX3ByZWZpeDI7CiAgICB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lMjsKICAgIHhtbENoYXIgKiBwcmVmaXgzOyAvKiB0aGUgdGhpcmQgcHJlZml4IG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fcHJlZml4MzsKICAgIHhtbENoYXIgKiBuYW1lMzsgLyogYSB0aGlyZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTM7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9wcmVmaXgyID0gMDtuX3ByZWZpeDIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wcmVmaXgyKyspIHsKICAgIGZvciAobl9uYW1lMiA9IDA7bl9uYW1lMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUyKyspIHsKICAgIGZvciAobl9wcmVmaXgzID0gMDtuX3ByZWZpeDMgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wcmVmaXgzKyspIHsKICAgIGZvciAobl9uYW1lMyA9IDA7bl9uYW1lMyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBwcmVmaXgyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4MiwgMyk7CiAgICAgICAgbmFtZTIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgNCk7CiAgICAgICAgcHJlZml4MyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeDMsIDUpOwogICAgICAgIG5hbWUzID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTMsIDYpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaFFMb29rdXAzKHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeDIsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIChjb25zdCB4bWxDaGFyICopcHJlZml4MywgKGNvbnN0IHhtbENoYXIgKiluYW1lMyk7CiAgICAgICAgZGVzcmV0X3ZvaWRfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeDIsIChjb25zdCB4bWxDaGFyICopcHJlZml4MiwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIDQpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeDMsIChjb25zdCB4bWxDaGFyICopcHJlZml4MywgNSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTMsIChjb25zdCB4bWxDaGFyICopbmFtZTMsIDYpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzaFFMb29rdXAzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeDIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZTIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4Myk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaFJlbW92ZUVudHJ5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxIYXNoRGVhbGxvY2F0b3IgZjsgLyogdGhlIGRlYWxsb2NhdG9yIGZ1bmN0aW9uIGZvciByZW1vdmVkIGl0ZW0gKGlmIGFueSkgKi8KICAgIGludCBuX2Y7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfeG1sSGFzaERlYWxsb2NhdG9yO25fZisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIGYgPSBnZW5feG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoUmVtb3ZlRW50cnkodGFibGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgZik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfeG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgZiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoUmVtb3ZlRW50cnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoUmVtb3ZlRW50cnkyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lMjsKICAgIHhtbEhhc2hEZWFsbG9jYXRvciBmOyAvKiB0aGUgZGVhbGxvY2F0b3IgZnVuY3Rpb24gZm9yIHJlbW92ZWQgaXRlbSAoaWYgYW55KSAqLwogICAgaW50IG5fZjsKCiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25hbWUyID0gMDtuX25hbWUyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZTIrKykgewogICAgZm9yIChuX2YgPSAwO25fZiA8IGdlbl9uYl94bWxIYXNoRGVhbGxvY2F0b3I7bl9mKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbmFtZTIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgMik7CiAgICAgICAgZiA9IGdlbl94bWxIYXNoRGVhbGxvY2F0b3Iobl9mLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEhhc2hSZW1vdmVFbnRyeTIodGFibGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgZik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgMik7CiAgICAgICAgZGVzX3htbEhhc2hEZWFsbG9jYXRvcihuX2YsIGYsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzaFJlbW92ZUVudHJ5MiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2YpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hSZW1vdmVFbnRyeTModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgIGludCBuX3RhYmxlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBuYW1lMjsgLyogYSBzZWNvbmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWUyOwogICAgeG1sQ2hhciAqIG5hbWUzOyAvKiBhIHRoaXJkIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lMzsKICAgIHhtbEhhc2hEZWFsbG9jYXRvciBmOyAvKiB0aGUgZGVhbGxvY2F0b3IgZnVuY3Rpb24gZm9yIHJlbW92ZWQgaXRlbSAoaWYgYW55KSAqLwogICAgaW50IG5fZjsKCiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25hbWUyID0gMDtuX25hbWUyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZTIrKykgewogICAgZm9yIChuX25hbWUzID0gMDtuX25hbWUzIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZTMrKykgewogICAgZm9yIChuX2YgPSAwO25fZiA8IGdlbl9uYl94bWxIYXNoRGVhbGxvY2F0b3I7bl9mKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbmFtZTIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgMik7CiAgICAgICAgbmFtZTMgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMywgMyk7CiAgICAgICAgZiA9IGdlbl94bWxIYXNoRGVhbGxvY2F0b3Iobl9mLCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEhhc2hSZW1vdmVFbnRyeTModGFibGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMywgZik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTMsIChjb25zdCB4bWxDaGFyICopbmFtZTMsIDMpOwogICAgICAgIGRlc194bWxIYXNoRGVhbGxvY2F0b3Iobl9mLCBmLCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc2hSZW1vdmVFbnRyeTMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoU2Nhbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoU2NhbjModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaFNjYW5GdWxsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hTY2FuRnVsbDModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaFNpemUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgIGludCBuX3RhYmxlOwoKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoU2l6ZSh0YWJsZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoU2l6ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaFVwZGF0ZUVudHJ5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB2b2lkICogdXNlcmRhdGE7IC8qIGEgcG9pbnRlciB0byB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX3VzZXJkYXRhOwogICAgeG1sSGFzaERlYWxsb2NhdG9yIGY7IC8qIHRoZSBkZWFsbG9jYXRvciBmdW5jdGlvbiBmb3IgcmVwbGFjZWQgaXRlbSAoaWYgYW55KSAqLwogICAgaW50IG5fZjsKCiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3VzZXJkYXRhID0gMDtuX3VzZXJkYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlcmRhdGErKykgewogICAgZm9yIChuX2YgPSAwO25fZiA8IGdlbl9uYl94bWxIYXNoRGVhbGxvY2F0b3I7bl9mKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgdXNlcmRhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyZGF0YSwgMik7CiAgICAgICAgZiA9IGdlbl94bWxIYXNoRGVhbGxvY2F0b3Iobl9mLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEhhc2hVcGRhdGVFbnRyeSh0YWJsZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCB1c2VyZGF0YSwgZik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyZGF0YSwgdXNlcmRhdGEsIDIpOwogICAgICAgIGRlc194bWxIYXNoRGVhbGxvY2F0b3Iobl9mLCBmLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc2hVcGRhdGVFbnRyeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJkYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2YpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hVcGRhdGVFbnRyeTIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgIGludCBuX3RhYmxlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBuYW1lMjsgLyogYSBzZWNvbmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWUyOwogICAgdm9pZCAqIHVzZXJkYXRhOyAvKiBhIHBvaW50ZXIgdG8gdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl91c2VyZGF0YTsKICAgIHhtbEhhc2hEZWFsbG9jYXRvciBmOyAvKiB0aGUgZGVhbGxvY2F0b3IgZnVuY3Rpb24gZm9yIHJlcGxhY2VkIGl0ZW0gKGlmIGFueSkgKi8KICAgIGludCBuX2Y7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lMiA9IDA7bl9uYW1lMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUyKyspIHsKICAgIGZvciAobl91c2VyZGF0YSA9IDA7bl91c2VyZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJkYXRhKyspIHsKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfeG1sSGFzaERlYWxsb2NhdG9yO25fZisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIG5hbWUyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIDIpOwogICAgICAgIHVzZXJkYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcmRhdGEsIDMpOwogICAgICAgIGYgPSBnZW5feG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoVXBkYXRlRW50cnkyKHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIHVzZXJkYXRhLCBmKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyLCAyKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyZGF0YSwgdXNlcmRhdGEsIDMpOwogICAgICAgIGRlc194bWxIYXNoRGVhbGxvY2F0b3Iobl9mLCBmLCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc2hVcGRhdGVFbnRyeTIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91c2VyZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoVXBkYXRlRW50cnkzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lMjsKICAgIHhtbENoYXIgKiBuYW1lMzsgLyogYSB0aGlyZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTM7CiAgICB2b2lkICogdXNlcmRhdGE7IC8qIGEgcG9pbnRlciB0byB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX3VzZXJkYXRhOwogICAgeG1sSGFzaERlYWxsb2NhdG9yIGY7IC8qIHRoZSBkZWFsbG9jYXRvciBmdW5jdGlvbiBmb3IgcmVwbGFjZWQgaXRlbSAoaWYgYW55KSAqLwogICAgaW50IG5fZjsKCiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25hbWUyID0gMDtuX25hbWUyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZTIrKykgewogICAgZm9yIChuX25hbWUzID0gMDtuX25hbWUzIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZTMrKykgewogICAgZm9yIChuX3VzZXJkYXRhID0gMDtuX3VzZXJkYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlcmRhdGErKykgewogICAgZm9yIChuX2YgPSAwO25fZiA8IGdlbl9uYl94bWxIYXNoRGVhbGxvY2F0b3I7bl9mKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbmFtZTIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgMik7CiAgICAgICAgbmFtZTMgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMywgMyk7CiAgICAgICAgdXNlcmRhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyZGF0YSwgNCk7CiAgICAgICAgZiA9IGdlbl94bWxIYXNoRGVhbGxvY2F0b3Iobl9mLCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEhhc2hVcGRhdGVFbnRyeTModGFibGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMywgdXNlcmRhdGEsIGYpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUzLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUzLCAzKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyZGF0YSwgdXNlcmRhdGEsIDQpOwogICAgICAgIGRlc194bWxIYXNoRGVhbGxvY2F0b3Iobl9mLCBmLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc2hVcGRhdGVFbnRyeTMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91c2VyZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2hhc2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIGhhc2ggOiAxNiBvZiAyNCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaEFkZEVudHJ5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hBZGRFbnRyeTIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaEFkZEVudHJ5MygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoQ29weSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoQ3JlYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hDcmVhdGVEaWN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hMb29rdXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaExvb2t1cDIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaExvb2t1cDMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFFMb29rdXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFFMb29rdXAyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hRTG9va3VwMygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoUmVtb3ZlRW50cnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFJlbW92ZUVudHJ5MigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoUmVtb3ZlRW50cnkzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hTY2FuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hTY2FuMygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoU2NhbkZ1bGwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFNjYW5GdWxsMygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoU2l6ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoVXBkYXRlRW50cnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFVwZGF0ZUVudHJ5MigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoVXBkYXRlRW50cnkzKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBoYXNoOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNkZWZpbmUgZ2VuX25iX3htbExpbmtQdHIgMQpzdGF0aWMgeG1sTGlua1B0ciBnZW5feG1sTGlua1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sTGlua1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTGlua1B0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbExpbmtHZXREYXRhKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICB4bWxMaW5rUHRyIGxrOyAvKiBhIGxpbmsgKi8KICAgIGludCBuX2xrOwoKICAgIGZvciAobl9sayA9IDA7bl9sayA8IGdlbl9uYl94bWxMaW5rUHRyO25fbGsrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbGsgPSBnZW5feG1sTGlua1B0cihuX2xrLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpbmtHZXREYXRhKGxrKTsKICAgICAgICBkZXNyZXRfdm9pZF9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaW5rUHRyKG5fbGssIGxrLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpbmtHZXREYXRhIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xrKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0QXBwZW5kKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxMaXN0UHRyIGw7IC8qIGEgbGlzdCAqLwogICAgaW50IG5fbDsKICAgIHZvaWQgKiBkYXRhOyAvKiB0aGUgZGF0YSAqLwogICAgaW50IG5fZGF0YTsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwogICAgICAgIGRhdGEgPSBnZW5fdXNlcmRhdGEobl9kYXRhLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpc3RBcHBlbmQobCwgZGF0YSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sLCBsLCAwKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RBcHBlbmQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0Q2xlYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxMaXN0UHRyIGw7IC8qIGEgbGlzdCAqLwogICAgaW50IG5fbDsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwoKICAgICAgICB4bWxMaXN0Q2xlYXIobCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0Q2xlYXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl9jb25zdF94bWxMaXN0UHRyIDEKc3RhdGljIHhtbExpc3RQdHIgZ2VuX2NvbnN0X3htbExpc3RQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbExpc3RQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbExpc3RQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0Q29weSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTGlzdFB0ciBjdXI7IC8qIHRoZSBuZXcgbGlzdCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sTGlzdFB0ciBvbGQ7IC8qIHRoZSBvbGQgbGlzdCAqLwogICAgaW50IG5fb2xkOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbExpc3RQdHI7bl9jdXIrKykgewogICAgZm9yIChuX29sZCA9IDA7bl9vbGQgPCBnZW5fbmJfY29uc3RfeG1sTGlzdFB0cjtuX29sZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTGlzdFB0cihuX2N1ciwgMCk7CiAgICAgICAgb2xkID0gZ2VuX2NvbnN0X3htbExpc3RQdHIobl9vbGQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTGlzdENvcHkoY3VyLCAoY29uc3QgeG1sTGlzdFB0cilvbGQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxMaXN0UHRyKG5fb2xkLCAoY29uc3QgeG1sTGlzdFB0cilvbGQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdENvcHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29sZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdENyZWF0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0RHVwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RFbXB0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CgogICAgZm9yIChuX2wgPSAwO25fbCA8IGdlbl9uYl94bWxMaXN0UHRyO25fbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsID0gZ2VuX3htbExpc3RQdHIobl9sLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpc3RFbXB0eShsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdEVtcHR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RFbmQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdEZyb250KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RJbnNlcnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbExpc3RQdHIgbDsgLyogYSBsaXN0ICovCiAgICBpbnQgbl9sOwogICAgdm9pZCAqIGRhdGE7IC8qIHRoZSBkYXRhICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9sID0gMDtuX2wgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2wrKykgewogICAgZm9yIChuX2RhdGEgPSAwO25fZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX2RhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbCA9IGdlbl94bWxMaXN0UHRyKG5fbCwgMCk7CiAgICAgICAgZGF0YSA9IGdlbl91c2VyZGF0YShuX2RhdGEsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTGlzdEluc2VydChsLCBkYXRhKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIGRlc191c2VyZGF0YShuX2RhdGEsIGRhdGEsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdEluc2VydCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RNZXJnZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbExpc3RQdHIgbDE7IC8qIHRoZSBvcmlnaW5hbCBsaXN0ICovCiAgICBpbnQgbl9sMTsKICAgIHhtbExpc3RQdHIgbDI7IC8qIHRoZSBuZXcgbGlzdCAqLwogICAgaW50IG5fbDI7CgogICAgZm9yIChuX2wxID0gMDtuX2wxIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sMSsrKSB7CiAgICBmb3IgKG5fbDIgPSAwO25fbDIgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2wyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwxID0gZ2VuX3htbExpc3RQdHIobl9sMSwgMCk7CiAgICAgICAgbDIgPSBnZW5feG1sTGlzdFB0cihuX2wyLCAxKTsKCiAgICAgICAgeG1sTGlzdE1lcmdlKGwxLCBsMik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbDEsIGwxLCAwKTsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wyLCBsMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0TWVyZ2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbDEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbDIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RQb3BCYWNrKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CgogICAgZm9yIChuX2wgPSAwO25fbCA8IGdlbl9uYl94bWxMaXN0UHRyO25fbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsID0gZ2VuX3htbExpc3RQdHIobl9sLCAwKTsKCiAgICAgICAgeG1sTGlzdFBvcEJhY2sobCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0UG9wQmFjayIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0UG9wRnJvbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxMaXN0UHRyIGw7IC8qIGEgbGlzdCAqLwogICAgaW50IG5fbDsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwoKICAgICAgICB4bWxMaXN0UG9wRnJvbnQobCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0UG9wRnJvbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdFB1c2hCYWNrKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxMaXN0UHRyIGw7IC8qIGEgbGlzdCAqLwogICAgaW50IG5fbDsKICAgIHZvaWQgKiBkYXRhOyAvKiBuZXcgZGF0YSAqLwogICAgaW50IG5fZGF0YTsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwogICAgICAgIGRhdGEgPSBnZW5fdXNlcmRhdGEobl9kYXRhLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpc3RQdXNoQmFjayhsLCBkYXRhKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIGRlc191c2VyZGF0YShuX2RhdGEsIGRhdGEsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdFB1c2hCYWNrIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdFB1c2hGcm9udCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CiAgICB2b2lkICogZGF0YTsgLyogbmV3IGRhdGEgKi8KICAgIGludCBuX2RhdGE7CgogICAgZm9yIChuX2wgPSAwO25fbCA8IGdlbl9uYl94bWxMaXN0UHRyO25fbCsrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fZGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsID0gZ2VuX3htbExpc3RQdHIobl9sLCAwKTsKICAgICAgICBkYXRhID0gZ2VuX3VzZXJkYXRhKG5fZGF0YSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxMaXN0UHVzaEZyb250KGwsIGRhdGEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fZGF0YSwgZGF0YSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0UHVzaEZyb250IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdFJlbW92ZUFsbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CiAgICB2b2lkICogZGF0YTsgLyogbGlzdCBkYXRhICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9sID0gMDtuX2wgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2wrKykgewogICAgZm9yIChuX2RhdGEgPSAwO25fZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX2RhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbCA9IGdlbl94bWxMaXN0UHRyKG5fbCwgMCk7CiAgICAgICAgZGF0YSA9IGdlbl91c2VyZGF0YShuX2RhdGEsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTGlzdFJlbW92ZUFsbChsLCBkYXRhKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIGRlc191c2VyZGF0YShuX2RhdGEsIGRhdGEsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdFJlbW92ZUFsbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RSZW1vdmVGaXJzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CiAgICB2b2lkICogZGF0YTsgLyogbGlzdCBkYXRhICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9sID0gMDtuX2wgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2wrKykgewogICAgZm9yIChuX2RhdGEgPSAwO25fZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX2RhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbCA9IGdlbl94bWxMaXN0UHRyKG5fbCwgMCk7CiAgICAgICAgZGF0YSA9IGdlbl91c2VyZGF0YShuX2RhdGEsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTGlzdFJlbW92ZUZpcnN0KGwsIGRhdGEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fZGF0YSwgZGF0YSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0UmVtb3ZlRmlyc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0UmVtb3ZlTGFzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CiAgICB2b2lkICogZGF0YTsgLyogbGlzdCBkYXRhICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9sID0gMDtuX2wgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2wrKykgewogICAgZm9yIChuX2RhdGEgPSAwO25fZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX2RhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbCA9IGdlbl94bWxMaXN0UHRyKG5fbCwgMCk7CiAgICAgICAgZGF0YSA9IGdlbl91c2VyZGF0YShuX2RhdGEsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTGlzdFJlbW92ZUxhc3QobCwgZGF0YSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sLCBsLCAwKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RSZW1vdmVMYXN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdFJldmVyc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxMaXN0UHRyIGw7IC8qIGEgbGlzdCAqLwogICAgaW50IG5fbDsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwoKICAgICAgICB4bWxMaXN0UmV2ZXJzZShsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sLCBsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RSZXZlcnNlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RSZXZlcnNlU2VhcmNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICB4bWxMaXN0UHRyIGw7IC8qIGEgbGlzdCAqLwogICAgaW50IG5fbDsKICAgIHZvaWQgKiBkYXRhOyAvKiBhIHNlYXJjaCB2YWx1ZSAqLwogICAgaW50IG5fZGF0YTsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwogICAgICAgIGRhdGEgPSBnZW5fdXNlcmRhdGEobl9kYXRhLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpc3RSZXZlcnNlU2VhcmNoKGwsIGRhdGEpOwogICAgICAgIGRlc3JldF92b2lkX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sLCBsLCAwKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RSZXZlcnNlU2VhcmNoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdFJldmVyc2VXYWxrKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RTZWFyY2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogcmV0X3ZhbDsKICAgIHhtbExpc3RQdHIgbDsgLyogYSBsaXN0ICovCiAgICBpbnQgbl9sOwogICAgdm9pZCAqIGRhdGE7IC8qIGEgc2VhcmNoIHZhbHVlICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9sID0gMDtuX2wgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2wrKykgewogICAgZm9yIChuX2RhdGEgPSAwO25fZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX2RhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbCA9IGdlbl94bWxMaXN0UHRyKG5fbCwgMCk7CiAgICAgICAgZGF0YSA9IGdlbl91c2VyZGF0YShuX2RhdGEsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTGlzdFNlYXJjaChsLCBkYXRhKTsKICAgICAgICBkZXNyZXRfdm9pZF9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fZGF0YSwgZGF0YSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0U2VhcmNoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdFNpemUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbExpc3RQdHIgbDsgLyogYSBsaXN0ICovCiAgICBpbnQgbl9sOwoKICAgIGZvciAobl9sID0gMDtuX2wgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2wrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbCA9IGdlbl94bWxMaXN0UHRyKG5fbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxMaXN0U2l6ZShsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdFNpemUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdFNvcnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxMaXN0UHRyIGw7IC8qIGEgbGlzdCAqLwogICAgaW50IG5fbDsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwoKICAgICAgICB4bWxMaXN0U29ydChsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sLCBsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RTb3J0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RXYWxrKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfbGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgbGlzdCA6IDE5IG9mIDI2IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaW5rR2V0RGF0YSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0QXBwZW5kKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RDbGVhcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0Q29weSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0Q3JlYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3REdXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdEVtcHR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RFbmQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdEZyb250KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RJbnNlcnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdE1lcmdlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RQb3BCYWNrKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RQb3BGcm9udCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0UHVzaEJhY2soKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFB1c2hGcm9udCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0UmVtb3ZlQWxsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RSZW1vdmVGaXJzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0UmVtb3ZlTGFzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0UmV2ZXJzZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0UmV2ZXJzZVNlYXJjaCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0UmV2ZXJzZVdhbGsoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFNlYXJjaCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0U2l6ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0U29ydCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0V2FsaygpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgbGlzdDogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUENoZWNrUmVzcG9uc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogYW4gRlRQIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxOYW5vRlRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTmFub0ZUUENoZWNrUmVzcG9uc2UoY3R4KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vRlRQQ2hlY2tSZXNwb25zZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vRlRQQ2xlYW51cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0ZUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICB4bWxOYW5vRlRQQ2xlYW51cCgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9GVFBDbGVhbnVwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUENsb3NlQ29ubmVjdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0ZUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiBhbiBGVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9GVFBDdHh0UHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl94bWxOYW5vRlRQQ3R4dFB0cihuX2N0eCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOYW5vRlRQQ2xvc2VDb25uZWN0aW9uKGN0eCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUENsb3NlQ29ubmVjdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vRlRQQ3dkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIGFuIEZUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CiAgICBjaGFyICogZGlyZWN0b3J5OyAvKiBhIGRpcmVjdG9yeSBvbiB0aGUgc2VydmVyICovCiAgICBpbnQgbl9kaXJlY3Rvcnk7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0ZUUEN0eHRQdHI7bl9jdHgrKykgewogICAgZm9yIChuX2RpcmVjdG9yeSA9IDA7bl9kaXJlY3RvcnkgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9kaXJlY3RvcnkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCAwKTsKICAgICAgICBkaXJlY3RvcnkgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9kaXJlY3RvcnksIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmFub0ZUUEN3ZChjdHgsIChjb25zdCBjaGFyICopZGlyZWN0b3J5KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZGlyZWN0b3J5LCAoY29uc3QgY2hhciAqKWRpcmVjdG9yeSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vRlRQQ3dkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kaXJlY3RvcnkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vRlRQRGVsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0ZUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiBhbiBGVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwogICAgY29uc3QgY2hhciAqIGZpbGU7IC8qIGEgZmlsZSBvciBkaXJlY3Rvcnkgb24gdGhlIHNlcnZlciAqLwogICAgaW50IG5fZmlsZTsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxOYW5vRlRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fZmlsZSA9IDA7bl9maWxlIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIDApOwogICAgICAgIGZpbGUgPSBnZW5fZmlsZXBhdGgobl9maWxlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBEZWxlKGN0eCwgZmlsZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGUsIGZpbGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUERlbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vRlRQR2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBHZXRDb25uZWN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIGFuIEZUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0ZUUEN0eHRQdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBHZXRDb25uZWN0aW9uKGN0eCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUEdldENvbm5lY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUEdldFJlc3BvbnNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIGFuIEZUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0ZUUEN0eHRQdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBHZXRSZXNwb25zZShjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vRlRQQ3R4dFB0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9GVFBHZXRSZXNwb25zZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vRlRQR2V0U29ja2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIGFuIEZUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlIHRvIHJldHJpZXZlIChvciBOVUxMIGlmIHBhdGggaXMgaW4gY29udGV4dCkuICovCiAgICBpbnQgbl9maWxlbmFtZTsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxOYW5vRlRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmFub0ZUUEdldFNvY2tldChjdHgsIGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9GVFBHZXRTb2NrZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUEluaXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sTmFub0ZUUEluaXQoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vRlRQSW5pdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBMaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBOZXdDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIFRoZSBVUkwgdXNlZCB0byBpbml0aWFsaXplIHRoZSBjb250ZXh0ICovCiAgICBpbnQgbl9VUkw7CgogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJMID0gZ2VuX2ZpbGVwYXRoKG5fVVJMLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBOZXdDdHh0KFVSTCk7CiAgICAgICAgZGVzcmV0X3htbE5hbm9GVFBDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vRlRQTmV3Q3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vRlRQT3Blbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0ZUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgVVJMIHRvIHRoZSByZXNvdXJjZSAqLwogICAgaW50IG5fVVJMOwoKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOYW5vRlRQT3BlbihVUkwpOwogICAgICAgIGRlc3JldF94bWxOYW5vRlRQQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUE9wZW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUFByb3h5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBjaGFyICogaG9zdDsgLyogdGhlIHByb3h5IGhvc3QgbmFtZSAqLwogICAgaW50IG5faG9zdDsKICAgIGludCBwb3J0OyAvKiB0aGUgcHJveHkgcG9ydCAqLwogICAgaW50IG5fcG9ydDsKICAgIGNoYXIgKiB1c2VyOyAvKiB0aGUgcHJveHkgdXNlciBuYW1lICovCiAgICBpbnQgbl91c2VyOwogICAgY2hhciAqIHBhc3N3ZDsgLyogdGhlIHByb3h5IHBhc3N3b3JkICovCiAgICBpbnQgbl9wYXNzd2Q7CiAgICBpbnQgdHlwZTsgLyogdGhlIHR5cGUgb2YgcHJveHkgMSBmb3IgdXNpbmcgU0lURSwgMiBmb3IgVVNFUiBhQGIgKi8KICAgIGludCBuX3R5cGU7CgogICAgZm9yIChuX2hvc3QgPSAwO25faG9zdCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2hvc3QrKykgewogICAgZm9yIChuX3BvcnQgPSAwO25fcG9ydCA8IGdlbl9uYl9pbnQ7bl9wb3J0KyspIHsKICAgIGZvciAobl91c2VyID0gMDtuX3VzZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl91c2VyKyspIHsKICAgIGZvciAobl9wYXNzd2QgPSAwO25fcGFzc3dkIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fcGFzc3dkKyspIHsKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfaW50O25fdHlwZSsrKSB7CiAgICAgICAgaG9zdCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2hvc3QsIDApOwogICAgICAgIHBvcnQgPSBnZW5faW50KG5fcG9ydCwgMSk7CiAgICAgICAgdXNlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3VzZXIsIDIpOwogICAgICAgIHBhc3N3ZCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3Bhc3N3ZCwgMyk7CiAgICAgICAgdHlwZSA9IGdlbl9pbnQobl90eXBlLCA0KTsKCiAgICAgICAgeG1sTmFub0ZUUFByb3h5KChjb25zdCBjaGFyICopaG9zdCwgcG9ydCwgKGNvbnN0IGNoYXIgKil1c2VyLCAoY29uc3QgY2hhciAqKXBhc3N3ZCwgdHlwZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2hvc3QsIChjb25zdCBjaGFyICopaG9zdCwgMCk7CiAgICAgICAgZGVzX2ludChuX3BvcnQsIHBvcnQsIDEpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3VzZXIsIChjb25zdCBjaGFyICopdXNlciwgMik7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fcGFzc3dkLCAoY29uc3QgY2hhciAqKXBhc3N3ZCwgMyk7CiAgICAgICAgZGVzX2ludChuX3R5cGUsIHR5cGUsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBRdWl0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIGFuIEZUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0ZUUEN0eHRQdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBRdWl0KGN0eCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUFF1aXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUFJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIEZUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CiAgICB2b2lkICogZGVzdDsgLyogYSBidWZmZXIgKi8KICAgIGludCBuX2Rlc3Q7CiAgICBpbnQgbGVuOyAvKiB0aGUgYnVmZmVyIGxlbmd0aCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9GVFBDdHh0UHRyO25fY3R4KyspIHsKICAgIGZvciAobl9kZXN0ID0gMDtuX2Rlc3QgPCBnZW5fbmJfdm9pZF9wdHI7bl9kZXN0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIDApOwogICAgICAgIGRlc3QgPSBnZW5fdm9pZF9wdHIobl9kZXN0LCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBSZWFkKGN0eCwgZGVzdCwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fZGVzdCwgZGVzdCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9GVFBSZWFkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZXN0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBTY2FuUHJveHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIFRoZSBwcm94eSBVUkwgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcm94eSBjb250ZXh0ICovCiAgICBpbnQgbl9VUkw7CgogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMCk7CgogICAgICAgIHhtbE5hbm9GVFBTY2FuUHJveHkoVVJMKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBVcGRhdGVVUkwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogYW4gRlRQIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIFRoZSBVUkwgdXNlZCB0byB1cGRhdGUgdGhlIGNvbnRleHQgKi8KICAgIGludCBuX1VSTDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxOYW5vRlRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIDApOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOYW5vRlRQVXBkYXRlVVJMKGN0eCwgVVJMKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUFVwZGF0ZVVSTCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9uYW5vZnRwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBuYW5vZnRwIDogMTYgb2YgMjIgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBDaGVja1Jlc3BvbnNlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBDbGVhbnVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBDbG9zZUNvbm5lY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmFub0ZUUEN3ZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQRGVsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQR2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBHZXRDb25uZWN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBHZXRSZXNwb25zZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQR2V0U29ja2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBJbml0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBOZXdDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBPcGVuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBQcm94eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQUXVpdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQUmVhZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQU2NhblByb3h5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBVcGRhdGVVUkwoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIG5hbm9mdHA6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9IVFRQQXV0aEhlYWRlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IGNoYXIgKiByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIEhUVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9IVFRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0hUVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQQXV0aEhlYWRlcihjdHgpOwogICAgICAgIGRlc3JldF9jb25zdF9jaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9IVFRQQ3R4dFB0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQQXV0aEhlYWRlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vSFRUUENsZWFudXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVFRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbE5hbm9IVFRQQ2xlYW51cCgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQQ2xlYW51cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9IVFRQQ29udGVudExlbmd0aCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIEhUVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9IVFRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0hUVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQQ29udGVudExlbmd0aChjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vSFRUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vSFRUUENvbnRlbnRMZW5ndGgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBFbmNvZGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IGNoYXIgKiByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIEhUVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9IVFRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0hUVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQRW5jb2RpbmcoY3R4KTsKICAgICAgICBkZXNyZXRfY29uc3RfY2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vSFRUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vSFRUUEVuY29kaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfY2hhcl9wdHJfcHRyIDEKc3RhdGljIGNoYXIgKiogZ2VuX2NoYXJfcHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY2hhcl9wdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjaGFyICoqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBGZXRjaCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogVGhlIFVSTCB0byBsb2FkICovCiAgICBpbnQgbl9VUkw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgY29udGVudCBzaG91bGQgYmUgc2F2ZWQgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgY2hhciAqKiBjb250ZW50VHlwZTsgLyogaWYgYXZhaWxhYmxlIHRoZSBDb250ZW50LVR5cGUgaW5mb3JtYXRpb24gd2lsbCBiZSByZXR1cm5lZCBhdCB0aGF0IGxvY2F0aW9uICovCiAgICBpbnQgbl9jb250ZW50VHlwZTsKCiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlb3V0cHV0O25fVVJMKyspIHsKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2NvbnRlbnRUeXBlID0gMDtuX2NvbnRlbnRUeXBlIDwgZ2VuX25iX2NoYXJfcHRyX3B0cjtuX2NvbnRlbnRUeXBlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9maWxlb3V0cHV0KG5fVVJMLCAwKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDEpOwogICAgICAgIGNvbnRlbnRUeXBlID0gZ2VuX2NoYXJfcHRyX3B0cihuX2NvbnRlbnRUeXBlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQRmV0Y2goVVJMLCBmaWxlbmFtZSwgY29udGVudFR5cGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fVVJMLCBVUkwsIDApOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICBkZXNfY2hhcl9wdHJfcHRyKG5fY29udGVudFR5cGUsIGNvbnRlbnRUeXBlLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQRmV0Y2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnRUeXBlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBJbml0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICB4bWxOYW5vSFRUUEluaXQoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vSFRUUEluaXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vSFRUUE1pbWVUeXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgY2hhciAqIHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgSFRUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0hUVFBDdHh0UHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl94bWxOYW5vSFRUUEN0eHRQdHIobl9jdHgsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTmFub0hUVFBNaW1lVHlwZShjdHgpOwogICAgICAgIGRlc3JldF9jb25zdF9jaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9IVFRQQ3R4dFB0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQTWltZVR5cGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBPcGVuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiBUaGUgVVJMIHRvIGxvYWQgKi8KICAgIGludCBuX1VSTDsKICAgIGNoYXIgKiogY29udGVudFR5cGU7IC8qIGlmIGF2YWlsYWJsZSB0aGUgQ29udGVudC1UeXBlIGluZm9ybWF0aW9uIHdpbGwgYmUgcmV0dXJuZWQgYXQgdGhhdCBsb2NhdGlvbiAqLwogICAgaW50IG5fY29udGVudFR5cGU7CgogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX2NvbnRlbnRUeXBlID0gMDtuX2NvbnRlbnRUeXBlIDwgZ2VuX25iX2NoYXJfcHRyX3B0cjtuX2NvbnRlbnRUeXBlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMCk7CiAgICAgICAgY29udGVudFR5cGUgPSBnZW5fY2hhcl9wdHJfcHRyKG5fY29udGVudFR5cGUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmFub0hUVFBPcGVuKFVSTCwgY29udGVudFR5cGUpOwogICAgICAgIGRlc3JldF94bWxOYW5vSFRUUEN0eHRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSTCwgVVJMLCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHJfcHRyKG5fY29udGVudFR5cGUsIGNvbnRlbnRUeXBlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQT3BlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudFR5cGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vSFRUUE9wZW5SZWRpcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogVGhlIFVSTCB0byBsb2FkICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICoqIGNvbnRlbnRUeXBlOyAvKiBpZiBhdmFpbGFibGUgdGhlIENvbnRlbnQtVHlwZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJldHVybmVkIGF0IHRoYXQgbG9jYXRpb24gKi8KICAgIGludCBuX2NvbnRlbnRUeXBlOwogICAgY2hhciAqKiByZWRpcjsgLyogaWYgYXZhaWxhYmxlIHRoZSByZWRpcmVjdGVkIFVSTCB3aWxsIGJlIHJldHVybmVkICovCiAgICBpbnQgbl9yZWRpcjsKCiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fY29udGVudFR5cGUgPSAwO25fY29udGVudFR5cGUgPCBnZW5fbmJfY2hhcl9wdHJfcHRyO25fY29udGVudFR5cGUrKykgewogICAgZm9yIChuX3JlZGlyID0gMDtuX3JlZGlyIDwgZ2VuX25iX2NoYXJfcHRyX3B0cjtuX3JlZGlyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMCk7CiAgICAgICAgY29udGVudFR5cGUgPSBnZW5fY2hhcl9wdHJfcHRyKG5fY29udGVudFR5cGUsIDEpOwogICAgICAgIHJlZGlyID0gZ2VuX2NoYXJfcHRyX3B0cihuX3JlZGlyLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQT3BlblJlZGlyKFVSTCwgY29udGVudFR5cGUsIHJlZGlyKTsKICAgICAgICBkZXNyZXRfeG1sTmFub0hUVFBDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMCk7CiAgICAgICAgZGVzX2NoYXJfcHRyX3B0cihuX2NvbnRlbnRUeXBlLCBjb250ZW50VHlwZSwgMSk7CiAgICAgICAgZGVzX2NoYXJfcHRyX3B0cihuX3JlZGlyLCByZWRpciwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vSFRUUE9wZW5SZWRpciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudFR5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVkaXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vSFRUUFJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVFRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSBIVFRQIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKICAgIHZvaWQgKiBkZXN0OyAvKiBhIGJ1ZmZlciAqLwogICAgaW50IG5fZGVzdDsKICAgIGludCBsZW47IC8qIHRoZSBidWZmZXIgbGVuZ3RoICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0hUVFBDdHh0UHRyO25fY3R4KyspIHsKICAgIGZvciAobl9kZXN0ID0gMDtuX2Rlc3QgPCBnZW5fbmJfdm9pZF9wdHI7bl9kZXN0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0hUVFBDdHh0UHRyKG5fY3R4LCAwKTsKICAgICAgICBkZXN0ID0gZ2VuX3ZvaWRfcHRyKG5fZGVzdCwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxOYW5vSFRUUFJlYWQoY3R4LCBkZXN0LCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vSFRUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fZGVzdCwgZGVzdCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQUmVhZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVzdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vSFRUUFJlZGlyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9IVFRQUmV0dXJuQ29kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIEhUVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9IVFRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0hUVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQUmV0dXJuQ29kZShjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vSFRUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vSFRUUFJldHVybkNvZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBTYXZlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eHQ7IC8qIHRoZSBIVFRQIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgY29udGVudCBzaG91bGQgYmUgc2F2ZWQgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl92b2lkX3B0cihuX2N0eHQsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOYW5vSFRUUFNhdmUoY3R4dCwgZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQU2F2ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBTY2FuUHJveHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVFRQX0VOQUJMRUQpCiAgICBjb25zdCBjaGFyICogVVJMOyAvKiBUaGUgcHJveHkgVVJMIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJveHkgY29udGV4dCAqLwogICAgaW50IG5fVVJMOwoKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDApOwoKICAgICAgICB4bWxOYW5vSFRUUFNjYW5Qcm94eShVUkwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9uYW5vaHR0cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgbmFub2h0dHAgOiAxMyBvZiAxNyBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmFub0hUVFBBdXRoSGVhZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9IVFRQQ2xlYW51cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUENvbnRlbnRMZW5ndGgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmFub0hUVFBFbmNvZGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUEZldGNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9IVFRQSW5pdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUE1pbWVUeXBlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9IVFRQT3BlbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUE9wZW5SZWRpcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUFJlYWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmFub0hUVFBSZWRpcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUFJldHVybkNvZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmFub0hUVFBTYXZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9IVFRQU2NhblByb3h5KCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBuYW5vaHR0cDogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sQnl0ZUNvbnN1bWVkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgbG9uZyByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEJ5dGVDb25zdW1lZChjdHh0KTsKICAgICAgICBkZXNyZXRfbG9uZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ5dGVDb25zdW1lZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDbGVhck5vZGVJbmZvU2VxKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIgc2VxOyAvKiBhIG5vZGUgaW5mbyBzZXF1ZW5jZSBwb2ludGVyICovCiAgICBpbnQgbl9zZXE7CgogICAgZm9yIChuX3NlcSA9IDA7bl9zZXEgPCBnZW5fbmJfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHI7bl9zZXErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc2VxID0gZ2VuX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKG5fc2VxLCAwKTsKCiAgICAgICAgeG1sQ2xlYXJOb2RlSW5mb1NlcShzZXEpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIobl9zZXEsIHNlcSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDbGVhck5vZGVJbmZvU2VxIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NlcSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2xlYXJQYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sQ2xlYXJQYXJzZXJDdHh0KGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2xlYXJQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENyZWF0ZURvY1BhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgeG1sQ2hhciAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDcmVhdGVEb2NQYXJzZXJDdHh0KChjb25zdCB4bWxDaGFyICopY3VyKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDcmVhdGVEb2NQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9QVVNIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogYSBTQVggaGFuZGxlciAqLwogICAgaW50IG5fc2F4OwogICAgdm9pZCAqIHVzZXJfZGF0YTsgLyogVGhlIHVzZXIgZGF0YSByZXR1cm5lZCBvbiBTQVggY2FsbGJhY2tzICovCiAgICBpbnQgbl91c2VyX2RhdGE7CiAgICBjaGFyICogY2h1bms7IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjaGFycyAqLwogICAgaW50IG5fY2h1bms7CiAgICBpbnQgc2l6ZTsgLyogbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYW4gb3B0aW9uYWwgZmlsZSBuYW1lIG9yIFVSSSAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fdXNlcl9kYXRhID0gMDtuX3VzZXJfZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJfZGF0YSsrKSB7CiAgICBmb3IgKG5fY2h1bmsgPSAwO25fY2h1bmsgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9jaHVuaysrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMCk7CiAgICAgICAgdXNlcl9kYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCAxKTsKICAgICAgICBjaHVuayA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2NodW5rLCAyKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDMpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dChzYXgsIHVzZXJfZGF0YSwgKGNvbnN0IGNoYXIgKiljaHVuaywgc2l6ZSwgZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAwKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyX2RhdGEsIHVzZXJfZGF0YSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fY2h1bmssIChjb25zdCBjaGFyICopY2h1bmssIDIpOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAzKTsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NodW5rKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDdHh0UmVhZERvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nICovCiAgICBpbnQgbl9jdXI7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX1VSTDsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAxKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDIpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDMpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sQ3R4dFJlYWREb2MoY3R4dCwgKGNvbnN0IHhtbENoYXIgKiljdXIsIFVSTCwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIChjb25zdCB4bWxDaGFyICopY3VyLCAxKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMik7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDMpOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDdHh0UmVhZERvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3R4dFJlYWRGaWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX3BhcnNlcm9wdGlvbnM7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sQ3R4dFJlYWRGaWxlKGN0eHQsIGZpbGVuYW1lLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDdHh0UmVhZEZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDdHh0UmVhZE1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9wYXJzZXJvcHRpb25zO25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBidWZmZXIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIDEpOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMik7CiAgICAgICAgVVJMID0gZ2VuX2ZpbGVwYXRoKG5fVVJMLCAzKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCA0KTsKICAgICAgICBvcHRpb25zID0gZ2VuX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEN0eHRSZWFkTWVtb3J5KGN0eHQsIChjb25zdCBjaGFyICopYnVmZmVyLCBzaXplLCBVUkwsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgMSk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDIpOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSTCwgVVJMLCAzKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgNCk7CiAgICAgICAgZGVzX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCBvcHRpb25zLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEN0eHRSZWFkTWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEN0eHRSZXNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbEN0eHRSZXNldChjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEN0eHRSZXNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDdHh0UmVzZXRQdXNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBjaHVuazsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNoYXJzICovCiAgICBpbnQgbl9jaHVuazsKICAgIGludCBzaXplOyAvKiBudW1iZXIgb2YgY2hhcnMgaW4gdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiBhbiBvcHRpb25hbCBmaWxlIG5hbWUgb3IgVVJJICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jaHVuayA9IDA7bl9jaHVuayA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2NodW5rKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjaHVuayA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2NodW5rLCAxKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDIpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDMpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sQ3R4dFJlc2V0UHVzaChjdHh0LCAoY29uc3QgY2hhciAqKWNodW5rLCBzaXplLCBmaWxlbmFtZSwgKGNvbnN0IGNoYXIgKillbmNvZGluZyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9jaHVuaywgKGNvbnN0IGNoYXIgKiljaHVuaywgMSk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDIpOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMyk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ3R4dFJlc2V0UHVzaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NodW5rKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEN0eHRVc2VPcHRpb25zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDdHh0VXNlT3B0aW9ucyhjdHh0LCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDdHh0VXNlT3B0aW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldEV4dGVybmFsRW50aXR5TG9hZGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldEZlYXR1cmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9MRUdBQ1lfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9MRUdBQ1lfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTC9IVE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIG5hbWU7IC8qIHRoZSBmZWF0dXJlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB2b2lkICogcmVzdWx0OyAvKiBsb2NhdGlvbiB0byBzdG9yZSB0aGUgcmVzdWx0ICovCiAgICBpbnQgbl9yZXN1bHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcmVzdWx0ID0gMDtuX3Jlc3VsdCA8IGdlbl9uYl92b2lkX3B0cjtuX3Jlc3VsdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgcmVzdWx0ID0gZ2VuX3ZvaWRfcHRyKG5fcmVzdWx0LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldEZlYXR1cmUoY3R4dCwgKGNvbnN0IGNoYXIgKiluYW1lLCByZXN1bHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IGNoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfdm9pZF9wdHIobl9yZXN1bHQsIHJlc3VsdCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXRGZWF0dXJlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXN1bHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl9jb25zdF9jaGFyX3B0cl9wdHIgMQpzdGF0aWMgY2hhciAqKiBnZW5fY29uc3RfY2hhcl9wdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19jb25zdF9jaGFyX3B0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGNoYXIgKiogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRGZWF0dXJlc0xpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9MRUdBQ1lfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9MRUdBQ1lfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgKiBsZW47IC8qIHRoZSBsZW5ndGggb2YgdGhlIGZlYXR1cmVzIG5hbWUgYXJyYXkgKGlucHV0L291dHB1dCkgKi8KICAgIGludCBuX2xlbjsKICAgIGNoYXIgKiogcmVzdWx0OyAvKiBhbiBhcnJheSBvZiBzdHJpbmcgdG8gYmUgZmlsbGVkIHdpdGggdGhlIGZlYXR1cmVzIG5hbWUuICovCiAgICBpbnQgbl9yZXN1bHQ7CgogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2xlbisrKSB7CiAgICBmb3IgKG5fcmVzdWx0ID0gMDtuX3Jlc3VsdCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cl9wdHI7bl9yZXN1bHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbGVuID0gZ2VuX2ludF9wdHIobl9sZW4sIDApOwogICAgICAgIHJlc3VsdCA9IGdlbl9jb25zdF9jaGFyX3B0cl9wdHIobl9yZXN1bHQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0RmVhdHVyZXNMaXN0KGxlbiwgKGNvbnN0IGNoYXIgKiopcmVzdWx0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50X3B0cihuX2xlbiwgbGVuLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHJfcHRyKG5fcmVzdWx0LCAoY29uc3QgY2hhciAqKilyZXN1bHQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0RmVhdHVyZXNMaXN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXN1bHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSU9QYXJzZURURCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRHRkUHRyIHJldF92YWw7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2NrIG9yIE5VTEwgKi8KICAgIGludCBuX3NheDsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGlucHV0OyAvKiBhbiBJbnB1dCBCdWZmZXIgKi8KICAgIGludCBuX2lucHV0OwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogdGhlIGNoYXJzZXQgZW5jb2RpbmcgaWYga25vd24gKi8KICAgIGludCBuX2VuYzsKCiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl9pbnB1dCA9IDA7bl9pbnB1dCA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cjtuX2lucHV0KyspIHsKICAgIGZvciAobl9lbmMgPSAwO25fZW5jIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZztuX2VuYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMCk7CiAgICAgICAgaW5wdXQgPSBnZW5feG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbnB1dCwgMSk7CiAgICAgICAgZW5jID0gZ2VuX3htbENoYXJFbmNvZGluZyhuX2VuYywgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxJT1BhcnNlRFREKHNheCwgaW5wdXQsIGVuYyk7CiAgICAgICAgaW5wdXQgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxEdGRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDApOwogICAgICAgIGRlc194bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2lucHV0LCBpbnB1dCwgMSk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElPUGFyc2VEVEQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2lucHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJbml0Tm9kZUluZm9TZXEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciBzZXE7IC8qIGEgbm9kZSBpbmZvIHNlcXVlbmNlIHBvaW50ZXIgKi8KICAgIGludCBuX3NlcTsKCiAgICBmb3IgKG5fc2VxID0gMDtuX3NlcSA8IGdlbl9uYl94bWxQYXJzZXJOb2RlSW5mb1NlcVB0cjtuX3NlcSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzZXEgPSBnZW5feG1sUGFyc2VyTm9kZUluZm9TZXFQdHIobl9zZXEsIDApOwoKICAgICAgICB4bWxJbml0Tm9kZUluZm9TZXEoc2VxKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKG5fc2VxLCBzZXEsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSW5pdE5vZGVJbmZvU2VxIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NlcSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSW5pdFBhcnNlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sSW5pdFBhcnNlcigpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEluaXRQYXJzZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEluaXRQYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSW5pdFBhcnNlckN0eHQoY3R4dCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEluaXRQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEtlZXBCbGFua3NEZWZhdWx0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgdmFsOyAvKiBpbnQgMCBvciAxICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9pbnQobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sS2VlcEJsYW5rc0RlZmF1bHQodmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sS2VlcEJsYW5rc0RlZmF1bHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaW5lTnVtYmVyc0RlZmF1bHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCB2YWw7IC8qIGludCAwIG9yIDEgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9pbnQ7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2ludChuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxMaW5lTnVtYmVyc0RlZmF1bHQodmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGluZU51bWJlcnNEZWZhdWx0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTG9hZEV4dGVybmFsRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIHRoZSBVUkwgZm9yIHRoZSBlbnRpdHkgdG8gbG9hZCAqLwogICAgaW50IG5fVVJMOwogICAgY2hhciAqIElEOyAvKiB0aGUgUHVibGljIElEIGZvciB0aGUgZW50aXR5IHRvIGxvYWQgKi8KICAgIGludCBuX0lEOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgZW50aXR5IGlzIGNhbGxlZCBvciBOVUxMICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9JRCA9IDA7bl9JRCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX0lEKyspIHsKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJMID0gZ2VuX2ZpbGVwYXRoKG5fVVJMLCAwKTsKICAgICAgICBJRCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX0lELCAxKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExvYWRFeHRlcm5hbEVudGl0eShVUkwsIChjb25zdCBjaGFyICopSUQsIGN0eHQpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJJbnB1dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX0lELCAoY29uc3QgY2hhciAqKUlELCAxKTsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTG9hZEV4dGVybmFsRW50aXR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9JRCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdJT0lucHV0U3RyZWFtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgaW5wdXQ7IC8qIGFuIEkvTyBJbnB1dCAqLwogICAgaW50IG5faW5wdXQ7CiAgICB4bWxDaGFyRW5jb2RpbmcgZW5jOyAvKiB0aGUgY2hhcnNldCBlbmNvZGluZyBpZiBrbm93biAqLwogICAgaW50IG5fZW5jOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2lucHV0ID0gMDtuX2lucHV0IDwgZ2VuX25iX3htbFBhcnNlcklucHV0QnVmZmVyUHRyO25faW5wdXQrKykgewogICAgZm9yIChuX2VuYyA9IDA7bl9lbmMgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nO25fZW5jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGlucHV0ID0gZ2VuX3htbFBhcnNlcklucHV0QnVmZmVyUHRyKG5faW5wdXQsIDEpOwogICAgICAgIGVuYyA9IGdlbl94bWxDaGFyRW5jb2Rpbmcobl9lbmMsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3SU9JbnB1dFN0cmVhbShjdHh0LCBpbnB1dCwgZW5jKTsKICAgICAgICBpZiAocmV0X3ZhbCAhPSBOVUxMKSBpbnB1dCA9IE5VTEw7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlcklucHV0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2lucHV0LCBpbnB1dCwgMSk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0lPSW5wdXRTdHJlYW0iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbnB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld1BhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdQYXJzZXJDdHh0KCk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlckN0eHRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3UGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxOb2RlUHRyX3B0ciAxCnN0YXRpYyB4bWxOb2RlUHRyICogZ2VuX3htbE5vZGVQdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxOb2RlUHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTm9kZVB0ciAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgdGhlIGNodW5rIHBlcnRhaW5zIHRvICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2MgKHBvc3NpYmx5IE5VTEwpICovCiAgICBpbnQgbl9zYXg7CiAgICB2b2lkICogdXNlcl9kYXRhOyAvKiBUaGUgdXNlciBkYXRhIHJldHVybmVkIG9uIFNBWCBjYWxsYmFja3MgKHBvc3NpYmx5IE5VTEwpICovCiAgICBpbnQgbl91c2VyX2RhdGE7CiAgICBpbnQgZGVwdGg7IC8qIFVzZWQgZm9yIGxvb3AgZGV0ZWN0aW9uLCB1c2UgMCAqLwogICAgaW50IG5fZGVwdGg7CiAgICB4bWxDaGFyICogc3RyaW5nOyAvKiB0aGUgaW5wdXQgc3RyaW5nIGluIFVURjggb3IgSVNPLUxhdGluICh6ZXJvIHRlcm1pbmF0ZWQpICovCiAgICBpbnQgbl9zdHJpbmc7CiAgICB4bWxOb2RlUHRyICogbHN0OyAvKiB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgc2V0IG9mIHBhcnNlZCBub2RlcyAqLwogICAgaW50IG5fbHN0OwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl91c2VyX2RhdGEgPSAwO25fdXNlcl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlcl9kYXRhKyspIHsKICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CiAgICBmb3IgKG5fc3RyaW5nID0gMDtuX3N0cmluZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cmluZysrKSB7CiAgICBmb3IgKG5fbHN0ID0gMDtuX2xzdCA8IGdlbl9uYl94bWxOb2RlUHRyX3B0cjtuX2xzdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMSk7CiAgICAgICAgdXNlcl9kYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCAyKTsKICAgICAgICBkZXB0aCA9IGdlbl9pbnQobl9kZXB0aCwgMyk7CiAgICAgICAgc3RyaW5nID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyaW5nLCA0KTsKICAgICAgICBsc3QgPSBnZW5feG1sTm9kZVB0cl9wdHIobl9sc3QsIDUpOwogICAgICAgIAojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgICAgIGlmIChzYXggPT0gKHhtbFNBWEhhbmRsZXJQdHIpJnhtbERlZmF1bHRTQVhIYW5kbGVyKSB1c2VyX2RhdGEgPSBOVUxMOwojZW5kaWYKCgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnkoZG9jLCBzYXgsIHVzZXJfZGF0YSwgZGVwdGgsIChjb25zdCB4bWxDaGFyICopc3RyaW5nLCBsc3QpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMSk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCB1c2VyX2RhdGEsIDIpOwogICAgICAgIGRlc19pbnQobl9kZXB0aCwgZGVwdGgsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cmluZywgKGNvbnN0IHhtbENoYXIgKilzdHJpbmcsIDQpOwogICAgICAgIGRlc194bWxOb2RlUHRyX3B0cihuX2xzdCwgbHN0LCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlQmFsYW5jZWRDaHVua01lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJfZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZXB0aCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHJpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbHN0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlQmFsYW5jZWRDaHVua01lbW9yeVJlY292ZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCB0aGUgY2h1bmsgcGVydGFpbnMgdG8gKi8KICAgIGludCBuX2RvYzsKICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvYyAocG9zc2libHkgTlVMTCkgKi8KICAgIGludCBuX3NheDsKICAgIHZvaWQgKiB1c2VyX2RhdGE7IC8qIFRoZSB1c2VyIGRhdGEgcmV0dXJuZWQgb24gU0FYIGNhbGxiYWNrcyAocG9zc2libHkgTlVMTCkgKi8KICAgIGludCBuX3VzZXJfZGF0YTsKICAgIGludCBkZXB0aDsgLyogVXNlZCBmb3IgbG9vcCBkZXRlY3Rpb24sIHVzZSAwICovCiAgICBpbnQgbl9kZXB0aDsKICAgIHhtbENoYXIgKiBzdHJpbmc7IC8qIHRoZSBpbnB1dCBzdHJpbmcgaW4gVVRGOCBvciBJU08tTGF0aW4gKHplcm8gdGVybWluYXRlZCkgKi8KICAgIGludCBuX3N0cmluZzsKICAgIHhtbE5vZGVQdHIgKiBsc3Q7IC8qIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBzZXQgb2YgcGFyc2VkIG5vZGVzICovCiAgICBpbnQgbl9sc3Q7CiAgICBpbnQgcmVjb3ZlcjsgLyogcmV0dXJuIG5vZGVzIGV2ZW4gaWYgdGhlIGRhdGEgaXMgYnJva2VuICh1c2UgMCkgKi8KICAgIGludCBuX3JlY292ZXI7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgewogICAgZm9yIChuX3VzZXJfZGF0YSA9IDA7bl91c2VyX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyX2RhdGErKykgewogICAgZm9yIChuX2RlcHRoID0gMDtuX2RlcHRoIDwgZ2VuX25iX2ludDtuX2RlcHRoKyspIHsKICAgIGZvciAobl9zdHJpbmcgPSAwO25fc3RyaW5nIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyaW5nKyspIHsKICAgIGZvciAobl9sc3QgPSAwO25fbHN0IDwgZ2VuX25iX3htbE5vZGVQdHJfcHRyO25fbHN0KyspIHsKICAgIGZvciAobl9yZWNvdmVyID0gMDtuX3JlY292ZXIgPCBnZW5fbmJfaW50O25fcmVjb3ZlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMSk7CiAgICAgICAgdXNlcl9kYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCAyKTsKICAgICAgICBkZXB0aCA9IGdlbl9pbnQobl9kZXB0aCwgMyk7CiAgICAgICAgc3RyaW5nID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyaW5nLCA0KTsKICAgICAgICBsc3QgPSBnZW5feG1sTm9kZVB0cl9wdHIobl9sc3QsIDUpOwogICAgICAgIHJlY292ZXIgPSBnZW5faW50KG5fcmVjb3ZlciwgNik7CiAgICAgICAgCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICAgICAgaWYgKHNheCA9PSAoeG1sU0FYSGFuZGxlclB0cikmeG1sRGVmYXVsdFNBWEhhbmRsZXIpIHVzZXJfZGF0YSA9IE5VTEw7CiNlbmRpZgoKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlQmFsYW5jZWRDaHVua01lbW9yeVJlY292ZXIoZG9jLCBzYXgsIHVzZXJfZGF0YSwgZGVwdGgsIChjb25zdCB4bWxDaGFyICopc3RyaW5nLCBsc3QsIHJlY292ZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMSk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCB1c2VyX2RhdGEsIDIpOwogICAgICAgIGRlc19pbnQobl9kZXB0aCwgZGVwdGgsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cmluZywgKGNvbnN0IHhtbENoYXIgKilzdHJpbmcsIDQpOwogICAgICAgIGRlc194bWxOb2RlUHRyX3B0cihuX2xzdCwgbHN0LCA1KTsKICAgICAgICBkZXNfaW50KG5fcmVjb3ZlciwgcmVjb3ZlciwgNik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnlSZWNvdmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlcHRoKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cmluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sc3QpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVjb3Zlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZUNodW5rKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUFVTSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBjaHVuazsgLyogYW4gY2hhciBhcnJheSAqLwogICAgaW50IG5fY2h1bms7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgaW4gYnl0ZSBvZiB0aGUgY2h1bmsgKi8KICAgIGludCBuX3NpemU7CiAgICBpbnQgdGVybWluYXRlOyAvKiBsYXN0IGNodW5rIGluZGljYXRvciAqLwogICAgaW50IG5fdGVybWluYXRlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2NodW5rID0gMDtuX2NodW5rIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fY2h1bmsrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgIGZvciAobl90ZXJtaW5hdGUgPSAwO25fdGVybWluYXRlIDwgZ2VuX25iX2ludDtuX3Rlcm1pbmF0ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjaHVuayA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2NodW5rLCAxKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDIpOwogICAgICAgIHRlcm1pbmF0ZSA9IGdlbl9pbnQobl90ZXJtaW5hdGUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VDaHVuayhjdHh0LCAoY29uc3QgY2hhciAqKWNodW5rLCBzaXplLCB0ZXJtaW5hdGUpOwogICAgICAgIGlmIChjdHh0ICE9IE5VTEwpIHt4bWxGcmVlRG9jKGN0eHQtPm15RG9jKTsgY3R4dC0+bXlEb2MgPSBOVUxMO30KICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2NodW5rLCAoY29uc3QgY2hhciAqKWNodW5rLCAxKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMik7CiAgICAgICAgZGVzX2ludChuX3Rlcm1pbmF0ZSwgdGVybWluYXRlLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlQ2h1bmsiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jaHVuayk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3Rlcm1pbmF0ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlQ3R4dEV4dGVybmFsRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eDsgLyogdGhlIGV4aXN0aW5nIHBhcnNpbmcgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIFVSTDsgLyogdGhlIFVSTCBmb3IgdGhlIGVudGl0eSB0byBsb2FkICovCiAgICBpbnQgbl9VUkw7CiAgICB4bWxDaGFyICogSUQ7IC8qIHRoZSBTeXN0ZW0gSUQgZm9yIHRoZSBlbnRpdHkgdG8gbG9hZCAqLwogICAgaW50IG5fSUQ7CiAgICB4bWxOb2RlUHRyICogbHN0OyAvKiB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgc2V0IG9mIHBhcnNlZCBub2RlcyAqLwogICAgaW50IG5fbHN0OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHgrKykgewogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9VUkwrKykgewogICAgZm9yIChuX0lEID0gMDtuX0lEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fSUQrKykgewogICAgZm9yIChuX2xzdCA9IDA7bl9sc3QgPCBnZW5fbmJfeG1sTm9kZVB0cl9wdHI7bl9sc3QrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHgsIDApOwogICAgICAgIFVSTCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1VSTCwgMSk7CiAgICAgICAgSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9JRCwgMik7CiAgICAgICAgbHN0ID0gZ2VuX3htbE5vZGVQdHJfcHRyKG5fbHN0LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlQ3R4dEV4dGVybmFsRW50aXR5KGN0eCwgKGNvbnN0IHhtbENoYXIgKilVUkwsIChjb25zdCB4bWxDaGFyICopSUQsIGxzdCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fVVJMLCAoY29uc3QgeG1sQ2hhciAqKVVSTCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fSUQsIChjb25zdCB4bWxDaGFyICopSUQsIDIpOwogICAgICAgIGRlc194bWxOb2RlUHRyX3B0cihuX2xzdCwgbHN0LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlQ3R4dEV4dGVybmFsRW50aXR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbHN0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZURURCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRHRkUHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogYSBOQU1FKiBjb250YWluaW5nIHRoZSBFeHRlcm5hbCBJRCBvZiB0aGUgRFREICovCiAgICBpbnQgbl9FeHRlcm5hbElEOwogICAgeG1sQ2hhciAqIFN5c3RlbUlEOyAvKiBhIE5BTUUqIGNvbnRhaW5pbmcgdGhlIFVSTCB0byB0aGUgRFREICovCiAgICBpbnQgbl9TeXN0ZW1JRDsKCiAgICBmb3IgKG5fRXh0ZXJuYWxJRCA9IDA7bl9FeHRlcm5hbElEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fRXh0ZXJuYWxJRCsrKSB7CiAgICBmb3IgKG5fU3lzdGVtSUQgPSAwO25fU3lzdGVtSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9TeXN0ZW1JRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBFeHRlcm5hbElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgMCk7CiAgICAgICAgU3lzdGVtSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9TeXN0ZW1JRCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZURURCgoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQpOwogICAgICAgIGRlc3JldF94bWxEdGRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopRXh0ZXJuYWxJRCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VEVEQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fRXh0ZXJuYWxJRCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9TeXN0ZW1JRCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZURvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHhtbENoYXIgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VEb2MoKGNvbnN0IHhtbENoYXIgKiljdXIpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgKGNvbnN0IHhtbENoYXIgKiljdXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VEb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlRG9jdW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZURvY3VtZW50KGN0eHQpOwogICAgICAgIGlmIChjdHh0ICE9IE5VTEwpIHt4bWxGcmVlRG9jKGN0eHQtPm15RG9jKTsgY3R4dC0+bXlEb2MgPSBOVUxMO30KICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VEb2N1bWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZUVudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VFbnRpdHkoZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZUVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZUV4dFBhcnNlZEVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlRXh0UGFyc2VkRW50KGN0eHQpOwogICAgICAgIGlmIChjdHh0ICE9IE5VTEwpIHt4bWxGcmVlRG9jKGN0eHQtPm15RG9jKTsgY3R4dC0+bXlEb2MgPSBOVUxMO30KICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VFeHRQYXJzZWRFbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VFeHRlcm5hbEVudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50IHRoZSBjaHVuayBwZXJ0YWlucyB0byAqLwogICAgaW50IG5fZG9jOwogICAgeG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jIChwb3NzaWJseSBOVUxMKSAqLwogICAgaW50IG5fc2F4OwogICAgdm9pZCAqIHVzZXJfZGF0YTsgLyogVGhlIHVzZXIgZGF0YSByZXR1cm5lZCBvbiBTQVggY2FsbGJhY2tzIChwb3NzaWJseSBOVUxMKSAqLwogICAgaW50IG5fdXNlcl9kYXRhOwogICAgaW50IGRlcHRoOyAvKiBVc2VkIGZvciBsb29wIGRldGVjdGlvbiwgdXNlIDAgKi8KICAgIGludCBuX2RlcHRoOwogICAgeG1sQ2hhciAqIFVSTDsgLyogdGhlIFVSTCBmb3IgdGhlIGVudGl0eSB0byBsb2FkICovCiAgICBpbnQgbl9VUkw7CiAgICB4bWxDaGFyICogSUQ7IC8qIHRoZSBTeXN0ZW0gSUQgZm9yIHRoZSBlbnRpdHkgdG8gbG9hZCAqLwogICAgaW50IG5fSUQ7CiAgICB4bWxOb2RlUHRyICogbHN0OyAvKiB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgc2V0IG9mIHBhcnNlZCBub2RlcyAqLwogICAgaW50IG5fbHN0OwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl91c2VyX2RhdGEgPSAwO25fdXNlcl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlcl9kYXRhKyspIHsKICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSTCsrKSB7CiAgICBmb3IgKG5fSUQgPSAwO25fSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9JRCsrKSB7CiAgICBmb3IgKG5fbHN0ID0gMDtuX2xzdCA8IGdlbl9uYl94bWxOb2RlUHRyX3B0cjtuX2xzdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMSk7CiAgICAgICAgdXNlcl9kYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCAyKTsKICAgICAgICBkZXB0aCA9IGdlbl9pbnQobl9kZXB0aCwgMyk7CiAgICAgICAgVVJMID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJMLCA0KTsKICAgICAgICBJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0lELCA1KTsKICAgICAgICBsc3QgPSBnZW5feG1sTm9kZVB0cl9wdHIobl9sc3QsIDYpOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VFeHRlcm5hbEVudGl0eShkb2MsIHNheCwgdXNlcl9kYXRhLCBkZXB0aCwgKGNvbnN0IHhtbENoYXIgKilVUkwsIChjb25zdCB4bWxDaGFyICopSUQsIGxzdCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAxKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyX2RhdGEsIHVzZXJfZGF0YSwgMik7CiAgICAgICAgZGVzX2ludChuX2RlcHRoLCBkZXB0aCwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fVVJMLCAoY29uc3QgeG1sQ2hhciAqKVVSTCwgNCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fSUQsIChjb25zdCB4bWxDaGFyICopSUQsIDUpOwogICAgICAgIGRlc194bWxOb2RlUHRyX3B0cihuX2xzdCwgbHN0LCA2KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlRXh0ZXJuYWxFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91c2VyX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVwdGgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX0lEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xzdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZUZpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lICovCiAgICBpbnQgbl9maWxlbmFtZTsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlRmlsZShmaWxlbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZUluTm9kZUNvbnRleHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJFcnJvcnMgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIGNvbnRleHQgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIGNoYXIgKiBkYXRhOyAvKiB0aGUgaW5wdXQgc3RyaW5nICovCiAgICBpbnQgbl9kYXRhOwogICAgaW50IGRhdGFsZW47IC8qIHRoZSBpbnB1dCBzdHJpbmcgbGVuZ3RoIGluIGJ5dGVzICovCiAgICBpbnQgbl9kYXRhbGVuOwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgeG1sUGFyc2VyT3B0aW9uICovCiAgICBpbnQgbl9vcHRpb25zOwogICAgeG1sTm9kZVB0ciAqIGxzdDsgLyogdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIHNldCBvZiBwYXJzZWQgbm9kZXMgKi8KICAgIGludCBuX2xzdDsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9kYXRhKyspIHsKICAgIGZvciAobl9kYXRhbGVuID0gMDtuX2RhdGFsZW4gPCBnZW5fbmJfaW50O25fZGF0YWxlbisrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX3BhcnNlcm9wdGlvbnM7bl9vcHRpb25zKyspIHsKICAgIGZvciAobl9sc3QgPSAwO25fbHN0IDwgZ2VuX25iX3htbE5vZGVQdHJfcHRyO25fbHN0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIGRhdGEgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9kYXRhLCAxKTsKICAgICAgICBkYXRhbGVuID0gZ2VuX2ludChuX2RhdGFsZW4sIDIpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDMpOwogICAgICAgIGxzdCA9IGdlbl94bWxOb2RlUHRyX3B0cihuX2xzdCwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZUluTm9kZUNvbnRleHQobm9kZSwgKGNvbnN0IGNoYXIgKilkYXRhLCBkYXRhbGVuLCBvcHRpb25zLCBsc3QpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJFcnJvcnMocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZGF0YSwgKGNvbnN0IGNoYXIgKilkYXRhLCAxKTsKICAgICAgICBkZXNfaW50KG5fZGF0YWxlbiwgZGF0YWxlbiwgMik7CiAgICAgICAgZGVzX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCBvcHRpb25zLCAzKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9wdHIobl9sc3QsIGxzdCwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZUluTm9kZUNvbnRleHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGFsZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sc3QpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhbiBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKCiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAwKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VNZW1vcnkoKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIDApOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlTWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9QdHIgMQpzdGF0aWMgeG1sUGFyc2VyTm9kZUluZm9QdHIgZ2VuX2NvbnN0X3htbFBhcnNlck5vZGVJbmZvUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19jb25zdF94bWxQYXJzZXJOb2RlSW5mb1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sUGFyc2VyTm9kZUluZm9QdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJBZGROb2RlSW5mbyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sUGFyc2VyTm9kZUluZm9QdHIgaW5mbzsgLyogYSBub2RlIGluZm8gc2VxdWVuY2UgcG9pbnRlciAqLwogICAgaW50IG5faW5mbzsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9pbmZvID0gMDtuX2luZm8gPCBnZW5fbmJfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9QdHI7bl9pbmZvKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGluZm8gPSBnZW5fY29uc3RfeG1sUGFyc2VyTm9kZUluZm9QdHIobl9pbmZvLCAxKTsKCiAgICAgICAgeG1sUGFyc2VyQWRkTm9kZUluZm8oY3R4dCwgKGNvbnN0IHhtbFBhcnNlck5vZGVJbmZvUHRyKWluZm8pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxQYXJzZXJOb2RlSW5mb1B0cihuX2luZm8sIChjb25zdCB4bWxQYXJzZXJOb2RlSW5mb1B0cilpbmZvLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlckFkZE5vZGVJbmZvIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5mbyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl9jb25zdF94bWxQYXJzZXJDdHh0UHRyIDEKc3RhdGljIHhtbFBhcnNlckN0eHRQdHIgZ2VuX2NvbnN0X3htbFBhcnNlckN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbFBhcnNlckN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbFBhcnNlckN0eHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbE5vZGVQdHIgMQpzdGF0aWMgeG1sTm9kZVB0ciBnZW5fY29uc3RfeG1sTm9kZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY29uc3RfeG1sTm9kZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sTm9kZVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlckZpbmROb2RlSW5mbyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbFBhcnNlck5vZGVJbmZvICogcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYW4gWE1MIG5vZGUgd2l0aGluIHRoZSB0cmVlICovCiAgICBpbnQgbl9ub2RlOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX2NvbnN0X3htbFBhcnNlckN0eHRQdHI7bl9jdHgrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl9jb25zdF94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fY29uc3RfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eCwgMCk7CiAgICAgICAgbm9kZSA9IGdlbl9jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZXJGaW5kTm9kZUluZm8oKGNvbnN0IHhtbFBhcnNlckN0eHRQdHIpY3R4LCAoY29uc3QgeG1sTm9kZVB0cilub2RlKTsKICAgICAgICBkZXNyZXRfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9fcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eCwgKGNvbnN0IHhtbFBhcnNlckN0eHRQdHIpY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sTm9kZVB0cihuX25vZGUsIChjb25zdCB4bWxOb2RlUHRyKW5vZGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VyRmluZE5vZGVJbmZvIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbFBhcnNlck5vZGVJbmZvU2VxUHRyIDEKc3RhdGljIHhtbFBhcnNlck5vZGVJbmZvU2VxUHRyIGdlbl9jb25zdF94bWxQYXJzZXJOb2RlSW5mb1NlcVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbFBhcnNlck5vZGVJbmZvU2VxUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VyRmluZE5vZGVJbmZvSW5kZXgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB1bnNpZ25lZCBsb25nIHJldF92YWw7CiAgICB4bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciBzZXE7IC8qIGEgbm9kZSBpbmZvIHNlcXVlbmNlIHBvaW50ZXIgKi8KICAgIGludCBuX3NlcTsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYW4gWE1MIG5vZGUgcG9pbnRlciAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fc2VxID0gMDtuX3NlcSA8IGdlbl9uYl9jb25zdF94bWxQYXJzZXJOb2RlSW5mb1NlcVB0cjtuX3NlcSsrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX2NvbnN0X3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNlcSA9IGdlbl9jb25zdF94bWxQYXJzZXJOb2RlSW5mb1NlcVB0cihuX3NlcSwgMCk7CiAgICAgICAgbm9kZSA9IGdlbl9jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZXJGaW5kTm9kZUluZm9JbmRleCgoY29uc3QgeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIpc2VxLCAoY29uc3QgeG1sTm9kZVB0cilub2RlKTsKICAgICAgICBkZXNyZXRfdW5zaWduZWRfbG9uZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKG5fc2VxLCAoY29uc3QgeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIpc2VxLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sTm9kZVB0cihuX25vZGUsIChjb25zdCB4bWxOb2RlUHRyKW5vZGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VyRmluZE5vZGVJbmZvSW5kZXgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2VxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sUGFyc2VySW5wdXRQdHIgMQpzdGF0aWMgeG1sUGFyc2VySW5wdXRQdHIgZ2VuX3htbFBhcnNlcklucHV0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxQYXJzZXJJbnB1dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUGFyc2VySW5wdXRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJJbnB1dEdyb3codm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlcklucHV0UHRyIGluOyAvKiBhbiBYTUwgcGFyc2VyIGlucHV0ICovCiAgICBpbnQgbl9pbjsKICAgIGludCBsZW47IC8qIGFuIGluZGljYXRpdmUgc2l6ZSBmb3IgdGhlIGxvb2thaGVhZCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dFB0cjtuX2luKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBpbiA9IGdlbl94bWxQYXJzZXJJbnB1dFB0cihuX2luLCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0R3JvdyhpbiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRQdHIobl9pbiwgaW4sIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJJbnB1dEdyb3ciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJJbnB1dFJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlcklucHV0UHRyIGluOyAvKiBhbiBYTUwgcGFyc2VyIGlucHV0ICovCiAgICBpbnQgbl9pbjsKICAgIGludCBsZW47IC8qIGFuIGluZGljYXRpdmUgc2l6ZSBmb3IgdGhlIGxvb2thaGVhZCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dFB0cjtuX2luKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBpbiA9IGdlbl94bWxQYXJzZXJJbnB1dFB0cihuX2luLCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0UmVhZChpbiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRQdHIobl9pbiwgaW4sIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJJbnB1dFJlYWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQZWRhbnRpY1BhcnNlckRlZmF1bHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCB2YWw7IC8qIGludCAwIG9yIDEgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9pbnQ7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2ludChuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxQZWRhbnRpY1BhcnNlckRlZmF1bHQodmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGVkYW50aWNQYXJzZXJEZWZhdWx0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVhZERvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZyAqLwogICAgaW50IG5fY3VyOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jdXIrKykgewogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9wYXJzZXJvcHRpb25zO25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIDApOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMSk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMik7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWFkRG9jKChjb25zdCB4bWxDaGFyICopY3VyLCBVUkwsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgKGNvbnN0IHhtbENoYXIgKiljdXIsIDApOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSTCwgVVJMLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgZGVzX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCBvcHRpb25zLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlYWREb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWFkRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiBhIGZpbGUgb3IgVVJMICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX3BhcnNlcm9wdGlvbnM7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDEpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDEpOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWFkRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWFkTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAwKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDEpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMik7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMyk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWFkTWVtb3J5KChjb25zdCBjaGFyICopYnVmZmVyLCBzaXplLCBVUkwsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIDApOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAxKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMik7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDMpOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWFkTWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWNvdmVyRG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgeG1sQ2hhciAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxDaGFyX3B0cihuX2N1ciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWNvdmVyRG9jKGN1cik7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENoYXJfcHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVjb3ZlckRvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVjb3ZlckZpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lICovCiAgICBpbnQgbl9maWxlbmFtZTsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlY292ZXJGaWxlKGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVjb3ZlckZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVjb3Zlck1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYW4gcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgIGludCBuX3NpemU7CgogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgMCk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlY292ZXJNZW1vcnkoKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIDApOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlY292ZXJNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYUGFyc2VEVEQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRHRkUHRyIHJldF92YWw7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2NrICovCiAgICBpbnQgbl9zYXg7CiAgICB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogYSBOQU1FKiBjb250YWluaW5nIHRoZSBFeHRlcm5hbCBJRCBvZiB0aGUgRFREICovCiAgICBpbnQgbl9FeHRlcm5hbElEOwogICAgeG1sQ2hhciAqIFN5c3RlbUlEOyAvKiBhIE5BTUUqIGNvbnRhaW5pbmcgdGhlIFVSTCB0byB0aGUgRFREICovCiAgICBpbnQgbl9TeXN0ZW1JRDsKCiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl9FeHRlcm5hbElEID0gMDtuX0V4dGVybmFsSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9FeHRlcm5hbElEKyspIHsKICAgIGZvciAobl9TeXN0ZW1JRCA9IDA7bl9TeXN0ZW1JRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1N5c3RlbUlEKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNheCA9IGdlbl94bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAwKTsKICAgICAgICBFeHRlcm5hbElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgMSk7CiAgICAgICAgU3lzdGVtSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9TeXN0ZW1JRCwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVhQYXJzZURURChzYXgsIChjb25zdCB4bWxDaGFyICopRXh0ZXJuYWxJRCwgKGNvbnN0IHhtbENoYXIgKilTeXN0ZW1JRCk7CiAgICAgICAgZGVzcmV0X3htbER0ZFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9TeXN0ZW1JRCwgKGNvbnN0IHhtbENoYXIgKilTeXN0ZW1JRCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVhQYXJzZURURCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fRXh0ZXJuYWxJRCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9TeXN0ZW1JRCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVhQYXJzZURvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jayAqLwogICAgaW50IG5fc2F4OwogICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHhtbENoYXIgKi8KICAgIGludCBuX2N1cjsKICAgIGludCByZWNvdmVyeTsgLyogd29yayBpbiByZWNvdmVyeSBtb2RlLCBpLmUuIHRyaWVzIHRvIHJlYWQgbm8gV2VsbCBGb3JtZWQgZG9jdW1lbnRzICovCiAgICBpbnQgbl9yZWNvdmVyeTsKCiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgIGZvciAobl9yZWNvdmVyeSA9IDA7bl9yZWNvdmVyeSA8IGdlbl9uYl9pbnQ7bl9yZWNvdmVyeSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAxKTsKICAgICAgICByZWNvdmVyeSA9IGdlbl9pbnQobl9yZWNvdmVyeSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVhQYXJzZURvYyhzYXgsIChjb25zdCB4bWxDaGFyICopY3VyLCByZWNvdmVyeSk7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMSk7CiAgICAgICAgZGVzX2ludChuX3JlY292ZXJ5LCByZWNvdmVyeSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVhQYXJzZURvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlY292ZXJ5KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWFBhcnNlRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2NrICovCiAgICBpbnQgbl9zYXg7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVhQYXJzZUVudGl0eShzYXgsIGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAwKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYUGFyc2VFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWFBhcnNlRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jayAqLwogICAgaW50IG5fc2F4OwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgaW50IHJlY292ZXJ5OyAvKiB3b3JrIGluIHJlY292ZXJ5IG1vZGUsIGkuZS4gdHJpZXMgdG8gcmVhZCBubyBXZWxsIEZvcm1lZCBkb2N1bWVudHMgKi8KICAgIGludCBuX3JlY292ZXJ5OwoKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX3JlY292ZXJ5ID0gMDtuX3JlY292ZXJ5IDwgZ2VuX25iX2ludDtuX3JlY292ZXJ5KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNheCA9IGdlbl94bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAwKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAxKTsKICAgICAgICByZWNvdmVyeSA9IGdlbl9pbnQobl9yZWNvdmVyeSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVhQYXJzZUZpbGUoc2F4LCBmaWxlbmFtZSwgcmVjb3ZlcnkpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDApOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMSk7CiAgICAgICAgZGVzX2ludChuX3JlY292ZXJ5LCByZWNvdmVyeSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVhQYXJzZUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlY292ZXJ5KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWFBhcnNlRmlsZVdpdGhEYXRhKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2NrICovCiAgICBpbnQgbl9zYXg7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBpbnQgcmVjb3Zlcnk7IC8qIHdvcmsgaW4gcmVjb3ZlcnkgbW9kZSwgaS5lLiB0cmllcyB0byByZWFkIG5vIFdlbGwgRm9ybWVkIGRvY3VtZW50cyAqLwogICAgaW50IG5fcmVjb3Zlcnk7CiAgICB2b2lkICogZGF0YTsgLyogdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX3JlY292ZXJ5ID0gMDtuX3JlY292ZXJ5IDwgZ2VuX25iX2ludDtuX3JlY292ZXJ5KyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNheCA9IGdlbl94bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAwKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAxKTsKICAgICAgICByZWNvdmVyeSA9IGdlbl9pbnQobl9yZWNvdmVyeSwgMik7CiAgICAgICAgZGF0YSA9IGdlbl91c2VyZGF0YShuX2RhdGEsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU0FYUGFyc2VGaWxlV2l0aERhdGEoc2F4LCBmaWxlbmFtZSwgcmVjb3ZlcnksIGRhdGEpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDApOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMSk7CiAgICAgICAgZGVzX2ludChuX3JlY292ZXJ5LCByZWNvdmVyeSwgMik7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fZGF0YSwgZGF0YSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVhQYXJzZUZpbGVXaXRoRGF0YSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVjb3ZlcnkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVhQYXJzZU1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jayAqLwogICAgaW50IG5fc2F4OwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYW4gcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgIGludCBuX3NpemU7CiAgICBpbnQgcmVjb3Zlcnk7IC8qIHdvcmsgaW4gcmVjb3ZlcnkgbW9kZSwgaS5lLiB0cmllcyB0byByZWFkIG5vdCBXZWxsIEZvcm1lZCBkb2N1bWVudHMgKi8KICAgIGludCBuX3JlY292ZXJ5OwoKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgewogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgIGZvciAobl9yZWNvdmVyeSA9IDA7bl9yZWNvdmVyeSA8IGdlbl9uYl9pbnQ7bl9yZWNvdmVyeSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAxKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDIpOwogICAgICAgIHJlY292ZXJ5ID0gZ2VuX2ludChuX3JlY292ZXJ5LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWFBhcnNlTWVtb3J5KHNheCwgKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUsIHJlY292ZXJ5KTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAxKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMik7CiAgICAgICAgZGVzX2ludChuX3JlY292ZXJ5LCByZWNvdmVyeSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVhQYXJzZU1lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVjb3ZlcnkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYUGFyc2VNZW1vcnlXaXRoRGF0YSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jayAqLwogICAgaW50IG5fc2F4OwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYW4gcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgIGludCBuX3NpemU7CiAgICBpbnQgcmVjb3Zlcnk7IC8qIHdvcmsgaW4gcmVjb3ZlcnkgbW9kZSwgaS5lLiB0cmllcyB0byByZWFkIG5vIFdlbGwgRm9ybWVkIGRvY3VtZW50cyAqLwogICAgaW50IG5fcmVjb3Zlcnk7CiAgICB2b2lkICogZGF0YTsgLyogdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgewogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgIGZvciAobl9yZWNvdmVyeSA9IDA7bl9yZWNvdmVyeSA8IGdlbl9uYl9pbnQ7bl9yZWNvdmVyeSsrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fZGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAxKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDIpOwogICAgICAgIHJlY292ZXJ5ID0gZ2VuX2ludChuX3JlY292ZXJ5LCAzKTsKICAgICAgICBkYXRhID0gZ2VuX3VzZXJkYXRhKG5fZGF0YSwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVhQYXJzZU1lbW9yeVdpdGhEYXRhKHNheCwgKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUsIHJlY292ZXJ5LCBkYXRhKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAxKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMik7CiAgICAgICAgZGVzX2ludChuX3JlY292ZXJ5LCByZWNvdmVyeSwgMyk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fZGF0YSwgZGF0YSwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVhQYXJzZU1lbW9yeVdpdGhEYXRhIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWNvdmVyeSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWFVzZXJQYXJzZUZpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiBhIFNBWCBoYW5kbGVyICovCiAgICBpbnQgbl9zYXg7CiAgICB2b2lkICogdXNlcl9kYXRhOyAvKiBUaGUgdXNlciBkYXRhIHJldHVybmVkIG9uIFNBWCBjYWxsYmFja3MgKi8KICAgIGludCBuX3VzZXJfZGF0YTsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgewogICAgZm9yIChuX3VzZXJfZGF0YSA9IDA7bl91c2VyX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyX2RhdGErKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc2F4ID0gZ2VuX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIDApOwogICAgICAgIHVzZXJfZGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJfZGF0YSwgMSk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMik7CiAgICAgICAgCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICAgICAgaWYgKHNheCA9PSAoeG1sU0FYSGFuZGxlclB0cikmeG1sRGVmYXVsdFNBWEhhbmRsZXIpIHVzZXJfZGF0YSA9IE5VTEw7CiNlbmRpZgoKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWFVzZXJQYXJzZUZpbGUoc2F4LCB1c2VyX2RhdGEsIGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAwKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyX2RhdGEsIHVzZXJfZGF0YSwgMSk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWFVzZXJQYXJzZUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJfZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVhVc2VyUGFyc2VNZW1vcnkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiBhIFNBWCBoYW5kbGVyICovCiAgICBpbnQgbl9zYXg7CiAgICB2b2lkICogdXNlcl9kYXRhOyAvKiBUaGUgdXNlciBkYXRhIHJldHVybmVkIG9uIFNBWCBjYWxsYmFja3MgKi8KICAgIGludCBuX3VzZXJfZGF0YTsKICAgIGNoYXIgKiBidWZmZXI7IC8qIGFuIGluLW1lbW9yeSBYTUwgZG9jdW1lbnQgaW5wdXQgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBzaXplOyAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBYTUwgZG9jdW1lbnQgaW4gYnl0ZXMgKi8KICAgIGludCBuX3NpemU7CgogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fdXNlcl9kYXRhID0gMDtuX3VzZXJfZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJfZGF0YSsrKSB7CiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc2F4ID0gZ2VuX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIDApOwogICAgICAgIHVzZXJfZGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJfZGF0YSwgMSk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAyKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDMpOwogICAgICAgIAojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgICAgIGlmIChzYXggPT0gKHhtbFNBWEhhbmRsZXJQdHIpJnhtbERlZmF1bHRTQVhIYW5kbGVyKSB1c2VyX2RhdGEgPSBOVUxMOwojZW5kaWYKCgogICAgICAgIHJldF92YWwgPSB4bWxTQVhVc2VyUGFyc2VNZW1vcnkoc2F4LCB1c2VyX2RhdGEsIChjb25zdCBjaGFyICopYnVmZmVyLCBzaXplKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAwKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyX2RhdGEsIHVzZXJfZGF0YSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgMik7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYVXNlclBhcnNlTWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91c2VyX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2V0RXh0ZXJuYWxFbnRpdHlMb2FkZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2V0RmVhdHVyZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0xFR0FDWV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX0xFR0FDWV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1ML0hUTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogbmFtZTsgLyogdGhlIGZlYXR1cmUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHZvaWQgKiB2YWx1ZTsgLyogcG9pbnRlciB0byB0aGUgbG9jYXRpb24gb2YgdGhlIG5ldyB2YWx1ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfdm9pZF9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgdmFsdWUgPSBnZW5fdm9pZF9wdHIobl92YWx1ZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTZXRGZWF0dXJlKGN0eHQsIChjb25zdCBjaGFyICopbmFtZSwgdmFsdWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IGNoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfdm9pZF9wdHIobl92YWx1ZSwgdmFsdWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2V0RmVhdHVyZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2V0dXBQYXJzZXJGb3JCdWZmZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbENoYXIgKiBidWZmZXI7IC8qIGEgeG1sQ2hhciAqIGJ1ZmZlciAqLwogICAgaW50IG5fYnVmZmVyOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiBhIGZpbGUgbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBidWZmZXIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9idWZmZXIsIDEpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDIpOwoKICAgICAgICB4bWxTZXR1cFBhcnNlckZvckJ1ZmZlcihjdHh0LCAoY29uc3QgeG1sQ2hhciAqKWJ1ZmZlciwgZmlsZW5hbWUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IHhtbENoYXIgKilidWZmZXIsIDEpOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTZXR1cFBhcnNlckZvckJ1ZmZlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdG9wUGFyc2VyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUFVTSF9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1BVU0hfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sU3RvcFBhcnNlcihjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0b3BQYXJzZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdWJzdGl0dXRlRW50aXRpZXNEZWZhdWx0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgdmFsOyAvKiBpbnQgMCBvciAxICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9pbnQobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU3Vic3RpdHV0ZUVudGl0aWVzRGVmYXVsdCh2YWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdWJzdGl0dXRlRW50aXRpZXNEZWZhdWx0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9wYXJzZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHBhcnNlciA6IDYwIG9mIDY5IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxCeXRlQ29uc3VtZWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2xlYXJOb2RlSW5mb1NlcSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDbGVhclBhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3JlYXRlRG9jUGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDdHh0UmVhZERvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDdHh0UmVhZEZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3R4dFJlYWRNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3R4dFJlc2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEN0eHRSZXNldFB1c2goKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3R4dFVzZU9wdGlvbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0RXh0ZXJuYWxFbnRpdHlMb2FkZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0RmVhdHVyZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRGZWF0dXJlc0xpc3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSU9QYXJzZURURCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJbml0Tm9kZUluZm9TZXEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSW5pdFBhcnNlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJbml0UGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxLZWVwQmxhbmtzRGVmYXVsdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaW5lTnVtYmVyc0RlZmF1bHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTG9hZEV4dGVybmFsRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0lPSW5wdXRTdHJlYW0oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3UGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5UmVjb3ZlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZUNodW5rKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlQ3R4dEV4dGVybmFsRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlRFREKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlRG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlRG9jdW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VFeHRQYXJzZWRFbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VFeHRlcm5hbEVudGl0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZUZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VJbk5vZGVDb250ZXh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlckFkZE5vZGVJbmZvKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlckZpbmROb2RlSW5mbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJGaW5kTm9kZUluZm9JbmRleCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJJbnB1dEdyb3coKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VySW5wdXRSZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBlZGFudGljUGFyc2VyRGVmYXVsdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWFkRG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlYWRGaWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlYWRNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVjb3ZlckRvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWNvdmVyRmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWNvdmVyTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFBhcnNlRFREKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFBhcnNlRG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFBhcnNlRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFBhcnNlRmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVhQYXJzZUZpbGVXaXRoRGF0YSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVhQYXJzZU1lbW9yeSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVhQYXJzZU1lbW9yeVdpdGhEYXRhKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFVzZXJQYXJzZUZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYVXNlclBhcnNlTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNldEV4dGVybmFsRW50aXR5TG9hZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNldEZlYXR1cmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2V0dXBQYXJzZXJGb3JCdWZmZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RvcFBhcnNlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdWJzdGl0dXRlRW50aXRpZXNEZWZhdWx0KCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBwYXJzZXI6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2h0bWxDcmVhdGVGaWxlUGFyc2VyQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIGEgZnJlZSBmb3JtIEMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIEhUTUwgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZW91dHB1dChuX2ZpbGVuYW1lLCAwKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxDcmVhdGVGaWxlUGFyc2VyQ3R4dChmaWxlbmFtZSwgKGNvbnN0IGNoYXIgKillbmNvZGluZyk7CiAgICAgICAgZGVzcmV0X2h0bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbENyZWF0ZUZpbGVQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbEluaXRBdXRvQ2xvc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIGh0bWxJbml0QXV0b0Nsb3NlKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbEluaXRBdXRvQ2xvc2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9pbnB1dFBvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0UHRyIHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0gaW5wdXRQb3AoY3R4dCk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlcklucHV0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaW5wdXRQb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaW5wdXRQdXNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFBhcnNlcklucHV0UHRyIHZhbHVlOyAvKiB0aGUgcGFyc2VyIGlucHV0ICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dFB0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX3htbFBhcnNlcklucHV0UHRyKG5fdmFsdWUsIDEpOwoKICAgICAgICByZXRfdmFsID0gaW5wdXRQdXNoKGN0eHQsIHZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxQYXJzZXJJbnB1dFB0cihuX3ZhbHVlLCB2YWx1ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBpbnB1dFB1c2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfbmFtZVBvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IG5hbWVQb3AoY3R4dCk7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gbmFtZVBvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9uYW1lUHVzaCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CgogICAgICAgIHJldF92YWwgPSBuYW1lUHVzaChjdHh0LCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIG5hbWVQdXNoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X25vZGVQb3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0gbm9kZVBvcChjdHh0KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIG5vZGVQb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3Rfbm9kZVB1c2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciB2YWx1ZTsgLyogdGhlIGVsZW1lbnQgbm9kZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX3htbE5vZGVQdHIobl92YWx1ZSwgMSk7CgogICAgICAgIHJldF92YWwgPSBub2RlUHVzaChjdHh0LCB2YWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3ZhbHVlLCB2YWx1ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBub2RlUHVzaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDaGVja0xhbmd1YWdlSUQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBsYW5nOyAvKiBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdmFsdWUgKi8KICAgIGludCBuX2xhbmc7CgogICAgZm9yIChuX2xhbmcgPSAwO25fbGFuZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2xhbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbGFuZyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2xhbmcsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2hlY2tMYW5ndWFnZUlEKChjb25zdCB4bWxDaGFyICopbGFuZyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbGFuZywgKGNvbnN0IHhtbENoYXIgKilsYW5nLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoZWNrTGFuZ3VhZ2VJRCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sYW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5Q2hhcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGxlbjsgLyogSWdub3JlZCwgY29tcGF0aWJpbGl0eSAqLwogICAgaW50IG5fbGVuOwogICAgeG1sQ2hhciAqIG91dDsgLyogcG9pbnRlciB0byBhbiBhcnJheSBvZiB4bWxDaGFyICovCiAgICBpbnQgbl9vdXQ7CiAgICBpbnQgdmFsOyAvKiB0aGUgY2hhciB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl94bWxDaGFyX3B0cjtuX291dCsrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9pbnQ7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMCk7CiAgICAgICAgb3V0ID0gZ2VuX3htbENoYXJfcHRyKG5fb3V0LCAxKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlDaGFyKGxlbiwgb3V0LCB2YWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMCk7CiAgICAgICAgZGVzX3htbENoYXJfcHRyKG5fb3V0LCBvdXQsIDEpOwogICAgICAgIGRlc19pbnQobl92YWwsIHZhbCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb3B5Q2hhciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weUNoYXJNdWx0aUJ5dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBvdXQ7IC8qIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgeG1sQ2hhciAqLwogICAgaW50IG5fb3V0OwogICAgaW50IHZhbDsgLyogdGhlIGNoYXIgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl94bWxDaGFyX3B0cjtuX291dCsrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9pbnQ7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0ID0gZ2VuX3htbENoYXJfcHRyKG5fb3V0LCAwKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlDaGFyTXVsdGlCeXRlKG91dCwgdmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHIobl9vdXQsIG91dCwgMCk7CiAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlDaGFyTXVsdGlCeXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENyZWF0ZUVudGl0eVBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogVVJMOyAvKiB0aGUgZW50aXR5IFVSTCAqLwogICAgaW50IG5fVVJMOwogICAgeG1sQ2hhciAqIElEOyAvKiB0aGUgZW50aXR5IFBVQkxJQyBJRCAqLwogICAgaW50IG5fSUQ7CiAgICB4bWxDaGFyICogYmFzZTsgLyogYSBwb3NzaWJsZSBiYXNlIGZvciB0aGUgdGFyZ2V0IFVSSSAqLwogICAgaW50IG5fYmFzZTsKCiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSTCsrKSB7CiAgICBmb3IgKG5fSUQgPSAwO25fSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9JRCsrKSB7CiAgICBmb3IgKG5fYmFzZSA9IDA7bl9iYXNlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fYmFzZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBVUkwgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9VUkwsIDApOwogICAgICAgIElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fSUQsIDEpOwogICAgICAgIGJhc2UgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9iYXNlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENyZWF0ZUVudGl0eVBhcnNlckN0eHQoKGNvbnN0IHhtbENoYXIgKilVUkwsIChjb25zdCB4bWxDaGFyICopSUQsIChjb25zdCB4bWxDaGFyICopYmFzZSk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlckN0eHRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1VSTCwgKGNvbnN0IHhtbENoYXIgKilVUkwsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX0lELCAoY29uc3QgeG1sQ2hhciAqKUlELCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9iYXNlLCAoY29uc3QgeG1sQ2hhciAqKWJhc2UsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ3JlYXRlRW50aXR5UGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYmFzZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlRmlsZVBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ3JlYXRlRmlsZVBhcnNlckN0eHQoZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDcmVhdGVGaWxlUGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlTWVtb3J5UGFyc2VyQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlckN0eHRQdHIgcmV0X3ZhbDsKICAgIGNoYXIgKiBidWZmZXI7IC8qIGEgcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgIGludCBuX3NpemU7CgogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgMCk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQoKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAwKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDcmVhdGVNZW1vcnlQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDcmVhdGVVUkxQYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgb3IgVVJMICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZW91dHB1dDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfaW50O25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDApOwogICAgICAgIG9wdGlvbnMgPSBnZW5faW50KG5fb3B0aW9ucywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDcmVhdGVVUkxQYXJzZXJDdHh0KGZpbGVuYW1lLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENyZWF0ZVVSTFBhcnNlckN0eHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3VycmVudENoYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogdGhlIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCAqIGxlbjsgLyogcG9pbnRlciB0byB0aGUgbGVuZ3RoIG9mIHRoZSBjaGFyIHJlYWQgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludF9wdHI7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludF9wdHIobl9sZW4sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQ3VycmVudENoYXIoY3R4dCwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnRfcHRyKG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ3VycmVudENoYXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEVyck1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIGV4dHJhOyAvKiBleHRyYSBpbmZvcm1hdGlvbnMgKi8KICAgIGludCBuX2V4dHJhOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2V4dHJhID0gMDtuX2V4dHJhIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZXh0cmErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZXh0cmEgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9leHRyYSwgMSk7CgogICAgICAgIHhtbEVyck1lbW9yeShjdHh0LCAoY29uc3QgY2hhciAqKWV4dHJhKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9leHRyYSwgKGNvbnN0IGNoYXIgKilleHRyYSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxFcnJNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leHRyYSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNMZXR0ZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjOyAvKiBhbiB1bmljb2RlIGNoYXJhY3RlciAoaW50KSAqLwogICAgaW50IG5fYzsKCiAgICBmb3IgKG5fYyA9IDA7bl9jIDwgZ2VuX25iX2ludDtuX2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYyA9IGdlbl9pbnQobl9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzTGV0dGVyKGMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jLCBjLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzTGV0dGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0VudGl0eUlucHV0U3RyZWFtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRW50aXR5UHRyIGVudGl0eTsgLyogYW4gRW50aXR5IHBvaW50ZXIgKi8KICAgIGludCBuX2VudGl0eTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9lbnRpdHkgPSAwO25fZW50aXR5IDwgZ2VuX25iX3htbEVudGl0eVB0cjtuX2VudGl0eSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBlbnRpdHkgPSBnZW5feG1sRW50aXR5UHRyKG5fZW50aXR5LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0VudGl0eUlucHV0U3RyZWFtKGN0eHQsIGVudGl0eSk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlcklucHV0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxFbnRpdHlQdHIobl9lbnRpdHksIGVudGl0eSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdFbnRpdHlJbnB1dFN0cmVhbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VudGl0eSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3SW5wdXRGcm9tRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0UHRyIHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lIHRvIHVzZSBhcyBlbnRpdHkgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdJbnB1dEZyb21GaWxlKGN0eHQsIGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0lucHV0RnJvbUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3SW5wdXRTdHJlYW0odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0lucHV0U3RyZWFtKGN0eHQpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJJbnB1dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0lucHV0U3RyZWFtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld1N0cmluZ0lucHV0U3RyZWFtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIGJ1ZmZlcjsgLyogYW4gbWVtb3J5IGJ1ZmZlciAqLwogICAgaW50IG5fYnVmZmVyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fYnVmZmVyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1N0cmluZ0lucHV0U3RyZWFtKGN0eHQsIChjb25zdCB4bWxDaGFyICopYnVmZmVyKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgeG1sQ2hhciAqKWJ1ZmZlciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdTdHJpbmdJbnB1dFN0cmVhbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV4dENoYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIHRoZSBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sTmV4dENoYXIoY3R4dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXh0Q2hhciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJJbnB1dFNocmluayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0UHRyIGluOyAvKiBhbiBYTUwgcGFyc2VyIGlucHV0ICovCiAgICBpbnQgbl9pbjsKCiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfeG1sUGFyc2VySW5wdXRQdHI7bl9pbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBpbiA9IGdlbl94bWxQYXJzZXJJbnB1dFB0cihuX2luLCAwKTsKCiAgICAgICAgeG1sUGFyc2VySW5wdXRTaHJpbmsoaW4pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRQdHIobl9pbiwgaW4sIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VySW5wdXRTaHJpbmsiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBvcElucHV0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBvcElucHV0KGN0eHQpOwogICAgICAgIGRlc3JldF94bWxDaGFyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUG9wSW5wdXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUHVzaElucHV0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dDsgLyogYW4gWE1MIHBhcnNlciBpbnB1dCBmcmFnbWVudCAoZW50aXR5LCBYTUwgZnJhZ21lbnQgLi4uKS4gKi8KICAgIGludCBuX2lucHV0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2lucHV0ID0gMDtuX2lucHV0IDwgZ2VuX25iX3htbFBhcnNlcklucHV0UHRyO25faW5wdXQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgaW5wdXQgPSBnZW5feG1sUGFyc2VySW5wdXRQdHIobl9pbnB1dCwgMSk7CgogICAgICAgIHhtbFB1c2hJbnB1dChjdHh0LCBpbnB1dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbFBhcnNlcklucHV0UHRyKG5faW5wdXQsIGlucHV0LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFB1c2hJbnB1dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2lucHV0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTZXRFbnRpdHlSZWZlcmVuY2VGdW5jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNwbGl0UU5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiogcHJlZml4OyAvKiBhIHhtbENoYXIgKiogKi8KICAgIGludCBuX3ByZWZpeDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX3htbENoYXJfcHRyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgcHJlZml4ID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX3ByZWZpeCwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTcGxpdFFOYW1lKGN0eHQsIChjb25zdCB4bWxDaGFyICopbmFtZSwgcHJlZml4KTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5fcHJlZml4LCBwcmVmaXgsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3BsaXRRTmFtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJpbmdDdXJyZW50Q2hhcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiB0aGUgWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIGN1cjsgLyogcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaGFyICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgKiBsZW47IC8qIHBvaW50ZXIgdG8gdGhlIGxlbmd0aCBvZiB0aGUgY2hhciByZWFkICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnRfcHRyO25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGN1ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludF9wdHIobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyaW5nQ3VycmVudENoYXIoY3R4dCwgKGNvbnN0IHhtbENoYXIgKiljdXIsIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIChjb25zdCB4bWxDaGFyICopY3VyLCAxKTsKICAgICAgICBkZXNfaW50X3B0cihuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cmluZ0N1cnJlbnRDaGFyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyaW5nRGVjb2RlRW50aXRpZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogdGhlIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIGlucHV0IHN0cmluZyAqLwogICAgaW50IG5fc3RyOwogICAgaW50IHdoYXQ7IC8qIGNvbWJpbmF0aW9uIG9mIFhNTF9TVUJTVElUVVRFX1JFRiBhbmQgWE1MX1NVQlNUSVRVVEVfUEVSRUYgKi8KICAgIGludCBuX3doYXQ7CiAgICB4bWxDaGFyIGVuZDsgLyogYW4gZW5kIG1hcmtlciB4bWxDaGFyLCAwIGlmIG5vbmUgKi8KICAgIGludCBuX2VuZDsKICAgIHhtbENoYXIgZW5kMjsgLyogYW4gZW5kIG1hcmtlciB4bWxDaGFyLCAwIGlmIG5vbmUgKi8KICAgIGludCBuX2VuZDI7CiAgICB4bWxDaGFyIGVuZDM7IC8qIGFuIGVuZCBtYXJrZXIgeG1sQ2hhciwgMCBpZiBub25lICovCiAgICBpbnQgbl9lbmQzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgZm9yIChuX3doYXQgPSAwO25fd2hhdCA8IGdlbl9uYl9pbnQ7bl93aGF0KyspIHsKICAgIGZvciAobl9lbmQgPSAwO25fZW5kIDwgZ2VuX25iX3htbENoYXI7bl9lbmQrKykgewogICAgZm9yIChuX2VuZDIgPSAwO25fZW5kMiA8IGdlbl9uYl94bWxDaGFyO25fZW5kMisrKSB7CiAgICBmb3IgKG5fZW5kMyA9IDA7bl9lbmQzIDwgZ2VuX25iX3htbENoYXI7bl9lbmQzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMSk7CiAgICAgICAgd2hhdCA9IGdlbl9pbnQobl93aGF0LCAyKTsKICAgICAgICBlbmQgPSBnZW5feG1sQ2hhcihuX2VuZCwgMyk7CiAgICAgICAgZW5kMiA9IGdlbl94bWxDaGFyKG5fZW5kMiwgNCk7CiAgICAgICAgZW5kMyA9IGdlbl94bWxDaGFyKG5fZW5kMywgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJpbmdEZWNvZGVFbnRpdGllcyhjdHh0LCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgd2hhdCwgZW5kLCBlbmQyLCBlbmQzKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMSk7CiAgICAgICAgZGVzX2ludChuX3doYXQsIHdoYXQsIDIpOwogICAgICAgIGRlc194bWxDaGFyKG5fZW5kLCBlbmQsIDMpOwogICAgICAgIGRlc194bWxDaGFyKG5fZW5kMiwgZW5kMiwgNCk7CiAgICAgICAgZGVzX3htbENoYXIobl9lbmQzLCBlbmQzLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cmluZ0RlY29kZUVudGl0aWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3doYXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZDIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kMyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyaW5nTGVuRGVjb2RlRW50aXRpZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogdGhlIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIGlucHV0IHN0cmluZyAqLwogICAgaW50IG5fc3RyOwogICAgaW50IGxlbjsgLyogdGhlIHN0cmluZyBsZW5ndGggKi8KICAgIGludCBuX2xlbjsKICAgIGludCB3aGF0OyAvKiBjb21iaW5hdGlvbiBvZiBYTUxfU1VCU1RJVFVURV9SRUYgYW5kIFhNTF9TVUJTVElUVVRFX1BFUkVGICovCiAgICBpbnQgbl93aGF0OwogICAgeG1sQ2hhciBlbmQ7IC8qIGFuIGVuZCBtYXJrZXIgeG1sQ2hhciwgMCBpZiBub25lICovCiAgICBpbnQgbl9lbmQ7CiAgICB4bWxDaGFyIGVuZDI7IC8qIGFuIGVuZCBtYXJrZXIgeG1sQ2hhciwgMCBpZiBub25lICovCiAgICBpbnQgbl9lbmQyOwogICAgeG1sQ2hhciBlbmQzOyAvKiBhbiBlbmQgbWFya2VyIHhtbENoYXIsIDAgaWYgbm9uZSAqLwogICAgaW50IG5fZW5kMzsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICBmb3IgKG5fd2hhdCA9IDA7bl93aGF0IDwgZ2VuX25iX2ludDtuX3doYXQrKykgewogICAgZm9yIChuX2VuZCA9IDA7bl9lbmQgPCBnZW5fbmJfeG1sQ2hhcjtuX2VuZCsrKSB7CiAgICBmb3IgKG5fZW5kMiA9IDA7bl9lbmQyIDwgZ2VuX25iX3htbENoYXI7bl9lbmQyKyspIHsKICAgIGZvciAobl9lbmQzID0gMDtuX2VuZDMgPCBnZW5fbmJfeG1sQ2hhcjtuX2VuZDMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKICAgICAgICB3aGF0ID0gZ2VuX2ludChuX3doYXQsIDMpOwogICAgICAgIGVuZCA9IGdlbl94bWxDaGFyKG5fZW5kLCA0KTsKICAgICAgICBlbmQyID0gZ2VuX3htbENoYXIobl9lbmQyLCA1KTsKICAgICAgICBlbmQzID0gZ2VuX3htbENoYXIobl9lbmQzLCA2KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cmluZ0xlbkRlY29kZUVudGl0aWVzKGN0eHQsIChjb25zdCB4bWxDaGFyICopc3RyLCBsZW4sIHdoYXQsIGVuZCwgZW5kMiwgZW5kMyk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKilzdHIsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgZGVzX2ludChuX3doYXQsIHdoYXQsIDMpOwogICAgICAgIGRlc194bWxDaGFyKG5fZW5kLCBlbmQsIDQpOwogICAgICAgIGRlc194bWxDaGFyKG5fZW5kMiwgZW5kMiwgNSk7CiAgICAgICAgZGVzX3htbENoYXIobl9lbmQzLCBlbmQzLCA2KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cmluZ0xlbkRlY29kZUVudGl0aWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93aGF0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmQyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZDMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN3aXRjaEVuY29kaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIHRoZSBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbENoYXJFbmNvZGluZyBlbmM7IC8qIHRoZSBlbmNvZGluZyB2YWx1ZSAobnVtYmVyKSAqLwogICAgaW50IG5fZW5jOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2VuYyA9IDA7bl9lbmMgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nO25fZW5jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGVuYyA9IGdlbl94bWxDaGFyRW5jb2Rpbmcobl9lbmMsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU3dpdGNoRW5jb2RpbmcoY3R4dCwgZW5jKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxDaGFyRW5jb2Rpbmcobl9lbmMsIGVuYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTd2l0Y2hFbmNvZGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3dpdGNoSW5wdXRFbmNvZGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiB0aGUgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dDsgLyogdGhlIGlucHV0IHN0cmVhbSAqLwogICAgaW50IG5faW5wdXQ7CiAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGhhbmRsZXI7IC8qIHRoZSBlbmNvZGluZyBoYW5kbGVyICovCiAgICBpbnQgbl9oYW5kbGVyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2lucHV0ID0gMDtuX2lucHV0IDwgZ2VuX25iX3htbFBhcnNlcklucHV0UHRyO25faW5wdXQrKykgewogICAgZm9yIChuX2hhbmRsZXIgPSAwO25faGFuZGxlciA8IGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyO25faGFuZGxlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBpbnB1dCA9IGdlbl94bWxQYXJzZXJJbnB1dFB0cihuX2lucHV0LCAxKTsKICAgICAgICBoYW5kbGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9oYW5kbGVyLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN3aXRjaElucHV0RW5jb2RpbmcoY3R4dCwgaW5wdXQsIGhhbmRsZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbFBhcnNlcklucHV0UHRyKG5faW5wdXQsIGlucHV0LCAxKTsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihuX2hhbmRsZXIsIGhhbmRsZXIsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3dpdGNoSW5wdXRFbmNvZGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2lucHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hhbmRsZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN3aXRjaFRvRW5jb2Rpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogdGhlIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciBoYW5kbGVyOyAvKiB0aGUgZW5jb2RpbmcgaGFuZGxlciAqLwogICAgaW50IG5faGFuZGxlcjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9oYW5kbGVyID0gMDtuX2hhbmRsZXIgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cjtuX2hhbmRsZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgaGFuZGxlciA9IGdlbl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyKG5faGFuZGxlciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTd2l0Y2hUb0VuY29kaW5nKGN0eHQsIGhhbmRsZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9oYW5kbGVyLCBoYW5kbGVyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN3aXRjaFRvRW5jb2RpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9oYW5kbGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3BhcnNlckludGVybmFscyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgcGFyc2VySW50ZXJuYWxzIDogMzMgb2YgOTAgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxDcmVhdGVGaWxlUGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sSW5pdEF1dG9DbG9zZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9pbnB1dFBvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9pbnB1dFB1c2goKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfbmFtZVBvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9uYW1lUHVzaCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9ub2RlUG9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X25vZGVQdXNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENoZWNrTGFuZ3VhZ2VJRCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDb3B5Q2hhcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDb3B5Q2hhck11bHRpQnl0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDcmVhdGVFbnRpdHlQYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENyZWF0ZUZpbGVQYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3JlYXRlVVJMUGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDdXJyZW50Q2hhcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxFcnJNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSXNMZXR0ZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3RW50aXR5SW5wdXRTdHJlYW0oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3SW5wdXRGcm9tRmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdJbnB1dFN0cmVhbSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdTdHJpbmdJbnB1dFN0cmVhbSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXh0Q2hhcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJJbnB1dFNocmluaygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQb3BJbnB1dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQdXNoSW5wdXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2V0RW50aXR5UmVmZXJlbmNlRnVuYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTcGxpdFFOYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cmluZ0N1cnJlbnRDaGFyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cmluZ0RlY29kZUVudGl0aWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cmluZ0xlbkRlY29kZUVudGl0aWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN3aXRjaEVuY29kaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN3aXRjaElucHV0RW5jb2RpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3dpdGNoVG9FbmNvZGluZygpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgcGFyc2VySW50ZXJuYWxzOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxQYXR0ZXJuRnJvbVJvb3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9QQVRURVJOX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhdHRlcm5QdHIgY29tcDsgLyogdGhlIHByZWNvbXBpbGVkIHBhdHRlcm4gKi8KICAgIGludCBuX2NvbXA7CgogICAgZm9yIChuX2NvbXAgPSAwO25fY29tcCA8IGdlbl9uYl94bWxQYXR0ZXJuUHRyO25fY29tcCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb21wID0gZ2VuX3htbFBhdHRlcm5QdHIobl9jb21wLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhdHRlcm5Gcm9tUm9vdChjb21wKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGF0dGVyblB0cihuX2NvbXAsIGNvbXAsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGF0dGVybkZyb21Sb290IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbXApOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXR0ZXJuR2V0U3RyZWFtQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXR0ZXJuTWF0Y2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9QQVRURVJOX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhdHRlcm5QdHIgY29tcDsgLyogdGhlIHByZWNvbXBpbGVkIHBhdHRlcm4gKi8KICAgIGludCBuX2NvbXA7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fY29tcCA9IDA7bl9jb21wIDwgZ2VuX25iX3htbFBhdHRlcm5QdHI7bl9jb21wKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29tcCA9IGdlbl94bWxQYXR0ZXJuUHRyKG5fY29tcCwgMCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXR0ZXJuTWF0Y2goY29tcCwgbm9kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhdHRlcm5QdHIobl9jb21wLCBjb21wLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGF0dGVybk1hdGNoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbXApOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhdHRlcm5NYXhEZXB0aCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1BBVFRFUk5fRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGF0dGVyblB0ciBjb21wOyAvKiB0aGUgcHJlY29tcGlsZWQgcGF0dGVybiAqLwogICAgaW50IG5fY29tcDsKCiAgICBmb3IgKG5fY29tcCA9IDA7bl9jb21wIDwgZ2VuX25iX3htbFBhdHRlcm5QdHI7bl9jb21wKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbXAgPSBnZW5feG1sUGF0dGVyblB0cihuX2NvbXAsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUGF0dGVybk1heERlcHRoKGNvbXApOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXR0ZXJuUHRyKG5fY29tcCwgY29tcCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXR0ZXJuTWF4RGVwdGgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhdHRlcm5TdHJlYW1hYmxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUEFUVEVSTl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXR0ZXJuUHRyIGNvbXA7IC8qIHRoZSBwcmVjb21waWxlZCBwYXR0ZXJuICovCiAgICBpbnQgbl9jb21wOwoKICAgIGZvciAobl9jb21wID0gMDtuX2NvbXAgPCBnZW5fbmJfeG1sUGF0dGVyblB0cjtuX2NvbXArKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29tcCA9IGdlbl94bWxQYXR0ZXJuUHRyKG5fY29tcCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXR0ZXJuU3RyZWFtYWJsZShjb21wKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGF0dGVyblB0cihuX2NvbXAsIGNvbXAsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGF0dGVyblN0cmVhbWFibGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhdHRlcm5jb21waWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1BBVFRFUk5fRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sU3RyZWFtQ3R4dFB0ciAxCnN0YXRpYyB4bWxTdHJlYW1DdHh0UHRyIGdlbl94bWxTdHJlYW1DdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxTdHJlYW1DdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTdHJlYW1DdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJlYW1Qb3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9QQVRURVJOX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFN0cmVhbUN0eHRQdHIgc3RyZWFtOyAvKiB0aGUgc3RyZWFtIGNvbnRleHQgKi8KICAgIGludCBuX3N0cmVhbTsKCiAgICBmb3IgKG5fc3RyZWFtID0gMDtuX3N0cmVhbSA8IGdlbl9uYl94bWxTdHJlYW1DdHh0UHRyO25fc3RyZWFtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cmVhbSA9IGdlbl94bWxTdHJlYW1DdHh0UHRyKG5fc3RyZWFtLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cmVhbVBvcChzdHJlYW0pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTdHJlYW1DdHh0UHRyKG5fc3RyZWFtLCBzdHJlYW0sIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyZWFtUG9wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cmVhbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cmVhbVB1c2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9QQVRURVJOX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFN0cmVhbUN0eHRQdHIgc3RyZWFtOyAvKiB0aGUgc3RyZWFtIGNvbnRleHQgKi8KICAgIGludCBuX3N0cmVhbTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgY3VycmVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5zOyAvKiB0aGUgbmFtZXNwYWNlIG5hbWUgKi8KICAgIGludCBuX25zOwoKICAgIGZvciAobl9zdHJlYW0gPSAwO25fc3RyZWFtIDwgZ2VuX25iX3htbFN0cmVhbUN0eHRQdHI7bl9zdHJlYW0rKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyZWFtID0gZ2VuX3htbFN0cmVhbUN0eHRQdHIobl9zdHJlYW0sIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBucyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25zLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cmVhbVB1c2goc3RyZWFtLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbnMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTdHJlYW1DdHh0UHRyKG5fc3RyZWFtLCBzdHJlYW0sIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbnMsIChjb25zdCB4bWxDaGFyICopbnMsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyZWFtUHVzaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHJlYW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cmVhbVB1c2hBdHRyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUEFUVEVSTl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTdHJlYW1DdHh0UHRyIHN0cmVhbTsgLyogdGhlIHN0cmVhbSBjb250ZXh0ICovCiAgICBpbnQgbl9zdHJlYW07CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGN1cnJlbnQgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBuczsgLyogdGhlIG5hbWVzcGFjZSBuYW1lICovCiAgICBpbnQgbl9uczsKCiAgICBmb3IgKG5fc3RyZWFtID0gMDtuX3N0cmVhbSA8IGdlbl9uYl94bWxTdHJlYW1DdHh0UHRyO25fc3RyZWFtKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cmVhbSA9IGdlbl94bWxTdHJlYW1DdHh0UHRyKG5fc3RyZWFtLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbnMgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9ucywgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJlYW1QdXNoQXR0cihzdHJlYW0sIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilucyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFN0cmVhbUN0eHRQdHIobl9zdHJlYW0sIHN0cmVhbSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9ucywgKGNvbnN0IHhtbENoYXIgKilucywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJlYW1QdXNoQXR0ciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHJlYW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfcGF0dGVybih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgcGF0dGVybiA6IDcgb2YgMTIgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhdHRlcm5Gcm9tUm9vdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXR0ZXJuR2V0U3RyZWFtQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXR0ZXJuTWF0Y2goKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGF0dGVybk1heERlcHRoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhdHRlcm5TdHJlYW1hYmxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhdHRlcm5jb21waWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cmVhbVBvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJlYW1QdXNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cmVhbVB1c2hBdHRyKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBwYXR0ZXJuOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFJlbGF4TkdQdHIgMQpzdGF0aWMgeG1sUmVsYXhOR1B0ciBnZW5feG1sUmVsYXhOR1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sUmVsYXhOR1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUmVsYXhOR1B0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR0R1bXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIGZpbGUgb3V0cHV0ICovCiAgICBpbnQgbl9vdXRwdXQ7CiAgICB4bWxSZWxheE5HUHRyIHNjaGVtYTsgLyogYSBzY2hlbWEgc3RydWN0dXJlICovCiAgICBpbnQgbl9zY2hlbWE7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX3NjaGVtYSA9IDA7bl9zY2hlbWEgPCBnZW5fbmJfeG1sUmVsYXhOR1B0cjtuX3NjaGVtYSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIHNjaGVtYSA9IGdlbl94bWxSZWxheE5HUHRyKG5fc2NoZW1hLCAxKTsKCiAgICAgICAgeG1sUmVsYXhOR0R1bXAob3V0cHV0LCBzY2hlbWEpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX3htbFJlbGF4TkdQdHIobl9zY2hlbWEsIHNjaGVtYSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HRHVtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2NoZW1hKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR0R1bXBUcmVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBmaWxlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sUmVsYXhOR1B0ciBzY2hlbWE7IC8qIGEgc2NoZW1hIHN0cnVjdHVyZSAqLwogICAgaW50IG5fc2NoZW1hOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9zY2hlbWEgPSAwO25fc2NoZW1hIDwgZ2VuX25iX3htbFJlbGF4TkdQdHI7bl9zY2hlbWErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBzY2hlbWEgPSBnZW5feG1sUmVsYXhOR1B0cihuX3NjaGVtYSwgMSk7CgogICAgICAgIHhtbFJlbGF4TkdEdW1wVHJlZShvdXRwdXQsIHNjaGVtYSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sUmVsYXhOR1B0cihuX3NjaGVtYSwgc2NoZW1hLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdEdW1wVHJlZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2NoZW1hKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciAxCnN0YXRpYyB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciBnZW5feG1sUmVsYXhOR1BhcnNlckN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFJlbGF4TkdQYXJzZXJDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmNfcHRyIDEKc3RhdGljIHhtbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuYyAqIGdlbl94bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmMgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIgMQpzdGF0aWMgeG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmMgKiBnZW5feG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfdm9pZF9wdHJfcHRyIDEKc3RhdGljIHZvaWQgKiogZ2VuX3ZvaWRfcHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfdm9pZF9wdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB2b2lkICoqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HR2V0UGFyc2VyRXJyb3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhIFJlbGF4LU5HIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuYyAqIGVycjsgLyogdGhlIGVycm9yIGNhbGxiYWNrIHJlc3VsdCAqLwogICAgaW50IG5fZXJyOwogICAgeG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmMgKiB3YXJuOyAvKiB0aGUgd2FybmluZyBjYWxsYmFjayByZXN1bHQgKi8KICAgIGludCBuX3dhcm47CiAgICB2b2lkICoqIGN0eDsgLyogY29udGV4dHVhbCBkYXRhIGZvciB0aGUgY2FsbGJhY2tzIHJlc3VsdCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUmVsYXhOR1BhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9lcnIgPSAwO25fZXJyIDwgZ2VuX25iX3htbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuY19wdHI7bl9lcnIrKykgewogICAgZm9yIChuX3dhcm4gPSAwO25fd2FybiA8IGdlbl9uYl94bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuY19wdHI7bl93YXJuKyspIHsKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyX3B0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFJlbGF4TkdQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZXJyID0gZ2VuX3htbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuY19wdHIobl9lcnIsIDEpOwogICAgICAgIHdhcm4gPSBnZW5feG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyKG5fd2FybiwgMik7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyX3B0cihuX2N0eCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWxheE5HR2V0UGFyc2VyRXJyb3JzKGN0eHQsIGVyciwgd2FybiwgY3R4KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sUmVsYXhOR1ZhbGlkaXR5RXJyb3JGdW5jX3B0cihuX2VyciwgZXJyLCAxKTsKICAgICAgICBkZXNfeG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyKG5fd2Fybiwgd2FybiwgMik7CiAgICAgICAgZGVzX3ZvaWRfcHRyX3B0cihuX2N0eCwgY3R4LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdHZXRQYXJzZXJFcnJvcnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lcnIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd2Fybik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIgMQpzdGF0aWMgeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciBnZW5feG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR0dldFZhbGlkRXJyb3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIGEgUmVsYXgtTkcgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sUmVsYXhOR1ZhbGlkaXR5RXJyb3JGdW5jICogZXJyOyAvKiB0aGUgZXJyb3IgZnVuY3Rpb24gcmVzdWx0ICovCiAgICBpbnQgbl9lcnI7CiAgICB4bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuYyAqIHdhcm47IC8qIHRoZSB3YXJuaW5nIGZ1bmN0aW9uIHJlc3VsdCAqLwogICAgaW50IG5fd2FybjsKICAgIHZvaWQgKiogY3R4OyAvKiB0aGUgZnVuY3Rpb25zIGNvbnRleHQgcmVzdWx0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxSZWxheE5HVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZXJyID0gMDtuX2VyciA8IGdlbl9uYl94bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmNfcHRyO25fZXJyKyspIHsKICAgIGZvciAobl93YXJuID0gMDtuX3dhcm4gPCBnZW5fbmJfeG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyO25fd2FybisrKSB7CiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cl9wdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxSZWxheE5HVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZXJyID0gZ2VuX3htbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuY19wdHIobl9lcnIsIDEpOwogICAgICAgIHdhcm4gPSBnZW5feG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyKG5fd2FybiwgMik7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyX3B0cihuX2N0eCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWxheE5HR2V0VmFsaWRFcnJvcnMoY3R4dCwgZXJyLCB3YXJuLCBjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxSZWxheE5HVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuY19wdHIobl9lcnIsIGVyciwgMSk7CiAgICAgICAgZGVzX3htbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cihuX3dhcm4sIHdhcm4sIDIpOwogICAgICAgIGRlc192b2lkX3B0cl9wdHIobl9jdHgsIGN0eCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HR2V0VmFsaWRFcnJvcnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lcnIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd2Fybik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HSW5pdFR5cGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWxheE5HSW5pdFR5cGVzKCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HSW5pdFR5cGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR05ld0RvY1BhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBwcmVwYXJzZWQgZG9jdW1lbnQgdHJlZSAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdOZXdEb2NQYXJzZXJDdHh0KGRvYyk7CiAgICAgICAgZGVzcmV0X3htbFJlbGF4TkdQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVsYXhOR05ld0RvY1BhcnNlckN0eHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR05ld01lbVBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSBjb250YWluaW5nIHRoZSBzY2hlbWFzICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwoKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWZmZXIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIDApOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWxheE5HTmV3TWVtUGFyc2VyQ3R4dCgoY29uc3QgY2hhciAqKWJ1ZmZlciwgc2l6ZSk7CiAgICAgICAgZGVzcmV0X3htbFJlbGF4TkdQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAwKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HTmV3TWVtUGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlbGF4TkdOZXdQYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgcmV0X3ZhbDsKICAgIGNoYXIgKiBVUkw7IC8qIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hICovCiAgICBpbnQgbl9VUkw7CgogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9VUkwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJMID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fVVJMLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdOZXdQYXJzZXJDdHh0KChjb25zdCBjaGFyICopVVJMKTsKICAgICAgICBkZXNyZXRfeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX1VSTCwgKGNvbnN0IGNoYXIgKilVUkwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVsYXhOR05ld1BhcnNlckN0eHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR05ld1ZhbGlkQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HUGFyc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR1NldFBhcnNlckVycm9ycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HU2V0VmFsaWRFcnJvcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlRG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIGEgUmVsYXgtTkcgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBwYXJzZWQgZG9jdW1lbnQgdHJlZSAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR1ZhbGlkYXRlRG9jKGN0eHQsIGRvYyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVsYXhOR1ZhbGlkYXRlRG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlRnVsbEVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogYW4gZWxlbWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZWxlbTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFJlbGF4TkdWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR1ZhbGlkYXRlRnVsbEVsZW1lbnQoY3R4dCwgZG9jLCBlbGVtKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9lbGVtLCBlbGVtLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdWYWxpZGF0ZUZ1bGxFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HVmFsaWRhdGVQb3BFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSBSZWxheE5HIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogYW4gZWxlbWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZWxlbTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFJlbGF4TkdWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR1ZhbGlkYXRlUG9wRWxlbWVudChjdHh0LCBkb2MsIGVsZW0pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxSZWxheE5HVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVsYXhOR1ZhbGlkYXRlUG9wRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlUHVzaENEYXRhKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSBSZWxheE5HIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbENoYXIgKiBkYXRhOyAvKiBzb21lIGNoYXJhY3RlciBkYXRhIHJlYWQgKi8KICAgIGludCBuX2RhdGE7CiAgICBpbnQgbGVuOyAvKiB0aGUgbGVuZ2h0IG9mIHRoZSBkYXRhICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxSZWxheE5HVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fZGF0YSsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxSZWxheE5HVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZGF0YSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2RhdGEsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR1ZhbGlkYXRlUHVzaENEYXRhKGN0eHQsIChjb25zdCB4bWxDaGFyICopZGF0YSwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2RhdGEsIChjb25zdCB4bWxDaGFyICopZGF0YSwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdWYWxpZGF0ZVB1c2hDRGF0YSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlUHVzaEVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogYW4gZWxlbWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZWxlbTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFJlbGF4TkdWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR1ZhbGlkYXRlUHVzaEVsZW1lbnQoY3R4dCwgZG9jLCBlbGVtKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9lbGVtLCBlbGVtLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdWYWxpZGF0ZVB1c2hFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheFBhcnNlclNldEZsYWcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFJlbGF4TkdQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGEgUmVsYXhORyBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBmbGFnczsgLyogYSBzZXQgb2YgZmxhZ3MgdmFsdWVzICovCiAgICBpbnQgbl9mbGFnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFJlbGF4TkdQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZmxhZ3MgPSAwO25fZmxhZ3MgPCBnZW5fbmJfaW50O25fZmxhZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxSZWxheE5HUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGZsYWdzID0gZ2VuX2ludChuX2ZsYWdzLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4UGFyc2VyU2V0RmxhZyhjdHh0LCBmbGFncyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFJlbGF4TkdQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX2ZsYWdzLCBmbGFncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheFBhcnNlclNldEZsYWciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mbGFncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfcmVsYXhuZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgcmVsYXhuZyA6IDE0IG9mIDIyIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HRHVtcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HRHVtcFRyZWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR0dldFBhcnNlckVycm9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HR2V0VmFsaWRFcnJvcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR0luaXRUeXBlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HTmV3RG9jUGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HTmV3TWVtUGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HTmV3UGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HTmV3VmFsaWRDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlbGF4TkdQYXJzZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HU2V0UGFyc2VyRXJyb3JzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlbGF4TkdTZXRWYWxpZEVycm9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HVmFsaWRhdGVEb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlRnVsbEVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlUG9wRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HVmFsaWRhdGVQdXNoQ0RhdGEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlUHVzaEVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhQYXJzZXJTZXRGbGFnKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSByZWxheG5nOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0Kc3RhdGljIGludAp0ZXN0X3NjaGVtYXNJbnRlcm5hbHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHNjaGVtYXNJbnRlcm5hbHMgOiAwIG9mIDIgZnVuY3Rpb25zIC4uLlxuIik7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBzY2hlbWFzSW50ZXJuYWxzOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxBZGRDaGlsZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgcGFyZW50OyAvKiB0aGUgcGFyZW50IG5vZGUgKi8KICAgIGludCBuX3BhcmVudDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY2hpbGQgbm9kZSAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9wYXJlbnQgPSAwO25fcGFyZW50IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9wYXJlbnQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cl9pbjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwYXJlbnQgPSBnZW5feG1sTm9kZVB0cihuX3BhcmVudCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHJfaW4obl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQWRkQ2hpbGQocGFyZW50LCBjdXIpOwogICAgICAgIGlmIChyZXRfdmFsID09IE5VTEwpIHsgeG1sRnJlZU5vZGUoY3VyKSA7IGN1ciA9IE5VTEwgOyB9CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fcGFyZW50LCBwYXJlbnQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyX2luKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQWRkQ2hpbGQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGFyZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQWRkQ2hpbGRMaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBwYXJlbnQ7IC8qIHRoZSBwYXJlbnQgbm9kZSAqLwogICAgaW50IG5fcGFyZW50OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBmaXJzdCBub2RlIGluIHRoZSBsaXN0ICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX3BhcmVudCA9IDA7bl9wYXJlbnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3BhcmVudCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyX2luO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhcmVudCA9IGdlbl94bWxOb2RlUHRyKG5fcGFyZW50LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cl9pbihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxBZGRDaGlsZExpc3QocGFyZW50LCBjdXIpOwogICAgICAgIGlmIChyZXRfdmFsID09IE5VTEwpIHsgeG1sRnJlZU5vZGVMaXN0KGN1cikgOyBjdXIgPSBOVUxMIDsgfQogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3BhcmVudCwgcGFyZW50LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9pbihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFkZENoaWxkTGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wYXJlbnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBZGROZXh0U2libGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY2hpbGQgbm9kZSAqLwogICAgaW50IG5fY3VyOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgbmV3IG5vZGUgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHJfaW47bl9lbGVtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHJfaW4obl9lbGVtLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFkZE5leHRTaWJsaW5nKGN1ciwgZWxlbSk7CiAgICAgICAgaWYgKHJldF92YWwgPT0gTlVMTCkgeyB4bWxGcmVlTm9kZShlbGVtKSA7IGVsZW0gPSBOVUxMIDsgfQogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9pbihuX2VsZW0sIGVsZW0sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQWRkTmV4dFNpYmxpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFkZFByZXZTaWJsaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY2hpbGQgbm9kZSAqLwogICAgaW50IG5fY3VyOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgbmV3IG5vZGUgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHJfaW47bl9lbGVtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHJfaW4obl9lbGVtLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFkZFByZXZTaWJsaW5nKGN1ciwgZWxlbSk7CiAgICAgICAgaWYgKHJldF92YWwgPT0gTlVMTCkgeyB4bWxGcmVlTm9kZShlbGVtKSA7IGVsZW0gPSBOVUxMIDsgfQogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9pbihuX2VsZW0sIGVsZW0sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQWRkUHJldlNpYmxpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBZGRTaWJsaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjaGlsZCBub2RlICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIHRoZSBuZXcgbm9kZSAqLwogICAgaW50IG5fZWxlbTsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cl9pbjtuX2VsZW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDApOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cl9pbihuX2VsZW0sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQWRkU2libGluZyhjdXIsIGVsZW0pOwogICAgICAgIGlmIChyZXRfdmFsID09IE5VTEwpIHsgeG1sRnJlZU5vZGUoZWxlbSkgOyBlbGVtID0gTlVMTCA7IH0KICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHJfaW4obl9lbGVtLCBlbGVtLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFkZFNpYmxpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF0dHJTZXJpYWxpemVUeHRDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxBdHRyUHRyIGF0dHI7IC8qIHRoZSBhdHRyaWJ1dGUgbm9kZSAqLwogICAgaW50IG5fYXR0cjsKICAgIHhtbENoYXIgKiBzdHJpbmc7IC8qIHRoZSB0ZXh0IGNvbnRlbnQgKi8KICAgIGludCBuX3N0cmluZzsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9hdHRyID0gMDtuX2F0dHIgPCBnZW5fbmJfeG1sQXR0clB0cjtuX2F0dHIrKykgewogICAgZm9yIChuX3N0cmluZyA9IDA7bl9zdHJpbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHJpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgYXR0ciA9IGdlbl94bWxBdHRyUHRyKG5fYXR0ciwgMik7CiAgICAgICAgc3RyaW5nID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyaW5nLCAzKTsKCiAgICAgICAgeG1sQXR0clNlcmlhbGl6ZVR4dENvbnRlbnQoYnVmLCBkb2MsIGF0dHIsIChjb25zdCB4bWxDaGFyICopc3RyaW5nKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxBdHRyUHRyKG5fYXR0ciwgYXR0ciwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyaW5nLCAoY29uc3QgeG1sQ2hhciAqKXN0cmluZywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBdHRyU2VyaWFsaXplVHh0Q29udGVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2F0dHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEJ1ZmZlckFkZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciB0byBkdW1wICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgI3htbENoYXIgc3RyaW5nICovCiAgICBpbnQgbl9zdHI7CiAgICBpbnQgbGVuOyAvKiB0aGUgbnVtYmVyIG9mICN4bWxDaGFyIHRvIGFkZCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEJ1ZmZlckFkZChidWYsIChjb25zdCB4bWxDaGFyICopc3RyLCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlckFkZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyQWRkSGVhZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciAqLwogICAgaW50IG5fYnVmOwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlICN4bWxDaGFyIHN0cmluZyAqLwogICAgaW50IG5fc3RyOwogICAgaW50IGxlbjsgLyogdGhlIG51bWJlciBvZiAjeG1sQ2hhciB0byBhZGQgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWZmZXJBZGRIZWFkKGJ1ZiwgKGNvbnN0IHhtbENoYXIgKilzdHIsIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyQWRkSGVhZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyQ0NhdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciB0byBkdW1wICovCiAgICBpbnQgbl9idWY7CiAgICBjaGFyICogc3RyOyAvKiB0aGUgQyBjaGFyIHN0cmluZyAqLwogICAgaW50IG5fc3RyOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX3N0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9zdHIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQnVmZmVyQ0NhdChidWYsIChjb25zdCBjaGFyICopc3RyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3N0ciwgKGNvbnN0IGNoYXIgKilzdHIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyQ0NhdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJDYXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBidWZmZXIgdG8gYWRkIHRvICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgI3htbENoYXIgc3RyaW5nICovCiAgICBpbnQgbl9zdHI7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWZmZXJDYXQoYnVmLCAoY29uc3QgeG1sQ2hhciAqKXN0cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlckNhdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbEJ1ZmZlclB0ciAxCnN0YXRpYyB4bWxCdWZmZXJQdHIgZ2VuX2NvbnN0X3htbEJ1ZmZlclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY29uc3RfeG1sQnVmZmVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxCdWZmZXJQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgYnVmZmVyICovCiAgICBpbnQgbl9idWY7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfY29uc3RfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl9jb25zdF94bWxCdWZmZXJQdHIobl9idWYsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQnVmZmVyQ29udGVudCgoY29uc3QgeG1sQnVmZmVyUHRyKWJ1Zik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQnVmZmVyUHRyKG5fYnVmLCAoY29uc3QgeG1sQnVmZmVyUHRyKWJ1ZiwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxCdWZmZXJDb250ZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyQ3JlYXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIHJldF92YWw7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWZmZXJDcmVhdGUoKTsKICAgICAgICBkZXNyZXRfeG1sQnVmZmVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlckNyZWF0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyQ3JlYXRlU2l6ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJDcmVhdGVTdGF0aWModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyRW1wdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgYnVmZmVyICovCiAgICBpbnQgbl9idWY7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwoKICAgICAgICB4bWxCdWZmZXJFbXB0eShidWYpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyRW1wdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJHcm93KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgYnVmZmVyICovCiAgICBpbnQgbl9idWY7CiAgICB1bnNpZ25lZCBpbnQgbGVuOyAvKiB0aGUgbWluaW11bSBmcmVlIHNpemUgdG8gYWxsb2NhdGUgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfdW5zaWduZWRfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGxlbiA9IGdlbl91bnNpZ25lZF9pbnQobl9sZW4sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQnVmZmVyR3JvdyhidWYsIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfdW5zaWduZWRfaW50KG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyR3JvdyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJMZW5ndGgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBidWZmZXIgKi8KICAgIGludCBuX2J1ZjsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl9jb25zdF94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX2NvbnN0X3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWZmZXJMZW5ndGgoKGNvbnN0IHhtbEJ1ZmZlclB0cilidWYpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxCdWZmZXJQdHIobl9idWYsIChjb25zdCB4bWxCdWZmZXJQdHIpYnVmLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlckxlbmd0aCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEJ1ZmZlclJlc2l6ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciB0byByZXNpemUgKi8KICAgIGludCBuX2J1ZjsKICAgIHVuc2lnbmVkIGludCBzaXplOyAvKiB0aGUgZGVzaXJlZCBzaXplICovCiAgICBpbnQgbl9zaXplOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX3Vuc2lnbmVkX2ludDtuX3NpemUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgc2l6ZSA9IGdlbl91bnNpZ25lZF9pbnQobl9zaXplLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEJ1ZmZlclJlc2l6ZShidWYsIHNpemUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2ludChuX3NpemUsIHNpemUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyUmVzaXplIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJTZXRBbGxvY2F0aW9uU2NoZW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciB0byB0dW5lICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIHNjaGVtZTsgLyogYWxsb2NhdGlvbiBzY2hlbWUgdG8gdXNlICovCiAgICBpbnQgbl9zY2hlbWU7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9zY2hlbWUgPSAwO25fc2NoZW1lIDwgZ2VuX25iX3htbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWU7bl9zY2hlbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgc2NoZW1lID0gZ2VuX3htbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUobl9zY2hlbWUsIDEpOwoKICAgICAgICB4bWxCdWZmZXJTZXRBbGxvY2F0aW9uU2NoZW1lKGJ1Ziwgc2NoZW1lKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sQnVmZmVyQWxsb2NhdGlvblNjaGVtZShuX3NjaGVtZSwgc2NoZW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlclNldEFsbG9jYXRpb25TY2hlbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NjaGVtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyU2hyaW5rKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgYnVmZmVyIHRvIGR1bXAgKi8KICAgIGludCBuX2J1ZjsKICAgIHVuc2lnbmVkIGludCBsZW47IC8qIHRoZSBudW1iZXIgb2YgeG1sQ2hhciB0byByZW1vdmUgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfdW5zaWduZWRfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGxlbiA9IGdlbl91bnNpZ25lZF9pbnQobl9sZW4sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQnVmZmVyU2hyaW5rKGJ1ZiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc191bnNpZ25lZF9pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxCdWZmZXJTaHJpbmsiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyV3JpdGVDSEFSKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIFhNTCBidWZmZXIgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbENoYXIgKiBzdHJpbmc7IC8qIHRoZSBzdHJpbmcgdG8gYWRkICovCiAgICBpbnQgbl9zdHJpbmc7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9zdHJpbmcgPSAwO25fc3RyaW5nIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyaW5nKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIHN0cmluZyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0cmluZywgMSk7CgogICAgICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIChjb25zdCB4bWxDaGFyICopc3RyaW5nKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHJpbmcsIChjb25zdCB4bWxDaGFyICopc3RyaW5nLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlcldyaXRlQ0hBUiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJXcml0ZUNoYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgWE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKICAgIGNoYXIgKiBzdHJpbmc7IC8qIHRoZSBzdHJpbmcgdG8gYWRkICovCiAgICBpbnQgbl9zdHJpbmc7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9zdHJpbmcgPSAwO25fc3RyaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fc3RyaW5nKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIHN0cmluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3N0cmluZywgMSk7CgogICAgICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsIChjb25zdCBjaGFyICopc3RyaW5nKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9zdHJpbmcsIChjb25zdCBjaGFyICopc3RyaW5nLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlcldyaXRlQ2hhciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sQ2hhciAqIHN0cmluZzsgLyogdGhlIHN0cmluZyB0byBhZGQgKi8KICAgIGludCBuX3N0cmluZzsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX3N0cmluZyA9IDA7bl9zdHJpbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHJpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgc3RyaW5nID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyaW5nLCAxKTsKCiAgICAgICAgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCAoY29uc3QgeG1sQ2hhciAqKXN0cmluZyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyaW5nLCAoY29uc3QgeG1sQ2hhciAqKXN0cmluZywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWlsZFFOYW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogbmNuYW1lOyAvKiB0aGUgTmFtZSAqLwogICAgaW50IG5fbmNuYW1lOwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCAqLwogICAgaW50IG5fcHJlZml4OwogICAgeG1sQ2hhciAqIG1lbW9yeTsgLyogcHJlYWxsb2NhdGVkIG1lbW9yeSAqLwogICAgaW50IG5fbWVtb3J5OwogICAgaW50IGxlbjsgLyogcHJlYWxsb2NhdGVkIG1lbW9yeSBsZW5ndGggKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fbmNuYW1lID0gMDtuX25jbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25jbmFtZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fbWVtb3J5ID0gMDtuX21lbW9yeSA8IGdlbl9uYl94bWxDaGFyX3B0cjtuX21lbW9yeSsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbmNuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmNuYW1lLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwogICAgICAgIG1lbW9yeSA9IGdlbl94bWxDaGFyX3B0cihuX21lbW9yeSwgMik7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWlsZFFOYW1lKChjb25zdCB4bWxDaGFyICopbmNuYW1lLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgbWVtb3J5LCBsZW4pOwogICAgICAgIGlmICgocmV0X3ZhbCAhPSBOVUxMKSAmJiAocmV0X3ZhbCAhPSBuY25hbWUpICYmCiAgICAgICAgICAgICAgKHJldF92YWwgIT0gcHJlZml4KSAmJiAocmV0X3ZhbCAhPSBtZW1vcnkpKQogICAgICAgICAgICAgIHhtbEZyZWUocmV0X3ZhbCk7CgkgIHJldF92YWwgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmNuYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5jbmFtZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMSk7CiAgICAgICAgZGVzX3htbENoYXJfcHRyKG5fbWVtb3J5LCBtZW1vcnksIDIpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxCdWlsZFFOYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25jbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbWVtb3J5KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weURvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIGludCByZWN1cnNpdmU7IC8qIGlmIG5vdCB6ZXJvIGRvIGEgcmVjdXJzaXZlIGNvcHkuICovCiAgICBpbnQgbl9yZWN1cnNpdmU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9yZWN1cnNpdmUgPSAwO25fcmVjdXJzaXZlIDwgZ2VuX25iX2ludDtuX3JlY3Vyc2l2ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICByZWN1cnNpdmUgPSBnZW5faW50KG5fcmVjdXJzaXZlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlEb2MoZG9jLCByZWN1cnNpdmUpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2ludChuX3JlY3Vyc2l2ZSwgcmVjdXJzaXZlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlEb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlY3Vyc2l2ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENvcHlEdGQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEdGRQdHIgcmV0X3ZhbDsKICAgIHhtbER0ZFB0ciBkdGQ7IC8qIHRoZSBkdGQgKi8KICAgIGludCBuX2R0ZDsKCiAgICBmb3IgKG5fZHRkID0gMDtuX2R0ZCA8IGdlbl9uYl94bWxEdGRQdHI7bl9kdGQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZHRkID0gZ2VuX3htbER0ZFB0cihuX2R0ZCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDb3B5RHRkKGR0ZCk7CiAgICAgICAgZGVzcmV0X3htbER0ZFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbER0ZFB0cihuX2R0ZCwgZHRkLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlEdGQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZHRkKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weU5hbWVzcGFjZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5zUHRyIHJldF92YWw7CiAgICB4bWxOc1B0ciBjdXI7IC8qIHRoZSBuYW1lc3BhY2UgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOc1B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTnNQdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ29weU5hbWVzcGFjZShjdXIpOwogICAgICAgIGlmIChyZXRfdmFsICE9IE5VTEwpIHhtbEZyZWVOcyhyZXRfdmFsKTsKICAgICAgICBkZXNyZXRfeG1sTnNQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOc1B0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlOYW1lc3BhY2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5TmFtZXNwYWNlTGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5zUHRyIHJldF92YWw7CiAgICB4bWxOc1B0ciBjdXI7IC8qIHRoZSBmaXJzdCBuYW1lc3BhY2UgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOc1B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTnNQdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ29weU5hbWVzcGFjZUxpc3QoY3VyKTsKICAgICAgICBpZiAocmV0X3ZhbCAhPSBOVUxMKSB4bWxGcmVlTnNMaXN0KHJldF92YWwpOwogICAgICAgIGRlc3JldF94bWxOc1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5zUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ29weU5hbWVzcGFjZUxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5Tm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICBpbnQgZXh0ZW5kZWQ7IC8qIGlmIDEgZG8gYSByZWN1cnNpdmUgY29weSAocHJvcGVydGllcywgbmFtZXNwYWNlcyBhbmQgY2hpbGRyZW4gd2hlbiBhcHBsaWNhYmxlKSBpZiAyIGNvcHkgcHJvcGVydGllcyBhbmQgbmFtZXNwYWNlcyAod2hlbiBhcHBsaWNhYmxlKSAqLwogICAgaW50IG5fZXh0ZW5kZWQ7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl9jb25zdF94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fZXh0ZW5kZWQgPSAwO25fZXh0ZW5kZWQgPCBnZW5fbmJfaW50O25fZXh0ZW5kZWQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl9jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgZXh0ZW5kZWQgPSBnZW5faW50KG5fZXh0ZW5kZWQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQ29weU5vZGUoKGNvbnN0IHhtbE5vZGVQdHIpbm9kZSwgZXh0ZW5kZWQpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sTm9kZVB0cihuX25vZGUsIChjb25zdCB4bWxOb2RlUHRyKW5vZGUsIDApOwogICAgICAgIGRlc19pbnQobl9leHRlbmRlZCwgZXh0ZW5kZWQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ29weU5vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leHRlbmRlZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weU5vZGVMaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgbGlzdC4gKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl9jb25zdF94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlOb2RlTGlzdCgoY29uc3QgeG1sTm9kZVB0cilub2RlKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAoY29uc3QgeG1sTm9kZVB0cilub2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlOb2RlTGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5UHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEF0dHJQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgdGFyZ2V0OyAvKiB0aGUgZWxlbWVudCB3aGVyZSB0aGUgYXR0cmlidXRlIHdpbGwgYmUgZ3JhZnRlZCAqLwogICAgaW50IG5fdGFyZ2V0OwogICAgeG1sQXR0clB0ciBjdXI7IC8qIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fdGFyZ2V0ID0gMDtuX3RhcmdldCA8IGdlbl9uYl94bWxOb2RlUHRyO25fdGFyZ2V0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbEF0dHJQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdGFyZ2V0ID0gZ2VuX3htbE5vZGVQdHIobl90YXJnZXQsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxBdHRyUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlQcm9wKHRhcmdldCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sQXR0clB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl90YXJnZXQsIHRhcmdldCwgMCk7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb3B5UHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YXJnZXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5UHJvcExpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHRhcmdldDsgLyogdGhlIGVsZW1lbnQgd2hlcmUgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBncmFmdGVkICovCiAgICBpbnQgbl90YXJnZXQ7CiAgICB4bWxBdHRyUHRyIGN1cjsgLyogdGhlIGZpcnN0IGF0dHJpYnV0ZSAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl90YXJnZXQgPSAwO25fdGFyZ2V0IDwgZ2VuX25iX3htbE5vZGVQdHI7bl90YXJnZXQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sQXR0clB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YXJnZXQgPSBnZW5feG1sTm9kZVB0cihuX3RhcmdldCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbEF0dHJQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQ29weVByb3BMaXN0KHRhcmdldCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sQXR0clB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl90YXJnZXQsIHRhcmdldCwgMCk7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb3B5UHJvcExpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFyZ2V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlSW50U3Vic2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRHRkUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgcG9pbnRlciAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBEVEQgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiB0aGUgZXh0ZXJuYWwgKFBVQkxJQykgSUQgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CiAgICB4bWxDaGFyICogU3lzdGVtSUQ7IC8qIHRoZSBzeXN0ZW0gSUQgKi8KICAgIGludCBuX1N5c3RlbUlEOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fRXh0ZXJuYWxJRCA9IDA7bl9FeHRlcm5hbElEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fRXh0ZXJuYWxJRCsrKSB7CiAgICBmb3IgKG5fU3lzdGVtSUQgPSAwO25fU3lzdGVtSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9TeXN0ZW1JRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDIpOwogICAgICAgIFN5c3RlbUlEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sQ3JlYXRlSW50U3Vic2V0KGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQpOwogICAgICAgIGRlc3JldF94bWxEdGRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1N5c3RlbUlELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlELCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENyZWF0ZUludFN1YnNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9FeHRlcm5hbElEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1N5c3RlbUlEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEb2NDb3B5Tm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIGludCBleHRlbmRlZDsgLyogaWYgMSBkbyBhIHJlY3Vyc2l2ZSBjb3B5IChwcm9wZXJ0aWVzLCBuYW1lc3BhY2VzIGFuZCBjaGlsZHJlbiB3aGVuIGFwcGxpY2FibGUpIGlmIDIgY29weSBwcm9wZXJ0aWVzIGFuZCBuYW1lc3BhY2VzICh3aGVuIGFwcGxpY2FibGUpICovCiAgICBpbnQgbl9leHRlbmRlZDsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX2NvbnN0X3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZXh0ZW5kZWQgPSAwO25fZXh0ZW5kZWQgPCBnZW5fbmJfaW50O25fZXh0ZW5kZWQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl9jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgZXh0ZW5kZWQgPSBnZW5faW50KG5fZXh0ZW5kZWQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sRG9jQ29weU5vZGUoKGNvbnN0IHhtbE5vZGVQdHIpbm9kZSwgZG9jLCBleHRlbmRlZCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgKGNvbnN0IHhtbE5vZGVQdHIpbm9kZSwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfaW50KG5fZXh0ZW5kZWQsIGV4dGVuZGVkLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERvY0NvcHlOb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2V4dGVuZGVkKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEb2NDb3B5Tm9kZUxpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgdGFyZ2V0IGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBmaXJzdCBub2RlIGluIHRoZSBsaXN0LiAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl9jb25zdF94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBub2RlID0gZ2VuX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERvY0NvcHlOb2RlTGlzdChkb2MsIChjb25zdCB4bWxOb2RlUHRyKW5vZGUpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgKGNvbnN0IHhtbE5vZGVQdHIpbm9kZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEb2NDb3B5Tm9kZUxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERvY0R1bXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgRklMRSAqIGY7IC8qIHRoZSBGSUxFKiAqLwogICAgaW50IG5fZjsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfRklMRV9wdHI7bl9mKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbERvY1B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmID0gZ2VuX0ZJTEVfcHRyKG5fZiwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxEb2NEdW1wKGYsIGN1cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fZiwgZiwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERvY0R1bXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEb2NEdW1wRm9ybWF0TWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbENoYXIgKiogbWVtOyAvKiBPVVQ6IHRoZSBtZW1vcnkgcG9pbnRlciAqLwogICAgaW50IG5fbWVtOwogICAgaW50ICogc2l6ZTsgLyogT1VUOiB0aGUgbWVtb3J5IGxlbmd0aCAqLwogICAgaW50IG5fc2l6ZTsKICAgIGludCBmb3JtYXQ7IC8qIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkICovCiAgICBpbnQgbl9mb3JtYXQ7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9tZW0gPSAwO25fbWVtIDwgZ2VuX25iX3htbENoYXJfcHRyX3B0cjtuX21lbSsrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludF9wdHI7bl9zaXplKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sRG9jUHRyKG5fY3VyLCAwKTsKICAgICAgICBtZW0gPSBnZW5feG1sQ2hhcl9wdHJfcHRyKG5fbWVtLCAxKTsKICAgICAgICBzaXplID0gZ2VuX2ludF9wdHIobl9zaXplLCAyKTsKICAgICAgICBmb3JtYXQgPSBnZW5faW50KG5fZm9ybWF0LCAzKTsKCiAgICAgICAgeG1sRG9jRHVtcEZvcm1hdE1lbW9yeShjdXIsIG1lbSwgc2l6ZSwgZm9ybWF0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5fbWVtLCBtZW0sIDEpOwogICAgICAgIGRlc19pbnRfcHRyKG5fc2l6ZSwgc2l6ZSwgMik7CiAgICAgICAgZGVzX2ludChuX2Zvcm1hdCwgZm9ybWF0LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERvY0R1bXBGb3JtYXRNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21lbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERvY0R1bXBGb3JtYXRNZW1vcnlFbmModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciBvdXRfZG9jOyAvKiBEb2N1bWVudCB0byBnZW5lcmF0ZSBYTUwgdGV4dCBmcm9tICovCiAgICBpbnQgbl9vdXRfZG9jOwogICAgeG1sQ2hhciAqKiBkb2NfdHh0X3B0cjsgLyogTWVtb3J5IHBvaW50ZXIgZm9yIGFsbG9jYXRlZCBYTUwgdGV4dCAqLwogICAgaW50IG5fZG9jX3R4dF9wdHI7CiAgICBpbnQgKiBkb2NfdHh0X2xlbjsgLyogTGVuZ3RoIG9mIHRoZSBnZW5lcmF0ZWQgWE1MIHRleHQgKi8KICAgIGludCBuX2RvY190eHRfbGVuOwogICAgY2hhciAqIHR4dF9lbmNvZGluZzsgLyogQ2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgWE1MIHRleHQgKi8KICAgIGludCBuX3R4dF9lbmNvZGluZzsKICAgIGludCBmb3JtYXQ7IC8qIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkICovCiAgICBpbnQgbl9mb3JtYXQ7CgogICAgZm9yIChuX291dF9kb2MgPSAwO25fb3V0X2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9vdXRfZG9jKyspIHsKICAgIGZvciAobl9kb2NfdHh0X3B0ciA9IDA7bl9kb2NfdHh0X3B0ciA8IGdlbl9uYl94bWxDaGFyX3B0cl9wdHI7bl9kb2NfdHh0X3B0cisrKSB7CiAgICBmb3IgKG5fZG9jX3R4dF9sZW4gPSAwO25fZG9jX3R4dF9sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2RvY190eHRfbGVuKyspIHsKICAgIGZvciAobl90eHRfZW5jb2RpbmcgPSAwO25fdHh0X2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fdHh0X2VuY29kaW5nKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRfZG9jID0gZ2VuX3htbERvY1B0cihuX291dF9kb2MsIDApOwogICAgICAgIGRvY190eHRfcHRyID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX2RvY190eHRfcHRyLCAxKTsKICAgICAgICBkb2NfdHh0X2xlbiA9IGdlbl9pbnRfcHRyKG5fZG9jX3R4dF9sZW4sIDIpOwogICAgICAgIHR4dF9lbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3R4dF9lbmNvZGluZywgMyk7CiAgICAgICAgZm9ybWF0ID0gZ2VuX2ludChuX2Zvcm1hdCwgNCk7CgogICAgICAgIHhtbERvY0R1bXBGb3JtYXRNZW1vcnlFbmMob3V0X2RvYywgZG9jX3R4dF9wdHIsIGRvY190eHRfbGVuLCAoY29uc3QgY2hhciAqKXR4dF9lbmNvZGluZywgZm9ybWF0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX291dF9kb2MsIG91dF9kb2MsIDApOwogICAgICAgIGRlc194bWxDaGFyX3B0cl9wdHIobl9kb2NfdHh0X3B0ciwgZG9jX3R4dF9wdHIsIDEpOwogICAgICAgIGRlc19pbnRfcHRyKG5fZG9jX3R4dF9sZW4sIGRvY190eHRfbGVuLCAyKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl90eHRfZW5jb2RpbmcsIChjb25zdCBjaGFyICopdHh0X2VuY29kaW5nLCAzKTsKICAgICAgICBkZXNfaW50KG5fZm9ybWF0LCBmb3JtYXQsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRG9jRHVtcEZvcm1hdE1lbW9yeUVuYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRfZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvY190eHRfcHRyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvY190eHRfbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R4dF9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mb3JtYXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEb2NEdW1wTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbENoYXIgKiogbWVtOyAvKiBPVVQ6IHRoZSBtZW1vcnkgcG9pbnRlciAqLwogICAgaW50IG5fbWVtOwogICAgaW50ICogc2l6ZTsgLyogT1VUOiB0aGUgbWVtb3J5IGxlbmd0aCAqLwogICAgaW50IG5fc2l6ZTsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX21lbSA9IDA7bl9tZW0gPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25fbWVtKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50X3B0cjtuX3NpemUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMCk7CiAgICAgICAgbWVtID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX21lbSwgMSk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnRfcHRyKG5fc2l6ZSwgMik7CgogICAgICAgIHhtbERvY0R1bXBNZW1vcnkoY3VyLCBtZW0sIHNpemUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc194bWxDaGFyX3B0cl9wdHIobl9tZW0sIG1lbSwgMSk7CiAgICAgICAgZGVzX2ludF9wdHIobl9zaXplLCBzaXplLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERvY0R1bXBNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21lbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRG9jRHVtcE1lbW9yeUVuYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIG91dF9kb2M7IC8qIERvY3VtZW50IHRvIGdlbmVyYXRlIFhNTCB0ZXh0IGZyb20gKi8KICAgIGludCBuX291dF9kb2M7CiAgICB4bWxDaGFyICoqIGRvY190eHRfcHRyOyAvKiBNZW1vcnkgcG9pbnRlciBmb3IgYWxsb2NhdGVkIFhNTCB0ZXh0ICovCiAgICBpbnQgbl9kb2NfdHh0X3B0cjsKICAgIGludCAqIGRvY190eHRfbGVuOyAvKiBMZW5ndGggb2YgdGhlIGdlbmVyYXRlZCBYTUwgdGV4dCAqLwogICAgaW50IG5fZG9jX3R4dF9sZW47CiAgICBjaGFyICogdHh0X2VuY29kaW5nOyAvKiBDaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBYTUwgdGV4dCAqLwogICAgaW50IG5fdHh0X2VuY29kaW5nOwoKICAgIGZvciAobl9vdXRfZG9jID0gMDtuX291dF9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fb3V0X2RvYysrKSB7CiAgICBmb3IgKG5fZG9jX3R4dF9wdHIgPSAwO25fZG9jX3R4dF9wdHIgPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25fZG9jX3R4dF9wdHIrKykgewogICAgZm9yIChuX2RvY190eHRfbGVuID0gMDtuX2RvY190eHRfbGVuIDwgZ2VuX25iX2ludF9wdHI7bl9kb2NfdHh0X2xlbisrKSB7CiAgICBmb3IgKG5fdHh0X2VuY29kaW5nID0gMDtuX3R4dF9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX3R4dF9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRfZG9jID0gZ2VuX3htbERvY1B0cihuX291dF9kb2MsIDApOwogICAgICAgIGRvY190eHRfcHRyID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX2RvY190eHRfcHRyLCAxKTsKICAgICAgICBkb2NfdHh0X2xlbiA9IGdlbl9pbnRfcHRyKG5fZG9jX3R4dF9sZW4sIDIpOwogICAgICAgIHR4dF9lbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3R4dF9lbmNvZGluZywgMyk7CgogICAgICAgIHhtbERvY0R1bXBNZW1vcnlFbmMob3V0X2RvYywgZG9jX3R4dF9wdHIsIGRvY190eHRfbGVuLCAoY29uc3QgY2hhciAqKXR4dF9lbmNvZGluZyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9vdXRfZG9jLCBvdXRfZG9jLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5fZG9jX3R4dF9wdHIsIGRvY190eHRfcHRyLCAxKTsKICAgICAgICBkZXNfaW50X3B0cihuX2RvY190eHRfbGVuLCBkb2NfdHh0X2xlbiwgMik7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fdHh0X2VuY29kaW5nLCAoY29uc3QgY2hhciAqKXR4dF9lbmNvZGluZywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEb2NEdW1wTWVtb3J5RW5jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dF9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jX3R4dF9wdHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jX3R4dF9sZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHh0X2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRG9jRm9ybWF0RHVtcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBGSUxFICogZjsgLyogdGhlIEZJTEUqICovCiAgICBpbnQgbl9mOwogICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfRklMRV9wdHI7bl9mKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbERvY1B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZm9ybWF0ID0gMDtuX2Zvcm1hdCA8IGdlbl9uYl9pbnQ7bl9mb3JtYXQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZiA9IGdlbl9GSUxFX3B0cihuX2YsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sRG9jRm9ybWF0RHVtcChmLCBjdXIsIGZvcm1hdCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fZiwgZiwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfaW50KG5fZm9ybWF0LCBmb3JtYXQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRG9jRm9ybWF0RHVtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mb3JtYXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEb2NHZXRSb290RWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEb2NHZXRSb290RWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERvY1NldFJvb3RFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciByb290OyAvKiB0aGUgbmV3IGRvY3VtZW50IHJvb3QgZWxlbWVudCAqLwogICAgaW50IG5fcm9vdDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX3Jvb3QgPSAwO25fcm9vdCA8IGdlbl9uYl94bWxOb2RlUHRyX2luO25fcm9vdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICByb290ID0gZ2VuX3htbE5vZGVQdHJfaW4obl9yb290LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERvY1NldFJvb3RFbGVtZW50KGRvYywgcm9vdCk7CiAgICAgICAgaWYgKGRvYyA9PSBOVUxMKSB7IHhtbEZyZWVOb2RlKHJvb3QpIDsgcm9vdCA9IE5VTEwgOyB9CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHJfaW4obl9yb290LCByb290LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERvY1NldFJvb3RFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yb290KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRWxlbUR1bXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBmOyAvKiB0aGUgRklMRSAqIGZvciB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl9mOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfRklMRV9wdHI7bl9mKyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGYgPSBnZW5fRklMRV9wdHIobl9mLCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMik7CgogICAgICAgIHhtbEVsZW1EdW1wKGYsIGRvYywgY3VyKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fZiwgZiwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEVsZW1EdW1wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2YpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIHJldF92YWw7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXRCdWZmZXJBbGxvY2F0aW9uU2NoZW1lKCk7CiAgICAgICAgZGVzcmV0X3htbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0QnVmZmVyQWxsb2NhdGlvblNjaGVtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0Q29tcHJlc3NNb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXRDb21wcmVzc01vZGUoKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldENvbXByZXNzTW9kZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0RG9jQ29tcHJlc3NNb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXREb2NDb21wcmVzc01vZGUoZG9jKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0RG9jQ29tcHJlc3NNb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0SW50U3Vic2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRHRkUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgcG9pbnRlciAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldEludFN1YnNldChkb2MpOwogICAgICAgIGRlc3JldF94bWxEdGRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXRJbnRTdWJzZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRMYXN0Q2hpbGQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHBhcmVudDsgLyogdGhlIHBhcmVudCBub2RlICovCiAgICBpbnQgbl9wYXJlbnQ7CgogICAgZm9yIChuX3BhcmVudCA9IDA7bl9wYXJlbnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3BhcmVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwYXJlbnQgPSBnZW5feG1sTm9kZVB0cihuX3BhcmVudCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXRMYXN0Q2hpbGQocGFyZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9wYXJlbnQsIHBhcmVudCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXRMYXN0Q2hpbGQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGFyZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRMaW5lTm8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBsb25nIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHZhbGlkIG5vZGUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldExpbmVObyhub2RlKTsKICAgICAgICBkZXNyZXRfbG9uZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldExpbmVObyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXROb05zUHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXROb05zUHJvcChub2RlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0Tm9Oc1Byb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXROb2RlUGF0aCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldE5vZGVQYXRoKG5vZGUpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldE5vZGVQYXRoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXROc0xpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0TnNQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBuYW1lU3BhY2U7IC8qIHRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZSAqLwogICAgaW50IG5fbmFtZVNwYWNlOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25hbWVTcGFjZSA9IDA7bl9uYW1lU3BhY2UgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lU3BhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIG5hbWVTcGFjZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWVTcGFjZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXROc1Byb3Aobm9kZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVTcGFjZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZVNwYWNlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVTcGFjZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXROc1Byb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVTcGFjZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0UHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXRQcm9wKG5vZGUsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXRQcm9wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzTnNQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQXR0clB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZVNwYWNlOyAvKiB0aGUgVVJJIG9mIHRoZSBuYW1lc3BhY2UgKi8KICAgIGludCBuX25hbWVTcGFjZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lU3BhY2UgPSAwO25fbmFtZVNwYWNlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZVNwYWNlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBuYW1lU3BhY2UgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lU3BhY2UsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzTnNQcm9wKG5vZGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lU3BhY2UpOwogICAgICAgIGRlc3JldF94bWxBdHRyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZVNwYWNlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVTcGFjZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNOc1Byb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVTcGFjZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzUHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEF0dHJQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzUHJvcChub2RlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxBdHRyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNQcm9wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNCbGFua05vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzQmxhbmtOb2RlKG5vZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJc0JsYW5rTm9kZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJc1hIVE1MKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogc3lzdGVtSUQ7IC8qIHRoZSBzeXN0ZW0gaWRlbnRpZmllciAqLwogICAgaW50IG5fc3lzdGVtSUQ7CiAgICB4bWxDaGFyICogcHVibGljSUQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciAqLwogICAgaW50IG5fcHVibGljSUQ7CgogICAgZm9yIChuX3N5c3RlbUlEID0gMDtuX3N5c3RlbUlEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzdGVtSUQrKykgewogICAgZm9yIChuX3B1YmxpY0lEID0gMDtuX3B1YmxpY0lEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHVibGljSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3lzdGVtSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXN0ZW1JRCwgMCk7CiAgICAgICAgcHVibGljSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJsaWNJRCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxJc1hIVE1MKChjb25zdCB4bWxDaGFyICopc3lzdGVtSUQsIChjb25zdCB4bWxDaGFyICopcHVibGljSUQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c3RlbUlELCAoY29uc3QgeG1sQ2hhciAqKXN5c3RlbUlELCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJsaWNJRCwgKGNvbnN0IHhtbENoYXIgKilwdWJsaWNJRCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJc1hIVE1MIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5c3RlbUlEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3B1YmxpY0lEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdDRGF0YUJsb2NrKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIENEQVRBIGJsb2NrIGNvbnRlbnQgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKICAgIGludCBsZW47IC8qIHRoZSBsZW5ndGggb2YgdGhlIGJsb2NrICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdDRGF0YUJsb2NrKGRvYywgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCBsZW4pOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0NEYXRhQmxvY2siLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdDaGFyUmVmKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGNoYXIgcmVmIHN0cmluZywgc3RhcnRpbmcgd2l0aCAjIG9yICImIyAuLi4gOyIgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0NoYXJSZWYoZG9jLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdDaGFyUmVmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdDaGlsZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQojaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBwYXJlbnQ7IC8qIHRoZSBwYXJlbnQgbm9kZSAqLwogICAgaW50IG5fcGFyZW50OwogICAgeG1sTnNQdHIgbnM7IC8qIGEgbmFtZXNwYWNlIGlmIGFueSAqLwogICAgaW50IG5fbnM7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIGNoaWxkICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBYTUwgY29udGVudCBvZiB0aGUgY2hpbGQgaWYgYW55LiAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fcGFyZW50ID0gMDtuX3BhcmVudCA8IGdlbl9uYl94bWxOb2RlUHRyO25fcGFyZW50KyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhcmVudCA9IGdlbl94bWxOb2RlUHRyKG5fcGFyZW50LCAwKTsKICAgICAgICBucyA9IGdlbl94bWxOc1B0cihuX25zLCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3Q2hpbGQocGFyZW50LCBucywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3BhcmVudCwgcGFyZW50LCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0NoaWxkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BhcmVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3Q29tbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgY29tbWVudCBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0NvbW1lbnQoKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0NvbW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogdmVyc2lvbjsgLyogeG1sQ2hhciBzdHJpbmcgZ2l2aW5nIHRoZSB2ZXJzaW9uIG9mIFhNTCAiMS4wIiAqLwogICAgaW50IG5fdmVyc2lvbjsKCiAgICBmb3IgKG5fdmVyc2lvbiA9IDA7bl92ZXJzaW9uIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmVyc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2ZXJzaW9uID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmVyc2lvbiwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2MoKGNvbnN0IHhtbENoYXIgKil2ZXJzaW9uKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92ZXJzaW9uLCAoY29uc3QgeG1sQ2hhciAqKXZlcnNpb24sIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3RG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZlcnNpb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0RvY0NvbW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgY29tbWVudCBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2NDb21tZW50KGRvYywgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3RG9jQ29tbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jRnJhZ21lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgb3duaW5nIHRoZSBmcmFnbWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0RvY0ZyYWdtZW50KGRvYyk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdEb2NGcmFnbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdEb2NOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOc1B0ciBuczsgLyogbmFtZXNwYWNlIGlmIGFueSAqLwogICAgaW50IG5fbnM7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5vZGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgWE1MIHRleHQgY29udGVudCBpZiBhbnkgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2NOb2RlKGRvYywgbnMsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0RvY05vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jTm9kZUVhdE5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5zUHRyIG5zOyAvKiBuYW1lc3BhY2UgaWYgYW55ICovCiAgICBpbnQgbl9uczsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbm9kZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBYTUwgdGV4dCBjb250ZW50IGlmIGFueSAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5zUHRyO25fbnMrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9lYXRlbl9uYW1lO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBucyA9IGdlbl94bWxOc1B0cihuX25zLCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2VhdGVuX25hbWUobl9uYW1lLCAyKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2NOb2RlRWF0TmFtZShkb2MsIG5zLCBuYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOc1B0cihuX25zLCBucywgMSk7CiAgICAgICAgZGVzX2VhdGVuX25hbWUobl9uYW1lLCBuYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3RG9jTm9kZUVhdE5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jUEkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgdGFyZ2V0IGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgUEkgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0RvY1BJKGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0RvY1BJIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0RvY1Byb3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0RvY1Byb3AoZG9jLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF94bWxBdHRyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3RG9jUHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jUmF3Tm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9UUkVFX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTnNQdHIgbnM7IC8qIG5hbWVzcGFjZSBpZiBhbnkgKi8KICAgIGludCBuX25zOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBub2RlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIHRleHQgY29udGVudCBpZiBhbnkgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2NSYXdOb2RlKGRvYywgbnMsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0RvY1Jhd05vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdEb2NUZXh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIHRleHQgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3RG9jVGV4dChkb2MsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0RvY1RleHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0RvY1RleHRMZW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwogICAgaW50IGxlbjsgLyogdGhlIHRleHQgbGVuLiAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3RG9jVGV4dExlbihkb2MsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdEb2NUZXh0TGVuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RHRkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRHRkUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgcG9pbnRlciAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBEVEQgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiB0aGUgZXh0ZXJuYWwgSUQgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CiAgICB4bWxDaGFyICogU3lzdGVtSUQ7IC8qIHRoZSBzeXN0ZW0gSUQgKi8KICAgIGludCBuX1N5c3RlbUlEOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fRXh0ZXJuYWxJRCA9IDA7bl9FeHRlcm5hbElEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fRXh0ZXJuYWxJRCsrKSB7CiAgICBmb3IgKG5fU3lzdGVtSUQgPSAwO25fU3lzdGVtSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9TeXN0ZW1JRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDIpOwogICAgICAgIFN5c3RlbUlEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3RHRkKGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQpOwogICAgICAgIGRlc3JldF94bWxEdGRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1N5c3RlbUlELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlELCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0R0ZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9FeHRlcm5hbElEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1N5c3RlbUlEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTnNQdHIgbnM7IC8qIG5hbWVzcGFjZSBpZiBhbnkgKi8KICAgIGludCBuX25zOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBub2RlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5zUHRyO25fbnMrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3Tm9kZShucywgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5zUHRyKG5fbnMsIG5zLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3Tm9kZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdOb2RlRWF0TmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5zUHRyIG5zOyAvKiBuYW1lc3BhY2UgaWYgYW55ICovCiAgICBpbnQgbl9uczsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbm9kZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfZWF0ZW5fbmFtZTtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9lYXRlbl9uYW1lKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdOb2RlRWF0TmFtZShucywgbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOc1B0cihuX25zLCBucywgMCk7CiAgICAgICAgZGVzX2VhdGVuX25hbWUobl9uYW1lLCBuYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld05vZGVFYXROYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld05zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTnNQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIGVsZW1lbnQgY2FycnlpbmcgdGhlIG5hbWVzcGFjZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBocmVmOyAvKiB0aGUgVVJJIGFzc29jaWF0ZWQgKi8KICAgIGludCBuX2hyZWY7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgcHJlZml4IGZvciB0aGUgbmFtZXNwYWNlICovCiAgICBpbnQgbl9wcmVmaXg7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5faHJlZiA9IDA7bl9ocmVmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25faHJlZisrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBocmVmID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5faHJlZiwgMSk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld05zKG5vZGUsIChjb25zdCB4bWxDaGFyICopaHJlZiwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgpOwogICAgICAgIGlmICgobm9kZSA9PSBOVUxMKSAmJiAocmV0X3ZhbCAhPSBOVUxMKSkgeG1sRnJlZU5zKHJldF92YWwpOwogICAgICAgIGRlc3JldF94bWxOc1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9ocmVmLCAoY29uc3QgeG1sQ2hhciAqKWhyZWYsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3TnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ocmVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3TnNQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQXR0clB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgaG9sZGluZyBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTnNQdHIgbnM7IC8qIHRoZSBuYW1lc3BhY2UgKi8KICAgIGludCBuX25zOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld05zUHJvcChub2RlLCBucywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfeG1sQXR0clB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3TnNQcm9wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3TnNQcm9wRWF0TmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEF0dHJQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIGhvbGRpbmcgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbE5zUHRyIG5zOyAvKiB0aGUgbmFtZXNwYWNlICovCiAgICBpbnQgbl9uczsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTnNQdHI7bl9ucysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2VhdGVuX25hbWU7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fZWF0ZW5fbmFtZShuX25hbWUsIDIpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3TnNQcm9wRWF0TmFtZShub2RlLCBucywgbmFtZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X3htbEF0dHJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX3htbE5zUHRyKG5fbnMsIG5zLCAxKTsKICAgICAgICBkZXNfZWF0ZW5fbmFtZShuX25hbWUsIG5hbWUsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld05zUHJvcEVhdE5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdQSSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBQSSBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdQSSgoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1BJIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3UHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfVFJFRV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBob2xkaW5nIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3UHJvcChub2RlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF94bWxBdHRyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3UHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3UmVmZXJlbmNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHJlZmVyZW5jZSBuYW1lLCBvciB0aGUgcmVmZXJlbmNlIHN0cmluZyB3aXRoICYgYW5kIDsgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1JlZmVyZW5jZShkb2MsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1JlZmVyZW5jZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3VGV4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1RleHQoKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1RleHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3VGV4dENoaWxkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBwYXJlbnQ7IC8qIHRoZSBwYXJlbnQgbm9kZSAqLwogICAgaW50IG5fcGFyZW50OwogICAgeG1sTnNQdHIgbnM7IC8qIGEgbmFtZXNwYWNlIGlmIGFueSAqLwogICAgaW50IG5fbnM7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIGNoaWxkICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNoaWxkIGlmIGFueS4gKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX3BhcmVudCA9IDA7bl9wYXJlbnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3BhcmVudCsrKSB7CiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTnNQdHI7bl9ucysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwYXJlbnQgPSBnZW5feG1sTm9kZVB0cihuX3BhcmVudCwgMCk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgMSk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDIpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1RleHRDaGlsZChwYXJlbnQsIG5zLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fcGFyZW50LCBwYXJlbnQsIDApOwogICAgICAgIGRlc194bWxOc1B0cihuX25zLCBucywgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3VGV4dENoaWxkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BhcmVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3VGV4dExlbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwogICAgaW50IGxlbjsgLyogdGhlIHRleHQgbGVuLiAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdUZXh0TGVuKChjb25zdCB4bWxDaGFyICopY29udGVudCwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAwKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3VGV4dExlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZUFkZENvbnRlbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgbW9kaWZpZWQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBleHRyYSBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDApOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAxKTsKCiAgICAgICAgeG1sTm9kZUFkZENvbnRlbnQoY3VyLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZUFkZENvbnRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVBZGRDb250ZW50TGVuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBub2RlIGJlaW5nIG1vZGlmaWVkICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogZXh0cmEgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKICAgIGludCBsZW47IC8qIHRoZSBzaXplIG9mIEBjb250ZW50ICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDApOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgeG1sTm9kZUFkZENvbnRlbnRMZW4oY3VyLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIGxlbik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVBZGRDb250ZW50TGVuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZUJ1ZkdldENvbnRlbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEJ1ZmZlclB0ciBidWZmZXI7IC8qIGEgYnVmZmVyICovCiAgICBpbnQgbl9idWZmZXI7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgcmVhZCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZmZlciA9IGdlbl94bWxCdWZmZXJQdHIobl9idWZmZXIsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5vZGVCdWZHZXRDb250ZW50KGJ1ZmZlciwgY3VyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmZmVyLCBidWZmZXIsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZUJ1ZkdldENvbnRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZUR1bXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIFhNTCBidWZmZXIgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgbGV2ZWw7IC8qIHRoZSBpbWJyaWNhdGlvbiBsZXZlbCBmb3IgaW5kZW50aW5nICovCiAgICBpbnQgbl9sZXZlbDsKICAgIGludCBmb3JtYXQ7IC8qIGlzIGZvcm1hdHRpbmcgYWxsb3dlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fbGV2ZWwgPSAwO25fbGV2ZWwgPCBnZW5fbmJfaW50O25fbGV2ZWwrKykgewogICAgZm9yIChuX2Zvcm1hdCA9IDA7bl9mb3JtYXQgPCBnZW5fbmJfaW50O25fZm9ybWF0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAyKTsKICAgICAgICBsZXZlbCA9IGdlbl9pbnQobl9sZXZlbCwgMyk7CiAgICAgICAgZm9ybWF0ID0gZ2VuX2ludChuX2Zvcm1hdCwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOb2RlRHVtcChidWYsIGRvYywgY3VyLCBsZXZlbCwgZm9ybWF0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMik7CiAgICAgICAgZGVzX2ludChuX2xldmVsLCBsZXZlbCwgMyk7CiAgICAgICAgZGVzX2ludChuX2Zvcm1hdCwgZm9ybWF0LCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVEdW1wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xldmVsKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVEdW1wT3V0cHV0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxPdXRwdXRCdWZmZXJQdHIgYnVmOyAvKiB0aGUgWE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgKi8KICAgIGludCBuX2N1cjsKICAgIGludCBsZXZlbDsgLyogdGhlIGltYnJpY2F0aW9uIGxldmVsIGZvciBpbmRlbnRpbmcgKi8KICAgIGludCBuX2xldmVsOwogICAgaW50IGZvcm1hdDsgLyogaXMgZm9ybWF0dGluZyBhbGxvd2VkICovCiAgICBpbnQgbl9mb3JtYXQ7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIGFuIG9wdGlvbmFsIGVuY29kaW5nIHN0cmluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sT3V0cHV0QnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9sZXZlbCA9IDA7bl9sZXZlbCA8IGdlbl9uYl9pbnQ7bl9sZXZlbCsrKSB7CiAgICBmb3IgKG5fZm9ybWF0ID0gMDtuX2Zvcm1hdCA8IGdlbl9uYl9pbnQ7bl9mb3JtYXQrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDIpOwogICAgICAgIGxldmVsID0gZ2VuX2ludChuX2xldmVsLCAzKTsKICAgICAgICBmb3JtYXQgPSBnZW5faW50KG5fZm9ybWF0LCA0KTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCA1KTsKCiAgICAgICAgeG1sTm9kZUR1bXBPdXRwdXQoYnVmLCBkb2MsIGN1ciwgbGV2ZWwsIGZvcm1hdCwgKGNvbnN0IGNoYXIgKillbmNvZGluZyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAyKTsKICAgICAgICBkZXNfaW50KG5fbGV2ZWwsIGxldmVsLCAzKTsKICAgICAgICBkZXNfaW50KG5fZm9ybWF0LCBmb3JtYXQsIDQpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVEdW1wT3V0cHV0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xldmVsKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVHZXRCYXNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgdGhlIG5vZGUgcGVydGFpbnMgdG8gKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBjaGVja2VkICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTm9kZUdldEJhc2UoZG9jLCBjdXIpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVHZXRCYXNlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVHZXRDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgcmVhZCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTm9kZUdldENvbnRlbnQoY3VyKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZUdldENvbnRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlR2V0TGFuZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBub2RlIGJlaW5nIGNoZWNrZWQgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5vZGVHZXRMYW5nKGN1cik7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVHZXRMYW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZUdldFNwYWNlUHJlc2VydmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBjaGVja2VkICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOb2RlR2V0U3BhY2VQcmVzZXJ2ZShjdXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZUdldFNwYWNlUHJlc2VydmUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlSXNUZXh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOb2RlSXNUZXh0KG5vZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb2RlSXNUZXh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVMaXN0R2V0UmF3U3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgbGlzdDsgLyogYSBOb2RlIGxpc3QgKi8KICAgIGludCBuX2xpc3Q7CiAgICBpbnQgaW5MaW5lOyAvKiBzaG91bGQgd2UgcmVwbGFjZSBlbnRpdHkgY29udGVudHMgb3Igc2hvdyB0aGVpciBleHRlcm5hbCBmb3JtICovCiAgICBpbnQgbl9pbkxpbmU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9saXN0ID0gMDtuX2xpc3QgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2xpc3QrKykgewogICAgZm9yIChuX2luTGluZSA9IDA7bl9pbkxpbmUgPCBnZW5fbmJfaW50O25faW5MaW5lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGxpc3QgPSBnZW5feG1sTm9kZVB0cihuX2xpc3QsIDEpOwogICAgICAgIGluTGluZSA9IGdlbl9pbnQobl9pbkxpbmUsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sTm9kZUxpc3RHZXRSYXdTdHJpbmcoZG9jLCBsaXN0LCBpbkxpbmUpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2xpc3QsIGxpc3QsIDEpOwogICAgICAgIGRlc19pbnQobl9pbkxpbmUsIGluTGluZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb2RlTGlzdEdldFJhd1N0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGlzdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbkxpbmUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlTGlzdEdldFN0cmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGxpc3Q7IC8qIGEgTm9kZSBsaXN0ICovCiAgICBpbnQgbl9saXN0OwogICAgaW50IGluTGluZTsgLyogc2hvdWxkIHdlIHJlcGxhY2UgZW50aXR5IGNvbnRlbnRzIG9yIHNob3cgdGhlaXIgZXh0ZXJuYWwgZm9ybSAqLwogICAgaW50IG5faW5MaW5lOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbGlzdCA9IDA7bl9saXN0IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9saXN0KyspIHsKICAgIGZvciAobl9pbkxpbmUgPSAwO25faW5MaW5lIDwgZ2VuX25iX2ludDtuX2luTGluZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBsaXN0ID0gZ2VuX3htbE5vZGVQdHIobl9saXN0LCAxKTsKICAgICAgICBpbkxpbmUgPSBnZW5faW50KG5faW5MaW5lLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgbGlzdCwgaW5MaW5lKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9saXN0LCBsaXN0LCAxKTsKICAgICAgICBkZXNfaW50KG5faW5MaW5lLCBpbkxpbmUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZUxpc3RHZXRTdHJpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xpc3QpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5MaW5lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlU2V0QmFzZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfWElOQ0xVREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBjaGFuZ2VkICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxDaGFyICogdXJpOyAvKiB0aGUgbmV3IGJhc2UgVVJJICovCiAgICBpbnQgbl91cmk7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fdXJpID0gMDtuX3VyaSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3VyaSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMCk7CiAgICAgICAgdXJpID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdXJpLCAxKTsKCiAgICAgICAgeG1sTm9kZVNldEJhc2UoY3VyLCAoY29uc3QgeG1sQ2hhciAqKXVyaSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3VyaSwgKGNvbnN0IHhtbENoYXIgKil1cmksIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZVNldEJhc2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VyaSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVTZXRDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBub2RlIGJlaW5nIG1vZGlmaWVkICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHhtbE5vZGVTZXRDb250ZW50KGN1ciwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVTZXRDb250ZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlU2V0Q29udGVudExlbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBtb2RpZmllZCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGNvbnRlbnQgKi8KICAgIGludCBuX2NvbnRlbnQ7CiAgICBpbnQgbGVuOyAvKiB0aGUgc2l6ZSBvZiBAY29udGVudCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHhtbE5vZGVTZXRDb250ZW50TGVuKGN1ciwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCBsZW4pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb2RlU2V0Q29udGVudExlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlU2V0TGFuZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBjaGFuZ2VkICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxDaGFyICogbGFuZzsgLyogdGhlIGxhbmd1YWdlIGRlc2NyaXB0aW9uICovCiAgICBpbnQgbl9sYW5nOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2xhbmcgPSAwO25fbGFuZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2xhbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDApOwogICAgICAgIGxhbmcgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9sYW5nLCAxKTsKCiAgICAgICAgeG1sTm9kZVNldExhbmcoY3VyLCAoY29uc3QgeG1sQ2hhciAqKWxhbmcpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9sYW5nLCAoY29uc3QgeG1sQ2hhciAqKWxhbmcsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZVNldExhbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xhbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlU2V0TmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBjaGFuZ2VkICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5ldyB0YWcgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHhtbE5vZGVTZXROYW1lKGN1ciwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVTZXROYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZVNldFNwYWNlUHJlc2VydmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgY2hhbmdlZCAqLwogICAgaW50IG5fY3VyOwogICAgaW50IHZhbDsgLyogdGhlIHhtbDpzcGFjZSB2YWx1ZSAoIjAiOiBkZWZhdWx0LCAxOiAicHJlc2VydmUiKSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAxKTsKCiAgICAgICAgeG1sTm9kZVNldFNwYWNlUHJlc2VydmUoY3VyLCB2YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfaW50KG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZVNldFNwYWNlUHJlc2VydmUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlY29uY2lsaWF0ZU5zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgdHJlZTsgLyogYSBub2RlIGRlZmluaW5nIHRoZSBzdWJ0cmVlIHRvIHJlY29uY2lsaWF0ZSAqLwogICAgaW50IG5fdHJlZTsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX3RyZWUgPSAwO25fdHJlZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fdHJlZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICB0cmVlID0gZ2VuX3htbE5vZGVQdHIobl90cmVlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlY29uY2lsaWF0ZU5zKGRvYywgdHJlZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3RyZWUsIHRyZWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVjb25jaWxpYXRlTnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RyZWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVtb3ZlUHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQXR0clB0ciBjdXI7IC8qIGFuIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbEF0dHJQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbEF0dHJQdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUmVtb3ZlUHJvcChjdXIpOwogICAgICAgIGN1ciA9IE5VTEw7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZW1vdmVQcm9wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlcGxhY2VOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgb2xkOyAvKiB0aGUgb2xkIG5vZGUgKi8KICAgIGludCBuX29sZDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9vbGQgPSAwO25fb2xkIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9vbGQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cl9pbjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvbGQgPSBnZW5feG1sTm9kZVB0cihuX29sZCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHJfaW4obl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVwbGFjZU5vZGUob2xkLCBjdXIpOwogICAgICAgIGlmIChjdXIgIT0gTlVMTCkgewogICAgICAgICAgICAgIHhtbFVubGlua05vZGUoY3VyKTsKICAgICAgICAgICAgICB4bWxGcmVlTm9kZShjdXIpIDsgY3VyID0gTlVMTCA7IH0KICAgICAgICAgIGlmIChvbGQgIT0gTlVMTCkgewogICAgICAgICAgICAgIHhtbFVubGlua05vZGUob2xkKTsKICAgICAgICAgICAgICB4bWxGcmVlTm9kZShvbGQpIDsgb2xkID0gTlVMTCA7IH0KCSAgcmV0X3ZhbCA9IE5VTEw7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fb2xkLCBvbGQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyX2luKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVwbGFjZU5vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb2xkKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNhdmVGaWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lIChvciBVUkwpICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTYXZlRmlsZShmaWxlbmFtZSwgY3VyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNhdmVGaWxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNhdmVGaWxlRW5jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lIChvciBVUkwpICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgbmFtZSBvZiBhbiBlbmNvZGluZyAob3IgTlVMTCkgKi8KICAgIGludCBuX2VuY29kaW5nOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMSk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTYXZlRmlsZUVuYyhmaWxlbmFtZSwgY3VyLCAoY29uc3QgY2hhciAqKWVuY29kaW5nKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlRmlsZUVuYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlRmlsZVRvKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWY7IC8qIGFuIG91dHB1dCBJL08gYnVmZmVyICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIGlmIGFueSBhc3N1bWluZyB0aGUgSS9PIGxheWVyIGhhbmRsZXMgdGhlIHRyYW5jb2RpbmcgKi8KICAgIGludCBuX2VuY29kaW5nOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMSk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTYXZlRmlsZVRvKGJ1ZiwgY3VyLCAoY29uc3QgY2hhciAqKWVuY29kaW5nKTsKICAgICAgICBidWYgPSBOVUxMOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlRmlsZVRvIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlRm9ybWF0RmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAob3IgVVJMKSAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIGludCBmb3JtYXQ7IC8qIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkICovCiAgICBpbnQgbl9mb3JtYXQ7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2Zvcm1hdCA9IDA7bl9mb3JtYXQgPCBnZW5fbmJfaW50O25fZm9ybWF0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMSk7CiAgICAgICAgZm9ybWF0ID0gZ2VuX2ludChuX2Zvcm1hdCwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTYXZlRm9ybWF0RmlsZShmaWxlbmFtZSwgY3VyLCBmb3JtYXQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIGRlc19pbnQobl9mb3JtYXQsIGZvcm1hdCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlRm9ybWF0RmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZm9ybWF0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2F2ZUZvcm1hdEZpbGVFbmModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgb3IgVVJMIHRvIG91dHB1dCAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgYmVpbmcgc2F2ZWQgKi8KICAgIGludCBuX2N1cjsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nIHRvIHVzZSBvciBOVUxMLiAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmUgYWRkZWQuICovCiAgICBpbnQgbl9mb3JtYXQ7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX2Zvcm1hdCA9IDA7bl9mb3JtYXQgPCBnZW5fbmJfaW50O25fZm9ybWF0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMSk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMik7CiAgICAgICAgZm9ybWF0ID0gZ2VuX2ludChuX2Zvcm1hdCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxTYXZlRm9ybWF0RmlsZUVuYyhmaWxlbmFtZSwgY3VyLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBmb3JtYXQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAyKTsKICAgICAgICBkZXNfaW50KG5fZm9ybWF0LCBmb3JtYXQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2F2ZUZvcm1hdEZpbGVFbmMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNhdmVGb3JtYXRGaWxlVG8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sT3V0cHV0QnVmZmVyUHRyIGJ1ZjsgLyogYW4gb3V0cHV0IEkvTyBidWZmZXIgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZW5jb2RpbmcgaWYgYW55IGFzc3VtaW5nIHRoZSBJL08gbGF5ZXIgaGFuZGxlcyB0aGUgdHJhbmNvZGluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX2Zvcm1hdCA9IDA7bl9mb3JtYXQgPCBnZW5fbmJfaW50O25fZm9ybWF0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2F2ZUZvcm1hdEZpbGVUbyhidWYsIGN1ciwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgZm9ybWF0KTsKICAgICAgICBidWYgPSBOVUxMOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgZGVzX2ludChuX2Zvcm1hdCwgZm9ybWF0LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNhdmVGb3JtYXRGaWxlVG8iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mb3JtYXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTZWFyY2hOcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5zUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIGN1cnJlbnQgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBuYW1lU3BhY2U7IC8qIHRoZSBuYW1lc3BhY2UgcHJlZml4ICovCiAgICBpbnQgbl9uYW1lU3BhY2U7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25hbWVTcGFjZSA9IDA7bl9uYW1lU3BhY2UgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lU3BhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CiAgICAgICAgbmFtZVNwYWNlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZVNwYWNlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNlYXJjaE5zKGRvYywgbm9kZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lU3BhY2UpOwogICAgICAgIGRlc3JldF94bWxOc1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWVTcGFjZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lU3BhY2UsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2VhcmNoTnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZVNwYWNlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTZWFyY2hOc0J5SHJlZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5zUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIGN1cnJlbnQgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBocmVmOyAvKiB0aGUgbmFtZXNwYWNlIHZhbHVlICovCiAgICBpbnQgbl9ocmVmOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ocmVmID0gMDtuX2hyZWYgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9ocmVmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDEpOwogICAgICAgIGhyZWYgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9ocmVmLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNlYXJjaE5zQnlIcmVmKGRvYywgbm9kZSwgKGNvbnN0IHhtbENoYXIgKilocmVmKTsKICAgICAgICBkZXNyZXRfeG1sTnNQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9ocmVmLCAoY29uc3QgeG1sQ2hhciAqKWhyZWYsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2VhcmNoTnNCeUhyZWYiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faHJlZik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2V0QnVmZmVyQWxsb2NhdGlvblNjaGVtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUgc2NoZW1lOyAvKiBhbGxvY2F0aW9uIG1ldGhvZCB0byB1c2UgKi8KICAgIGludCBuX3NjaGVtZTsKCiAgICBmb3IgKG5fc2NoZW1lID0gMDtuX3NjaGVtZSA8IGdlbl9uYl94bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lO25fc2NoZW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNjaGVtZSA9IGdlbl94bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lKG5fc2NoZW1lLCAwKTsKCiAgICAgICAgeG1sU2V0QnVmZmVyQWxsb2NhdGlvblNjaGVtZShzY2hlbWUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyQWxsb2NhdGlvblNjaGVtZShuX3NjaGVtZSwgc2NoZW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNldEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2NoZW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTZXRDb21wcmVzc01vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgbW9kZTsgLyogdGhlIGNvbXByZXNzaW9uIHJhdGlvICovCiAgICBpbnQgbl9tb2RlOwoKICAgIGZvciAobl9tb2RlID0gMDtuX21vZGUgPCBnZW5fbmJfaW50O25fbW9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBtb2RlID0gZ2VuX2ludChuX21vZGUsIDApOwoKICAgICAgICB4bWxTZXRDb21wcmVzc01vZGUobW9kZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9tb2RlLCBtb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNldENvbXByZXNzTW9kZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9tb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTZXREb2NDb21wcmVzc01vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIGludCBtb2RlOyAvKiB0aGUgY29tcHJlc3Npb24gcmF0aW8gKi8KICAgIGludCBuX21vZGU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9tb2RlID0gMDtuX21vZGUgPCBnZW5fbmJfaW50O25fbW9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBtb2RlID0gZ2VuX2ludChuX21vZGUsIDEpOwoKICAgICAgICB4bWxTZXREb2NDb21wcmVzc01vZGUoZG9jLCBtb2RlKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfaW50KG5fbW9kZSwgbW9kZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTZXREb2NDb21wcmVzc01vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNldE5zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgaW4gdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTnNQdHIgbnM7IC8qIGEgbmFtZXNwYWNlIHBvaW50ZXIgKi8KICAgIGludCBuX25zOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5zUHRyO25fbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgMSk7CgogICAgICAgIHhtbFNldE5zKG5vZGUsIG5zKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2V0TnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2V0TnNQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9YSU5DTFVERV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEF0dHJQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxOc1B0ciBuczsgLyogdGhlIG5hbWVzcGFjZSBkZWZpbml0aW9uICovCiAgICBpbnQgbl9uczsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5zUHRyO25fbnMrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgMSk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDIpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2V0TnNQcm9wKG5vZGUsIG5zLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF94bWxBdHRyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc194bWxOc1B0cihuX25zLCBucywgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTZXROc1Byb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2V0UHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfWElOQ0xVREVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIGF0dHJpYnV0ZSB2YWx1ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTZXRQcm9wKG5vZGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X3htbEF0dHJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTZXRQcm9wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNwbGl0UU5hbWUyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGZ1bGwgUU5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICoqIHByZWZpeDsgLyogYSB4bWxDaGFyICoqICovCiAgICBpbnQgbl9wcmVmaXg7CgogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3ByZWZpeCA9IDA7bl9wcmVmaXggPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25fcHJlZml4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5feG1sQ2hhcl9wdHJfcHRyKG5fcHJlZml4LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNwbGl0UU5hbWUyKChjb25zdCB4bWxDaGFyICopbmFtZSwgcHJlZml4KTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMCk7CiAgICAgICAgZGVzX3htbENoYXJfcHRyX3B0cihuX3ByZWZpeCwgcHJlZml4LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNwbGl0UU5hbWUyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTcGxpdFFOYW1lMyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBmdWxsIFFOYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgaW50ICogbGVuOyAvKiBhbiBpbnQgKiAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludF9wdHI7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDApOwogICAgICAgIGxlbiA9IGdlbl9pbnRfcHRyKG5fbGVuLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNwbGl0UU5hbWUzKChjb25zdCB4bWxDaGFyICopbmFtZSwgbGVuKTsKICAgICAgICBkZXNyZXRfY29uc3RfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMCk7CiAgICAgICAgZGVzX2ludF9wdHIobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTcGxpdFFOYW1lMyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyaW5nR2V0Tm9kZUxpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cmluZ0dldE5vZGVMaXN0KGRvYywgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyaW5nR2V0Tm9kZUxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJpbmdMZW5HZXROb2RlTGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgb2YgdGhlIHRleHQgKi8KICAgIGludCBuX3ZhbHVlOwogICAgaW50IGxlbjsgLyogdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHZhbHVlICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cmluZ0xlbkdldE5vZGVMaXN0KGRvYywgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cmluZ0xlbkdldE5vZGVMaXN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRDb25jYXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIGNvbnRlbnQgKi8KICAgIGludCBuX2NvbnRlbnQ7CiAgICBpbnQgbGVuOyAvKiBAY29udGVudCBsZW5ndGggKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0Q29uY2F0KG5vZGUsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRDb25jYXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dE1lcmdlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBmaXJzdDsgLyogdGhlIGZpcnN0IHRleHQgbm9kZSAqLwogICAgaW50IG5fZmlyc3Q7CiAgICB4bWxOb2RlUHRyIHNlY29uZDsgLyogdGhlIHNlY29uZCB0ZXh0IG5vZGUgYmVpbmcgbWVyZ2VkICovCiAgICBpbnQgbl9zZWNvbmQ7CgogICAgZm9yIChuX2ZpcnN0ID0gMDtuX2ZpcnN0IDwgZ2VuX25iX3htbE5vZGVQdHJfaW47bl9maXJzdCsrKSB7CiAgICBmb3IgKG5fc2Vjb25kID0gMDtuX3NlY29uZCA8IGdlbl9uYl94bWxOb2RlUHRyX2luO25fc2Vjb25kKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpcnN0ID0gZ2VuX3htbE5vZGVQdHJfaW4obl9maXJzdCwgMCk7CiAgICAgICAgc2Vjb25kID0gZ2VuX3htbE5vZGVQdHJfaW4obl9zZWNvbmQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dE1lcmdlKGZpcnN0LCBzZWNvbmQpOwogICAgICAgIGlmICgoZmlyc3QgIT0gTlVMTCkgJiYgKGZpcnN0LT50eXBlICE9IFhNTF9URVhUX05PREUpKSB7CiAgICAgICAgICAgICAgeG1sVW5saW5rTm9kZShzZWNvbmQpOwogICAgICAgICAgICAgIHhtbEZyZWVOb2RlKHNlY29uZCkgOyBzZWNvbmQgPSBOVUxMIDsgfQogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9pbihuX2ZpcnN0LCBmaXJzdCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHJfaW4obl9zZWNvbmQsIHNlY29uZCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0TWVyZ2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlyc3QpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2Vjb25kKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVbnNldE5zUHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTnNQdHIgbnM7IC8qIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiAqLwogICAgaW50IG5fbnM7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5zUHRyO25fbnMrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgMSk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVW5zZXROc1Byb3Aobm9kZSwgbnMsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVbnNldE5zUHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVbnNldFByb3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxVbnNldFByb3Aobm9kZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVbnNldFByb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVOQ05hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9UUkVFX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgdG8gY2hlY2sgKi8KICAgIGludCBuX3ZhbHVlOwogICAgaW50IHNwYWNlOyAvKiBhbGxvdyBzcGFjZXMgaW4gZnJvbnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nICovCiAgICBpbnQgbl9zcGFjZTsKCiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fc3BhY2UgPSAwO25fc3BhY2UgPCBnZW5fbmJfaW50O25fc3BhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMCk7CiAgICAgICAgc3BhY2UgPSBnZW5faW50KG5fc3BhY2UsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVOQ05hbWUoKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgc3BhY2UpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAwKTsKICAgICAgICBkZXNfaW50KG5fc3BhY2UsIHNwYWNlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlTkNOYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NwYWNlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlTk1Ub2tlbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQojaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgaW50IG5fdmFsdWU7CiAgICBpbnQgc3BhY2U7IC8qIGFsbG93IHNwYWNlcyBpbiBmcm9udCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcgKi8KICAgIGludCBuX3NwYWNlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl9zcGFjZSA9IDA7bl9zcGFjZSA8IGdlbl9uYl9pbnQ7bl9zcGFjZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAwKTsKICAgICAgICBzcGFjZSA9IGdlbl9pbnQobl9zcGFjZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZU5NVG9rZW4oKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgc3BhY2UpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAwKTsKICAgICAgICBkZXNfaW50KG5fc3BhY2UsIHNwYWNlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlTk1Ub2tlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zcGFjZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZU5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9UUkVFX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgdG8gY2hlY2sgKi8KICAgIGludCBuX3ZhbHVlOwogICAgaW50IHNwYWNlOyAvKiBhbGxvdyBzcGFjZXMgaW4gZnJvbnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nICovCiAgICBpbnQgbl9zcGFjZTsKCiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fc3BhY2UgPSAwO25fc3BhY2UgPCBnZW5fbmJfaW50O25fc3BhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMCk7CiAgICAgICAgc3BhY2UgPSBnZW5faW50KG5fc3BhY2UsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVOYW1lKChjb25zdCB4bWxDaGFyICopdmFsdWUsIHNwYWNlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgZGVzX2ludChuX3NwYWNlLCBzcGFjZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZU5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3BhY2UpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVRTmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQojaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgaW50IG5fdmFsdWU7CiAgICBpbnQgc3BhY2U7IC8qIGFsbG93IHNwYWNlcyBpbiBmcm9udCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcgKi8KICAgIGludCBuX3NwYWNlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl9zcGFjZSA9IDA7bl9zcGFjZSA8IGdlbl9uYl9pbnQ7bl9zcGFjZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAwKTsKICAgICAgICBzcGFjZSA9IGdlbl9pbnQobl9zcGFjZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZVFOYW1lKChjb25zdCB4bWxDaGFyICopdmFsdWUsIHNwYWNlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgZGVzX2ludChuX3NwYWNlLCBzcGFjZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZVFOYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NwYWNlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfdHJlZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgdHJlZSA6IDEyOSBvZiAxNDYgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFkZENoaWxkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFkZENoaWxkTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGROZXh0U2libGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGRQcmV2U2libGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGRTaWJsaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF0dHJTZXJpYWxpemVUeHRDb250ZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckFkZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxCdWZmZXJBZGRIZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckNDYXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVmZmVyQ2F0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckNvbnRlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVmZmVyQ3JlYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckNyZWF0ZVNpemUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVmZmVyQ3JlYXRlU3RhdGljKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckVtcHR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckdyb3coKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVmZmVyTGVuZ3RoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlclJlc2l6ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxCdWZmZXJTZXRBbGxvY2F0aW9uU2NoZW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlclNocmluaygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxCdWZmZXJXcml0ZUNIQVIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVmZmVyV3JpdGVDaGFyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1aWxkUU5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weURvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDb3B5RHRkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlOYW1lc3BhY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weU5hbWVzcGFjZUxpc3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weU5vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weU5vZGVMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlQcm9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlQcm9wTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDcmVhdGVJbnRTdWJzZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRG9jQ29weU5vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRG9jQ29weU5vZGVMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERvY0R1bXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRG9jRHVtcEZvcm1hdE1lbW9yeSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEb2NEdW1wRm9ybWF0TWVtb3J5RW5jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERvY0R1bXBNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRG9jRHVtcE1lbW9yeUVuYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEb2NGb3JtYXREdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERvY0dldFJvb3RFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERvY1NldFJvb3RFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEVsZW1EdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0Q29tcHJlc3NNb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldERvY0NvbXByZXNzTW9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRJbnRTdWJzZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0TGFzdENoaWxkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldExpbmVObygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXROb05zUHJvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXROb2RlUGF0aCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXROc0xpc3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0TnNQcm9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldFByb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzTnNQcm9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc1Byb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSXNCbGFua05vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSXNYSFRNTCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdDRGF0YUJsb2NrKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0NoYXJSZWYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3Q2hpbGQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3Q29tbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdEb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3RG9jQ29tbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdEb2NGcmFnbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdEb2NOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0RvY05vZGVFYXROYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0RvY1BJKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0RvY1Byb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3RG9jUmF3Tm9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdEb2NUZXh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0RvY1RleHRMZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3RHRkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld05vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3Tm9kZUVhdE5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3TnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3TnNQcm9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld05zUHJvcEVhdE5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3UEkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3UHJvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdSZWZlcmVuY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdUZXh0Q2hpbGQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dExlbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlQWRkQ29udGVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlQWRkQ29udGVudExlbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlQnVmR2V0Q29udGVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlRHVtcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlRHVtcE91dHB1dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlR2V0QmFzZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlR2V0Q29udGVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlR2V0TGFuZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlR2V0U3BhY2VQcmVzZXJ2ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlSXNUZXh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vZGVMaXN0R2V0UmF3U3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vZGVMaXN0R2V0U3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vZGVTZXRCYXNlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vZGVTZXRDb250ZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vZGVTZXRDb250ZW50TGVuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vZGVTZXRMYW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vZGVTZXROYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vZGVTZXRTcGFjZVByZXNlcnZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlY29uY2lsaWF0ZU5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlbW92ZVByb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVwbGFjZU5vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZUZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZUZpbGVFbmMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZUZpbGVUbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlRm9ybWF0RmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlRm9ybWF0RmlsZUVuYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlRm9ybWF0RmlsZVRvKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNlYXJjaE5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNlYXJjaE5zQnlIcmVmKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNldEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2V0Q29tcHJlc3NNb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNldERvY0NvbXByZXNzTW9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTZXROcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTZXROc1Byb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2V0UHJvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTcGxpdFFOYW1lMigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTcGxpdFFOYW1lMygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJpbmdHZXROb2RlTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJpbmdMZW5HZXROb2RlTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0Q29uY2F0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRNZXJnZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVbnNldE5zUHJvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVbnNldFByb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVOQ05hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVOTVRva2VuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlTmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZVFOYW1lKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB0cmVlOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxCdWlsZFJlbGF0aXZlVVJJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogVVJJOyAvKiB0aGUgVVJJIHJlZmVyZW5jZSB1bmRlciBjb25zaWRlcmF0aW9uICovCiAgICBpbnQgbl9VUkk7CiAgICB4bWxDaGFyICogYmFzZTsgLyogdGhlIGJhc2UgdmFsdWUgKi8KICAgIGludCBuX2Jhc2U7CgogICAgZm9yIChuX1VSSSA9IDA7bl9VUkkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9VUkkrKykgewogICAgZm9yIChuX2Jhc2UgPSAwO25fYmFzZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2Jhc2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAwKTsKICAgICAgICBiYXNlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fYmFzZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWlsZFJlbGF0aXZlVVJJKChjb25zdCB4bWxDaGFyICopVVJJLCAoY29uc3QgeG1sQ2hhciAqKWJhc2UpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAoY29uc3QgeG1sQ2hhciAqKVVSSSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fYmFzZSwgKGNvbnN0IHhtbENoYXIgKiliYXNlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1aWxkUmVsYXRpdmVVUkkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Jhc2UpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEJ1aWxkVVJJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogVVJJOyAvKiB0aGUgVVJJIGluc3RhbmNlIGZvdW5kIGluIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fVVJJOwogICAgeG1sQ2hhciAqIGJhc2U7IC8qIHRoZSBiYXNlIHZhbHVlICovCiAgICBpbnQgbl9iYXNlOwoKICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJJKyspIHsKICAgIGZvciAobl9iYXNlID0gMDtuX2Jhc2UgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9iYXNlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSSSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1VSSSwgMCk7CiAgICAgICAgYmFzZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2Jhc2UsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQnVpbGRVUkkoKGNvbnN0IHhtbENoYXIgKilVUkksIChjb25zdCB4bWxDaGFyICopYmFzZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIChjb25zdCB4bWxDaGFyICopVVJJLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9iYXNlLCAoY29uc3QgeG1sQ2hhciAqKWJhc2UsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVpbGRVUkkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Jhc2UpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhbm9uaWNQYXRoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogcGF0aDsgLyogdGhlIHJlc291cmNlIGxvY2F0b3IgaW4gYSBmaWxlc3lzdGVtIG5vdGF0aW9uICovCiAgICBpbnQgbl9wYXRoOwoKICAgIGZvciAobl9wYXRoID0gMDtuX3BhdGggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wYXRoKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhdGggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wYXRoLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENhbm9uaWNQYXRoKChjb25zdCB4bWxDaGFyICopcGF0aCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wYXRoLCAoY29uc3QgeG1sQ2hhciAqKXBhdGgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2Fub25pY1BhdGgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGF0aCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlVVJJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vcm1hbGl6ZVVSSVBhdGgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNoYXIgKiBwYXRoOyAvKiBwb2ludGVyIHRvIHRoZSBwYXRoIHN0cmluZyAqLwogICAgaW50IG5fcGF0aDsKCiAgICBmb3IgKG5fcGF0aCA9IDA7bl9wYXRoIDwgZ2VuX25iX2NoYXJfcHRyO25fcGF0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwYXRoID0gZ2VuX2NoYXJfcHRyKG5fcGF0aCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOb3JtYWxpemVVUklQYXRoKHBhdGgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jaGFyX3B0cihuX3BhdGgsIHBhdGgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9ybWFsaXplVVJJUGF0aCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wYXRoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZVVSSSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbFVSSVB0ciAxCnN0YXRpYyB4bWxVUklQdHIgZ2VuX3htbFVSSVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sVVJJUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxVUklQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZVVSSVJlZmVyZW5jZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVVJJUHRyIHVyaTsgLyogcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlICovCiAgICBpbnQgbl91cmk7CiAgICBjaGFyICogc3RyOyAvKiB0aGUgc3RyaW5nIHRvIGFuYWx5emUgKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fdXJpID0gMDtuX3VyaSA8IGdlbl9uYl94bWxVUklQdHI7bl91cmkrKykgewogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9zdHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdXJpID0gZ2VuX3htbFVSSVB0cihuX3VyaSwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fc3RyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlVVJJUmVmZXJlbmNlKHVyaSwgKGNvbnN0IGNoYXIgKilzdHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxVUklQdHIobl91cmksIHVyaSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fc3RyLCAoY29uc3QgY2hhciAqKXN0ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZVVSSVJlZmVyZW5jZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91cmkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQcmludFVSSSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBzdHJlYW07IC8qIGEgRklMRSogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX3N0cmVhbTsKICAgIHhtbFVSSVB0ciB1cmk7IC8qIHBvaW50ZXIgdG8gYW4geG1sVVJJICovCiAgICBpbnQgbl91cmk7CgogICAgZm9yIChuX3N0cmVhbSA9IDA7bl9zdHJlYW0gPCBnZW5fbmJfRklMRV9wdHI7bl9zdHJlYW0rKykgewogICAgZm9yIChuX3VyaSA9IDA7bl91cmkgPCBnZW5fbmJfeG1sVVJJUHRyO25fdXJpKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cmVhbSA9IGdlbl9GSUxFX3B0cihuX3N0cmVhbSwgMCk7CiAgICAgICAgdXJpID0gZ2VuX3htbFVSSVB0cihuX3VyaSwgMSk7CgogICAgICAgIHhtbFByaW50VVJJKHN0cmVhbSwgdXJpKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fc3RyZWFtLCBzdHJlYW0sIDApOwogICAgICAgIGRlc194bWxVUklQdHIobl91cmksIHVyaSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQcmludFVSSSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHJlYW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXJpKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlVXJpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxVUklQdHIgdXJpOyAvKiBwb2ludGVyIHRvIGFuIHhtbFVSSSAqLwogICAgaW50IG5fdXJpOwoKICAgIGZvciAobl91cmkgPSAwO25fdXJpIDwgZ2VuX25iX3htbFVSSVB0cjtuX3VyaSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB1cmkgPSBnZW5feG1sVVJJUHRyKG5fdXJpLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNhdmVVcmkodXJpKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxVUklQdHIobl91cmksIHVyaSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlVXJpIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VyaSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVVJJRXNjYXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgc3RyaW5nIG9mIHRoZSBVUkkgdG8gZXNjYXBlICovCiAgICBpbnQgbl9zdHI7CgogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVSSUVzY2FwZSgoY29uc3QgeG1sQ2hhciAqKXN0cik7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVSSUVzY2FwZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVSSUVzY2FwZVN0cih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIHN0cjsgLyogc3RyaW5nIHRvIGVzY2FwZSAqLwogICAgaW50IG5fc3RyOwogICAgeG1sQ2hhciAqIGxpc3Q7IC8qIGV4Y2VwdGlvbiBsaXN0IHN0cmluZyBvZiBjaGFycyBub3QgdG8gZXNjYXBlICovCiAgICBpbnQgbl9saXN0OwoKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgIGZvciAobl9saXN0ID0gMDtuX2xpc3QgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9saXN0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CiAgICAgICAgbGlzdCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2xpc3QsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVVJJRXNjYXBlU3RyKChjb25zdCB4bWxDaGFyICopc3RyLCAoY29uc3QgeG1sQ2hhciAqKWxpc3QpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbGlzdCwgKGNvbnN0IHhtbENoYXIgKilsaXN0LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVSSUVzY2FwZVN0ciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGlzdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVVJJVW5lc2NhcGVTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF91cmkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHVyaSA6IDkgb2YgMTMgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1aWxkUmVsYXRpdmVVUkkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVpbGRVUkkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2Fub25pY1BhdGgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3JlYXRlVVJJKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vcm1hbGl6ZVVSSVBhdGgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VVUkkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VVUklSZWZlcmVuY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUHJpbnRVUkkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZVVyaSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVUklFc2NhcGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVVJJRXNjYXBlU3RyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVSSVVuZXNjYXBlU3RyaW5nKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB1cmk6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbEFkZEF0dHJpYnV0ZURlY2wodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyaWJ1dGVQdHIgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRHRkUHRyIGR0ZDsgLyogcG9pbnRlciB0byB0aGUgRFREICovCiAgICBpbnQgbl9kdGQ7CiAgICB4bWxDaGFyICogZWxlbTsgLyogdGhlIGVsZW1lbnQgbmFtZSAqLwogICAgaW50IG5fZWxlbTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbnM7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZXNwYWNlIHByZWZpeCAqLwogICAgaW50IG5fbnM7CiAgICB4bWxBdHRyaWJ1dGVUeXBlIHR5cGU7IC8qIHRoZSBhdHRyaWJ1dGUgdHlwZSAqLwogICAgaW50IG5fdHlwZTsKICAgIHhtbEF0dHJpYnV0ZURlZmF1bHQgZGVmOyAvKiB0aGUgYXR0cmlidXRlIGRlZmF1bHQgdHlwZSAqLwogICAgaW50IG5fZGVmOwogICAgeG1sQ2hhciAqIGRlZmF1bHRWYWx1ZTsgLyogdGhlIGF0dHJpYnV0ZSBkZWZhdWx0IHZhbHVlICovCiAgICBpbnQgbl9kZWZhdWx0VmFsdWU7CiAgICB4bWxFbnVtZXJhdGlvblB0ciB0cmVlOyAvKiBpZiBpdCdzIGFuIGVudW1lcmF0aW9uLCB0aGUgYXNzb2NpYXRlZCBsaXN0ICovCiAgICBpbnQgbl90cmVlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZHRkID0gMDtuX2R0ZCA8IGdlbl9uYl94bWxEdGRQdHI7bl9kdGQrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2VsZW0rKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbnMrKykgewogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxBdHRyaWJ1dGVUeXBlO25fdHlwZSsrKSB7CiAgICBmb3IgKG5fZGVmID0gMDtuX2RlZiA8IGdlbl9uYl94bWxBdHRyaWJ1dGVEZWZhdWx0O25fZGVmKyspIHsKICAgIGZvciAobl9kZWZhdWx0VmFsdWUgPSAwO25fZGVmYXVsdFZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fZGVmYXVsdFZhbHVlKyspIHsKICAgIGZvciAobl90cmVlID0gMDtuX3RyZWUgPCBnZW5fbmJfeG1sRW51bWVyYXRpb25QdHI7bl90cmVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZHRkID0gZ2VuX3htbER0ZFB0cihuX2R0ZCwgMSk7CiAgICAgICAgZWxlbSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2VsZW0sIDIpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAzKTsKICAgICAgICBucyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25zLCA0KTsKICAgICAgICB0eXBlID0gZ2VuX3htbEF0dHJpYnV0ZVR5cGUobl90eXBlLCA1KTsKICAgICAgICBkZWYgPSBnZW5feG1sQXR0cmlidXRlRGVmYXVsdChuX2RlZiwgNik7CiAgICAgICAgZGVmYXVsdFZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fZGVmYXVsdFZhbHVlLCA3KTsKICAgICAgICB0cmVlID0gZ2VuX3htbEVudW1lcmF0aW9uUHRyKG5fdHJlZSwgOCk7CgogICAgICAgIHJldF92YWwgPSB4bWxBZGRBdHRyaWJ1dGVEZWNsKGN0eHQsIGR0ZCwgKGNvbnN0IHhtbENoYXIgKillbGVtLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbnMsIHR5cGUsIGRlZiwgKGNvbnN0IHhtbENoYXIgKilkZWZhdWx0VmFsdWUsIHRyZWUpOwogICAgICAgIGRlc3JldF94bWxBdHRyaWJ1dGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRHRkUHRyKG5fZHRkLCBkdGQsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2VsZW0sIChjb25zdCB4bWxDaGFyICopZWxlbSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAzKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9ucywgKGNvbnN0IHhtbENoYXIgKilucywgNCk7CiAgICAgICAgZGVzX3htbEF0dHJpYnV0ZVR5cGUobl90eXBlLCB0eXBlLCA1KTsKICAgICAgICBkZXNfeG1sQXR0cmlidXRlRGVmYXVsdChuX2RlZiwgZGVmLCA2KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9kZWZhdWx0VmFsdWUsIChjb25zdCB4bWxDaGFyICopZGVmYXVsdFZhbHVlLCA3KTsKICAgICAgICBkZXNfeG1sRW51bWVyYXRpb25QdHIobl90cmVlLCB0cmVlLCA4KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFkZEF0dHJpYnV0ZURlY2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kdGQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlZmF1bHRWYWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90cmVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBZGRFbGVtZW50RGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVsZW1lbnRQdHIgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRHRkUHRyIGR0ZDsgLyogcG9pbnRlciB0byB0aGUgRFREICovCiAgICBpbnQgbl9kdGQ7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGVudGl0eSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sRWxlbWVudFR5cGVWYWwgdHlwZTsgLyogdGhlIGVsZW1lbnQgdHlwZSAqLwogICAgaW50IG5fdHlwZTsKICAgIHhtbEVsZW1lbnRDb250ZW50UHRyIGNvbnRlbnQ7IC8qIHRoZSBlbGVtZW50IGNvbnRlbnQgdHJlZSBvciBOVUxMICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZHRkID0gMDtuX2R0ZCA8IGdlbl9uYl94bWxEdGRQdHI7bl9kdGQrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxFbGVtZW50VHlwZVZhbDtuX3R5cGUrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl94bWxFbGVtZW50Q29udGVudFB0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkdGQgPSBnZW5feG1sRHRkUHRyKG5fZHRkLCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CiAgICAgICAgdHlwZSA9IGdlbl94bWxFbGVtZW50VHlwZVZhbChuX3R5cGUsIDMpOwogICAgICAgIGNvbnRlbnQgPSBnZW5feG1sRWxlbWVudENvbnRlbnRQdHIobl9jb250ZW50LCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFkZEVsZW1lbnREZWNsKGN0eHQsIGR0ZCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCB0eXBlLCBjb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sRWxlbWVudFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEdGRQdHIobl9kdGQsIGR0ZCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfeG1sRWxlbWVudFR5cGVWYWwobl90eXBlLCB0eXBlLCAzKTsKICAgICAgICBkZXNfeG1sRWxlbWVudENvbnRlbnRQdHIobl9jb250ZW50LCBjb250ZW50LCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFkZEVsZW1lbnREZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZHRkKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBZGRJRCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBZGROb3RhdGlvbkRlY2wodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQWRkUmVmKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sQXR0cmlidXRlVGFibGVQdHIgMQpzdGF0aWMgeG1sQXR0cmlidXRlVGFibGVQdHIgZ2VuX3htbEF0dHJpYnV0ZVRhYmxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxBdHRyaWJ1dGVUYWJsZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQXR0cmlidXRlVGFibGVQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5QXR0cmlidXRlVGFibGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weURvY0VsZW1lbnRDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRWxlbWVudENvbnRlbnRQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCBvd25pbmcgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gKi8KICAgIGludCBuX2RvYzsKICAgIHhtbEVsZW1lbnRDb250ZW50UHRyIGN1cjsgLyogQW4gZWxlbWVudCBjb250ZW50IHBvaW50ZXIuICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbEVsZW1lbnRDb250ZW50UHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxFbGVtZW50Q29udGVudFB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDb3B5RG9jRWxlbWVudENvbnRlbnQoZG9jLCBjdXIpOwogICAgICAgIGRlc3JldF94bWxFbGVtZW50Q29udGVudFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sRWxlbWVudENvbnRlbnRQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb3B5RG9jRWxlbWVudENvbnRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weUVsZW1lbnRDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRWxlbWVudENvbnRlbnRQdHIgcmV0X3ZhbDsKICAgIHhtbEVsZW1lbnRDb250ZW50UHRyIGN1cjsgLyogQW4gZWxlbWVudCBjb250ZW50IHBvaW50ZXIuICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRWxlbWVudENvbnRlbnRQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbEVsZW1lbnRDb250ZW50UHRyKG5fY3VyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlFbGVtZW50Q29udGVudChjdXIpOwogICAgICAgIGRlc3JldF94bWxFbGVtZW50Q29udGVudFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEVsZW1lbnRDb250ZW50UHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ29weUVsZW1lbnRDb250ZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxFbGVtZW50VGFibGVQdHIgMQpzdGF0aWMgeG1sRWxlbWVudFRhYmxlUHRyIGdlbl94bWxFbGVtZW50VGFibGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEVsZW1lbnRUYWJsZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRWxlbWVudFRhYmxlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weUVsZW1lbnRUYWJsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5RW51bWVyYXRpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxOb3RhdGlvblRhYmxlUHRyIDEKc3RhdGljIHhtbE5vdGF0aW9uVGFibGVQdHIgZ2VuX3htbE5vdGF0aW9uVGFibGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbE5vdGF0aW9uVGFibGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbE5vdGF0aW9uVGFibGVQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5Tm90YXRpb25UYWJsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDcmVhdGVFbnVtZXJhdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbEF0dHJpYnV0ZVB0ciAxCnN0YXRpYyB4bWxBdHRyaWJ1dGVQdHIgZ2VuX3htbEF0dHJpYnV0ZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sQXR0cmlidXRlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxBdHRyaWJ1dGVQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxEdW1wQXR0cmlidXRlRGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIFhNTCBidWZmZXIgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxBdHRyaWJ1dGVQdHIgYXR0cjsgLyogQW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uICovCiAgICBpbnQgbl9hdHRyOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fYXR0ciA9IDA7bl9hdHRyIDwgZ2VuX25iX3htbEF0dHJpYnV0ZVB0cjtuX2F0dHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgYXR0ciA9IGdlbl94bWxBdHRyaWJ1dGVQdHIobl9hdHRyLCAxKTsKCiAgICAgICAgeG1sRHVtcEF0dHJpYnV0ZURlY2woYnVmLCBhdHRyKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sQXR0cmlidXRlUHRyKG5fYXR0ciwgYXR0ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEdW1wQXR0cmlidXRlRGVjbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbER1bXBBdHRyaWJ1dGVUYWJsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIFhNTCBidWZmZXIgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxBdHRyaWJ1dGVUYWJsZVB0ciB0YWJsZTsgLyogQW4gYXR0cmlidXRlIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEF0dHJpYnV0ZVRhYmxlUHRyO25fdGFibGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sQXR0cmlidXRlVGFibGVQdHIobl90YWJsZSwgMSk7CgogICAgICAgIHhtbER1bXBBdHRyaWJ1dGVUYWJsZShidWYsIHRhYmxlKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sQXR0cmlidXRlVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRHVtcEF0dHJpYnV0ZVRhYmxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sRWxlbWVudFB0ciAxCnN0YXRpYyB4bWxFbGVtZW50UHRyIGdlbl94bWxFbGVtZW50UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxFbGVtZW50UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbGVtZW50UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sRHVtcEVsZW1lbnREZWNsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgWE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbEVsZW1lbnRQdHIgZWxlbTsgLyogQW4gZWxlbWVudCB0YWJsZSAqLwogICAgaW50IG5fZWxlbTsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxFbGVtZW50UHRyO25fZWxlbSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBlbGVtID0gZ2VuX3htbEVsZW1lbnRQdHIobl9lbGVtLCAxKTsKCiAgICAgICAgeG1sRHVtcEVsZW1lbnREZWNsKGJ1ZiwgZWxlbSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbEVsZW1lbnRQdHIobl9lbGVtLCBlbGVtLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbER1bXBFbGVtZW50RGVjbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbER1bXBFbGVtZW50VGFibGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sRWxlbWVudFRhYmxlUHRyIHRhYmxlOyAvKiBBbiBlbGVtZW50IHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEVsZW1lbnRUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEVsZW1lbnRUYWJsZVB0cihuX3RhYmxlLCAxKTsKCiAgICAgICAgeG1sRHVtcEVsZW1lbnRUYWJsZShidWYsIHRhYmxlKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRWxlbWVudFRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbER1bXBFbGVtZW50VGFibGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxOb3RhdGlvblB0ciAxCnN0YXRpYyB4bWxOb3RhdGlvblB0ciBnZW5feG1sTm90YXRpb25QdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbE5vdGF0aW9uUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxOb3RhdGlvblB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbER1bXBOb3RhdGlvbkRlY2wodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sTm90YXRpb25QdHIgbm90YTsgLyogQSBub3RhdGlvbiBkZWNsYXJhdGlvbiAqLwogICAgaW50IG5fbm90YTsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX25vdGEgPSAwO25fbm90YSA8IGdlbl9uYl94bWxOb3RhdGlvblB0cjtuX25vdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgbm90YSA9IGdlbl94bWxOb3RhdGlvblB0cihuX25vdGEsIDEpOwoKICAgICAgICB4bWxEdW1wTm90YXRpb25EZWNsKGJ1Ziwgbm90YSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbE5vdGF0aW9uUHRyKG5fbm90YSwgbm90YSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEdW1wTm90YXRpb25EZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub3RhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRHVtcE5vdGF0aW9uVGFibGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sTm90YXRpb25UYWJsZVB0ciB0YWJsZTsgLyogQSBub3RhdGlvbiB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxOb3RhdGlvblRhYmxlUHRyO25fdGFibGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sTm90YXRpb25UYWJsZVB0cihuX3RhYmxlLCAxKTsKCiAgICAgICAgeG1sRHVtcE5vdGF0aW9uVGFibGUoYnVmLCB0YWJsZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbE5vdGF0aW9uVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRHVtcE5vdGF0aW9uVGFibGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0RHRkQXR0ckRlc2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyaWJ1dGVQdHIgcmV0X3ZhbDsKICAgIHhtbER0ZFB0ciBkdGQ7IC8qIGEgcG9pbnRlciB0byB0aGUgRHREIHRvIHNlYXJjaCAqLwogICAgaW50IG5fZHRkOwogICAgeG1sQ2hhciAqIGVsZW07IC8qIHRoZSBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX2VsZW07CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9kdGQgPSAwO25fZHRkIDwgZ2VuX25iX3htbER0ZFB0cjtuX2R0ZCsrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fZWxlbSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkdGQgPSBnZW5feG1sRHRkUHRyKG5fZHRkLCAwKTsKICAgICAgICBlbGVtID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fZWxlbSwgMSk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0RHRkQXR0ckRlc2MoZHRkLCAoY29uc3QgeG1sQ2hhciAqKWVsZW0sIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbEF0dHJpYnV0ZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbER0ZFB0cihuX2R0ZCwgZHRkLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9lbGVtLCAoY29uc3QgeG1sQ2hhciAqKWVsZW0sIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXREdGRBdHRyRGVzYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kdGQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXREdGRFbGVtZW50RGVzYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVsZW1lbnRQdHIgcmV0X3ZhbDsKICAgIHhtbER0ZFB0ciBkdGQ7IC8qIGEgcG9pbnRlciB0byB0aGUgRHREIHRvIHNlYXJjaCAqLwogICAgaW50IG5fZHRkOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2R0ZCA9IDA7bl9kdGQgPCBnZW5fbmJfeG1sRHRkUHRyO25fZHRkKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGR0ZCA9IGdlbl94bWxEdGRQdHIobl9kdGQsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldER0ZEVsZW1lbnREZXNjKGR0ZCwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfeG1sRWxlbWVudFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbER0ZFB0cihuX2R0ZCwgZHRkLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0RHRkRWxlbWVudERlc2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZHRkKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldER0ZE5vdGF0aW9uRGVzYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXREdGRRQXR0ckRlc2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyaWJ1dGVQdHIgcmV0X3ZhbDsKICAgIHhtbER0ZFB0ciBkdGQ7IC8qIGEgcG9pbnRlciB0byB0aGUgRHREIHRvIHNlYXJjaCAqLwogICAgaW50IG5fZHRkOwogICAgeG1sQ2hhciAqIGVsZW07IC8qIHRoZSBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX2VsZW07CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lc3BhY2UgcHJlZml4ICovCiAgICBpbnQgbl9wcmVmaXg7CgogICAgZm9yIChuX2R0ZCA9IDA7bl9kdGQgPCBnZW5fbmJfeG1sRHRkUHRyO25fZHRkKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9lbGVtKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGR0ZCA9IGdlbl94bWxEdGRQdHIobl9kdGQsIDApOwogICAgICAgIGVsZW0gPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9lbGVtLCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldER0ZFFBdHRyRGVzYyhkdGQsIChjb25zdCB4bWxDaGFyICopZWxlbSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCk7CiAgICAgICAgZGVzcmV0X3htbEF0dHJpYnV0ZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbER0ZFB0cihuX2R0ZCwgZHRkLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9lbGVtLCAoY29uc3QgeG1sQ2hhciAqKWVsZW0sIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXREdGRRQXR0ckRlc2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZHRkKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldER0ZFFFbGVtZW50RGVzYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVsZW1lbnRQdHIgcmV0X3ZhbDsKICAgIHhtbER0ZFB0ciBkdGQ7IC8qIGEgcG9pbnRlciB0byB0aGUgRHREIHRvIHNlYXJjaCAqLwogICAgaW50IG5fZHRkOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgZWxlbWVudCBuYW1lc3BhY2UgcHJlZml4ICovCiAgICBpbnQgbl9wcmVmaXg7CgogICAgZm9yIChuX2R0ZCA9IDA7bl9kdGQgPCBnZW5fbmJfeG1sRHRkUHRyO25fZHRkKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGR0ZCA9IGdlbl94bWxEdGRQdHIobl9kdGQsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0RHRkUUVsZW1lbnREZXNjKGR0ZCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCk7CiAgICAgICAgZGVzcmV0X3htbEVsZW1lbnRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEdGRQdHIobl9kdGQsIGR0ZCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldER0ZFFFbGVtZW50RGVzYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kdGQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldElEKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQXR0clB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogcG9pbnRlciB0byB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBJRDsgLyogdGhlIElEIHZhbHVlICovCiAgICBpbnQgbl9JRDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX0lEID0gMDtuX0lEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9JRCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXRJRChkb2MsIChjb25zdCB4bWxDaGFyICopSUQpOwogICAgICAgIGRlc3JldF94bWxBdHRyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX0lELCAoY29uc3QgeG1sQ2hhciAqKUlELCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldElEIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9JRCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0UmVmcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJc0lEKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogdGhlIGVsZW1lbnQgY2FycnlpbmcgdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fZWxlbTsKICAgIHhtbEF0dHJQdHIgYXR0cjsgLyogdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fYXR0cjsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICBmb3IgKG5fYXR0ciA9IDA7bl9hdHRyIDwgZ2VuX25iX3htbEF0dHJQdHI7bl9hdHRyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDEpOwogICAgICAgIGF0dHIgPSBnZW5feG1sQXR0clB0cihuX2F0dHIsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sSXNJRChkb2MsIGVsZW0sIGF0dHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9lbGVtLCBlbGVtLCAxKTsKICAgICAgICBkZXNfeG1sQXR0clB0cihuX2F0dHIsIGF0dHIsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSXNJRCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hdHRyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJc01peGVkRWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGVsZW1lbnQgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sSXNNaXhlZEVsZW1lbnQoZG9jLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzTWl4ZWRFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJc1JlZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIHRoZSBlbGVtZW50IGNhcnJ5aW5nIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX2VsZW07CiAgICB4bWxBdHRyUHRyIGF0dHI7IC8qIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX2F0dHI7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgZm9yIChuX2F0dHIgPSAwO25fYXR0ciA8IGdlbl9uYl94bWxBdHRyUHRyO25fYXR0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAxKTsKICAgICAgICBhdHRyID0gZ2VuX3htbEF0dHJQdHIobl9hdHRyLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzUmVmKGRvYywgZWxlbSwgYXR0cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDEpOwogICAgICAgIGRlc194bWxBdHRyUHRyKG5fYXR0ciwgYXR0ciwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJc1JlZiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hdHRyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdEb2NFbGVtZW50Q29udGVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVsZW1lbnRDb250ZW50UHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgc3ViZWxlbWVudCBuYW1lIG9yIE5VTEwgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxFbGVtZW50Q29udGVudFR5cGUgdHlwZTsgLyogdGhlIHR5cGUgb2YgZWxlbWVudCBjb250ZW50IGRlY2wgKi8KICAgIGludCBuX3R5cGU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfeG1sRWxlbWVudENvbnRlbnRUeXBlO25fdHlwZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgdHlwZSA9IGdlbl94bWxFbGVtZW50Q29udGVudFR5cGUobl90eXBlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0RvY0VsZW1lbnRDb250ZW50KGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCB0eXBlKTsKICAgICAgICB4bWxGcmVlRG9jRWxlbWVudENvbnRlbnQoZG9jLCByZXRfdmFsKTsgcmV0X3ZhbCA9IE5VTEw7CiAgICAgICAgZGVzcmV0X3htbEVsZW1lbnRDb250ZW50UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX3htbEVsZW1lbnRDb250ZW50VHlwZShuX3R5cGUsIHR5cGUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3RG9jRWxlbWVudENvbnRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RWxlbWVudENvbnRlbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxFbGVtZW50Q29udGVudFB0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBzdWJlbGVtZW50IG5hbWUgb3IgTlVMTCAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbEVsZW1lbnRDb250ZW50VHlwZSB0eXBlOyAvKiB0aGUgdHlwZSBvZiBlbGVtZW50IGNvbnRlbnQgZGVjbCAqLwogICAgaW50IG5fdHlwZTsKCiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX3htbEVsZW1lbnRDb250ZW50VHlwZTtuX3R5cGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDApOwogICAgICAgIHR5cGUgPSBnZW5feG1sRWxlbWVudENvbnRlbnRUeXBlKG5fdHlwZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdFbGVtZW50Q29udGVudCgoY29uc3QgeG1sQ2hhciAqKW5hbWUsIHR5cGUpOwogICAgICAgIGRlc3JldF94bWxFbGVtZW50Q29udGVudFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAwKTsKICAgICAgICBkZXNfeG1sRWxlbWVudENvbnRlbnRUeXBlKG5fdHlwZSwgdHlwZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdFbGVtZW50Q29udGVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld1ZhbGlkQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZW1vdmVJRCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxBdHRyUHRyIGF0dHI7IC8qIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX2F0dHI7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9hdHRyID0gMDtuX2F0dHIgPCBnZW5fbmJfeG1sQXR0clB0cjtuX2F0dHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgYXR0ciA9IGdlbl94bWxBdHRyUHRyKG5fYXR0ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZW1vdmVJRChkb2MsIGF0dHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9hdHRyLCBhdHRyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbW92ZUlEIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hdHRyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZW1vdmVSZWYodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQXR0clB0ciBhdHRyOyAvKiB0aGUgYXR0cmlidXRlICovCiAgICBpbnQgbl9hdHRyOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fYXR0ciA9IDA7bl9hdHRyIDwgZ2VuX25iX3htbEF0dHJQdHI7bl9hdHRyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGF0dHIgPSBnZW5feG1sQXR0clB0cihuX2F0dHIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVtb3ZlUmVmKGRvYywgYXR0cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sQXR0clB0cihuX2F0dHIsIGF0dHIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVtb3ZlUmVmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hdHRyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTbnByaW50ZkVsZW1lbnRDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY2hhciAqIGJ1ZjsgLyogYW4gb3V0cHV0IGJ1ZmZlciAqLwogICAgaW50IG5fYnVmOwogICAgaW50IHNpemU7IC8qIHRoZSBidWZmZXIgc2l6ZSAqLwogICAgaW50IG5fc2l6ZTsKICAgIHhtbEVsZW1lbnRDb250ZW50UHRyIGNvbnRlbnQ7IC8qIEFuIGVsZW1lbnQgdGFibGUgKi8KICAgIGludCBuX2NvbnRlbnQ7CiAgICBpbnQgZ2xvYjsgLyogMSBpZiBvbmUgbXVzdCBwcmludCB0aGUgZW5nbG9iaW5nIHBhcmVudGhlc2lzLCAwIG90aGVyd2lzZSAqLwogICAgaW50IG5fZ2xvYjsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl9jaGFyX3B0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl94bWxFbGVtZW50Q29udGVudFB0cjtuX2NvbnRlbnQrKykgewogICAgZm9yIChuX2dsb2IgPSAwO25fZ2xvYiA8IGdlbl9uYl9pbnQ7bl9nbG9iKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl9jaGFyX3B0cihuX2J1ZiwgMCk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAxKTsKICAgICAgICBjb250ZW50ID0gZ2VuX3htbEVsZW1lbnRDb250ZW50UHRyKG5fY29udGVudCwgMik7CiAgICAgICAgZ2xvYiA9IGdlbl9pbnQobl9nbG9iLCAzKTsKCiAgICAgICAgeG1sU25wcmludGZFbGVtZW50Q29udGVudChidWYsIHNpemUsIGNvbnRlbnQsIGdsb2IpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY2hhcl9wdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDEpOwogICAgICAgIGRlc194bWxFbGVtZW50Q29udGVudFB0cihuX2NvbnRlbnQsIGNvbnRlbnQsIDIpOwogICAgICAgIGRlc19pbnQobl9nbG9iLCBnbG9iLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNucHJpbnRmRWxlbWVudENvbnRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9nbG9iKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTcHJpbnRmRWxlbWVudENvbnRlbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgY2hhciAqIGJ1ZjsgLyogYW4gb3V0cHV0IGJ1ZmZlciAqLwogICAgaW50IG5fYnVmOwogICAgeG1sRWxlbWVudENvbnRlbnRQdHIgY29udGVudDsgLyogQW4gZWxlbWVudCB0YWJsZSAqLwogICAgaW50IG5fY29udGVudDsKICAgIGludCBnbG9iOyAvKiAxIGlmIG9uZSBtdXN0IHByaW50IHRoZSBlbmdsb2JpbmcgcGFyZW50aGVzaXMsIDAgb3RoZXJ3aXNlICovCiAgICBpbnQgbl9nbG9iOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX2NoYXJfcHRyO25fYnVmKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfeG1sRWxlbWVudENvbnRlbnRQdHI7bl9jb250ZW50KyspIHsKICAgIGZvciAobl9nbG9iID0gMDtuX2dsb2IgPCBnZW5fbmJfaW50O25fZ2xvYisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5fY2hhcl9wdHIobl9idWYsIDApOwogICAgICAgIGNvbnRlbnQgPSBnZW5feG1sRWxlbWVudENvbnRlbnRQdHIobl9jb250ZW50LCAxKTsKICAgICAgICBnbG9iID0gZ2VuX2ludChuX2dsb2IsIDIpOwoKICAgICAgICB4bWxTcHJpbnRmRWxlbWVudENvbnRlbnQoYnVmLCBjb250ZW50LCBnbG9iKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NoYXJfcHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxFbGVtZW50Q29udGVudFB0cihuX2NvbnRlbnQsIGNvbnRlbnQsIDEpOwogICAgICAgIGRlc19pbnQobl9nbG9iLCBnbG9iLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNwcmludGZFbGVtZW50Q29udGVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9nbG9iKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkQnVpbGRDb250ZW50TW9kZWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIGEgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRWxlbWVudFB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIG5vZGUgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sRWxlbWVudFB0cjtuX2VsZW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBlbGVtID0gZ2VuX3htbEVsZW1lbnRQdHIobl9lbGVtLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkQnVpbGRDb250ZW50TW9kZWwoY3R4dCwgZWxlbSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxFbGVtZW50UHRyKG5fZWxlbSwgZWxlbSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZEJ1aWxkQ29udGVudE1vZGVsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkQ3R4dE5vcm1hbGl6ZUF0dHJpYnV0ZVZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgb3IgTlVMTCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgcGFyZW50ICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIGF0dHJpYnV0ZSB2YWx1ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgZWxlbSA9IGdlbl94bWxOb2RlUHRyKG5fZWxlbSwgMik7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDMpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRDdHh0Tm9ybWFsaXplQXR0cmlidXRlVmFsdWUoY3R4dCwgZG9jLCBlbGVtLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9lbGVtLCBlbGVtLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkQ3R4dE5vcm1hbGl6ZUF0dHJpYnV0ZVZhbHVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sRWxlbWVudENvbnRlbnRfcHRyIDEKc3RhdGljIHhtbEVsZW1lbnRDb250ZW50ICogZ2VuX3htbEVsZW1lbnRDb250ZW50X3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sRWxlbWVudENvbnRlbnRfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbGVtZW50Q29udGVudCAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRHZXRQb3RlbnRpYWxDaGlsZHJlbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxFbGVtZW50Q29udGVudCAqIGN0cmVlOyAvKiBhbiBlbGVtZW50IGNvbnRlbnQgdHJlZSAqLwogICAgaW50IG5fY3RyZWU7CiAgICB4bWxDaGFyICoqIGxpc3Q7IC8qIGFuIGFycmF5IHRvIHN0b3JlIHRoZSBsaXN0IG9mIGNoaWxkIG5hbWVzICovCiAgICBpbnQgbl9saXN0OwogICAgaW50ICogbGVuOyAvKiBhIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50IGluIHRoZSBsaXN0ICovCiAgICBpbnQgbl9sZW47CiAgICBpbnQgbWF4OyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgIGludCBuX21heDsKCiAgICBmb3IgKG5fY3RyZWUgPSAwO25fY3RyZWUgPCBnZW5fbmJfeG1sRWxlbWVudENvbnRlbnRfcHRyO25fY3RyZWUrKykgewogICAgZm9yIChuX2xpc3QgPSAwO25fbGlzdCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHI7bl9saXN0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludF9wdHI7bl9sZW4rKykgewogICAgZm9yIChuX21heCA9IDA7bl9tYXggPCBnZW5fbmJfaW50O25fbWF4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0cmVlID0gZ2VuX3htbEVsZW1lbnRDb250ZW50X3B0cihuX2N0cmVlLCAwKTsKICAgICAgICBsaXN0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX2xpc3QsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnRfcHRyKG5fbGVuLCAyKTsKICAgICAgICBtYXggPSBnZW5faW50KG5fbWF4LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkR2V0UG90ZW50aWFsQ2hpbGRyZW4oY3RyZWUsIChjb25zdCB4bWxDaGFyICoqKWxpc3QsIGxlbiwgbWF4KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRWxlbWVudENvbnRlbnRfcHRyKG5fY3RyZWUsIGN0cmVlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fbGlzdCwgKGNvbnN0IHhtbENoYXIgKiopbGlzdCwgMSk7CiAgICAgICAgZGVzX2ludF9wdHIobl9sZW4sIGxlbiwgMik7CiAgICAgICAgZGVzX2ludChuX21heCwgbWF4LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkR2V0UG90ZW50aWFsQ2hpbGRyZW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3RyZWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGlzdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbWF4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkR2V0VmFsaWRFbGVtZW50cyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlICogcHJldjsgLyogYW4gZWxlbWVudCB0byBpbnNlcnQgYWZ0ZXIgKi8KICAgIGludCBuX3ByZXY7CiAgICB4bWxOb2RlICogbmV4dDsgLyogYW4gZWxlbWVudCB0byBpbnNlcnQgbmV4dCAqLwogICAgaW50IG5fbmV4dDsKICAgIHhtbENoYXIgKiogbmFtZXM7IC8qIGFuIGFycmF5IHRvIHN0b3JlIHRoZSBsaXN0IG9mIGNoaWxkIG5hbWVzICovCiAgICBpbnQgbl9uYW1lczsKICAgIGludCBtYXg7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fbWF4OwoKICAgIGZvciAobl9wcmV2ID0gMDtuX3ByZXYgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3ByZXYrKykgewogICAgZm9yIChuX25leHQgPSAwO25fbmV4dCA8IGdlbl9uYl94bWxOb2RlUHRyO25fbmV4dCsrKSB7CiAgICBmb3IgKG5fbmFtZXMgPSAwO25fbmFtZXMgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHJfcHRyO25fbmFtZXMrKykgewogICAgZm9yIChuX21heCA9IDA7bl9tYXggPCBnZW5fbmJfaW50O25fbWF4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHByZXYgPSBnZW5feG1sTm9kZVB0cihuX3ByZXYsIDApOwogICAgICAgIG5leHQgPSBnZW5feG1sTm9kZVB0cihuX25leHQsIDEpOwogICAgICAgIG5hbWVzID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX25hbWVzLCAyKTsKICAgICAgICBtYXggPSBnZW5faW50KG5fbWF4LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkR2V0VmFsaWRFbGVtZW50cyhwcmV2LCBuZXh0LCAoY29uc3QgeG1sQ2hhciAqKiluYW1lcywgbWF4KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3ByZXYsIHByZXYsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbmV4dCwgbmV4dCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX25hbWVzLCAoY29uc3QgeG1sQ2hhciAqKiluYW1lcywgMik7CiAgICAgICAgZGVzX2ludChuX21heCwgbWF4LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkR2V0VmFsaWRFbGVtZW50cyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmV2KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25leHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZXMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbWF4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkTm9ybWFsaXplQXR0cmlidXRlVmFsdWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogdGhlIHBhcmVudCAqLwogICAgaW50IG5fZWxlbTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkTm9ybWFsaXplQXR0cmlidXRlVmFsdWUoZG9jLCBlbGVtLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWROb3JtYWxpemVBdHRyaWJ1dGVWYWx1ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVBdHRyaWJ1dGVEZWNsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxBdHRyaWJ1dGVQdHIgYXR0cjsgLyogYW4gYXR0cmlidXRlIGRlZmluaXRpb24gKi8KICAgIGludCBuX2F0dHI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fYXR0ciA9IDA7bl9hdHRyIDwgZ2VuX25iX3htbEF0dHJpYnV0ZVB0cjtuX2F0dHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBhdHRyID0gZ2VuX3htbEF0dHJpYnV0ZVB0cihuX2F0dHIsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVBdHRyaWJ1dGVEZWNsKGN0eHQsIGRvYywgYXR0cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbEF0dHJpYnV0ZVB0cihuX2F0dHIsIGF0dHIsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVBdHRyaWJ1dGVEZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2F0dHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZUF0dHJpYnV0ZVZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQXR0cmlidXRlVHlwZSB0eXBlOyAvKiBhbiBhdHRyaWJ1dGUgdHlwZSAqLwogICAgaW50IG5fdHlwZTsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogYW4gYXR0cmlidXRlIHZhbHVlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX3htbEF0dHJpYnV0ZVR5cGU7bl90eXBlKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHR5cGUgPSBnZW5feG1sQXR0cmlidXRlVHlwZShuX3R5cGUsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZSh0eXBlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQXR0cmlidXRlVHlwZShuX3R5cGUsIHR5cGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlQXR0cmlidXRlVmFsdWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlRG9jdW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2RvYzsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZURvY3VtZW50KGN0eHQsIGRvYyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZURvY3VtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVEb2N1bWVudEZpbmFsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVEb2N1bWVudEZpbmFsKGN0eHQsIGRvYyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZURvY3VtZW50RmluYWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZUR0ZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZG9jOwogICAgeG1sRHRkUHRyIGR0ZDsgLyogYSBkdGQgaW5zdGFuY2UgKi8KICAgIGludCBuX2R0ZDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9kdGQgPSAwO25fZHRkIDwgZ2VuX25iX3htbER0ZFB0cjtuX2R0ZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGR0ZCA9IGdlbl94bWxEdGRQdHIobl9kdGQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVEdGQoY3R4dCwgZG9jLCBkdGQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxEdGRQdHIobl9kdGQsIGR0ZCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZUR0ZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kdGQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZUR0ZEZpbmFsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVEdGRGaW5hbChjdHh0LCBkb2MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVEdGRGaW5hbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlRWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9lbGVtOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVFbGVtZW50KGN0eHQsIGRvYywgZWxlbSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9lbGVtLCBlbGVtLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVFbGVtZW50RGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZG9jOwogICAgeG1sRWxlbWVudFB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGRlZmluaXRpb24gKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbEVsZW1lbnRQdHI7bl9lbGVtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgZWxlbSA9IGdlbl94bWxFbGVtZW50UHRyKG5fZWxlbSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZUVsZW1lbnREZWNsKGN0eHQsIGRvYywgZWxlbSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbEVsZW1lbnRQdHIobl9lbGVtLCBlbGVtLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlRWxlbWVudERlY2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlTmFtZVZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiBhbiBOYW1lIHZhbHVlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlTmFtZVZhbHVlKChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlTmFtZVZhbHVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVOYW1lc1ZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiBhbiBOYW1lcyB2YWx1ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZU5hbWVzVmFsdWUoKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVOYW1lc1ZhbHVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVObXRva2VuVmFsdWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIGFuIE5tdG9rZW4gdmFsdWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVObXRva2VuVmFsdWUoKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVObXRva2VuVmFsdWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZU5tdG9rZW5zVmFsdWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIGFuIE5tdG9rZW5zIHZhbHVlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlTm10b2tlbnNWYWx1ZSgoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZU5tdG9rZW5zVmFsdWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZU5vdGF0aW9uRGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm90YXRpb25QdHIgbm90YTsgLyogYSBub3RhdGlvbiBkZWZpbml0aW9uICovCiAgICBpbnQgbl9ub3RhOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25vdGEgPSAwO25fbm90YSA8IGdlbl9uYl94bWxOb3RhdGlvblB0cjtuX25vdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBub3RhID0gZ2VuX3htbE5vdGF0aW9uUHRyKG5fbm90YSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZU5vdGF0aW9uRGVjbChjdHh0LCBkb2MsIG5vdGEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb3RhdGlvblB0cihuX25vdGEsIG5vdGEsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVOb3RhdGlvbkRlY2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm90YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlTm90YXRpb25Vc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbm90YXRpb25OYW1lOyAvKiB0aGUgbm90YXRpb24gbmFtZSB0byBjaGVjayAqLwogICAgaW50IG5fbm90YXRpb25OYW1lOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25vdGF0aW9uTmFtZSA9IDA7bl9ub3RhdGlvbk5hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9ub3RhdGlvbk5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBub3RhdGlvbk5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9ub3RhdGlvbk5hbWUsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVOb3RhdGlvblVzZShjdHh0LCBkb2MsIChjb25zdCB4bWxDaGFyICopbm90YXRpb25OYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9ub3RhdGlvbk5hbWUsIChjb25zdCB4bWxDaGFyICopbm90YXRpb25OYW1lLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlTm90YXRpb25Vc2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm90YXRpb25OYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVPbmVBdHRyaWJ1dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogYW4gZWxlbWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZWxlbTsKICAgIHhtbEF0dHJQdHIgYXR0cjsgLyogYW4gYXR0cmlidXRlIGluc3RhbmNlICovCiAgICBpbnQgbl9hdHRyOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgYXR0cmlidXRlIHZhbHVlICh3aXRob3V0IGVudGl0aWVzIHByb2Nlc3NpbmcpICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgZm9yIChuX2F0dHIgPSAwO25fYXR0ciA8IGdlbl9uYl94bWxBdHRyUHRyO25fYXR0cisrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDIpOwogICAgICAgIGF0dHIgPSBnZW5feG1sQXR0clB0cihuX2F0dHIsIDMpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVPbmVBdHRyaWJ1dGUoY3R4dCwgZG9jLCBlbGVtLCBhdHRyLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDIpOwogICAgICAgIGRlc194bWxBdHRyUHRyKG5fYXR0ciwgYXR0ciwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVPbmVBdHRyaWJ1dGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hdHRyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVPbmVFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgZWxlbSA9IGdlbl94bWxOb2RlUHRyKG5fZWxlbSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZU9uZUVsZW1lbnQoY3R4dCwgZG9jLCBlbGVtKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVPbmVFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZU9uZU5hbWVzcGFjZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIG5hbWVzcGFjZSBwcmVmaXggKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbE5zUHRyIG5zOyAvKiBhbiBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaW5zdGFuY2UgKi8KICAgIGludCBuX25zOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgYXR0cmlidXRlIHZhbHVlICh3aXRob3V0IGVudGl0aWVzIHByb2Nlc3NpbmcpICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgZm9yIChuX3ByZWZpeCA9IDA7bl9wcmVmaXggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wcmVmaXgrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5zUHRyO25fbnMrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAyKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDMpOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDQpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDUpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVPbmVOYW1lc3BhY2UoY3R4dCwgZG9jLCBlbGVtLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgbnMsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMyk7CiAgICAgICAgZGVzX3htbE5zUHRyKG5fbnMsIG5zLCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZU9uZU5hbWVzcGFjZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlUG9wRWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogYW4gZWxlbWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZWxlbTsKICAgIHhtbENoYXIgKiBxbmFtZTsgLyogdGhlIHF1YWxpZmllZCBuYW1lIGFzIGFwcGVhcmluZyBpbiB0aGUgc2VyaWFsaXphdGlvbiAqLwogICAgaW50IG5fcW5hbWU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKICAgIGZvciAobl9xbmFtZSA9IDA7bl9xbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3FuYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgZWxlbSA9IGdlbl94bWxOb2RlUHRyKG5fZWxlbSwgMik7CiAgICAgICAgcW5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9xbmFtZSwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZVBvcEVsZW1lbnQoY3R4dCwgZG9jLCBlbGVtLCAoY29uc3QgeG1sQ2hhciAqKXFuYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3FuYW1lLCAoY29uc3QgeG1sQ2hhciAqKXFuYW1lLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlUG9wRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3FuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVQdXNoQ0RhdGEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogZGF0YTsgLyogc29tZSBjaGFyYWN0ZXIgZGF0YSByZWFkICovCiAgICBpbnQgbl9kYXRhOwogICAgaW50IGxlbjsgLyogdGhlIGxlbmdodCBvZiB0aGUgZGF0YSAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fZGF0YSsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkYXRhID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fZGF0YSwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZVB1c2hDRGF0YShjdHh0LCAoY29uc3QgeG1sQ2hhciAqKWRhdGEsIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2RhdGEsIChjb25zdCB4bWxDaGFyICopZGF0YSwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlUHVzaENEYXRhIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZVB1c2hFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfUkVHRVhQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQ2hhciAqIHFuYW1lOyAvKiB0aGUgcXVhbGlmaWVkIG5hbWUgYXMgYXBwZWFyaW5nIGluIHRoZSBzZXJpYWxpemF0aW9uICovCiAgICBpbnQgbl9xbmFtZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgZm9yIChuX3FuYW1lID0gMDtuX3FuYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAyKTsKICAgICAgICBxbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3FuYW1lLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlUHVzaEVsZW1lbnQoY3R4dCwgZG9jLCBlbGVtLCAoY29uc3QgeG1sQ2hhciAqKXFuYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3FuYW1lLCAoY29uc3QgeG1sQ2hhciAqKXFuYW1lLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlUHVzaEVsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9xbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlUm9vdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlUm9vdChjdHh0LCBkb2MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVSb290IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF92YWxpZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgdmFsaWQgOiA1MCBvZiA3MCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQWRkQXR0cmlidXRlRGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGRFbGVtZW50RGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGRJRCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGROb3RhdGlvbkRlY2woKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQWRkUmVmKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlBdHRyaWJ1dGVUYWJsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDb3B5RG9jRWxlbWVudENvbnRlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weUVsZW1lbnRDb250ZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlFbGVtZW50VGFibGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weUVudW1lcmF0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlOb3RhdGlvblRhYmxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENyZWF0ZUVudW1lcmF0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbER1bXBBdHRyaWJ1dGVEZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbER1bXBBdHRyaWJ1dGVUYWJsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEdW1wRWxlbWVudERlY2woKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRHVtcEVsZW1lbnRUYWJsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEdW1wTm90YXRpb25EZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbER1bXBOb3RhdGlvblRhYmxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldER0ZEF0dHJEZXNjKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldER0ZEVsZW1lbnREZXNjKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldER0ZE5vdGF0aW9uRGVzYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXREdGRRQXR0ckRlc2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0RHRkUUVsZW1lbnREZXNjKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldElEKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldFJlZnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSXNJRCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJc01peGVkRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJc1JlZigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdEb2NFbGVtZW50Q29udGVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdFbGVtZW50Q29udGVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdWYWxpZEN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVtb3ZlSUQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVtb3ZlUmVmKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNucHJpbnRmRWxlbWVudENvbnRlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3ByaW50ZkVsZW1lbnRDb250ZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkQnVpbGRDb250ZW50TW9kZWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRDdHh0Tm9ybWFsaXplQXR0cmlidXRlVmFsdWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRHZXRQb3RlbnRpYWxDaGlsZHJlbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZEdldFZhbGlkRWxlbWVudHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWROb3JtYWxpemVBdHRyaWJ1dGVWYWx1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZUF0dHJpYnV0ZURlY2woKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZURvY3VtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlRG9jdW1lbnRGaW5hbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZUR0ZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZUR0ZEZpbmFsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZUVsZW1lbnREZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlTmFtZVZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlTmFtZXNWYWx1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZU5tdG9rZW5WYWx1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZU5tdG9rZW5zVmFsdWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVOb3RhdGlvbkRlY2woKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVOb3RhdGlvblVzZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZU9uZUF0dHJpYnV0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZU9uZUVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVPbmVOYW1lc3BhY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVQb3BFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlUHVzaENEYXRhKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlUHVzaEVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVSb290KCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB2YWxpZDogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sWEluY2x1ZGVOZXdDb250ZXh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hJTkNMVURFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGFuIFhNTCBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhJbmNsdWRlUHJvY2Vzcyhkb2MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYSW5jbHVkZVByb2Nlc3MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWEluY2x1ZGVQcm9jZXNzRmxhZ3Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YSU5DTFVERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhbiBYTUwgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIGludCBmbGFnczsgLyogYSBzZXQgb2YgeG1sUGFyc2VyT3B0aW9uIHVzZWQgZm9yIHBhcnNpbmcgWE1MIGluY2x1ZGVzICovCiAgICBpbnQgbl9mbGFnczsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2ZsYWdzID0gMDtuX2ZsYWdzIDwgZ2VuX25iX2ludDtuX2ZsYWdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGZsYWdzID0gZ2VuX2ludChuX2ZsYWdzLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzKGRvYywgZmxhZ3MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2ludChuX2ZsYWdzLCBmbGFncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYSW5jbHVkZVByb2Nlc3NGbGFncyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmxhZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9YSU5DTFVERV9FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxYSW5jbHVkZUN0eHRQdHIgMQpzdGF0aWMgeG1sWEluY2x1ZGVDdHh0UHRyIGdlbl94bWxYSW5jbHVkZUN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFhJbmNsdWRlQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sWEluY2x1ZGVDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxYSW5jbHVkZVByb2Nlc3NOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWElOQ0xVREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sWEluY2x1ZGVDdHh0UHRyIGN0eHQ7IC8qIGFuIGV4aXN0aW5nIFhJbmNsdWRlIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSBpbiBhbiBYTUwgZG9jdW1lbnQgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYSW5jbHVkZUN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYSW5jbHVkZUN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhJbmNsdWRlUHJvY2Vzc05vZGUoY3R4dCwgbm9kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhJbmNsdWRlQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYSW5jbHVkZVByb2Nlc3NOb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzc1RyZWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YSU5DTFVERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHRyZWU7IC8qIGEgbm9kZSBpbiBhbiBYTUwgZG9jdW1lbnQgKi8KICAgIGludCBuX3RyZWU7CgogICAgZm9yIChuX3RyZWUgPSAwO25fdHJlZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fdHJlZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0cmVlID0gZ2VuX3htbE5vZGVQdHIobl90cmVlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhJbmNsdWRlUHJvY2Vzc1RyZWUodHJlZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl90cmVlLCB0cmVlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhJbmNsdWRlUHJvY2Vzc1RyZWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHJlZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzc1RyZWVGbGFncyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hJTkNMVURFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgdHJlZTsgLyogYSBub2RlIGluIGFuIFhNTCBkb2N1bWVudCAqLwogICAgaW50IG5fdHJlZTsKICAgIGludCBmbGFnczsgLyogYSBzZXQgb2YgeG1sUGFyc2VyT3B0aW9uIHVzZWQgZm9yIHBhcnNpbmcgWE1MIGluY2x1ZGVzICovCiAgICBpbnQgbl9mbGFnczsKCiAgICBmb3IgKG5fdHJlZSA9IDA7bl90cmVlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl90cmVlKyspIHsKICAgIGZvciAobl9mbGFncyA9IDA7bl9mbGFncyA8IGdlbl9uYl9pbnQ7bl9mbGFncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0cmVlID0gZ2VuX3htbE5vZGVQdHIobl90cmVlLCAwKTsKICAgICAgICBmbGFncyA9IGdlbl9pbnQobl9mbGFncywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYSW5jbHVkZVByb2Nlc3NUcmVlRmxhZ3ModHJlZSwgZmxhZ3MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fdHJlZSwgdHJlZSwgMCk7CiAgICAgICAgZGVzX2ludChuX2ZsYWdzLCBmbGFncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYSW5jbHVkZVByb2Nlc3NUcmVlRmxhZ3MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHJlZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mbGFncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhJbmNsdWRlU2V0RmxhZ3Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YSU5DTFVERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYSW5jbHVkZUN0eHRQdHIgY3R4dDsgLyogYW4gWEluY2x1ZGUgcHJvY2Vzc2luZyBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IGZsYWdzOyAvKiBhIHNldCBvZiB4bWxQYXJzZXJPcHRpb24gdXNlZCBmb3IgcGFyc2luZyBYTUwgaW5jbHVkZXMgKi8KICAgIGludCBuX2ZsYWdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWEluY2x1ZGVDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZmxhZ3MgPSAwO25fZmxhZ3MgPCBnZW5fbmJfaW50O25fZmxhZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYSW5jbHVkZUN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBmbGFncyA9IGdlbl9pbnQobl9mbGFncywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYSW5jbHVkZVNldEZsYWdzKGN0eHQsIGZsYWdzKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWEluY2x1ZGVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX2ZsYWdzLCBmbGFncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYSW5jbHVkZVNldEZsYWdzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmxhZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3hpbmNsdWRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB4aW5jbHVkZSA6IDYgb2YgOCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWEluY2x1ZGVOZXdDb250ZXh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhJbmNsdWRlUHJvY2VzcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYSW5jbHVkZVByb2Nlc3NGbGFncygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYSW5jbHVkZVByb2Nlc3NOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzc1RyZWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWEluY2x1ZGVQcm9jZXNzVHJlZUZsYWdzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhJbmNsdWRlU2V0RmxhZ3MoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhpbmNsdWRlOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxBbGxvY091dHB1dEJ1ZmZlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sT3V0cHV0QnVmZmVyUHRyIHJldF92YWw7CiAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGVuY29kZXI7IC8qIHRoZSBlbmNvZGluZyBjb252ZXJ0ZXIgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2RlcjsKCiAgICBmb3IgKG5fZW5jb2RlciA9IDA7bl9lbmNvZGVyIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHI7bl9lbmNvZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGVuY29kZXIgPSBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihuX2VuY29kZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQWxsb2NPdXRwdXRCdWZmZXIoZW5jb2Rlcik7CiAgICAgICAgZGVzcmV0X3htbE91dHB1dEJ1ZmZlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9lbmNvZGVyLCBlbmNvZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFsbG9jT3V0cHV0QnVmZmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBbGxvY1BhcnNlcklucHV0QnVmZmVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXJFbmNvZGluZyBlbmM7IC8qIHRoZSBjaGFyc2V0IGVuY29kaW5nIGlmIGtub3duICovCiAgICBpbnQgbl9lbmM7CgogICAgZm9yIChuX2VuYyA9IDA7bl9lbmMgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nO25fZW5jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGVuYyA9IGdlbl94bWxDaGFyRW5jb2Rpbmcobl9lbmMsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQWxsb2NQYXJzZXJJbnB1dEJ1ZmZlcihlbmMpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFsbG9jUGFyc2VySW5wdXRCdWZmZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDaGVja0ZpbGVuYW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBjaGFyICogcGF0aDsgLyogdGhlIHBhdGggdG8gY2hlY2sgKi8KICAgIGludCBuX3BhdGg7CgogICAgZm9yIChuX3BhdGggPSAwO25fcGF0aCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX3BhdGgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcGF0aCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3BhdGgsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2hlY2tGaWxlbmFtZSgoY29uc3QgY2hhciAqKXBhdGgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3BhdGgsIChjb25zdCBjaGFyICopcGF0aCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDaGVja0ZpbGVuYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BhdGgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENoZWNrSFRUUElucHV0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0OyAvKiBhbiBYTUwgcGFyc2VyIGlucHV0ICovCiAgICBpbnQgbl9yZXQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fcmV0ID0gMDtuX3JldCA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dFB0cjtuX3JldCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICByZXQgPSBnZW5feG1sUGFyc2VySW5wdXRQdHIobl9yZXQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQ2hlY2tIVFRQSW5wdXQoY3R4dCwgcmV0KTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbFBhcnNlcklucHV0UHRyKG5fcmV0LCByZXQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2hlY2tIVFRQSW5wdXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENsZWFudXBJbnB1dENhbGxiYWNrcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sQ2xlYW51cElucHV0Q2FsbGJhY2tzKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2xlYW51cElucHV0Q2FsbGJhY2tzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDbGVhbnVwT3V0cHV0Q2FsbGJhY2tzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbENsZWFudXBPdXRwdXRDYWxsYmFja3MoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDbGVhbnVwT3V0cHV0Q2FsbGJhY2tzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRmlsZUNsb3NlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB2b2lkICogY29udGV4dDsgLyogdGhlIEkvTyBjb250ZXh0ICovCiAgICBpbnQgbl9jb250ZXh0OwoKICAgIGZvciAobl9jb250ZXh0ID0gMDtuX2NvbnRleHQgPCBnZW5fbmJfdm9pZF9wdHI7bl9jb250ZXh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbnRleHQgPSBnZW5fdm9pZF9wdHIobl9jb250ZXh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEZpbGVDbG9zZShjb250ZXh0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jb250ZXh0LCBjb250ZXh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEZpbGVDbG9zZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZXh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxGaWxlTWF0Y2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIFVSSSBmb3IgbWF0Y2hpbmcgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sRmlsZU1hdGNoKGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRmlsZU1hdGNoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxGaWxlT3Blbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgVVJJIGZvciBtYXRjaGluZyAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxGaWxlT3BlbihmaWxlbmFtZSk7CiAgICAgICAgZGVzcmV0X3ZvaWRfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRmlsZU9wZW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEZpbGVSZWFkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB2b2lkICogY29udGV4dDsgLyogdGhlIEkvTyBjb250ZXh0ICovCiAgICBpbnQgbl9jb250ZXh0OwogICAgY2hhciAqIGJ1ZmZlcjsgLyogd2hlcmUgdG8gZHJvcCBkYXRhICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgbGVuOyAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY29udGV4dCA9IDA7bl9jb250ZXh0IDwgZ2VuX25iX3ZvaWRfcHRyO25fY29udGV4dCsrKSB7CiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29udGV4dCA9IGdlbl92b2lkX3B0cihuX2NvbnRleHQsIDApOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jaGFyX3B0cihuX2J1ZmZlciwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxGaWxlUmVhZChjb250ZXh0LCBidWZmZXIsIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY29udGV4dCwgY29udGV4dCwgMCk7CiAgICAgICAgZGVzX2NoYXJfcHRyKG5fYnVmZmVyLCBidWZmZXIsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxGaWxlUmVhZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZXh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElPRlRQQ2xvc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGNvbnRleHQ7IC8qIHRoZSBJL08gY29udGV4dCAqLwogICAgaW50IG5fY29udGV4dDsKCiAgICBmb3IgKG5fY29udGV4dCA9IDA7bl9jb250ZXh0IDwgZ2VuX25iX3ZvaWRfcHRyO25fY29udGV4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb250ZXh0ID0gZ2VuX3ZvaWRfcHRyKG5fY29udGV4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJT0ZUUENsb3NlKGNvbnRleHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2NvbnRleHQsIGNvbnRleHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSU9GVFBDbG9zZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZXh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSU9GVFBNYXRjaCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0ZUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBVUkkgZm9yIG1hdGNoaW5nICovCiAgICBpbnQgbl9maWxlbmFtZTsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElPRlRQTWF0Y2goZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJT0ZUUE1hdGNoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSU9GVFBPcGVuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIFVSSSBmb3IgbWF0Y2hpbmcgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSU9GVFBPcGVuKGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfdm9pZF9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJT0ZUUE9wZW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJT0ZUUFJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGNvbnRleHQ7IC8qIHRoZSBJL08gY29udGV4dCAqLwogICAgaW50IG5fY29udGV4dDsKICAgIGNoYXIgKiBidWZmZXI7IC8qIHdoZXJlIHRvIGRyb3AgZGF0YSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IGxlbjsgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2NvbnRleHQgPSAwO25fY29udGV4dCA8IGdlbl9uYl92b2lkX3B0cjtuX2NvbnRleHQrKykgewogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbnRleHQgPSBnZW5fdm9pZF9wdHIobl9jb250ZXh0LCAwKTsKICAgICAgICBidWZmZXIgPSBnZW5fY2hhcl9wdHIobl9idWZmZXIsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sSU9GVFBSZWFkKGNvbnRleHQsIGJ1ZmZlciwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jb250ZXh0LCBjb250ZXh0LCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHIobl9idWZmZXIsIGJ1ZmZlciwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElPRlRQUmVhZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZXh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJT0hUVFBDbG9zZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGNvbnRleHQ7IC8qIHRoZSBJL08gY29udGV4dCAqLwogICAgaW50IG5fY29udGV4dDsKCiAgICBmb3IgKG5fY29udGV4dCA9IDA7bl9jb250ZXh0IDwgZ2VuX25iX3ZvaWRfcHRyO25fY29udGV4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb250ZXh0ID0gZ2VuX3ZvaWRfcHRyKG5fY29udGV4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJT0hUVFBDbG9zZShjb250ZXh0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jb250ZXh0LCBjb250ZXh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElPSFRUUENsb3NlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRleHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJT0hUVFBNYXRjaCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgVVJJIGZvciBtYXRjaGluZyAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJT0hUVFBNYXRjaChmaWxlbmFtZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElPSFRUUE1hdGNoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSU9IVFRQT3Blbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgVVJJIGZvciBtYXRjaGluZyAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJT0hUVFBPcGVuKGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfeG1sTmFub0hUVFBDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSU9IVFRQT3BlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElPSFRUUFJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVFRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjb250ZXh0OyAvKiB0aGUgSS9PIGNvbnRleHQgKi8KICAgIGludCBuX2NvbnRleHQ7CiAgICBjaGFyICogYnVmZmVyOyAvKiB3aGVyZSB0byBkcm9wIGRhdGEgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBsZW47IC8qIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9jb250ZXh0ID0gMDtuX2NvbnRleHQgPCBnZW5fbmJfdm9pZF9wdHI7bl9jb250ZXh0KyspIHsKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb250ZXh0ID0gZ2VuX3ZvaWRfcHRyKG5fY29udGV4dCwgMCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NoYXJfcHRyKG5fYnVmZmVyLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElPSFRUUFJlYWQoY29udGV4dCwgYnVmZmVyLCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2NvbnRleHQsIGNvbnRleHQsIDApOwogICAgICAgIGRlc19jaGFyX3B0cihuX2J1ZmZlciwgYnVmZmVyLCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSU9IVFRQUmVhZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZXh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb05ldEV4dGVybmFsRW50aXR5TG9hZGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIHRoZSBVUkwgZm9yIHRoZSBlbnRpdHkgdG8gbG9hZCAqLwogICAgaW50IG5fVVJMOwogICAgY2hhciAqIElEOyAvKiB0aGUgU3lzdGVtIElEIGZvciB0aGUgZW50aXR5IHRvIGxvYWQgKi8KICAgIGludCBuX0lEOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgZW50aXR5IGlzIGNhbGxlZCBvciBOVUxMICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9JRCA9IDA7bl9JRCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX0lEKyspIHsKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJMID0gZ2VuX2ZpbGVwYXRoKG5fVVJMLCAwKTsKICAgICAgICBJRCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX0lELCAxKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5vTmV0RXh0ZXJuYWxFbnRpdHlMb2FkZXIoVVJMLCAoY29uc3QgY2hhciAqKUlELCBjdHh0KTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSTCwgVVJMLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9JRCwgKGNvbnN0IGNoYXIgKilJRCwgMSk7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vTmV0RXh0ZXJuYWxFbnRpdHlMb2FkZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX0lEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vcm1hbGl6ZVdpbmRvd3NQYXRoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogcGF0aDsgLyogdGhlIGlucHV0IGZpbGUgcGF0aCAqLwogICAgaW50IG5fcGF0aDsKCiAgICBmb3IgKG5fcGF0aCA9IDA7bl9wYXRoIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcGF0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwYXRoID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcGF0aCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOb3JtYWxpemVXaW5kb3dzUGF0aCgoY29uc3QgeG1sQ2hhciAqKXBhdGgpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcGF0aCwgKGNvbnN0IHhtbENoYXIgKilwYXRoLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vcm1hbGl6ZVdpbmRvd3NQYXRoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BhdGgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE91dHB1dEJ1ZmZlckNyZWF0ZUZkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxPdXRwdXRCdWZmZXJQdHIgcmV0X3ZhbDsKICAgIGludCBmZDsgLyogYSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyICovCiAgICBpbnQgbl9mZDsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgZW5jb2RlcjsgLyogdGhlIGVuY29kaW5nIGNvbnZlcnRlciBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGVyOwoKICAgIGZvciAobl9mZCA9IDA7bl9mZCA8IGdlbl9uYl9pbnQ7bl9mZCsrKSB7CiAgICBmb3IgKG5fZW5jb2RlciA9IDA7bl9lbmNvZGVyIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHI7bl9lbmNvZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZkID0gZ2VuX2ludChuX2ZkLCAwKTsKICAgICAgICBlbmNvZGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9lbmNvZGVyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZkKGZkLCBlbmNvZGVyKTsKICAgICAgICBkZXNyZXRfeG1sT3V0cHV0QnVmZmVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fZmQsIGZkLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihuX2VuY29kZXIsIGVuY29kZXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sT3V0cHV0QnVmZmVyQ3JlYXRlRmQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2Rlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciByZXRfdmFsOwogICAgRklMRSAqIGZpbGU7IC8qIGEgRklMRSogKi8KICAgIGludCBuX2ZpbGU7CiAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGVuY29kZXI7IC8qIHRoZSBlbmNvZGluZyBjb252ZXJ0ZXIgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2RlcjsKCiAgICBmb3IgKG5fZmlsZSA9IDA7bl9maWxlIDwgZ2VuX25iX0ZJTEVfcHRyO25fZmlsZSsrKSB7CiAgICBmb3IgKG5fZW5jb2RlciA9IDA7bl9lbmNvZGVyIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHI7bl9lbmNvZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGUgPSBnZW5fRklMRV9wdHIobl9maWxlLCAwKTsKICAgICAgICBlbmNvZGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9lbmNvZGVyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGUoZmlsZSwgZW5jb2Rlcik7CiAgICAgICAgZGVzcmV0X3htbE91dHB1dEJ1ZmZlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fZmlsZSwgZmlsZSwgMCk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9lbmNvZGVyLCBlbmNvZGVyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sT3V0cHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIFVSSTsgLyogYSBDIHN0cmluZyBjb250YWluaW5nIHRoZSBVUkkgb3IgZmlsZW5hbWUgKi8KICAgIGludCBuX1VSSTsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgZW5jb2RlcjsgLyogdGhlIGVuY29kaW5nIGNvbnZlcnRlciBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGVyOwogICAgaW50IGNvbXByZXNzaW9uOyAvKiB0aGUgY29tcHJlc3Npb24gcmF0aW9uICgwIG5vbmUsIDkgbWF4KS4gKi8KICAgIGludCBuX2NvbXByZXNzaW9uOwoKICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9VUkkrKykgewogICAgZm9yIChuX2VuY29kZXIgPSAwO25fZW5jb2RlciA8IGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyO25fZW5jb2RlcisrKSB7CiAgICBmb3IgKG5fY29tcHJlc3Npb24gPSAwO25fY29tcHJlc3Npb24gPCBnZW5fbmJfaW50O25fY29tcHJlc3Npb24rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJJID0gZ2VuX2ZpbGVvdXRwdXQobl9VUkksIDApOwogICAgICAgIGVuY29kZXIgPSBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihuX2VuY29kZXIsIDEpOwogICAgICAgIGNvbXByZXNzaW9uID0gZ2VuX2ludChuX2NvbXByZXNzaW9uLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKFVSSSwgZW5jb2RlciwgY29tcHJlc3Npb24pOwogICAgICAgIGRlc3JldF94bWxPdXRwdXRCdWZmZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fVVJJLCBVUkksIDApOwogICAgICAgIGRlc194bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyKG5fZW5jb2RlciwgZW5jb2RlciwgMSk7CiAgICAgICAgZGVzX2ludChuX2NvbXByZXNzaW9uLCBjb21wcmVzc2lvbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxPdXRwdXRCdWZmZXJDcmVhdGVGaWxlbmFtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2Rlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb21wcmVzc2lvbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE91dHB1dEJ1ZmZlckZsdXNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBvdXQ7IC8qIGEgYnVmZmVyZWQgb3V0cHV0ICovCiAgICBpbnQgbl9vdXQ7CgogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfeG1sT3V0cHV0QnVmZmVyUHRyO25fb3V0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dCA9IGdlbl94bWxPdXRwdXRCdWZmZXJQdHIobl9vdXQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sT3V0cHV0QnVmZmVyRmx1c2gob3V0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKG5fb3V0LCBvdXQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sT3V0cHV0QnVmZmVyRmx1c2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sT3V0cHV0QnVmZmVyV3JpdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sT3V0cHV0QnVmZmVyUHRyIG91dDsgLyogYSBidWZmZXJlZCBwYXJzZXIgb3V0cHV0ICovCiAgICBpbnQgbl9vdXQ7CiAgICBpbnQgbGVuOyAvKiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYXJyYXkuICovCiAgICBpbnQgbl9sZW47CiAgICBjaGFyICogYnVmOyAvKiBhbiBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWY7CgogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfeG1sT3V0cHV0QnVmZmVyUHRyO25fb3V0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXQgPSBnZW5feG1sT3V0cHV0QnVmZmVyUHRyKG5fb3V0LCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKICAgICAgICBidWYgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWYsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sT3V0cHV0QnVmZmVyV3JpdGUob3V0LCBsZW4sIChjb25zdCBjaGFyICopYnVmKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKG5fb3V0LCBvdXQsIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmLCAoY29uc3QgY2hhciAqKWJ1ZiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxPdXRwdXRCdWZmZXJXcml0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE91dHB1dEJ1ZmZlcldyaXRlRXNjYXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBvdXQ7IC8qIGEgYnVmZmVyZWQgcGFyc2VyIG91dHB1dCAqLwogICAgaW50IG5fb3V0OwogICAgY2hhciAqIHN0cjsgLyogYSB6ZXJvIHRlcm1pbmF0ZWQgQyBzdHJpbmcgKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl94bWxPdXRwdXRCdWZmZXJQdHI7bl9vdXQrKykgewogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9zdHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0ID0gZ2VuX3htbE91dHB1dEJ1ZmZlclB0cihuX291dCwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fc3RyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKG91dCwgKGNvbnN0IGNoYXIgKilzdHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxPdXRwdXRCdWZmZXJQdHIobl9vdXQsIG91dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fc3RyLCAoY29uc3QgY2hhciAqKXN0ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VyR2V0RGlyZWN0b3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciByZXRfdmFsOwogICAgaW50IGZkOyAvKiBhIGZpbGUgZGVzY3JpcHRvciBudW1iZXIgKi8KICAgIGludCBuX2ZkOwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogdGhlIGNoYXJzZXQgZW5jb2RpbmcgaWYga25vd24gKi8KICAgIGludCBuX2VuYzsKCiAgICBmb3IgKG5fZmQgPSAwO25fZmQgPCBnZW5fbmJfaW50O25fZmQrKykgewogICAgZm9yIChuX2VuYyA9IDA7bl9lbmMgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nO25fZW5jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZkID0gZ2VuX2ludChuX2ZkLCAwKTsKICAgICAgICBlbmMgPSBnZW5feG1sQ2hhckVuY29kaW5nKG5fZW5jLCAxKTsKICAgICAgICBpZiAoZmQgPj0gMCkgZmQgPSAtMTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmQoZmQsIGVuYyk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlcklucHV0QnVmZmVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fZmQsIGZkLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nKG5fZW5jLCBlbmMsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIHJldF92YWw7CiAgICBGSUxFICogZmlsZTsgLyogYSBGSUxFKiAqLwogICAgaW50IG5fZmlsZTsKICAgIHhtbENoYXJFbmNvZGluZyBlbmM7IC8qIHRoZSBjaGFyc2V0IGVuY29kaW5nIGlmIGtub3duICovCiAgICBpbnQgbl9lbmM7CgogICAgZm9yIChuX2ZpbGUgPSAwO25fZmlsZSA8IGdlbl9uYl9GSUxFX3B0cjtuX2ZpbGUrKykgewogICAgZm9yIChuX2VuYyA9IDA7bl9lbmMgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nO25fZW5jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGUgPSBnZW5fRklMRV9wdHIobl9maWxlLCAwKTsKICAgICAgICBlbmMgPSBnZW5feG1sQ2hhckVuY29kaW5nKG5fZW5jLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZShmaWxlLCBlbmMpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fZmlsZSwgZmlsZSwgMCk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogVVJJOyAvKiBhIEMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSSSBvciBmaWxlbmFtZSAqLwogICAgaW50IG5fVVJJOwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogdGhlIGNoYXJzZXQgZW5jb2RpbmcgaWYga25vd24gKi8KICAgIGludCBuX2VuYzsKCiAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9maWxlb3V0cHV0O25fVVJJKyspIHsKICAgIGZvciAobl9lbmMgPSAwO25fZW5jIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZztuX2VuYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBVUkkgPSBnZW5fZmlsZW91dHB1dChuX1VSSSwgMCk7CiAgICAgICAgZW5jID0gZ2VuX3htbENoYXJFbmNvZGluZyhuX2VuYywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKFVSSSwgZW5jKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fVVJJLCBVUkksIDApOwogICAgICAgIGRlc194bWxDaGFyRW5jb2Rpbmcobl9lbmMsIGVuYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlTWVtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgcmV0X3ZhbDsKICAgIGNoYXIgKiBtZW07IC8qIHRoZSBtZW1vcnkgaW5wdXQgKi8KICAgIGludCBuX21lbTsKICAgIGludCBzaXplOyAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBtZW1vcnkgYmxvY2sgKi8KICAgIGludCBuX3NpemU7CiAgICB4bWxDaGFyRW5jb2RpbmcgZW5jOyAvKiB0aGUgY2hhcnNldCBlbmNvZGluZyBpZiBrbm93biAqLwogICAgaW50IG5fZW5jOwoKICAgIGZvciAobl9tZW0gPSAwO25fbWVtIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fbWVtKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fZW5jID0gMDtuX2VuYyA8IGdlbl9uYl94bWxDaGFyRW5jb2Rpbmc7bl9lbmMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbWVtID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fbWVtLCAwKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDEpOwogICAgICAgIGVuYyA9IGdlbl94bWxDaGFyRW5jb2Rpbmcobl9lbmMsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVNZW0oKGNvbnN0IGNoYXIgKiltZW0sIHNpemUsIGVuYyk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlcklucHV0QnVmZmVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9tZW0sIChjb25zdCBjaGFyICopbWVtLCAwKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMSk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlTWVtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21lbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVTdGF0aWModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciByZXRfdmFsOwogICAgY2hhciAqIG1lbTsgLyogdGhlIG1lbW9yeSBpbnB1dCAqLwogICAgaW50IG5fbWVtOwogICAgaW50IHNpemU7IC8qIHRoZSBsZW5ndGggb2YgdGhlIG1lbW9yeSBibG9jayAqLwogICAgaW50IG5fc2l6ZTsKICAgIHhtbENoYXJFbmNvZGluZyBlbmM7IC8qIHRoZSBjaGFyc2V0IGVuY29kaW5nIGlmIGtub3duICovCiAgICBpbnQgbl9lbmM7CgogICAgZm9yIChuX21lbSA9IDA7bl9tZW0gPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9tZW0rKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgIGZvciAobl9lbmMgPSAwO25fZW5jIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZztuX2VuYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBtZW0gPSBnZW5fY29uc3RfY2hhcl9wdHIobl9tZW0sIDApOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMSk7CiAgICAgICAgZW5jID0gZ2VuX3htbENoYXJFbmNvZGluZyhuX2VuYywgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZVN0YXRpYygoY29uc3QgY2hhciAqKW1lbSwgc2l6ZSwgZW5jKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX21lbSwgKGNvbnN0IGNoYXIgKiltZW0sIDApOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAxKTsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nKG5fZW5jLCBlbmMsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVTdGF0aWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbWVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlckdyb3codm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGluOyAvKiBhIGJ1ZmZlcmVkIHBhcnNlciBpbnB1dCAqLwogICAgaW50IG5faW47CiAgICBpbnQgbGVuOyAvKiBpbmRpY2F0aXZlIHZhbHVlIG9mIHRoZSBhbW91bnQgb2YgY2hhcnMgdG8gcmVhZCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cjtuX2luKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBpbiA9IGdlbl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2luLCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0QnVmZmVyR3JvdyhpbiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbiwgaW4sIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJJbnB1dEJ1ZmZlckdyb3ciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB1c2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGluOyAvKiBhIGJ1ZmZlcmVkIHBhcnNlciBpbnB1dCAqLwogICAgaW50IG5faW47CiAgICBpbnQgbGVuOyAvKiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYXJyYXkuICovCiAgICBpbnQgbl9sZW47CiAgICBjaGFyICogYnVmOyAvKiBhbiBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWY7CgogICAgZm9yIChuX2luID0gMDtuX2luIDwgZ2VuX25iX3htbFBhcnNlcklucHV0QnVmZmVyUHRyO25faW4rKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGluID0gZ2VuX3htbFBhcnNlcklucHV0QnVmZmVyUHRyKG5faW4sIDApOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDEpOwogICAgICAgIGJ1ZiA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB1c2goaW4sIGxlbiwgKGNvbnN0IGNoYXIgKilidWYpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2luLCBpbiwgMCk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWYsIChjb25zdCBjaGFyICopYnVmLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlcklucHV0QnVmZmVyUHVzaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlclJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGluOyAvKiBhIGJ1ZmZlcmVkIHBhcnNlciBpbnB1dCAqLwogICAgaW50IG5faW47CiAgICBpbnQgbGVuOyAvKiBpbmRpY2F0aXZlIHZhbHVlIG9mIHRoZSBhbW91bnQgb2YgY2hhcnMgdG8gcmVhZCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cjtuX2luKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBpbiA9IGdlbl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2luLCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0QnVmZmVyUmVhZChpbiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbiwgaW4sIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJJbnB1dEJ1ZmZlclJlYWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQb3BJbnB1dENhbGxiYWNrcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICByZXRfdmFsID0geG1sUG9wSW5wdXRDYWxsYmFja3MoKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBvcElucHV0Q2FsbGJhY2tzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWdpc3RlckRlZmF1bHRJbnB1dENhbGxiYWNrcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sUmVnaXN0ZXJEZWZhdWx0SW5wdXRDYWxsYmFja3MoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWdpc3RlckRlZmF1bHRJbnB1dENhbGxiYWNrcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVnaXN0ZXJEZWZhdWx0T3V0cHV0Q2FsbGJhY2tzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbFJlZ2lzdGVyRGVmYXVsdE91dHB1dENhbGxiYWNrcygpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlZ2lzdGVyRGVmYXVsdE91dHB1dENhbGxiYWNrcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlZ2lzdGVySFRUUFBvc3RDYWxsYmFja3Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICB4bWxSZWdpc3RlckhUVFBQb3N0Q2FsbGJhY2tzKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVnaXN0ZXJIVFRQUG9zdENhbGxiYWNrcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sSU8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhtbElPIDogMzggb2YgNDcgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFsbG9jT3V0cHV0QnVmZmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFsbG9jUGFyc2VySW5wdXRCdWZmZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2hlY2tGaWxlbmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDaGVja0hUVFBJbnB1dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDbGVhbnVwSW5wdXRDYWxsYmFja3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2xlYW51cE91dHB1dENhbGxiYWNrcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxGaWxlQ2xvc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRmlsZU1hdGNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEZpbGVPcGVuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEZpbGVSZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElPRlRQQ2xvc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSU9GVFBNYXRjaCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJT0ZUUE9wZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSU9GVFBSZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElPSFRUUENsb3NlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElPSFRUUE1hdGNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElPSFRUUE9wZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSU9IVFRQUmVhZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb05ldEV4dGVybmFsRW50aXR5TG9hZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vcm1hbGl6ZVdpbmRvd3NQYXRoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE91dHB1dEJ1ZmZlckNyZWF0ZUZkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sT3V0cHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sT3V0cHV0QnVmZmVyRmx1c2goKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sT3V0cHV0QnVmZmVyV3JpdGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sT3V0cHV0QnVmZmVyV3JpdGVFc2NhcGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VyR2V0RGlyZWN0b3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVNZW0oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVTdGF0aWMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VySW5wdXRCdWZmZXJHcm93KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyUHVzaCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlclJlYWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUG9wSW5wdXRDYWxsYmFja3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnaXN0ZXJEZWZhdWx0SW5wdXRDYWxsYmFja3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnaXN0ZXJEZWZhdWx0T3V0cHV0Q2FsbGJhY2tzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlZ2lzdGVySFRUUFBvc3RDYWxsYmFja3MoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbElPOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KI2lmZGVmIExJQlhNTF9BVVRPTUFUQV9FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxBdXRvbWF0YVB0ciAxCnN0YXRpYyB4bWxBdXRvbWF0YVB0ciBnZW5feG1sQXV0b21hdGFQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEF1dG9tYXRhUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxBdXRvbWF0YVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFDb21waWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhR2V0SW5pdFN0YXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhSXNEZXRlcm1pbmlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9BVVRPTUFUQV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxBdXRvbWF0YVB0ciBhbTsgLyogYW4gYXV0b21hdGEgKi8KICAgIGludCBuX2FtOwoKICAgIGZvciAobl9hbSA9IDA7bl9hbSA8IGdlbl9uYl94bWxBdXRvbWF0YVB0cjtuX2FtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGFtID0gZ2VuX3htbEF1dG9tYXRhUHRyKG5fYW0sIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQXV0b21hdGFJc0RldGVybWluaXN0KGFtKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQXV0b21hdGFQdHIobl9hbSwgYW0sIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQXV0b21hdGFJc0RldGVybWluaXN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FtKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfQVVUT01BVEFfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sQXV0b21hdGFTdGF0ZVB0ciAxCnN0YXRpYyB4bWxBdXRvbWF0YVN0YXRlUHRyIGdlbl94bWxBdXRvbWF0YVN0YXRlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxBdXRvbWF0YVN0YXRlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxBdXRvbWF0YVN0YXRlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxBdXRvbWF0YU5ld0FsbFRyYW5zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhTmV3Q291bnRUcmFucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBdXRvbWF0YU5ld0NvdW50VHJhbnMyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhTmV3Q291bnRlZFRyYW5zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhTmV3Q291bnRlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9BVVRPTUFUQV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxBdXRvbWF0YVB0ciBhbTsgLyogYW4gYXV0b21hdGEgKi8KICAgIGludCBuX2FtOwogICAgaW50IG1pbjsgLyogdGhlIG1pbmltYWwgdmFsdWUgb24gdGhlIGNvdW50ZXIgKi8KICAgIGludCBuX21pbjsKICAgIGludCBtYXg7IC8qIHRoZSBtYXhpbWFsIHZhbHVlIG9uIHRoZSBjb3VudGVyICovCiAgICBpbnQgbl9tYXg7CgogICAgZm9yIChuX2FtID0gMDtuX2FtIDwgZ2VuX25iX3htbEF1dG9tYXRhUHRyO25fYW0rKykgewogICAgZm9yIChuX21pbiA9IDA7bl9taW4gPCBnZW5fbmJfaW50O25fbWluKyspIHsKICAgIGZvciAobl9tYXggPSAwO25fbWF4IDwgZ2VuX25iX2ludDtuX21heCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBhbSA9IGdlbl94bWxBdXRvbWF0YVB0cihuX2FtLCAwKTsKICAgICAgICBtaW4gPSBnZW5faW50KG5fbWluLCAxKTsKICAgICAgICBtYXggPSBnZW5faW50KG5fbWF4LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEF1dG9tYXRhTmV3Q291bnRlcihhbSwgbWluLCBtYXgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxBdXRvbWF0YVB0cihuX2FtLCBhbSwgMCk7CiAgICAgICAgZGVzX2ludChuX21pbiwgbWluLCAxKTsKICAgICAgICBkZXNfaW50KG5fbWF4LCBtYXgsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQXV0b21hdGFOZXdDb3VudGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21pbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9tYXgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBdXRvbWF0YU5ld0NvdW50ZXJUcmFucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBdXRvbWF0YU5ld0Vwc2lsb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFOZXdPbmNlVHJhbnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFOZXdPbmNlVHJhbnMyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhTmV3U3RhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFOZXdUcmFuc2l0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhTmV3VHJhbnNpdGlvbjIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFTZXRGaW5hbFN0YXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVHRVhQX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX0FVVE9NQVRBX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEF1dG9tYXRhUHRyIGFtOyAvKiBhbiBhdXRvbWF0YSAqLwogICAgaW50IG5fYW07CiAgICB4bWxBdXRvbWF0YVN0YXRlUHRyIHN0YXRlOyAvKiBhIHN0YXRlIGluIHRoaXMgYXV0b21hdGEgKi8KICAgIGludCBuX3N0YXRlOwoKICAgIGZvciAobl9hbSA9IDA7bl9hbSA8IGdlbl9uYl94bWxBdXRvbWF0YVB0cjtuX2FtKyspIHsKICAgIGZvciAobl9zdGF0ZSA9IDA7bl9zdGF0ZSA8IGdlbl9uYl94bWxBdXRvbWF0YVN0YXRlUHRyO25fc3RhdGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYW0gPSBnZW5feG1sQXV0b21hdGFQdHIobl9hbSwgMCk7CiAgICAgICAgc3RhdGUgPSBnZW5feG1sQXV0b21hdGFTdGF0ZVB0cihuX3N0YXRlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEF1dG9tYXRhU2V0RmluYWxTdGF0ZShhbSwgc3RhdGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxBdXRvbWF0YVB0cihuX2FtLCBhbSwgMCk7CiAgICAgICAgZGVzX3htbEF1dG9tYXRhU3RhdGVQdHIobl9zdGF0ZSwgc3RhdGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQXV0b21hdGFTZXRGaW5hbFN0YXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0YXRlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3QXV0b21hdGEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxhdXRvbWF0YSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sYXV0b21hdGEgOiAzIG9mIDE4IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBdXRvbWF0YUNvbXBpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFHZXRJbml0U3RhdGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFJc0RldGVybWluaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3QWxsVHJhbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFOZXdDb3VudFRyYW5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3Q291bnRUcmFuczIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFOZXdDb3VudGVkVHJhbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFOZXdDb3VudGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3Q291bnRlclRyYW5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3RXBzaWxvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBdXRvbWF0YU5ld09uY2VUcmFucygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBdXRvbWF0YU5ld09uY2VUcmFuczIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFOZXdTdGF0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBdXRvbWF0YU5ld1RyYW5zaXRpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFOZXdUcmFuc2l0aW9uMigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBdXRvbWF0YVNldEZpbmFsU3RhdGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3QXV0b21hdGEoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbGF1dG9tYXRhOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNkZWZpbmUgZ2VuX25iX3htbEdlbmVyaWNFcnJvckZ1bmNfcHRyIDEKc3RhdGljIHhtbEdlbmVyaWNFcnJvckZ1bmMgKiBnZW5feG1sR2VuZXJpY0Vycm9yRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEdlbmVyaWNFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxHZW5lcmljRXJyb3JGdW5jICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF9pbml0R2VuZXJpY0Vycm9yRGVmYXVsdEZ1bmModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxHZW5lcmljRXJyb3JGdW5jICogaGFuZGxlcjsgLyogdGhlIGhhbmRsZXIgKi8KICAgIGludCBuX2hhbmRsZXI7CgogICAgZm9yIChuX2hhbmRsZXIgPSAwO25faGFuZGxlciA8IGdlbl9uYl94bWxHZW5lcmljRXJyb3JGdW5jX3B0cjtuX2hhbmRsZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgaGFuZGxlciA9IGdlbl94bWxHZW5lcmljRXJyb3JGdW5jX3B0cihuX2hhbmRsZXIsIDApOwoKICAgICAgICBpbml0R2VuZXJpY0Vycm9yRGVmYXVsdEZ1bmMoaGFuZGxlcik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxHZW5lcmljRXJyb3JGdW5jX3B0cihuX2hhbmRsZXIsIGhhbmRsZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaW5pdEdlbmVyaWNFcnJvckRlZmF1bHRGdW5jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hhbmRsZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sRXJyb3JQdHIgMQpzdGF0aWMgeG1sRXJyb3JQdHIgZ2VuX3htbEVycm9yUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxFcnJvclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRXJyb3JQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5RXJyb3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEVycm9yUHRyIGZyb207IC8qIGEgc291cmNlIGVycm9yICovCiAgICBpbnQgbl9mcm9tOwogICAgeG1sRXJyb3JQdHIgdG87IC8qIGEgdGFyZ2V0IGVycm9yICovCiAgICBpbnQgbl90bzsKCiAgICBmb3IgKG5fZnJvbSA9IDA7bl9mcm9tIDwgZ2VuX25iX3htbEVycm9yUHRyO25fZnJvbSsrKSB7CiAgICBmb3IgKG5fdG8gPSAwO25fdG8gPCBnZW5fbmJfeG1sRXJyb3JQdHI7bl90bysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmcm9tID0gZ2VuX3htbEVycm9yUHRyKG5fZnJvbSwgMCk7CiAgICAgICAgdG8gPSBnZW5feG1sRXJyb3JQdHIobl90bywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDb3B5RXJyb3IoZnJvbSwgdG8pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxFcnJvclB0cihuX2Zyb20sIGZyb20sIDApOwogICAgICAgIGRlc194bWxFcnJvclB0cihuX3RvLCB0bywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb3B5RXJyb3IiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZnJvbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90byk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3R4dEdldExhc3RFcnJvcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDdHh0UmVzZXRMYXN0RXJyb3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogY3R4OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwoKICAgICAgICB4bWxDdHh0UmVzZXRMYXN0RXJyb3IoY3R4KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ3R4dFJlc2V0TGFzdEVycm9yIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0TGFzdEVycm9yKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlckVycm9yKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlclByaW50RmlsZUNvbnRleHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dDsgLyogYW4geG1sUGFyc2VySW5wdXRQdHIgaW5wdXQgKi8KICAgIGludCBuX2lucHV0OwoKICAgIGZvciAobl9pbnB1dCA9IDA7bl9pbnB1dCA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dFB0cjtuX2lucHV0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGlucHV0ID0gZ2VuX3htbFBhcnNlcklucHV0UHRyKG5faW5wdXQsIDApOwoKICAgICAgICB4bWxQYXJzZXJQcmludEZpbGVDb250ZXh0KGlucHV0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlcklucHV0UHRyKG5faW5wdXQsIGlucHV0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlclByaW50RmlsZUNvbnRleHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5wdXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlclByaW50RmlsZUluZm8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dDsgLyogYW4geG1sUGFyc2VySW5wdXRQdHIgaW5wdXQgKi8KICAgIGludCBuX2lucHV0OwoKICAgIGZvciAobl9pbnB1dCA9IDA7bl9pbnB1dCA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dFB0cjtuX2lucHV0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGlucHV0ID0gZ2VuX3htbFBhcnNlcklucHV0UHRyKG5faW5wdXQsIDApOwoKICAgICAgICB4bWxQYXJzZXJQcmludEZpbGVJbmZvKGlucHV0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlcklucHV0UHRyKG5faW5wdXQsIGlucHV0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlclByaW50RmlsZUluZm8iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5wdXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlclZhbGlkaXR5RXJyb3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VyVmFsaWRpdHlXYXJuaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlcldhcm5pbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVzZXRFcnJvcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVycm9yUHRyIGVycjsgLyogcG9pbnRlciB0byB0aGUgZXJyb3IuICovCiAgICBpbnQgbl9lcnI7CgogICAgZm9yIChuX2VyciA9IDA7bl9lcnIgPCBnZW5fbmJfeG1sRXJyb3JQdHI7bl9lcnIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZXJyID0gZ2VuX3htbEVycm9yUHRyKG5fZXJyLCAwKTsKCiAgICAgICAgeG1sUmVzZXRFcnJvcihlcnIpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRXJyb3JQdHIobl9lcnIsIGVyciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZXNldEVycm9yIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Vycik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVzZXRMYXN0RXJyb3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgoKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNldEdlbmVyaWNFcnJvckZ1bmModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2V0U3RydWN0dXJlZEVycm9yRnVuYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbGVycm9yKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB4bWxlcnJvciA6IDcgb2YgMTUgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2luaXRHZW5lcmljRXJyb3JEZWZhdWx0RnVuYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDb3B5RXJyb3IoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3R4dEdldExhc3RFcnJvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDdHh0UmVzZXRMYXN0RXJyb3IoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0TGFzdEVycm9yKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlckVycm9yKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlclByaW50RmlsZUNvbnRleHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VyUHJpbnRGaWxlSW5mbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJWYWxpZGl0eUVycm9yKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlclZhbGlkaXR5V2FybmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJXYXJuaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlc2V0RXJyb3IoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2V0R2VuZXJpY0Vycm9yRnVuYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTZXRTdHJ1Y3R1cmVkRXJyb3JGdW5jKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4bWxlcnJvcjogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CiNpZmRlZiBMSUJYTUxfTU9EVUxFU19FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxNb2R1bGVQdHIgMQpzdGF0aWMgeG1sTW9kdWxlUHRyIGdlbl94bWxNb2R1bGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbE1vZHVsZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTW9kdWxlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxNb2R1bGVDbG9zZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX01PRFVMRVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTW9kdWxlUHRyIG1vZHVsZTsgLyogdGhlIG1vZHVsZSBoYW5kbGUgKi8KICAgIGludCBuX21vZHVsZTsKCiAgICBmb3IgKG5fbW9kdWxlID0gMDtuX21vZHVsZSA8IGdlbl9uYl94bWxNb2R1bGVQdHI7bl9tb2R1bGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbW9kdWxlID0gZ2VuX3htbE1vZHVsZVB0cihuX21vZHVsZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxNb2R1bGVDbG9zZShtb2R1bGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxNb2R1bGVQdHIobl9tb2R1bGUsIG1vZHVsZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxNb2R1bGVDbG9zZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9tb2R1bGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxNb2R1bGVPcGVuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE1vZHVsZVN5bWJvbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX01PRFVMRVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTW9kdWxlUHRyIG1vZHVsZTsgLyogdGhlIG1vZHVsZSAqLwogICAgaW50IG5fbW9kdWxlOwogICAgY2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KICAgIGludCBuX25hbWU7CiAgICB2b2lkICoqIHN5bWJvbDsgLyogdGhlIHJlc3VsdGluZyBzeW1ib2wgYWRkcmVzcyAqLwogICAgaW50IG5fc3ltYm9sOwoKICAgIGZvciAobl9tb2R1bGUgPSAwO25fbW9kdWxlIDwgZ2VuX25iX3htbE1vZHVsZVB0cjtuX21vZHVsZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fc3ltYm9sID0gMDtuX3N5bWJvbCA8IGdlbl9uYl92b2lkX3B0cl9wdHI7bl9zeW1ib2wrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbW9kdWxlID0gZ2VuX3htbE1vZHVsZVB0cihuX21vZHVsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF9jaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHN5bWJvbCA9IGdlbl92b2lkX3B0cl9wdHIobl9zeW1ib2wsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sTW9kdWxlU3ltYm9sKG1vZHVsZSwgKGNvbnN0IGNoYXIgKiluYW1lLCBzeW1ib2wpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxNb2R1bGVQdHIobl9tb2R1bGUsIG1vZHVsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IGNoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfdm9pZF9wdHJfcHRyKG5fc3ltYm9sLCBzeW1ib2wsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTW9kdWxlU3ltYm9sIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21vZHVsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5bWJvbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sbW9kdWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB4bWxtb2R1bGUgOiAyIG9mIDQgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE1vZHVsZUNsb3NlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE1vZHVsZU9wZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTW9kdWxlU3ltYm9sKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4bWxtb2R1bGU6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbE5ld1RleHRSZWFkZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmV0X3ZhbDsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGlucHV0OyAvKiB0aGUgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgdXNlZCB0byByZWFkIGRhdGEgKi8KICAgIGludCBuX2lucHV0OwogICAgY29uc3QgY2hhciAqIFVSSTsgLyogdGhlIFVSSSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNvdXJjZSBpZiBhdmFpbGFibGUgKi8KICAgIGludCBuX1VSSTsKCiAgICBmb3IgKG5faW5wdXQgPSAwO25faW5wdXQgPCBnZW5fbmJfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHI7bl9pbnB1dCsrKSB7CiAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9maWxlcGF0aDtuX1VSSSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBpbnB1dCA9IGdlbl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2lucHV0LCAwKTsKICAgICAgICBVUkkgPSBnZW5fZmlsZXBhdGgobl9VUkksIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3VGV4dFJlYWRlcihpbnB1dCwgVVJJKTsKICAgICAgICBkZXNyZXRfeG1sVGV4dFJlYWRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlcklucHV0QnVmZmVyUHRyKG5faW5wdXQsIGlucHV0LCAwKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkksIFVSSSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdUZXh0UmVhZGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2lucHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld1RleHRSZWFkZXJGaWxlbmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sVGV4dFJlYWRlclB0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIFVSSTsgLyogdGhlIFVSSSBvZiB0aGUgcmVzb3VyY2UgdG8gcHJvY2VzcyAqLwogICAgaW50IG5fVVJJOwoKICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJJKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSSSA9IGdlbl9maWxlcGF0aChuX1VSSSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdUZXh0UmVhZGVyRmlsZW5hbWUoVVJJKTsKICAgICAgICBkZXNyZXRfeG1sVGV4dFJlYWRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJJLCBVUkksIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3VGV4dFJlYWRlckZpbGVuYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlYWRlckZvckRvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sVGV4dFJlYWRlclB0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZyAqLwogICAgaW50IG5fY3VyOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jdXIrKykgewogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9wYXJzZXJvcHRpb25zO25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIDApOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMSk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMik7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWFkZXJGb3JEb2MoKGNvbnN0IHhtbENoYXIgKiljdXIsIFVSTCwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X3htbFRleHRSZWFkZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgKGNvbnN0IHhtbENoYXIgKiljdXIsIDApOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSTCwgVVJMLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgZGVzX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCBvcHRpb25zLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlYWRlckZvckRvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWFkZXJGb3JGaWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIGEgZmlsZSBvciBVUkwgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgeG1sUGFyc2VyT3B0aW9uICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMCk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMSk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWFkZXJGb3JGaWxlKGZpbGVuYW1lLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfeG1sVGV4dFJlYWRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMSk7CiAgICAgICAgZGVzX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCBvcHRpb25zLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlYWRlckZvckZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlYWRlckZvck1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sVGV4dFJlYWRlclB0ciByZXRfdmFsOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIHRoZSBiYXNlIFVSTCB0byB1c2UgZm9yIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fVVJMOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgeG1sUGFyc2VyT3B0aW9uICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX3BhcnNlcm9wdGlvbnM7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgMCk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAxKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDIpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDMpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVhZGVyRm9yTWVtb3J5KChjb25zdCBjaGFyICopYnVmZmVyLCBzaXplLCBVUkwsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF94bWxUZXh0UmVhZGVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAwKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMSk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICBkZXNfcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIG9wdGlvbnMsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVhZGVyRm9yTWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVhZGVyTmV3RG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiBhbiBYTUwgcmVhZGVyICovCiAgICBpbnQgbl9yZWFkZXI7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nICovCiAgICBpbnQgbl9jdXI7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX1VSTDsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIGN1ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgMSk7CiAgICAgICAgVVJMID0gZ2VuX2ZpbGVwYXRoKG5fVVJMLCAyKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAzKTsKICAgICAgICBvcHRpb25zID0gZ2VuX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlYWRlck5ld0RvYyhyZWFkZXIsIChjb25zdCB4bWxDaGFyICopY3VyLCBVUkwsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgKGNvbnN0IHhtbENoYXIgKiljdXIsIDEpOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSTCwgVVJMLCAyKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMyk7CiAgICAgICAgZGVzX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCBvcHRpb25zLCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlYWRlck5ld0RvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVhZGVyTmV3RmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogYW4gWE1MIHJlYWRlciAqLwogICAgaW50IG5fcmVhZGVyOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiBhIGZpbGUgb3IgVVJMICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVhZGVyTmV3RmlsZShyZWFkZXIsIGZpbGVuYW1lLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAyKTsKICAgICAgICBkZXNfcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIG9wdGlvbnMsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVhZGVyTmV3RmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlYWRlck5ld01lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogYW4gWE1MIHJlYWRlciAqLwogICAgaW50IG5fcmVhZGVyOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIHRoZSBiYXNlIFVSTCB0byB1c2UgZm9yIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fVVJMOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgeG1sUGFyc2VyT3B0aW9uICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgMSk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAyKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDMpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDQpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDUpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVhZGVyTmV3TWVtb3J5KHJlYWRlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUsIFVSTCwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgMSk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDIpOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSTCwgVVJMLCAzKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgNCk7CiAgICAgICAgZGVzX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCBvcHRpb25zLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlYWRlck5ld01lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWFkZXJOZXdXYWxrZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIGFuIFhNTCByZWFkZXIgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgcHJlcGFyc2VkIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVhZGVyTmV3V2Fsa2VyKHJlYWRlciwgZG9jKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVhZGVyTmV3V2Fsa2VyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWFkZXJXYWxrZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgcHJlcGFyc2VkIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUmVhZGVyV2Fsa2VyKGRvYyk7CiAgICAgICAgZGVzcmV0X3htbFRleHRSZWFkZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWFkZXJXYWxrZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckF0dHJpYnV0ZUNvdW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQXR0cmlidXRlQ291bnQocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJBdHRyaWJ1dGVDb3VudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQmFzZVVyaSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckJhc2VVcmkocmVhZGVyKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckJhc2VVcmkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckJ5dGVDb25zdW1lZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgbG9uZyByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIGFuIFhNTCByZWFkZXIgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJCeXRlQ29uc3VtZWQocmVhZGVyKTsKICAgICAgICBkZXNyZXRfbG9uZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQnl0ZUNvbnN1bWVkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJDbG9zZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckNsb3NlKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ2xvc2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckNvbnN0QmFzZVVyaSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckNvbnN0QmFzZVVyaShyZWFkZXIpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ29uc3RCYXNlVXJpIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJDb25zdEVuY29kaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ29uc3RFbmNvZGluZyhyZWFkZXIpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ29uc3RFbmNvZGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RMb2NhbE5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJDb25zdExvY2FsTmFtZShyZWFkZXIpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ29uc3RMb2NhbE5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckNvbnN0TmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckNvbnN0TmFtZShyZWFkZXIpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ29uc3ROYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJDb25zdE5hbWVzcGFjZVVyaSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckNvbnN0TmFtZXNwYWNlVXJpKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDb25zdE5hbWVzcGFjZVVyaSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RQcmVmaXgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJDb25zdFByZWZpeChyZWFkZXIpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ29uc3RQcmVmaXgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckNvbnN0U3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgc3RyaW5nIHRvIGludGVybi4gKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckNvbnN0U3RyaW5nKHJlYWRlciwgKGNvbnN0IHhtbENoYXIgKilzdHIpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ29uc3RTdHJpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJDb25zdFZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ29uc3RWYWx1ZShyZWFkZXIpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ29uc3RWYWx1ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RYbWxMYW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ29uc3RYbWxMYW5nKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDb25zdFhtbExhbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckNvbnN0WG1sVmVyc2lvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckNvbnN0WG1sVmVyc2lvbihyZWFkZXIpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ29uc3RYbWxWZXJzaW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJDdXJyZW50RG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ3VycmVudERvYyhyZWFkZXIpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckN1cnJlbnREb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckN1cnJlbnROb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckN1cnJlbnROb2RlKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckN1cnJlbnROb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJEZXB0aCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckRlcHRoKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyRGVwdGgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckV4cGFuZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJFeHBhbmQocmVhZGVyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyRXhwYW5kIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJHZXRBdHRyaWJ1dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZShyZWFkZXIsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJHZXRBdHRyaWJ1dGVObyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgaW50IG5vOyAvKiB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgYXR0cmlidXRlIHJlbGF0aXZlIHRvIHRoZSBjb250YWluaW5nIGVsZW1lbnQgKi8KICAgIGludCBuX25vOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX25vID0gMDtuX25vIDwgZ2VuX25iX2ludDtuX25vKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKICAgICAgICBubyA9IGdlbl9pbnQobl9ubywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyR2V0QXR0cmlidXRlTm8ocmVhZGVyLCBubyk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfaW50KG5fbm8sIG5vLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJHZXRBdHRyaWJ1dGVObyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm8pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyR2V0QXR0cmlidXRlTnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbENoYXIgKiBsb2NhbE5hbWU7IC8qIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICovCiAgICBpbnQgbl9sb2NhbE5hbWU7CiAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiB0aGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgYXR0cmlidXRlLiAqLwogICAgaW50IG5fbmFtZXNwYWNlVVJJOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX2xvY2FsTmFtZSA9IDA7bl9sb2NhbE5hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9sb2NhbE5hbWUrKykgewogICAgZm9yIChuX25hbWVzcGFjZVVSSSA9IDA7bl9uYW1lc3BhY2VVUkkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lc3BhY2VVUkkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIGxvY2FsTmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2xvY2FsTmFtZSwgMSk7CiAgICAgICAgbmFtZXNwYWNlVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJHZXRBdHRyaWJ1dGVOcyhyZWFkZXIsIChjb25zdCB4bWxDaGFyICopbG9jYWxOYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9sb2NhbE5hbWUsIChjb25zdCB4bWxDaGFyICopbG9jYWxOYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIChjb25zdCB4bWxDaGFyICopbmFtZXNwYWNlVVJJLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJHZXRBdHRyaWJ1dGVOcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbG9jYWxOYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVzcGFjZVVSSSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxUZXh0UmVhZGVyRXJyb3JGdW5jX3B0ciAxCnN0YXRpYyB4bWxUZXh0UmVhZGVyRXJyb3JGdW5jICogZ2VuX3htbFRleHRSZWFkZXJFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxUZXh0UmVhZGVyRXJyb3JGdW5jX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sVGV4dFJlYWRlckVycm9yRnVuYyAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyR2V0RXJyb3JIYW5kbGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgeG1sVGV4dFJlYWRlckVycm9yRnVuYyAqIGY7IC8qIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBvciBOVUxMIGlzIG5vIGNhbGxiYWNrIGhhcyBiZWVuIHJlZ2lzdGVyZWQgKi8KICAgIGludCBuX2Y7CiAgICB2b2lkICoqIGFyZzsgLyogYSB1c2VyIGFyZ3VtZW50ICovCiAgICBpbnQgbl9hcmc7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fZiA9IDA7bl9mIDwgZ2VuX25iX3htbFRleHRSZWFkZXJFcnJvckZ1bmNfcHRyO25fZisrKSB7CiAgICBmb3IgKG5fYXJnID0gMDtuX2FyZyA8IGdlbl9uYl92b2lkX3B0cl9wdHI7bl9hcmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIGYgPSBnZW5feG1sVGV4dFJlYWRlckVycm9yRnVuY19wdHIobl9mLCAxKTsKICAgICAgICBhcmcgPSBnZW5fdm9pZF9wdHJfcHRyKG5fYXJnLCAyKTsKCiAgICAgICAgeG1sVGV4dFJlYWRlckdldEVycm9ySGFuZGxlcihyZWFkZXIsIGYsIGFyZyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyRXJyb3JGdW5jX3B0cihuX2YsIGYsIDEpOwogICAgICAgIGRlc192b2lkX3B0cl9wdHIobl9hcmcsIGFyZywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyR2V0RXJyb3JIYW5kbGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FyZyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJHZXRQYXJzZXJDb2x1bW5OdW1iZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCByZWFkZXIgY29udGV4dCkgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJHZXRQYXJzZXJDb2x1bW5OdW1iZXIocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJHZXRQYXJzZXJDb2x1bW5OdW1iZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckdldFBhcnNlckxpbmVOdW1iZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCByZWFkZXIgY29udGV4dCkgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJHZXRQYXJzZXJMaW5lTnVtYmVyKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyR2V0UGFyc2VyTGluZU51bWJlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyR2V0UGFyc2VyUHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgaW50IHByb3A7IC8qIHRoZSB4bWxQYXJzZXJQcm9wZXJ0aWVzIHRvIGdldCAqLwogICAgaW50IG5fcHJvcDsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9wcm9wID0gMDtuX3Byb3AgPCBnZW5fbmJfaW50O25fcHJvcCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgcHJvcCA9IGdlbl9pbnQobl9wcm9wLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJHZXRQYXJzZXJQcm9wKHJlYWRlciwgcHJvcCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2ludChuX3Byb3AsIHByb3AsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckdldFBhcnNlclByb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3Byb3ApOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyR2V0UmVtYWluZGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJHZXRSZW1haW5kZXIocmVhZGVyKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckdldFJlbWFpbmRlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVySGFzQXR0cmlidXRlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckhhc0F0dHJpYnV0ZXMocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJIYXNBdHRyaWJ1dGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJIYXNWYWx1ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckhhc1ZhbHVlKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVySGFzVmFsdWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlcklzRGVmYXVsdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlcklzRGVmYXVsdChyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlcklzRGVmYXVsdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVySXNFbXB0eUVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJJc0VtcHR5RWxlbWVudChyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlcklzRW1wdHlFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJJc05hbWVzcGFjZURlY2wodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJJc05hbWVzcGFjZURlY2wocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJJc05hbWVzcGFjZURlY2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlcklzVmFsaWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJJc1ZhbGlkKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVySXNWYWxpZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyTG9jYWxOYW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTG9jYWxOYW1lKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJMb2NhbE5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyIDEKc3RhdGljIHhtbFRleHRSZWFkZXJMb2NhdG9yUHRyIGdlbl94bWxUZXh0UmVhZGVyTG9jYXRvclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFRleHRSZWFkZXJMb2NhdG9yUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyTG9jYXRvckJhc2VVUkkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgbG9jYXRvcjsgLyogdGhlIHhtbFRleHRSZWFkZXJMb2NhdG9yUHRyIHVzZWQgKi8KICAgIGludCBuX2xvY2F0b3I7CgogICAgZm9yIChuX2xvY2F0b3IgPSAwO25fbG9jYXRvciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyTG9jYXRvclB0cjtuX2xvY2F0b3IrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbG9jYXRvciA9IGdlbl94bWxUZXh0UmVhZGVyTG9jYXRvclB0cihuX2xvY2F0b3IsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckxvY2F0b3JCYXNlVVJJKGxvY2F0b3IpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyKG5fbG9jYXRvciwgbG9jYXRvciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTG9jYXRvckJhc2VVUkkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbG9jYXRvcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJMb2NhdG9yTGluZU51bWJlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciBsb2NhdG9yOyAvKiB0aGUgeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgdXNlZCAqLwogICAgaW50IG5fbG9jYXRvcjsKCiAgICBmb3IgKG5fbG9jYXRvciA9IDA7bl9sb2NhdG9yIDwgZ2VuX25iX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyO25fbG9jYXRvcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsb2NhdG9yID0gZ2VuX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyKG5fbG9jYXRvciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTG9jYXRvckxpbmVOdW1iZXIobG9jYXRvcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyKG5fbG9jYXRvciwgbG9jYXRvciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTG9jYXRvckxpbmVOdW1iZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbG9jYXRvcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJMb29rdXBOYW1lc3BhY2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIHRoZSBwcmVmaXggd2hvc2UgbmFtZXNwYWNlIFVSSSBpcyB0byBiZSByZXNvbHZlZC4gVG8gcmV0dXJuIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwgc3BlY2lmeSBOVUxMICovCiAgICBpbnQgbl9wcmVmaXg7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJMb29rdXBOYW1lc3BhY2UocmVhZGVyLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJMb29rdXBOYW1lc3BhY2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJNb3ZlVG9BdHRyaWJ1dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlck1vdmVUb0F0dHJpYnV0ZShyZWFkZXIsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJNb3ZlVG9BdHRyaWJ1dGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyTW92ZVRvQXR0cmlidXRlTm8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIGludCBubzsgLyogdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGF0dHJpYnV0ZSByZWxhdGl2ZSB0byB0aGUgY29udGFpbmluZyBlbGVtZW50LiAqLwogICAgaW50IG5fbm87CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fbm8gPSAwO25fbm8gPCBnZW5fbmJfaW50O25fbm8rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIG5vID0gZ2VuX2ludChuX25vLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJNb3ZlVG9BdHRyaWJ1dGVObyhyZWFkZXIsIG5vKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfaW50KG5fbm8sIG5vLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJNb3ZlVG9BdHRyaWJ1dGVObyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm8pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyTW92ZVRvQXR0cmlidXRlTnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbENoYXIgKiBsb2NhbE5hbWU7IC8qIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICovCiAgICBpbnQgbl9sb2NhbE5hbWU7CiAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiB0aGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgYXR0cmlidXRlLiAqLwogICAgaW50IG5fbmFtZXNwYWNlVVJJOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX2xvY2FsTmFtZSA9IDA7bl9sb2NhbE5hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9sb2NhbE5hbWUrKykgewogICAgZm9yIChuX25hbWVzcGFjZVVSSSA9IDA7bl9uYW1lc3BhY2VVUkkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lc3BhY2VVUkkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIGxvY2FsTmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2xvY2FsTmFtZSwgMSk7CiAgICAgICAgbmFtZXNwYWNlVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJNb3ZlVG9BdHRyaWJ1dGVOcyhyZWFkZXIsIChjb25zdCB4bWxDaGFyICopbG9jYWxOYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbG9jYWxOYW1lLCAoY29uc3QgeG1sQ2hhciAqKWxvY2FsTmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTW92ZVRvQXR0cmlidXRlTnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xvY2FsTmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lc3BhY2VVUkkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyTW92ZVRvRWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlck1vdmVUb0VsZW1lbnQocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJNb3ZlVG9FbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJNb3ZlVG9GaXJzdEF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlck1vdmVUb0ZpcnN0QXR0cmlidXRlKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTW92ZVRvRmlyc3RBdHRyaWJ1dGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlck1vdmVUb05leHRBdHRyaWJ1dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJNb3ZlVG9OZXh0QXR0cmlidXRlKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTW92ZVRvTmV4dEF0dHJpYnV0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyTmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlck5hbWUocmVhZGVyKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlck5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlck5hbWVzcGFjZVVyaSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlck5hbWVzcGFjZVVyaShyZWFkZXIpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTmFtZXNwYWNlVXJpIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJOZXh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTmV4dChyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlck5leHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlck5leHRTaWJsaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTmV4dFNpYmxpbmcocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJOZXh0U2libGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyTm9kZVR5cGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJOb2RlVHlwZShyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlck5vZGVUeXBlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJOb3JtYWxpemF0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTm9ybWFsaXphdGlvbihyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlck5vcm1hbGl6YXRpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlclByZWZpeCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclByZWZpeChyZWFkZXIpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyUHJlZml4IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJQcmVzZXJ2ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJQcmVzZXJ2ZShyZWFkZXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJQcmVzZXJ2ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyUHJlc2VydmVQYXR0ZXJuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1BBVFRFUk5fRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9QQVRURVJOX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbENoYXIgKiBwYXR0ZXJuOyAvKiBhbiBYUGF0aCBzdWJzZXQgcGF0dGVybiAqLwogICAgaW50IG5fcGF0dGVybjsKICAgIHhtbENoYXIgKiogbmFtZXNwYWNlczsgLyogdGhlIHByZWZpeCBkZWZpbml0aW9ucywgYXJyYXkgb2YgW1VSSSwgcHJlZml4XSBvciBOVUxMICovCiAgICBpbnQgbl9uYW1lc3BhY2VzOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX3BhdHRlcm4gPSAwO25fcGF0dGVybiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3BhdHRlcm4rKykgewogICAgZm9yIChuX25hbWVzcGFjZXMgPSAwO25fbmFtZXNwYWNlcyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHI7bl9uYW1lc3BhY2VzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKICAgICAgICBwYXR0ZXJuID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcGF0dGVybiwgMSk7CiAgICAgICAgbmFtZXNwYWNlcyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cl9wdHIobl9uYW1lc3BhY2VzLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJQcmVzZXJ2ZVBhdHRlcm4ocmVhZGVyLCAoY29uc3QgeG1sQ2hhciAqKXBhdHRlcm4sIChjb25zdCB4bWxDaGFyICoqKW5hbWVzcGFjZXMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3BhdHRlcm4sIChjb25zdCB4bWxDaGFyICopcGF0dGVybiwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX25hbWVzcGFjZXMsIChjb25zdCB4bWxDaGFyICoqKW5hbWVzcGFjZXMsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclByZXNlcnZlUGF0dGVybiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGF0dGVybik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lc3BhY2VzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJRdW90ZUNoYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJRdW90ZUNoYXIocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJRdW90ZUNoYXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlclJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJSZWFkKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyUmVhZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyUmVhZEF0dHJpYnV0ZVZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyUmVhZEF0dHJpYnV0ZVZhbHVlKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyUmVhZEF0dHJpYnV0ZVZhbHVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJSZWFkU3RhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJSZWFkU3RhdGUocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJSZWFkU3RhdGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlclJlbGF4TkdTZXRTY2hlbWEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgeG1sUmVsYXhOR1B0ciBzY2hlbWE7IC8qIGEgcHJlY29tcGlsZWQgUmVsYXhORyBzY2hlbWEgKi8KICAgIGludCBuX3NjaGVtYTsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9zY2hlbWEgPSAwO25fc2NoZW1hIDwgZ2VuX25iX3htbFJlbGF4TkdQdHI7bl9zY2hlbWErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIHNjaGVtYSA9IGdlbl94bWxSZWxheE5HUHRyKG5fc2NoZW1hLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJSZWxheE5HU2V0U2NoZW1hKHJlYWRlciwgc2NoZW1hKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfeG1sUmVsYXhOR1B0cihuX3NjaGVtYSwgc2NoZW1hLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJSZWxheE5HU2V0U2NoZW1hIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zY2hlbWEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyUmVsYXhOR1ZhbGlkYXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIGNoYXIgKiBybmc7IC8qIHRoZSBwYXRoIHRvIGEgUmVsYXhORyBzY2hlbWEgb3IgTlVMTCAqLwogICAgaW50IG5fcm5nOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX3JuZyA9IDA7bl9ybmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9ybmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIHJuZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3JuZywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyUmVsYXhOR1ZhbGlkYXRlKHJlYWRlciwgKGNvbnN0IGNoYXIgKilybmcpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3JuZywgKGNvbnN0IGNoYXIgKilybmcsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclJlbGF4TkdWYWxpZGF0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcm5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlclNldEVycm9ySGFuZGxlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyU2V0UGFyc2VyUHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgaW50IHByb3A7IC8qIHRoZSB4bWxQYXJzZXJQcm9wZXJ0aWVzIHRvIHNldCAqLwogICAgaW50IG5fcHJvcDsKICAgIGludCB2YWx1ZTsgLyogdXN1YWxseSAwIG9yIDEgdG8gKGRlKWFjdGl2YXRlIGl0ICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9wcm9wID0gMDtuX3Byb3AgPCBnZW5fbmJfaW50O25fcHJvcCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfaW50O25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIHByb3AgPSBnZW5faW50KG5fcHJvcCwgMSk7CiAgICAgICAgdmFsdWUgPSBnZW5faW50KG5fdmFsdWUsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclNldFBhcnNlclByb3AocmVhZGVyLCBwcm9wLCB2YWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2ludChuX3Byb3AsIHByb3AsIDEpOwogICAgICAgIGRlc19pbnQobl92YWx1ZSwgdmFsdWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclNldFBhcnNlclByb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3Byb3ApOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyU2V0U3RydWN0dXJlZEVycm9ySGFuZGxlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyU3RhbmRhbG9uZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclN0YW5kYWxvbmUocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJTdGFuZGFsb25lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJWYWx1ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclZhbHVlKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJWYWx1ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyWG1sTGFuZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclhtbExhbmcocmVhZGVyKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclhtbExhbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxyZWFkZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhtbHJlYWRlciA6IDcxIG9mIDgxIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdUZXh0UmVhZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld1RleHRSZWFkZXJGaWxlbmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWFkZXJGb3JEb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVhZGVyRm9yRmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWFkZXJGb3JNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVhZGVyTmV3RG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlYWRlck5ld0ZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVhZGVyTmV3TWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlYWRlck5ld1dhbGtlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWFkZXJXYWxrZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckF0dHJpYnV0ZUNvdW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJCYXNlVXJpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJCeXRlQ29uc3VtZWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckNsb3NlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJDb25zdEJhc2VVcmkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckNvbnN0RW5jb2RpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckNvbnN0TG9jYWxOYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJDb25zdE5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckNvbnN0TmFtZXNwYWNlVXJpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJDb25zdFByZWZpeCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RTdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckNvbnN0VmFsdWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckNvbnN0WG1sTGFuZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RYbWxWZXJzaW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJDdXJyZW50RG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJDdXJyZW50Tm9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyRGVwdGgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckV4cGFuZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyR2V0QXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJHZXRBdHRyaWJ1dGVObygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyR2V0QXR0cmlidXRlTnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckdldEVycm9ySGFuZGxlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyR2V0UGFyc2VyQ29sdW1uTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJHZXRQYXJzZXJMaW5lTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJHZXRQYXJzZXJQcm9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJHZXRSZW1haW5kZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckhhc0F0dHJpYnV0ZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckhhc1ZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJJc0RlZmF1bHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlcklzRW1wdHlFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJJc05hbWVzcGFjZURlY2woKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlcklzVmFsaWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckxvY2FsTmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTG9jYXRvckJhc2VVUkkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckxvY2F0b3JMaW5lTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJMb29rdXBOYW1lc3BhY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlck1vdmVUb0F0dHJpYnV0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTW92ZVRvQXR0cmlidXRlTm8oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlck1vdmVUb0F0dHJpYnV0ZU5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJNb3ZlVG9FbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJNb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTW92ZVRvTmV4dEF0dHJpYnV0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTmFtZXNwYWNlVXJpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJOZXh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJOZXh0U2libGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTm9kZVR5cGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlck5vcm1hbGl6YXRpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclByZWZpeCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyUHJlc2VydmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclByZXNlcnZlUGF0dGVybigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyUXVvdGVDaGFyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJSZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJSZWFkQXR0cmlidXRlVmFsdWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclJlYWRTdGF0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyUmVsYXhOR1NldFNjaGVtYSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyUmVsYXhOR1ZhbGlkYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJTZXRFcnJvckhhbmRsZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclNldFBhcnNlclByb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclNldFN0cnVjdHVyZWRFcnJvckhhbmRsZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclN0YW5kYWxvbmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJYbWxMYW5nKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4bWxyZWFkZXI6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQojaWZkZWYgTElCWE1MX1JFR0VYUF9FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxSZWdFeGVjQ3R4dFB0ciAxCnN0YXRpYyB4bWxSZWdFeGVjQ3R4dFB0ciBnZW5feG1sUmVnRXhlY0N0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFJlZ0V4ZWNDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxSZWdFeGVjQ3R4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVnRXhlY0VyckluZm8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUmVnRXhlY0N0eHRQdHIgZXhlYzsgLyogYSByZWdleHAgZXhlY3V0aW9uIGNvbnRleHQgZ2VuZXJhdGluZyBhbiBlcnJvciAqLwogICAgaW50IG5fZXhlYzsKICAgIHhtbENoYXIgKiogc3RyaW5nOyAvKiByZXR1cm4gdmFsdWUgZm9yIHRoZSBlcnJvciBzdHJpbmcgKi8KICAgIGludCBuX3N0cmluZzsKICAgIGludCAqIG5idmFsOyAvKiBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYWNjZXB0ZWQgdmFsdWVzIElOL09VVCAqLwogICAgaW50IG5fbmJ2YWw7CiAgICBpbnQgKiBuYm5lZzsgLyogcmV0dXJuIG51bWJlciBvZiBuZWdhdGl2ZSB0cmFuc2l0aW9ucyAqLwogICAgaW50IG5fbmJuZWc7CiAgICB4bWxDaGFyICoqIHZhbHVlczsgLyogcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgYWNjZXB0YWJsZSB2YWx1ZXMgKi8KICAgIGludCBuX3ZhbHVlczsKICAgIGludCAqIHRlcm1pbmFsOyAvKiByZXR1cm4gdmFsdWUgaWYgdGhpcyB3YXMgYSB0ZXJtaW5hbCBzdGF0ZSAqLwogICAgaW50IG5fdGVybWluYWw7CgogICAgZm9yIChuX2V4ZWMgPSAwO25fZXhlYyA8IGdlbl9uYl94bWxSZWdFeGVjQ3R4dFB0cjtuX2V4ZWMrKykgewogICAgZm9yIChuX3N0cmluZyA9IDA7bl9zdHJpbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHJfcHRyO25fc3RyaW5nKyspIHsKICAgIGZvciAobl9uYnZhbCA9IDA7bl9uYnZhbCA8IGdlbl9uYl9pbnRfcHRyO25fbmJ2YWwrKykgewogICAgZm9yIChuX25ibmVnID0gMDtuX25ibmVnIDwgZ2VuX25iX2ludF9wdHI7bl9uYm5lZysrKSB7CiAgICBmb3IgKG5fdmFsdWVzID0gMDtuX3ZhbHVlcyA8IGdlbl9uYl94bWxDaGFyX3B0cl9wdHI7bl92YWx1ZXMrKykgewogICAgZm9yIChuX3Rlcm1pbmFsID0gMDtuX3Rlcm1pbmFsIDwgZ2VuX25iX2ludF9wdHI7bl90ZXJtaW5hbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBleGVjID0gZ2VuX3htbFJlZ0V4ZWNDdHh0UHRyKG5fZXhlYywgMCk7CiAgICAgICAgc3RyaW5nID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX3N0cmluZywgMSk7CiAgICAgICAgbmJ2YWwgPSBnZW5faW50X3B0cihuX25idmFsLCAyKTsKICAgICAgICBuYm5lZyA9IGdlbl9pbnRfcHRyKG5fbmJuZWcsIDMpOwogICAgICAgIHZhbHVlcyA9IGdlbl94bWxDaGFyX3B0cl9wdHIobl92YWx1ZXMsIDQpOwogICAgICAgIHRlcm1pbmFsID0gZ2VuX2ludF9wdHIobl90ZXJtaW5hbCwgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWdFeGVjRXJySW5mbyhleGVjLCAoY29uc3QgeG1sQ2hhciAqKilzdHJpbmcsIG5idmFsLCBuYm5lZywgdmFsdWVzLCB0ZXJtaW5hbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFJlZ0V4ZWNDdHh0UHRyKG5fZXhlYywgZXhlYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX3N0cmluZywgKGNvbnN0IHhtbENoYXIgKiopc3RyaW5nLCAxKTsKICAgICAgICBkZXNfaW50X3B0cihuX25idmFsLCBuYnZhbCwgMik7CiAgICAgICAgZGVzX2ludF9wdHIobl9uYm5lZywgbmJuZWcsIDMpOwogICAgICAgIGRlc194bWxDaGFyX3B0cl9wdHIobl92YWx1ZXMsIHZhbHVlcywgNCk7CiAgICAgICAgZGVzX2ludF9wdHIobl90ZXJtaW5hbCwgdGVybWluYWwsIDUpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVnRXhlY0VyckluZm8iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZXhlYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHJpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmJ2YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmJuZWcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3Rlcm1pbmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVnRXhlY05leHRWYWx1ZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUmVnRXhlY0N0eHRQdHIgZXhlYzsgLyogYSByZWdleHAgZXhlY3V0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2V4ZWM7CiAgICBpbnQgKiBuYnZhbDsgLyogcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGFjY2VwdGVkIHZhbHVlcyBJTi9PVVQgKi8KICAgIGludCBuX25idmFsOwogICAgaW50ICogbmJuZWc7IC8qIHJldHVybiBudW1iZXIgb2YgbmVnYXRpdmUgdHJhbnNpdGlvbnMgKi8KICAgIGludCBuX25ibmVnOwogICAgeG1sQ2hhciAqKiB2YWx1ZXM7IC8qIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIGFjY2VwdGFibGUgdmFsdWVzICovCiAgICBpbnQgbl92YWx1ZXM7CiAgICBpbnQgKiB0ZXJtaW5hbDsgLyogcmV0dXJuIHZhbHVlIGlmIHRoaXMgd2FzIGEgdGVybWluYWwgc3RhdGUgKi8KICAgIGludCBuX3Rlcm1pbmFsOwoKICAgIGZvciAobl9leGVjID0gMDtuX2V4ZWMgPCBnZW5fbmJfeG1sUmVnRXhlY0N0eHRQdHI7bl9leGVjKyspIHsKICAgIGZvciAobl9uYnZhbCA9IDA7bl9uYnZhbCA8IGdlbl9uYl9pbnRfcHRyO25fbmJ2YWwrKykgewogICAgZm9yIChuX25ibmVnID0gMDtuX25ibmVnIDwgZ2VuX25iX2ludF9wdHI7bl9uYm5lZysrKSB7CiAgICBmb3IgKG5fdmFsdWVzID0gMDtuX3ZhbHVlcyA8IGdlbl9uYl94bWxDaGFyX3B0cl9wdHI7bl92YWx1ZXMrKykgewogICAgZm9yIChuX3Rlcm1pbmFsID0gMDtuX3Rlcm1pbmFsIDwgZ2VuX25iX2ludF9wdHI7bl90ZXJtaW5hbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBleGVjID0gZ2VuX3htbFJlZ0V4ZWNDdHh0UHRyKG5fZXhlYywgMCk7CiAgICAgICAgbmJ2YWwgPSBnZW5faW50X3B0cihuX25idmFsLCAxKTsKICAgICAgICBuYm5lZyA9IGdlbl9pbnRfcHRyKG5fbmJuZWcsIDIpOwogICAgICAgIHZhbHVlcyA9IGdlbl94bWxDaGFyX3B0cl9wdHIobl92YWx1ZXMsIDMpOwogICAgICAgIHRlcm1pbmFsID0gZ2VuX2ludF9wdHIobl90ZXJtaW5hbCwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWdFeGVjTmV4dFZhbHVlcyhleGVjLCBuYnZhbCwgbmJuZWcsIHZhbHVlcywgdGVybWluYWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxSZWdFeGVjQ3R4dFB0cihuX2V4ZWMsIGV4ZWMsIDApOwogICAgICAgIGRlc19pbnRfcHRyKG5fbmJ2YWwsIG5idmFsLCAxKTsKICAgICAgICBkZXNfaW50X3B0cihuX25ibmVnLCBuYm5lZywgMik7CiAgICAgICAgZGVzX3htbENoYXJfcHRyX3B0cihuX3ZhbHVlcywgdmFsdWVzLCAzKTsKICAgICAgICBkZXNfaW50X3B0cihuX3Rlcm1pbmFsLCB0ZXJtaW5hbCwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWdFeGVjTmV4dFZhbHVlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leGVjKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25idmFsKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25ibmVnKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90ZXJtaW5hbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlZ0V4ZWNQdXNoU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVHRVhQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFJlZ0V4ZWNDdHh0UHRyIGV4ZWM7IC8qIGEgcmVnZXhwIGV4ZWN1dGlvbiBjb250ZXh0IG9yIE5VTEwgdG8gaW5kaWNhdGUgdGhlIGVuZCAqLwogICAgaW50IG5fZXhlYzsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogYSBzdHJpbmcgdG9rZW4gaW5wdXQgKi8KICAgIGludCBuX3ZhbHVlOwogICAgdm9pZCAqIGRhdGE7IC8qIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgdG9rZW4gdG8gcmV1c2UgaW4gY2FsbGJhY2tzICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9leGVjID0gMDtuX2V4ZWMgPCBnZW5fbmJfeG1sUmVnRXhlY0N0eHRQdHI7bl9leGVjKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGV4ZWMgPSBnZW5feG1sUmVnRXhlY0N0eHRQdHIobl9leGVjLCAwKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAxKTsKICAgICAgICBkYXRhID0gZ2VuX3VzZXJkYXRhKG5fZGF0YSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWdFeGVjUHVzaFN0cmluZyhleGVjLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCBkYXRhKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUmVnRXhlY0N0eHRQdHIobl9leGVjLCBleGVjLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMSk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fZGF0YSwgZGF0YSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWdFeGVjUHVzaFN0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leGVjKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWdFeGVjUHVzaFN0cmluZzIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUmVnRXhlY0N0eHRQdHIgZXhlYzsgLyogYSByZWdleHAgZXhlY3V0aW9uIGNvbnRleHQgb3IgTlVMTCB0byBpbmRpY2F0ZSB0aGUgZW5kICovCiAgICBpbnQgbl9leGVjOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgZmlyc3Qgc3RyaW5nIHRva2VuIGlucHV0ICovCiAgICBpbnQgbl92YWx1ZTsKICAgIHhtbENoYXIgKiB2YWx1ZTI7IC8qIHRoZSBzZWNvbmQgc3RyaW5nIHRva2VuIGlucHV0ICovCiAgICBpbnQgbl92YWx1ZTI7CiAgICB2b2lkICogZGF0YTsgLyogZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSB0b2tlbiB0byByZXVzZSBpbiBjYWxsYmFja3MgKi8KICAgIGludCBuX2RhdGE7CgogICAgZm9yIChuX2V4ZWMgPSAwO25fZXhlYyA8IGdlbl9uYl94bWxSZWdFeGVjQ3R4dFB0cjtuX2V4ZWMrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgZm9yIChuX3ZhbHVlMiA9IDA7bl92YWx1ZTIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZTIrKykgewogICAgZm9yIChuX2RhdGEgPSAwO25fZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX2RhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZXhlYyA9IGdlbl94bWxSZWdFeGVjQ3R4dFB0cihuX2V4ZWMsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOwogICAgICAgIHZhbHVlMiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlMiwgMik7CiAgICAgICAgZGF0YSA9IGdlbl91c2VyZGF0YShuX2RhdGEsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVnRXhlY1B1c2hTdHJpbmcyKGV4ZWMsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUyLCBkYXRhKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUmVnRXhlY0N0eHRQdHIobl9leGVjLCBleGVjLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUyLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlMiwgMik7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fZGF0YSwgZGF0YSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWdFeGVjUHVzaFN0cmluZzIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZXhlYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZTIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1JFR0VYUF9FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxSZWdleHBQdHIgMQpzdGF0aWMgeG1sUmVnZXhwUHRyIGdlbl94bWxSZWdleHBQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFJlZ2V4cFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUmVnZXhwUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWdOZXdFeGVjQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWdleHBDb21waWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlZ2V4cEV4ZWModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUmVnZXhwUHRyIGNvbXA7IC8qIHRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gKi8KICAgIGludCBuX2NvbXA7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIHZhbHVlIHRvIGNoZWNrIGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fY29tcCA9IDA7bl9jb21wIDwgZ2VuX25iX3htbFJlZ2V4cFB0cjtuX2NvbXArKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29tcCA9IGdlbl94bWxSZWdleHBQdHIobl9jb21wLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWdleHBFeGVjKGNvbXAsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFJlZ2V4cFB0cihuX2NvbXAsIGNvbXAsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWdleHBFeGVjIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbXApOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlZ2V4cElzRGV0ZXJtaW5pc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUmVnZXhwUHRyIGNvbXA7IC8qIHRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gKi8KICAgIGludCBuX2NvbXA7CgogICAgZm9yIChuX2NvbXAgPSAwO25fY29tcCA8IGdlbl9uYl94bWxSZWdleHBQdHI7bl9jb21wKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbXAgPSBnZW5feG1sUmVnZXhwUHRyKG5fY29tcCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWdleHBJc0RldGVybWluaXN0KGNvbXApOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxSZWdleHBQdHIobl9jb21wLCBjb21wLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlZ2V4cElzRGV0ZXJtaW5pc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlZ2V4cFByaW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVHRVhQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0cHV0OyAvKiB0aGUgZmlsZSBmb3IgdGhlIG91dHB1dCBkZWJ1ZyAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sUmVnZXhwUHRyIHJlZ2V4cDsgLyogdGhlIGNvbXBpbGVkIHJlZ2V4cCAqLwogICAgaW50IG5fcmVnZXhwOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9yZWdleHAgPSAwO25fcmVnZXhwIDwgZ2VuX25iX3htbFJlZ2V4cFB0cjtuX3JlZ2V4cCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIHJlZ2V4cCA9IGdlbl94bWxSZWdleHBQdHIobl9yZWdleHAsIDEpOwoKICAgICAgICB4bWxSZWdleHBQcmludChvdXRwdXQsIHJlZ2V4cCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sUmVnZXhwUHRyKG5fcmVnZXhwLCByZWdleHAsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVnZXhwUHJpbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlZ2V4cCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1scmVnZXhwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB4bWxyZWdleHAgOiA3IG9mIDExIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWdFeGVjRXJySW5mbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWdFeGVjTmV4dFZhbHVlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWdFeGVjUHVzaFN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWdFeGVjUHVzaFN0cmluZzIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnTmV3RXhlY0N0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnZXhwQ29tcGlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWdleHBFeGVjKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlZ2V4cElzRGV0ZXJtaW5pc3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnZXhwUHJpbnQoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbHJlZ2V4cDogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CiNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNhdmVDdHh0UHRyIDEKc3RhdGljIHhtbFNhdmVDdHh0UHRyIGdlbl94bWxTYXZlQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2F2ZUN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNhdmVDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlQ2xvc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2F2ZUN0eHRQdHIgY3R4dDsgLyogYSBkb2N1bWVudCBzYXZpbmcgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNhdmVDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTYXZlQ2xvc2UoY3R4dCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlQ2xvc2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNhdmVEb2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGxvbmcgcmV0X3ZhbDsKICAgIHhtbFNhdmVDdHh0UHRyIGN0eHQ7IC8qIGEgZG9jdW1lbnQgc2F2aW5nIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTYXZlQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2F2ZUN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNhdmVEb2MoY3R4dCwgZG9jKTsKICAgICAgICBkZXNyZXRfbG9uZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNhdmVEb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlRmx1c2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2F2ZUN0eHRQdHIgY3R4dDsgLyogYSBkb2N1bWVudCBzYXZpbmcgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNhdmVDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTYXZlRmx1c2goY3R4dCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlRmx1c2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNhdmVTZXRBdHRyRXNjYXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNhdmVTZXRFc2NhcGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2F2ZVRvRmQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2F2ZVRvRmlsZW5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2F2ZVRyZWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGxvbmcgcmV0X3ZhbDsKICAgIHhtbFNhdmVDdHh0UHRyIGN0eHQ7IC8qIGEgZG9jdW1lbnQgc2F2aW5nIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgZG9jdW1lbnQgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTYXZlQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTYXZlVHJlZShjdHh0LCBub2RlKTsKICAgICAgICBkZXNyZXRfbG9uZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNhdmVUcmVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sc2F2ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sc2F2ZSA6IDQgb2YgOSBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZUNsb3NlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNhdmVEb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZUZsdXNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNhdmVTZXRBdHRyRXNjYXBlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNhdmVTZXRFc2NhcGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZVRvRmQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZVRvRmlsZW5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZVRyZWUoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbHNhdmU6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hUHRyIDEKc3RhdGljIHhtbFNjaGVtYVB0ciBnZW5feG1sU2NoZW1hUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxTY2hlbWFQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hRHVtcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0cHV0OyAvKiB0aGUgZmlsZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbFNjaGVtYVB0ciBzY2hlbWE7IC8qIGEgc2NoZW1hIHN0cnVjdHVyZSAqLwogICAgaW50IG5fc2NoZW1hOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9zY2hlbWEgPSAwO25fc2NoZW1hIDwgZ2VuX25iX3htbFNjaGVtYVB0cjtuX3NjaGVtYSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIHNjaGVtYSA9IGdlbl94bWxTY2hlbWFQdHIobl9zY2hlbWEsIDEpOwoKICAgICAgICB4bWxTY2hlbWFEdW1wKG91dHB1dCwgc2NoZW1hKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxTY2hlbWFQdHIobl9zY2hlbWEsIHNjaGVtYSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFEdW1wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zY2hlbWEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVBhcnNlckN0eHRQdHIgMQpzdGF0aWMgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBnZW5feG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuY19wdHIgMQpzdGF0aWMgeG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmMgKiBnZW5feG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIgMQpzdGF0aWMgeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuYyAqIGdlbl94bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmMgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hR2V0UGFyc2VyRXJyb3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGEgWE1sLVNjaGVtYSBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jICogZXJyOyAvKiB0aGUgZXJyb3IgY2FsbGJhY2sgcmVzdWx0ICovCiAgICBpbnQgbl9lcnI7CiAgICB4bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jICogd2FybjsgLyogdGhlIHdhcm5pbmcgY2FsbGJhY2sgcmVzdWx0ICovCiAgICBpbnQgbl93YXJuOwogICAgdm9pZCAqKiBjdHg7IC8qIGNvbnRleHR1YWwgZGF0YSBmb3IgdGhlIGNhbGxiYWNrcyByZXN1bHQgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNjaGVtYVBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9lcnIgPSAwO25fZXJyIDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jX3B0cjtuX2VycisrKSB7CiAgICBmb3IgKG5fd2FybiA9IDA7bl93YXJuIDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyO25fd2FybisrKSB7CiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cl9wdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTY2hlbWFQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZXJyID0gZ2VuX3htbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jX3B0cihuX2VyciwgMSk7CiAgICAgICAgd2FybiA9IGdlbl94bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cihuX3dhcm4sIDIpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cl9wdHIobl9jdHgsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hR2V0UGFyc2VyRXJyb3JzKGN0eHQsIGVyciwgd2FybiwgY3R4KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuY19wdHIobl9lcnIsIGVyciwgMSk7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyKG5fd2Fybiwgd2FybiwgMik7CiAgICAgICAgZGVzX3ZvaWRfcHRyX3B0cihuX2N0eCwgY3R4LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYUdldFBhcnNlckVycm9ycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Vycik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93YXJuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hVmFsaWRDdHh0UHRyIDEKc3RhdGljIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBnZW5feG1sU2NoZW1hVmFsaWRDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxTY2hlbWFWYWxpZEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hR2V0VmFsaWRFcnJvcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0OyAvKiBhIFhNTC1TY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmMgKiBlcnI7IC8qIHRoZSBlcnJvciBmdW5jdGlvbiByZXN1bHQgKi8KICAgIGludCBuX2VycjsKICAgIHhtbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmMgKiB3YXJuOyAvKiB0aGUgd2FybmluZyBmdW5jdGlvbiByZXN1bHQgKi8KICAgIGludCBuX3dhcm47CiAgICB2b2lkICoqIGN0eDsgLyogdGhlIGZ1bmN0aW9ucyBjb250ZXh0IHJlc3VsdCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZXJyID0gMDtuX2VyciA8IGdlbl9uYl94bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuY19wdHI7bl9lcnIrKykgewogICAgZm9yIChuX3dhcm4gPSAwO25fd2FybiA8IGdlbl9uYl94bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cjtuX3dhcm4rKykgewogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHJfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZXJyID0gZ2VuX3htbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jX3B0cihuX2VyciwgMSk7CiAgICAgICAgd2FybiA9IGdlbl94bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cihuX3dhcm4sIDIpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cl9wdHIobl9jdHgsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hR2V0VmFsaWRFcnJvcnMoY3R4dCwgZXJyLCB3YXJuLCBjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmNfcHRyKG5fZXJyLCBlcnIsIDEpOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cihuX3dhcm4sIHdhcm4sIDIpOwogICAgICAgIGRlc192b2lkX3B0cl9wdHIobl9jdHgsIGN0eCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFHZXRWYWxpZEVycm9ycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Vycik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93YXJuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYU5ld0RvY1BhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIHByZXBhcnNlZCBkb2N1bWVudCB0cmVlICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hTmV3RG9jUGFyc2VyQ3R4dChkb2MpOwogICAgICAgIGRlc3JldF94bWxTY2hlbWFQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hTmV3RG9jUGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFOZXdNZW1QYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSBjb250YWluaW5nIHRoZSBzY2hlbWFzICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwoKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWZmZXIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIDApOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFOZXdNZW1QYXJzZXJDdHh0KChjb25zdCBjaGFyICopYnVmZmVyLCBzaXplKTsKICAgICAgICBkZXNyZXRfeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgMCk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hTmV3TWVtUGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYU5ld1BhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICBjaGFyICogVVJMOyAvKiB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSAqLwogICAgaW50IG5fVVJMOwoKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fVVJMKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX1VSTCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFOZXdQYXJzZXJDdHh0KChjb25zdCBjaGFyICopVVJMKTsKICAgICAgICBkZXNyZXRfeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fVVJMLCAoY29uc3QgY2hhciAqKVVSTCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFOZXdQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYU5ld1ZhbGlkQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFQYXJzZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFTZXRQYXJzZXJFcnJvcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hU2V0VmFsaWRFcnJvcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hU2V0VmFsaWRPcHRpb25zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsgLyogYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgeG1sU2NoZW1hVmFsaWRPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTY2hlbWFWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfaW50O25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG9wdGlvbnMgPSBnZW5faW50KG5fb3B0aW9ucywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFTZXRWYWxpZE9wdGlvbnMoY3R4dCwgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVNldFZhbGlkT3B0aW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFWYWxpZEN0eHRHZXRPcHRpb25zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsgLyogYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsaWRDdHh0R2V0T3B0aW9ucyhjdHh0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZEN0eHRHZXRPcHRpb25zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFWYWxpZGF0ZURvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIGEgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgcGFyc2VkIGRvY3VtZW50IHRyZWUgKi8KICAgIGludCBuX2RvYzsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFWYWxpZGF0ZURvYyhjdHh0LCBkb2MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVEb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFWYWxpZGF0ZU9uZUVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0OyAvKiBhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgbm9kZSAqLwogICAgaW50IG5fZWxlbTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsaWRhdGVPbmVFbGVtZW50KGN0eHQsIGVsZW0pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVPbmVFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbGlkYXRlU3RyZWFtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsgLyogYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgaW5wdXQ7IC8qIHRoZSBpbnB1dCB0byB1c2UgZm9yIHJlYWRpbmcgdGhlIGRhdGEgKi8KICAgIGludCBuX2lucHV0OwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogYW4gb3B0aW9uYWwgZW5jb2RpbmcgaW5mb3JtYXRpb24gKi8KICAgIGludCBuX2VuYzsKICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiBhIFNBWCBoYW5kbGVyIGZvciB0aGUgcmVzdWx0aW5nIGV2ZW50cyAqLwogICAgaW50IG5fc2F4OwogICAgdm9pZCAqIHVzZXJfZGF0YTsgLyogdGhlIGNvbnRleHQgdG8gcHJvdmlkZSB0byB0aGUgU0FYIGhhbmRsZXIuICovCiAgICBpbnQgbl91c2VyX2RhdGE7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTY2hlbWFWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9pbnB1dCA9IDA7bl9pbnB1dCA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cjtuX2lucHV0KyspIHsKICAgIGZvciAobl9lbmMgPSAwO25fZW5jIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZztuX2VuYysrKSB7CiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl91c2VyX2RhdGEgPSAwO25fdXNlcl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlcl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgaW5wdXQgPSBnZW5feG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbnB1dCwgMSk7CiAgICAgICAgZW5jID0gZ2VuX3htbENoYXJFbmNvZGluZyhuX2VuYywgMik7CiAgICAgICAgc2F4ID0gZ2VuX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIDMpOwogICAgICAgIHVzZXJfZGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJfZGF0YSwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFWYWxpZGF0ZVN0cmVhbShjdHh0LCBpbnB1dCwgZW5jLCBzYXgsIHVzZXJfZGF0YSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2lucHV0LCBpbnB1dCwgMSk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAyKTsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAzKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyX2RhdGEsIHVzZXJfZGF0YSwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZGF0ZVN0cmVhbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2lucHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxzY2hlbWFzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB4bWxzY2hlbWFzIDogMTEgb2YgMTggZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUR1bXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hR2V0UGFyc2VyRXJyb3JzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUdldFZhbGlkRXJyb3JzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYU5ld0RvY1BhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hTmV3TWVtUGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFOZXdQYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYU5ld1ZhbGlkQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFQYXJzZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFTZXRQYXJzZXJFcnJvcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hU2V0VmFsaWRFcnJvcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hU2V0VmFsaWRPcHRpb25zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbGlkQ3R4dEdldE9wdGlvbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsaWRhdGVEb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsaWRhdGVPbmVFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbGlkYXRlU3RyZWFtKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4bWxzY2hlbWFzOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYUZhY2V0UHRyIDEKc3RhdGljIHhtbFNjaGVtYUZhY2V0UHRyIGdlbl94bWxTY2hlbWFGYWNldFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hRmFjZXRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYUZhY2V0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVR5cGVQdHIgMQpzdGF0aWMgeG1sU2NoZW1hVHlwZVB0ciBnZW5feG1sU2NoZW1hVHlwZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hVHlwZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hVHlwZVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hQ2hlY2tGYWNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQ7IC8qIHRoZSBmYWNldCAqLwogICAgaW50IG5fZmFjZXQ7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGVEZWNsOyAvKiB0aGUgc2NoZW1hIHR5cGUgZGVmaW5pdGlvbiAqLwogICAgaW50IG5fdHlwZURlY2w7CiAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIHRoZSBzY2hlbWEgcGFyc2VyIGNvbnRleHQgb3IgTlVMTCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBuYW1lIG9mIHRoZSB0eXBlICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9mYWNldCA9IDA7bl9mYWNldCA8IGdlbl9uYl94bWxTY2hlbWFGYWNldFB0cjtuX2ZhY2V0KyspIHsKICAgIGZvciAobl90eXBlRGVjbCA9IDA7bl90eXBlRGVjbCA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZURlY2wrKykgewogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTY2hlbWFQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAwKTsKICAgICAgICB0eXBlRGVjbCA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZURlY2wsIDEpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDIpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYUNoZWNrRmFjZXQoZmFjZXQsIHR5cGVEZWNsLCBjdHh0LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCBmYWNldCwgMCk7CiAgICAgICAgZGVzX3htbFNjaGVtYVR5cGVQdHIobl90eXBlRGVjbCwgdHlwZURlY2wsIDEpOwogICAgICAgIGRlc194bWxTY2hlbWFQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYUNoZWNrRmFjZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmFjZXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZURlY2wpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hQ2xlYW51cFR5cGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICB4bWxTY2hlbWFDbGVhbnVwVHlwZXMoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFDbGVhbnVwVHlwZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFDb2xsYXBzZVN0cmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiBhIHZhbHVlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYUNvbGxhcHNlU3RyaW5nKChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hQ29sbGFwc2VTdHJpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVZhbFB0ciAxCnN0YXRpYyB4bWxTY2hlbWFWYWxQdHIgZ2VuX3htbFNjaGVtYVZhbFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hVmFsUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTY2hlbWFWYWxQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUNvbXBhcmVWYWx1ZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVZhbFB0ciB4OyAvKiBhIGZpcnN0IHZhbHVlICovCiAgICBpbnQgbl94OwogICAgeG1sU2NoZW1hVmFsUHRyIHk7IC8qIGEgc2Vjb25kIHZhbHVlICovCiAgICBpbnQgbl95OwoKICAgIGZvciAobl94ID0gMDtuX3ggPCBnZW5fbmJfeG1sU2NoZW1hVmFsUHRyO25feCsrKSB7CiAgICBmb3IgKG5feSA9IDA7bl95IDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3krKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgeCA9IGdlbl94bWxTY2hlbWFWYWxQdHIobl94LCAwKTsKICAgICAgICB5ID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3ksIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hQ29tcGFyZVZhbHVlcyh4LCB5KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5feCwgeCwgMCk7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbFB0cihuX3ksIHksIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hQ29tcGFyZVZhbHVlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl94KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3kpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFDb21wYXJlVmFsdWVzV2h0c3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVZhbFB0ciB4OyAvKiBhIGZpcnN0IHZhbHVlICovCiAgICBpbnQgbl94OwogICAgeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZSB4d3M7IC8qIHRoZSB3aGl0ZXNwYWNlIHZhbHVlIG9mIHggKi8KICAgIGludCBuX3h3czsKICAgIHhtbFNjaGVtYVZhbFB0ciB5OyAvKiBhIHNlY29uZCB2YWx1ZSAqLwogICAgaW50IG5feTsKICAgIHhtbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUgeXdzOyAvKiB0aGUgd2hpdGVzcGFjZSB2YWx1ZSBvZiB5ICovCiAgICBpbnQgbl95d3M7CgogICAgZm9yIChuX3ggPSAwO25feCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl94KyspIHsKICAgIGZvciAobl94d3MgPSAwO25feHdzIDwgZ2VuX25iX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGU7bl94d3MrKykgewogICAgZm9yIChuX3kgPSAwO25feSA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl95KyspIHsKICAgIGZvciAobl95d3MgPSAwO25feXdzIDwgZ2VuX25iX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGU7bl95d3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgeCA9IGdlbl94bWxTY2hlbWFWYWxQdHIobl94LCAwKTsKICAgICAgICB4d3MgPSBnZW5feG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZShuX3h3cywgMSk7CiAgICAgICAgeSA9IGdlbl94bWxTY2hlbWFWYWxQdHIobl95LCAyKTsKICAgICAgICB5d3MgPSBnZW5feG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZShuX3l3cywgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFDb21wYXJlVmFsdWVzV2h0c3AoeCwgeHdzLCB5LCB5d3MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHIobl94LCB4LCAwKTsKICAgICAgICBkZXNfeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZShuX3h3cywgeHdzLCAxKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5feSwgeSwgMik7CiAgICAgICAgZGVzX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUobl95d3MsIHl3cywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFDb21wYXJlVmFsdWVzV2h0c3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5feCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl94d3MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5feSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl95d3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFDb3B5VmFsdWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hR2V0QnVpbHRJbkxpc3RTaW1wbGVUeXBlSXRlbVR5cGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHJldF92YWw7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBidWlsdC1pbiBzaW1wbGUgdHlwZS4gKi8KICAgIGludCBuX3R5cGU7CgogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0eXBlID0gZ2VuX3htbFNjaGVtYVR5cGVQdHIobl90eXBlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYUdldEJ1aWx0SW5MaXN0U2ltcGxlVHlwZUl0ZW1UeXBlKHR5cGUpOwogICAgICAgIGRlc3JldF94bWxTY2hlbWFUeXBlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIHR5cGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hR2V0QnVpbHRJbkxpc3RTaW1wbGVUeXBlSXRlbVR5cGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUdldEJ1aWx0SW5UeXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgeG1sU2NoZW1hVHlwZVB0ciByZXRfdmFsOwogICAgeG1sU2NoZW1hVmFsVHlwZSB0eXBlOyAvKiB0aGUgdHlwZSBvZiB0aGUgYnVpbHQgaW4gdHlwZSAqLwogICAgaW50IG5fdHlwZTsKCiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX3htbFNjaGVtYVZhbFR5cGU7bl90eXBlKyspIHsKICAgICAgICB0eXBlID0gZ2VuX3htbFNjaGVtYVZhbFR5cGUobl90eXBlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYUdldEJ1aWx0SW5UeXBlKHR5cGUpOwogICAgICAgIGRlc3JldF94bWxTY2hlbWFUeXBlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsVHlwZShuX3R5cGUsIHR5cGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUdldENhbm9uVmFsdWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVZhbFB0ciB2YWw7IC8qIHRoZSBwcmVjb21wdXRlZCB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwogICAgeG1sQ2hhciAqKiByZXRWYWx1ZTsgLyogdGhlIHJldHVybmVkIHZhbHVlICovCiAgICBpbnQgbl9yZXRWYWx1ZTsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl92YWwrKykgewogICAgZm9yIChuX3JldFZhbHVlID0gMDtuX3JldFZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyX3B0cjtuX3JldFZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxTY2hlbWFWYWxQdHIobl92YWwsIDApOwogICAgICAgIHJldFZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX3JldFZhbHVlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYUdldENhbm9uVmFsdWUodmFsLCAoY29uc3QgeG1sQ2hhciAqKilyZXRWYWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fcmV0VmFsdWUsIChjb25zdCB4bWxDaGFyICoqKXJldFZhbHVlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYUdldENhbm9uVmFsdWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JldFZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hR2V0RmFjZXRWYWx1ZUFzVUxvbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB1bnNpZ25lZCBsb25nIHJldF92YWw7CiAgICB4bWxTY2hlbWFGYWNldFB0ciBmYWNldDsgLyogYW4gc2NoZW1hcyB0eXBlIGZhY2V0ICovCiAgICBpbnQgbl9mYWNldDsKCiAgICBmb3IgKG5fZmFjZXQgPSAwO25fZmFjZXQgPCBnZW5fbmJfeG1sU2NoZW1hRmFjZXRQdHI7bl9mYWNldCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYUdldEZhY2V0VmFsdWVBc1VMb25nKGZhY2V0KTsKICAgICAgICBkZXNyZXRfdW5zaWduZWRfbG9uZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIGZhY2V0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYUdldEZhY2V0VmFsdWVBc1VMb25nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZhY2V0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hR2V0UHJlZGVmaW5lZFR5cGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHR5cGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBuczsgLyogdGhlIFVSSSBvZiB0aGUgbmFtZXNwYWNlIHVzdWFsbHkgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAqLwogICAgaW50IG5fbnM7CgogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDApOwogICAgICAgIG5zID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbnMsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hR2V0UHJlZGVmaW5lZFR5cGUoKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5zKTsKICAgICAgICBkZXNyZXRfeG1sU2NoZW1hVHlwZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9ucywgKGNvbnN0IHhtbENoYXIgKilucywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFHZXRQcmVkZWZpbmVkVHlwZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hR2V0VmFsVHlwZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFNjaGVtYVZhbFR5cGUgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVZhbFB0ciB2YWw7IC8qIGEgc2NoZW1hcyB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5feG1sU2NoZW1hVmFsUHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYUdldFZhbFR5cGUodmFsKTsKICAgICAgICBkZXNyZXRfeG1sU2NoZW1hVmFsVHlwZShyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYUdldFZhbFR5cGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hSW5pdFR5cGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQoKCiAgICAgICAgeG1sU2NoZW1hSW5pdFR5cGVzKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUlzQnVpbHRJblR5cGVGYWNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hVHlwZVB0ciB0eXBlOyAvKiB0aGUgYnVpbHQtaW4gdHlwZSAqLwogICAgaW50IG5fdHlwZTsKICAgIGludCBmYWNldFR5cGU7IC8qIHRoZSBmYWNldCB0eXBlICovCiAgICBpbnQgbl9mYWNldFR5cGU7CgogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZSsrKSB7CiAgICBmb3IgKG5fZmFjZXRUeXBlID0gMDtuX2ZhY2V0VHlwZSA8IGdlbl9uYl9pbnQ7bl9mYWNldFR5cGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdHlwZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgMCk7CiAgICAgICAgZmFjZXRUeXBlID0gZ2VuX2ludChuX2ZhY2V0VHlwZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFJc0J1aWx0SW5UeXBlRmFjZXQodHlwZSwgZmFjZXRUeXBlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIHR5cGUsIDApOwogICAgICAgIGRlc19pbnQobl9mYWNldFR5cGUsIGZhY2V0VHlwZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFJc0J1aWx0SW5UeXBlRmFjZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldFR5cGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFOZXdGYWNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFOZXdOT1RBVElPTlZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYU5ld1N0cmluZ1ZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hVmFsUHRyX3B0ciAxCnN0YXRpYyB4bWxTY2hlbWFWYWxQdHIgKiBnZW5feG1sU2NoZW1hVmFsUHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hVmFsUHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hVmFsUHRyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBwcmVkZWZpbmVkIHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgaW50IG5fdmFsdWU7CiAgICB4bWxTY2hlbWFWYWxQdHIgKiB2YWw7IC8qIHRoZSByZXR1cm4gY29tcHV0ZWQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgY29udGFpbmluZyB0aGUgdmFsdWUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHJfcHRyO25fdmFsKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdHlwZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CiAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cl9wdHIobl92YWwsIDIpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGUodHlwZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgdmFsLCBub2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIHR5cGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAxKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyX3B0cihuX3ZhbCwgdmFsLCAyKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlTm9Ob3JtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBwcmVkZWZpbmVkIHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgaW50IG5fdmFsdWU7CiAgICB4bWxTY2hlbWFWYWxQdHIgKiB2YWw7IC8qIHRoZSByZXR1cm4gY29tcHV0ZWQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgY29udGFpbmluZyB0aGUgdmFsdWUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHJfcHRyO25fdmFsKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdHlwZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CiAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cl9wdHIobl92YWwsIDIpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGVOb05vcm0odHlwZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgdmFsLCBub2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIHR5cGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAxKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyX3B0cihuX3ZhbCwgdmFsLCAyKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGVOb05vcm0iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbGlkYXRlRmFjZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVR5cGVQdHIgYmFzZTsgLyogdGhlIGJhc2UgdHlwZSAqLwogICAgaW50IG5fYmFzZTsKICAgIHhtbFNjaGVtYUZhY2V0UHRyIGZhY2V0OyAvKiB0aGUgZmFjZXQgdG8gY2hlY2sgKi8KICAgIGludCBuX2ZhY2V0OwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgbGV4aWNhbCByZXByIG9mIHRoZSB2YWx1ZSB0byB2YWxpZGF0ZSAqLwogICAgaW50IG5fdmFsdWU7CiAgICB4bWxTY2hlbWFWYWxQdHIgdmFsOyAvKiB0aGUgcHJlY29tcHV0ZWQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fYmFzZSA9IDA7bl9iYXNlIDwgZ2VuX25iX3htbFNjaGVtYVR5cGVQdHI7bl9iYXNlKyspIHsKICAgIGZvciAobl9mYWNldCA9IDA7bl9mYWNldCA8IGdlbl9uYl94bWxTY2hlbWFGYWNldFB0cjtuX2ZhY2V0KyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBiYXNlID0gZ2VuX3htbFNjaGVtYVR5cGVQdHIobl9iYXNlLCAwKTsKICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKICAgICAgICB2YWwgPSBnZW5feG1sU2NoZW1hVmFsUHRyKG5fdmFsLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlRmFjZXQoYmFzZSwgZmFjZXQsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIHZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYVR5cGVQdHIobl9iYXNlLCBiYXNlLCAwKTsKICAgICAgICBkZXNfeG1sU2NoZW1hRmFjZXRQdHIobl9mYWNldCwgZmFjZXQsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAyKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5fdmFsLCB2YWwsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVGYWNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9iYXNlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZhY2V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbGlkYXRlRmFjZXRXaHRzcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQ7IC8qIHRoZSBmYWNldCB0byBjaGVjayAqLwogICAgaW50IG5fZmFjZXQ7CiAgICB4bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlIGZ3czsgLyogdGhlIHdoaXRlc3BhY2UgdHlwZSBvZiB0aGUgZmFjZXQncyB2YWx1ZSAqLwogICAgaW50IG5fZndzOwogICAgeG1sU2NoZW1hVmFsVHlwZSB2YWxUeXBlOyAvKiB0aGUgYnVpbHQtaW4gdHlwZSBvZiB0aGUgdmFsdWUgKi8KICAgIGludCBuX3ZhbFR5cGU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBsZXhpY2FsIChvciBub3JtYWxpemVkIGZvciBwYXR0ZXJuKSByZXByIG9mIHRoZSB2YWx1ZSB0byB2YWxpZGF0ZSAqLwogICAgaW50IG5fdmFsdWU7CiAgICB4bWxTY2hlbWFWYWxQdHIgdmFsOyAvKiB0aGUgcHJlY29tcHV0ZWQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKICAgIHhtbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUgd3M7IC8qIHRoZSB3aGl0ZXNwYWNlIHR5cGUgb2YgdGhlIHZhbHVlICovCiAgICBpbnQgbl93czsKCiAgICBmb3IgKG5fZmFjZXQgPSAwO25fZmFjZXQgPCBnZW5fbmJfeG1sU2NoZW1hRmFjZXRQdHI7bl9mYWNldCsrKSB7CiAgICBmb3IgKG5fZndzID0gMDtuX2Z3cyA8IGdlbl9uYl94bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlO25fZndzKyspIHsKICAgIGZvciAobl92YWxUeXBlID0gMDtuX3ZhbFR5cGUgPCBnZW5fbmJfeG1sU2NoZW1hVmFsVHlwZTtuX3ZhbFR5cGUrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sU2NoZW1hVmFsUHRyO25fdmFsKyspIHsKICAgIGZvciAobl93cyA9IDA7bl93cyA8IGdlbl9uYl94bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlO25fd3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmFjZXQgPSBnZW5feG1sU2NoZW1hRmFjZXRQdHIobl9mYWNldCwgMCk7CiAgICAgICAgZndzID0gZ2VuX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUobl9md3MsIDEpOwogICAgICAgIHZhbFR5cGUgPSBnZW5feG1sU2NoZW1hVmFsVHlwZShuX3ZhbFR5cGUsIDIpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDMpOwogICAgICAgIHZhbCA9IGdlbl94bWxTY2hlbWFWYWxQdHIobl92YWwsIDQpOwogICAgICAgIHdzID0gZ2VuX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUobl93cywgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0V2h0c3AoZmFjZXQsIGZ3cywgdmFsVHlwZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgdmFsLCB3cyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIGZhY2V0LCAwKTsKICAgICAgICBkZXNfeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZShuX2Z3cywgZndzLCAxKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsVHlwZShuX3ZhbFR5cGUsIHZhbFR5cGUsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAzKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5fdmFsLCB2YWwsIDQpOwogICAgICAgIGRlc194bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlKG5fd3MsIHdzLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbGlkYXRlRmFjZXRXaHRzcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9md3MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsVHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFWYWxpZGF0ZUxlbmd0aEZhY2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBidWlsdC1pbiB0eXBlICovCiAgICBpbnQgbl90eXBlOwogICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQ7IC8qIHRoZSBmYWNldCB0byBjaGVjayAqLwogICAgaW50IG5fZmFjZXQ7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBsZXhpY2FsIHJlcHIuIG9mIHRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQgKi8KICAgIGludCBuX3ZhbHVlOwogICAgeG1sU2NoZW1hVmFsUHRyIHZhbDsgLyogdGhlIHByZWNvbXB1dGVkIHZhbHVlICovCiAgICBpbnQgbl92YWw7CiAgICB1bnNpZ25lZCBsb25nICogbGVuZ3RoOyAvKiB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgdmFsdWUgKi8KICAgIGludCBuX2xlbmd0aDsKCiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX3htbFNjaGVtYVR5cGVQdHI7bl90eXBlKyspIHsKICAgIGZvciAobl9mYWNldCA9IDA7bl9mYWNldCA8IGdlbl9uYl94bWxTY2hlbWFGYWNldFB0cjtuX2ZhY2V0KyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3ZhbCsrKSB7CiAgICBmb3IgKG5fbGVuZ3RoID0gMDtuX2xlbmd0aCA8IGdlbl9uYl91bnNpZ25lZF9sb25nX3B0cjtuX2xlbmd0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0eXBlID0gZ2VuX3htbFNjaGVtYVR5cGVQdHIobl90eXBlLCAwKTsKICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKICAgICAgICB2YWwgPSBnZW5feG1sU2NoZW1hVmFsUHRyKG5fdmFsLCAzKTsKICAgICAgICBsZW5ndGggPSBnZW5fdW5zaWduZWRfbG9uZ19wdHIobl9sZW5ndGgsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsaWRhdGVMZW5ndGhGYWNldCh0eXBlLCBmYWNldCwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgdmFsLCBsZW5ndGgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgdHlwZSwgMCk7CiAgICAgICAgZGVzX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIGZhY2V0LCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMik7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgdmFsLCAzKTsKICAgICAgICBkZXNfdW5zaWduZWRfbG9uZ19wdHIobl9sZW5ndGgsIGxlbmd0aCwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZGF0ZUxlbmd0aEZhY2V0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmFjZXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbmd0aCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbGlkYXRlTGVuZ3RoRmFjZXRXaHRzcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQ7IC8qIHRoZSBmYWNldCB0byBjaGVjayAqLwogICAgaW50IG5fZmFjZXQ7CiAgICB4bWxTY2hlbWFWYWxUeXBlIHZhbFR5cGU7IC8qIHRoZSBidWlsdC1pbiB0eXBlICovCiAgICBpbnQgbl92YWxUeXBlOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgbGV4aWNhbCByZXByLiBvZiB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkICovCiAgICBpbnQgbl92YWx1ZTsKICAgIHhtbFNjaGVtYVZhbFB0ciB2YWw7IC8qIHRoZSBwcmVjb21wdXRlZCB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwogICAgdW5zaWduZWQgbG9uZyAqIGxlbmd0aDsgLyogdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIHZhbHVlICovCiAgICBpbnQgbl9sZW5ndGg7CiAgICB4bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlIHdzOyAvKiB0aGUgd2hpdGVzcGFjZSB0eXBlIG9mIHRoZSB2YWx1ZSAqLwogICAgaW50IG5fd3M7CgogICAgZm9yIChuX2ZhY2V0ID0gMDtuX2ZhY2V0IDwgZ2VuX25iX3htbFNjaGVtYUZhY2V0UHRyO25fZmFjZXQrKykgewogICAgZm9yIChuX3ZhbFR5cGUgPSAwO25fdmFsVHlwZSA8IGdlbl9uYl94bWxTY2hlbWFWYWxUeXBlO25fdmFsVHlwZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl92YWwrKykgewogICAgZm9yIChuX2xlbmd0aCA9IDA7bl9sZW5ndGggPCBnZW5fbmJfdW5zaWduZWRfbG9uZ19wdHI7bl9sZW5ndGgrKykgewogICAgZm9yIChuX3dzID0gMDtuX3dzIDwgZ2VuX25iX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGU7bl93cysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAwKTsKICAgICAgICB2YWxUeXBlID0gZ2VuX3htbFNjaGVtYVZhbFR5cGUobl92YWxUeXBlLCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKICAgICAgICB2YWwgPSBnZW5feG1sU2NoZW1hVmFsUHRyKG5fdmFsLCAzKTsKICAgICAgICBsZW5ndGggPSBnZW5fdW5zaWduZWRfbG9uZ19wdHIobl9sZW5ndGgsIDQpOwogICAgICAgIHdzID0gZ2VuX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUobl93cywgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFWYWxpZGF0ZUxlbmd0aEZhY2V0V2h0c3AoZmFjZXQsIHZhbFR5cGUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIHZhbCwgbGVuZ3RoLCB3cyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIGZhY2V0LCAwKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsVHlwZShuX3ZhbFR5cGUsIHZhbFR5cGUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAyKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5fdmFsLCB2YWwsIDMpOwogICAgICAgIGRlc191bnNpZ25lZF9sb25nX3B0cihuX2xlbmd0aCwgbGVuZ3RoLCA0KTsKICAgICAgICBkZXNfeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZShuX3dzLCB3cywgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZGF0ZUxlbmd0aEZhY2V0V2h0c3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmFjZXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsVHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuZ3RoKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hVmFsaWRhdGVMaXN0U2ltcGxlVHlwZUZhY2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFGYWNldFB0ciBmYWNldDsgLyogdGhlIGZhY2V0IHRvIGNoZWNrICovCiAgICBpbnQgbl9mYWNldDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIGxleGljYWwgcmVwciBvZiB0aGUgdmFsdWUgdG8gdmFsaWRhdGUgKi8KICAgIGludCBuX3ZhbHVlOwogICAgdW5zaWduZWQgbG9uZyBhY3R1YWxMZW47IC8qIHRoZSBudW1iZXIgb2YgbGlzdCBpdGVtcyAqLwogICAgaW50IG5fYWN0dWFsTGVuOwogICAgdW5zaWduZWQgbG9uZyAqIGV4cGVjdGVkTGVuOyAvKiB0aGUgcmVzdWx0aW5nIGV4cGVjdGVkIG51bWJlciBvZiBsaXN0IGl0ZW1zICovCiAgICBpbnQgbl9leHBlY3RlZExlbjsKCiAgICBmb3IgKG5fZmFjZXQgPSAwO25fZmFjZXQgPCBnZW5fbmJfeG1sU2NoZW1hRmFjZXRQdHI7bl9mYWNldCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fYWN0dWFsTGVuID0gMDtuX2FjdHVhbExlbiA8IGdlbl9uYl91bnNpZ25lZF9sb25nO25fYWN0dWFsTGVuKyspIHsKICAgIGZvciAobl9leHBlY3RlZExlbiA9IDA7bl9leHBlY3RlZExlbiA8IGdlbl9uYl91bnNpZ25lZF9sb25nX3B0cjtuX2V4cGVjdGVkTGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZhY2V0ID0gZ2VuX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOwogICAgICAgIGFjdHVhbExlbiA9IGdlbl91bnNpZ25lZF9sb25nKG5fYWN0dWFsTGVuLCAyKTsKICAgICAgICBleHBlY3RlZExlbiA9IGdlbl91bnNpZ25lZF9sb25nX3B0cihuX2V4cGVjdGVkTGVuLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlTGlzdFNpbXBsZVR5cGVGYWNldChmYWNldCwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgYWN0dWFsTGVuLCBleHBlY3RlZExlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIGZhY2V0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMSk7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2xvbmcobl9hY3R1YWxMZW4sIGFjdHVhbExlbiwgMik7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2xvbmdfcHRyKG5fZXhwZWN0ZWRMZW4sIGV4cGVjdGVkTGVuLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbGlkYXRlTGlzdFNpbXBsZVR5cGVGYWNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hY3R1YWxMZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZXhwZWN0ZWRMZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFWYWxpZGF0ZVByZWRlZmluZWRUeXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBwcmVkZWZpbmVkIHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgaW50IG5fdmFsdWU7CiAgICB4bWxTY2hlbWFWYWxQdHIgKiB2YWw7IC8qIHRoZSByZXR1cm4gY29tcHV0ZWQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX3htbFNjaGVtYVR5cGVQdHI7bl90eXBlKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cl9wdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdHlwZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CiAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cl9wdHIobl92YWwsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsaWRhdGVQcmVkZWZpbmVkVHlwZSh0eXBlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCB2YWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgdHlwZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDEpOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHJfcHRyKG5fdmFsLCB2YWwsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVQcmVkZWZpbmVkVHlwZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVdoaXRlU3BhY2VSZXBsYWNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIGEgdmFsdWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hV2hpdGVTcGFjZVJlcGxhY2UoKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFXaGl0ZVNwYWNlUmVwbGFjZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sc2NoZW1hc3R5cGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB4bWxzY2hlbWFzdHlwZXMgOiAyMiBvZiAyOCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hQ2hlY2tGYWNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFDbGVhbnVwVHlwZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hQ29sbGFwc2VTdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hQ29tcGFyZVZhbHVlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFDb21wYXJlVmFsdWVzV2h0c3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hQ29weVZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUdldEJ1aWx0SW5MaXN0U2ltcGxlVHlwZUl0ZW1UeXBlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUdldEJ1aWx0SW5UeXBlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUdldENhbm9uVmFsdWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hR2V0RmFjZXRWYWx1ZUFzVUxvbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hR2V0UHJlZGVmaW5lZFR5cGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hR2V0VmFsVHlwZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFJbml0VHlwZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hSXNCdWlsdEluVHlwZUZhY2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYU5ld0ZhY2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYU5ld05PVEFUSU9OVmFsdWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hTmV3U3RyaW5nVmFsdWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGVOb05vcm0oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsaWRhdGVGYWNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFWYWxpZGF0ZUZhY2V0V2h0c3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsaWRhdGVMZW5ndGhGYWNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFWYWxpZGF0ZUxlbmd0aEZhY2V0V2h0c3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsaWRhdGVMaXN0U2ltcGxlVHlwZUZhY2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbGlkYXRlUHJlZGVmaW5lZFR5cGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hV2hpdGVTcGFjZVJlcGxhY2UoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbHNjaGVtYXN0eXBlczogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sQ2hhclN0cmR1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgY2hhciAqIGN1cjsgLyogdGhlIGlucHV0IGNoYXIgKiAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2N1ciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDaGFyU3RyZHVwKChjb25zdCBjaGFyICopY3VyKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2N1ciwgKGNvbnN0IGNoYXIgKiljdXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2hhclN0cmR1cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENoYXJTdHJuZHVwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICBjaGFyICogY3VyOyAvKiB0aGUgaW5wdXQgY2hhciAqICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgbGVuOyAvKiB0aGUgbGVuIG9mIEBjdXIgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fY3VyLCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENoYXJTdHJuZHVwKChjb25zdCBjaGFyICopY3VyLCBsZW4pOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fY3VyLCAoY29uc3QgY2hhciAqKWN1ciwgMCk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoYXJTdHJuZHVwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENoZWNrVVRGOCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgY2hhciAqIHV0ZjsgLyogUG9pbnRlciB0byBwdXRhdGl2ZSBVVEYtOCBlbmNvZGVkIHN0cmluZy4gKi8KICAgIGludCBuX3V0ZjsKCiAgICBmb3IgKG5fdXRmID0gMDtuX3V0ZiA8IGdlbl9uYl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cjtuX3V0ZisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB1dGYgPSBnZW5fY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl91dGYsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2hlY2tVVEY4KChjb25zdCB1bnNpZ25lZCBjaGFyICopdXRmKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl91dGYsIChjb25zdCB1bnNpZ25lZCBjaGFyICopdXRmLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoZWNrVVRGOCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldFVURjhDaGFyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB1bnNpZ25lZCBjaGFyICogdXRmOyAvKiBhIHNlcXVlbmNlIG9mIFVURi04IGVuY29kZWQgYnl0ZXMgKi8KICAgIGludCBuX3V0ZjsKICAgIGludCAqIGxlbjsgLyogYSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIG51bWJlciBvZiBieXRlcyBwcmVzZW50IGluIHRoZSBzZXF1ZW5jZS4gIFRoaXMgaXMgdXNlZCB0byBhc3N1cmUgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgc2VxdWVuY2UuICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3V0ZiA9IDA7bl91dGYgPCBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHI7bl91dGYrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB1dGYgPSBnZW5fY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl91dGYsIDApOwogICAgICAgIGxlbiA9IGdlbl9pbnRfcHRyKG5fbGVuLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldFVURjhDaGFyKChjb25zdCB1bnNpZ25lZCBjaGFyICopdXRmLCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX3V0ZiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKil1dGYsIDApOwogICAgICAgIGRlc19pbnRfcHRyKG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0VVRGOENoYXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyRXF1YWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHIxOyAvKiB0aGUgZmlyc3QgeG1sQ2hhciAqICovCiAgICBpbnQgbl9zdHIxOwogICAgeG1sQ2hhciAqIHN0cjI7IC8qIHRoZSBzZWNvbmQgeG1sQ2hhciAqICovCiAgICBpbnQgbl9zdHIyOwoKICAgIGZvciAobl9zdHIxID0gMDtuX3N0cjEgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIxKyspIHsKICAgIGZvciAobl9zdHIyID0gMDtuX3N0cjIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cjEgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAwKTsKICAgICAgICBzdHIyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJFcXVhbCgoY29uc3QgeG1sQ2hhciAqKXN0cjEsIChjb25zdCB4bWxDaGFyICopc3RyMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMSwgKGNvbnN0IHhtbENoYXIgKilzdHIxLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIyLCAoY29uc3QgeG1sQ2hhciAqKXN0cjIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyRXF1YWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJQcmludGYodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyUUVxdWFsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogcHJlZjsgLyogdGhlIHByZWZpeCBvZiB0aGUgUU5hbWUgKi8KICAgIGludCBuX3ByZWY7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGxvY2FsbmFtZSBvZiB0aGUgUU5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgc2Vjb25kIHhtbENoYXIgKiAqLwogICAgaW50IG5fc3RyOwoKICAgIGZvciAobl9wcmVmID0gMDtuX3ByZWYgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wcmVmKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHByZWYgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0clFFcXVhbCgoY29uc3QgeG1sQ2hhciAqKXByZWYsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilzdHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWYsIChjb25zdCB4bWxDaGFyICopcHJlZiwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0clFFcXVhbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJWUHJpbnRmKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cmNhc2VjbXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHIxOyAvKiB0aGUgZmlyc3QgeG1sQ2hhciAqICovCiAgICBpbnQgbl9zdHIxOwogICAgeG1sQ2hhciAqIHN0cjI7IC8qIHRoZSBzZWNvbmQgeG1sQ2hhciAqICovCiAgICBpbnQgbl9zdHIyOwoKICAgIGZvciAobl9zdHIxID0gMDtuX3N0cjEgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIxKyspIHsKICAgIGZvciAobl9zdHIyID0gMDtuX3N0cjIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cjEgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAwKTsKICAgICAgICBzdHIyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJjYXNlY21wKChjb25zdCB4bWxDaGFyICopc3RyMSwgKGNvbnN0IHhtbENoYXIgKilzdHIyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAoY29uc3QgeG1sQ2hhciAqKXN0cjEsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cjIsIChjb25zdCB4bWxDaGFyICopc3RyMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJjYXNlY21wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cjEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyY2FzZXN0cih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHhtbENoYXIgKiBhcnJheSAoaGF5c3RhY2spICovCiAgICBpbnQgbl9zdHI7CiAgICB4bWxDaGFyICogdmFsOyAvKiB0aGUgeG1sQ2hhciB0byBzZWFyY2ggKG5lZWRsZSkgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxDaGFyX3B0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDApOwogICAgICAgIHZhbCA9IGdlbl94bWxDaGFyX3B0cihuX3ZhbCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJjYXNlc3RyKChjb25zdCB4bWxDaGFyICopc3RyLCB2YWwpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMCk7CiAgICAgICAgZGVzX3htbENoYXJfcHRyKG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyY2FzZXN0ciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJjaHIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSB4bWxDaGFyICogYXJyYXkgKi8KICAgIGludCBuX3N0cjsKICAgIHhtbENoYXIgdmFsOyAvKiB0aGUgeG1sQ2hhciB0byBzZWFyY2ggKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxDaGFyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CiAgICAgICAgdmFsID0gZ2VuX3htbENoYXIobl92YWwsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyY2hyKChjb25zdCB4bWxDaGFyICopc3RyLCB2YWwpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMCk7CiAgICAgICAgZGVzX3htbENoYXIobl92YWwsIHZhbCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJjaHIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyY21wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyMTsgLyogdGhlIGZpcnN0IHhtbENoYXIgKiAqLwogICAgaW50IG5fc3RyMTsKICAgIHhtbENoYXIgKiBzdHIyOyAvKiB0aGUgc2Vjb25kIHhtbENoYXIgKiAqLwogICAgaW50IG5fc3RyMjsKCiAgICBmb3IgKG5fc3RyMSA9IDA7bl9zdHIxIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyMSsrKSB7CiAgICBmb3IgKG5fc3RyMiA9IDA7bl9zdHIyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIxID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMSwgMCk7CiAgICAgICAgc3RyMiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0cjIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyY21wKChjb25zdCB4bWxDaGFyICopc3RyMSwgKGNvbnN0IHhtbENoYXIgKilzdHIyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAoY29uc3QgeG1sQ2hhciAqKXN0cjEsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cjIsIChjb25zdCB4bWxDaGFyICopc3RyMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJjbXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJkdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjdXI7IC8qIHRoZSBpbnB1dCB4bWxDaGFyICogKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyZHVwKChjb25zdCB4bWxDaGFyICopY3VyKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgKGNvbnN0IHhtbENoYXIgKiljdXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyZHVwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RybGVuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgeG1sQ2hhciAqIGFycmF5ICovCiAgICBpbnQgbl9zdHI7CgogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cmxlbigoY29uc3QgeG1sQ2hhciAqKXN0cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJsZW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJuY2FzZWNtcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIHN0cjE7IC8qIHRoZSBmaXJzdCB4bWxDaGFyICogKi8KICAgIGludCBuX3N0cjE7CiAgICB4bWxDaGFyICogc3RyMjsgLyogdGhlIHNlY29uZCB4bWxDaGFyICogKi8KICAgIGludCBuX3N0cjI7CiAgICBpbnQgbGVuOyAvKiB0aGUgbWF4IGNvbXBhcmlzb24gbGVuZ3RoICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3N0cjEgPSAwO25fc3RyMSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cjErKykgewogICAgZm9yIChuX3N0cjIgPSAwO25fc3RyMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cjIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cjEgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAwKTsKICAgICAgICBzdHIyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMiwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJuY2FzZWNtcCgoY29uc3QgeG1sQ2hhciAqKXN0cjEsIChjb25zdCB4bWxDaGFyICopc3RyMiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAoY29uc3QgeG1sQ2hhciAqKXN0cjEsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cjIsIChjb25zdCB4bWxDaGFyICopc3RyMiwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cm5jYXNlY21wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cjEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cm5jYXROZXcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHIxOyAvKiBmaXJzdCB4bWxDaGFyIHN0cmluZyAqLwogICAgaW50IG5fc3RyMTsKICAgIHhtbENoYXIgKiBzdHIyOyAvKiBzZWNvbmQgeG1sQ2hhciBzdHJpbmcgKi8KICAgIGludCBuX3N0cjI7CiAgICBpbnQgbGVuOyAvKiB0aGUgbGVuIG9mIEBzdHIyICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3N0cjEgPSAwO25fc3RyMSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cjErKykgewogICAgZm9yIChuX3N0cjIgPSAwO25fc3RyMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cjIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cjEgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAwKTsKICAgICAgICBzdHIyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMiwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJuY2F0TmV3KChjb25zdCB4bWxDaGFyICopc3RyMSwgKGNvbnN0IHhtbENoYXIgKilzdHIyLCBsZW4pOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMSwgKGNvbnN0IHhtbENoYXIgKilzdHIxLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIyLCAoY29uc3QgeG1sQ2hhciAqKXN0cjIsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJuY2F0TmV3IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cjEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cm5jbXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHIxOyAvKiB0aGUgZmlyc3QgeG1sQ2hhciAqICovCiAgICBpbnQgbl9zdHIxOwogICAgeG1sQ2hhciAqIHN0cjI7IC8qIHRoZSBzZWNvbmQgeG1sQ2hhciAqICovCiAgICBpbnQgbl9zdHIyOwogICAgaW50IGxlbjsgLyogdGhlIG1heCBjb21wYXJpc29uIGxlbmd0aCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9zdHIxID0gMDtuX3N0cjEgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIxKyspIHsKICAgIGZvciAobl9zdHIyID0gMDtuX3N0cjIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIyKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIxID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMSwgMCk7CiAgICAgICAgc3RyMiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0cjIsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RybmNtcCgoY29uc3QgeG1sQ2hhciAqKXN0cjEsIChjb25zdCB4bWxDaGFyICopc3RyMiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAoY29uc3QgeG1sQ2hhciAqKXN0cjEsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cjIsIChjb25zdCB4bWxDaGFyICopc3RyMiwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cm5jbXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RybmR1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIGN1cjsgLyogdGhlIGlucHV0IHhtbENoYXIgKiAqLwogICAgaW50IG5fY3VyOwogICAgaW50IGxlbjsgLyogdGhlIGxlbiBvZiBAY3VyICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jdXIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJuZHVwKChjb25zdCB4bWxDaGFyICopY3VyLCBsZW4pOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMCk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cm5kdXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3Ryc3RyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgeG1sQ2hhciAqIGFycmF5IChoYXlzdGFjaykgKi8KICAgIGludCBuX3N0cjsKICAgIHhtbENoYXIgKiB2YWw7IC8qIHRoZSB4bWxDaGFyIHRvIHNlYXJjaCAobmVlZGxlKSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CiAgICAgICAgdmFsID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cnN0cigoY29uc3QgeG1sQ2hhciAqKXN0ciwgKGNvbnN0IHhtbENoYXIgKil2YWwpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAoY29uc3QgeG1sQ2hhciAqKXZhbCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJzdHIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3Ryc3ViKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgeG1sQ2hhciAqIGFycmF5IChoYXlzdGFjaykgKi8KICAgIGludCBuX3N0cjsKICAgIGludCBzdGFydDsgLyogdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyICh6ZXJvIGJhc2VkKSAqLwogICAgaW50IG5fc3RhcnQ7CiAgICBpbnQgbGVuOyAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICBmb3IgKG5fc3RhcnQgPSAwO25fc3RhcnQgPCBnZW5fbmJfaW50O25fc3RhcnQrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CiAgICAgICAgc3RhcnQgPSBnZW5faW50KG5fc3RhcnQsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU3Ryc3ViKChjb25zdCB4bWxDaGFyICopc3RyLCBzdGFydCwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKilzdHIsIDApOwogICAgICAgIGRlc19pbnQobl9zdGFydCwgc3RhcnQsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJzdWIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0YXJ0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVVRGOENoYXJjbXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB1dGYxOyAvKiBwb2ludGVyIHRvIGZpcnN0IFVURjggY2hhciAqLwogICAgaW50IG5fdXRmMTsKICAgIHhtbENoYXIgKiB1dGYyOyAvKiBwb2ludGVyIHRvIHNlY29uZCBVVEY4IGNoYXIgKi8KICAgIGludCBuX3V0ZjI7CgogICAgZm9yIChuX3V0ZjEgPSAwO25fdXRmMSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3V0ZjErKykgewogICAgZm9yIChuX3V0ZjIgPSAwO25fdXRmMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3V0ZjIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdXRmMSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZjEsIDApOwogICAgICAgIHV0ZjIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl91dGYyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVURjhDaGFyY21wKChjb25zdCB4bWxDaGFyICopdXRmMSwgKGNvbnN0IHhtbENoYXIgKil1dGYyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGYxLCAoY29uc3QgeG1sQ2hhciAqKXV0ZjEsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3V0ZjIsIChjb25zdCB4bWxDaGFyICopdXRmMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVVEY4Q2hhcmNtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3V0ZjIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVURjhTaXplKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdXRmOyAvKiBwb2ludGVyIHRvIHRoZSBVVEY4IGNoYXJhY3RlciAqLwogICAgaW50IG5fdXRmOwoKICAgIGZvciAobl91dGYgPSAwO25fdXRmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdXRmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHV0ZiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVVEY4U2l6ZSgoY29uc3QgeG1sQ2hhciAqKXV0Zik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdXRmLCAoY29uc3QgeG1sQ2hhciAqKXV0ZiwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVVEY4U2l6ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVURjhTdHJsZW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB1dGY7IC8qIGEgc2VxdWVuY2Ugb2YgVVRGLTggZW5jb2RlZCBieXRlcyAqLwogICAgaW50IG5fdXRmOwoKICAgIGZvciAobl91dGYgPSAwO25fdXRmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdXRmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHV0ZiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVVEY4U3RybGVuKChjb25zdCB4bWxDaGFyICopdXRmKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGYsIChjb25zdCB4bWxDaGFyICopdXRmLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVURjhTdHJsZW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVVEY4U3RybG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdXRmOyAvKiB0aGUgaW5wdXQgVVRGOCAqICovCiAgICBpbnQgbl91dGY7CiAgICB4bWxDaGFyICogdXRmY2hhcjsgLyogdGhlIFVURjggY2hhcmFjdGVyIHRvIGJlIGZvdW5kICovCiAgICBpbnQgbl91dGZjaGFyOwoKICAgIGZvciAobl91dGYgPSAwO25fdXRmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdXRmKyspIHsKICAgIGZvciAobl91dGZjaGFyID0gMDtuX3V0ZmNoYXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl91dGZjaGFyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHV0ZiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgMCk7CiAgICAgICAgdXRmY2hhciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZmNoYXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVVRGOFN0cmxvYygoY29uc3QgeG1sQ2hhciAqKXV0ZiwgKGNvbnN0IHhtbENoYXIgKil1dGZjaGFyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGYsIChjb25zdCB4bWxDaGFyICopdXRmLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGZjaGFyLCAoY29uc3QgeG1sQ2hhciAqKXV0ZmNoYXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVVRGOFN0cmxvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmY2hhcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVVRGOFN0cm5kdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB1dGY7IC8qIHRoZSBpbnB1dCBVVEY4ICogKi8KICAgIGludCBuX3V0ZjsKICAgIGludCBsZW47IC8qIHRoZSBsZW4gb2YgQHV0ZiAoaW4gY2hhcnMpICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3V0ZiA9IDA7bl91dGYgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl91dGYrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHV0ZiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxVVEY4U3RybmR1cCgoY29uc3QgeG1sQ2hhciAqKXV0ZiwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgKGNvbnN0IHhtbENoYXIgKil1dGYsIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVVEY4U3RybmR1cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVVEY4U3RycG9zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogdXRmOyAvKiB0aGUgaW5wdXQgVVRGOCAqICovCiAgICBpbnQgbl91dGY7CiAgICBpbnQgcG9zOyAvKiB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgVVRGOCBjaGFyIChpbiBjaGFycykgKi8KICAgIGludCBuX3BvczsKCiAgICBmb3IgKG5fdXRmID0gMDtuX3V0ZiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3V0ZisrKSB7CiAgICBmb3IgKG5fcG9zID0gMDtuX3BvcyA8IGdlbl9uYl9pbnQ7bl9wb3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdXRmID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdXRmLCAwKTsKICAgICAgICBwb3MgPSBnZW5faW50KG5fcG9zLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVURjhTdHJwb3MoKGNvbnN0IHhtbENoYXIgKil1dGYsIHBvcyk7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGYsIChjb25zdCB4bWxDaGFyICopdXRmLCAwKTsKICAgICAgICBkZXNfaW50KG5fcG9zLCBwb3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVVRGOFN0cnBvcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcG9zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVVEY4U3Ryc2l6ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCiAgICBpbnQgbl91dGY7CiAgICBpbnQgbGVuOyAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGFycmF5ICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3V0ZiA9IDA7bl91dGYgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl91dGYrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHV0ZiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxVVEY4U3Ryc2l6ZSgoY29uc3QgeG1sQ2hhciAqKXV0ZiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGYsIChjb25zdCB4bWxDaGFyICopdXRmLCAwKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVVRGOFN0cnNpemUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVVRGOFN0cnN1Yih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCiAgICBpbnQgbl91dGY7CiAgICBpbnQgc3RhcnQ7IC8qIHJlbGF0aXZlIHBvcyBvZiBmaXJzdCBjaGFyICovCiAgICBpbnQgbl9zdGFydDsKICAgIGludCBsZW47IC8qIHRvdGFsIG51bWJlciB0byBjb3B5ICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3V0ZiA9IDA7bl91dGYgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl91dGYrKykgewogICAgZm9yIChuX3N0YXJ0ID0gMDtuX3N0YXJ0IDwgZ2VuX25iX2ludDtuX3N0YXJ0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB1dGYgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl91dGYsIDApOwogICAgICAgIHN0YXJ0ID0gZ2VuX2ludChuX3N0YXJ0LCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVURjhTdHJzdWIoKGNvbnN0IHhtbENoYXIgKil1dGYsIHN0YXJ0LCBsZW4pOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdXRmLCAoY29uc3QgeG1sQ2hhciAqKXV0ZiwgMCk7CiAgICAgICAgZGVzX2ludChuX3N0YXJ0LCBzdGFydCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVURjhTdHJzdWIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0YXJ0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxzdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhtbHN0cmluZyA6IDI2IG9mIDMwIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDaGFyU3RyZHVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENoYXJTdHJuZHVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENoZWNrVVRGOCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRVVEY4Q2hhcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJFcXVhbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJQcmludGYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyUUVxdWFsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0clZQcmludGYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyY2FzZWNtcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJjYXNlc3RyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cmNocigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJjbXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyZHVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cmxlbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJuY2FzZWNtcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJuY2F0TmV3KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cm5jbXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RybmR1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJzdHIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3Ryc3ViKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVURjhDaGFyY21wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVURjhTaXplKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVURjhTdHJsZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVVRGOFN0cmxvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVVEY4U3RybmR1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVVEY4U3RycG9zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVURjhTdHJzaXplKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVURjhTdHJzdWIoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbHN0cmluZzogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNBZWdlYW5OdW1iZXJzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0FlZ2Vhbk51bWJlcnMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNBZWdlYW5OdW1iZXJzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0FscGhhYmV0aWNQcmVzZW50YXRpb25Gb3Jtcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNBbHBoYWJldGljUHJlc2VudGF0aW9uRm9ybXMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNBbHBoYWJldGljUHJlc2VudGF0aW9uRm9ybXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQXJhYmljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0FyYWJpYyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0FyYWJpYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNBcmFiaWNQcmVzZW50YXRpb25Gb3Jtc0Eodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQXJhYmljUHJlc2VudGF0aW9uRm9ybXNBKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQXJhYmljUHJlc2VudGF0aW9uRm9ybXNBIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0FyYWJpY1ByZXNlbnRhdGlvbkZvcm1zQih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNBcmFiaWNQcmVzZW50YXRpb25Gb3Jtc0IoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNBcmFiaWNQcmVzZW50YXRpb25Gb3Jtc0IiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQXJtZW5pYW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQXJtZW5pYW4oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNBcm1lbmlhbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNBcnJvd3Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQXJyb3dzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQXJyb3dzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0Jhc2ljTGF0aW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQmFzaWNMYXRpbihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0Jhc2ljTGF0aW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQmVuZ2FsaSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNCZW5nYWxpKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQmVuZ2FsaSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNCbG9jayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwogICAgY2hhciAqIGJsb2NrOyAvKiBVQ1MgYmxvY2sgbmFtZSAqLwogICAgaW50IG5fYmxvY2s7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgIGZvciAobl9ibG9jayA9IDA7bl9ibG9jayA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2Jsb2NrKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CiAgICAgICAgYmxvY2sgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9ibG9jaywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0Jsb2NrKGNvZGUsIChjb25zdCBjaGFyICopYmxvY2spOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9ibG9jaywgKGNvbnN0IGNoYXIgKilibG9jaywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0Jsb2NrIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYmxvY2spOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0Jsb2NrRWxlbWVudHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQmxvY2tFbGVtZW50cyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0Jsb2NrRWxlbWVudHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQm9wb21vZm8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQm9wb21vZm8oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNCb3BvbW9mbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNCb3BvbW9mb0V4dGVuZGVkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0JvcG9tb2ZvRXh0ZW5kZWQoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNCb3BvbW9mb0V4dGVuZGVkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0JveERyYXdpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQm94RHJhd2luZyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0JveERyYXdpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQnJhaWxsZVBhdHRlcm5zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0JyYWlsbGVQYXR0ZXJucyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0JyYWlsbGVQYXR0ZXJucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNCdWhpZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNCdWhpZChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0J1aGlkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0J5emFudGluZU11c2ljYWxTeW1ib2xzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0J5emFudGluZU11c2ljYWxTeW1ib2xzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQnl6YW50aW5lTXVzaWNhbFN5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDSktDb21wYXRpYmlsaXR5KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDSktDb21wYXRpYmlsaXR5Rm9ybXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eUZvcm1zKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eUZvcm1zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eUlkZW9ncmFwaHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eUlkZW9ncmFwaHNTdXBwbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzU3VwcGxlbWVudChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzU3VwcGxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDSktSYWRpY2Fsc1N1cHBsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ0pLUmFkaWNhbHNTdXBwbGVtZW50KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ0pLUmFkaWNhbHNTdXBwbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NKS1N5bWJvbHNhbmRQdW5jdHVhdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDSktTeW1ib2xzYW5kUHVuY3R1YXRpb24oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDSktTeW1ib2xzYW5kUHVuY3R1YXRpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDSktVbmlmaWVkSWRlb2dyYXBocyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDSktVbmlmaWVkSWRlb2dyYXBoc0V4dGVuc2lvbkEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHNFeHRlbnNpb25BKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHNFeHRlbnNpb25BIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NKS1VuaWZpZWRJZGVvZ3JhcGhzRXh0ZW5zaW9uQih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDSktVbmlmaWVkSWRlb2dyYXBoc0V4dGVuc2lvbkIoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDSktVbmlmaWVkSWRlb2dyYXBoc0V4dGVuc2lvbkIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CiAgICBjaGFyICogY2F0OyAvKiBVQ1MgQ2F0ZWdvcnkgbmFtZSAqLwogICAgaW50IG5fY2F0OwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICBmb3IgKG5fY2F0ID0gMDtuX2NhdCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2NhdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwogICAgICAgIGNhdCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2NhdCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdChjb2RlLCAoY29uc3QgY2hhciAqKWNhdCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2NhdCwgKGNvbnN0IGNoYXIgKiljYXQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdEModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0Qyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdEMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0Q2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0Q2MoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRDYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRDZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRDZihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdENmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdENvKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdENvKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0Q28iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0Q3Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0Q3MoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRDcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRMKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdEwoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRMIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdExsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdExsKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0TGwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0TG0odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0TG0oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRMbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRMbyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRMbyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdExvIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdEx0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdEx0KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0THQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0THUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0THUoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRMdSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRNKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdE0oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRNIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdE1jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdE1jKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0TWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0TWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0TWUoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRNZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRNbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRNbihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdE1uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdE4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0Tihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdE4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0TmQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0TmQoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXROZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRObCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRObChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdE5sIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdE5vKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdE5vKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0Tm8iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0UCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRQKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0UCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRQYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRQYyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFBjIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdFBkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdFBkKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0UGQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0UGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0UGUoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRQZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRQZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRQZihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFBmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdFBpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdFBpKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0UGkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0UG8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0UG8oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRQbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRQcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRQcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFBzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdFModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0Uyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0U2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0U2MoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRTYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRTayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRTayhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFNrIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdFNtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdFNtKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0U20iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0U28odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0U28oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRTbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRaKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdFooY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRaIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdFpsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdFpsKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0WmwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0WnAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0WnAoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRacCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRacyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRacyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFpzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NoZXJva2VlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NoZXJva2VlKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2hlcm9rZWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ29tYmluaW5nRGlhY3JpdGljYWxNYXJrcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDb21iaW5pbmdEaWFjcml0aWNhbE1hcmtzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ29tYmluaW5nRGlhY3JpdGljYWxNYXJrcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDb21iaW5pbmdEaWFjcml0aWNhbE1hcmtzZm9yU3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDb21iaW5pbmdEaWFjcml0aWNhbE1hcmtzZm9yU3ltYm9scyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NvbWJpbmluZ0RpYWNyaXRpY2FsTWFya3Nmb3JTeW1ib2xzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NvbWJpbmluZ0hhbGZNYXJrcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDb21iaW5pbmdIYWxmTWFya3MoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDb21iaW5pbmdIYWxmTWFya3MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ29tYmluaW5nTWFya3Nmb3JTeW1ib2xzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NvbWJpbmluZ01hcmtzZm9yU3ltYm9scyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NvbWJpbmluZ01hcmtzZm9yU3ltYm9scyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDb250cm9sUGljdHVyZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ29udHJvbFBpY3R1cmVzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ29udHJvbFBpY3R1cmVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0N1cnJlbmN5U3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDdXJyZW5jeVN5bWJvbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDdXJyZW5jeVN5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ3lwcmlvdFN5bGxhYmFyeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDeXByaW90U3lsbGFiYXJ5KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ3lwcmlvdFN5bGxhYmFyeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDeXJpbGxpYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDeXJpbGxpYyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0N5cmlsbGljIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0N5cmlsbGljU3VwcGxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDeXJpbGxpY1N1cHBsZW1lbnQoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDeXJpbGxpY1N1cHBsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzRGVzZXJldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNEZXNlcmV0KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzRGVzZXJldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNEZXZhbmFnYXJpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0RldmFuYWdhcmkoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNEZXZhbmFnYXJpIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0RpbmdiYXRzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0RpbmdiYXRzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzRGluZ2JhdHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzRW5jbG9zZWRBbHBoYW51bWVyaWNzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0VuY2xvc2VkQWxwaGFudW1lcmljcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0VuY2xvc2VkQWxwaGFudW1lcmljcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNFbmNsb3NlZENKS0xldHRlcnNhbmRNb250aHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzRW5jbG9zZWRDSktMZXR0ZXJzYW5kTW9udGhzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzRW5jbG9zZWRDSktMZXR0ZXJzYW5kTW9udGhzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0V0aGlvcGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0V0aGlvcGljKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzRXRoaW9waWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzR2VuZXJhbFB1bmN0dWF0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0dlbmVyYWxQdW5jdHVhdGlvbihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0dlbmVyYWxQdW5jdHVhdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNHZW9tZXRyaWNTaGFwZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzR2VvbWV0cmljU2hhcGVzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzR2VvbWV0cmljU2hhcGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0dlb3JnaWFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0dlb3JnaWFuKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzR2VvcmdpYW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzR290aGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0dvdGhpYyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0dvdGhpYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNHcmVlayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNHcmVlayhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0dyZWVrIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0dyZWVrRXh0ZW5kZWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzR3JlZWtFeHRlbmRlZChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0dyZWVrRXh0ZW5kZWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzR3JlZWthbmRDb3B0aWModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzR3JlZWthbmRDb3B0aWMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNHcmVla2FuZENvcHRpYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNHdWphcmF0aSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNHdWphcmF0aShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0d1amFyYXRpIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0d1cm11a2hpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0d1cm11a2hpKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzR3VybXVraGkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzSGFsZndpZHRoYW5kRnVsbHdpZHRoRm9ybXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzSGFsZndpZHRoYW5kRnVsbHdpZHRoRm9ybXMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNIYWxmd2lkdGhhbmRGdWxsd2lkdGhGb3JtcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNIYW5ndWxDb21wYXRpYmlsaXR5SmFtbyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNIYW5ndWxDb21wYXRpYmlsaXR5SmFtbyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0hhbmd1bENvbXBhdGliaWxpdHlKYW1vIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0hhbmd1bEphbW8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzSGFuZ3VsSmFtbyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0hhbmd1bEphbW8iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzSGFuZ3VsU3lsbGFibGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0hhbmd1bFN5bGxhYmxlcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0hhbmd1bFN5bGxhYmxlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNIYW51bm9vKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0hhbnVub28oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNIYW51bm9vIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0hlYnJldyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNIZWJyZXcoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNIZWJyZXciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzSGlnaFByaXZhdGVVc2VTdXJyb2dhdGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0hpZ2hQcml2YXRlVXNlU3Vycm9nYXRlcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0hpZ2hQcml2YXRlVXNlU3Vycm9nYXRlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNIaWdoU3Vycm9nYXRlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNIaWdoU3Vycm9nYXRlcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0hpZ2hTdXJyb2dhdGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0hpcmFnYW5hKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0hpcmFnYW5hKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzSGlyYWdhbmEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzSVBBRXh0ZW5zaW9ucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNJUEFFeHRlbnNpb25zKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzSVBBRXh0ZW5zaW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNJZGVvZ3JhcGhpY0Rlc2NyaXB0aW9uQ2hhcmFjdGVycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNJZGVvZ3JhcGhpY0Rlc2NyaXB0aW9uQ2hhcmFjdGVycyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0lkZW9ncmFwaGljRGVzY3JpcHRpb25DaGFyYWN0ZXJzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0thbmJ1bih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNLYW5idW4oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNLYW5idW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzS2FuZ3hpUmFkaWNhbHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzS2FuZ3hpUmFkaWNhbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNLYW5neGlSYWRpY2FscyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNLYW5uYWRhKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0thbm5hZGEoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNLYW5uYWRhIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0thdGFrYW5hKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0thdGFrYW5hKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzS2F0YWthbmEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzS2F0YWthbmFQaG9uZXRpY0V4dGVuc2lvbnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzS2F0YWthbmFQaG9uZXRpY0V4dGVuc2lvbnMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNLYXRha2FuYVBob25ldGljRXh0ZW5zaW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNLaG1lcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNLaG1lcihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0tobWVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0tobWVyU3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNLaG1lclN5bWJvbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNLaG1lclN5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTGFvKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0xhbyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0xhbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNMYXRpbjFTdXBwbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0xhdGluMVN1cHBsZW1lbnQoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNMYXRpbjFTdXBwbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0xhdGluRXh0ZW5kZWRBKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0xhdGluRXh0ZW5kZWRBKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzTGF0aW5FeHRlbmRlZEEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTGF0aW5FeHRlbmRlZEFkZGl0aW9uYWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTGF0aW5FeHRlbmRlZEFkZGl0aW9uYWwoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNMYXRpbkV4dGVuZGVkQWRkaXRpb25hbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNMYXRpbkV4dGVuZGVkQih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNMYXRpbkV4dGVuZGVkQihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0xhdGluRXh0ZW5kZWRCIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0xldHRlcmxpa2VTeW1ib2xzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0xldHRlcmxpa2VTeW1ib2xzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzTGV0dGVybGlrZVN5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTGltYnUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTGltYnUoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNMaW1idSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNMaW5lYXJCSWRlb2dyYW1zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0xpbmVhckJJZGVvZ3JhbXMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNMaW5lYXJCSWRlb2dyYW1zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0xpbmVhckJTeWxsYWJhcnkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTGluZWFyQlN5bGxhYmFyeShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0xpbmVhckJTeWxsYWJhcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTG93U3Vycm9nYXRlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNMb3dTdXJyb2dhdGVzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzTG93U3Vycm9nYXRlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNNYWxheWFsYW0odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTWFsYXlhbGFtKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzTWFsYXlhbGFtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc01hdGhlbWF0aWNhbEFscGhhbnVtZXJpY1N5bWJvbHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTWF0aGVtYXRpY2FsQWxwaGFudW1lcmljU3ltYm9scyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc01hdGhlbWF0aWNhbEFscGhhbnVtZXJpY1N5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTWF0aGVtYXRpY2FsT3BlcmF0b3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc01hdGhlbWF0aWNhbE9wZXJhdG9ycyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc01hdGhlbWF0aWNhbE9wZXJhdG9ycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNNaXNjZWxsYW5lb3VzTWF0aGVtYXRpY2FsU3ltYm9sc0Eodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTWlzY2VsbGFuZW91c01hdGhlbWF0aWNhbFN5bWJvbHNBKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzTWlzY2VsbGFuZW91c01hdGhlbWF0aWNhbFN5bWJvbHNBIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc01pc2NlbGxhbmVvdXNNYXRoZW1hdGljYWxTeW1ib2xzQih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNNaXNjZWxsYW5lb3VzTWF0aGVtYXRpY2FsU3ltYm9sc0IoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNNaXNjZWxsYW5lb3VzTWF0aGVtYXRpY2FsU3ltYm9sc0IiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTWlzY2VsbGFuZW91c1N5bWJvbHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTWlzY2VsbGFuZW91c1N5bWJvbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNNaXNjZWxsYW5lb3VzU3ltYm9scyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNNaXNjZWxsYW5lb3VzU3ltYm9sc2FuZEFycm93cyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNNaXNjZWxsYW5lb3VzU3ltYm9sc2FuZEFycm93cyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc01pc2NlbGxhbmVvdXNTeW1ib2xzYW5kQXJyb3dzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc01pc2NlbGxhbmVvdXNUZWNobmljYWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTWlzY2VsbGFuZW91c1RlY2huaWNhbChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc01pc2NlbGxhbmVvdXNUZWNobmljYWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTW9uZ29saWFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc01vbmdvbGlhbihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc01vbmdvbGlhbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNNdXNpY2FsU3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNNdXNpY2FsU3ltYm9scyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc011c2ljYWxTeW1ib2xzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc015YW5tYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTXlhbm1hcihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc015YW5tYXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTnVtYmVyRm9ybXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTnVtYmVyRm9ybXMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNOdW1iZXJGb3JtcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNPZ2hhbSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNPZ2hhbShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc09naGFtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc09sZEl0YWxpYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNPbGRJdGFsaWMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNPbGRJdGFsaWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzT3B0aWNhbENoYXJhY3RlclJlY29nbml0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc09wdGljYWxDaGFyYWN0ZXJSZWNvZ25pdGlvbihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc09wdGljYWxDaGFyYWN0ZXJSZWNvZ25pdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNPcml5YSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNPcml5YShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc09yaXlhIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc09zbWFueWEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzT3NtYW55YShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc09zbWFueWEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzUGhvbmV0aWNFeHRlbnNpb25zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1Bob25ldGljRXh0ZW5zaW9ucyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1Bob25ldGljRXh0ZW5zaW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNQcml2YXRlVXNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1ByaXZhdGVVc2UoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNQcml2YXRlVXNlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1ByaXZhdGVVc2VBcmVhKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1ByaXZhdGVVc2VBcmVhKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzUHJpdmF0ZVVzZUFyZWEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzUnVuaWModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzUnVuaWMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNSdW5pYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNTaGF2aWFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1NoYXZpYW4oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNTaGF2aWFuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1NpbmhhbGEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzU2luaGFsYShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1NpbmhhbGEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzU21hbGxGb3JtVmFyaWFudHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzU21hbGxGb3JtVmFyaWFudHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNTbWFsbEZvcm1WYXJpYW50cyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNTcGFjaW5nTW9kaWZpZXJMZXR0ZXJzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1NwYWNpbmdNb2RpZmllckxldHRlcnMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNTcGFjaW5nTW9kaWZpZXJMZXR0ZXJzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1NwZWNpYWxzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1NwZWNpYWxzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzU3BlY2lhbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzU3VwZXJzY3JpcHRzYW5kU3Vic2NyaXB0cyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNTdXBlcnNjcmlwdHNhbmRTdWJzY3JpcHRzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzU3VwZXJzY3JpcHRzYW5kU3Vic2NyaXB0cyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNTdXBwbGVtZW50YWxBcnJvd3NBKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1N1cHBsZW1lbnRhbEFycm93c0EoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNTdXBwbGVtZW50YWxBcnJvd3NBIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1N1cHBsZW1lbnRhbEFycm93c0Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzU3VwcGxlbWVudGFsQXJyb3dzQihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1N1cHBsZW1lbnRhbEFycm93c0IiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzU3VwcGxlbWVudGFsTWF0aGVtYXRpY2FsT3BlcmF0b3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1N1cHBsZW1lbnRhbE1hdGhlbWF0aWNhbE9wZXJhdG9ycyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1N1cHBsZW1lbnRhbE1hdGhlbWF0aWNhbE9wZXJhdG9ycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNTdXBwbGVtZW50YXJ5UHJpdmF0ZVVzZUFyZWFBKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1N1cHBsZW1lbnRhcnlQcml2YXRlVXNlQXJlYUEoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNTdXBwbGVtZW50YXJ5UHJpdmF0ZVVzZUFyZWFBIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1N1cHBsZW1lbnRhcnlQcml2YXRlVXNlQXJlYUIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzU3VwcGxlbWVudGFyeVByaXZhdGVVc2VBcmVhQihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1N1cHBsZW1lbnRhcnlQcml2YXRlVXNlQXJlYUIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzU3lyaWFjKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1N5cmlhYyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1N5cmlhYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNUYWdhbG9nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1RhZ2Fsb2coY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNUYWdhbG9nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1RhZ2JhbndhKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1RhZ2JhbndhKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVGFnYmFud2EiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzVGFncyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNUYWdzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVGFncyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNUYWlMZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNUYWlMZShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1RhaUxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1RhaVh1YW5KaW5nU3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNUYWlYdWFuSmluZ1N5bWJvbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNUYWlYdWFuSmluZ1N5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzVGFtaWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzVGFtaWwoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNUYW1pbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNUZWx1Z3Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzVGVsdWd1KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVGVsdWd1IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1RoYWFuYSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNUaGFhbmEoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNUaGFhbmEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzVGhhaSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNUaGFpKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVGhhaSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNUaWJldGFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1RpYmV0YW4oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNUaWJldGFuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1VnYXJpdGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1VnYXJpdGljKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVWdhcml0aWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzVW5pZmllZENhbmFkaWFuQWJvcmlnaW5hbFN5bGxhYmljcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNVbmlmaWVkQ2FuYWRpYW5BYm9yaWdpbmFsU3lsbGFiaWNzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVW5pZmllZENhbmFkaWFuQWJvcmlnaW5hbFN5bGxhYmljcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNWYXJpYXRpb25TZWxlY3RvcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzVmFyaWF0aW9uU2VsZWN0b3JzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVmFyaWF0aW9uU2VsZWN0b3JzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1ZhcmlhdGlvblNlbGVjdG9yc1N1cHBsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzVmFyaWF0aW9uU2VsZWN0b3JzU3VwcGxlbWVudChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1ZhcmlhdGlvblNlbGVjdG9yc1N1cHBsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzWWlSYWRpY2Fscyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNZaVJhZGljYWxzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzWWlSYWRpY2FscyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNZaVN5bGxhYmxlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNZaVN5bGxhYmxlcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1lpU3lsbGFibGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1lpamluZ0hleGFncmFtU3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNZaWppbmdIZXhhZ3JhbVN5bWJvbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNZaWppbmdIZXhhZ3JhbVN5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sdW5pY29kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sdW5pY29kZSA6IDE2NiBvZiAxNjYgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQWVnZWFuTnVtYmVycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0FscGhhYmV0aWNQcmVzZW50YXRpb25Gb3JtcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0FyYWJpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0FyYWJpY1ByZXNlbnRhdGlvbkZvcm1zQSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0FyYWJpY1ByZXNlbnRhdGlvbkZvcm1zQigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0FybWVuaWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQXJyb3dzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQmFzaWNMYXRpbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0JlbmdhbGkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNCbG9jaygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0Jsb2NrRWxlbWVudHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNCb3BvbW9mbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0JvcG9tb2ZvRXh0ZW5kZWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNCb3hEcmF3aW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQnJhaWxsZVBhdHRlcm5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQnVoaWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNCeXphbnRpbmVNdXNpY2FsU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDSktDb21wYXRpYmlsaXR5Rm9ybXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDSktDb21wYXRpYmlsaXR5SWRlb2dyYXBocygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzU3VwcGxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NKS1JhZGljYWxzU3VwcGxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NKS1N5bWJvbHNhbmRQdW5jdHVhdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NKS1VuaWZpZWRJZGVvZ3JhcGhzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHNFeHRlbnNpb25BKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHNFeHRlbnNpb25CKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0QygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdENjKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0Q2YoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRDbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdENzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0TCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdExsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0TG0oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRMbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdEx0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0THUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRNKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0TWMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRNZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdE1uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0TigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdE5kKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0TmwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRObygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRQYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFBkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0UGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRQZigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFBpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0UG8oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRQcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRTYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFNrKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0U20oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRTbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFooKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRabCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFpwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0WnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDaGVyb2tlZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NvbWJpbmluZ0RpYWNyaXRpY2FsTWFya3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDb21iaW5pbmdEaWFjcml0aWNhbE1hcmtzZm9yU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NvbWJpbmluZ0hhbGZNYXJrcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NvbWJpbmluZ01hcmtzZm9yU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NvbnRyb2xQaWN0dXJlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0N1cnJlbmN5U3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0N5cHJpb3RTeWxsYWJhcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDeXJpbGxpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0N5cmlsbGljU3VwcGxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0Rlc2VyZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNEZXZhbmFnYXJpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzRGluZ2JhdHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNFbmNsb3NlZEFscGhhbnVtZXJpY3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNFbmNsb3NlZENKS0xldHRlcnNhbmRNb250aHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNFdGhpb3BpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0dlbmVyYWxQdW5jdHVhdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0dlb21ldHJpY1NoYXBlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0dlb3JnaWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzR290aGljKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzR3JlZWsoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNHcmVla0V4dGVuZGVkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzR3JlZWthbmRDb3B0aWMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNHdWphcmF0aSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0d1cm11a2hpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzSGFsZndpZHRoYW5kRnVsbHdpZHRoRm9ybXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNIYW5ndWxDb21wYXRpYmlsaXR5SmFtbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0hhbmd1bEphbW8oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNIYW5ndWxTeWxsYWJsZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNIYW51bm9vKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzSGVicmV3KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzSGlnaFByaXZhdGVVc2VTdXJyb2dhdGVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzSGlnaFN1cnJvZ2F0ZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNIaXJhZ2FuYSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0lQQUV4dGVuc2lvbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNJZGVvZ3JhcGhpY0Rlc2NyaXB0aW9uQ2hhcmFjdGVycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0thbmJ1bigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0thbmd4aVJhZGljYWxzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzS2FubmFkYSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0thdGFrYW5hKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzS2F0YWthbmFQaG9uZXRpY0V4dGVuc2lvbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNLaG1lcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0tobWVyU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0xhbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0xhdGluMVN1cHBsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNMYXRpbkV4dGVuZGVkQSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0xhdGluRXh0ZW5kZWRBZGRpdGlvbmFsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTGF0aW5FeHRlbmRlZEIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNMZXR0ZXJsaWtlU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0xpbWJ1KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTGluZWFyQklkZW9ncmFtcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0xpbmVhckJTeWxsYWJhcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNMb3dTdXJyb2dhdGVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTWFsYXlhbGFtKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTWF0aGVtYXRpY2FsQWxwaGFudW1lcmljU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc01hdGhlbWF0aWNhbE9wZXJhdG9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc01pc2NlbGxhbmVvdXNNYXRoZW1hdGljYWxTeW1ib2xzQSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc01pc2NlbGxhbmVvdXNNYXRoZW1hdGljYWxTeW1ib2xzQigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc01pc2NlbGxhbmVvdXNTeW1ib2xzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTWlzY2VsbGFuZW91c1N5bWJvbHNhbmRBcnJvd3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNNaXNjZWxsYW5lb3VzVGVjaG5pY2FsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTW9uZ29saWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTXVzaWNhbFN5bWJvbHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNNeWFubWFyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTnVtYmVyRm9ybXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNPZ2hhbSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc09sZEl0YWxpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc09wdGljYWxDaGFyYWN0ZXJSZWNvZ25pdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc09yaXlhKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzT3NtYW55YSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1Bob25ldGljRXh0ZW5zaW9ucygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1ByaXZhdGVVc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNQcml2YXRlVXNlQXJlYSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1J1bmljKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzU2hhdmlhbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1NpbmhhbGEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNTbWFsbEZvcm1WYXJpYW50cygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1NwYWNpbmdNb2RpZmllckxldHRlcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNTcGVjaWFscygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1N1cGVyc2NyaXB0c2FuZFN1YnNjcmlwdHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNTdXBwbGVtZW50YWxBcnJvd3NBKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzU3VwcGxlbWVudGFsQXJyb3dzQigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1N1cHBsZW1lbnRhbE1hdGhlbWF0aWNhbE9wZXJhdG9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1N1cHBsZW1lbnRhcnlQcml2YXRlVXNlQXJlYUEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNTdXBwbGVtZW50YXJ5UHJpdmF0ZVVzZUFyZWFCKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzU3lyaWFjKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVGFnYWxvZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1RhZ2JhbndhKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVGFncygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1RhaUxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVGFpWHVhbkppbmdTeW1ib2xzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVGFtaWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNUZWx1Z3UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNUaGFhbmEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNUaGFpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVGliZXRhbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1VnYXJpdGljKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVW5pZmllZENhbmFkaWFuQWJvcmlnaW5hbFN5bGxhYmljcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1ZhcmlhdGlvblNlbGVjdG9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1ZhcmlhdGlvblNlbGVjdG9yc1N1cHBsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNZaVJhZGljYWxzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzWWlTeWxsYWJsZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNZaWppbmdIZXhhZ3JhbVN5bWJvbHMoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbHVuaWNvZGU6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbE5ld1RleHRXcml0ZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFRleHRXcml0ZXJQdHIgcmV0X3ZhbDsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBvdXQ7IC8qIGFuIHhtbE91dHB1dEJ1ZmZlclB0ciAqLwogICAgaW50IG5fb3V0OwoKICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX291dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXQgPSBnZW5feG1sT3V0cHV0QnVmZmVyUHRyKG5fb3V0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1RleHRXcml0ZXIob3V0KTsKICAgICAgICBpZiAocmV0X3ZhbCAhPSBOVUxMKSBvdXQgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxUZXh0V3JpdGVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKG5fb3V0LCBvdXQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3VGV4dFdyaXRlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdUZXh0V3JpdGVyRmlsZW5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFRleHRXcml0ZXJQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiB1cmk7IC8qIHRoZSBVUkkgb2YgdGhlIHJlc291cmNlIGZvciB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl91cmk7CiAgICBpbnQgY29tcHJlc3Npb247IC8qIGNvbXByZXNzIHRoZSBvdXRwdXQ/ICovCiAgICBpbnQgbl9jb21wcmVzc2lvbjsKCiAgICBmb3IgKG5fdXJpID0gMDtuX3VyaSA8IGdlbl9uYl9maWxlb3V0cHV0O25fdXJpKyspIHsKICAgIGZvciAobl9jb21wcmVzc2lvbiA9IDA7bl9jb21wcmVzc2lvbiA8IGdlbl9uYl9pbnQ7bl9jb21wcmVzc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB1cmkgPSBnZW5fZmlsZW91dHB1dChuX3VyaSwgMCk7CiAgICAgICAgY29tcHJlc3Npb24gPSBnZW5faW50KG5fY29tcHJlc3Npb24sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3VGV4dFdyaXRlckZpbGVuYW1lKHVyaSwgY29tcHJlc3Npb24pOwogICAgICAgIGRlc3JldF94bWxUZXh0V3JpdGVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX3VyaSwgdXJpLCAwKTsKICAgICAgICBkZXNfaW50KG5fY29tcHJlc3Npb24sIGNvbXByZXNzaW9uLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1RleHRXcml0ZXJGaWxlbmFtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91cmkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcHJlc3Npb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdUZXh0V3JpdGVyTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHJldF92YWw7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB4bWxCdWZmZXJQdHIgKi8KICAgIGludCBuX2J1ZjsKICAgIGludCBjb21wcmVzc2lvbjsgLyogY29tcHJlc3MgdGhlIG91dHB1dD8gKi8KICAgIGludCBuX2NvbXByZXNzaW9uOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fY29tcHJlc3Npb24gPSAwO25fY29tcHJlc3Npb24gPCBnZW5fbmJfaW50O25fY29tcHJlc3Npb24rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgY29tcHJlc3Npb24gPSBnZW5faW50KG5fY29tcHJlc3Npb24sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3VGV4dFdyaXRlck1lbW9yeShidWYsIGNvbXByZXNzaW9uKTsKICAgICAgICBkZXNyZXRfeG1sVGV4dFdyaXRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfaW50KG5fY29tcHJlc3Npb24sIGNvbXByZXNzaW9uLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1RleHRXcml0ZXJNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbXByZXNzaW9uKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3VGV4dFdyaXRlclB1c2hQYXJzZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFRleHRXcml0ZXJQdHIgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogeG1sUGFyc2VyQ3R4dFB0ciB0byBob2xkIHRoZSBuZXcgWE1MIGRvY3VtZW50IHRyZWUgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgY29tcHJlc3Npb247IC8qIGNvbXByZXNzIHRoZSBvdXRwdXQ/ICovCiAgICBpbnQgbl9jb21wcmVzc2lvbjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jb21wcmVzc2lvbiA9IDA7bl9jb21wcmVzc2lvbiA8IGdlbl9uYl9pbnQ7bl9jb21wcmVzc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjb21wcmVzc2lvbiA9IGdlbl9pbnQobl9jb21wcmVzc2lvbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdUZXh0V3JpdGVyUHVzaFBhcnNlcihjdHh0LCBjb21wcmVzc2lvbik7CiAgICAgICAgaWYgKGN0eHQgIT0gTlVMTCkge3htbEZyZWVEb2MoY3R4dC0+bXlEb2MpOyBjdHh0LT5teURvYyA9IE5VTEw7fSBpZiAocmV0X3ZhbCAhPSBOVUxMKSBjdHh0ID0gTlVMTDsKICAgICAgICBkZXNyZXRfeG1sVGV4dFdyaXRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fY29tcHJlc3Npb24sIGNvbXByZXNzaW9uLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1RleHRXcml0ZXJQdXNoUGFyc2VyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcHJlc3Npb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdUZXh0V3JpdGVyVHJlZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sVGV4dFdyaXRlclB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogeG1sRG9jUHRyICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHhtbE5vZGVQdHIgb3IgTlVMTCBmb3IgZG9jLT5jaGlsZHJlbiAqLwogICAgaW50IG5fbm9kZTsKICAgIGludCBjb21wcmVzc2lvbjsgLyogY29tcHJlc3MgdGhlIG91dHB1dD8gKi8KICAgIGludCBuX2NvbXByZXNzaW9uOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9jb21wcmVzc2lvbiA9IDA7bl9jb21wcmVzc2lvbiA8IGdlbl9uYl9pbnQ7bl9jb21wcmVzc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKICAgICAgICBjb21wcmVzc2lvbiA9IGdlbl9pbnQobl9jb21wcmVzc2lvbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdUZXh0V3JpdGVyVHJlZShkb2MsIG5vZGUsIGNvbXByZXNzaW9uKTsKICAgICAgICBkZXNyZXRfeG1sVGV4dFdyaXRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOwogICAgICAgIGRlc19pbnQobl9jb21wcmVzc2lvbiwgY29tcHJlc3Npb24sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3VGV4dFdyaXRlclRyZWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcHJlc3Npb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kQXR0cmlidXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlckVuZEF0dHJpYnV0ZSh3cml0ZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlckVuZEF0dHJpYnV0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kQ0RBVEEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyRW5kQ0RBVEEod3JpdGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJFbmRDREFUQSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kQ29tbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJFbmRDb21tZW50KHdyaXRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyRW5kQ29tbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRFREKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlckVuZERURCh3cml0ZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlckVuZERURCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRFREQXR0bGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJFbmREVERBdHRsaXN0KHdyaXRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyRW5kRFREQXR0bGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRFRERWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJFbmREVERFbGVtZW50KHdyaXRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyRW5kRFRERWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRFRERW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlckVuZERUREVudGl0eSh3cml0ZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlckVuZERUREVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRG9jdW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyRW5kRG9jdW1lbnQod3JpdGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJFbmREb2N1bWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50KHdyaXRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kUEkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyRW5kUEkod3JpdGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJFbmRQSSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRmx1c2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyRmx1c2god3JpdGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJGbHVzaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRnVsbEVuZEVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyRnVsbEVuZEVsZW1lbnQod3JpdGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJGdWxsRW5kRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU2V0SW5kZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgaW50IGluZGVudDsgLyogZG8gaW5kZW50YXRpb24/ICovCiAgICBpbnQgbl9pbmRlbnQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5faW5kZW50ID0gMDtuX2luZGVudCA8IGdlbl9uYl9pbnQ7bl9pbmRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIGluZGVudCA9IGdlbl9pbnQobl9pbmRlbnQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclNldEluZGVudCh3cml0ZXIsIGluZGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2ludChuX2luZGVudCwgaW5kZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJTZXRJbmRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luZGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJTZXRJbmRlbnRTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgeG1sQ2hhciBzdHJpbmcgKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclNldEluZGVudFN0cmluZyh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopc3RyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJTZXRJbmRlbnRTdHJpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJTdGFydEF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0QXR0cmlidXRlKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlclN0YXJ0QXR0cmlidXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0QXR0cmlidXRlTlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4IG9yIE5VTEwgKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IGxvY2FsIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiBuYW1lc3BhY2UgVVJJIG9yIE5VTEwgKi8KICAgIGludCBuX25hbWVzcGFjZVVSSTsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lc3BhY2VVUkkgPSAwO25fbmFtZXNwYWNlVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZXNwYWNlVVJJKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBuYW1lc3BhY2VVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0QXR0cmlidXRlTlMod3JpdGVyLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIChjb25zdCB4bWxDaGFyICopbmFtZXNwYWNlVVJJLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJTdGFydEF0dHJpYnV0ZU5TIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lc3BhY2VVUkkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnRDREFUQSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJTdGFydENEQVRBKHdyaXRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnRDREFUQSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnRDb21tZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0Q29tbWVudCh3cml0ZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlclN0YXJ0Q29tbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnREVEQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBwdWJpZDsgLyogdGhlIHB1YmxpYyBpZGVudGlmaWVyLCB3aGljaCBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc3lzdGVtIGlkZW50aWZpZXIgKi8KICAgIGludCBuX3B1YmlkOwogICAgeG1sQ2hhciAqIHN5c2lkOyAvKiB0aGUgc3lzdGVtIGlkZW50aWZpZXIsIHdoaWNoIGlzIHRoZSBVUkkgb2YgdGhlIERURCAqLwogICAgaW50IG5fc3lzaWQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcHViaWQgPSAwO25fcHViaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJpZCsrKSB7CiAgICBmb3IgKG5fc3lzaWQgPSAwO25fc3lzaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXNpZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHB1YmlkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViaWQsIDIpOwogICAgICAgIHN5c2lkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzaWQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0RFREKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXB1YmlkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3B1YmlkLCAoY29uc3QgeG1sQ2hhciAqKXB1YmlkLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNpZCwgKGNvbnN0IHhtbENoYXIgKilzeXNpZCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnREVEQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzaWQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnREVERBdHRsaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgQVRUTElTVCAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyU3RhcnREVERBdHRsaXN0KHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlclN0YXJ0RFREQXR0bGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJTdGFydERUREVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBlbGVtZW50ICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJTdGFydERUREVsZW1lbnQod3JpdGVyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnREVERFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RFRERW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgaW50IHBlOyAvKiBUUlVFIGlmIHRoaXMgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCBGQUxTRSBpZiBub3QgKi8KICAgIGludCBuX3BlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgQVRUTElTVCAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wZSA9IDA7bl9wZSA8IGdlbl9uYl9pbnQ7bl9wZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgcGUgPSBnZW5faW50KG5fcGUsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJTdGFydERUREVudGl0eSh3cml0ZXIsIHBlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19pbnQobl9wZSwgcGUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnREVERFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnREb2N1bWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIGNoYXIgKiB2ZXJzaW9uOyAvKiB0aGUgeG1sIHZlcnNpb24gKCIxLjAiKSBvciBOVUxMIGZvciBkZWZhdWx0ICgiMS4wIikgKi8KICAgIGludCBuX3ZlcnNpb247CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBvciBOVUxMIGZvciBkZWZhdWx0ICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGNoYXIgKiBzdGFuZGFsb25lOyAvKiAieWVzIiBvciAibm8iIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8KICAgIGludCBuX3N0YW5kYWxvbmU7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fdmVyc2lvbiA9IDA7bl92ZXJzaW9uIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fdmVyc2lvbisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fc3RhbmRhbG9uZSA9IDA7bl9zdGFuZGFsb25lIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fc3RhbmRhbG9uZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgdmVyc2lvbiA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3ZlcnNpb24sIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIHN0YW5kYWxvbmUgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9zdGFuZGFsb25lLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJTdGFydERvY3VtZW50KHdyaXRlciwgKGNvbnN0IGNoYXIgKil2ZXJzaW9uLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAoY29uc3QgY2hhciAqKXN0YW5kYWxvbmUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3ZlcnNpb24sIChjb25zdCBjaGFyICopdmVyc2lvbiwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3N0YW5kYWxvbmUsIChjb25zdCBjaGFyICopc3RhbmRhbG9uZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnREb2N1bWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmVyc2lvbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFuZGFsb25lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50TlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4IG9yIE5VTEwgKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IGxvY2FsIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiBuYW1lc3BhY2UgVVJJIG9yIE5VTEwgKi8KICAgIGludCBuX25hbWVzcGFjZVVSSTsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lc3BhY2VVUkkgPSAwO25fbmFtZXNwYWNlVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZXNwYWNlVVJJKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBuYW1lc3BhY2VVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudE5TKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lc3BhY2VVUkkpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50TlMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVzcGFjZVVSSSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJTdGFydFBJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgeG1sQ2hhciAqIHRhcmdldDsgLyogUEkgdGFyZ2V0ICovCiAgICBpbnQgbl90YXJnZXQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fdGFyZ2V0ID0gMDtuX3RhcmdldCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3RhcmdldCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgdGFyZ2V0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdGFyZ2V0LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJTdGFydFBJKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKil0YXJnZXQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3RhcmdldCwgKGNvbnN0IHhtbENoYXIgKil0YXJnZXQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlclN0YXJ0UEkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhcmdldCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBhdHRyaWJ1dGUgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlTlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4ICovCiAgICBpbnQgbl9wcmVmaXg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogYXR0cmlidXRlIGxvY2FsIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiBuYW1lc3BhY2UgVVJJICovCiAgICBpbnQgbl9uYW1lc3BhY2VVUkk7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogYXR0cmlidXRlIGNvbnRlbnQgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbmFtZXNwYWNlVVJJID0gMDtuX25hbWVzcGFjZVVSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWVzcGFjZVVSSSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CiAgICAgICAgbmFtZXNwYWNlVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAzKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVBdHRyaWJ1dGVOUyh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZU5TIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lc3BhY2VVUkkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUJhc2U2NCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIGNoYXIgKiBkYXRhOyAvKiBiaW5hcnkgZGF0YSAqLwogICAgaW50IG5fZGF0YTsKICAgIGludCBzdGFydDsgLyogdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgZGF0YSBvZiB0aGUgZmlyc3QgYnl0ZSB0byBlbmNvZGUgKi8KICAgIGludCBuX3N0YXJ0OwogICAgaW50IGxlbjsgLyogdGhlIG51bWJlciBvZiBieXRlcyB0byBlbmNvZGUgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9kYXRhKyspIHsKICAgIGZvciAobl9zdGFydCA9IDA7bl9zdGFydCA8IGdlbl9uYl9pbnQ7bl9zdGFydCsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIGRhdGEgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9kYXRhLCAxKTsKICAgICAgICBzdGFydCA9IGdlbl9pbnQobl9zdGFydCwgMik7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVCYXNlNjQod3JpdGVyLCAoY29uc3QgY2hhciAqKWRhdGEsIHN0YXJ0LCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2RhdGEsIChjb25zdCBjaGFyICopZGF0YSwgMSk7CiAgICAgICAgZGVzX2ludChuX3N0YXJ0LCBzdGFydCwgMik7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZUJhc2U2NCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFydCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVCaW5IZXgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICBjaGFyICogZGF0YTsgLyogYmluYXJ5IGRhdGEgKi8KICAgIGludCBuX2RhdGE7CiAgICBpbnQgc3RhcnQ7IC8qIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIGRhdGEgb2YgdGhlIGZpcnN0IGJ5dGUgdG8gZW5jb2RlICovCiAgICBpbnQgbl9zdGFydDsKICAgIGludCBsZW47IC8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZW5jb2RlICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZGF0YSsrKSB7CiAgICBmb3IgKG5fc3RhcnQgPSAwO25fc3RhcnQgPCBnZW5fbmJfaW50O25fc3RhcnQrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBkYXRhID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZGF0YSwgMSk7CiAgICAgICAgc3RhcnQgPSBnZW5faW50KG5fc3RhcnQsIDIpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlQmluSGV4KHdyaXRlciwgKGNvbnN0IGNoYXIgKilkYXRhLCBzdGFydCwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9kYXRhLCAoY29uc3QgY2hhciAqKWRhdGEsIDEpOwogICAgICAgIGRlc19pbnQobl9zdGFydCwgc3RhcnQsIDIpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyV3JpdGVCaW5IZXgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RhcnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQ0RBVEEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogQ0RBVEEgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVDREFUQSh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZUNEQVRBIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQ29tbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBjb21tZW50IHN0cmluZyAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVDb21tZW50KHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlQ29tbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURURCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgRFREICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHB1YmlkOyAvKiB0aGUgcHVibGljIGlkZW50aWZpZXIsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzeXN0ZW0gaWRlbnRpZmllciAqLwogICAgaW50IG5fcHViaWQ7CiAgICB4bWxDaGFyICogc3lzaWQ7IC8qIHRoZSBzeXN0ZW0gaWRlbnRpZmllciwgd2hpY2ggaXMgdGhlIFVSSSBvZiB0aGUgRFREICovCiAgICBpbnQgbl9zeXNpZDsKICAgIHhtbENoYXIgKiBzdWJzZXQ7IC8qIHN0cmluZyBjb250ZW50IG9mIHRoZSBEVEQgKi8KICAgIGludCBuX3N1YnNldDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9wdWJpZCA9IDA7bl9wdWJpZCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3B1YmlkKyspIHsKICAgIGZvciAobl9zeXNpZCA9IDA7bl9zeXNpZCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N5c2lkKyspIHsKICAgIGZvciAobl9zdWJzZXQgPSAwO25fc3Vic2V0IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3Vic2V0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgcHViaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJpZCwgMik7CiAgICAgICAgc3lzaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNpZCwgMyk7CiAgICAgICAgc3Vic2V0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3Vic2V0LCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJXcml0ZURURCh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilwdWJpZCwgKGNvbnN0IHhtbENoYXIgKilzeXNpZCwgKGNvbnN0IHhtbENoYXIgKilzdWJzZXQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViaWQsIChjb25zdCB4bWxDaGFyICopcHViaWQsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkLCAzKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdWJzZXQsIChjb25zdCB4bWxDaGFyICopc3Vic2V0LCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZURURCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wdWJpZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zeXNpZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdWJzZXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVEVERBdHRsaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgQVRUTElTVCAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBjb250ZW50IG9mIHRoZSBBVFRMSVNUICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVEVERBdHRsaXN0KHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZURUREF0dGxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURUREVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBlbGVtZW50ICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJXcml0ZURUREVsZW1lbnQod3JpdGVyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlRFRERWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRFRERW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgaW50IHBlOyAvKiBUUlVFIGlmIHRoaXMgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCBGQUxTRSBpZiBub3QgKi8KICAgIGludCBuX3BlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgZW50aXR5ICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHB1YmlkOyAvKiB0aGUgcHVibGljIGlkZW50aWZpZXIsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzeXN0ZW0gaWRlbnRpZmllciAqLwogICAgaW50IG5fcHViaWQ7CiAgICB4bWxDaGFyICogc3lzaWQ7IC8qIHRoZSBzeXN0ZW0gaWRlbnRpZmllciwgd2hpY2ggaXMgdGhlIFVSSSBvZiB0aGUgRFREICovCiAgICBpbnQgbl9zeXNpZDsKICAgIHhtbENoYXIgKiBuZGF0YWlkOyAvKiB0aGUgeG1sIG5vdGF0aW9uIG5hbWUuICovCiAgICBpbnQgbl9uZGF0YWlkOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGNvbnRlbnQgb2YgdGhlIGVudGl0eSAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wZSA9IDA7bl9wZSA8IGdlbl9uYl9pbnQ7bl9wZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcHViaWQgPSAwO25fcHViaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJpZCsrKSB7CiAgICBmb3IgKG5fc3lzaWQgPSAwO25fc3lzaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXNpZCsrKSB7CiAgICBmb3IgKG5fbmRhdGFpZCA9IDA7bl9uZGF0YWlkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmRhdGFpZCsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgcGUgPSBnZW5faW50KG5fcGUsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBwdWJpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3B1YmlkLCAzKTsKICAgICAgICBzeXNpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCA0KTsKICAgICAgICBuZGF0YWlkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmRhdGFpZCwgNSk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDYpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlRFRERW50aXR5KHdyaXRlciwgcGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilwdWJpZCwgKGNvbnN0IHhtbENoYXIgKilzeXNpZCwgKGNvbnN0IHhtbENoYXIgKiluZGF0YWlkLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19pbnQobl9wZSwgcGUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViaWQsIChjb25zdCB4bWxDaGFyICopcHViaWQsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkLCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uZGF0YWlkLCAoY29uc3QgeG1sQ2hhciAqKW5kYXRhaWQsIDUpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgNik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyV3JpdGVEVERFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmRhdGFpZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRFRERXh0ZXJuYWxFbnRpdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICBpbnQgcGU7IC8qIFRSVUUgaWYgdGhpcyBpcyBhIHBhcmFtZXRlciBlbnRpdHksIEZBTFNFIGlmIG5vdCAqLwogICAgaW50IG5fcGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBlbnRpdHkgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogcHViaWQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgd2hpY2ggaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCiAgICBpbnQgbl9wdWJpZDsKICAgIHhtbENoYXIgKiBzeXNpZDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyLCB3aGljaCBpcyB0aGUgVVJJIG9mIHRoZSBEVEQgKi8KICAgIGludCBuX3N5c2lkOwogICAgeG1sQ2hhciAqIG5kYXRhaWQ7IC8qIHRoZSB4bWwgbm90YXRpb24gbmFtZS4gKi8KICAgIGludCBuX25kYXRhaWQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fcGUgPSAwO25fcGUgPCBnZW5fbmJfaW50O25fcGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3B1YmlkID0gMDtuX3B1YmlkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHViaWQrKykgewogICAgZm9yIChuX3N5c2lkID0gMDtuX3N5c2lkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzaWQrKykgewogICAgZm9yIChuX25kYXRhaWQgPSAwO25fbmRhdGFpZCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25kYXRhaWQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIHBlID0gZ2VuX2ludChuX3BlLCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CiAgICAgICAgcHViaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJpZCwgMyk7CiAgICAgICAgc3lzaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNpZCwgNCk7CiAgICAgICAgbmRhdGFpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25kYXRhaWQsIDUpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlRFRERXh0ZXJuYWxFbnRpdHkod3JpdGVyLCBwZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXB1YmlkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkLCAoY29uc3QgeG1sQ2hhciAqKW5kYXRhaWQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19pbnQobl9wZSwgcGUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViaWQsIChjb25zdCB4bWxDaGFyICopcHViaWQsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkLCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uZGF0YWlkLCAoY29uc3QgeG1sQ2hhciAqKW5kYXRhaWQsIDUpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlRFRERXh0ZXJuYWxFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmRhdGFpZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURUREV4dGVybmFsRW50aXR5Q29udGVudHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogcHViaWQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgd2hpY2ggaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCiAgICBpbnQgbl9wdWJpZDsKICAgIHhtbENoYXIgKiBzeXNpZDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyLCB3aGljaCBpcyB0aGUgVVJJIG9mIHRoZSBEVEQgKi8KICAgIGludCBuX3N5c2lkOwogICAgeG1sQ2hhciAqIG5kYXRhaWQ7IC8qIHRoZSB4bWwgbm90YXRpb24gbmFtZS4gKi8KICAgIGludCBuX25kYXRhaWQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fcHViaWQgPSAwO25fcHViaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJpZCsrKSB7CiAgICBmb3IgKG5fc3lzaWQgPSAwO25fc3lzaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXNpZCsrKSB7CiAgICBmb3IgKG5fbmRhdGFpZCA9IDA7bl9uZGF0YWlkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmRhdGFpZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgcHViaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJpZCwgMSk7CiAgICAgICAgc3lzaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNpZCwgMik7CiAgICAgICAgbmRhdGFpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25kYXRhaWQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlRFRERXh0ZXJuYWxFbnRpdHlDb250ZW50cyh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopcHViaWQsIChjb25zdCB4bWxDaGFyICopc3lzaWQsIChjb25zdCB4bWxDaGFyICopbmRhdGFpZCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViaWQsIChjb25zdCB4bWxDaGFyICopcHViaWQsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uZGF0YWlkLCAoY29uc3QgeG1sQ2hhciAqKW5kYXRhaWQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlRFRERXh0ZXJuYWxFbnRpdHlDb250ZW50cyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmRhdGFpZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURUREludGVybmFsRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgaW50IHBlOyAvKiBUUlVFIGlmIHRoaXMgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCBGQUxTRSBpZiBub3QgKi8KICAgIGludCBuX3BlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgZW50aXR5ICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGNvbnRlbnQgb2YgdGhlIGVudGl0eSAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wZSA9IDA7bl9wZSA8IGdlbl9uYl9pbnQ7bl9wZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgcGUgPSBnZW5faW50KG5fcGUsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVEVERJbnRlcm5hbEVudGl0eSh3cml0ZXIsIHBlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2ludChuX3BlLCBwZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlRFRESW50ZXJuYWxFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURURE5vdGF0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB4bWwgbm90YXRpb24gKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogcHViaWQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgd2hpY2ggaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCiAgICBpbnQgbl9wdWJpZDsKICAgIHhtbENoYXIgKiBzeXNpZDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyLCB3aGljaCBpcyB0aGUgVVJJIG9mIHRoZSBEVEQgKi8KICAgIGludCBuX3N5c2lkOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3B1YmlkID0gMDtuX3B1YmlkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHViaWQrKykgewogICAgZm9yIChuX3N5c2lkID0gMDtuX3N5c2lkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzaWQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBwdWJpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3B1YmlkLCAyKTsKICAgICAgICBzeXNpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJXcml0ZURURE5vdGF0aW9uKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXB1YmlkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3B1YmlkLCAoY29uc3QgeG1sQ2hhciAqKXB1YmlkLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNpZCwgKGNvbnN0IHhtbENoYXIgKilzeXNpZCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyV3JpdGVEVEROb3RhdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wdWJpZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zeXNpZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogbmFtZTsgLyogZWxlbWVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGVsZW1lbnQgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudCh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50TlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4ICovCiAgICBpbnQgbl9wcmVmaXg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogZWxlbWVudCBsb2NhbCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5hbWVzcGFjZVVSSTsgLyogbmFtZXNwYWNlIFVSSSAqLwogICAgaW50IG5fbmFtZXNwYWNlVVJJOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGVsZW1lbnQgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lc3BhY2VVUkkgPSAwO25fbmFtZXNwYWNlVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZXNwYWNlVVJJKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBuYW1lc3BhY2VVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIDMpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnROUyh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnROUyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZXNwYWNlVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRBdHRyaWJ1dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0QXR0cmlidXRlTlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0Q0RBVEEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0Q29tbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXREVEQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RFREQXR0bGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXREVERFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdERUREludGVybmFsRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudE5TKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdFBJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdFJhdyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlUEkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogdGFyZ2V0OyAvKiBQSSB0YXJnZXQgKi8KICAgIGludCBuX3RhcmdldDsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBQSSBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgZm9yIChuX3RhcmdldCA9IDA7bl90YXJnZXQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl90YXJnZXQrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIHRhcmdldCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3RhcmdldCwgMSk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlUEkod3JpdGVyLCAoY29uc3QgeG1sQ2hhciAqKXRhcmdldCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl90YXJnZXQsIChjb25zdCB4bWxDaGFyICopdGFyZ2V0LCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlUEkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhcmdldCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlUmF3KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRleHQgc3RyaW5nICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJXcml0ZVJhdyh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZVJhdyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVJhd0xlbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0ZXh0IHN0cmluZyAqLwogICAgaW50IG5fY29udGVudDsKICAgIGludCBsZW47IC8qIGxlbmd0aCBvZiB0aGUgdGV4dCBzdHJpbmcgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlUmF3TGVuKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZVJhd0xlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGV4dCBzdHJpbmcgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlU3RyaW5nKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdEF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0QXR0cmlidXRlTlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdENEQVRBKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRDb21tZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXREVEQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdERUREF0dGxpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdERUREVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdERUREludGVybmFsRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRFbGVtZW50TlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdFBJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRSYXcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdFN0cmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbHdyaXRlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sd3JpdGVyIDogNTEgb2YgNzkgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld1RleHRXcml0ZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dFdyaXRlckZpbGVuYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld1RleHRXcml0ZXJNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dFdyaXRlclB1c2hQYXJzZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dFdyaXRlclRyZWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlckVuZEF0dHJpYnV0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kQ0RBVEEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlckVuZENvbW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlckVuZERURCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kRFREQXR0bGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kRFRERWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kRFRERW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJFbmREb2N1bWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kUEkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlckZsdXNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJGdWxsRW5kRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyU2V0SW5kZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJTZXRJbmRlbnRTdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0QXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJTdGFydEF0dHJpYnV0ZU5TKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJTdGFydENEQVRBKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJTdGFydENvbW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RFREKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJTdGFydERUREF0dGxpc3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RFRERWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyU3RhcnREVERFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RG9jdW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50TlMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0UEkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZU5TKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUJhc2U2NCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVCaW5IZXgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQ0RBVEEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQ29tbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVEVEQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRFREQXR0bGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVEVERFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURUREVudGl0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVEVERFeHRlcm5hbEVudGl0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVEVERFeHRlcm5hbEVudGl0eUNvbnRlbnRzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURUREludGVybmFsRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURURE5vdGF0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudE5TKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdEF0dHJpYnV0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRBdHRyaWJ1dGVOUygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRDREFUQSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRDb21tZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdERURCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXREVERBdHRsaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdERUREVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RFRESW50ZXJuYWxFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50TlMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0UEkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0UmF3KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdFN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVQSSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVSYXcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlUmF3TGVuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0QXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRBdHRyaWJ1dGVOUygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0Q0RBVEEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdENvbW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdERURCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0RFREQXR0bGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0RFRERWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0RFRESW50ZXJuYWxFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdEVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdEVsZW1lbnROUygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0UEkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdFJhdygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0U3RyaW5nKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4bWx3cml0ZXI6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2FzdEJvb2xlYW5Ub051bWJlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBkb3VibGUgcmV0X3ZhbDsKICAgIGludCB2YWw7IC8qIGEgYm9vbGVhbiAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2ludDtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoQ2FzdEJvb2xlYW5Ub051bWJlcih2YWwpOwogICAgICAgIGRlc3JldF9kb3VibGUocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3RCb29sZWFuVG9OdW1iZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0Qm9vbGVhblRvU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgaW50IHZhbDsgLyogYSBib29sZWFuICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9pbnQobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDYXN0Qm9vbGVhblRvU3RyaW5nKHZhbCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDYXN0Qm9vbGVhblRvU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2FzdE5vZGVTZXRUb0Jvb2xlYW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIG5zOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9uczsKCiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5zID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ucywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3ROb2RlU2V0VG9Cb29sZWFuKG5zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25zLCBucywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3ROb2RlU2V0VG9Cb29sZWFuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0Tm9kZVNldFRvTnVtYmVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGRvdWJsZSByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBuczsgLyogYSBub2RlLXNldCAqLwogICAgaW50IG5fbnM7CgogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBucyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbnMsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDYXN0Tm9kZVNldFRvTnVtYmVyKG5zKTsKICAgICAgICBkZXNyZXRfZG91YmxlKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25zLCBucywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3ROb2RlU2V0VG9OdW1iZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENhc3ROb2RlU2V0VG9TdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIG5zOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9uczsKCiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5zID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ucywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3ROb2RlU2V0VG9TdHJpbmcobnMpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ucywgbnMsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDYXN0Tm9kZVNldFRvU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0Tm9kZVRvTnVtYmVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGRvdWJsZSByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoQ2FzdE5vZGVUb051bWJlcihub2RlKTsKICAgICAgICBkZXNyZXRfZG91YmxlKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDYXN0Tm9kZVRvTnVtYmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENhc3ROb2RlVG9TdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDYXN0Tm9kZVRvU3RyaW5nKG5vZGUpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2FzdE5vZGVUb1N0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0TnVtYmVyVG9Cb29sZWFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgZG91YmxlIHZhbDsgLyogYSBudW1iZXIgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9kb3VibGU7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2RvdWJsZShuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3ROdW1iZXJUb0Jvb2xlYW4odmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZG91YmxlKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDYXN0TnVtYmVyVG9Cb29sZWFuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2FzdE51bWJlclRvU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgZG91YmxlIHZhbDsgLyogYSBudW1iZXIgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9kb3VibGU7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2RvdWJsZShuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3ROdW1iZXJUb1N0cmluZyh2YWwpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2RvdWJsZShuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2FzdE51bWJlclRvU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2FzdFN0cmluZ1RvQm9vbGVhbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB2YWw7IC8qIGEgc3RyaW5nICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoQ2FzdFN0cmluZ1RvQm9vbGVhbigoY29uc3QgeG1sQ2hhciAqKXZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAoY29uc3QgeG1sQ2hhciAqKXZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3RTdHJpbmdUb0Jvb2xlYW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0U3RyaW5nVG9OdW1iZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgZG91YmxlIHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsOyAvKiBhIHN0cmluZyAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3RTdHJpbmdUb051bWJlcigoY29uc3QgeG1sQ2hhciAqKXZhbCk7CiAgICAgICAgZGVzcmV0X2RvdWJsZShyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAoY29uc3QgeG1sQ2hhciAqKXZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3RTdHJpbmdUb051bWJlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENhc3RUb0Jvb2xlYW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWw7IC8qIGFuIFhQYXRoIG9iamVjdCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3RUb0Jvb2xlYW4odmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3RUb0Jvb2xlYW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0VG9OdW1iZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgZG91YmxlIHJldF92YWw7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWw7IC8qIGFuIFhQYXRoIG9iamVjdCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3RUb051bWJlcih2YWwpOwogICAgICAgIGRlc3JldF9kb3VibGUocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2FzdFRvTnVtYmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2FzdFRvU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sWFBhdGhPYmplY3RQdHIgdmFsOyAvKiBhbiBYUGF0aCBvYmplY3QgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDYXN0VG9TdHJpbmcodmFsKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2FzdFRvU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ21wTm9kZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGUxOyAvKiB0aGUgZmlyc3Qgbm9kZSAqLwogICAgaW50IG5fbm9kZTE7CiAgICB4bWxOb2RlUHRyIG5vZGUyOyAvKiB0aGUgc2Vjb25kIG5vZGUgKi8KICAgIGludCBuX25vZGUyOwoKICAgIGZvciAobl9ub2RlMSA9IDA7bl9ub2RlMSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZTErKykgewogICAgZm9yIChuX25vZGUyID0gMDtuX25vZGUyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlMSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZTEsIDApOwogICAgICAgIG5vZGUyID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENtcE5vZGVzKG5vZGUxLCBub2RlMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlMSwgbm9kZTEsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ21wTm9kZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENvbXBpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sWFBhdGhDb21wRXhwclB0ciAxCnN0YXRpYyB4bWxYUGF0aENvbXBFeHByUHRyIGdlbl94bWxYUGF0aENvbXBFeHByUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxYUGF0aENvbXBFeHByUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxYUGF0aENvbXBFeHByUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHIgMQpzdGF0aWMgeG1sWFBhdGhDb250ZXh0UHRyIGdlbl94bWxYUGF0aENvbnRleHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFhQYXRoQ29udGV4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sWFBhdGhDb250ZXh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENvbXBpbGVkRXZhbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhDb21wRXhwclB0ciBjb21wOyAvKiB0aGUgY29tcGlsZWQgWFBhdGggZXhwcmVzc2lvbiAqLwogICAgaW50IG5fY29tcDsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHg7IC8qIHRoZSBYUGF0aCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2NvbXAgPSAwO25fY29tcCA8IGdlbl9uYl94bWxYUGF0aENvbXBFeHByUHRyO25fY29tcCsrKSB7CiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29tcCA9IGdlbl94bWxYUGF0aENvbXBFeHByUHRyKG5fY29tcCwgMCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENvbXBpbGVkRXZhbChjb21wLCBjdHgpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29tcEV4cHJQdHIobl9jb21wLCBjb21wLCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4LCBjdHgsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDb21waWxlZEV2YWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENvbnZlcnRCb29sZWFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWw7IC8qIGFuIFhQYXRoIG9iamVjdCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENvbnZlcnRCb29sZWFuKHZhbCk7CiAgICAgICAgdmFsID0gTlVMTDsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ29udmVydEJvb2xlYW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDb252ZXJ0TnVtYmVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWw7IC8qIGFuIFhQYXRoIG9iamVjdCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENvbnZlcnROdW1iZXIodmFsKTsKICAgICAgICB2YWwgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDb252ZXJ0TnVtYmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ29udmVydFN0cmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhPYmplY3RQdHIgdmFsOyAvKiBhbiBYUGF0aCBvYmplY3QgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDb252ZXJ0U3RyaW5nKHZhbCk7CiAgICAgICAgdmFsID0gTlVMTDsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ29udmVydFN0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aEN0eHRDb21waWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRXZhbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIFhQYXRoIGV4cHJlc3Npb24gKi8KICAgIGludCBuX3N0cjsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHg7IC8qIHRoZSBYUGF0aCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aEV2YWwoKGNvbnN0IHhtbENoYXIgKilzdHIsIGN0eCk7CiAgICAgICAgZGVzcmV0X3htbFhQYXRoT2JqZWN0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4LCBjdHgsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhFdmFsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aEV2YWxFeHByZXNzaW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgWFBhdGggZXhwcmVzc2lvbiAqLwogICAgaW50IG5fc3RyOwogICAgeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDApOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aEV2YWxFeHByZXNzaW9uKChjb25zdCB4bWxDaGFyICopc3RyLCBjdHh0KTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKilzdHIsIDApOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRXZhbEV4cHJlc3Npb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aEV2YWxQcmVkaWNhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXM7IC8qIHRoZSBQcmVkaWNhdGUgRXhwcmVzc2lvbiBldmFsdWF0aW9uIHJlc3VsdCAqLwogICAgaW50IG5fcmVzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fcmVzID0gMDtuX3JlcyA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX3JlcysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHJlcyA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3JlcywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aEV2YWxQcmVkaWNhdGUoY3R4dCwgcmVzKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fcmVzLCByZXMsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhFdmFsUHJlZGljYXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhJbml0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICB4bWxYUGF0aEluaXQoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aEluaXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aElzSW5mKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBkb3VibGUgdmFsOyAvKiBhIGRvdWJsZSB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2RvdWJsZTtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5fZG91YmxlKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoSXNJbmYodmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZG91YmxlKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhJc0luZiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aElzTmFOKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBkb3VibGUgdmFsOyAvKiBhIGRvdWJsZSB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2RvdWJsZTtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5fZG91YmxlKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoSXNOYU4odmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZG91YmxlKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhJc05hTiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5ld0NvbnRleHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb2RlU2V0Q3JlYXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgdmFsOyAvKiBhbiBpbml0aWFsIHhtbE5vZGVQdHIsIG9yIE5VTEwgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxOb2RlUHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxOb2RlUHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTm9kZVNldENyZWF0ZSh2YWwpOwogICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9kZVNldENyZWF0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE9iamVjdENvcHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHZhbDsgLyogdGhlIG9yaWdpbmFsIG9iamVjdCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE9iamVjdENvcHkodmFsKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoT2JqZWN0Q29weSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE9yZGVyRG9jRWxlbXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgbG9uZyByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogYW4gaW5wdXQgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE9yZGVyRG9jRWxlbXMoZG9jKTsKICAgICAgICBkZXNyZXRfbG9uZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoT3JkZXJEb2NFbGVtcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3hwYXRoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB4cGF0aCA6IDI4IG9mIDM2IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENhc3RCb29sZWFuVG9OdW1iZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0Qm9vbGVhblRvU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2FzdE5vZGVTZXRUb0Jvb2xlYW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0Tm9kZVNldFRvTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2FzdE5vZGVTZXRUb1N0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENhc3ROb2RlVG9OdW1iZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0Tm9kZVRvU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2FzdE51bWJlclRvQm9vbGVhbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENhc3ROdW1iZXJUb1N0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENhc3RTdHJpbmdUb0Jvb2xlYW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0U3RyaW5nVG9OdW1iZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0VG9Cb29sZWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2FzdFRvTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2FzdFRvU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ21wTm9kZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDb21waWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ29tcGlsZWRFdmFsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ29udmVydEJvb2xlYW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDb252ZXJ0TnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ29udmVydFN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aEN0eHRDb21waWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoRXZhbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aEV2YWxFeHByZXNzaW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoRXZhbFByZWRpY2F0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aEluaXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhJc0luZigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aElzTmFOKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV3Q29udGV4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5vZGVTZXRDcmVhdGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhPYmplY3RDb3B5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoT3JkZXJEb2NFbGVtcygpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgeHBhdGg6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQojaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0ciAxCnN0YXRpYyB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3ZhbHVlUG9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogYW4gWFBhdGggZXZhbHVhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0gdmFsdWVQb3AoY3R4dCk7CiAgICAgICAgZGVzcmV0X3htbFhQYXRoT2JqZWN0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB2YWx1ZVBvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfdmFsdWVQdXNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIGFuIFhQYXRoIGV2YWx1YXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHZhbHVlOyAvKiB0aGUgWFBhdGggb2JqZWN0ICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICB2YWx1ZSA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbHVlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHZhbHVlUHVzaChjdHh0LCB2YWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3ZhbHVlLCB2YWx1ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB2YWx1ZVB1c2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQWRkVmFsdWVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoQWRkVmFsdWVzKGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aEFkZFZhbHVlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhCb29sZWFuRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoQm9vbGVhbkZ1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhCb29sZWFuRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2VpbGluZ0Z1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aENlaWxpbmdGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2VpbGluZ0Z1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENvbXBhcmVWYWx1ZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IGluZjsgLyogbGVzcyB0aGFuICgxKSBvciBncmVhdGVyIHRoYW4gKDApICovCiAgICBpbnQgbl9pbmY7CiAgICBpbnQgc3RyaWN0OyAvKiBpcyB0aGUgY29tcGFyaXNvbiBzdHJpY3QgKi8KICAgIGludCBuX3N0cmljdDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2luZiA9IDA7bl9pbmYgPCBnZW5fbmJfaW50O25faW5mKyspIHsKICAgIGZvciAobl9zdHJpY3QgPSAwO25fc3RyaWN0IDwgZ2VuX25iX2ludDtuX3N0cmljdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGluZiA9IGdlbl9pbnQobl9pbmYsIDEpOwogICAgICAgIHN0cmljdCA9IGdlbl9pbnQobl9zdHJpY3QsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDb21wYXJlVmFsdWVzKGN0eHQsIGluZiwgc3RyaWN0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX2luZiwgaW5mLCAxKTsKICAgICAgICBkZXNfaW50KG5fc3RyaWN0LCBzdHJpY3QsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDb21wYXJlVmFsdWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5mKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cmljdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ29uY2F0RnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoQ29uY2F0RnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENvbmNhdEZ1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENvbnRhaW5zRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoQ29udGFpbnNGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ29udGFpbnNGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDb3VudEZ1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aENvdW50RnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENvdW50RnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRGVidWdEdW1wQ29tcEV4cHIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIEZJTEUgKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sWFBhdGhDb21wRXhwclB0ciBjb21wOyAvKiB0aGUgcHJlY29tcGlsZWQgWFBhdGggZXhwcmVzc2lvbiAqLwogICAgaW50IG5fY29tcDsKICAgIGludCBkZXB0aDsgLyogdGhlIGluZGVudGF0aW9uIGxldmVsLiAqLwogICAgaW50IG5fZGVwdGg7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX2NvbXAgPSAwO25fY29tcCA8IGdlbl9uYl94bWxYUGF0aENvbXBFeHByUHRyO25fY29tcCsrKSB7CiAgICBmb3IgKG5fZGVwdGggPSAwO25fZGVwdGggPCBnZW5fbmJfaW50O25fZGVwdGgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBjb21wID0gZ2VuX3htbFhQYXRoQ29tcEV4cHJQdHIobl9jb21wLCAxKTsKICAgICAgICBkZXB0aCA9IGdlbl9pbnQobl9kZXB0aCwgMik7CgogICAgICAgIHhtbFhQYXRoRGVidWdEdW1wQ29tcEV4cHIob3V0cHV0LCBjb21wLCBkZXB0aCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhDb21wRXhwclB0cihuX2NvbXAsIGNvbXAsIDEpOwogICAgICAgIGRlc19pbnQobl9kZXB0aCwgZGVwdGgsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhEZWJ1Z0R1bXBDb21wRXhwciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZXB0aCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRGVidWdEdW1wT2JqZWN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogdG8gZHVtcCB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl9vdXRwdXQ7CiAgICB4bWxYUGF0aE9iamVjdFB0ciBjdXI7IC8qIHRoZSBvYmplY3QgdG8gaW5zcGVjdCAqLwogICAgaW50IG5fY3VyOwogICAgaW50IGRlcHRoOyAvKiBpbmRlbnRhdGlvbiBsZXZlbCAqLwogICAgaW50IG5fZGVwdGg7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2RlcHRoID0gMDtuX2RlcHRoIDwgZ2VuX25iX2ludDtuX2RlcHRoKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dHB1dCA9IGdlbl9GSUxFX3B0cihuX291dHB1dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fY3VyLCAxKTsKICAgICAgICBkZXB0aCA9IGdlbl9pbnQobl9kZXB0aCwgMik7CgogICAgICAgIHhtbFhQYXRoRGVidWdEdW1wT2JqZWN0KG91dHB1dCwgY3VyLCBkZXB0aCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgZGVzX2ludChuX2RlcHRoLCBkZXB0aCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aERlYnVnRHVtcE9iamVjdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlcHRoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhEaWZmZXJlbmNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMxOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9ub2RlczE7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMjsgLyogYSBub2RlLXNldCAqLwogICAgaW50IG5fbm9kZXMyOwoKICAgIGZvciAobl9ub2RlczEgPSAwO25fbm9kZXMxIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczErKykgewogICAgZm9yIChuX25vZGVzMiA9IDA7bl9ub2RlczIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlczEgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMSwgMCk7CiAgICAgICAgbm9kZXMyID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhEaWZmZXJlbmNlKG5vZGVzMSwgbm9kZXMyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIG5vZGVzMSwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIG5vZGVzMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aERpZmZlcmVuY2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRGlzdGluY3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBub2RlczsgLyogYSBub2RlLXNldCAqLwogICAgaW50IG5fbm9kZXM7CgogICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlcyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhEaXN0aW5jdChub2Rlcyk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMsIG5vZGVzLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRGlzdGluY3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aERpc3RpbmN0U29ydGVkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXM7IC8qIGEgbm9kZS1zZXQsIHNvcnRlZCBieSBkb2N1bWVudCBvcmRlciAqLwogICAgaW50IG5fbm9kZXM7CgogICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlcyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhEaXN0aW5jdFNvcnRlZChub2Rlcyk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMsIG5vZGVzLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRGlzdGluY3RTb3J0ZWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aERpdlZhbHVlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICB4bWxYUGF0aERpdlZhbHVlcyhjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhEaXZWYWx1ZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRXF1YWxWYWx1ZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhFcXVhbFZhbHVlcyhjdHh0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aEVxdWFsVmFsdWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aEVycih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogYSBYUGF0aCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBlcnJvcjsgLyogdGhlIGVycm9yIGNvZGUgKi8KICAgIGludCBuX2Vycm9yOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZXJyb3IgPSAwO25fZXJyb3IgPCBnZW5fbmJfaW50O25fZXJyb3IrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBlcnJvciA9IGdlbl9pbnQobl9lcnJvciwgMSk7CgogICAgICAgIHhtbFhQYXRoRXJyKGN0eHQsIGVycm9yKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9lcnJvciwgZXJyb3IsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhFcnIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lcnJvcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRXZhbEV4cHIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sWFBhdGhFdmFsRXhwcihjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhFdmFsRXhwciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhFdmFsdWF0ZVByZWRpY2F0ZVJlc3VsdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXM7IC8qIHRoZSBQcmVkaWNhdGUgRXhwcmVzc2lvbiBldmFsdWF0aW9uIHJlc3VsdCAqLwogICAgaW50IG5fcmVzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fcmVzID0gMDtuX3JlcyA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX3JlcysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHJlcyA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3JlcywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aEV2YWx1YXRlUHJlZGljYXRlUmVzdWx0KGN0eHQsIHJlcyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3JlcywgcmVzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRXZhbHVhdGVQcmVkaWNhdGVSZXN1bHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aEZhbHNlRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoRmFsc2VGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRmFsc2VGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhGbG9vckZ1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aEZsb29yRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aEZsb29yRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRnVuY3Rpb25Mb29rdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhGdW5jdGlvbkxvb2t1cE5TKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoSGFzU2FtZU5vZGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBub2RlczE7IC8qIGEgbm9kZS1zZXQgKi8KICAgIGludCBuX25vZGVzMTsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMyOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9ub2RlczI7CgogICAgZm9yIChuX25vZGVzMSA9IDA7bl9ub2RlczEgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMSsrKSB7CiAgICBmb3IgKG5fbm9kZXMyID0gMDtuX25vZGVzMiA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzMSA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCAwKTsKICAgICAgICBub2RlczIgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aEhhc1NhbWVOb2Rlcyhub2RlczEsIG5vZGVzMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIG5vZGVzMSwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIG5vZGVzMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aEhhc1NhbWVOb2RlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlczEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhJZEZ1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aElkRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aElkRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoSW50ZXJzZWN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMxOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9ub2RlczE7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMjsgLyogYSBub2RlLXNldCAqLwogICAgaW50IG5fbm9kZXMyOwoKICAgIGZvciAobl9ub2RlczEgPSAwO25fbm9kZXMxIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczErKykgewogICAgZm9yIChuX25vZGVzMiA9IDA7bl9ub2RlczIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlczEgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMSwgMCk7CiAgICAgICAgbm9kZXMyID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhJbnRlcnNlY3Rpb24obm9kZXMxLCBub2RlczIpOwogICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMSwgbm9kZXMxLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMiwgbm9kZXMyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoSW50ZXJzZWN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlczIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aElzTm9kZVR5cGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogbmFtZTsgLyogYSBuYW1lIHN0cmluZyAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aElzTm9kZVR5cGUoKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhJc05vZGVUeXBlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aExhbmdGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhMYW5nRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aExhbmdGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhMYXN0RnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoTGFzdEZ1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhMYXN0RnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTGVhZGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMTsgLyogYSBub2RlLXNldCAqLwogICAgaW50IG5fbm9kZXMxOwogICAgeG1sTm9kZVNldFB0ciBub2RlczI7IC8qIGEgbm9kZS1zZXQgKi8KICAgIGludCBuX25vZGVzMjsKCiAgICBmb3IgKG5fbm9kZXMxID0gMDtuX25vZGVzMSA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMxKyspIHsKICAgIGZvciAobl9ub2RlczIgPSAwO25fbm9kZXMyIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZXMxID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIDApOwogICAgICAgIG5vZGVzMiA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTGVhZGluZyhub2RlczEsIG5vZGVzMik7CiAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCBub2RlczEsIDApOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCBub2RlczIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhMZWFkaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlczIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aExlYWRpbmdTb3J0ZWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBub2RlczE7IC8qIGEgbm9kZS1zZXQsIHNvcnRlZCBieSBkb2N1bWVudCBvcmRlciAqLwogICAgaW50IG5fbm9kZXMxOwogICAgeG1sTm9kZVNldFB0ciBub2RlczI7IC8qIGEgbm9kZS1zZXQsIHNvcnRlZCBieSBkb2N1bWVudCBvcmRlciAqLwogICAgaW50IG5fbm9kZXMyOwoKICAgIGZvciAobl9ub2RlczEgPSAwO25fbm9kZXMxIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczErKykgewogICAgZm9yIChuX25vZGVzMiA9IDA7bl9ub2RlczIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlczEgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMSwgMCk7CiAgICAgICAgbm9kZXMyID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhMZWFkaW5nU29ydGVkKG5vZGVzMSwgbm9kZXMyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIG5vZGVzMSwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIG5vZGVzMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aExlYWRpbmdTb3J0ZWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTG9jYWxOYW1lRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoTG9jYWxOYW1lRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aExvY2FsTmFtZUZ1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE1vZFZhbHVlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICB4bWxYUGF0aE1vZFZhbHVlcyhjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhNb2RWYWx1ZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTXVsdFZhbHVlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICB4bWxYUGF0aE11bHRWYWx1ZXMoY3R4dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTXVsdFZhbHVlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOYW1lc3BhY2VVUklGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhOYW1lc3BhY2VVUklGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmFtZXNwYWNlVVJJRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV3Qm9vbGVhbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgaW50IHZhbDsgLyogdGhlIGJvb2xlYW4gdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9pbnQ7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2ludChuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5ld0Jvb2xlYW4odmFsKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5ld0Jvb2xlYW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXdDU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICBjaGFyICogdmFsOyAvKiB0aGUgY2hhciAqIHZhbHVlICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV3Q1N0cmluZygoY29uc3QgY2hhciAqKXZhbCk7CiAgICAgICAgZGVzcmV0X3htbFhQYXRoT2JqZWN0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl92YWwsIChjb25zdCBjaGFyICopdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmV3Q1N0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5ld0Zsb2F0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICBkb3VibGUgdmFsOyAvKiB0aGUgZG91YmxlIHZhbHVlICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfZG91YmxlO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9kb3VibGUobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXdGbG9hdCh2YWwpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2RvdWJsZShuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmV3RmxvYXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXdOb2RlU2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHZhbDsgLyogdGhlIE5vZGVQdHIgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxOb2RlUHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxOb2RlUHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV3Tm9kZVNldCh2YWwpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5ld05vZGVTZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXdOb2RlU2V0TGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciB2YWw7IC8qIGFuIGV4aXN0aW5nIE5vZGVTZXQgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxOb2RlU2V0UHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV3Tm9kZVNldExpc3QodmFsKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXdOb2RlU2V0TGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5ld1BhcnNlckNvbnRleHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXdTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB2YWw7IC8qIHRoZSB4bWxDaGFyICogdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXdTdHJpbmcoKGNvbnN0IHhtbENoYXIgKil2YWwpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAoY29uc3QgeG1sQ2hhciAqKXZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5ld1N0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5leHRBbmNlc3Rvcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIHRyYXZlcnNhbCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXh0QW5jZXN0b3IoY3R4dCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXh0QW5jZXN0b3IiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5leHRBbmNlc3Rvck9yU2VsZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIHRyYXZlcnNhbCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXh0QW5jZXN0b3JPclNlbGYoY3R4dCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXh0QW5jZXN0b3JPclNlbGYiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5leHRBdHRyaWJ1dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBhdHRyaWJ1dGUgaW4gdGhlIHRyYXZlcnNhbCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXh0QXR0cmlidXRlKGN0eHQsIGN1cik7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmV4dEF0dHJpYnV0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV4dENoaWxkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJhdmVyc2FsICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5leHRDaGlsZChjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHRDaGlsZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV4dERlc2NlbmRhbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlIGluIHRoZSB0cmF2ZXJzYWwgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV4dERlc2NlbmRhbnQoY3R4dCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXh0RGVzY2VuZGFudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV4dERlc2NlbmRhbnRPclNlbGYodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlIGluIHRoZSB0cmF2ZXJzYWwgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV4dERlc2NlbmRhbnRPclNlbGYoY3R4dCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXh0RGVzY2VuZGFudE9yU2VsZiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV4dEZvbGxvd2luZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIHRyYXZlcnNhbCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXh0Rm9sbG93aW5nKGN0eHQsIGN1cik7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmV4dEZvbGxvd2luZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV4dEZvbGxvd2luZ1NpYmxpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlIGluIHRoZSB0cmF2ZXJzYWwgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV4dEZvbGxvd2luZ1NpYmxpbmcoY3R4dCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXh0Rm9sbG93aW5nU2libGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV4dE5hbWVzcGFjZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSBpbiB0aGUgdHJhdmVyc2FsICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5leHROYW1lc3BhY2UoY3R4dCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXh0TmFtZXNwYWNlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXh0UGFyZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJhdmVyc2FsICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5leHRQYXJlbnQoY3R4dCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXh0UGFyZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXh0UHJlY2VkaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJhdmVyc2FsICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5leHRQcmVjZWRpbmcoY3R4dCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXh0UHJlY2VkaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXh0UHJlY2VkaW5nU2libGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIHRyYXZlcnNhbCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXh0UHJlY2VkaW5nU2libGluZyhjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHRQcmVjZWRpbmdTaWJsaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXh0U2VsZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIHRyYXZlcnNhbCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXh0U2VsZihjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHRTZWxmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb2RlTGVhZGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9ub2RlczsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlICovCiAgICBpbnQgbl9ub2RlOwoKICAgIGZvciAobl9ub2RlcyA9IDA7bl9ub2RlcyA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlcyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMsIDApOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOb2RlTGVhZGluZyhub2Rlcywgbm9kZSk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMsIG5vZGVzLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb2RlTGVhZGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2Rlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb2RlTGVhZGluZ1NvcnRlZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiBhIG5vZGUtc2V0LCBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgKi8KICAgIGludCBuX25vZGVzOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlcywgMCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5vZGVMZWFkaW5nU29ydGVkKG5vZGVzLCBub2RlKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2Rlcywgbm9kZXMsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVMZWFkaW5nU29ydGVkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vZGVTZXRBZGQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciBjdXI7IC8qIHRoZSBpbml0aWFsIG5vZGUgc2V0ICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxOb2RlUHRyIHZhbDsgLyogYSBuZXcgeG1sTm9kZVB0ciAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9jdXIrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVNldFB0cihuX2N1ciwgMCk7CiAgICAgICAgdmFsID0gZ2VuX3htbE5vZGVQdHIobl92YWwsIDEpOwoKICAgICAgICB4bWxYUGF0aE5vZGVTZXRBZGQoY3VyLCB2YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3ZhbCwgdmFsLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9kZVNldEFkZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb2RlU2V0QWRkTnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciBjdXI7IC8qIHRoZSBpbml0aWFsIG5vZGUgc2V0ICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBob3N0aW5nIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxOc1B0ciBuczsgLyogYSB0aGUgbmFtZXNwYWNlIG5vZGUgKi8KICAgIGludCBuX25zOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9jdXIrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTnNQdHI7bl9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVNldFB0cihuX2N1ciwgMCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgMik7CgogICAgICAgIHhtbFhQYXRoTm9kZVNldEFkZE5zKGN1ciwgbm9kZSwgbnMpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOwogICAgICAgIGRlc194bWxOc1B0cihuX25zLCBucywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVTZXRBZGROcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTm9kZVNldEFkZFVuaXF1ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIGN1cjsgLyogdGhlIGluaXRpYWwgbm9kZSBzZXQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbE5vZGVQdHIgdmFsOyAvKiBhIG5ldyB4bWxOb2RlUHRyICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxOb2RlUHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlU2V0UHRyKG5fY3VyLCAwKTsKICAgICAgICB2YWwgPSBnZW5feG1sTm9kZVB0cihuX3ZhbCwgMSk7CgogICAgICAgIHhtbFhQYXRoTm9kZVNldEFkZFVuaXF1ZShjdXIsIHZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb2RlU2V0QWRkVW5pcXVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vZGVTZXRDb250YWlucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgY3VyOyAvKiB0aGUgbm9kZS1zZXQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbE5vZGVQdHIgdmFsOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9jdXIrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVNldFB0cihuX2N1ciwgMCk7CiAgICAgICAgdmFsID0gZ2VuX3htbE5vZGVQdHIobl92YWwsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOb2RlU2V0Q29udGFpbnMoY3VyLCB2YWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb2RlU2V0Q29udGFpbnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTm9kZVNldERlbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIGN1cjsgLyogdGhlIGluaXRpYWwgbm9kZSBzZXQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbE5vZGVQdHIgdmFsOyAvKiBhbiB4bWxOb2RlUHRyICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxOb2RlUHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlU2V0UHRyKG5fY3VyLCAwKTsKICAgICAgICB2YWwgPSBnZW5feG1sTm9kZVB0cihuX3ZhbCwgMSk7CgogICAgICAgIHhtbFhQYXRoTm9kZVNldERlbChjdXIsIHZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb2RlU2V0RGVsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vZGVTZXRNZXJnZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIHZhbDE7IC8qIHRoZSBmaXJzdCBOb2RlU2V0IG9yIE5VTEwgKi8KICAgIGludCBuX3ZhbDE7CiAgICB4bWxOb2RlU2V0UHRyIHZhbDI7IC8qIHRoZSBzZWNvbmQgTm9kZVNldCAqLwogICAgaW50IG5fdmFsMjsKCiAgICBmb3IgKG5fdmFsMSA9IDA7bl92YWwxIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl92YWwxKyspIHsKICAgIGZvciAobl92YWwyID0gMDtuX3ZhbDIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX3ZhbDIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsMSA9IGdlbl94bWxOb2RlU2V0UHRyKG5fdmFsMSwgMCk7CiAgICAgICAgdmFsMiA9IGdlbl94bWxOb2RlU2V0UHRyKG5fdmFsMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5vZGVTZXRNZXJnZSh2YWwxLCB2YWwyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl92YWwxLCB2YWwxLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX3ZhbDIsIHZhbDIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb2RlU2V0TWVyZ2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb2RlU2V0UmVtb3ZlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgY3VyOyAvKiB0aGUgaW5pdGlhbCBub2RlIHNldCAqLwogICAgaW50IG5fY3VyOwogICAgaW50IHZhbDsgLyogdGhlIGluZGV4IHRvIHJlbW92ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9jdXIrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlU2V0UHRyKG5fY3VyLCAwKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAxKTsKCiAgICAgICAgeG1sWFBhdGhOb2RlU2V0UmVtb3ZlKGN1ciwgdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9kZVNldFJlbW92ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb2RlU2V0U29ydCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIHNldDsgLyogdGhlIG5vZGUgc2V0ICovCiAgICBpbnQgbl9zZXQ7CgogICAgZm9yIChuX3NldCA9IDA7bl9zZXQgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX3NldCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzZXQgPSBnZW5feG1sTm9kZVNldFB0cihuX3NldCwgMCk7CgogICAgICAgIHhtbFhQYXRoTm9kZVNldFNvcnQoc2V0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9zZXQsIHNldCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVTZXRTb3J0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NldCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTm9kZVRyYWlsaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXM7IC8qIGEgbm9kZS1zZXQgKi8KICAgIGludCBuX25vZGVzOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlcywgMCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5vZGVUcmFpbGluZyhub2Rlcywgbm9kZSk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMsIG5vZGVzLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb2RlVHJhaWxpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTm9kZVRyYWlsaW5nU29ydGVkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXM7IC8qIGEgbm9kZS1zZXQsIHNvcnRlZCBieSBkb2N1bWVudCBvcmRlciAqLwogICAgaW50IG5fbm9kZXM7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fbm9kZXMgPSAwO25fbm9kZXMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZXMgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzLCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTm9kZVRyYWlsaW5nU29ydGVkKG5vZGVzLCBub2RlKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2Rlcywgbm9kZXMsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVUcmFpbGluZ1NvcnRlZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2Rlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb3JtYWxpemVGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhOb3JtYWxpemVGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9ybWFsaXplRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTm90RXF1YWxWYWx1ZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOb3RFcXVhbFZhbHVlcyhjdHh0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vdEVxdWFsVmFsdWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vdEZ1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aE5vdEZ1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb3RGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOc0xvb2t1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIHRoZSBuYW1lc3BhY2UgcHJlZml4IHZhbHVlICovCiAgICBpbnQgbl9wcmVmaXg7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTnNMb29rdXAoY3R4dCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOc0xvb2t1cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTnVtYmVyRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoTnVtYmVyRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE51bWJlckZ1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFBhcnNlTkNOYW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoUGFyc2VOQ05hbWUoY3R4dCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFBhcnNlTkNOYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFBhcnNlTmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aFBhcnNlTmFtZShjdHh0KTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUGFyc2VOYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFBvcEJvb2xlYW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogYW4gWFBhdGggcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aFBvcEJvb2xlYW4oY3R4dCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhQb3BCb29sZWFuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFBvcEV4dGVybmFsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIGFuIFhQYXRoIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhQb3BFeHRlcm5hbChjdHh0KTsKICAgICAgICBkZXNyZXRfdm9pZF9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUG9wRXh0ZXJuYWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUG9wTm9kZVNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogYW4gWFBhdGggcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aFBvcE5vZGVTZXQoY3R4dCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUG9wTm9kZVNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhQb3BOdW1iZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgZG91YmxlIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogYW4gWFBhdGggcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aFBvcE51bWJlcihjdHh0KTsKICAgICAgICBkZXNyZXRfZG91YmxlKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFBvcE51bWJlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhQb3BTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogYW4gWFBhdGggcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aFBvcFN0cmluZyhjdHh0KTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUG9wU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFBvc2l0aW9uRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoUG9zaXRpb25GdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUG9zaXRpb25GdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhSZWdpc3RlckFsbEZ1bmN0aW9ucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoUmVnaXN0ZXJBbGxGdW5jdGlvbnMoY3R4dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUmVnaXN0ZXJBbGxGdW5jdGlvbnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUmVnaXN0ZXJGdW5jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUmVnaXN0ZXJGdW5jTG9va3VwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUmVnaXN0ZXJGdW5jTlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhSZWdpc3Rlck5zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIG5hbWVzcGFjZSBwcmVmaXggKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbENoYXIgKiBuc191cmk7IC8qIHRoZSBuYW1lc3BhY2UgbmFtZSAqLwogICAgaW50IG5fbnNfdXJpOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fbnNfdXJpID0gMDtuX25zX3VyaSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25zX3VyaSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHByZWZpeCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgMSk7CiAgICAgICAgbnNfdXJpID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbnNfdXJpLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoUmVnaXN0ZXJOcyhjdHh0LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgKGNvbnN0IHhtbENoYXIgKiluc191cmkpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uc191cmksIChjb25zdCB4bWxDaGFyICopbnNfdXJpLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUmVnaXN0ZXJOcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uc191cmkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFJlZ2lzdGVyVmFyaWFibGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHZhcmlhYmxlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWx1ZTsgLyogdGhlIHZhcmlhYmxlIHZhbHVlIG9yIE5VTEwgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbHVlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoUmVnaXN0ZXJWYXJpYWJsZShjdHh0LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIHZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl92YWx1ZSwgdmFsdWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhSZWdpc3RlclZhcmlhYmxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUmVnaXN0ZXJWYXJpYWJsZUxvb2t1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFJlZ2lzdGVyVmFyaWFibGVOUyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgdmFyaWFibGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBuc191cmk7IC8qIHRoZSB2YXJpYWJsZSBuYW1lc3BhY2UgVVJJICovCiAgICBpbnQgbl9uc191cmk7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWx1ZTsgLyogdGhlIHZhcmlhYmxlIHZhbHVlIG9yIE5VTEwgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbnNfdXJpID0gMDtuX25zX3VyaSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25zX3VyaSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBuc191cmkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uc191cmksIDIpOwogICAgICAgIHZhbHVlID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsdWUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhSZWdpc3RlclZhcmlhYmxlTlMoY3R4dCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5zX3VyaSwgdmFsdWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25zX3VyaSwgKGNvbnN0IHhtbENoYXIgKiluc191cmksIDIpOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3ZhbHVlLCB2YWx1ZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFJlZ2lzdGVyVmFyaWFibGVOUyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnNfdXJpKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhSZWdpc3RlcmVkRnVuY3NDbGVhbnVwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sWFBhdGhSZWdpc3RlcmVkRnVuY3NDbGVhbnVwKGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFJlZ2lzdGVyZWRGdW5jc0NsZWFudXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUmVnaXN0ZXJlZE5zQ2xlYW51cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoUmVnaXN0ZXJlZE5zQ2xlYW51cChjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhSZWdpc3RlcmVkTnNDbGVhbnVwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFJlZ2lzdGVyZWRWYXJpYWJsZXNDbGVhbnVwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sWFBhdGhSZWdpc3RlcmVkVmFyaWFibGVzQ2xlYW51cChjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhSZWdpc3RlcmVkVmFyaWFibGVzQ2xlYW51cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhSb290KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoUm9vdChjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhSb290IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFJvdW5kRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoUm91bmRGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUm91bmRGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhTdGFydHNXaXRoRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoU3RhcnRzV2l0aEZ1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhTdGFydHNXaXRoRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoU3RyaW5nRXZhbE51bWJlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBkb3VibGUgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHI7IC8qIEEgc3RyaW5nIHRvIHNjYW4gKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhTdHJpbmdFdmFsTnVtYmVyKChjb25zdCB4bWxDaGFyICopc3RyKTsKICAgICAgICBkZXNyZXRfZG91YmxlKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoU3RyaW5nRXZhbE51bWJlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFN0cmluZ0Z1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aFN0cmluZ0Z1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhTdHJpbmdGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhTdHJpbmdMZW5ndGhGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhTdHJpbmdMZW5ndGhGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoU3RyaW5nTGVuZ3RoRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoU3ViVmFsdWVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoU3ViVmFsdWVzKGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFN1YlZhbHVlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhTdWJzdHJpbmdBZnRlckZ1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aFN1YnN0cmluZ0FmdGVyRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFN1YnN0cmluZ0FmdGVyRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoU3Vic3RyaW5nQmVmb3JlRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoU3Vic3RyaW5nQmVmb3JlRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFN1YnN0cmluZ0JlZm9yZUZ1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFN1YnN0cmluZ0Z1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aFN1YnN0cmluZ0Z1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhTdWJzdHJpbmdGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhTdW1GdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhTdW1GdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoU3VtRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoVHJhaWxpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBub2RlczE7IC8qIGEgbm9kZS1zZXQgKi8KICAgIGludCBuX25vZGVzMTsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMyOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9ub2RlczI7CgogICAgZm9yIChuX25vZGVzMSA9IDA7bl9ub2RlczEgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMSsrKSB7CiAgICBmb3IgKG5fbm9kZXMyID0gMDtuX25vZGVzMiA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzMSA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCAwKTsKICAgICAgICBub2RlczIgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aFRyYWlsaW5nKG5vZGVzMSwgbm9kZXMyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIG5vZGVzMSwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIG5vZGVzMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFRyYWlsaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlczIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFRyYWlsaW5nU29ydGVkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMxOyAvKiBhIG5vZGUtc2V0LCBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgKi8KICAgIGludCBuX25vZGVzMTsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMyOyAvKiBhIG5vZGUtc2V0LCBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgKi8KICAgIGludCBuX25vZGVzMjsKCiAgICBmb3IgKG5fbm9kZXMxID0gMDtuX25vZGVzMSA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMxKyspIHsKICAgIGZvciAobl9ub2RlczIgPSAwO25fbm9kZXMyIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZXMxID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIDApOwogICAgICAgIG5vZGVzMiA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoVHJhaWxpbmdTb3J0ZWQobm9kZXMxLCBub2RlczIpOwogICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMSwgbm9kZXMxLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMiwgbm9kZXMyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoVHJhaWxpbmdTb3J0ZWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoVHJhbnNsYXRlRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoVHJhbnNsYXRlRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFRyYW5zbGF0ZUZ1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFRydWVGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhUcnVlRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFRydWVGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhWYWx1ZUZsaXBTaWduKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoVmFsdWVGbGlwU2lnbihjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhWYWx1ZUZsaXBTaWduIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFZhcmlhYmxlTG9va3VwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHZhcmlhYmxlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhWYXJpYWJsZUxvb2t1cChjdHh0LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFZhcmlhYmxlTG9va3VwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoVmFyaWFibGVMb29rdXBOUyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSB2YXJpYWJsZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5zX3VyaTsgLyogdGhlIHZhcmlhYmxlIG5hbWVzcGFjZSBVUkkgKi8KICAgIGludCBuX25zX3VyaTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25zX3VyaSA9IDA7bl9uc191cmkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uc191cmkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbnNfdXJpID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbnNfdXJpLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoVmFyaWFibGVMb29rdXBOUyhjdHh0LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbnNfdXJpKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25zX3VyaSwgKGNvbnN0IHhtbENoYXIgKiluc191cmksIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhWYXJpYWJsZUxvb2t1cE5TIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uc191cmkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFdyYXBDU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICBjaGFyICogdmFsOyAvKiB0aGUgY2hhciAqIHZhbHVlICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfY2hhcl9wdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2NoYXJfcHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoV3JhcENTdHJpbmcodmFsKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jaGFyX3B0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoV3JhcENTdHJpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhXcmFwRXh0ZXJuYWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHZvaWQgKiB2YWw7IC8qIHRoZSB1c2VyIGRhdGEgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl92b2lkX3B0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5fdm9pZF9wdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhXcmFwRXh0ZXJuYWwodmFsKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoV3JhcEV4dGVybmFsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoV3JhcE5vZGVTZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgdmFsOyAvKiB0aGUgTm9kZVB0ciB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbE5vZGVTZXRQdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhXcmFwTm9kZVNldCh2YWwpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFdyYXBOb2RlU2V0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoZXJyb3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlOyAvKiB0aGUgZmlsZSBuYW1lICovCiAgICBpbnQgbl9maWxlOwogICAgaW50IGxpbmU7IC8qIHRoZSBsaW5lIG51bWJlciAqLwogICAgaW50IG5fbGluZTsKICAgIGludCBubzsgLyogdGhlIGVycm9yIG51bWJlciAqLwogICAgaW50IG5fbm87CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9maWxlID0gMDtuX2ZpbGUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlKyspIHsKICAgIGZvciAobl9saW5lID0gMDtuX2xpbmUgPCBnZW5fbmJfaW50O25fbGluZSsrKSB7CiAgICBmb3IgKG5fbm8gPSAwO25fbm8gPCBnZW5fbmJfaW50O25fbm8rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBmaWxlID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZSwgMSk7CiAgICAgICAgbGluZSA9IGdlbl9pbnQobl9saW5lLCAyKTsKICAgICAgICBubyA9IGdlbl9pbnQobl9ubywgMyk7CgogICAgICAgIHhtbFhQYXRoZXJyb3IoY3R4dCwgZmlsZSwgbGluZSwgbm8pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZSwgZmlsZSwgMSk7CiAgICAgICAgZGVzX2ludChuX2xpbmUsIGxpbmUsIDIpOwogICAgICAgIGRlc19pbnQobl9ubywgbm8sIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhlcnJvciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGluZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ubyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeHBhdGhJbnRlcm5hbHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhwYXRoSW50ZXJuYWxzIDogMTA2IG9mIDExNyBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfdmFsdWVQb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfdmFsdWVQdXNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQWRkVmFsdWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQm9vbGVhbkZ1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2VpbGluZ0Z1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ29tcGFyZVZhbHVlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENvbmNhdEZ1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ29udGFpbnNGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENvdW50RnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhEZWJ1Z0R1bXBDb21wRXhwcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aERlYnVnRHVtcE9iamVjdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aERpZmZlcmVuY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhEaXN0aW5jdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aERpc3RpbmN0U29ydGVkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoRGl2VmFsdWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoRXF1YWxWYWx1ZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhFcnIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhFdmFsRXhwcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aEV2YWx1YXRlUHJlZGljYXRlUmVzdWx0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoRmFsc2VGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aEZsb29yRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhGdW5jdGlvbkxvb2t1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aEZ1bmN0aW9uTG9va3VwTlMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhIYXNTYW1lTm9kZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhJZEZ1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoSW50ZXJzZWN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoSXNOb2RlVHlwZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aExhbmdGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aExhc3RGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aExlYWRpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhMZWFkaW5nU29ydGVkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTG9jYWxOYW1lRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhNb2RWYWx1ZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhNdWx0VmFsdWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmFtZXNwYWNlVVJJRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXdCb29sZWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV3Q1N0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5ld0Zsb2F0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV3Tm9kZVNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5ld05vZGVTZXRMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV3UGFyc2VyQ29udGV4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5ld1N0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHRBbmNlc3RvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHRBbmNlc3Rvck9yU2VsZigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHRBdHRyaWJ1dGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXh0Q2hpbGQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXh0RGVzY2VuZGFudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHREZXNjZW5kYW50T3JTZWxmKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV4dEZvbGxvd2luZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHRGb2xsb3dpbmdTaWJsaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV4dE5hbWVzcGFjZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHRQYXJlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXh0UHJlY2VkaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV4dFByZWNlZGluZ1NpYmxpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXh0U2VsZigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5vZGVMZWFkaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm9kZUxlYWRpbmdTb3J0ZWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb2RlU2V0QWRkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm9kZVNldEFkZE5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm9kZVNldEFkZFVuaXF1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5vZGVTZXRDb250YWlucygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5vZGVTZXREZWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb2RlU2V0TWVyZ2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb2RlU2V0UmVtb3ZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm9kZVNldFNvcnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb2RlVHJhaWxpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb2RlVHJhaWxpbmdTb3J0ZWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb3JtYWxpemVGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5vdEVxdWFsVmFsdWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm90RnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOc0xvb2t1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE51bWJlckZ1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUGFyc2VOQ05hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhQYXJzZU5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhQb3BCb29sZWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUG9wRXh0ZXJuYWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhQb3BOb2RlU2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUG9wTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUG9wU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUG9zaXRpb25GdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFJlZ2lzdGVyQWxsRnVuY3Rpb25zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUmVnaXN0ZXJGdW5jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUmVnaXN0ZXJGdW5jTG9va3VwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUmVnaXN0ZXJGdW5jTlMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhSZWdpc3Rlck5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUmVnaXN0ZXJWYXJpYWJsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFJlZ2lzdGVyVmFyaWFibGVMb29rdXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhSZWdpc3RlclZhcmlhYmxlTlMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhSZWdpc3RlcmVkRnVuY3NDbGVhbnVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUmVnaXN0ZXJlZE5zQ2xlYW51cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFJlZ2lzdGVyZWRWYXJpYWJsZXNDbGVhbnVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUm9vdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFJvdW5kRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhTdGFydHNXaXRoRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhTdHJpbmdFdmFsTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoU3RyaW5nRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhTdHJpbmdMZW5ndGhGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFN1YlZhbHVlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFN1YnN0cmluZ0FmdGVyRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhTdWJzdHJpbmdCZWZvcmVGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFN1YnN0cmluZ0Z1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoU3VtRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhUcmFpbGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFRyYWlsaW5nU29ydGVkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoVHJhbnNsYXRlRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhUcnVlRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhWYWx1ZUZsaXBTaWduKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoVmFyaWFibGVMb29rdXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhWYXJpYWJsZUxvb2t1cE5TKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoV3JhcENTdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhXcmFwRXh0ZXJuYWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhXcmFwTm9kZVNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aGVycm9yKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4cGF0aEludGVybmFsczogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ckJ1aWxkTm9kZUxpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aE9iamVjdFB0ciBvYmo7IC8qIHRoZSBYUG9pbnRlciByZXN1bHQgZnJvbSB0aGUgZXZhbHVhdGlvbi4gKi8KICAgIGludCBuX29iajsKCiAgICBmb3IgKG5fb2JqID0gMDtuX29iaiA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX29iaisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvYmogPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl9vYmosIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0ckJ1aWxkTm9kZUxpc3Qob2JqKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fb2JqLCBvYmosIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ckJ1aWxkTm9kZUxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb2JqKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ckV2YWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIFhQb2ludGVyIGV4cHJlc3Npb24gKi8KICAgIGludCBuX3N0cjsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHg7IC8qIHRoZSBYUG9pbnRlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUHRyRXZhbCgoY29uc3QgeG1sQ2hhciAqKXN0ciwgY3R4KTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKilzdHIsIDApOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHgsIGN0eCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyRXZhbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ckV2YWxSYW5nZVByZWRpY2F0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBvaW50ZXIgUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQdHJFdmFsUmFuZ2VQcmVkaWNhdGUoY3R4dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJFdmFsUmFuZ2VQcmVkaWNhdGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1hQVFJfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sTG9jYXRpb25TZXRQdHIgMQpzdGF0aWMgeG1sTG9jYXRpb25TZXRQdHIgZ2VuX3htbExvY2F0aW9uU2V0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxMb2NhdGlvblNldFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTG9jYXRpb25TZXRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJMb2NhdGlvblNldEFkZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbExvY2F0aW9uU2V0UHRyIGN1cjsgLyogdGhlIGluaXRpYWwgcmFuZ2Ugc2V0ICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWw7IC8qIGEgbmV3IHhtbFhQYXRoT2JqZWN0UHRyICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTG9jYXRpb25TZXRQdHI7bl9jdXIrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbExvY2F0aW9uU2V0UHRyKG5fY3VyLCAwKTsKICAgICAgICB2YWwgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl92YWwsIDEpOwoKICAgICAgICB4bWxYUHRyTG9jYXRpb25TZXRBZGQoY3VyLCB2YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTG9jYXRpb25TZXRQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ckxvY2F0aW9uU2V0QWRkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUHRyTG9jYXRpb25TZXRDcmVhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ckxvY2F0aW9uU2V0RGVsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBUUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTG9jYXRpb25TZXRQdHIgY3VyOyAvKiB0aGUgaW5pdGlhbCByYW5nZSBzZXQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHZhbDsgLyogYW4geG1sWFBhdGhPYmplY3RQdHIgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxMb2NhdGlvblNldFB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTG9jYXRpb25TZXRQdHIobl9jdXIsIDApOwogICAgICAgIHZhbCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgMSk7CgogICAgICAgIHhtbFhQdHJMb2NhdGlvblNldERlbChjdXIsIHZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMb2NhdGlvblNldFB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl92YWwsIHZhbCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyTG9jYXRpb25TZXREZWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJMb2NhdGlvblNldE1lcmdlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJMb2NhdGlvblNldFJlbW92ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbExvY2F0aW9uU2V0UHRyIGN1cjsgLyogdGhlIGluaXRpYWwgcmFuZ2Ugc2V0ICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgdmFsOyAvKiB0aGUgaW5kZXggdG8gcmVtb3ZlICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTG9jYXRpb25TZXRQdHI7bl9jdXIrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxMb2NhdGlvblNldFB0cihuX2N1ciwgMCk7CiAgICAgICAgdmFsID0gZ2VuX2ludChuX3ZhbCwgMSk7CgogICAgICAgIHhtbFhQdHJMb2NhdGlvblNldFJlbW92ZShjdXIsIHZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMb2NhdGlvblNldFB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfaW50KG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ckxvY2F0aW9uU2V0UmVtb3ZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUHRyTmV3Q29sbGFwc2VkUmFuZ2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBzdGFydDsgLyogdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgbm9kZSAqLwogICAgaW50IG5fc3RhcnQ7CgogICAgZm9yIChuX3N0YXJ0ID0gMDtuX3N0YXJ0IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9zdGFydCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdGFydCA9IGdlbl94bWxOb2RlUHRyKG5fc3RhcnQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0ck5ld0NvbGxhcHNlZFJhbmdlKHN0YXJ0KTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJOZXdDb2xsYXBzZWRSYW5nZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFydCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJOZXdDb250ZXh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJOZXdMb2NhdGlvblNldE5vZGVTZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBzZXQ7IC8qIGEgbm9kZSBzZXQgKi8KICAgIGludCBuX3NldDsKCiAgICBmb3IgKG5fc2V0ID0gMDtuX3NldCA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fc2V0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNldCA9IGdlbl94bWxOb2RlU2V0UHRyKG5fc2V0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQdHJOZXdMb2NhdGlvblNldE5vZGVTZXQoc2V0KTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fc2V0LCBzZXQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ck5ld0xvY2F0aW9uU2V0Tm9kZVNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zZXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUHRyTmV3TG9jYXRpb25TZXROb2Rlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHN0YXJ0OyAvKiB0aGUgc3RhcnQgTm9kZVB0ciB2YWx1ZSAqLwogICAgaW50IG5fc3RhcnQ7CiAgICB4bWxOb2RlUHRyIGVuZDsgLyogdGhlIGVuZCBOb2RlUHRyIHZhbHVlIG9yIE5VTEwgKi8KICAgIGludCBuX2VuZDsKCiAgICBmb3IgKG5fc3RhcnQgPSAwO25fc3RhcnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3N0YXJ0KyspIHsKICAgIGZvciAobl9lbmQgPSAwO25fZW5kIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbmQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RhcnQgPSBnZW5feG1sTm9kZVB0cihuX3N0YXJ0LCAwKTsKICAgICAgICBlbmQgPSBnZW5feG1sTm9kZVB0cihuX2VuZCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUHRyTmV3TG9jYXRpb25TZXROb2RlcyhzdGFydCwgZW5kKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VuZCwgZW5kLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJOZXdMb2NhdGlvblNldE5vZGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0YXJ0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJOZXdSYW5nZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHN0YXJ0OyAvKiB0aGUgc3RhcnRpbmcgbm9kZSAqLwogICAgaW50IG5fc3RhcnQ7CiAgICBpbnQgc3RhcnRpbmRleDsgLyogdGhlIHN0YXJ0IGluZGV4ICovCiAgICBpbnQgbl9zdGFydGluZGV4OwogICAgeG1sTm9kZVB0ciBlbmQ7IC8qIHRoZSBlbmRpbmcgcG9pbnQgKi8KICAgIGludCBuX2VuZDsKICAgIGludCBlbmRpbmRleDsgLyogdGhlIGVuZGluZyBpbmRleCAqLwogICAgaW50IG5fZW5kaW5kZXg7CgogICAgZm9yIChuX3N0YXJ0ID0gMDtuX3N0YXJ0IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9zdGFydCsrKSB7CiAgICBmb3IgKG5fc3RhcnRpbmRleCA9IDA7bl9zdGFydGluZGV4IDwgZ2VuX25iX2ludDtuX3N0YXJ0aW5kZXgrKykgewogICAgZm9yIChuX2VuZCA9IDA7bl9lbmQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VuZCsrKSB7CiAgICBmb3IgKG5fZW5kaW5kZXggPSAwO25fZW5kaW5kZXggPCBnZW5fbmJfaW50O25fZW5kaW5kZXgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RhcnQgPSBnZW5feG1sTm9kZVB0cihuX3N0YXJ0LCAwKTsKICAgICAgICBzdGFydGluZGV4ID0gZ2VuX2ludChuX3N0YXJ0aW5kZXgsIDEpOwogICAgICAgIGVuZCA9IGdlbl94bWxOb2RlUHRyKG5fZW5kLCAyKTsKICAgICAgICBlbmRpbmRleCA9IGdlbl9pbnQobl9lbmRpbmRleCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUHRyTmV3UmFuZ2Uoc3RhcnQsIHN0YXJ0aW5kZXgsIGVuZCwgZW5kaW5kZXgpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9zdGFydCwgc3RhcnQsIDApOwogICAgICAgIGRlc19pbnQobl9zdGFydGluZGV4LCBzdGFydGluZGV4LCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VuZCwgZW5kLCAyKTsKICAgICAgICBkZXNfaW50KG5fZW5kaW5kZXgsIGVuZGluZGV4LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJOZXdSYW5nZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFydCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFydGluZGV4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmRpbmRleCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJOZXdSYW5nZU5vZGVPYmplY3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBzdGFydDsgLyogdGhlIHN0YXJ0aW5nIG5vZGUgKi8KICAgIGludCBuX3N0YXJ0OwogICAgeG1sWFBhdGhPYmplY3RQdHIgZW5kOyAvKiB0aGUgZW5kaW5nIG9iamVjdCAqLwogICAgaW50IG5fZW5kOwoKICAgIGZvciAobl9zdGFydCA9IDA7bl9zdGFydCA8IGdlbl9uYl94bWxOb2RlUHRyO25fc3RhcnQrKykgewogICAgZm9yIChuX2VuZCA9IDA7bl9lbmQgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl9lbmQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RhcnQgPSBnZW5feG1sTm9kZVB0cihuX3N0YXJ0LCAwKTsKICAgICAgICBlbmQgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl9lbmQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0ck5ld1JhbmdlTm9kZU9iamVjdChzdGFydCwgZW5kKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl9lbmQsIGVuZCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyTmV3UmFuZ2VOb2RlT2JqZWN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0YXJ0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJOZXdSYW5nZU5vZGVQb2ludCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHN0YXJ0OyAvKiB0aGUgc3RhcnRpbmcgbm9kZSAqLwogICAgaW50IG5fc3RhcnQ7CiAgICB4bWxYUGF0aE9iamVjdFB0ciBlbmQ7IC8qIHRoZSBlbmRpbmcgcG9pbnQgKi8KICAgIGludCBuX2VuZDsKCiAgICBmb3IgKG5fc3RhcnQgPSAwO25fc3RhcnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3N0YXJ0KyspIHsKICAgIGZvciAobl9lbmQgPSAwO25fZW5kIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fZW5kKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0YXJ0ID0gZ2VuX3htbE5vZGVQdHIobl9zdGFydCwgMCk7CiAgICAgICAgZW5kID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fZW5kLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQdHJOZXdSYW5nZU5vZGVQb2ludChzdGFydCwgZW5kKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl9lbmQsIGVuZCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyTmV3UmFuZ2VOb2RlUG9pbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RhcnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ck5ld1JhbmdlTm9kZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBzdGFydDsgLyogdGhlIHN0YXJ0aW5nIG5vZGUgKi8KICAgIGludCBuX3N0YXJ0OwogICAgeG1sTm9kZVB0ciBlbmQ7IC8qIHRoZSBlbmRpbmcgbm9kZSAqLwogICAgaW50IG5fZW5kOwoKICAgIGZvciAobl9zdGFydCA9IDA7bl9zdGFydCA8IGdlbl9uYl94bWxOb2RlUHRyO25fc3RhcnQrKykgewogICAgZm9yIChuX2VuZCA9IDA7bl9lbmQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VuZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdGFydCA9IGdlbl94bWxOb2RlUHRyKG5fc3RhcnQsIDApOwogICAgICAgIGVuZCA9IGdlbl94bWxOb2RlUHRyKG5fZW5kLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQdHJOZXdSYW5nZU5vZGVzKHN0YXJ0LCBlbmQpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9zdGFydCwgc3RhcnQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZW5kLCBlbmQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ck5ld1JhbmdlTm9kZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RhcnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ck5ld1JhbmdlUG9pbnROb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBUUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHN0YXJ0OyAvKiB0aGUgc3RhcnRpbmcgcG9pbnQgKi8KICAgIGludCBuX3N0YXJ0OwogICAgeG1sTm9kZVB0ciBlbmQ7IC8qIHRoZSBlbmRpbmcgbm9kZSAqLwogICAgaW50IG5fZW5kOwoKICAgIGZvciAobl9zdGFydCA9IDA7bl9zdGFydCA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX3N0YXJ0KyspIHsKICAgIGZvciAobl9lbmQgPSAwO25fZW5kIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbmQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RhcnQgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl9zdGFydCwgMCk7CiAgICAgICAgZW5kID0gZ2VuX3htbE5vZGVQdHIobl9lbmQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0ck5ld1JhbmdlUG9pbnROb2RlKHN0YXJ0LCBlbmQpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VuZCwgZW5kLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJOZXdSYW5nZVBvaW50Tm9kZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFydCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUHRyTmV3UmFuZ2VQb2ludHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhPYmplY3RQdHIgc3RhcnQ7IC8qIHRoZSBzdGFydGluZyBwb2ludCAqLwogICAgaW50IG5fc3RhcnQ7CiAgICB4bWxYUGF0aE9iamVjdFB0ciBlbmQ7IC8qIHRoZSBlbmRpbmcgcG9pbnQgKi8KICAgIGludCBuX2VuZDsKCiAgICBmb3IgKG5fc3RhcnQgPSAwO25fc3RhcnQgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl9zdGFydCsrKSB7CiAgICBmb3IgKG5fZW5kID0gMDtuX2VuZCA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX2VuZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdGFydCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3N0YXJ0LCAwKTsKICAgICAgICBlbmQgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl9lbmQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0ck5ld1JhbmdlUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl9lbmQsIGVuZCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyTmV3UmFuZ2VQb2ludHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RhcnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0clJhbmdlVG9GdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBvaW50ZXIgUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJncyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFB0clJhbmdlVG9GdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJSYW5nZVRvRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJXcmFwTG9jYXRpb25TZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTG9jYXRpb25TZXRQdHIgdmFsOyAvKiB0aGUgTG9jYXRpb25TZXQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxMb2NhdGlvblNldFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5feG1sTG9jYXRpb25TZXRQdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0cldyYXBMb2NhdGlvblNldCh2YWwpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExvY2F0aW9uU2V0UHRyKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0cldyYXBMb2NhdGlvblNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3hwb2ludGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB4cG9pbnRlciA6IDE3IG9mIDIxIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyQnVpbGROb2RlTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyRXZhbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyRXZhbFJhbmdlUHJlZGljYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQdHJMb2NhdGlvblNldEFkZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyTG9jYXRpb25TZXRDcmVhdGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ckxvY2F0aW9uU2V0RGVsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQdHJMb2NhdGlvblNldE1lcmdlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQdHJMb2NhdGlvblNldFJlbW92ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyTmV3Q29sbGFwc2VkUmFuZ2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ck5ld0NvbnRleHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ck5ld0xvY2F0aW9uU2V0Tm9kZVNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyTmV3TG9jYXRpb25TZXROb2RlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyTmV3UmFuZ2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ck5ld1JhbmdlTm9kZU9iamVjdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyTmV3UmFuZ2VOb2RlUG9pbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ck5ld1JhbmdlTm9kZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ck5ld1JhbmdlUG9pbnROb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQdHJOZXdSYW5nZVBvaW50cygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyUmFuZ2VUb0Z1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQdHJXcmFwTG9jYXRpb25TZXQoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhwb2ludGVyOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0Kc3RhdGljIGludAp0ZXN0X21vZHVsZShjb25zdCBjaGFyICptb2R1bGUpIHsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgIkhUTUxwYXJzZXIiKSkgcmV0dXJuKHRlc3RfSFRNTHBhcnNlcigpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgIkhUTUx0cmVlIikpIHJldHVybih0ZXN0X0hUTUx0cmVlKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiU0FYMiIpKSByZXR1cm4odGVzdF9TQVgyKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiYzE0biIpKSByZXR1cm4odGVzdF9jMTRuKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiY2F0YWxvZyIpKSByZXR1cm4odGVzdF9jYXRhbG9nKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiY2h2YWxpZCIpKSByZXR1cm4odGVzdF9jaHZhbGlkKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiZGVidWdYTUwiKSkgcmV0dXJuKHRlc3RfZGVidWdYTUwoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJkaWN0IikpIHJldHVybih0ZXN0X2RpY3QoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJlbmNvZGluZyIpKSByZXR1cm4odGVzdF9lbmNvZGluZygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgImVudGl0aWVzIikpIHJldHVybih0ZXN0X2VudGl0aWVzKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiaGFzaCIpKSByZXR1cm4odGVzdF9oYXNoKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAibGlzdCIpKSByZXR1cm4odGVzdF9saXN0KCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAibmFub2Z0cCIpKSByZXR1cm4odGVzdF9uYW5vZnRwKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAibmFub2h0dHAiKSkgcmV0dXJuKHRlc3RfbmFub2h0dHAoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJwYXJzZXIiKSkgcmV0dXJuKHRlc3RfcGFyc2VyKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAicGFyc2VySW50ZXJuYWxzIikpIHJldHVybih0ZXN0X3BhcnNlckludGVybmFscygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInBhdHRlcm4iKSkgcmV0dXJuKHRlc3RfcGF0dGVybigpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInJlbGF4bmciKSkgcmV0dXJuKHRlc3RfcmVsYXhuZygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInNjaGVtYXNJbnRlcm5hbHMiKSkgcmV0dXJuKHRlc3Rfc2NoZW1hc0ludGVybmFscygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInRyZWUiKSkgcmV0dXJuKHRlc3RfdHJlZSgpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInVyaSIpKSByZXR1cm4odGVzdF91cmkoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ2YWxpZCIpKSByZXR1cm4odGVzdF92YWxpZCgpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInhpbmNsdWRlIikpIHJldHVybih0ZXN0X3hpbmNsdWRlKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieG1sSU8iKSkgcmV0dXJuKHRlc3RfeG1sSU8oKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ4bWxhdXRvbWF0YSIpKSByZXR1cm4odGVzdF94bWxhdXRvbWF0YSgpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInhtbGVycm9yIikpIHJldHVybih0ZXN0X3htbGVycm9yKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieG1sbW9kdWxlIikpIHJldHVybih0ZXN0X3htbG1vZHVsZSgpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInhtbHJlYWRlciIpKSByZXR1cm4odGVzdF94bWxyZWFkZXIoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ4bWxyZWdleHAiKSkgcmV0dXJuKHRlc3RfeG1scmVnZXhwKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieG1sc2F2ZSIpKSByZXR1cm4odGVzdF94bWxzYXZlKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieG1sc2NoZW1hcyIpKSByZXR1cm4odGVzdF94bWxzY2hlbWFzKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieG1sc2NoZW1hc3R5cGVzIikpIHJldHVybih0ZXN0X3htbHNjaGVtYXN0eXBlcygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInhtbHN0cmluZyIpKSByZXR1cm4odGVzdF94bWxzdHJpbmcoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ4bWx1bmljb2RlIikpIHJldHVybih0ZXN0X3htbHVuaWNvZGUoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ4bWx3cml0ZXIiKSkgcmV0dXJuKHRlc3RfeG1sd3JpdGVyKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieHBhdGgiKSkgcmV0dXJuKHRlc3RfeHBhdGgoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ4cGF0aEludGVybmFscyIpKSByZXR1cm4odGVzdF94cGF0aEludGVybmFscygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInhwb2ludGVyIikpIHJldHVybih0ZXN0X3hwb2ludGVyKCkpOwogICAgcmV0dXJuKDApOwp9Cg==