LyoKICogcnVudGVzdC5jOiBDIHByb2dyYW0gdG8gcnVuIGxpYnhtbDIgcmVncmVzc2lvbiB0ZXN0cyB3aXRob3V0CiAqICAgICAgICAgICAgcmVxdWlyaW5nIG1ha2Ugb3IgUHl0aG9uLCBhbmQgcmVkdWNpbmcgcGxhdGZvcm0gZGVwZW5kYW5jaWVzCiAqICAgICAgICAgICAgdG8gYSBzdHJpY3QgbWluaW11bS4KICoKICogVG8gY29tcGlsZSBvbiBVbml4ZXM6CiAqIGNjIC1vIHJ1bnRlc3QgYHhtbDItY29uZmlnIC0tY2ZsYWdzYCBydW50ZXN0LmMgYHhtbDItY29uZmlnIC0tbGlic2AgLWxwdGhyZWFkCiAqCiAqIFNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogZGFuaWVsQHZlaWxsYXJkLmNvbQogKi8KCiNpZmRlZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlICJsaWJ4bWwuaCIKI2Vsc2UKI2luY2x1ZGUgPHN0ZGlvLmg+CiNlbmRpZgoKI2lmICFkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxmY250bC5oPgoKI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdXJpLmg+CgojaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC94bWxyZWFkZXIuaD4KI2VuZGlmCgojaWZkZWYgTElCWE1MX1hJTkNMVURFX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgojZW5kaWYKCiNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAojaW5jbHVkZSA8bGlieG1sL3hwYXRoLmg+CiNpbmNsdWRlIDxsaWJ4bWwveHBhdGhJbnRlcm5hbHMuaD4KI2lmZGVmIExJQlhNTF9YUFRSX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC94cG9pbnRlci5oPgojZW5kaWYKI2VuZGlmCgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAojaW5jbHVkZSA8bGlieG1sL3JlbGF4bmcuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxzY2hlbWFzLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sc2NoZW1hc3R5cGVzLmg+CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9QQVRURVJOX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC9wYXR0ZXJuLmg+CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9DMTROX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC9jMTRuLmg+CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC9IVE1McGFyc2VyLmg+CiNpbmNsdWRlIDxsaWJ4bWwvSFRNTHRyZWUuaD4KCi8qCiAqIHBzZXVkbyBmbGFnIGZvciB0aGUgdW5pZmljYXRpb24gb2YgSFRNTCBhbmQgWE1MIHRlc3RzCiAqLwojZGVmaW5lIFhNTF9QQVJTRV9IVE1MIDEgPDwgMjQKI2VuZGlmCgojaWYgZGVmaW5lZChMSUJYTUxfVEhSRUFEX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKI2luY2x1ZGUgPGxpYnhtbC9nbG9iYWxzLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdGhyZWFkcy5oPgojaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgojaW5jbHVkZSA8bGlieG1sL2NhdGFsb2cuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojZW5kaWYKCi8qCiAqIE9fQklOQVJZIGlzIGp1c3QgZm9yIFdpbmRvd3MgY29tcGF0aWJpbGl0eSAtIGlmIGl0IGlzbid0IGRlZmluZWQKICogb24gdGhpcyBzeXN0ZW0sIGF2b2lkIGFueSBjb21waWxhdGlvbiBlcnJvcgogKi8KI2lmZGVmCU9fQklOQVJZCiNkZWZpbmUgUkRfRkxBR1MJT19SRE9OTFkgfCBPX0JJTkFSWQojZWxzZQojZGVmaW5lCVJEX0ZMQUdTCU9fUkRPTkxZCiNlbmRpZgoKdHlwZWRlZiBpbnQgKCpmdW5jdGVzdCkgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvciwgaW50IG9wdGlvbnMpOwoKdHlwZWRlZiBzdHJ1Y3QgdGVzdERlc2MgdGVzdERlc2M7CnR5cGVkZWYgdGVzdERlc2MgKnRlc3REZXNjUHRyOwpzdHJ1Y3QgdGVzdERlc2MgewogICAgY29uc3QgY2hhciAqZGVzYzsgLyogZGVzY3JpcHRvbiBvZiB0aGUgdGVzdCAqLwogICAgZnVuY3Rlc3QgICAgZnVuYzsgLyogZnVuY3Rpb24gaW1wbGVtZW50aW5nIHRoZSB0ZXN0ICovCiAgICBjb25zdCBjaGFyICppbjsgICAvKiBnbG9iIHRvIHBhdGggZm9yIGlucHV0IGZpbGVzICovCiAgICBjb25zdCBjaGFyICpvdXQ7ICAvKiBvdXRwdXQgZGlyZWN0b3J5ICovCiAgICBjb25zdCBjaGFyICpzdWZmaXg7Lyogc3VmZml4IGZvciBvdXRwdXQgZmlsZXMgKi8KICAgIGNvbnN0IGNoYXIgKmVycjsgIC8qIHN1ZmZpeCBmb3IgZXJyb3Igb3V0cHV0IGZpbGVzICovCiAgICBpbnQgICAgIG9wdGlvbnM7ICAvKiBwYXJzZXIgb3B0aW9ucyBmb3IgdGhlIHRlc3QgKi8KfTsKCnN0YXRpYyBpbnQgY2hlY2tUZXN0RmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CgojaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8aW8uaD4KCnR5cGVkZWYgc3RydWN0CnsKICAgICAgc2l6ZV90IGdsX3BhdGhjOyAgICAvKiBDb3VudCBvZiBwYXRocyBtYXRjaGVkIHNvIGZhciAgKi8KICAgICAgY2hhciAqKmdsX3BhdGh2OyAgICAvKiBMaXN0IG9mIG1hdGNoZWQgcGF0aG5hbWVzLiAgKi8KICAgICAgc2l6ZV90IGdsX29mZnM7ICAgICAvKiBTbG90cyB0byByZXNlcnZlIGluICdnbF9wYXRodicuICAqLwp9IGdsb2JfdDsKCiNkZWZpbmUgR0xPQl9ET09GRlMgMApzdGF0aWMgaW50IGdsb2IoY29uc3QgY2hhciAqcGF0dGVybiwgaW50IGZsYWdzLAogICAgICAgICAgICAgICAgaW50IGVycmZ1bmMoY29uc3QgY2hhciAqZXBhdGgsIGludCBlZXJybm8pLAogICAgICAgICAgICAgICAgZ2xvYl90ICpwZ2xvYikgewogICAgZ2xvYl90ICpyZXQ7CiAgICBXSU4zMl9GSU5EX0RBVEEgRmluZEZpbGVEYXRhOwogICAgSEFORExFIGhGaW5kOwogICAgdW5zaWduZWQgaW50IG5iX3BhdGhzID0gMDsKICAgIGNoYXIgZGlyZWN0b3J5WzUwMF07CiAgICBpbnQgbGVuOwoKICAgIGlmICgocGF0dGVybiA9PSBOVUxMKSB8fCAocGdsb2IgPT0gTlVMTCkpIHJldHVybigtMSk7CiAgICAKICAgIHN0cm5jcHkoZGlyZWN0b3J5LCBwYXR0ZXJuLCA0OTkpOwogICAgZm9yIChsZW4gPSBzdHJsZW4oZGlyZWN0b3J5KTtsZW4gPj0gMDtsZW4tLSkgewogICAgICAgIGlmIChkaXJlY3RvcnlbbGVuXSA9PSAnLycpIHsKCSAgICBsZW4rKzsKCSAgICBkaXJlY3RvcnlbbGVuXSA9IDA7CgkgICAgYnJlYWs7Cgl9CiAgICB9CiAgICBpZiAobGVuIDw9IDApCiAgICAgICAgbGVuID0gMDsKCiAgICAKICAgIHJldCA9IHBnbG9iOwogICAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKGdsb2JfdCkpOwogICAgCiAgICBoRmluZCA9IEZpbmRGaXJzdEZpbGVBKHBhdHRlcm4sICZGaW5kRmlsZURhdGEpOwogICAgaWYgKGhGaW5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAKICAgICAgICByZXR1cm4oMCk7CiAgICBuYl9wYXRocyA9IDIwOwogICAgcmV0LT5nbF9wYXRodiA9IChjaGFyICoqKSBtYWxsb2MobmJfcGF0aHMgKiBzaXplb2YoY2hhciAqKSk7CiAgICBpZiAocmV0LT5nbF9wYXRodiA9PSBOVUxMKSB7CglGaW5kQ2xvc2UoaEZpbmQpOwogICAgICAgIHJldHVybigtMSk7CiAgICB9CiAgICBzdHJuY3B5KGRpcmVjdG9yeSArIGxlbiwgRmluZEZpbGVEYXRhLmNGaWxlTmFtZSwgNDk5IC0gbGVuKTsKICAgIHJldC0+Z2xfcGF0aHZbcmV0LT5nbF9wYXRoY10gPSBzdHJkdXAoZGlyZWN0b3J5KTsKICAgIGlmIChyZXQtPmdsX3BhdGh2W3JldC0+Z2xfcGF0aGNdID09IE5VTEwpCiAgICAgICAgZ290byBkb25lOwogICAgcmV0LT5nbF9wYXRoYysrOwogICAgd2hpbGUoRmluZE5leHRGaWxlQShoRmluZCwgJkZpbmRGaWxlRGF0YSkpIHsKICAgICAgICBpZiAoRmluZEZpbGVEYXRhLmNGaWxlTmFtZVswXSA9PSAnLicpCgkgICAgY29udGludWU7CiAgICAgICAgaWYgKHJldC0+Z2xfcGF0aGMgKyAyID4gbmJfcGF0aHMpIHsKICAgICAgICAgICAgY2hhciAqKnRtcCA9IHJlYWxsb2MocmV0LT5nbF9wYXRodiwgbmJfcGF0aHMgKiAyICogc2l6ZW9mKGNoYXIgKikpOwogICAgICAgICAgICBpZiAodG1wID09IE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgcmV0LT5nbF9wYXRodiA9IHRtcDsKICAgICAgICAgICAgbmJfcGF0aHMgKj0gMjsKCX0KCXN0cm5jcHkoZGlyZWN0b3J5ICsgbGVuLCBGaW5kRmlsZURhdGEuY0ZpbGVOYW1lLCA0OTkgLSBsZW4pOwoJcmV0LT5nbF9wYXRodltyZXQtPmdsX3BhdGhjXSA9IHN0cmR1cChkaXJlY3RvcnkpOwogICAgICAgIGlmIChyZXQtPmdsX3BhdGh2W3JldC0+Z2xfcGF0aGNdID09IE5VTEwpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHJldC0+Z2xfcGF0aGMrKzsKICAgIH0KICAgIHJldC0+Z2xfcGF0aHZbcmV0LT5nbF9wYXRoY10gPSBOVUxMOwoKZG9uZToKICAgIEZpbmRDbG9zZShoRmluZCk7CiAgICByZXR1cm4oMCk7Cn0KIAoKCnN0YXRpYyB2b2lkIGdsb2JmcmVlKGdsb2JfdCAqcGdsb2IpIHsKICAgIHVuc2lnbmVkIGludCBpOwogICAgaWYgKHBnbG9iID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwogICAgCiAgICBmb3IgKGkgPSAwO2kgPCBwZ2xvYi0+Z2xfcGF0aGM7aSsrKSB7CiAgICAgICAgIGlmIChwZ2xvYi0+Z2xfcGF0aHZbaV0gIT0gTlVMTCkKICAgICAgICAgICAgIGZyZWUocGdsb2ItPmdsX3BhdGh2W2ldKTsKICAgIH0KfQojZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCiNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCiNlbHNlCiNpbmNsdWRlIDxnbG9iLmg+CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCUxpYnhtbDIgc3BlY2lmaWMgcm91dGluZXMJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQgbmJfdGVzdHMgPSAwOwpzdGF0aWMgaW50IG5iX2Vycm9ycyA9IDA7CnN0YXRpYyBpbnQgbmJfbGVha3MgPSAwOwpzdGF0aWMgbG9uZyBsaWJ4bWxNZW1vcnlBbGxvY2F0ZWRCYXNlID0gMDsKc3RhdGljIGludCBleHRyYU1lbW9yeUZyb21SZXNvbHZlciA9IDA7CgpzdGF0aWMgaW50CmZhdGFsRXJyb3Iodm9pZCkgewogICAgZnByaW50ZihzdGRlcnIsICJFeGl0dGluZyB0ZXN0cyBvbiBmYXRhbCBlcnJvclxuIik7CiAgICBleGl0KDEpOwp9CgovKgogKiBXZSBuZWVkIHRvIHRyYXAgY2FsbHMgdG8gdGhlIHJlc29sdmVyIHRvIG5vdCBhY2NvdW50IG1lbW9yeSBmb3IgdGhlIGNhdGFsb2cKICogd2hpY2ggaXMgc2hhcmVkIHRvIHRoZSBjdXJyZW50IHJ1bm5pbmcgdGVzdC4gV2UgYWxzbyBkb24ndCB3YW50IHRvIGhhdmUKICogbmV0d29yayBkb3dubG9hZHMgbW9kaWZ5aW5nIHRlc3RzLgogKi8Kc3RhdGljIHhtbFBhcnNlcklucHV0UHRyIAp0ZXN0RXh0ZXJuYWxFbnRpdHlMb2FkZXIoY29uc3QgY2hhciAqVVJMLCBjb25zdCBjaGFyICpJRCwKCQkJIHhtbFBhcnNlckN0eHRQdHIgY3R4dCkgewogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0OwoKICAgIGlmIChjaGVja1Rlc3RGaWxlKFVSTCkpIHsKCXJldCA9IHhtbE5vTmV0RXh0ZXJuYWxFbnRpdHlMb2FkZXIoVVJMLCBJRCwgY3R4dCk7CiAgICB9IGVsc2UgewoJaW50IG1lbXVzZWQgPSB4bWxNZW1Vc2VkKCk7CglyZXQgPSB4bWxOb05ldEV4dGVybmFsRW50aXR5TG9hZGVyKFVSTCwgSUQsIGN0eHQpOwoJZXh0cmFNZW1vcnlGcm9tUmVzb2x2ZXIgKz0geG1sTWVtVXNlZCgpIC0gbWVtdXNlZDsKICAgIH0KICAgICAgCiAgICByZXR1cm4ocmV0KTsKfQoKLyoKICogVHJhcHBpbmcgdGhlIGVycm9yIG1lc3NhZ2VzIGF0IHRoZSBnZW5lcmljIGxldmVsIHRvIGdyYWIgdGhlIGVxdWl2YWxlbnQgb2YKICogc3RkZXJyIG1lc3NhZ2VzIG9uIENMSSB0b29scy4KICovCnN0YXRpYyBjaGFyIHRlc3RFcnJvcnNbMzI3NjldOwpzdGF0aWMgaW50IHRlc3RFcnJvcnNTaXplID0gMDsKCnN0YXRpYyB2b2lkIFhNTENERUNMCnRlc3RFcnJvckhhbmRsZXIodm9pZCAqY3R4ICBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICptc2csIC4uLikgewogICAgdmFfbGlzdCBhcmdzOwogICAgaW50IHJlczsKCiAgICBpZiAodGVzdEVycm9yc1NpemUgPj0gMzI3NjgpCiAgICAgICAgcmV0dXJuOwogICAgdmFfc3RhcnQoYXJncywgbXNnKTsKICAgIHJlcyA9IHZzbnByaW50ZigmdGVzdEVycm9yc1t0ZXN0RXJyb3JzU2l6ZV0sCiAgICAgICAgICAgICAgICAgICAgMzI3NjggLSB0ZXN0RXJyb3JzU2l6ZSwKCQkgICAgbXNnLCBhcmdzKTsKICAgIHZhX2VuZChhcmdzKTsKICAgIGlmICh0ZXN0RXJyb3JzU2l6ZSArIHJlcyA+PSAzMjc2OCkgewogICAgICAgIC8qIGJ1ZmZlciBpcyBmdWxsICovCgl0ZXN0RXJyb3JzU2l6ZSA9IDMyNzY4OwoJdGVzdEVycm9yc1t0ZXN0RXJyb3JzU2l6ZV0gPSAwOwogICAgfSBlbHNlIHsKICAgICAgICB0ZXN0RXJyb3JzU2l6ZSArPSByZXM7CiAgICB9CiAgICB0ZXN0RXJyb3JzW3Rlc3RFcnJvcnNTaXplXSA9IDA7Cn0KCnN0YXRpYyB2b2lkIFhNTENERUNMCmNoYW5uZWwodm9pZCAqY3R4ICBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICptc2csIC4uLikgewogICAgdmFfbGlzdCBhcmdzOwogICAgaW50IHJlczsKCiAgICBpZiAodGVzdEVycm9yc1NpemUgPj0gMzI3NjgpCiAgICAgICAgcmV0dXJuOwogICAgdmFfc3RhcnQoYXJncywgbXNnKTsKICAgIHJlcyA9IHZzbnByaW50ZigmdGVzdEVycm9yc1t0ZXN0RXJyb3JzU2l6ZV0sCiAgICAgICAgICAgICAgICAgICAgMzI3NjggLSB0ZXN0RXJyb3JzU2l6ZSwKCQkgICAgbXNnLCBhcmdzKTsKICAgIHZhX2VuZChhcmdzKTsKICAgIGlmICh0ZXN0RXJyb3JzU2l6ZSArIHJlcyA+PSAzMjc2OCkgewogICAgICAgIC8qIGJ1ZmZlciBpcyBmdWxsICovCgl0ZXN0RXJyb3JzU2l6ZSA9IDMyNzY4OwoJdGVzdEVycm9yc1t0ZXN0RXJyb3JzU2l6ZV0gPSAwOwogICAgfSBlbHNlIHsKICAgICAgICB0ZXN0RXJyb3JzU2l6ZSArPSByZXM7CiAgICB9CiAgICB0ZXN0RXJyb3JzW3Rlc3RFcnJvcnNTaXplXSA9IDA7Cn0KCi8qKgogKiB4bWxQYXJzZXJQcmludEZpbGVDb250ZXh0OgogKiBAaW5wdXQ6ICBhbiB4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dAogKiAKICogRGlzcGxheXMgY3VycmVudCBjb250ZXh0IHdpdGhpbiB0aGUgaW5wdXQgY29udGVudCBmb3IgZXJyb3IgdHJhY2tpbmcKICovCgpzdGF0aWMgdm9pZAp4bWxQYXJzZXJQcmludEZpbGVDb250ZXh0SW50ZXJuYWwoeG1sUGFyc2VySW5wdXRQdHIgaW5wdXQgLCAKCQl4bWxHZW5lcmljRXJyb3JGdW5jIGNoYW5sLCB2b2lkICpkYXRhICkgewogICAgY29uc3QgeG1sQ2hhciAqY3VyLCAqYmFzZTsKICAgIHVuc2lnbmVkIGludCBuLCBjb2w7CS8qIEdDQyB3YXJucyBpZiBzaWduZWQsIGJlY2F1c2UgY29tcGFyZWQgd2l0aCBzaXplb2YoKSAqLwogICAgeG1sQ2hhciAgY29udGVudFs4MV07IC8qIHNwYWNlIGZvciA4MCBjaGFycyArIGxpbmUgdGVybWluYXRvciAqLwogICAgeG1sQ2hhciAqY3RudDsKCiAgICBpZiAoaW5wdXQgPT0gTlVMTCkgcmV0dXJuOwogICAgY3VyID0gaW5wdXQtPmN1cjsKICAgIGJhc2UgPSBpbnB1dC0+YmFzZTsKICAgIC8qIHNraXAgYmFja3dhcmRzIG92ZXIgYW55IGVuZC1vZi1saW5lcyAqLwogICAgd2hpbGUgKChjdXIgPiBiYXNlKSAmJiAoKCooY3VyKSA9PSAnXG4nKSB8fCAoKihjdXIpID09ICdccicpKSkgewoJY3VyLS07CiAgICB9CiAgICBuID0gMDsKICAgIC8qIHNlYXJjaCBiYWNrd2FyZHMgZm9yIGJlZ2lubmluZy1vZi1saW5lICh0byBtYXggYnVmZiBzaXplKSAqLwogICAgd2hpbGUgKChuKysgPCAoc2l6ZW9mKGNvbnRlbnQpLTEpKSAmJiAoY3VyID4gYmFzZSkgJiYgCiAgICAJICAgKCooY3VyKSAhPSAnXG4nKSAmJiAoKihjdXIpICE9ICdccicpKQogICAgICAgIGN1ci0tOwogICAgaWYgKCgqKGN1cikgPT0gJ1xuJykgfHwgKCooY3VyKSA9PSAnXHInKSkgY3VyKys7CiAgICAvKiBjYWxjdWxhdGUgdGhlIGVycm9yIHBvc2l0aW9uIGluIHRlcm1zIG9mIHRoZSBjdXJyZW50IHBvc2l0aW9uICovCiAgICBjb2wgPSBpbnB1dC0+Y3VyIC0gY3VyOwogICAgLyogc2VhcmNoIGZvcndhcmQgZm9yIGVuZC1vZi1saW5lICh0byBtYXggYnVmZiBzaXplKSAqLwogICAgbiA9IDA7CiAgICBjdG50ID0gY29udGVudDsKICAgIC8qIGNvcHkgc2VsZWN0ZWQgdGV4dCB0byBvdXIgYnVmZmVyICovCiAgICB3aGlsZSAoKCpjdXIgIT0gMCkgJiYgKCooY3VyKSAhPSAnXG4nKSAmJiAKICAgIAkgICAoKihjdXIpICE9ICdccicpICYmIChuIDwgc2l6ZW9mKGNvbnRlbnQpLTEpKSB7CgkJKmN0bnQrKyA9ICpjdXIrKzsKCW4rKzsKICAgIH0KICAgICpjdG50ID0gMDsKICAgIC8qIHByaW50IG91dCB0aGUgc2VsZWN0ZWQgdGV4dCAqLwogICAgY2hhbmwoZGF0YSAsIiVzXG4iLCBjb250ZW50KTsKICAgIC8qIGNyZWF0ZSBibGFuayBsaW5lIHdpdGggcHJvYmxlbSBwb2ludGVyICovCiAgICBuID0gMDsKICAgIGN0bnQgPSBjb250ZW50OwogICAgLyogKGxlYXZlIGJ1ZmZlciBzcGFjZSBmb3IgcG9pbnRlciArIGxpbmUgdGVybWluYXRvcikgKi8KICAgIHdoaWxlICgobjxjb2wpICYmIChuKysgPCBzaXplb2YoY29udGVudCktMikgJiYgKCpjdG50ICE9IDApKSB7CglpZiAoKihjdG50KSAhPSAnXHQnKQoJICAgICooY3RudCkgPSAnICc7CgljdG50Kys7CiAgICB9CiAgICAqY3RudCsrID0gJ14nOwogICAgKmN0bnQgPSAwOwogICAgY2hhbmwoZGF0YSAsIiVzXG4iLCBjb250ZW50KTsKfQoKc3RhdGljIHZvaWQKdGVzdFN0cnVjdHVyZWRFcnJvckhhbmRsZXIodm9pZCAqY3R4ICBBVFRSSUJVVEVfVU5VU0VELCB4bWxFcnJvclB0ciBlcnIpIHsKICAgIGNoYXIgKmZpbGUgPSBOVUxMOwogICAgaW50IGxpbmUgPSAwOwogICAgaW50IGNvZGUgPSAtMTsKICAgIGludCBkb21haW47CiAgICB2b2lkICpkYXRhID0gTlVMTDsKICAgIGNvbnN0IGNoYXIgKnN0cjsKICAgIGNvbnN0IHhtbENoYXIgKm5hbWUgPSBOVUxMOwogICAgeG1sTm9kZVB0ciBub2RlOwogICAgeG1sRXJyb3JMZXZlbCBsZXZlbDsKICAgIHhtbFBhcnNlcklucHV0UHRyIGlucHV0ID0gTlVMTDsKICAgIHhtbFBhcnNlcklucHV0UHRyIGN1ciA9IE5VTEw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQgPSBOVUxMOwoKICAgIGlmIChlcnIgPT0gTlVMTCkKICAgICAgICByZXR1cm47CgogICAgZmlsZSA9IGVyci0+ZmlsZTsKICAgIGxpbmUgPSBlcnItPmxpbmU7CiAgICBjb2RlID0gZXJyLT5jb2RlOwogICAgZG9tYWluID0gZXJyLT5kb21haW47CiAgICBsZXZlbCA9IGVyci0+bGV2ZWw7CiAgICBub2RlID0gZXJyLT5ub2RlOwogICAgaWYgKChkb21haW4gPT0gWE1MX0ZST01fUEFSU0VSKSB8fCAoZG9tYWluID09IFhNTF9GUk9NX0hUTUwpIHx8CiAgICAgICAgKGRvbWFpbiA9PSBYTUxfRlJPTV9EVEQpIHx8IChkb21haW4gPT0gWE1MX0ZST01fTkFNRVNQQUNFKSB8fAoJKGRvbWFpbiA9PSBYTUxfRlJPTV9JTykgfHwgKGRvbWFpbiA9PSBYTUxfRlJPTV9WQUxJRCkpIHsKCWN0eHQgPSBlcnItPmN0eHQ7CiAgICB9CiAgICBzdHIgPSBlcnItPm1lc3NhZ2U7CgogICAgaWYgKGNvZGUgPT0gWE1MX0VSUl9PSykKICAgICAgICByZXR1cm47CgogICAgaWYgKChub2RlICE9IE5VTEwpICYmIChub2RlLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpKQogICAgICAgIG5hbWUgPSBub2RlLT5uYW1lOwoKICAgIC8qCiAgICAgKiBNYWludGFpbiB0aGUgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBsZWdhY3kgZXJyb3IgaGFuZGxpbmcKICAgICAqLwogICAgaWYgKGN0eHQgIT0gTlVMTCkgewogICAgICAgIGlucHV0ID0gY3R4dC0+aW5wdXQ7CiAgICAgICAgaWYgKChpbnB1dCAhPSBOVUxMKSAmJiAoaW5wdXQtPmZpbGVuYW1lID09IE5VTEwpICYmCiAgICAgICAgICAgIChjdHh0LT5pbnB1dE5yID4gMSkpIHsKICAgICAgICAgICAgY3VyID0gaW5wdXQ7CiAgICAgICAgICAgIGlucHV0ID0gY3R4dC0+aW5wdXRUYWJbY3R4dC0+aW5wdXROciAtIDJdOwogICAgICAgIH0KICAgICAgICBpZiAoaW5wdXQgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAoaW5wdXQtPmZpbGVuYW1lKQogICAgICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiJXM6JWQ6ICIsIGlucHV0LT5maWxlbmFtZSwgaW5wdXQtPmxpbmUpOwogICAgICAgICAgICBlbHNlIGlmICgobGluZSAhPSAwKSAmJiAoZG9tYWluID09IFhNTF9GUk9NX1BBUlNFUikpCiAgICAgICAgICAgICAgICBjaGFubmVsKGRhdGEsICJFbnRpdHk6IGxpbmUgJWQ6ICIsIGlucHV0LT5saW5lKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmIChmaWxlICE9IE5VTEwpCiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIiVzOiVkOiAiLCBmaWxlLCBsaW5lKTsKICAgICAgICBlbHNlIGlmICgobGluZSAhPSAwKSAmJiAoZG9tYWluID09IFhNTF9GUk9NX1BBUlNFUikpCiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIkVudGl0eTogbGluZSAlZDogIiwgbGluZSk7CiAgICB9CiAgICBpZiAobmFtZSAhPSBOVUxMKSB7CiAgICAgICAgY2hhbm5lbChkYXRhLCAiZWxlbWVudCAlczogIiwgbmFtZSk7CiAgICB9CiAgICBpZiAoY29kZSA9PSBYTUxfRVJSX09LKQogICAgICAgIHJldHVybjsKICAgIHN3aXRjaCAoZG9tYWluKSB7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9QQVJTRVI6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgInBhcnNlciAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9OQU1FU1BBQ0U6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIm5hbWVzcGFjZSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9EVEQ6CiAgICAgICAgY2FzZSBYTUxfRlJPTV9WQUxJRDoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAidmFsaWRpdHkgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fSFRNTDoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiSFRNTCBwYXJzZXIgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fTUVNT1JZOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJtZW1vcnkgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fT1VUUFVUOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJvdXRwdXQgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fSU86CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIkkvTyAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9YSU5DTFVERToKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiWEluY2x1ZGUgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fWFBBVEg6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIlhQYXRoICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX1hQT0lOVEVSOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJwYXJzZXIgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fUkVHRVhQOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJyZWdleHAgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fTU9EVUxFOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJtb2R1bGUgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fU0NIRU1BU1Y6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIlNjaGVtYXMgdmFsaWRpdHkgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fU0NIRU1BU1A6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIlNjaGVtYXMgcGFyc2VyICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX1JFTEFYTkdQOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJSZWxheC1ORyBwYXJzZXIgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fUkVMQVhOR1Y6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIlJlbGF4LU5HIHZhbGlkaXR5ICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX0NBVEFMT0c6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIkNhdGFsb2cgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fQzE0TjoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiQzE0TiAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9YU0xUOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJYU0xUICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChjb2RlID09IFhNTF9FUlJfT0spCiAgICAgICAgcmV0dXJuOwogICAgc3dpdGNoIChsZXZlbCkgewogICAgICAgIGNhc2UgWE1MX0VSUl9OT05FOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICI6ICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9FUlJfV0FSTklORzoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAid2FybmluZyA6ICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9FUlJfRVJST1I6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgImVycm9yIDogIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0VSUl9GQVRBTDoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiZXJyb3IgOiAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoY29kZSA9PSBYTUxfRVJSX09LKQogICAgICAgIHJldHVybjsKICAgIGlmIChzdHIgIT0gTlVMTCkgewogICAgICAgIGludCBsZW47CglsZW4gPSB4bWxTdHJsZW4oKGNvbnN0IHhtbENoYXIgKilzdHIpOwoJaWYgKChsZW4gPiAwKSAmJiAoc3RyW2xlbiAtIDFdICE9ICdcbicpKQoJICAgIGNoYW5uZWwoZGF0YSwgIiVzXG4iLCBzdHIpOwoJZWxzZQoJICAgIGNoYW5uZWwoZGF0YSwgIiVzIiwgc3RyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY2hhbm5lbChkYXRhLCAiJXNcbiIsICJvdXQgb2YgbWVtb3J5IGVycm9yIik7CiAgICB9CiAgICBpZiAoY29kZSA9PSBYTUxfRVJSX09LKQogICAgICAgIHJldHVybjsKCiAgICBpZiAoY3R4dCAhPSBOVUxMKSB7CiAgICAgICAgeG1sUGFyc2VyUHJpbnRGaWxlQ29udGV4dEludGVybmFsKGlucHV0LCBjaGFubmVsLCBkYXRhKTsKICAgICAgICBpZiAoY3VyICE9IE5VTEwpIHsKICAgICAgICAgICAgaWYgKGN1ci0+ZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBjaGFubmVsKGRhdGEsICIlczolZDogXG4iLCBjdXItPmZpbGVuYW1lLCBjdXItPmxpbmUpOwogICAgICAgICAgICBlbHNlIGlmICgobGluZSAhPSAwKSAmJiAoZG9tYWluID09IFhNTF9GUk9NX1BBUlNFUikpCiAgICAgICAgICAgICAgICBjaGFubmVsKGRhdGEsICJFbnRpdHk6IGxpbmUgJWQ6IFxuIiwgY3VyLT5saW5lKTsKICAgICAgICAgICAgeG1sUGFyc2VyUHJpbnRGaWxlQ29udGV4dEludGVybmFsKGN1ciwgY2hhbm5lbCwgZGF0YSk7CiAgICAgICAgfQogICAgfQogICAgaWYgKChkb21haW4gPT0gWE1MX0ZST01fWFBBVEgpICYmIChlcnItPnN0cjEgIT0gTlVMTCkgJiYKICAgICAgICAoZXJyLT5pbnQxIDwgMTAwKSAmJgoJKGVyci0+aW50MSA8IHhtbFN0cmxlbigoY29uc3QgeG1sQ2hhciAqKWVyci0+c3RyMSkpKSB7Cgl4bWxDaGFyIGJ1ZlsxNTBdOwoJaW50IGk7CgoJY2hhbm5lbChkYXRhLCAiJXNcbiIsIGVyci0+c3RyMSk7Cglmb3IgKGk9MDtpIDwgZXJyLT5pbnQxO2krKykKCSAgICAgYnVmW2ldID0gJyAnOwoJYnVmW2krK10gPSAnXic7CglidWZbaV0gPSAwOwoJY2hhbm5lbChkYXRhLCAiJXNcbiIsIGJ1Zik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCmluaXRpYWxpemVMaWJ4bWwyKHZvaWQpIHsKICAgIHhtbEdldFdhcm5pbmdzRGVmYXVsdFZhbHVlID0gMDsKICAgIHhtbFBlZGFudGljUGFyc2VyRGVmYXVsdCgwKTsKCiAgICB4bWxNZW1TZXR1cCh4bWxNZW1GcmVlLCB4bWxNZW1NYWxsb2MsIHhtbE1lbVJlYWxsb2MsIHhtbE1lbW9yeVN0cmR1cCk7CiAgICB4bWxJbml0UGFyc2VyKCk7CiAgICB4bWxTZXRFeHRlcm5hbEVudGl0eUxvYWRlcih0ZXN0RXh0ZXJuYWxFbnRpdHlMb2FkZXIpOwogICAgeG1sU2V0U3RydWN0dXJlZEVycm9yRnVuYyhOVUxMLCB0ZXN0U3RydWN0dXJlZEVycm9ySGFuZGxlcik7CiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECiAgICB4bWxTY2hlbWFJbml0VHlwZXMoKTsKICAgIHhtbFJlbGF4TkdJbml0VHlwZXMoKTsKI2VuZGlmCiAgICBsaWJ4bWxNZW1vcnlBbGxvY2F0ZWRCYXNlID0geG1sTWVtVXNlZCgpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCUZpbGUgbmFtZSBhbmQgcGF0aCB1dGlsaXRpZXMJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBjb25zdCBjaGFyICpiYXNlRmlsZW5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKICAgIGNvbnN0IGNoYXIgKmN1cjsKICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQogICAgICAgIHJldHVybihOVUxMKTsKICAgIGN1ciA9ICZmaWxlbmFtZVtzdHJsZW4oZmlsZW5hbWUpXTsKICAgIHdoaWxlICgoY3VyID4gZmlsZW5hbWUpICYmICgqY3VyICE9ICcvJykpCiAgICAgICAgY3VyLS07CiAgICBpZiAoKmN1ciA9PSAnLycpCiAgICAgICAgcmV0dXJuKGN1ciArIDEpOwogICAgcmV0dXJuKGN1cik7Cn0KCnN0YXRpYyBjaGFyICpyZXN1bHRGaWxlbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3VmZml4KSB7CiAgICBjb25zdCBjaGFyICpiYXNlOwogICAgY2hhciByZXNbNTAwXTsKCi8qKioqKioqKioqKioqCiAgICBpZiAoKGZpbGVuYW1lWzBdID09ICd0JykgJiYgKGZpbGVuYW1lWzFdID09ICdlJykgJiYKICAgICAgICAoZmlsZW5hbWVbMl0gPT0gJ3MnKSAmJiAoZmlsZW5hbWVbM10gPT0gJ3QnKSAmJgoJKGZpbGVuYW1lWzRdID09ICcvJykpCglmaWxlbmFtZSA9ICZmaWxlbmFtZVs1XTsKICoqKioqKioqKioqKiovCiAgICAKICAgIGJhc2UgPSBiYXNlRmlsZW5hbWUoZmlsZW5hbWUpOwogICAgaWYgKHN1ZmZpeCA9PSBOVUxMKQogICAgICAgIHN1ZmZpeCA9ICIudG1wIjsKICAgIGlmIChvdXQgPT0gTlVMTCkKICAgICAgICBvdXQgPSAiIjsKICAgIHNucHJpbnRmKHJlcywgNDk5LCAiJXMlcyVzIiwgb3V0LCBiYXNlLCBzdWZmaXgpOwogICAgcmVzWzQ5OV0gPSAwOwogICAgcmV0dXJuKHN0cmR1cChyZXMpKTsKfQoKc3RhdGljIGludCBjaGVja1Rlc3RGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7CiAgICBzdHJ1Y3Qgc3RhdCBidWY7CgogICAgaWYgKHN0YXQoZmlsZW5hbWUsICZidWYpID09IC0xKQogICAgICAgIHJldHVybigwKTsKCiNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKICAgIGlmICghKGJ1Zi5zdF9tb2RlICYgX1NfSUZSRUcpKQogICAgICAgIHJldHVybigwKTsKI2Vsc2UKICAgIGlmICghU19JU1JFRyhidWYuc3RfbW9kZSkpCiAgICAgICAgcmV0dXJuKDApOwojZW5kaWYKCiAgICByZXR1cm4oMSk7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZUZpbGVzKGNvbnN0IGNoYXIgKnIxLCBjb25zdCBjaGFyICpyMikgewogICAgaW50IHJlczEsIHJlczI7CiAgICBpbnQgZmQxLCBmZDI7CiAgICBjaGFyIGJ5dGVzMVs0MDk2XTsKICAgIGNoYXIgYnl0ZXMyWzQwOTZdOwoKICAgIGZkMSA9IG9wZW4ocjEsIFJEX0ZMQUdTKTsKICAgIGlmIChmZDEgPCAwKQogICAgICAgIHJldHVybigtMSk7CiAgICBmZDIgPSBvcGVuKHIyLCBSRF9GTEFHUyk7CiAgICBpZiAoZmQyIDwgMCkgewogICAgICAgIGNsb3NlKGZkMSk7CiAgICAgICAgcmV0dXJuKC0xKTsKICAgIH0KICAgIHdoaWxlICgxKSB7CiAgICAgICAgcmVzMSA9IHJlYWQoZmQxLCBieXRlczEsIDQwOTYpOwogICAgICAgIHJlczIgPSByZWFkKGZkMiwgYnl0ZXMyLCA0MDk2KTsKCWlmIChyZXMxICE9IHJlczIpIHsKCSAgICBjbG9zZShmZDEpOwoJICAgIGNsb3NlKGZkMik7CgkgICAgcmV0dXJuKDEpOwoJfQoJaWYgKHJlczEgPT0gMCkKCSAgICBicmVhazsKCWlmIChtZW1jbXAoYnl0ZXMxLCBieXRlczIsIHJlczEpICE9IDApIHsKCSAgICBjbG9zZShmZDEpOwoJICAgIGNsb3NlKGZkMik7CgkgICAgcmV0dXJuKDEpOwoJfQogICAgfQogICAgY2xvc2UoZmQxKTsKICAgIGNsb3NlKGZkMik7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZUZpbGVNZW0oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1lbSwgaW50IHNpemUpIHsKICAgIGludCByZXM7CiAgICBpbnQgZmQ7CiAgICBjaGFyIGJ5dGVzWzQwOTZdOwogICAgaW50IGlkeCA9IDA7CiAgICBzdHJ1Y3Qgc3RhdCBpbmZvOwoKICAgIGlmIChzdGF0KGZpbGVuYW1lLCAmaW5mbykgPCAwKSAKCXJldHVybigtMSk7CiAgICBpZiAoaW5mby5zdF9zaXplICE9IHNpemUpCiAgICAgICAgcmV0dXJuKC0xKTsKICAgIGZkID0gb3BlbihmaWxlbmFtZSwgUkRfRkxBR1MpOwogICAgaWYgKGZkIDwgMCkKICAgICAgICByZXR1cm4oLTEpOwogICAgd2hpbGUgKGlkeCA8IHNpemUpIHsKICAgICAgICByZXMgPSByZWFkKGZkLCBieXRlcywgNDA5Nik7CglpZiAocmVzIDw9IDApCgkgICAgYnJlYWs7CglpZiAocmVzICsgaWR4ID4gc2l6ZSkgCgkgICAgYnJlYWs7CglpZiAobWVtY21wKGJ5dGVzLCAmbWVtW2lkeF0sIHJlcykgIT0gMCkgewoJICAgIGludCBpeDsKCSAgICBmb3IgKGl4PTA7IGl4PHJlczsgaXgrKykKCQlpZiAoYnl0ZXNbaXhdICE9IG1lbVtpZHgraXhdKQoJCQlicmVhazsKCSAgICBmcHJpbnRmKHN0ZGVyciwiQ29tcGFyZSBlcnJvciBhdCBwb3NpdGlvbiAlZFxuIiwgaWR4K2l4KTsKCSAgICBjbG9zZShmZCk7CgkgICAgcmV0dXJuKDEpOwoJfQoJaWR4ICs9IHJlczsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgIHJldHVybihpZHggIT0gc2l6ZSk7Cn0KCnN0YXRpYyBpbnQgbG9hZE1lbShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqKm1lbSwgaW50ICpzaXplKSB7CiAgICBpbnQgZmQsIHJlczsKICAgIHN0cnVjdCBzdGF0IGluZm87CiAgICBjaGFyICpiYXNlOwogICAgaW50IHNpeiA9IDA7CiAgICBpZiAoc3RhdChmaWxlbmFtZSwgJmluZm8pIDwgMCkgCglyZXR1cm4oLTEpOwogICAgYmFzZSA9IG1hbGxvYyhpbmZvLnN0X3NpemUgKyAxKTsKICAgIGlmIChiYXNlID09IE5VTEwpCglyZXR1cm4oLTEpOwogICAgaWYgKChmZCA9IG9wZW4oZmlsZW5hbWUsIFJEX0ZMQUdTKSkgPCAwKSB7CiAgICAgICAgZnJlZShiYXNlKTsKCXJldHVybigtMSk7CiAgICB9CiAgICB3aGlsZSAoKHJlcyA9IHJlYWQoZmQsICZiYXNlW3Npel0sIGluZm8uc3Rfc2l6ZSAtIHNpeikpID4gMCkgewogICAgICAgIHNpeiArPSByZXM7CiAgICB9CiAgICBjbG9zZShmZCk7CiNpZiAhZGVmaW5lZChfV0lOMzIpCiAgICBpZiAoc2l6ICE9IGluZm8uc3Rfc2l6ZSkgewogICAgICAgIGZyZWUoYmFzZSk7CglyZXR1cm4oLTEpOwogICAgfQojZW5kaWYKICAgIGJhc2Vbc2l6XSA9IDA7CiAgICAqbWVtID0gYmFzZTsKICAgICpzaXplID0gc2l6OwogICAgcmV0dXJuKDApOwp9CgpzdGF0aWMgaW50IHVubG9hZE1lbShjb25zdCBjaGFyICptZW0pIHsKICAgIGZyZWUoKGNoYXIgKiltZW0pOwogICAgcmV0dXJuKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCQkJCQkJKgogKgkJVGVzdHMgaW1wbGVtZW50YXRpb25zCQkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCVBhcnNlIHRvIFNBWCBiYXNlZCB0ZXN0cwkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIEZJTEUgKlNBWGRlYnVnID0gTlVMTDsKCi8qCiAqIGVtcHR5IFNBWCBibG9jawogKi8Kc3RhdGljIHhtbFNBWEhhbmRsZXIgZW1wdHlTQVhIYW5kbGVyU3RydWN0ID0gewogICAgTlVMTCwgLyogaW50ZXJuYWxTdWJzZXQgKi8KICAgIE5VTEwsIC8qIGlzU3RhbmRhbG9uZSAqLwogICAgTlVMTCwgLyogaGFzSW50ZXJuYWxTdWJzZXQgKi8KICAgIE5VTEwsIC8qIGhhc0V4dGVybmFsU3Vic2V0ICovCiAgICBOVUxMLCAvKiByZXNvbHZlRW50aXR5ICovCiAgICBOVUxMLCAvKiBnZXRFbnRpdHkgKi8KICAgIE5VTEwsIC8qIGVudGl0eURlY2wgKi8KICAgIE5VTEwsIC8qIG5vdGF0aW9uRGVjbCAqLwogICAgTlVMTCwgLyogYXR0cmlidXRlRGVjbCAqLwogICAgTlVMTCwgLyogZWxlbWVudERlY2wgKi8KICAgIE5VTEwsIC8qIHVucGFyc2VkRW50aXR5RGVjbCAqLwogICAgTlVMTCwgLyogc2V0RG9jdW1lbnRMb2NhdG9yICovCiAgICBOVUxMLCAvKiBzdGFydERvY3VtZW50ICovCiAgICBOVUxMLCAvKiBlbmREb2N1bWVudCAqLwogICAgTlVMTCwgLyogc3RhcnRFbGVtZW50ICovCiAgICBOVUxMLCAvKiBlbmRFbGVtZW50ICovCiAgICBOVUxMLCAvKiByZWZlcmVuY2UgKi8KICAgIE5VTEwsIC8qIGNoYXJhY3RlcnMgKi8KICAgIE5VTEwsIC8qIGlnbm9yYWJsZVdoaXRlc3BhY2UgKi8KICAgIE5VTEwsIC8qIHByb2Nlc3NpbmdJbnN0cnVjdGlvbiAqLwogICAgTlVMTCwgLyogY29tbWVudCAqLwogICAgTlVMTCwgLyogeG1sUGFyc2VyV2FybmluZyAqLwogICAgTlVMTCwgLyogeG1sUGFyc2VyRXJyb3IgKi8KICAgIE5VTEwsIC8qIHhtbFBhcnNlckVycm9yICovCiAgICBOVUxMLCAvKiBnZXRQYXJhbWV0ZXJFbnRpdHkgKi8KICAgIE5VTEwsIC8qIGNkYXRhQmxvY2s7ICovCiAgICBOVUxMLCAvKiBleHRlcm5hbFN1YnNldDsgKi8KICAgIDEsCiAgICBOVUxMLAogICAgTlVMTCwgLyogc3RhcnRFbGVtZW50TnMgKi8KICAgIE5VTEwsIC8qIGVuZEVsZW1lbnROcyAqLwogICAgTlVMTCAgLyogeG1sU3RydWN0dXJlZEVycm9yRnVuYyAqLwp9OwoKc3RhdGljIHhtbFNBWEhhbmRsZXJQdHIgZW1wdHlTQVhIYW5kbGVyID0gJmVtcHR5U0FYSGFuZGxlclN0cnVjdDsKc3RhdGljIGludCBjYWxsYmFja3MgPSAwOwpzdGF0aWMgaW50IHF1aWV0ID0gMDsKCi8qKgogKiBpc1N0YW5kYWxvbmVEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogSXMgdGhpcyBkb2N1bWVudCB0YWdnZWQgc3RhbmRhbG9uZSA/CiAqCiAqIFJldHVybnMgMSBpZiB0cnVlCiAqLwpzdGF0aWMgaW50CmlzU3RhbmRhbG9uZURlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VEKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybigwKTsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguaXNTdGFuZGFsb25lKClcbiIpOwogICAgcmV0dXJuKDApOwp9CgovKioKICogaGFzSW50ZXJuYWxTdWJzZXREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogRG9lcyB0aGlzIGRvY3VtZW50IGhhcyBhbiBpbnRlcm5hbCBzdWJzZXQKICoKICogUmV0dXJucyAxIGlmIHRydWUKICovCnN0YXRpYyBpbnQKaGFzSW50ZXJuYWxTdWJzZXREZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm4oMCk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmhhc0ludGVybmFsU3Vic2V0KClcbiIpOwogICAgcmV0dXJuKDApOwp9CgovKioKICogaGFzRXh0ZXJuYWxTdWJzZXREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogRG9lcyB0aGlzIGRvY3VtZW50IGhhcyBhbiBleHRlcm5hbCBzdWJzZXQKICoKICogUmV0dXJucyAxIGlmIHRydWUKICovCnN0YXRpYyBpbnQKaGFzRXh0ZXJuYWxTdWJzZXREZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm4oMCk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmhhc0V4dGVybmFsU3Vic2V0KClcbiIpOwogICAgcmV0dXJuKDApOwp9CgovKioKICogaW50ZXJuYWxTdWJzZXREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogRG9lcyB0aGlzIGRvY3VtZW50IGhhcyBhbiBpbnRlcm5hbCBzdWJzZXQKICovCnN0YXRpYyB2b2lkCmludGVybmFsU3Vic2V0RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUsCgkgICAgICAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5pbnRlcm5hbFN1YnNldCglcywiLCBuYW1lKTsKICAgIGlmIChFeHRlcm5hbElEID09IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiICwiKTsKICAgIGVsc2UKCWZwcmludGYoU0FYZGVidWcsICIgJXMsIiwgRXh0ZXJuYWxJRCk7CiAgICBpZiAoU3lzdGVtSUQgPT0gTlVMTCkKCWZwcmludGYoU0FYZGVidWcsICIgKVxuIik7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiICVzKVxuIiwgU3lzdGVtSUQpOwp9CgovKioKICogZXh0ZXJuYWxTdWJzZXREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogRG9lcyB0aGlzIGRvY3VtZW50IGhhcyBhbiBleHRlcm5hbCBzdWJzZXQKICovCnN0YXRpYyB2b2lkCmV4dGVybmFsU3Vic2V0RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUsCgkgICAgICAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5leHRlcm5hbFN1YnNldCglcywiLCBuYW1lKTsKICAgIGlmIChFeHRlcm5hbElEID09IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiICwiKTsKICAgIGVsc2UKCWZwcmludGYoU0FYZGVidWcsICIgJXMsIiwgRXh0ZXJuYWxJRCk7CiAgICBpZiAoU3lzdGVtSUQgPT0gTlVMTCkKCWZwcmludGYoU0FYZGVidWcsICIgKVxuIik7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiICVzKVxuIiwgU3lzdGVtSUQpOwp9CgovKioKICogcmVzb2x2ZUVudGl0eURlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAcHVibGljSWQ6IFRoZSBwdWJsaWMgSUQgb2YgdGhlIGVudGl0eQogKiBAc3lzdGVtSWQ6IFRoZSBzeXN0ZW0gSUQgb2YgdGhlIGVudGl0eQogKgogKiBTcGVjaWFsIGVudGl0eSByZXNvbHZlciwgYmV0dGVyIGxlZnQgdG8gdGhlIHBhcnNlciwgaXQgaGFzCiAqIG1vcmUgY29udGV4dCB0aGFuIHRoZSBhcHBsaWNhdGlvbiBsYXllci4KICogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIE5PVCByZXNvbHZlIHRoZSBlbnRpdGllcywgaW4gdGhhdCBjYXNlCiAqIHRoZSBFTlRJVFlfUkVGIG5vZGVzIGFyZSBidWlsdCBpbiB0aGUgc3RydWN0dXJlIChhbmQgdGhlIHBhcmFtZXRlcgogKiB2YWx1ZXMpLgogKgogKiBSZXR1cm5zIHRoZSB4bWxQYXJzZXJJbnB1dFB0ciBpZiBpbmxpbmVkIG9yIE5VTEwgZm9yIERPTSBiZWhhdmlvdXIuCiAqLwpzdGF0aWMgeG1sUGFyc2VySW5wdXRQdHIKcmVzb2x2ZUVudGl0eURlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpwdWJsaWNJZCwgY29uc3QgeG1sQ2hhciAqc3lzdGVtSWQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuKE5VTEwpOwogICAgLyogeG1sUGFyc2VyQ3R4dFB0ciBjdHh0ID0gKHhtbFBhcnNlckN0eHRQdHIpIGN0eDsgKi8KCiAgICAKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVgucmVzb2x2ZUVudGl0eSgiKTsKICAgIGlmIChwdWJsaWNJZCAhPSBOVUxMKQoJZnByaW50ZihTQVhkZWJ1ZywgIiVzIiwgKGNoYXIgKilwdWJsaWNJZCk7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiICIpOwogICAgaWYgKHN5c3RlbUlkICE9IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiLCAlcylcbiIsIChjaGFyICopc3lzdGVtSWQpOwogICAgZWxzZQoJZnByaW50ZihTQVhkZWJ1ZywgIiwgKVxuIik7Ci8qKioqKioqKioKICAgIGlmIChzeXN0ZW1JZCAhPSBOVUxMKSB7CiAgICAgICAgcmV0dXJuKHhtbE5ld0lucHV0RnJvbUZpbGUoY3R4dCwgKGNoYXIgKikgc3lzdGVtSWQpKTsKICAgIH0KICoqKioqKioqKi8KICAgIHJldHVybihOVUxMKTsKfQoKLyoqCiAqIGdldEVudGl0eURlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogVGhlIGVudGl0eSBuYW1lCiAqCiAqIEdldCBhbiBlbnRpdHkgYnkgbmFtZQogKgogKiBSZXR1cm5zIHRoZSB4bWxQYXJzZXJJbnB1dFB0ciBpZiBpbmxpbmVkIG9yIE5VTEwgZm9yIERPTSBiZWhhdmlvdXIuCiAqLwpzdGF0aWMgeG1sRW50aXR5UHRyCmdldEVudGl0eURlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybihOVUxMKTsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZ2V0RW50aXR5KCVzKVxuIiwgbmFtZSk7CiAgICByZXR1cm4oTlVMTCk7Cn0KCi8qKgogKiBnZXRQYXJhbWV0ZXJFbnRpdHlEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6IFRoZSBlbnRpdHkgbmFtZQogKgogKiBHZXQgYSBwYXJhbWV0ZXIgZW50aXR5IGJ5IG5hbWUKICoKICogUmV0dXJucyB0aGUgeG1sUGFyc2VySW5wdXRQdHIKICovCnN0YXRpYyB4bWxFbnRpdHlQdHIKZ2V0UGFyYW1ldGVyRW50aXR5RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuKE5VTEwpOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5nZXRQYXJhbWV0ZXJFbnRpdHkoJXMpXG4iLCBuYW1lKTsKICAgIHJldHVybihOVUxMKTsKfQoKCi8qKgogKiBlbnRpdHlEZWNsRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiAgdGhlIGVudGl0eSBuYW1lIAogKiBAdHlwZTogIHRoZSBlbnRpdHkgdHlwZSAKICogQHB1YmxpY0lkOiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkKICogQHN5c3RlbUlkOiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkKICogQGNvbnRlbnQ6IHRoZSBlbnRpdHkgdmFsdWUgKHdpdGhvdXQgcHJvY2Vzc2luZykuCiAqCiAqIEFuIGVudGl0eSBkZWZpbml0aW9uIGhhcyBiZWVuIHBhcnNlZAogKi8Kc3RhdGljIHZvaWQKZW50aXR5RGVjbERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKICAgICAgICAgIGNvbnN0IHhtbENoYXIgKnB1YmxpY0lkLCBjb25zdCB4bWxDaGFyICpzeXN0ZW1JZCwgeG1sQ2hhciAqY29udGVudCkKewpjb25zdCB4bWxDaGFyICpudWxsc3RyID0gQkFEX0NBU1QgIihudWxsKSI7CiAgICAvKiBub3QgYWxsIGxpYnJhcmllcyBoYW5kbGUgcHJpbnRpbmcgbnVsbCBwb2ludGVycyBuaWNlbHkgKi8KICAgIGlmIChwdWJsaWNJZCA9PSBOVUxMKQogICAgICAgIHB1YmxpY0lkID0gbnVsbHN0cjsKICAgIGlmIChzeXN0ZW1JZCA9PSBOVUxMKQogICAgICAgIHN5c3RlbUlkID0gbnVsbHN0cjsKICAgIGlmIChjb250ZW50ID09IE5VTEwpCiAgICAgICAgY29udGVudCA9ICh4bWxDaGFyICopbnVsbHN0cjsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5lbnRpdHlEZWNsKCVzLCAlZCwgJXMsICVzLCAlcylcbiIsCiAgICAgICAgICAgIG5hbWUsIHR5cGUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgY29udGVudCk7Cn0KCi8qKgogKiBhdHRyaWJ1dGVEZWNsRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiAgdGhlIGF0dHJpYnV0ZSBuYW1lIAogKiBAdHlwZTogIHRoZSBhdHRyaWJ1dGUgdHlwZSAKICoKICogQW4gYXR0cmlidXRlIGRlZmluaXRpb24gaGFzIGJlZW4gcGFyc2VkCiAqLwpzdGF0aWMgdm9pZAphdHRyaWJ1dGVEZWNsRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKiBlbGVtLAogICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWUsIGludCB0eXBlLCBpbnQgZGVmLAogICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIGRlZmF1bHRWYWx1ZSwgeG1sRW51bWVyYXRpb25QdHIgdHJlZSkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCiAgICAgICAgcmV0dXJuOwogICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBOVUxMKQogICAgICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguYXR0cmlidXRlRGVjbCglcywgJXMsICVkLCAlZCwgTlVMTCwgLi4uKVxuIiwKICAgICAgICAgICAgICAgIGVsZW0sIG5hbWUsIHR5cGUsIGRlZik7CiAgICBlbHNlCiAgICAgICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5hdHRyaWJ1dGVEZWNsKCVzLCAlcywgJWQsICVkLCAlcywgLi4uKVxuIiwKICAgICAgICAgICAgICAgIGVsZW0sIG5hbWUsIHR5cGUsIGRlZiwgZGVmYXVsdFZhbHVlKTsKICAgIHhtbEZyZWVFbnVtZXJhdGlvbih0cmVlKTsKfQoKLyoqCiAqIGVsZW1lbnREZWNsRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiAgdGhlIGVsZW1lbnQgbmFtZSAKICogQHR5cGU6ICB0aGUgZWxlbWVudCB0eXBlIAogKiBAY29udGVudDogdGhlIGVsZW1lbnQgdmFsdWUgKHdpdGhvdXQgcHJvY2Vzc2luZykuCiAqCiAqIEFuIGVsZW1lbnQgZGVmaW5pdGlvbiBoYXMgYmVlbiBwYXJzZWQKICovCnN0YXRpYyB2b2lkCmVsZW1lbnREZWNsRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUsIGludCB0eXBlLAoJICAgIHhtbEVsZW1lbnRDb250ZW50UHRyIGNvbnRlbnQgQVRUUklCVVRFX1VOVVNFRCkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmVsZW1lbnREZWNsKCVzLCAlZCwgLi4uKVxuIiwKICAgICAgICAgICAgbmFtZSwgdHlwZSk7Cn0KCi8qKgogKiBub3RhdGlvbkRlY2xEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBub3RhdGlvbgogKiBAcHVibGljSWQ6IFRoZSBwdWJsaWMgSUQgb2YgdGhlIGVudGl0eQogKiBAc3lzdGVtSWQ6IFRoZSBzeXN0ZW0gSUQgb2YgdGhlIGVudGl0eQogKgogKiBXaGF0IHRvIGRvIHdoZW4gYSBub3RhdGlvbiBkZWNsYXJhdGlvbiBoYXMgYmVlbiBwYXJzZWQuCiAqLwpzdGF0aWMgdm9pZApub3RhdGlvbkRlY2xEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqbmFtZSwKCSAgICAgY29uc3QgeG1sQ2hhciAqcHVibGljSWQsIGNvbnN0IHhtbENoYXIgKnN5c3RlbUlkKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVgubm90YXRpb25EZWNsKCVzLCAlcywgJXMpXG4iLAogICAgICAgICAgICAoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBwdWJsaWNJZCwgKGNoYXIgKikgc3lzdGVtSWQpOwp9CgovKioKICogdW5wYXJzZWRFbnRpdHlEZWNsRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgZW50aXR5CiAqIEBwdWJsaWNJZDogVGhlIHB1YmxpYyBJRCBvZiB0aGUgZW50aXR5CiAqIEBzeXN0ZW1JZDogVGhlIHN5c3RlbSBJRCBvZiB0aGUgZW50aXR5CiAqIEBub3RhdGlvbk5hbWU6IHRoZSBuYW1lIG9mIHRoZSBub3RhdGlvbgogKgogKiBXaGF0IHRvIGRvIHdoZW4gYW4gdW5wYXJzZWQgZW50aXR5IGRlY2xhcmF0aW9uIGlzIHBhcnNlZAogKi8Kc3RhdGljIHZvaWQKdW5wYXJzZWRFbnRpdHlEZWNsRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUsCgkJICAgY29uc3QgeG1sQ2hhciAqcHVibGljSWQsIGNvbnN0IHhtbENoYXIgKnN5c3RlbUlkLAoJCSAgIGNvbnN0IHhtbENoYXIgKm5vdGF0aW9uTmFtZSkKewpjb25zdCB4bWxDaGFyICpudWxsc3RyID0gQkFEX0NBU1QgIihudWxsKSI7CgogICAgaWYgKHB1YmxpY0lkID09IE5VTEwpCiAgICAgICAgcHVibGljSWQgPSBudWxsc3RyOwogICAgaWYgKHN5c3RlbUlkID09IE5VTEwpCiAgICAgICAgc3lzdGVtSWQgPSBudWxsc3RyOwogICAgaWYgKG5vdGF0aW9uTmFtZSA9PSBOVUxMKQogICAgICAgIG5vdGF0aW9uTmFtZSA9IG51bGxzdHI7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVgudW5wYXJzZWRFbnRpdHlEZWNsKCVzLCAlcywgJXMsICVzKVxuIiwKICAgICAgICAgICAgKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgcHVibGljSWQsIChjaGFyICopIHN5c3RlbUlkLAoJICAgIChjaGFyICopIG5vdGF0aW9uTmFtZSk7Cn0KCi8qKgogKiBzZXREb2N1bWVudExvY2F0b3JEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQGxvYzogQSBTQVggTG9jYXRvcgogKgogKiBSZWNlaXZlIHRoZSBkb2N1bWVudCBsb2NhdG9yIGF0IHN0YXJ0dXAsIGFjdHVhbGx5IHhtbERlZmF1bHRTQVhMb2NhdG9yCiAqIEV2ZXJ5dGhpbmcgaXMgYXZhaWxhYmxlIG9uIHRoZSBjb250ZXh0LCBzbyB0aGlzIGlzIHVzZWxlc3MgaW4gb3VyIGNhc2UuCiAqLwpzdGF0aWMgdm9pZApzZXREb2N1bWVudExvY2F0b3JEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgeG1sU0FYTG9jYXRvclB0ciBsb2MgQVRUUklCVVRFX1VOVVNFRCkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnNldERvY3VtZW50TG9jYXRvcigpXG4iKTsKfQoKLyoqCiAqIHN0YXJ0RG9jdW1lbnREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogY2FsbGVkIHdoZW4gdGhlIGRvY3VtZW50IHN0YXJ0IGJlaW5nIHByb2Nlc3NlZC4KICovCnN0YXRpYyB2b2lkCnN0YXJ0RG9jdW1lbnREZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnN0YXJ0RG9jdW1lbnQoKVxuIik7Cn0KCi8qKgogKiBlbmREb2N1bWVudERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKgogKiBjYWxsZWQgd2hlbiB0aGUgZG9jdW1lbnQgZW5kIGhhcyBiZWVuIGRldGVjdGVkLgogKi8Kc3RhdGljIHZvaWQKZW5kRG9jdW1lbnREZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmVuZERvY3VtZW50KClcbiIpOwp9CgovKioKICogc3RhcnRFbGVtZW50RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiAgVGhlIGVsZW1lbnQgbmFtZQogKgogKiBjYWxsZWQgd2hlbiBhbiBvcGVuaW5nIHRhZyBoYXMgYmVlbiBwcm9jZXNzZWQuCiAqLwpzdGF0aWMgdm9pZApzdGFydEVsZW1lbnREZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqbmFtZSwgY29uc3QgeG1sQ2hhciAqKmF0dHMpCnsKICAgIGludCBpOwoKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5zdGFydEVsZW1lbnQoJXMiLCAoY2hhciAqKSBuYW1lKTsKICAgIGlmIChhdHRzICE9IE5VTEwpIHsKICAgICAgICBmb3IgKGkgPSAwOyhhdHRzW2ldICE9IE5VTEwpO2krKykgewoJICAgIGZwcmludGYoU0FYZGVidWcsICIsICVzPSciLCBhdHRzW2krK10pOwoJICAgIGlmIChhdHRzW2ldICE9IE5VTEwpCgkgICAgICAgIGZwcmludGYoU0FYZGVidWcsICIlcyciLCBhdHRzW2ldKTsKCX0KICAgIH0KICAgIGZwcmludGYoU0FYZGVidWcsICIpXG4iKTsKfQoKLyoqCiAqIGVuZEVsZW1lbnREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6ICBUaGUgZWxlbWVudCBuYW1lCiAqCiAqIGNhbGxlZCB3aGVuIHRoZSBlbmQgb2YgYW4gZWxlbWVudCBoYXMgYmVlbiBkZXRlY3RlZC4KICovCnN0YXRpYyB2b2lkCmVuZEVsZW1lbnREZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqbmFtZSkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmVuZEVsZW1lbnQoJXMpXG4iLCAoY2hhciAqKSBuYW1lKTsKfQoKLyoqCiAqIGNoYXJhY3RlcnNEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQGNoOiAgYSB4bWxDaGFyIHN0cmluZwogKiBAbGVuOiB0aGUgbnVtYmVyIG9mIHhtbENoYXIKICoKICogcmVjZWl2aW5nIHNvbWUgY2hhcnMgZnJvbSB0aGUgcGFyc2VyLgogKiBRdWVzdGlvbjogaG93IG11Y2ggYXQgYSB0aW1lID8/PwogKi8Kc3RhdGljIHZvaWQKY2hhcmFjdGVyc0RlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpjaCwgaW50IGxlbikKewogICAgY2hhciBvdXRwdXRbNDBdOwogICAgaW50IGk7CgogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmb3IgKGkgPSAwOyhpPGxlbikgJiYgKGkgPCAzMCk7aSsrKQoJb3V0cHV0W2ldID0gY2hbaV07CiAgICBvdXRwdXRbaV0gPSAwOwoKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguY2hhcmFjdGVycyglcywgJWQpXG4iLCBvdXRwdXQsIGxlbik7Cn0KCi8qKgogKiByZWZlcmVuY2VEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6ICBUaGUgZW50aXR5IG5hbWUKICoKICogY2FsbGVkIHdoZW4gYW4gZW50aXR5IHJlZmVyZW5jZSBpcyBkZXRlY3RlZC4gCiAqLwpzdGF0aWMgdm9pZApyZWZlcmVuY2VEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqbmFtZSkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnJlZmVyZW5jZSglcylcbiIsIG5hbWUpOwp9CgovKioKICogaWdub3JhYmxlV2hpdGVzcGFjZURlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAY2g6ICBhIHhtbENoYXIgc3RyaW5nCiAqIEBzdGFydDogdGhlIGZpcnN0IGNoYXIgaW4gdGhlIHN0cmluZwogKiBAbGVuOiB0aGUgbnVtYmVyIG9mIHhtbENoYXIKICoKICogcmVjZWl2aW5nIHNvbWUgaWdub3JhYmxlIHdoaXRlc3BhY2VzIGZyb20gdGhlIHBhcnNlci4KICogUXVlc3Rpb246IGhvdyBtdWNoIGF0IGEgdGltZSA/Pz8KICovCnN0YXRpYyB2b2lkCmlnbm9yYWJsZVdoaXRlc3BhY2VEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqY2gsIGludCBsZW4pCnsKICAgIGNoYXIgb3V0cHV0WzQwXTsKICAgIGludCBpOwoKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZm9yIChpID0gMDsoaTxsZW4pICYmIChpIDwgMzApO2krKykKCW91dHB1dFtpXSA9IGNoW2ldOwogICAgb3V0cHV0W2ldID0gMDsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguaWdub3JhYmxlV2hpdGVzcGFjZSglcywgJWQpXG4iLCBvdXRwdXQsIGxlbik7Cn0KCi8qKgogKiBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQHRhcmdldDogIHRoZSB0YXJnZXQgbmFtZQogKiBAZGF0YTogdGhlIFBJIGRhdGEncwogKiBAbGVuOiB0aGUgbnVtYmVyIG9mIHhtbENoYXIKICoKICogQSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGhhcyBiZWVuIHBhcnNlZC4KICovCnN0YXRpYyB2b2lkCnByb2Nlc3NpbmdJbnN0cnVjdGlvbkRlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICp0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICpkYXRhKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGlmIChkYXRhICE9IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnByb2Nlc3NpbmdJbnN0cnVjdGlvbiglcywgJXMpXG4iLAoJCShjaGFyICopIHRhcmdldCwgKGNoYXIgKikgZGF0YSk7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnByb2Nlc3NpbmdJbnN0cnVjdGlvbiglcywgTlVMTClcbiIsCgkJKGNoYXIgKikgdGFyZ2V0KTsKfQoKLyoqCiAqIGNkYXRhQmxvY2tEZWJ1ZzoKICogQGN0eDogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KQogKiBAdmFsdWU6ICBUaGUgcGNkYXRhIGNvbnRlbnQKICogQGxlbjogIHRoZSBibG9jayBsZW5ndGgKICoKICogY2FsbGVkIHdoZW4gYSBwY2RhdGEgYmxvY2sgaGFzIGJlZW4gcGFyc2VkCiAqLwpzdGF0aWMgdm9pZApjZGF0YUJsb2NrRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKnZhbHVlLCBpbnQgbGVuKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVgucGNkYXRhKCUuMjBzLCAlZClcbiIsCgkgICAgKGNoYXIgKikgdmFsdWUsIGxlbik7Cn0KCi8qKgogKiBjb21tZW50RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEB2YWx1ZTogIHRoZSBjb21tZW50IGNvbnRlbnQKICoKICogQSBjb21tZW50IGhhcyBiZWVuIHBhcnNlZC4KICovCnN0YXRpYyB2b2lkCmNvbW1lbnREZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqdmFsdWUpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5jb21tZW50KCVzKVxuIiwgdmFsdWUpOwp9CgovKioKICogd2FybmluZ0RlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbXNnOiAgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheS90cmFuc21pdAogKiBALi4uOiAgZXh0cmEgcGFyYW1ldGVycyBmb3IgdGhlIG1lc3NhZ2UgZGlzcGxheQogKgogKiBEaXNwbGF5IGFuZCBmb3JtYXQgYSB3YXJuaW5nIG1lc3NhZ2VzLCBnaXZlcyBmaWxlLCBsaW5lLCBwb3NpdGlvbiBhbmQKICogZXh0cmEgcGFyYW1ldGVycy4KICovCnN0YXRpYyB2b2lkIFhNTENERUNMCndhcm5pbmdEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqbXNnLCAuLi4pCnsKICAgIHZhX2xpc3QgYXJnczsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLndhcm5pbmc6ICIpOwogICAgdmZwcmludGYoU0FYZGVidWcsIG1zZywgYXJncyk7CiAgICB2YV9lbmQoYXJncyk7Cn0KCi8qKgogKiBlcnJvckRlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbXNnOiAgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheS90cmFuc21pdAogKiBALi4uOiAgZXh0cmEgcGFyYW1ldGVycyBmb3IgdGhlIG1lc3NhZ2UgZGlzcGxheQogKgogKiBEaXNwbGF5IGFuZCBmb3JtYXQgYSBlcnJvciBtZXNzYWdlcywgZ2l2ZXMgZmlsZSwgbGluZSwgcG9zaXRpb24gYW5kCiAqIGV4dHJhIHBhcmFtZXRlcnMuCiAqLwpzdGF0aWMgdm9pZCBYTUxDREVDTAplcnJvckRlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICptc2csIC4uLikKewogICAgdmFfbGlzdCBhcmdzOwoKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgdmFfc3RhcnQoYXJncywgbXNnKTsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZXJyb3I6ICIpOwogICAgdmZwcmludGYoU0FYZGVidWcsIG1zZywgYXJncyk7CiAgICB2YV9lbmQoYXJncyk7Cn0KCi8qKgogKiBmYXRhbEVycm9yRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBtc2c6ICB0aGUgbWVzc2FnZSB0byBkaXNwbGF5L3RyYW5zbWl0CiAqIEAuLi46ICBleHRyYSBwYXJhbWV0ZXJzIGZvciB0aGUgbWVzc2FnZSBkaXNwbGF5CiAqCiAqIERpc3BsYXkgYW5kIGZvcm1hdCBhIGZhdGFsRXJyb3IgbWVzc2FnZXMsIGdpdmVzIGZpbGUsIGxpbmUsIHBvc2l0aW9uIGFuZAogKiBleHRyYSBwYXJhbWV0ZXJzLgogKi8Kc3RhdGljIHZvaWQgWE1MQ0RFQ0wKZmF0YWxFcnJvckRlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICptc2csIC4uLikKewogICAgdmFfbGlzdCBhcmdzOwoKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgdmFfc3RhcnQoYXJncywgbXNnKTsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZmF0YWxFcnJvcjogIik7CiAgICB2ZnByaW50ZihTQVhkZWJ1ZywgbXNnLCBhcmdzKTsKICAgIHZhX2VuZChhcmdzKTsKfQoKc3RhdGljIHhtbFNBWEhhbmRsZXIgZGVidWdTQVhIYW5kbGVyU3RydWN0ID0gewogICAgaW50ZXJuYWxTdWJzZXREZWJ1ZywKICAgIGlzU3RhbmRhbG9uZURlYnVnLAogICAgaGFzSW50ZXJuYWxTdWJzZXREZWJ1ZywKICAgIGhhc0V4dGVybmFsU3Vic2V0RGVidWcsCiAgICByZXNvbHZlRW50aXR5RGVidWcsCiAgICBnZXRFbnRpdHlEZWJ1ZywKICAgIGVudGl0eURlY2xEZWJ1ZywKICAgIG5vdGF0aW9uRGVjbERlYnVnLAogICAgYXR0cmlidXRlRGVjbERlYnVnLAogICAgZWxlbWVudERlY2xEZWJ1ZywKICAgIHVucGFyc2VkRW50aXR5RGVjbERlYnVnLAogICAgc2V0RG9jdW1lbnRMb2NhdG9yRGVidWcsCiAgICBzdGFydERvY3VtZW50RGVidWcsCiAgICBlbmREb2N1bWVudERlYnVnLAogICAgc3RhcnRFbGVtZW50RGVidWcsCiAgICBlbmRFbGVtZW50RGVidWcsCiAgICByZWZlcmVuY2VEZWJ1ZywKICAgIGNoYXJhY3RlcnNEZWJ1ZywKICAgIGlnbm9yYWJsZVdoaXRlc3BhY2VEZWJ1ZywKICAgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkRlYnVnLAogICAgY29tbWVudERlYnVnLAogICAgd2FybmluZ0RlYnVnLAogICAgZXJyb3JEZWJ1ZywKICAgIGZhdGFsRXJyb3JEZWJ1ZywKICAgIGdldFBhcmFtZXRlckVudGl0eURlYnVnLAogICAgY2RhdGFCbG9ja0RlYnVnLAogICAgZXh0ZXJuYWxTdWJzZXREZWJ1ZywKICAgIDEsCiAgICBOVUxMLAogICAgTlVMTCwKICAgIE5VTEwsCiAgICBOVUxMCn07CgpzdGF0aWMgeG1sU0FYSGFuZGxlclB0ciBkZWJ1Z1NBWEhhbmRsZXIgPSAmZGVidWdTQVhIYW5kbGVyU3RydWN0OwoKLyoKICogU0FYMiBzcGVjaWZpYyBjYWxsYmFja3MKICovCi8qKgogKiBzdGFydEVsZW1lbnROc0RlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogIFRoZSBlbGVtZW50IG5hbWUKICoKICogY2FsbGVkIHdoZW4gYW4gb3BlbmluZyB0YWcgaGFzIGJlZW4gcHJvY2Vzc2VkLgogKi8Kc3RhdGljIHZvaWQKc3RhcnRFbGVtZW50TnNEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICpsb2NhbG5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqcHJlZml4LAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKlVSSSwKCQkgICAgaW50IG5iX25hbWVzcGFjZXMsCgkJICAgIGNvbnN0IHhtbENoYXIgKipuYW1lc3BhY2VzLAoJCSAgICBpbnQgbmJfYXR0cmlidXRlcywKCQkgICAgaW50IG5iX2RlZmF1bHRlZCwKCQkgICAgY29uc3QgeG1sQ2hhciAqKmF0dHJpYnV0ZXMpCnsKICAgIGludCBpOwoKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5zdGFydEVsZW1lbnROcyglcyIsIChjaGFyICopIGxvY2FsbmFtZSk7CiAgICBpZiAocHJlZml4ID09IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiLCBOVUxMIik7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiLCAlcyIsIChjaGFyICopIHByZWZpeCk7CiAgICBpZiAoVVJJID09IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiLCBOVUxMIik7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiLCAnJXMnIiwgKGNoYXIgKikgVVJJKTsKICAgIGZwcmludGYoU0FYZGVidWcsICIsICVkIiwgbmJfbmFtZXNwYWNlcyk7CiAgICAKICAgIGlmIChuYW1lc3BhY2VzICE9IE5VTEwpIHsKICAgICAgICBmb3IgKGkgPSAwO2kgPCBuYl9uYW1lc3BhY2VzICogMjtpKyspIHsKCSAgICBmcHJpbnRmKFNBWGRlYnVnLCAiLCB4bWxucyIpOwoJICAgIGlmIChuYW1lc3BhY2VzW2ldICE9IE5VTEwpCgkgICAgICAgIGZwcmludGYoU0FYZGVidWcsICI6JXMiLCBuYW1lc3BhY2VzW2ldKTsKCSAgICBpKys7CgkgICAgZnByaW50ZihTQVhkZWJ1ZywgIj0nJXMnIiwgbmFtZXNwYWNlc1tpXSk7Cgl9CiAgICB9CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiLCAlZCwgJWQiLCBuYl9hdHRyaWJ1dGVzLCBuYl9kZWZhdWx0ZWQpOwogICAgaWYgKGF0dHJpYnV0ZXMgIT0gTlVMTCkgewogICAgICAgIGZvciAoaSA9IDA7aSA8IG5iX2F0dHJpYnV0ZXMgKiA1O2kgKz0gNSkgewoJICAgIGlmIChhdHRyaWJ1dGVzW2kgKyAxXSAhPSBOVUxMKQoJCWZwcmludGYoU0FYZGVidWcsICIsICVzOiVzPSciLCBhdHRyaWJ1dGVzW2kgKyAxXSwgYXR0cmlidXRlc1tpXSk7CgkgICAgZWxzZQoJCWZwcmludGYoU0FYZGVidWcsICIsICVzPSciLCBhdHRyaWJ1dGVzW2ldKTsKCSAgICBmcHJpbnRmKFNBWGRlYnVnLCAiJS40cy4uLicsICVkIiwgYXR0cmlidXRlc1tpICsgM10sCgkJICAgIChpbnQpKGF0dHJpYnV0ZXNbaSArIDRdIC0gYXR0cmlidXRlc1tpICsgM10pKTsKCX0KICAgIH0KICAgIGZwcmludGYoU0FYZGVidWcsICIpXG4iKTsKfQoKLyoqCiAqIGVuZEVsZW1lbnREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6ICBUaGUgZWxlbWVudCBuYW1lCiAqCiAqIGNhbGxlZCB3aGVuIHRoZSBlbmQgb2YgYW4gZWxlbWVudCBoYXMgYmVlbiBkZXRlY3RlZC4KICovCnN0YXRpYyB2b2lkCmVuZEVsZW1lbnROc0RlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICpsb2NhbG5hbWUsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKnByZWZpeCwKICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqVVJJKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZW5kRWxlbWVudE5zKCVzIiwgKGNoYXIgKikgbG9jYWxuYW1lKTsKICAgIGlmIChwcmVmaXggPT0gTlVMTCkKCWZwcmludGYoU0FYZGVidWcsICIsIE5VTEwiKTsKICAgIGVsc2UKCWZwcmludGYoU0FYZGVidWcsICIsICVzIiwgKGNoYXIgKikgcHJlZml4KTsKICAgIGlmIChVUkkgPT0gTlVMTCkKCWZwcmludGYoU0FYZGVidWcsICIsIE5VTEwpXG4iKTsKICAgIGVsc2UKCWZwcmludGYoU0FYZGVidWcsICIsICclcycpXG4iLCAoY2hhciAqKSBVUkkpOwp9CgpzdGF0aWMgeG1sU0FYSGFuZGxlciBkZWJ1Z1NBWDJIYW5kbGVyU3RydWN0ID0gewogICAgaW50ZXJuYWxTdWJzZXREZWJ1ZywKICAgIGlzU3RhbmRhbG9uZURlYnVnLAogICAgaGFzSW50ZXJuYWxTdWJzZXREZWJ1ZywKICAgIGhhc0V4dGVybmFsU3Vic2V0RGVidWcsCiAgICByZXNvbHZlRW50aXR5RGVidWcsCiAgICBnZXRFbnRpdHlEZWJ1ZywKICAgIGVudGl0eURlY2xEZWJ1ZywKICAgIG5vdGF0aW9uRGVjbERlYnVnLAogICAgYXR0cmlidXRlRGVjbERlYnVnLAogICAgZWxlbWVudERlY2xEZWJ1ZywKICAgIHVucGFyc2VkRW50aXR5RGVjbERlYnVnLAogICAgc2V0RG9jdW1lbnRMb2NhdG9yRGVidWcsCiAgICBzdGFydERvY3VtZW50RGVidWcsCiAgICBlbmREb2N1bWVudERlYnVnLAogICAgTlVMTCwKICAgIE5VTEwsCiAgICByZWZlcmVuY2VEZWJ1ZywKICAgIGNoYXJhY3RlcnNEZWJ1ZywKICAgIGlnbm9yYWJsZVdoaXRlc3BhY2VEZWJ1ZywKICAgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkRlYnVnLAogICAgY29tbWVudERlYnVnLAogICAgd2FybmluZ0RlYnVnLAogICAgZXJyb3JEZWJ1ZywKICAgIGZhdGFsRXJyb3JEZWJ1ZywKICAgIGdldFBhcmFtZXRlckVudGl0eURlYnVnLAogICAgY2RhdGFCbG9ja0RlYnVnLAogICAgZXh0ZXJuYWxTdWJzZXREZWJ1ZywKICAgIFhNTF9TQVgyX01BR0lDLAogICAgTlVMTCwKICAgIHN0YXJ0RWxlbWVudE5zRGVidWcsCiAgICBlbmRFbGVtZW50TnNEZWJ1ZywKICAgIE5VTEwKfTsKCnN0YXRpYyB4bWxTQVhIYW5kbGVyUHRyIGRlYnVnU0FYMkhhbmRsZXIgPSAmZGVidWdTQVgySGFuZGxlclN0cnVjdDsKCiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECi8qKgogKiBodG1sc3RhcnRFbGVtZW50RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiAgVGhlIGVsZW1lbnQgbmFtZQogKgogKiBjYWxsZWQgd2hlbiBhbiBvcGVuaW5nIHRhZyBoYXMgYmVlbiBwcm9jZXNzZWQuCiAqLwpzdGF0aWMgdm9pZApodG1sc3RhcnRFbGVtZW50RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUsIGNvbnN0IHhtbENoYXIgKiphdHRzKQp7CiAgICBpbnQgaTsKCiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnN0YXJ0RWxlbWVudCglcyIsIChjaGFyICopIG5hbWUpOwogICAgaWYgKGF0dHMgIT0gTlVMTCkgewogICAgICAgIGZvciAoaSA9IDA7KGF0dHNbaV0gIT0gTlVMTCk7aSsrKSB7CgkgICAgZnByaW50ZihTQVhkZWJ1ZywgIiwgJXMiLCBhdHRzW2krK10pOwoJICAgIGlmIChhdHRzW2ldICE9IE5VTEwpIHsKCQl1bnNpZ25lZCBjaGFyIG91dHB1dFs0MF07CgkJY29uc3QgdW5zaWduZWQgY2hhciAqYXR0ID0gYXR0c1tpXTsKCQlpbnQgb3V0bGVuLCBhdHRsZW47CgkgICAgICAgIGZwcmludGYoU0FYZGVidWcsICI9JyIpOwoJCXdoaWxlICgoYXR0bGVuID0gc3RybGVuKChjaGFyKilhdHQpKSA+IDApIHsKCQkgICAgb3V0bGVuID0gc2l6ZW9mIG91dHB1dCAtIDE7CgkJICAgIGh0bWxFbmNvZGVFbnRpdGllcyhvdXRwdXQsICZvdXRsZW4sIGF0dCwgJmF0dGxlbiwgJ1wnJyk7CgkJICAgIG91dHB1dFtvdXRsZW5dID0gMDsKCQkgICAgZnByaW50ZihTQVhkZWJ1ZywgIiVzIiwgKGNoYXIgKikgb3V0cHV0KTsKCQkgICAgYXR0ICs9IGF0dGxlbjsKCQl9CgkJZnByaW50ZihTQVhkZWJ1ZywgIiciKTsKCSAgICB9Cgl9CiAgICB9CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiKVxuIik7Cn0KCi8qKgogKiBodG1sY2hhcmFjdGVyc0RlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAY2g6ICBhIHhtbENoYXIgc3RyaW5nCiAqIEBsZW46IHRoZSBudW1iZXIgb2YgeG1sQ2hhcgogKgogKiByZWNlaXZpbmcgc29tZSBjaGFycyBmcm9tIHRoZSBwYXJzZXIuCiAqIFF1ZXN0aW9uOiBob3cgbXVjaCBhdCBhIHRpbWUgPz8/CiAqLwpzdGF0aWMgdm9pZApodG1sY2hhcmFjdGVyc0RlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpjaCwgaW50IGxlbikKewogICAgdW5zaWduZWQgY2hhciBvdXRwdXRbNDBdOwogICAgaW50IGlubGVuID0gbGVuLCBvdXRsZW4gPSAzMDsKCiAgICBodG1sRW5jb2RlRW50aXRpZXMob3V0cHV0LCAmb3V0bGVuLCBjaCwgJmlubGVuLCAwKTsKICAgIG91dHB1dFtvdXRsZW5dID0gMDsKCiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmNoYXJhY3RlcnMoJXMsICVkKVxuIiwgb3V0cHV0LCBsZW4pOwp9CgovKioKICogaHRtbGNkYXRhRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBjaDogIGEgeG1sQ2hhciBzdHJpbmcKICogQGxlbjogdGhlIG51bWJlciBvZiB4bWxDaGFyCiAqCiAqIHJlY2VpdmluZyBzb21lIGNkYXRhIGNoYXJzIGZyb20gdGhlIHBhcnNlci4KICogUXVlc3Rpb246IGhvdyBtdWNoIGF0IGEgdGltZSA/Pz8KICovCnN0YXRpYyB2b2lkCmh0bWxjZGF0YURlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpjaCwgaW50IGxlbikKewogICAgdW5zaWduZWQgY2hhciBvdXRwdXRbNDBdOwogICAgaW50IGlubGVuID0gbGVuLCBvdXRsZW4gPSAzMDsKCiAgICBodG1sRW5jb2RlRW50aXRpZXMob3V0cHV0LCAmb3V0bGVuLCBjaCwgJmlubGVuLCAwKTsKICAgIG91dHB1dFtvdXRsZW5dID0gMDsKCiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmNkYXRhKCVzLCAlZClcbiIsIG91dHB1dCwgbGVuKTsKfQoKc3RhdGljIHhtbFNBWEhhbmRsZXIgZGVidWdIVE1MU0FYSGFuZGxlclN0cnVjdCA9IHsKICAgIGludGVybmFsU3Vic2V0RGVidWcsCiAgICBpc1N0YW5kYWxvbmVEZWJ1ZywKICAgIGhhc0ludGVybmFsU3Vic2V0RGVidWcsCiAgICBoYXNFeHRlcm5hbFN1YnNldERlYnVnLAogICAgcmVzb2x2ZUVudGl0eURlYnVnLAogICAgZ2V0RW50aXR5RGVidWcsCiAgICBlbnRpdHlEZWNsRGVidWcsCiAgICBub3RhdGlvbkRlY2xEZWJ1ZywKICAgIGF0dHJpYnV0ZURlY2xEZWJ1ZywKICAgIGVsZW1lbnREZWNsRGVidWcsCiAgICB1bnBhcnNlZEVudGl0eURlY2xEZWJ1ZywKICAgIHNldERvY3VtZW50TG9jYXRvckRlYnVnLAogICAgc3RhcnREb2N1bWVudERlYnVnLAogICAgZW5kRG9jdW1lbnREZWJ1ZywKICAgIGh0bWxzdGFydEVsZW1lbnREZWJ1ZywKICAgIGVuZEVsZW1lbnREZWJ1ZywKICAgIHJlZmVyZW5jZURlYnVnLAogICAgaHRtbGNoYXJhY3RlcnNEZWJ1ZywKICAgIGlnbm9yYWJsZVdoaXRlc3BhY2VEZWJ1ZywKICAgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkRlYnVnLAogICAgY29tbWVudERlYnVnLAogICAgd2FybmluZ0RlYnVnLAogICAgZXJyb3JEZWJ1ZywKICAgIGZhdGFsRXJyb3JEZWJ1ZywKICAgIGdldFBhcmFtZXRlckVudGl0eURlYnVnLAogICAgaHRtbGNkYXRhRGVidWcsCiAgICBleHRlcm5hbFN1YnNldERlYnVnLAogICAgMSwKICAgIE5VTEwsCiAgICBOVUxMLAogICAgTlVMTCwKICAgIE5VTEwKfTsKCnN0YXRpYyB4bWxTQVhIYW5kbGVyUHRyIGRlYnVnSFRNTFNBWEhhbmRsZXIgPSAmZGVidWdIVE1MU0FYSGFuZGxlclN0cnVjdDsKI2VuZGlmIC8qIExJQlhNTF9IVE1MX0VOQUJMRUQgKi8KCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECi8qKgogKiBzYXhQYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgdXNpbmcgdGhlIFNBWCBBUEkgYW5kIGNoZWNrIGZvciBlcnJvcnMuCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnNheFBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgICBpbnQgb3B0aW9ucykgewogICAgaW50IHJldDsKICAgIGNoYXIgKnRlbXA7CgogICAgbmJfdGVzdHMrKzsKICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBmYXRhbEVycm9yKCk7CiAgICB9CiAgICBTQVhkZWJ1ZyA9IGZvcGVuKHRlbXAsICJ3YiIpOwogICAgaWYgKFNBWGRlYnVnID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSB0byAlc1xuIiwgdGVtcCk7CglmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICAvKiBmb3IgU0FYIHdlIHJlYWxseSB3YW50IHRoZSBjYWxsYmFja3MgdGhvdWdoIHRoZSBjb250ZXh0IGhhbmRsZXJzICovCiAgICB4bWxTZXRTdHJ1Y3R1cmVkRXJyb3JGdW5jKE5VTEwsIE5VTEwpOwogICAgeG1sU2V0R2VuZXJpY0Vycm9yRnVuYyhOVUxMLCB0ZXN0RXJyb3JIYW5kbGVyKTsKCiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKSB7CglodG1sU0FYUGFyc2VGaWxlKGZpbGVuYW1lLCBOVUxMLCBlbXB0eVNBWEhhbmRsZXIsIE5VTEwpOwoJcmV0ID0gMDsKICAgIH0gZWxzZQojZW5kaWYKICAgIHJldCA9IHhtbFNBWFVzZXJQYXJzZUZpbGUoZW1wdHlTQVhIYW5kbGVyLCBOVUxMLCBmaWxlbmFtZSk7CiAgICBpZiAocmV0ID09IFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFkpIHsKICAgICAgICBmcHJpbnRmKFNBWGRlYnVnLCAieG1sU0FYVXNlclBhcnNlRmlsZSByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmV0KTsKICAgICAgICByZXQgPSAwOwogICAgfQogICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigxKTsKICAgIH0KI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX0hUTUwpIHsKCWh0bWxTQVhQYXJzZUZpbGUoZmlsZW5hbWUsIE5VTEwsIGRlYnVnSFRNTFNBWEhhbmRsZXIsIE5VTEwpOwoJcmV0ID0gMDsKICAgIH0gZWxzZQojZW5kaWYKICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX1NBWDEpIHsKCXJldCA9IHhtbFNBWFVzZXJQYXJzZUZpbGUoZGVidWdTQVhIYW5kbGVyLCBOVUxMLCBmaWxlbmFtZSk7CiAgICB9IGVsc2UgewoJcmV0ID0geG1sU0FYVXNlclBhcnNlRmlsZShkZWJ1Z1NBWDJIYW5kbGVyLCBOVUxMLCBmaWxlbmFtZSk7CiAgICB9CiAgICBpZiAocmV0ID09IFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFkpIHsKICAgICAgICBmcHJpbnRmKFNBWGRlYnVnLCAieG1sU0FYVXNlclBhcnNlRmlsZSByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmV0KTsKICAgICAgICByZXQgPSAwOwogICAgfQogICAgZmNsb3NlKFNBWGRlYnVnKTsKICAgIGlmIChjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiR290IGEgZGlmZmVyZW5jZSBmb3IgJXNcbiIsIGZpbGVuYW1lKTsKICAgICAgICByZXQgPSAxOwogICAgfSBlbHNlCiAgICB1bmxpbmsodGVtcCk7CiAgICBmcmVlKHRlbXApOwogICAgCiAgICAvKiBzd2l0Y2ggYmFjayB0byBzdHJ1Y3R1cmVkIGVycm9yIGhhbmRsaW5nICovCiAgICB4bWxTZXRHZW5lcmljRXJyb3JGdW5jKE5VTEwsIE5VTEwpOwogICAgeG1sU2V0U3RydWN0dXJlZEVycm9yRnVuYyhOVUxMLCB0ZXN0U3RydWN0dXJlZEVycm9ySGFuZGxlcik7CgogICAgcmV0dXJuKHJldCk7Cn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCQkJCQkJKgogKgkJUGFyc2UgdG8gdHJlZSBiYXNlZCB0ZXN0cwkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioKICogb2xkUGFyc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXM6IHVudXNlZAogKgogKiBQYXJzZSBhIGZpbGUgdXNpbmcgdGhlIG9sZCB4bWxQYXJzZUZpbGUgQVBJLCB0aGVuIHNlcmlhbGl6ZSBiYWNrCiAqIHJlcGFyc2UgdGhlIHJlc3VsdCBhbmQgc2VyaWFsaXplIGFnYWluLCB0aGVuIGNoZWNrIGZvciBkZXZpYXRpb24KICogaW4gc2VyaWFsaXphdGlvbi4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKb2xkUGFyc2VUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKCSAgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgeG1sRG9jUHRyIGRvYzsKICAgIGNoYXIgKnRlbXA7CiAgICBpbnQgcmVzID0gMDsKCiAgICBuYl90ZXN0cysrOwogICAgLyoKICAgICAqIGJhc2Ugb2YgdGhlIHRlc3QsIHBhcnNlIHdpdGggdGhlIG9sZCBBUEkKICAgICAqLwojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgZG9jID0geG1sUGFyc2VGaWxlKGZpbGVuYW1lKTsKI2Vsc2UKICAgIGRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCAwKTsKI2VuZGlmCiAgICBpZiAoZG9jID09IE5VTEwpCiAgICAgICAgcmV0dXJuKDEpOwogICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCAiIiwgIi5yZXMiKTsKICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnlcbiIpOwogICAgICAgIGZhdGFsRXJyb3IoKTsKICAgIH0KICAgIHhtbFNhdmVGaWxlKHRlbXAsIGRvYyk7CiAgICBpZiAoY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCkpIHsKICAgICAgICByZXMgPSAxOwogICAgfQogICAgeG1sRnJlZURvYyhkb2MpOwoKICAgIC8qCiAgICAgKiBQYXJzZSB0aGUgc2F2ZWQgcmVzdWx0IHRvIG1ha2Ugc3VyZSB0aGUgcm91bmQgdHJpcCBpcyBva2F5CiAgICAgKi8KI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGRvYyA9IHhtbFBhcnNlRmlsZSh0ZW1wKTsKI2Vsc2UKICAgIGRvYyA9IHhtbFJlYWRGaWxlKHRlbXAsIE5VTEwsIDApOwojZW5kaWYKICAgIGlmIChkb2MgPT0gTlVMTCkKICAgICAgICByZXR1cm4oMSk7CiAgICB4bWxTYXZlRmlsZSh0ZW1wLCBkb2MpOwogICAgaWYgKGNvbXBhcmVGaWxlcyh0ZW1wLCByZXN1bHQpKSB7CiAgICAgICAgcmVzID0gMTsKICAgIH0KICAgIHhtbEZyZWVEb2MoZG9jKTsKCiAgICB1bmxpbmsodGVtcCk7CiAgICBmcmVlKHRlbXApOwogICAgcmV0dXJuKHJlcyk7Cn0KCiNpZmRlZiBMSUJYTUxfUFVTSF9FTkFCTEVECi8qKgogKiBwdXNoUGFyc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXM6IHVudXNlZAogKgogKiBQYXJzZSBhIGZpbGUgdXNpbmcgdGhlIFB1c2ggQVBJLCB0aGVuIHNlcmlhbGl6ZSBiYWNrCiAqIHRvIGNoZWNrIGZvciBjb250ZW50LgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApwdXNoUGFyc2VUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKCSAgICAgaW50IG9wdGlvbnMpIHsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7CiAgICBjb25zdCBjaGFyICpiYXNlOwogICAgaW50IHNpemUsIHJlczsKICAgIGludCBjdXIgPSAwOwoKICAgIG5iX3Rlc3RzKys7CiAgICAvKgogICAgICogbG9hZCB0aGUgZG9jdW1lbnQgaW4gbWVtb3J5IGFuZCB3b3JrIGZyb20gdGhlcmUuCiAgICAgKi8KICAgIGlmIChsb2FkTWVtKGZpbGVuYW1lLCAmYmFzZSwgJnNpemUpICE9IDApIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkICVzXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQogICAgCiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKQoJY3R4dCA9IGh0bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dChOVUxMLCBOVUxMLCBiYXNlICsgY3VyLCA0LCBmaWxlbmFtZSwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSk7CiAgICBlbHNlCiNlbmRpZgogICAgY3R4dCA9IHhtbENyZWF0ZVB1c2hQYXJzZXJDdHh0KE5VTEwsIE5VTEwsIGJhc2UgKyBjdXIsIDQsIGZpbGVuYW1lKTsKICAgIHhtbEN0eHRVc2VPcHRpb25zKGN0eHQsIG9wdGlvbnMpOwogICAgY3VyICs9IDQ7CiAgICB3aGlsZSAoY3VyIDwgc2l6ZSkgewogICAgICAgIGlmIChjdXIgKyAxMDI0ID49IHNpemUpIHsKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKCSAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKQoJCWh0bWxQYXJzZUNodW5rKGN0eHQsIGJhc2UgKyBjdXIsIHNpemUgLSBjdXIsIDEpOwoJICAgIGVsc2UKI2VuZGlmCgkgICAgeG1sUGFyc2VDaHVuayhjdHh0LCBiYXNlICsgY3VyLCBzaXplIC0gY3VyLCAxKTsKCSAgICBicmVhazsKCX0gZWxzZSB7CiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECgkgICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfSFRNTCkKCQlodG1sUGFyc2VDaHVuayhjdHh0LCBiYXNlICsgY3VyLCAxMDI0LCAwKTsKCSAgICBlbHNlCiNlbmRpZgoJICAgIHhtbFBhcnNlQ2h1bmsoY3R4dCwgYmFzZSArIGN1ciwgMTAyNCwgMCk7CgkgICAgY3VyICs9IDEwMjQ7Cgl9CiAgICB9CiAgICBkb2MgPSBjdHh0LT5teURvYzsKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX0hUTUwpCiAgICAgICAgcmVzID0gMTsKICAgIGVsc2UKI2VuZGlmCiAgICByZXMgPSBjdHh0LT53ZWxsRm9ybWVkOwogICAgeG1sRnJlZVBhcnNlckN0eHQoY3R4dCk7CiAgICBmcmVlKChjaGFyICopYmFzZSk7CiAgICBpZiAoIXJlcykgewoJeG1sRnJlZURvYyhkb2MpOwoJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKQoJaHRtbERvY0R1bXBNZW1vcnkoZG9jLCAoeG1sQ2hhciAqKikgJmJhc2UsICZzaXplKTsKICAgIGVsc2UKI2VuZGlmCiAgICB4bWxEb2NEdW1wTWVtb3J5KGRvYywgKHhtbENoYXIgKiopICZiYXNlLCAmc2l6ZSk7CiAgICB4bWxGcmVlRG9jKGRvYyk7CiAgICByZXMgPSBjb21wYXJlRmlsZU1lbShyZXN1bHQsIGJhc2UsIHNpemUpOwogICAgaWYgKChiYXNlID09IE5VTEwpIHx8IChyZXMgIT0gMCkpIHsKCWlmIChiYXNlICE9IE5VTEwpCgkgICAgeG1sRnJlZSgoY2hhciAqKWJhc2UpOwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiAgICB4bWxGcmVlKChjaGFyICopYmFzZSk7CiAgICBpZiAoZXJyICE9IE5VTEwpIHsKCXJlcyA9IGNvbXBhcmVGaWxlTWVtKGVyciwgdGVzdEVycm9ycywgdGVzdEVycm9yc1NpemUpOwoJaWYgKHJlcyAhPSAwKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CgkgICAgcmV0dXJuKC0xKTsKCX0KICAgIH0KICAgIHJldHVybigwKTsKfQojZW5kaWYKCi8qKgogKiBtZW1QYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlczogdW51c2VkCiAqCiAqIFBhcnNlIGEgZmlsZSB1c2luZyB0aGUgb2xkIHhtbFJlYWRNZW1vcnkgQVBJLCB0aGVuIHNlcmlhbGl6ZSBiYWNrCiAqIHJlcGFyc2UgdGhlIHJlc3VsdCBhbmQgc2VyaWFsaXplIGFnYWluLCB0aGVuIGNoZWNrIGZvciBkZXZpYXRpb24KICogaW4gc2VyaWFsaXphdGlvbi4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKbWVtUGFyc2VUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKCSAgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgeG1sRG9jUHRyIGRvYzsKICAgIGNvbnN0IGNoYXIgKmJhc2U7CiAgICBpbnQgc2l6ZSwgcmVzOwoKICAgIG5iX3Rlc3RzKys7CiAgICAvKgogICAgICogbG9hZCBhbmQgcGFyc2UgdGhlIG1lbW9yeQogICAgICovCiAgICBpZiAobG9hZE1lbShmaWxlbmFtZSwgJmJhc2UsICZzaXplKSAhPSAwKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gbG9hZCAlc1xuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIAogICAgZG9jID0geG1sUmVhZE1lbW9yeShiYXNlLCBzaXplLCBmaWxlbmFtZSwgTlVMTCwgMCk7CiAgICB1bmxvYWRNZW0oYmFzZSk7CiAgICBpZiAoZG9jID09IE5VTEwpIHsKICAgICAgICByZXR1cm4oMSk7CiAgICB9CiAgICB4bWxEb2NEdW1wTWVtb3J5KGRvYywgKHhtbENoYXIgKiopICZiYXNlLCAmc2l6ZSk7CiAgICB4bWxGcmVlRG9jKGRvYyk7CiAgICByZXMgPSBjb21wYXJlRmlsZU1lbShyZXN1bHQsIGJhc2UsIHNpemUpOwogICAgaWYgKChiYXNlID09IE5VTEwpIHx8IChyZXMgIT0gMCkpIHsKCWlmIChiYXNlICE9IE5VTEwpCgkgICAgeG1sRnJlZSgoY2hhciAqKWJhc2UpOwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiAgICB4bWxGcmVlKChjaGFyICopYmFzZSk7CiAgICByZXR1cm4oMCk7Cn0KCi8qKgogKiBub2VudFBhcnNlVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzOiB1bnVzZWQKICoKICogUGFyc2UgYSBmaWxlIHdpdGggZW50aXR5IHJlc29sdXRpb24sIHRoZW4gc2VyaWFsaXplIGJhY2sKICogcmVwYXJzZSB0aGUgcmVzdWx0IGFuZCBzZXJpYWxpemUgYWdhaW4sIHRoZW4gY2hlY2sgZm9yIGRldmlhdGlvbgogKiBpbiBzZXJpYWxpemF0aW9uLgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApub2VudFBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIgIEFUVFJJQlVURV9VTlVTRUQsCgkgICAgICAgaW50IG9wdGlvbnMpIHsKICAgIHhtbERvY1B0ciBkb2M7CiAgICBjaGFyICp0ZW1wOwogICAgaW50IHJlcyA9IDA7CgogICAgbmJfdGVzdHMrKzsKICAgIC8qCiAgICAgKiBiYXNlIG9mIHRoZSB0ZXN0LCBwYXJzZSB3aXRoIHRoZSBvbGQgQVBJCiAgICAgKi8KICAgIGRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgIGlmIChkb2MgPT0gTlVMTCkKICAgICAgICByZXR1cm4oMSk7CiAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgeG1sU2F2ZUZpbGUodGVtcCwgZG9jKTsKICAgIGlmIChjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KSkgewogICAgICAgIHJlcyA9IDE7CiAgICB9CiAgICB4bWxGcmVlRG9jKGRvYyk7CgogICAgLyoKICAgICAqIFBhcnNlIHRoZSBzYXZlZCByZXN1bHQgdG8gbWFrZSBzdXJlIHRoZSByb3VuZCB0cmlwIGlzIG9rYXkKICAgICAqLwogICAgZG9jID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIE5VTEwsIG9wdGlvbnMpOwogICAgaWYgKGRvYyA9PSBOVUxMKQogICAgICAgIHJldHVybigxKTsKICAgIHhtbFNhdmVGaWxlKHRlbXAsIGRvYyk7CiAgICBpZiAoY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCkpIHsKICAgICAgICByZXMgPSAxOwogICAgfQogICAgeG1sRnJlZURvYyhkb2MpOwoKICAgIHVubGluayh0ZW1wKTsKICAgIGZyZWUodGVtcCk7CiAgICByZXR1cm4ocmVzKTsKfQoKLyoqCiAqIGVyclBhcnNlVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSB1c2luZyB0aGUgeG1sUmVhZEZpbGUgQVBJIGFuZCBjaGVjayBmb3IgZXJyb3JzLgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAplcnJQYXJzZVRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqZXJyLAogICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKICAgIHhtbERvY1B0ciBkb2M7CiAgICBjb25zdCBjaGFyICpiYXNlID0gTlVMTDsKICAgIGludCBzaXplLCByZXMgPSAwOwoKICAgIG5iX3Rlc3RzKys7CiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKSB7CiAgICAgICAgZG9jID0gaHRtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgIH0gZWxzZQojZW5kaWYKI2lmZGVmIExJQlhNTF9YSU5DTFVERV9FTkFCTEVECiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9YSU5DTFVERSkgewoJZG9jID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIE5VTEwsIG9wdGlvbnMpOwoJeG1sWEluY2x1ZGVQcm9jZXNzRmxhZ3MoZG9jLCBvcHRpb25zKTsKICAgIH0gZWxzZQojZW5kaWYKICAgIHsKCXhtbEdldFdhcm5pbmdzRGVmYXVsdFZhbHVlID0gMTsKCWRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgIH0KICAgIHhtbEdldFdhcm5pbmdzRGVmYXVsdFZhbHVlID0gMDsKICAgIGlmIChyZXN1bHQpIHsKCWlmIChkb2MgPT0gTlVMTCkgewoJICAgIGJhc2UgPSAiIjsKCSAgICBzaXplID0gMDsKCX0gZWxzZSB7CiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECgkgICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfSFRNTCkgewoJCWh0bWxEb2NEdW1wTWVtb3J5KGRvYywgKHhtbENoYXIgKiopICZiYXNlLCAmc2l6ZSk7CgkgICAgfSBlbHNlCiNlbmRpZgoJICAgIHhtbERvY0R1bXBNZW1vcnkoZG9jLCAoeG1sQ2hhciAqKikgJmJhc2UsICZzaXplKTsKCX0KCXJlcyA9IGNvbXBhcmVGaWxlTWVtKHJlc3VsdCwgYmFzZSwgc2l6ZSk7CiAgICB9CiAgICBpZiAoZG9jICE9IE5VTEwpIHsKCWlmIChiYXNlICE9IE5VTEwpCgkgICAgeG1sRnJlZSgoY2hhciAqKWJhc2UpOwoJeG1sRnJlZURvYyhkb2MpOwogICAgfQogICAgaWYgKHJlcyAhPSAwKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZXN1bHQgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIGlmIChlcnIgIT0gTlVMTCkgewoJcmVzID0gY29tcGFyZUZpbGVNZW0oZXJyLCB0ZXN0RXJyb3JzLCB0ZXN0RXJyb3JzU2l6ZSk7CglpZiAocmVzICE9IDApIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCSAgICByZXR1cm4oLTEpOwoJfQogICAgfSBlbHNlIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX0RURFZBTElEKSB7CiAgICAgICAgaWYgKHRlc3RFcnJvcnNTaXplICE9IDApCgkgICAgZnByaW50ZihzdGRlcnIsICJWYWxpZGF0aW9uIGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKICAgIH0KCiAgICByZXR1cm4oMCk7Cn0KCiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCVJlYWRlciBiYXNlZCB0ZXN0cwkJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkIHByb2Nlc3NOb2RlKEZJTEUgKm91dCwgeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpIHsKICAgIGNvbnN0IHhtbENoYXIgKm5hbWUsICp2YWx1ZTsKICAgIGludCB0eXBlLCBlbXB0eTsKCiAgICB0eXBlID0geG1sVGV4dFJlYWRlck5vZGVUeXBlKHJlYWRlcik7CiAgICBlbXB0eSA9IHhtbFRleHRSZWFkZXJJc0VtcHR5RWxlbWVudChyZWFkZXIpOwoKICAgIG5hbWUgPSB4bWxUZXh0UmVhZGVyQ29uc3ROYW1lKHJlYWRlcik7CiAgICBpZiAobmFtZSA9PSBOVUxMKQoJbmFtZSA9IEJBRF9DQVNUICItLSI7CgogICAgdmFsdWUgPSB4bWxUZXh0UmVhZGVyQ29uc3RWYWx1ZShyZWFkZXIpOwoKICAgIAogICAgZnByaW50ZihvdXQsICIlZCAlZCAlcyAlZCAlZCIsIAoJICAgIHhtbFRleHRSZWFkZXJEZXB0aChyZWFkZXIpLAoJICAgIHR5cGUsCgkgICAgbmFtZSwKCSAgICBlbXB0eSwKCSAgICB4bWxUZXh0UmVhZGVySGFzVmFsdWUocmVhZGVyKSk7CiAgICBpZiAodmFsdWUgPT0gTlVMTCkKCWZwcmludGYob3V0LCAiXG4iKTsKICAgIGVsc2UgewoJZnByaW50ZihvdXQsICIgJXNcbiIsIHZhbHVlKTsKICAgIH0KfQpzdGF0aWMgaW50CnN0cmVhbVByb2Nlc3NUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgICAgICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXIsIGNvbnN0IGNoYXIgKnJuZykgewogICAgaW50IHJldDsKICAgIGNoYXIgKnRlbXAgPSBOVUxMOwogICAgRklMRSAqdCA9IE5VTEw7CgogICAgaWYgKHJlYWRlciA9PSBOVUxMKQogICAgICAgIHJldHVybigtMSk7CgogICAgbmJfdGVzdHMrKzsKICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgewoJdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCAiIiwgIi5yZXMiKTsKCWlmICh0ZW1wID09IE5VTEwpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnlcbiIpOwoJICAgIGZhdGFsRXJyb3IoKTsKCX0KCXQgPSBmb3Blbih0ZW1wLCAid2IiKTsKCWlmICh0ID09IE5VTEwpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gdGVtcCBmaWxlICVzXG4iLCB0ZW1wKTsKCSAgICBmcmVlKHRlbXApOwoJICAgIHJldHVybigtMSk7Cgl9CiAgICB9CiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECiAgICBpZiAocm5nICE9IE5VTEwpIHsKCXJldCA9IHhtbFRleHRSZWFkZXJSZWxheE5HVmFsaWRhdGUocmVhZGVyLCBybmcpOwoJaWYgKHJldCA8IDApIHsKCSAgICB0ZXN0RXJyb3JIYW5kbGVyKE5VTEwsICJSZWxheC1ORyBzY2hlbWEgJXMgZmFpbGVkIHRvIGNvbXBpbGVcbiIsCgkgICAgICAgICAgICAgICAgICAgICBybmcpOwoJICAgIGZjbG9zZSh0KTsKCSAgICB1bmxpbmsodGVtcCk7CgkgICAgZnJlZSh0ZW1wKTsKCSAgICByZXR1cm4oMCk7Cgl9CiAgICB9CiNlbmRpZgogICAgeG1sR2V0V2FybmluZ3NEZWZhdWx0VmFsdWUgPSAxOwogICAgcmV0ID0geG1sVGV4dFJlYWRlclJlYWQocmVhZGVyKTsKICAgIHdoaWxlIChyZXQgPT0gMSkgewoJaWYgKCh0ICE9IE5VTEwpICYmIChybmcgPT0gTlVMTCkpCgkgICAgcHJvY2Vzc05vZGUodCwgcmVhZGVyKTsKICAgICAgICByZXQgPSB4bWxUZXh0UmVhZGVyUmVhZChyZWFkZXIpOwogICAgfQogICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgdGVzdEVycm9ySGFuZGxlcihOVUxMLCAiJXMgOiBmYWlsZWQgdG8gcGFyc2VcbiIsIGZpbGVuYW1lKTsKICAgIH0KICAgIGlmIChybmcgIT0gTlVMTCkgewogICAgICAgIGlmICh4bWxUZXh0UmVhZGVySXNWYWxpZChyZWFkZXIpICE9IDEpIHsKCSAgICB0ZXN0RXJyb3JIYW5kbGVyKE5VTEwsICIlcyBmYWlscyB0byB2YWxpZGF0ZVxuIiwgZmlsZW5hbWUpOwoJfSBlbHNlIHsKCSAgICB0ZXN0RXJyb3JIYW5kbGVyKE5VTEwsICIlcyB2YWxpZGF0ZXNcbiIsIGZpbGVuYW1lKTsKCX0KICAgIH0KICAgIHhtbEdldFdhcm5pbmdzRGVmYXVsdFZhbHVlID0gMDsKICAgIGlmICh0ICE9IE5VTEwpIHsKICAgICAgICBmY2xvc2UodCk7CglyZXQgPSBjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KTsKCXVubGluayh0ZW1wKTsKCWZyZWUodGVtcCk7CglpZiAocmV0KSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJSZXN1bHQgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJICAgIHJldHVybigtMSk7Cgl9CiAgICB9CiAgICBpZiAoZXJyICE9IE5VTEwpIHsKCXJldCA9IGNvbXBhcmVGaWxlTWVtKGVyciwgdGVzdEVycm9ycywgdGVzdEVycm9yc1NpemUpOwoJaWYgKHJldCAhPSAwKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CgkgICAgcHJpbnRmKCIlcyIsIHRlc3RFcnJvcnMpOwoJICAgIHJldHVybigtMSk7Cgl9CiAgICB9CgogICAgcmV0dXJuKDApOwp9CgovKioKICogc3RyZWFtUGFyc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIHVzaW5nIHRoZSByZWFkZXIgQVBJIGFuZCBjaGVjayBmb3IgZXJyb3JzLgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApzdHJlYW1QYXJzZVRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqZXJyLAogICAgICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOwogICAgaW50IHJldDsKCiAgICByZWFkZXIgPSB4bWxSZWFkZXJGb3JGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgIHJldCA9IHN0cmVhbVByb2Nlc3NUZXN0KGZpbGVuYW1lLCByZXN1bHQsIGVyciwgcmVhZGVyLCBOVUxMKTsKICAgIHhtbEZyZWVUZXh0UmVhZGVyKHJlYWRlcik7CiAgICByZXR1cm4ocmV0KTsKfQoKLyoqCiAqIHdhbGtlclBhcnNlVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSB1c2luZyB0aGUgd2Fsa2VyLCBpLmUuIGEgcmVhZGVyIGJ1aWx0IGZyb20gYSBhdHJlZS4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKd2Fsa2VyUGFyc2VUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgICAgIGludCBvcHRpb25zKSB7CiAgICB4bWxEb2NQdHIgZG9jOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7CiAgICBpbnQgcmV0OwoKICAgIGRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgIGlmIChkb2MgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlICVzXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQogICAgcmVhZGVyID0geG1sUmVhZGVyV2Fsa2VyKGRvYyk7CiAgICByZXQgPSBzdHJlYW1Qcm9jZXNzVGVzdChmaWxlbmFtZSwgcmVzdWx0LCBlcnIsIHJlYWRlciwgTlVMTCk7CiAgICB4bWxGcmVlVGV4dFJlYWRlcihyZWFkZXIpOwogICAgeG1sRnJlZURvYyhkb2MpOwogICAgcmV0dXJuKHJldCk7Cn0KCi8qKgogKiBzdHJlYW1NZW1QYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgdXNpbmcgdGhlIHJlYWRlciBBUEkgZnJvbSBtZW1vcnkgYW5kIGNoZWNrIGZvciBlcnJvcnMuCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnN0cmVhbU1lbVBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICplcnIsCiAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW9ucykgewogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7CiAgICBpbnQgcmV0OwogICAgY29uc3QgY2hhciAqYmFzZTsKICAgIGludCBzaXplOwoKICAgIC8qCiAgICAgKiBsb2FkIGFuZCBwYXJzZSB0aGUgbWVtb3J5CiAgICAgKi8KICAgIGlmIChsb2FkTWVtKGZpbGVuYW1lLCAmYmFzZSwgJnNpemUpICE9IDApIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkICVzXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQogICAgcmVhZGVyID0geG1sUmVhZGVyRm9yTWVtb3J5KGJhc2UsIHNpemUsIGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgIHJldCA9IHN0cmVhbVByb2Nlc3NUZXN0KGZpbGVuYW1lLCByZXN1bHQsIGVyciwgcmVhZGVyLCBOVUxMKTsKICAgIGZyZWUoKGNoYXIgKiliYXNlKTsKICAgIHhtbEZyZWVUZXh0UmVhZGVyKHJlYWRlcik7CiAgICByZXR1cm4ocmV0KTsKfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAojaWZkZWYgTElCWE1MX0RFQlVHX0VOQUJMRUQKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCVhQYXRoIGFuZCBYUG9pbnRlciBiYXNlZCB0ZXN0cwkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIEZJTEUgKnhwYXRoT3V0cHV0OwpzdGF0aWMgeG1sRG9jUHRyIHhwYXRoRG9jdW1lbnQ7CgpzdGF0aWMgdm9pZAp0ZXN0WFBhdGgoY29uc3QgY2hhciAqc3RyLCBpbnQgeHB0ciwgaW50IGV4cHIpIHsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJlczsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OwogICAgCiAgICBuYl90ZXN0cysrOwojaWYgZGVmaW5lZChMSUJYTUxfWFBUUl9FTkFCTEVEKQogICAgaWYgKHhwdHIpIHsKCWN0eHQgPSB4bWxYUHRyTmV3Q29udGV4dCh4cGF0aERvY3VtZW50LCBOVUxMLCBOVUxMKTsKCXJlcyA9IHhtbFhQdHJFdmFsKEJBRF9DQVNUIHN0ciwgY3R4dCk7CiAgICB9IGVsc2UgewojZW5kaWYKCWN0eHQgPSB4bWxYUGF0aE5ld0NvbnRleHQoeHBhdGhEb2N1bWVudCk7CgljdHh0LT5ub2RlID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoeHBhdGhEb2N1bWVudCk7CglpZiAoZXhwcikKCSAgICByZXMgPSB4bWxYUGF0aEV2YWxFeHByZXNzaW9uKEJBRF9DQVNUIHN0ciwgY3R4dCk7CgllbHNlIHsKCSAgICAvKiByZXMgPSB4bWxYUGF0aEV2YWwoQkFEX0NBU1Qgc3RyLCBjdHh0KTsgKi8KCSAgICB4bWxYUGF0aENvbXBFeHByUHRyIGNvbXA7CgoJICAgIGNvbXAgPSB4bWxYUGF0aENvbXBpbGUoQkFEX0NBU1Qgc3RyKTsKCSAgICBpZiAoY29tcCAhPSBOVUxMKSB7CgkJcmVzID0geG1sWFBhdGhDb21waWxlZEV2YWwoY29tcCwgY3R4dCk7CgkJeG1sWFBhdGhGcmVlQ29tcEV4cHIoY29tcCk7CgkgICAgfSBlbHNlCgkJcmVzID0gTlVMTDsKCX0KI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIH0KI2VuZGlmCiAgICB4bWxYUGF0aERlYnVnRHVtcE9iamVjdCh4cGF0aE91dHB1dCwgcmVzLCAwKTsKICAgIHhtbFhQYXRoRnJlZU9iamVjdChyZXMpOwogICAgeG1sWFBhdGhGcmVlQ29udGV4dChjdHh0KTsKfQoKLyoqCiAqIHhwYXRoRXhwclRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgY29udGFpbmluZyBYUGF0aCBzdGFuZGFsb25lIGV4cHJlc3Npb25zIGFuZCBldmFsdWF0ZSB0aGVtCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnhwYXRoQ29tbW9uVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgICAgaW50IHhwdHIsIGludCBleHByKSB7CiAgICBGSUxFICppbnB1dDsKICAgIGNoYXIgZXhwcmVzc2lvbls1MDAwXTsKICAgIGludCBsZW4sIHJldCA9IDA7CiAgICBjaGFyICp0ZW1wOwoKICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBmYXRhbEVycm9yKCk7CiAgICB9CiAgICB4cGF0aE91dHB1dCA9IGZvcGVuKHRlbXAsICJ3YiIpOwogICAgaWYgKHhwYXRoT3V0cHV0ID09IE5VTEwpIHsKCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIHRlbXApOwogICAgICAgIGZyZWUodGVtcCk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIGlucHV0ID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwogICAgaWYgKGlucHV0ID09IE5VTEwpIHsKICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCQkiQ2Fubm90IG9wZW4gJXMgZm9yIHJlYWRpbmdcbiIsIGZpbGVuYW1lKTsKICAgICAgICBmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHdoaWxlIChmZ2V0cyhleHByZXNzaW9uLCA0NTAwLCBpbnB1dCkgIT0gTlVMTCkgewoJbGVuID0gc3RybGVuKGV4cHJlc3Npb24pOwoJbGVuLS07Cgl3aGlsZSAoKGxlbiA+PSAwKSAmJiAKCSAgICAgICAoKGV4cHJlc3Npb25bbGVuXSA9PSAnXG4nKSB8fCAoZXhwcmVzc2lvbltsZW5dID09ICdcdCcpIHx8CgkJKGV4cHJlc3Npb25bbGVuXSA9PSAnXHInKSB8fCAoZXhwcmVzc2lvbltsZW5dID09ICcgJykpKSBsZW4tLTsKCWV4cHJlc3Npb25bbGVuICsgMV0gPSAwOyAgICAgIAoJaWYgKGxlbiA+PSAwKSB7CgkgICAgZnByaW50Zih4cGF0aE91dHB1dCwKCSAgICAgICAgICAgICJcbj09PT09PT09PT09PT09PT09PT09PT09PVxuRXhwcmVzc2lvbjogJXNcbiIsCgkJICAgIGV4cHJlc3Npb24pIDsKCSAgICB0ZXN0WFBhdGgoZXhwcmVzc2lvbiwgeHB0ciwgZXhwcik7Cgl9CiAgICB9CgogICAgZmNsb3NlKGlucHV0KTsKICAgIGZjbG9zZSh4cGF0aE91dHB1dCk7CiAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKCXJldCA9IGNvbXBhcmVGaWxlcyh0ZW1wLCByZXN1bHQpOwoJaWYgKHJldCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCX0KICAgIH0KCiAgICB1bmxpbmsodGVtcCk7CiAgICBmcmVlKHRlbXApOwogICAgcmV0dXJuKHJldCk7Cn0KCi8qKgogKiB4cGF0aEV4cHJUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgWFBhdGggc3RhbmRhbG9uZSBleHByZXNzaW9ucyBhbmQgZXZhbHVhdGUgdGhlbQogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAp4cGF0aEV4cHJUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKHhwYXRoQ29tbW9uVGVzdChmaWxlbmFtZSwgcmVzdWx0LCAwLCAxKSk7Cn0KCi8qKgogKiB4cGF0aERvY1Rlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgY29udGFpbmluZyBYUGF0aCBleHByZXNzaW9ucyBhbmQgZXZhbHVhdGUgdGhlbSBhZ2FpbnN0CiAqIGEgc2V0IG9mIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRzLgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAp4cGF0aERvY1Rlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgICBpbnQgb3B0aW9ucykgewoKICAgIGNoYXIgcGF0dGVybls1MDBdOwogICAgY2hhciByZXN1bHRbNTAwXTsKICAgIGdsb2JfdCBnbG9iYnVmOwogICAgc2l6ZV90IGk7CiAgICBpbnQgcmV0ID0gMCwgcmVzOwoKICAgIHhwYXRoRG9jdW1lbnQgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHwgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfTk9FTlQpOwogICAgaWYgKHhwYXRoRG9jdW1lbnQgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgc25wcmludGYocGF0dGVybiwgNDk5LCAiLi90ZXN0L1hQYXRoL3Rlc3RzLyVzKiIsIGJhc2VGaWxlbmFtZShmaWxlbmFtZSkpOwogICAgcGF0dGVybls0OTldID0gMDsKICAgIGdsb2JidWYuZ2xfb2ZmcyA9IDA7CiAgICBnbG9iKHBhdHRlcm4sIEdMT0JfRE9PRkZTLCBOVUxMLCAmZ2xvYmJ1Zik7CiAgICBmb3IgKGkgPSAwO2kgPCBnbG9iYnVmLmdsX3BhdGhjO2krKykgewogICAgICAgIHNucHJpbnRmKHJlc3VsdCwgNDk5LCAicmVzdWx0L1hQYXRoL3Rlc3RzLyVzIiwKCSAgICAgICAgIGJhc2VGaWxlbmFtZShnbG9iYnVmLmdsX3BhdGh2W2ldKSk7CglyZXMgPSB4cGF0aENvbW1vblRlc3QoZ2xvYmJ1Zi5nbF9wYXRodltpXSwgJnJlc3VsdFswXSwgMCwgMCk7CglpZiAocmVzICE9IDApCgkgICAgcmV0ID0gcmVzOwogICAgfQogICAgZ2xvYmZyZWUoJmdsb2JidWYpOwoKICAgIHhtbEZyZWVEb2MoeHBhdGhEb2N1bWVudCk7CiAgICByZXR1cm4ocmV0KTsKfQoKI2lmZGVmIExJQlhNTF9YUFRSX0VOQUJMRUQKLyoqCiAqIHhwdHJEb2NUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgWFBhdGggZXhwcmVzc2lvbnMgYW5kIGV2YWx1YXRlIHRoZW0gYWdhaW5zdAogKiBhIHNldCBvZiBjb3JyZXNwb25kaW5nIGRvY3VtZW50cy4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKeHB0ckRvY1Rlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICBpbnQgb3B0aW9ucykgewoKICAgIGNoYXIgcGF0dGVybls1MDBdOwogICAgY2hhciByZXN1bHRbNTAwXTsKICAgIGdsb2JfdCBnbG9iYnVmOwogICAgc2l6ZV90IGk7CiAgICBpbnQgcmV0ID0gMCwgcmVzOwoKICAgIHhwYXRoRG9jdW1lbnQgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHwgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfTk9FTlQpOwogICAgaWYgKHhwYXRoRG9jdW1lbnQgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgc25wcmludGYocGF0dGVybiwgNDk5LCAiLi90ZXN0L1hQYXRoL3hwdHIvJXMqIiwgYmFzZUZpbGVuYW1lKGZpbGVuYW1lKSk7CiAgICBwYXR0ZXJuWzQ5OV0gPSAwOwogICAgZ2xvYmJ1Zi5nbF9vZmZzID0gMDsKICAgIGdsb2IocGF0dGVybiwgR0xPQl9ET09GRlMsIE5VTEwsICZnbG9iYnVmKTsKICAgIGZvciAoaSA9IDA7aSA8IGdsb2JidWYuZ2xfcGF0aGM7aSsrKSB7CiAgICAgICAgc25wcmludGYocmVzdWx0LCA0OTksICJyZXN1bHQvWFBhdGgveHB0ci8lcyIsCgkgICAgICAgICBiYXNlRmlsZW5hbWUoZ2xvYmJ1Zi5nbF9wYXRodltpXSkpOwoJcmVzID0geHBhdGhDb21tb25UZXN0KGdsb2JidWYuZ2xfcGF0aHZbaV0sICZyZXN1bHRbMF0sIDEsIDApOwoJaWYgKHJlcyAhPSAwKQoJICAgIHJldCA9IHJlczsKICAgIH0KICAgIGdsb2JmcmVlKCZnbG9iYnVmKTsKCiAgICB4bWxGcmVlRG9jKHhwYXRoRG9jdW1lbnQpOwogICAgcmV0dXJuKHJldCk7Cn0KI2VuZGlmIC8qIExJQlhNTF9YUFRSX0VOQUJMRUQgKi8KCi8qKgogKiB4bWxpZERvY1Rlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgY29udGFpbmluZyB4bWw6aWQgYW5kIGNoZWNrIGZvciBlcnJvcnMgYW5kIHZlcmlmeQogKiB0aGF0IFhQYXRoIHF1ZXJpZXMgd2lsbCB3b3JrIG9uIHRoZW0gYXMgZXhwZWN0ZWQuCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnhtbGlkRG9jVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgIGludCBvcHRpb25zKSB7CgogICAgaW50IHJlcyA9IDA7CiAgICBpbnQgcmV0ID0gMDsKICAgIGNoYXIgKnRlbXA7CgogICAgeHBhdGhEb2N1bWVudCA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgfCBYTUxfUEFSU0VfRFREQVRUUiB8IFhNTF9QQVJTRV9OT0VOVCk7CiAgICBpZiAoeHBhdGhEb2N1bWVudCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gbG9hZCAlc1xuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgeHBhdGhPdXRwdXQgPSBmb3Blbih0ZW1wLCAid2IiKTsKICAgIGlmICh4cGF0aE91dHB1dCA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCB0ZW1wKTsKICAgICAgICB4bWxGcmVlRG9jKHhwYXRoRG9jdW1lbnQpOwogICAgICAgIGZyZWUodGVtcCk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIHRlc3RYUGF0aCgiaWQoJ2JhcicpIiwgMCwgMCk7CgogICAgZmNsb3NlKHhwYXRoT3V0cHV0KTsKICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgewoJcmV0ID0gY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCk7CglpZiAocmV0KSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJSZXN1bHQgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJICAgIHJlcyA9IDE7Cgl9CiAgICB9CgogICAgdW5saW5rKHRlbXApOwogICAgZnJlZSh0ZW1wKTsKICAgIHhtbEZyZWVEb2MoeHBhdGhEb2N1bWVudCk7CgogICAgaWYgKGVyciAhPSBOVUxMKSB7CglyZXQgPSBjb21wYXJlRmlsZU1lbShlcnIsIHRlc3RFcnJvcnMsIHRlc3RFcnJvcnNTaXplKTsKCWlmIChyZXQgIT0gMCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJICAgIHJlcyA9IDE7Cgl9CiAgICB9CiAgICByZXR1cm4ocmVzKTsKfQoKI2VuZGlmIC8qIExJQlhNTF9ERUJVR19FTkFCTEVEICovCiNlbmRpZiAvKiBYUEFUSCAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCQkJCQkJKgogKgkJCVVSSSBiYXNlZCB0ZXN0cwkJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCmhhbmRsZVVSSShjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmJhc2UsIEZJTEUgKm8pIHsKICAgIGludCByZXQ7CiAgICB4bWxVUklQdHIgdXJpOwogICAgeG1sQ2hhciAqcmVzID0gTlVMTCwgKnBhcnNlZCA9IE5VTEw7CgogICAgdXJpID0geG1sQ3JlYXRlVVJJKCk7CgogICAgaWYgKGJhc2UgPT0gTlVMTCkgewoJcmV0ID0geG1sUGFyc2VVUklSZWZlcmVuY2UodXJpLCBzdHIpOwoJaWYgKHJldCAhPSAwKQoJICAgIGZwcmludGYobywgIiVzIDogZXJyb3IgJWRcbiIsIHN0ciwgcmV0KTsKCWVsc2UgewoJICAgIHhtbE5vcm1hbGl6ZVVSSVBhdGgodXJpLT5wYXRoKTsKCSAgICB4bWxQcmludFVSSShvLCB1cmkpOwoJICAgIGZwcmludGYobywgIlxuIik7Cgl9CiAgICB9IGVsc2UgewoJcmVzID0geG1sQnVpbGRVUkkoKHhtbENoYXIgKilzdHIsICh4bWxDaGFyICopIGJhc2UpOwoJaWYgKHJlcyAhPSBOVUxMKSB7CgkgICAgZnByaW50ZihvLCAiJXNcbiIsIChjaGFyICopIHJlcyk7Cgl9CgllbHNlCgkgICAgZnByaW50ZihvLCAiOjpFUlJPUjo6XG4iKTsKICAgIH0KICAgIGlmIChyZXMgIT0gTlVMTCkKCXhtbEZyZWUocmVzKTsKICAgIGlmIChwYXJzZWQgIT0gTlVMTCkKCXhtbEZyZWUocGFyc2VkKTsKICAgIHhtbEZyZWVVUkkodXJpKTsKfQoKLyoqCiAqIHVyaUNvbW1vblRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgY29udGFpbmluZyBVUkkgYW5kIGNoZWNrIGZvciBlcnJvcnMKICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKdXJpQ29tbW9uVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJhc2UpIHsKICAgIGNoYXIgKnRlbXA7CiAgICBGSUxFICpvLCAqZjsKICAgIGNoYXIgc3RyWzEwMjRdOwogICAgaW50IHJlcyA9IDAsIGksIHJldDsKCiAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgbyA9IGZvcGVuKHRlbXAsICJ3YiIpOwogICAgaWYgKG8gPT0gTlVMTCkgewoJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgdGVtcCk7CiAgICAgICAgZnJlZSh0ZW1wKTsKCXJldHVybigtMSk7CiAgICB9CiAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwogICAgaWYgKGYgPT0gTlVMTCkgewoJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CglmY2xvc2Uobyk7Cgl1bmxpbmsodGVtcCk7CiAgICAgICAgZnJlZSh0ZW1wKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgd2hpbGUgKDEpIHsKCS8qCgkgKiByZWFkIG9uZSBsaW5lIGluIHN0cmluZyBidWZmZXIuCgkgKi8KCWlmIChmZ2V0cyAoJnN0clswXSwgc2l6ZW9mIChzdHIpIC0gMSwgZikgPT0gTlVMTCkKCSAgIGJyZWFrOwoKCS8qCgkgKiByZW1vdmUgdGhlIGVuZGluZyBzcGFjZXMKCSAqLwoJaSA9IHN0cmxlbihzdHIpOwoJd2hpbGUgKChpID4gMCkgJiYKCSAgICAgICAoKHN0cltpIC0gMV0gPT0gJ1xuJykgfHwgKHN0cltpIC0gMV0gPT0gJ1xyJykgfHwKCQkoc3RyW2kgLSAxXSA9PSAnICcpIHx8IChzdHJbaSAtIDFdID09ICdcdCcpKSkgewoJICAgIGktLTsKCSAgICBzdHJbaV0gPSAwOwoJfQoJbmJfdGVzdHMrKzsKCWhhbmRsZVVSSShzdHIsIGJhc2UsIG8pOwogICAgfQoKICAgIGZjbG9zZShmKTsKICAgIGZjbG9zZShvKTsKCiAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKCXJldCA9IGNvbXBhcmVGaWxlcyh0ZW1wLCByZXN1bHQpOwoJaWYgKHJldCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCSAgICByZXMgPSAxOwoJfQogICAgfQogICAgaWYgKGVyciAhPSBOVUxMKSB7CglyZXQgPSBjb21wYXJlRmlsZU1lbShlcnIsIHRlc3RFcnJvcnMsIHRlc3RFcnJvcnNTaXplKTsKCWlmIChyZXQgIT0gMCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJICAgIHJlcyA9IDE7Cgl9CiAgICB9CgogICAgdW5saW5rKHRlbXApOwogICAgZnJlZSh0ZW1wKTsKICAgIHJldHVybihyZXMpOwp9CgovKioKICogdXJpUGFyc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgVVJJIGFuZCBjaGVjayBmb3IgZXJyb3JzCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnVyaVBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybih1cmlDb21tb25UZXN0KGZpbGVuYW1lLCByZXN1bHQsIGVyciwgTlVMTCkpOwp9CgovKioKICogdXJpQmFzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgY29udGFpbmluZyBVUkksIGNvbXBvc2UgdGhlbSBhZ2FpbnN0IGEgZml4ZWQgYmFzZSBhbmQKICogY2hlY2sgZm9yIGVycm9ycwogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAp1cmlCYXNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybih1cmlDb21tb25UZXN0KGZpbGVuYW1lLCByZXN1bHQsIGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZm9vLmNvbS9wYXRoL3RvL2luZGV4Lmh0bWw/b3JpZyNoZWxwIikpOwp9CgpzdGF0aWMgaW50IHVyaXBfc3VjY2VzcyA9IDE7CnN0YXRpYyBpbnQgdXJpcF9jdXJyZW50ID0gMDsKc3RhdGljIGNvbnN0IGNoYXIgKnVyaXBfdGVzdFVSTHNbXSA9IHsKICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vYSBiLmh0bWwiLAogICAgInVyaXA6Ly9leGFtcGxlLmNvbS9hJTIwYi5odG1sIiwKICAgICJmaWxlOi8vL3BhdGgvdG8vYSBiLmh0bWwiLAogICAgImZpbGU6Ly8vcGF0aC90by9hJTIwYi5odG1sIiwKICAgICIvcGF0aC90by9hIGIuaHRtbCIsCiAgICAiL3BhdGgvdG8vYSUyMGIuaHRtbCIsCiAgICAidXJpcDovL2V4YW1wbGUuY29tL3Lpc3Vt6S5odG1sIiwKICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vdGVzdD9hPTEmYj0yJTI2MyZjPTQjZm9vIiwKICAgIE5VTEwKfTsKc3RhdGljIGNvbnN0IGNoYXIgKnVyaXBfcmN2c1VSTHNbXSA9IHsKICAgIC8qIGl0IGlzIGFuIFVSSSB0aGUgc3RyaW5ncyBtdXN0IGJlIGVzY2FwZWQgKi8KICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vYSUyMGIuaHRtbCIsCiAgICAvKiBjaGVjayB0aGF0ICUgZXNjYXBpbmcgaXMgbm90IGJyb2tlbiAqLwogICAgInVyaXA6Ly9leGFtcGxlLmNvbS9hJTIwYi5odG1sIiwKICAgIC8qIGl0J3MgYW4gVVJJIHBhdGggdGhlIHN0cmluZ3MgbXVzdCBiZSBlc2NhcGVkICovCiAgICAiZmlsZTovLy9wYXRoL3RvL2ElMjBiLmh0bWwiLAogICAgLyogY2hlY2sgdGhhdCAlIGVzY2FwaW5nIGlzIG5vdCBicm9rZW4gKi8KICAgICJmaWxlOi8vL3BhdGgvdG8vYSUyMGIuaHRtbCIsCiAgICAvKiB0aGlzIGlzIG5vdCBhbiBVUkksIHRoaXMgaXMgYSBwYXRoLCBzbyB0aGlzIHNob3VsZCBub3QgYmUgZXNjYXBlZCAqLwogICAgIi9wYXRoL3RvL2EgYi5odG1sIiwKICAgIC8qIGNoZWNrIHRoYXQgcGF0aHMgd2l0aCAlIGFyZSBub3QgYnJva2VuICovCiAgICAiL3BhdGgvdG8vYSUyMGIuaHRtbCIsCiAgICAvKiBvdXQgb2YgY29udGV4dCB0aGUgZW5jb2RpbmcgY2FuJ3QgYmUgZ3Vlc3NlZCBieXRlIGJ5IGJ5dGUgY29udmVyc2lvbiAqLwogICAgInVyaXA6Ly9leGFtcGxlLmNvbS9yJUU5c3VtJUU5Lmh0bWwiLAogICAgLyogdmVyaWZ5IHdlIGRvbid0IGRlc3Ryb3kgVVJJcyBlc3BlY2lhbGx5IHRoZSBxdWVyeSBwYXJ0ICovCiAgICAidXJpcDovL2V4YW1wbGUuY29tL3Rlc3Q/YT0xJmI9MiUyNjMmYz00I2ZvbyIsCiAgICBOVUxMCn07CnN0YXRpYyBjb25zdCBjaGFyICp1cmlwX3JlcyA9ICI8bGlzdC8+IjsKc3RhdGljIGNvbnN0IGNoYXIgKnVyaXBfY3VyID0gTlVMTDsKc3RhdGljIGludCB1cmlwX3JsZW47CgovKioKICogdXJpcE1hdGNoOgogKiBAVVJJOiBhbiBVUkkgdG8gdGVzdAogKgogKiBDaGVjayBmb3IgYW4gdXJpcDogcXVlcnkKICoKICogUmV0dXJucyAxIGlmIHllcyBhbmQgMCBpZiBhbm90aGVyIElucHV0IG1vZHVsZSBzaG91bGQgYmUgdXNlZAogKi8Kc3RhdGljIGludAp1cmlwTWF0Y2goY29uc3QgY2hhciAqIFVSSSkgewogICAgaWYgKChVUkkgPT0gTlVMTCkgfHwgKCFzdHJjbXAoVVJJLCAiZmlsZTovLy9ldGMveG1sL2NhdGFsb2ciKSkpCiAgICAgICAgcmV0dXJuKDApOwogICAgLyogVmVyaWZ5IHdlIHJlY2VpdmVkIHRoZSBlc2NhcGVkIFVSTCAqLwogICAgaWYgKHN0cmNtcCh1cmlwX3JjdnNVUkxzW3VyaXBfY3VycmVudF0sIFVSSSkpCgl1cmlwX3N1Y2Nlc3MgPSAwOwogICAgcmV0dXJuKDEpOwp9CgovKioKICogdXJpcE9wZW46CiAqIEBVUkk6IGFuIFVSSSB0byB0ZXN0CiAqCiAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHVyaXA6IHF1ZXJ5IGhhbmRsZXIsIGluIHRoaXMgZXhhbXBsZSBzaW1wbHkKICogdGhlIHVyaXBfY3VycmVudCBwb2ludGVyLi4uCiAqCiAqIFJldHVybnMgYW4gSW5wdXQgY29udGV4dCBvciBOVUxMIGluIGNhc2Ugb3IgZXJyb3IKICovCnN0YXRpYyB2b2lkICoKdXJpcE9wZW4oY29uc3QgY2hhciAqIFVSSSkgewogICAgaWYgKChVUkkgPT0gTlVMTCkgfHwgKCFzdHJjbXAoVVJJLCAiZmlsZTovLy9ldGMveG1sL2NhdGFsb2ciKSkpCiAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgLyogVmVyaWZ5IHdlIHJlY2VpdmVkIHRoZSBlc2NhcGVkIFVSTCAqLwogICAgaWYgKHN0cmNtcCh1cmlwX3JjdnNVUkxzW3VyaXBfY3VycmVudF0sIFVSSSkpCgl1cmlwX3N1Y2Nlc3MgPSAwOwogICAgdXJpcF9jdXIgPSB1cmlwX3JlczsKICAgIHVyaXBfcmxlbiA9IHN0cmxlbih1cmlwX3Jlcyk7CiAgICByZXR1cm4oKHZvaWQgKikgdXJpcF9jdXIpOwp9CgovKioKICogdXJpcENsb3NlOgogKiBAY29udGV4dDogdGhlIHJlYWQgY29udGV4dAogKgogKiBDbG9zZSB0aGUgdXJpcDogcXVlcnkgaGFuZGxlcgogKgogKiBSZXR1cm5zIDAgb3IgLTEgaW4gY2FzZSBvZiBlcnJvcgogKi8Kc3RhdGljIGludAp1cmlwQ2xvc2Uodm9pZCAqIGNvbnRleHQpIHsKICAgIGlmIChjb250ZXh0ID09IE5VTEwpIHJldHVybigtMSk7CiAgICB1cmlwX2N1ciA9IE5VTEw7CiAgICB1cmlwX3JsZW4gPSAwOwogICAgcmV0dXJuKDApOwp9CgovKioKICogdXJpcFJlYWQ6CiAqIEBjb250ZXh0OiB0aGUgcmVhZCBjb250ZXh0CiAqIEBidWZmZXI6IHdoZXJlIHRvIHN0b3JlIGRhdGEKICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKICoKICogSW1wbGVtZW50IGFuIHVyaXA6IHF1ZXJ5IHJlYWQuCiAqCiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IKICovCnN0YXRpYyBpbnQKdXJpcFJlYWQodm9pZCAqIGNvbnRleHQsIGNoYXIgKiBidWZmZXIsIGludCBsZW4pIHsKICAgY29uc3QgY2hhciAqcHRyID0gKGNvbnN0IGNoYXIgKikgY29udGV4dDsKCiAgIGlmICgoY29udGV4dCA9PSBOVUxMKSB8fCAoYnVmZmVyID09IE5VTEwpIHx8IChsZW4gPCAwKSkKICAgICAgIHJldHVybigtMSk7CgogICBpZiAobGVuID4gdXJpcF9ybGVuKSBsZW4gPSB1cmlwX3JsZW47CiAgIG1lbWNweShidWZmZXIsIHB0ciwgbGVuKTsKICAgdXJpcF9ybGVuIC09IGxlbjsKICAgcmV0dXJuKGxlbik7Cn0KCnN0YXRpYyBpbnQKdXJpcF9jaGVja1VSTChjb25zdCBjaGFyICpVUkwpIHsKICAgIHhtbERvY1B0ciBkb2M7CgogICAgZG9jID0geG1sUmVhZEZpbGUoVVJMLCBOVUxMLCAwKTsKICAgIGlmIChkb2MgPT0gTlVMTCkKICAgICAgICByZXR1cm4oLTEpOwogICAgeG1sRnJlZURvYyhkb2MpOwogICAgcmV0dXJuKDEpOwp9CgovKioKICogdXJpUGF0aFRlc3Q6CiAqIEBmaWxlbmFtZTogaWdub3JlZAogKiBAcmVzdWx0OiBpZ25vcmVkCiAqIEBlcnI6IGlnbm9yZWQKICoKICogUnVuIGEgc2V0IG9mIHRlc3RzIHRvIGNoZWNrIGhvdyBQYXRoIGFuZCBVUkkgYXJlIGhhbmRsZWQgYmVmb3JlCiAqIGJlaW5nIHBhc3NlZCB0byB0aGUgSS9PIGxheWVyCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnVyaVBhdGhUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaW50IHBhcnNlZDsKICAgIGludCBmYWlsdXJlcyA9IDA7CgogICAgLyoKICAgICAqIHJlZ2lzdGVyIHRoZSBuZXcgSS9PIGhhbmRsZXJzCiAgICAgKi8KICAgIGlmICh4bWxSZWdpc3RlcklucHV0Q2FsbGJhY2tzKHVyaXBNYXRjaCwgdXJpcE9wZW4sIHVyaXBSZWFkLCB1cmlwQ2xvc2UpIDwgMCkKICAgIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byByZWdpc3RlciBIVFRQIGhhbmRsZXJcbiIpOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICBmb3IgKHVyaXBfY3VycmVudCA9IDA7dXJpcF90ZXN0VVJMc1t1cmlwX2N1cnJlbnRdICE9IE5VTEw7dXJpcF9jdXJyZW50KyspIHsKICAgICAgICB1cmlwX3N1Y2Nlc3MgPSAxOwogICAgICAgIHBhcnNlZCA9IHVyaXBfY2hlY2tVUkwodXJpcF90ZXN0VVJMc1t1cmlwX2N1cnJlbnRdKTsKCWlmICh1cmlwX3N1Y2Nlc3MgIT0gMSkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRoZSBVUkwgcGFzc2luZyB0ZXN0IGZvciAlcyIsCgkgICAgICAgICAgICB1cmlwX3Rlc3RVUkxzW3VyaXBfY3VycmVudF0pOwoJICAgIGZhaWx1cmVzKys7Cgl9IGVsc2UgaWYgKHBhcnNlZCAhPSAxKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdGhlIHBhcnNpbmcgdGVzdCBmb3IgJXMiLAoJICAgICAgICAgICAgdXJpcF90ZXN0VVJMc1t1cmlwX2N1cnJlbnRdKTsKCSAgICBmYWlsdXJlcysrOwoJfQoJbmJfdGVzdHMrKzsKICAgIH0KCiAgICB4bWxQb3BJbnB1dENhbGxiYWNrcygpOwogICAgcmV0dXJuKGZhaWx1cmVzKTsKfQoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCQlTY2hlbWFzIHRlc3RzCQkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CnNjaGVtYXNPbmVUZXN0KGNvbnN0IGNoYXIgKnNjaCwKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCwKCSAgICAgICBjb25zdCBjaGFyICplcnIsCgkgICAgICAgaW50IG9wdGlvbnMsCgkgICAgICAgeG1sU2NoZW1hUHRyIHNjaGVtYXMpIHsKICAgIHhtbERvY1B0ciBkb2M7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsKICAgIGludCByZXQgPSAwOwogICAgY2hhciAqdGVtcDsKICAgIEZJTEUgKnNjaGVtYXNPdXRwdXQ7CgogICAgZG9jID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIE5VTEwsIG9wdGlvbnMpOwogICAgaWYgKGRvYyA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gcGFyc2UgaW5zdGFuY2UgJXMgZm9yICVzXG4iLCBmaWxlbmFtZSwgc2NoKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKHJlc3VsdCwgIiIsICIucmVzIik7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBmYXRhbEVycm9yKCk7CiAgICB9CiAgICBzY2hlbWFzT3V0cHV0ID0gZm9wZW4odGVtcCwgIndiIik7CiAgICBpZiAoc2NoZW1hc091dHB1dCA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCB0ZW1wKTsKCXhtbEZyZWVEb2MoZG9jKTsKICAgICAgICBmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICBjdHh0ID0geG1sU2NoZW1hTmV3VmFsaWRDdHh0KHNjaGVtYXMpOwogICAgeG1sU2NoZW1hU2V0VmFsaWRFcnJvcnMoY3R4dCwKICAgICAgICAgKHhtbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jKSB0ZXN0RXJyb3JIYW5kbGVyLAogICAgICAgICAoeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuYykgdGVzdEVycm9ySGFuZGxlciwKCSBjdHh0KTsKICAgIHJldCA9IHhtbFNjaGVtYVZhbGlkYXRlRG9jKGN0eHQsIGRvYyk7CiAgICBpZiAocmV0ID09IDApIHsKCWZwcmludGYoc2NoZW1hc091dHB1dCwgIiVzIHZhbGlkYXRlc1xuIiwgZmlsZW5hbWUpOwogICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CglmcHJpbnRmKHNjaGVtYXNPdXRwdXQsICIlcyBmYWlscyB0byB2YWxpZGF0ZVxuIiwgZmlsZW5hbWUpOwogICAgfSBlbHNlIHsKCWZwcmludGYoc2NoZW1hc091dHB1dCwgIiVzIHZhbGlkYXRpb24gZ2VuZXJhdGVkIGFuIGludGVybmFsIGVycm9yXG4iLAoJICAgICAgIGZpbGVuYW1lKTsKICAgIH0KICAgIGZjbG9zZShzY2hlbWFzT3V0cHV0KTsKICAgIGlmIChyZXN1bHQpIHsKCWlmIChjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KSkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBvbiAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lLCBzY2gpOwoJICAgIHJldCA9IDE7Cgl9CiAgICB9CiAgICB1bmxpbmsodGVtcCk7CiAgICBmcmVlKHRlbXApOwoKICAgIGlmICgocmV0ICE9IDApICYmIChlcnIgIT0gTlVMTCkpIHsKCWlmIChjb21wYXJlRmlsZU1lbShlcnIsIHRlc3RFcnJvcnMsIHRlc3RFcnJvcnNTaXplKSkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZm9yICVzIG9uICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUsIHNjaCk7CgkgICAgcmV0ID0gMTsKCX0gZWxzZSB7CgkgICAgcmV0ID0gMDsKCX0KICAgIH0KCiAgICB4bWxTY2hlbWFGcmVlVmFsaWRDdHh0KGN0eHQpOwogICAgeG1sRnJlZURvYyhkb2MpOwogICAgcmV0dXJuKHJldCk7Cn0KLyoqCiAqIHNjaGVtYXNUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBzY2hlbWFzIGZpbGUKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgY29udGFpbmluZyBVUkksIGNvbXBvc2UgdGhlbSBhZ2FpbnN0IGEgZml4ZWQgYmFzZSBhbmQKICogY2hlY2sgZm9yIGVycm9ycwogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApzY2hlbWFzVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICBpbnQgb3B0aW9ucykgewogICAgY29uc3QgY2hhciAqYmFzZSA9IGJhc2VGaWxlbmFtZShmaWxlbmFtZSk7CiAgICBjb25zdCBjaGFyICpiYXNlMjsKICAgIGNvbnN0IGNoYXIgKmluc3RhbmNlOwogICAgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0OwogICAgeG1sU2NoZW1hUHRyIHNjaGVtYXM7CiAgICBpbnQgcmVzID0gMCwgbGVuLCByZXQ7CiAgICBjaGFyIHBhdHRlcm5bNTAwXTsKICAgIGNoYXIgcHJlZml4WzUwMF07CiAgICBjaGFyIHJlc3VsdFs1MDBdOwogICAgY2hhciBlcnJbNTAwXTsKICAgIGdsb2JfdCBnbG9iYnVmOwogICAgc2l6ZV90IGk7CiAgICBjaGFyIGNvdW50ID0gMDsKCiAgICAvKiBmaXJzdCBjb21waWxlIHRoZSBzY2hlbWFzIGlmIHBvc3NpYmxlICovCiAgICBjdHh0ID0geG1sU2NoZW1hTmV3UGFyc2VyQ3R4dChmaWxlbmFtZSk7CiAgICB4bWxTY2hlbWFTZXRQYXJzZXJFcnJvcnMoY3R4dCwKICAgICAgICAgKHhtbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jKSB0ZXN0RXJyb3JIYW5kbGVyLAogICAgICAgICAoeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuYykgdGVzdEVycm9ySGFuZGxlciwKCSBjdHh0KTsKICAgIHNjaGVtYXMgPSB4bWxTY2hlbWFQYXJzZShjdHh0KTsKICAgIHhtbFNjaGVtYUZyZWVQYXJzZXJDdHh0KGN0eHQpOwoKICAgIC8qCiAgICAgKiBtb3N0IG9mIHRoZSBtZXNzIGlzIGFib3V0IHRoZSBvdXRwdXQgZmlsZW5hbWVzIGdlbmVyYXRlZCBieSB0aGUgTWFrZWZpbGUKICAgICAqLwogICAgbGVuID0gc3RybGVuKGJhc2UpOwogICAgaWYgKChsZW4gPiA0OTkpIHx8IChsZW4gPCA1KSkgewogICAgICAgIHhtbFNjaGVtYUZyZWUoc2NoZW1hcyk7CglyZXR1cm4oLTEpOwogICAgfQogICAgbGVuIC09IDQ7IC8qIHJlbW92ZSB0cmFpbGluZyAueHNkICovCiAgICBpZiAoYmFzZVtsZW4gLSAyXSA9PSAnXycpIHsKICAgICAgICBsZW4gLT0gMjsgLyogcmVtb3ZlIHN1YnRlc3QgbnVtYmVyICovCiAgICB9CiAgICBpZiAoYmFzZVtsZW4gLSAyXSA9PSAnXycpIHsKICAgICAgICBsZW4gLT0gMjsgLyogcmVtb3ZlIHN1YnRlc3QgbnVtYmVyICovCiAgICB9CiAgICBtZW1jcHkocHJlZml4LCBiYXNlLCBsZW4pOwogICAgcHJlZml4W2xlbl0gPSAwOwoKICAgIHNucHJpbnRmKHBhdHRlcm4sIDQ5OSwgIi4vdGVzdC9zY2hlbWFzLyVzXz8ueG1sIiwgcHJlZml4KTsKICAgIHBhdHRlcm5bNDk5XSA9IDA7CgogICAgaWYgKGJhc2VbbGVuXSA9PSAnXycpIHsKICAgICAgICBsZW4gKz0gMjsKCW1lbWNweShwcmVmaXgsIGJhc2UsIGxlbik7CglwcmVmaXhbbGVuXSA9IDA7CiAgICB9CgogICAgZ2xvYmJ1Zi5nbF9vZmZzID0gMDsKICAgIGdsb2IocGF0dGVybiwgR0xPQl9ET09GRlMsIE5VTEwsICZnbG9iYnVmKTsKICAgIGZvciAoaSA9IDA7aSA8IGdsb2JidWYuZ2xfcGF0aGM7aSsrKSB7CiAgICAgICAgdGVzdEVycm9yc1NpemUgPSAwOwoJdGVzdEVycm9yc1swXSA9IDA7CiAgICAgICAgaW5zdGFuY2UgPSBnbG9iYnVmLmdsX3BhdGh2W2ldOwoJYmFzZTIgPSBiYXNlRmlsZW5hbWUoaW5zdGFuY2UpOwoJbGVuID0gc3RybGVuKGJhc2UyKTsKCWlmICgobGVuID4gNikgJiYgKGJhc2UyW2xlbiAtIDZdID09ICdfJykpIHsKCSAgICBjb3VudCA9IGJhc2UyW2xlbiAtIDVdOwoJICAgIHNucHJpbnRmKHJlc3VsdCwgNDk5LCAicmVzdWx0L3NjaGVtYXMvJXNfJWMiLAoJCSAgICAgcHJlZml4LCBjb3VudCk7CgkgICAgcmVzdWx0WzQ5OV0gPSAwOwoJICAgIHNucHJpbnRmKGVyciwgNDk5LCAicmVzdWx0L3NjaGVtYXMvJXNfJWMuZXJyIiwKCQkgICAgIHByZWZpeCwgY291bnQpOwoJICAgIGVycls0OTldID0gMDsKCX0gZWxzZSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJkb24ndCBrbm93IGhvdyB0byBwcm9jZXNzICVzXG4iLCBpbnN0YW5jZSk7CgkgICAgY29udGludWU7Cgl9CglpZiAoc2NoZW1hcyA9PSBOVUxMKSB7Cgl9IGVsc2UgewoJICAgIG5iX3Rlc3RzKys7CgkgICAgcmV0ID0gc2NoZW1hc09uZVRlc3QoZmlsZW5hbWUsIGluc3RhbmNlLCByZXN1bHQsIGVyciwKCSAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLCBzY2hlbWFzKTsKCSAgICBpZiAocmV0ICE9IDApCgkJcmVzID0gcmV0OwoJfQogICAgfQogICAgZ2xvYmZyZWUoJmdsb2JidWYpOwogICAgeG1sU2NoZW1hRnJlZShzY2hlbWFzKTsKCiAgICByZXR1cm4ocmVzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCQlTY2hlbWFzIHRlc3RzCQkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CnJuZ09uZVRlc3QoY29uc3QgY2hhciAqc2NoLAogICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWx0LAoJICAgICAgIGNvbnN0IGNoYXIgKmVyciwKCSAgICAgICBpbnQgb3B0aW9ucywKCSAgICAgICB4bWxSZWxheE5HUHRyIHNjaGVtYXMpIHsKICAgIHhtbERvY1B0ciBkb2M7CiAgICB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQ7CiAgICBpbnQgcmV0ID0gMDsKICAgIGNoYXIgKnRlbXA7CiAgICBGSUxFICpzY2hlbWFzT3V0cHV0OwoKICAgIGRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgIGlmIChkb2MgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIHBhcnNlIGluc3RhbmNlICVzIGZvciAlc1xuIiwgZmlsZW5hbWUsIHNjaCk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShyZXN1bHQsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgc2NoZW1hc091dHB1dCA9IGZvcGVuKHRlbXAsICJ3YiIpOwogICAgaWYgKHNjaGVtYXNPdXRwdXQgPT0gTlVMTCkgewoJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgdGVtcCk7Cgl4bWxGcmVlRG9jKGRvYyk7CiAgICAgICAgZnJlZSh0ZW1wKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgY3R4dCA9IHhtbFJlbGF4TkdOZXdWYWxpZEN0eHQoc2NoZW1hcyk7CiAgICB4bWxSZWxheE5HU2V0VmFsaWRFcnJvcnMoY3R4dCwKICAgICAgICAgKHhtbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuYykgdGVzdEVycm9ySGFuZGxlciwKICAgICAgICAgKHhtbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jKSB0ZXN0RXJyb3JIYW5kbGVyLAoJIGN0eHQpOwogICAgcmV0ID0geG1sUmVsYXhOR1ZhbGlkYXRlRG9jKGN0eHQsIGRvYyk7CiAgICBpZiAocmV0ID09IDApIHsKCXRlc3RFcnJvckhhbmRsZXIoTlVMTCwgIiVzIHZhbGlkYXRlc1xuIiwgZmlsZW5hbWUpOwogICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7Cgl0ZXN0RXJyb3JIYW5kbGVyKE5VTEwsICIlcyBmYWlscyB0byB2YWxpZGF0ZVxuIiwgZmlsZW5hbWUpOwogICAgfSBlbHNlIHsKCXRlc3RFcnJvckhhbmRsZXIoTlVMTCwgIiVzIHZhbGlkYXRpb24gZ2VuZXJhdGVkIGFuIGludGVybmFsIGVycm9yXG4iLAoJICAgICAgIGZpbGVuYW1lKTsKICAgIH0KICAgIGZjbG9zZShzY2hlbWFzT3V0cHV0KTsKICAgIGlmIChyZXN1bHQpIHsKCWlmIChjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KSkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBvbiAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lLCBzY2gpOwoJICAgIHJldCA9IDE7Cgl9CiAgICB9CiAgICB1bmxpbmsodGVtcCk7CiAgICBmcmVlKHRlbXApOwoKICAgIGlmIChlcnIgIT0gTlVMTCkgewoJaWYgKGNvbXBhcmVGaWxlTWVtKGVyciwgdGVzdEVycm9ycywgdGVzdEVycm9yc1NpemUpKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBmb3IgJXMgb24gJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSwgc2NoKTsKCSAgICByZXQgPSAxOwoJICAgIHByaW50ZigiJXMiLCB0ZXN0RXJyb3JzKTsKCX0KICAgIH0KCgogICAgeG1sUmVsYXhOR0ZyZWVWYWxpZEN0eHQoY3R4dCk7CiAgICB4bWxGcmVlRG9jKGRvYyk7CiAgICByZXR1cm4ocmV0KTsKfQovKioKICogcm5nVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgc2NoZW1hcyBmaWxlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYW4gUk5HIHNjaGVtYXMgYW5kIHRoZW4gYXBwbHkgaXQgdG8gdGhlIHJlbGF0ZWQgLnhtbAogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApybmdUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICBjb25zdCBjaGFyICplcnJyIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgIGludCBvcHRpb25zKSB7CiAgICBjb25zdCBjaGFyICpiYXNlID0gYmFzZUZpbGVuYW1lKGZpbGVuYW1lKTsKICAgIGNvbnN0IGNoYXIgKmJhc2UyOwogICAgY29uc3QgY2hhciAqaW5zdGFuY2U7CiAgICB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciBjdHh0OwogICAgeG1sUmVsYXhOR1B0ciBzY2hlbWFzOwogICAgaW50IHJlcyA9IDAsIGxlbiwgcmV0OwogICAgY2hhciBwYXR0ZXJuWzUwMF07CiAgICBjaGFyIHByZWZpeFs1MDBdOwogICAgY2hhciByZXN1bHRbNTAwXTsKICAgIGNoYXIgZXJyWzUwMF07CiAgICBnbG9iX3QgZ2xvYmJ1ZjsKICAgIHNpemVfdCBpOwogICAgY2hhciBjb3VudCA9IDA7CgogICAgLyogZmlyc3QgY29tcGlsZSB0aGUgc2NoZW1hcyBpZiBwb3NzaWJsZSAqLwogICAgY3R4dCA9IHhtbFJlbGF4TkdOZXdQYXJzZXJDdHh0KGZpbGVuYW1lKTsKICAgIHhtbFJlbGF4TkdTZXRQYXJzZXJFcnJvcnMoY3R4dCwKICAgICAgICAgKHhtbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuYykgdGVzdEVycm9ySGFuZGxlciwKICAgICAgICAgKHhtbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jKSB0ZXN0RXJyb3JIYW5kbGVyLAoJIGN0eHQpOwogICAgc2NoZW1hcyA9IHhtbFJlbGF4TkdQYXJzZShjdHh0KTsKICAgIHhtbFJlbGF4TkdGcmVlUGFyc2VyQ3R4dChjdHh0KTsKCiAgICAvKgogICAgICogbW9zdCBvZiB0aGUgbWVzcyBpcyBhYm91dCB0aGUgb3V0cHV0IGZpbGVuYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE1ha2VmaWxlCiAgICAgKi8KICAgIGxlbiA9IHN0cmxlbihiYXNlKTsKICAgIGlmICgobGVuID4gNDk5KSB8fCAobGVuIDwgNSkpIHsKICAgICAgICB4bWxSZWxheE5HRnJlZShzY2hlbWFzKTsKCXJldHVybigtMSk7CiAgICB9CiAgICBsZW4gLT0gNDsgLyogcmVtb3ZlIHRyYWlsaW5nIC5ybmcgKi8KICAgIG1lbWNweShwcmVmaXgsIGJhc2UsIGxlbik7CiAgICBwcmVmaXhbbGVuXSA9IDA7CgogICAgc25wcmludGYocGF0dGVybiwgNDk5LCAiLi90ZXN0L3JlbGF4bmcvJXNfPy54bWwiLCBwcmVmaXgpOwogICAgcGF0dGVybls0OTldID0gMDsKCiAgICBnbG9iYnVmLmdsX29mZnMgPSAwOwogICAgZ2xvYihwYXR0ZXJuLCBHTE9CX0RPT0ZGUywgTlVMTCwgJmdsb2JidWYpOwogICAgZm9yIChpID0gMDtpIDwgZ2xvYmJ1Zi5nbF9wYXRoYztpKyspIHsKICAgICAgICB0ZXN0RXJyb3JzU2l6ZSA9IDA7Cgl0ZXN0RXJyb3JzWzBdID0gMDsKICAgICAgICBpbnN0YW5jZSA9IGdsb2JidWYuZ2xfcGF0aHZbaV07CgliYXNlMiA9IGJhc2VGaWxlbmFtZShpbnN0YW5jZSk7CglsZW4gPSBzdHJsZW4oYmFzZTIpOwoJaWYgKChsZW4gPiA2KSAmJiAoYmFzZTJbbGVuIC0gNl0gPT0gJ18nKSkgewoJICAgIGNvdW50ID0gYmFzZTJbbGVuIC0gNV07CgkgICAgc25wcmludGYocmVzdWx0LCA0OTksICJyZXN1bHQvcmVsYXhuZy8lc18lYyIsCgkJICAgICBwcmVmaXgsIGNvdW50KTsKCSAgICByZXN1bHRbNDk5XSA9IDA7CgkgICAgc25wcmludGYoZXJyLCA0OTksICJyZXN1bHQvcmVsYXhuZy8lc18lYy5lcnIiLAoJCSAgICAgcHJlZml4LCBjb3VudCk7CgkgICAgZXJyWzQ5OV0gPSAwOwoJfSBlbHNlIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgImRvbid0IGtub3cgaG93IHRvIHByb2Nlc3MgJXNcbiIsIGluc3RhbmNlKTsKCSAgICBjb250aW51ZTsKCX0KCWlmIChzY2hlbWFzID09IE5VTEwpIHsKCX0gZWxzZSB7CgkgICAgbmJfdGVzdHMrKzsKCSAgICByZXQgPSBybmdPbmVUZXN0KGZpbGVuYW1lLCBpbnN0YW5jZSwgcmVzdWx0LCBlcnIsCgkgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgc2NoZW1hcyk7CgkgICAgaWYgKHJlcyAhPSAwKQoJCXJldCA9IHJlczsKCX0KICAgIH0KICAgIGdsb2JmcmVlKCZnbG9iYnVmKTsKICAgIHhtbFJlbGF4TkdGcmVlKHNjaGVtYXMpOwoKICAgIHJldHVybihyZXMpOwp9CgojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECi8qKgogKiBybmdTdHJlYW1UZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBzY2hlbWFzIGZpbGUKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIHNldCBvZiBmaWxlcyB3aXRoIHN0cmVhbWluZywgYXBwbHlpbmcgYW4gUk5HIHNjaGVtYXMgCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnJuZ1N0cmVhbVRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycnIgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKICAgIGNvbnN0IGNoYXIgKmJhc2UgPSBiYXNlRmlsZW5hbWUoZmlsZW5hbWUpOwogICAgY29uc3QgY2hhciAqYmFzZTI7CiAgICBjb25zdCBjaGFyICppbnN0YW5jZTsKICAgIGludCByZXMgPSAwLCBsZW4sIHJldDsKICAgIGNoYXIgcGF0dGVybls1MDBdOwogICAgY2hhciBwcmVmaXhbNTAwXTsKICAgIGNoYXIgcmVzdWx0WzUwMF07CiAgICBjaGFyIGVycls1MDBdOwogICAgZ2xvYl90IGdsb2JidWY7CiAgICBzaXplX3QgaTsKICAgIGNoYXIgY291bnQgPSAwOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7CiAgICBpbnQgZGlzYWJsZV9lcnIgPSAwOwoKICAgIC8qCiAgICAgKiBtb3N0IG9mIHRoZSBtZXNzIGlzIGFib3V0IHRoZSBvdXRwdXQgZmlsZW5hbWVzIGdlbmVyYXRlZCBieSB0aGUgTWFrZWZpbGUKICAgICAqLwogICAgbGVuID0gc3RybGVuKGJhc2UpOwogICAgaWYgKChsZW4gPiA0OTkpIHx8IChsZW4gPCA1KSkgewoJZnByaW50ZihzdGRlcnIsICJsZW4oYmFzZSkgPT0gJWQgIVxuIiwgbGVuKTsKCXJldHVybigtMSk7CiAgICB9CiAgICBsZW4gLT0gNDsgLyogcmVtb3ZlIHRyYWlsaW5nIC5ybmcgKi8KICAgIG1lbWNweShwcmVmaXgsIGJhc2UsIGxlbik7CiAgICBwcmVmaXhbbGVuXSA9IDA7CgogICAgLyoKICAgICAqIHN0cmljdGx5IHVuaWZ5aW5nIHRoZSBlcnJvciBtZXNzYWdlcyBpcyBuZWFybHkgaW1wb3NzaWJsZSB0aGlzCiAgICAgKiBoYWNrIGlzIGFsc28gZG9uZSBpbiB0aGUgTWFrZWZpbGUKICAgICAqLwogICAgaWYgKCghc3RyY21wKHByZWZpeCwgInR1dG9yMTBfMSIpKSB8fCAoIXN0cmNtcChwcmVmaXgsICJ0dXRvcjEwXzIiKSkgfHwKICAgICAgICAoIXN0cmNtcChwcmVmaXgsICJ0dXRvcjNfMiIpKSB8fCAoIXN0cmNtcChwcmVmaXgsICIzMDczNzciKSkpIAoJZGlzYWJsZV9lcnIgPSAxOwoKICAgIHNucHJpbnRmKHBhdHRlcm4sIDQ5OSwgIi4vdGVzdC9yZWxheG5nLyVzXz8ueG1sIiwgcHJlZml4KTsKICAgIHBhdHRlcm5bNDk5XSA9IDA7CgogICAgZ2xvYmJ1Zi5nbF9vZmZzID0gMDsKICAgIGdsb2IocGF0dGVybiwgR0xPQl9ET09GRlMsIE5VTEwsICZnbG9iYnVmKTsKICAgIGZvciAoaSA9IDA7aSA8IGdsb2JidWYuZ2xfcGF0aGM7aSsrKSB7CiAgICAgICAgdGVzdEVycm9yc1NpemUgPSAwOwoJdGVzdEVycm9yc1swXSA9IDA7CiAgICAgICAgaW5zdGFuY2UgPSBnbG9iYnVmLmdsX3BhdGh2W2ldOwoJYmFzZTIgPSBiYXNlRmlsZW5hbWUoaW5zdGFuY2UpOwoJbGVuID0gc3RybGVuKGJhc2UyKTsKCWlmICgobGVuID4gNikgJiYgKGJhc2UyW2xlbiAtIDZdID09ICdfJykpIHsKCSAgICBjb3VudCA9IGJhc2UyW2xlbiAtIDVdOwoJICAgIHNucHJpbnRmKHJlc3VsdCwgNDk5LCAicmVzdWx0L3JlbGF4bmcvJXNfJWMiLAoJCSAgICAgcHJlZml4LCBjb3VudCk7CgkgICAgcmVzdWx0WzQ5OV0gPSAwOwoJICAgIHNucHJpbnRmKGVyciwgNDk5LCAicmVzdWx0L3JlbGF4bmcvJXNfJWMuZXJyIiwKCQkgICAgIHByZWZpeCwgY291bnQpOwoJICAgIGVycls0OTldID0gMDsKCX0gZWxzZSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJkb24ndCBrbm93IGhvdyB0byBwcm9jZXNzICVzXG4iLCBpbnN0YW5jZSk7CgkgICAgY29udGludWU7Cgl9CglyZWFkZXIgPSB4bWxSZWFkZXJGb3JGaWxlKGluc3RhbmNlLCBOVUxMLCBvcHRpb25zKTsKCWlmIChyZWFkZXIgPT0gTlVMTCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGJ1aWxkIHJlZGVyIGZvciAlc1xuIiwgaW5zdGFuY2UpOwoJfQoJaWYgKGRpc2FibGVfZXJyID09IDEpCgkgICAgcmV0ID0gc3RyZWFtUHJvY2Vzc1Rlc3QoaW5zdGFuY2UsIHJlc3VsdCwgTlVMTCwgcmVhZGVyLCBmaWxlbmFtZSk7CgllbHNlCgkgICAgcmV0ID0gc3RyZWFtUHJvY2Vzc1Rlc3QoaW5zdGFuY2UsIHJlc3VsdCwgZXJyLCByZWFkZXIsIGZpbGVuYW1lKTsKCXhtbEZyZWVUZXh0UmVhZGVyKHJlYWRlcik7CglpZiAocmV0ICE9IDApIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgImluc3RhbmNlICVzIGZhaWxlZFxuIiwgaW5zdGFuY2UpOwoJICAgIHJlcyA9IHJldDsKCX0KICAgIH0KICAgIGdsb2JmcmVlKCZnbG9iYnVmKTsKCiAgICByZXR1cm4ocmVzKTsKfQojZW5kaWYgLyogUkVBREVSICovCgojZW5kaWYKCiNpZmRlZiBMSUJYTUxfUEFUVEVSTl9FTkFCTEVECiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCQlQYXR0ZXJucyB0ZXN0cwkJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgcGF0dGVybk5vZGUoRklMRSAqb3V0LCB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0dGVybiwgeG1sUGF0dGVyblB0ciBwYXR0ZXJuYywKCQkJeG1sU3RyZWFtQ3R4dFB0ciBwYXRzdHJlYW0pIHsKICAgIHhtbENoYXIgKnBhdGggPSBOVUxMOwogICAgaW50IG1hdGNoID0gLTE7CiAgICBpbnQgdHlwZSwgZW1wdHk7CgogICAgdHlwZSA9IHhtbFRleHRSZWFkZXJOb2RlVHlwZShyZWFkZXIpOwogICAgZW1wdHkgPSB4bWxUZXh0UmVhZGVySXNFbXB0eUVsZW1lbnQocmVhZGVyKTsKCQogICAgaWYgKHR5cGUgPT0gWE1MX1JFQURFUl9UWVBFX0VMRU1FTlQpIHsKCS8qIGRvIHRoZSBjaGVjayBvbmx5IG9uIGVsZW1lbnQgc3RhcnQgKi8KCW1hdGNoID0geG1sUGF0dGVybk1hdGNoKHBhdHRlcm5jLCB4bWxUZXh0UmVhZGVyQ3VycmVudE5vZGUocmVhZGVyKSk7CgoJaWYgKG1hdGNoKSB7CgkgICAgcGF0aCA9IHhtbEdldE5vZGVQYXRoKHhtbFRleHRSZWFkZXJDdXJyZW50Tm9kZShyZWFkZXIpKTsKCSAgICBmcHJpbnRmKG91dCwgIk5vZGUgJXMgbWF0Y2hlcyBwYXR0ZXJuICVzXG4iLCBwYXRoLCBwYXR0ZXJuKTsKCX0KICAgIH0KICAgIGlmIChwYXRzdHJlYW0gIT0gTlVMTCkgewoJaW50IHJldDsKCglpZiAodHlwZSA9PSBYTUxfUkVBREVSX1RZUEVfRUxFTUVOVCkgewoJICAgIHJldCA9IHhtbFN0cmVhbVB1c2gocGF0c3RyZWFtLAoJCQkJeG1sVGV4dFJlYWRlckNvbnN0TG9jYWxOYW1lKHJlYWRlciksCgkJCQl4bWxUZXh0UmVhZGVyQ29uc3ROYW1lc3BhY2VVcmkocmVhZGVyKSk7CgkgICAgaWYgKHJldCA8IDApIHsKCQlmcHJpbnRmKG91dCwgInhtbFN0cmVhbVB1c2goKSBmYWlsdXJlXG4iKTsKCQl4bWxGcmVlU3RyZWFtQ3R4dChwYXRzdHJlYW0pOwoJCXBhdHN0cmVhbSA9IE5VTEw7CgkgICAgfSBlbHNlIGlmIChyZXQgIT0gbWF0Y2gpIHsKCQlpZiAocGF0aCA9PSBOVUxMKSB7CgkJICAgIHBhdGggPSB4bWxHZXROb2RlUGF0aCgKCQkJCSAgIHhtbFRleHRSZWFkZXJDdXJyZW50Tm9kZShyZWFkZXIpKTsKCQl9CgkJZnByaW50ZihvdXQsCgkJCSJ4bWxQYXR0ZXJuTWF0Y2ggYW5kIHhtbFN0cmVhbVB1c2ggZGlzYWdyZWVcbiIpOwoJCWZwcmludGYob3V0LAoJCQkiICBwYXR0ZXJuICVzIG5vZGUgJXNcbiIsCgkJCXBhdHRlcm4sIHBhdGgpOwoJICAgIH0KCSAgICAKCgl9IAoJaWYgKCh0eXBlID09IFhNTF9SRUFERVJfVFlQRV9FTkRfRUxFTUVOVCkgfHwKCSAgICAoKHR5cGUgPT0gWE1MX1JFQURFUl9UWVBFX0VMRU1FTlQpICYmIChlbXB0eSkpKSB7CgkgICAgcmV0ID0geG1sU3RyZWFtUG9wKHBhdHN0cmVhbSk7CgkgICAgaWYgKHJldCA8IDApIHsKCQlmcHJpbnRmKG91dCwgInhtbFN0cmVhbVBvcCgpIGZhaWx1cmVcbiIpOwoJCXhtbEZyZWVTdHJlYW1DdHh0KHBhdHN0cmVhbSk7CgkJcGF0c3RyZWFtID0gTlVMTDsKCSAgICB9Cgl9CiAgICB9CiAgICBpZiAocGF0aCAhPSBOVUxMKQoJeG1sRnJlZShwYXRoKTsKfQoKLyoqCiAqIHBhdHRlcm5UZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBzY2hlbWFzIGZpbGUKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIHNldCBvZiBmaWxlcyB3aXRoIHN0cmVhbWluZywgYXBwbHlpbmcgYW4gUk5HIHNjaGVtYXMgCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnBhdHRlcm5UZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKICAgIHhtbFBhdHRlcm5QdHIgcGF0dGVybmMgPSBOVUxMOwogICAgeG1sU3RyZWFtQ3R4dFB0ciBwYXRzdHJlYW0gPSBOVUxMOwogICAgRklMRSAqbywgKmY7CiAgICBjaGFyIHN0clsxMDI0XTsKICAgIGNoYXIgeG1sWzUwMF07CiAgICBjaGFyIHJlc3VsdFs1MDBdOwogICAgaW50IGxlbiwgaTsKICAgIGludCByZXQgPSAwLCByZXM7CiAgICBjaGFyICp0ZW1wOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7CiAgICB4bWxEb2NQdHIgZG9jOwoKICAgIGxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CiAgICBsZW4gLT0gNDsKICAgIG1lbWNweSh4bWwsIGZpbGVuYW1lLCBsZW4pOwogICAgeG1sW2xlbl0gPSAwOwogICAgc25wcmludGYocmVzdWx0LCA0OTksICJyZXN1bHQvcGF0dGVybi8lcyIsIGJhc2VGaWxlbmFtZSh4bWwpKTsKICAgIHJlc3VsdFs0OTldID0gMDsKICAgIG1lbWNweSh4bWwgKyBsZW4sICIueG1sIiwgNSk7CgogICAgaWYgKCFjaGVja1Rlc3RGaWxlKHhtbCkpIHsKCWZwcmludGYoc3RkZXJyLCAiTWlzc2luZyB4bWwgZmlsZSAlc1xuIiwgeG1sKTsKCXJldHVybigtMSk7CiAgICB9CiAgICBpZiAoIWNoZWNrVGVzdEZpbGUocmVzdWx0KSkgewoJZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIHJlc3VsdCBmaWxlICVzXG4iLCByZXN1bHQpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7CiAgICBpZiAoZiA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiAlc1xuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBmYXRhbEVycm9yKCk7CiAgICB9CiAgICBvID0gZm9wZW4odGVtcCwgIndiIik7CiAgICBpZiAobyA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCB0ZW1wKTsKCWZjbG9zZShmKTsKICAgICAgICBmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHdoaWxlICgxKSB7CgkvKgoJICogcmVhZCBvbmUgbGluZSBpbiBzdHJpbmcgYnVmZmVyLgoJICovCglpZiAoZmdldHMgKCZzdHJbMF0sIHNpemVvZiAoc3RyKSAtIDEsIGYpID09IE5VTEwpCgkgICBicmVhazsKCgkvKgoJICogcmVtb3ZlIHRoZSBlbmRpbmcgc3BhY2VzCgkgKi8KCWkgPSBzdHJsZW4oc3RyKTsKCXdoaWxlICgoaSA+IDApICYmCgkgICAgICAgKChzdHJbaSAtIDFdID09ICdcbicpIHx8IChzdHJbaSAtIDFdID09ICdccicpIHx8CgkJKHN0cltpIC0gMV0gPT0gJyAnKSB8fCAoc3RyW2kgLSAxXSA9PSAnXHQnKSkpIHsKCSAgICBpLS07CgkgICAgc3RyW2ldID0gMDsKCX0KCWRvYyA9IHhtbFJlYWRGaWxlKHhtbCwgTlVMTCwgb3B0aW9ucyk7CglpZiAoZG9jID09IE5VTEwpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSAlc1xuIiwgeG1sKTsKCSAgICByZXQgPSAxOwoJfSBlbHNlIHsKCSAgICB4bWxOb2RlUHRyIHJvb3Q7CgkgICAgY29uc3QgeG1sQ2hhciAqbmFtZXNwYWNlc1syMl07CgkgICAgaW50IGo7CgkgICAgeG1sTnNQdHIgbnM7CgoJICAgIHJvb3QgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOwoJICAgIGZvciAobnMgPSByb290LT5uc0RlZiwgaiA9IDA7bnMgIT0gTlVMTCAmJiBqIDwgMjA7bnM9bnMtPm5leHQpIHsKCQluYW1lc3BhY2VzW2orK10gPSBucy0+aHJlZjsKCQluYW1lc3BhY2VzW2orK10gPSBucy0+cHJlZml4OwoJICAgIH0KCSAgICBuYW1lc3BhY2VzW2orK10gPSBOVUxMOwoJICAgIG5hbWVzcGFjZXNbaisrXSA9IE5VTEw7CgoJICAgIHBhdHRlcm5jID0geG1sUGF0dGVybmNvbXBpbGUoKGNvbnN0IHhtbENoYXIgKikgc3RyLCBkb2MtPmRpY3QsCgkJCQkJIDAsICZuYW1lc3BhY2VzWzBdKTsKCSAgICBpZiAocGF0dGVybmMgPT0gTlVMTCkgewoJCXRlc3RFcnJvckhhbmRsZXIoTlVMTCwKCQkJIlBhdHRlcm4gJXMgZmFpbGVkIHRvIGNvbXBpbGVcbiIsIHN0cik7CgkJeG1sRnJlZURvYyhkb2MpOwoJCXJldCA9IDE7CgkJY29udGludWU7CgkgICAgfQoJICAgIHBhdHN0cmVhbSA9IHhtbFBhdHRlcm5HZXRTdHJlYW1DdHh0KHBhdHRlcm5jKTsKCSAgICBpZiAocGF0c3RyZWFtICE9IE5VTEwpIHsKCQlyZXQgPSB4bWxTdHJlYW1QdXNoKHBhdHN0cmVhbSwgTlVMTCwgTlVMTCk7CgkJaWYgKHJldCA8IDApIHsKCQkgICAgZnByaW50ZihzdGRlcnIsICJ4bWxTdHJlYW1QdXNoKCkgZmFpbHVyZVxuIik7CgkJICAgIHhtbEZyZWVTdHJlYW1DdHh0KHBhdHN0cmVhbSk7CgkJICAgIHBhdHN0cmVhbSA9IE5VTEw7CgkJfQoJICAgIH0KCSAgICBuYl90ZXN0cysrOwoKCSAgICByZWFkZXIgPSB4bWxSZWFkZXJXYWxrZXIoZG9jKTsKCSAgICByZXMgPSB4bWxUZXh0UmVhZGVyUmVhZChyZWFkZXIpOwoJICAgIHdoaWxlIChyZXMgPT0gMSkgewoJCXBhdHRlcm5Ob2RlKG8sIHJlYWRlciwgc3RyLCBwYXR0ZXJuYywgcGF0c3RyZWFtKTsKCQlyZXMgPSB4bWxUZXh0UmVhZGVyUmVhZChyZWFkZXIpOwoJICAgIH0KCSAgICBpZiAocmVzICE9IDApIHsKCQlmcHJpbnRmKG8sICIlcyA6IGZhaWxlZCB0byBwYXJzZVxuIiwgZmlsZW5hbWUpOwoJICAgIH0KCSAgICB4bWxGcmVlVGV4dFJlYWRlcihyZWFkZXIpOwoJICAgIHhtbEZyZWVEb2MoZG9jKTsKCSAgICB4bWxGcmVlU3RyZWFtQ3R4dChwYXRzdHJlYW0pOwoJICAgIHBhdHN0cmVhbSA9IE5VTEw7CgkgICAgeG1sRnJlZVBhdHRlcm4ocGF0dGVybmMpOwoKCX0KICAgIH0KCiAgICBmY2xvc2UoZik7CiAgICBmY2xvc2Uobyk7CgogICAgcmV0ID0gY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCk7CiAgICBpZiAocmV0KSB7CglmcHJpbnRmKHN0ZGVyciwgIlJlc3VsdCBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CglyZXQgPSAxOwogICAgfQogICAgdW5saW5rKHRlbXApOwogICAgZnJlZSh0ZW1wKTsKICAgIHJldHVybihyZXQpOwp9CiNlbmRpZiAvKiBSRUFERVIgKi8KI2VuZGlmIC8qIFBBVFRFUk4gKi8KI2lmZGVmIExJQlhNTF9DMTROX0VOQUJMRUQKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCQlDYW5vbmljYWxpemF0aW9uIHRlc3RzCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB4bWxYUGF0aE9iamVjdFB0cgpsb2FkX3hwYXRoX2V4cHIgKHhtbERvY1B0ciBwYXJlbnRfZG9jLCBjb25zdCBjaGFyKiBmaWxlbmFtZSkgewogICAgeG1sWFBhdGhPYmplY3RQdHIgeHBhdGg7IAogICAgeG1sRG9jUHRyIGRvYzsKICAgIHhtbENoYXIgKmV4cHI7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4OyAKICAgIHhtbE5vZGVQdHIgbm9kZTsKICAgIHhtbE5zUHRyIG5zOwogICAgCiAgICAvKgogICAgICogbG9hZCBYUGF0aCBleHByIGFzIGEgZmlsZQogICAgICovCiAgICB4bWxMb2FkRXh0RHRkRGVmYXVsdFZhbHVlID0gWE1MX0RFVEVDVF9JRFMgfCBYTUxfQ09NUExFVEVfQVRUUlM7CiAgICB4bWxTdWJzdGl0dXRlRW50aXRpZXNEZWZhdWx0KDEpOwoKICAgIGRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBYTUxfUEFSU0VfRFREQVRUUiB8IFhNTF9QQVJTRV9OT0VOVCk7CiAgICBpZiAoZG9jID09IE5VTEwpIHsKCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IHVuYWJsZSB0byBwYXJzZSBmaWxlIFwiJXNcIlxuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgCiAgICAvKgogICAgICogQ2hlY2sgdGhlIGRvY3VtZW50IGlzIG9mIHRoZSByaWdodCBraW5kCiAgICAgKi8gICAgCiAgICBpZih4bWxEb2NHZXRSb290RWxlbWVudChkb2MpID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3I6IGVtcHR5IGRvY3VtZW50IGZvciBmaWxlIFwiJXNcIlxuIiwgZmlsZW5hbWUpOwoJeG1sRnJlZURvYyhkb2MpOwoJcmV0dXJuKE5VTEwpOwogICAgfQoKICAgIG5vZGUgPSBkb2MtPmNoaWxkcmVuOwogICAgd2hpbGUobm9kZSAhPSBOVUxMICYmICF4bWxTdHJFcXVhbChub2RlLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSJYUGF0aCIpKSB7Cglub2RlID0gbm9kZS0+bmV4dDsKICAgIH0KICAgIAogICAgaWYobm9kZSA9PSBOVUxMKSB7ICAgCiAgICAgICAgZnByaW50ZihzdGRlcnIsIkVycm9yOiBYUGF0aCBlbGVtZW50IGV4cGVjdGVkIGluIHRoZSBmaWxlICBcIiVzXCJcbiIsIGZpbGVuYW1lKTsKCXhtbEZyZWVEb2MoZG9jKTsKCXJldHVybihOVUxMKTsKICAgIH0KCiAgICBleHByID0geG1sTm9kZUdldENvbnRlbnQobm9kZSk7CiAgICBpZihleHByID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3I6IFhQYXRoIGNvbnRlbnQgZWxlbWVudCBpcyBOVUxMIFwiJXNcIlxuIiwgZmlsZW5hbWUpOwoJeG1sRnJlZURvYyhkb2MpOwoJcmV0dXJuKE5VTEwpOwogICAgfQoKICAgIGN0eCA9IHhtbFhQYXRoTmV3Q29udGV4dChwYXJlbnRfZG9jKTsKICAgIGlmKGN0eCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIkVycm9yOiB1bmFibGUgdG8gY3JlYXRlIG5ldyBjb250ZXh0XG4iKTsKICAgICAgICB4bWxGcmVlKGV4cHIpOyAKICAgICAgICB4bWxGcmVlRG9jKGRvYyk7IAogICAgICAgIHJldHVybihOVUxMKTsKICAgIH0KCiAgICAvKgogICAgICogUmVnaXN0ZXIgbmFtZXNwYWNlcwogICAgICovCiAgICBucyA9IG5vZGUtPm5zRGVmOwogICAgd2hpbGUobnMgIT0gTlVMTCkgewoJaWYoeG1sWFBhdGhSZWdpc3Rlck5zKGN0eCwgbnMtPnByZWZpeCwgbnMtPmhyZWYpICE9IDApIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3I6IHVuYWJsZSB0byByZWdpc3RlciBOUyB3aXRoIHByZWZpeD1cIiVzXCIgYW5kIGhyZWY9XCIlc1wiXG4iLCBucy0+cHJlZml4LCBucy0+aHJlZik7CiAgICAJICAgIHhtbEZyZWUoZXhwcik7IAoJICAgIHhtbFhQYXRoRnJlZUNvbnRleHQoY3R4KTsgCgkgICAgeG1sRnJlZURvYyhkb2MpOyAKCSAgICByZXR1cm4oTlVMTCk7Cgl9CglucyA9IG5zLT5uZXh0OwogICAgfQoKICAgIC8qICAKICAgICAqIEV2YWx1YXRlIHhwYXRoCiAgICAgKi8KICAgIHhwYXRoID0geG1sWFBhdGhFdmFsRXhwcmVzc2lvbihleHByLCBjdHgpOwogICAgaWYoeHBhdGggPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCJFcnJvcjogdW5hYmxlIHRvIGV2YWx1YXRlIHhwYXRoIGV4cHJlc3Npb25cbiIpOwogICAgCXhtbEZyZWUoZXhwcik7IAogICAgICAgIHhtbFhQYXRoRnJlZUNvbnRleHQoY3R4KTsgCiAgICAgICAgeG1sRnJlZURvYyhkb2MpOyAKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICB9CgogICAgLyogcHJpbnRfeHBhdGhfbm9kZXMoeHBhdGgtPm5vZGVzZXR2YWwpOyAqLwoKICAgIHhtbEZyZWUoZXhwcik7IAogICAgeG1sWFBhdGhGcmVlQ29udGV4dChjdHgpOyAKICAgIHhtbEZyZWVEb2MoZG9jKTsgCiAgICByZXR1cm4oeHBhdGgpOwp9CgovKgogKiBNYWNybyB1c2VkIHRvIGdyb3cgdGhlIGN1cnJlbnQgYnVmZmVyLgogKi8KI2RlZmluZSB4eHhfZ3Jvd0J1ZmZlclJlZW50cmFudCgpIHsJCQkJCQlcCiAgICBidWZmZXJfc2l6ZSAqPSAyOwkJCQkJCQlcCiAgICBidWZmZXIgPSAoeG1sQ2hhciAqKikJCQkJCQlcCiAgICAJCXhtbFJlYWxsb2MoYnVmZmVyLCBidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKikpOwlcCiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsJCQkJCQlcCglwZXJyb3IoInJlYWxsb2MgZmFpbGVkIik7CQkJCQlcCglyZXR1cm4oTlVMTCk7CQkJCQkJCVwKICAgIH0JCQkJCQkJCQlcCn0KCnN0YXRpYyB4bWxDaGFyICoqCnBhcnNlX2xpc3QoeG1sQ2hhciAqc3RyKSB7CiAgICB4bWxDaGFyICoqYnVmZmVyOwogICAgeG1sQ2hhciAqKm91dCA9IE5VTEw7CiAgICBpbnQgYnVmZmVyX3NpemUgPSAwOwogICAgaW50IGxlbjsKCiAgICBpZihzdHIgPT0gTlVMTCkgewoJcmV0dXJuKE5VTEwpOwogICAgfQoKICAgIGxlbiA9IHhtbFN0cmxlbihzdHIpOwogICAgaWYoKHN0clswXSA9PSAnXCcnKSAmJiAoc3RyW2xlbiAtIDFdID09ICdcJycpKSB7CglzdHJbbGVuIC0gMV0gPSAnXDAnOwoJc3RyKys7CglsZW4gLT0gMjsKICAgIH0KICAgIC8qCiAgICAgKiBhbGxvY2F0ZSBhbiB0cmFuc2xhdGlvbiBidWZmZXIuCiAgICAgKi8KICAgIGJ1ZmZlcl9zaXplID0gMTAwMDsKICAgIGJ1ZmZlciA9ICh4bWxDaGFyICoqKSB4bWxNYWxsb2MoYnVmZmVyX3NpemUgKiBzaXplb2YoeG1sQ2hhciopKTsKICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewoJcGVycm9yKCJtYWxsb2MgZmFpbGVkIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBvdXQgPSBidWZmZXI7CiAgICAKICAgIHdoaWxlKCpzdHIgIT0gJ1wwJykgewoJaWYgKG91dCAtIGJ1ZmZlciA+IGJ1ZmZlcl9zaXplIC0gMTApIHsKCSAgICBpbnQgaW5keCA9IG91dCAtIGJ1ZmZlcjsKCgkgICAgeHh4X2dyb3dCdWZmZXJSZWVudHJhbnQoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZHhdOwoJfQoJKCpvdXQrKykgPSBzdHI7Cgl3aGlsZSgqc3RyICE9ICcsJyAmJiAqc3RyICE9ICdcMCcpICsrc3RyOwoJaWYoKnN0ciA9PSAnLCcpICooc3RyKyspID0gJ1wwJzsKICAgIH0KICAgICgqb3V0KSA9IE5VTEw7CiAgICByZXR1cm4gYnVmZmVyOwp9CgpzdGF0aWMgaW50IApjMTRuUnVuVGVzdChjb25zdCBjaGFyKiB4bWxfZmlsZW5hbWUsIGludCB3aXRoX2NvbW1lbnRzLCBpbnQgZXhjbHVzaXZlLAoJICAgIGNvbnN0IGNoYXIqIHhwYXRoX2ZpbGVuYW1lLCBjb25zdCBjaGFyICpuc19maWxlbmFtZSwKCSAgICBjb25zdCBjaGFyKiByZXN1bHRfZmlsZSkgewogICAgeG1sRG9jUHRyIGRvYzsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHhwYXRoID0gTlVMTDsgCiAgICB4bWxDaGFyICpyZXN1bHQgPSBOVUxMOwogICAgaW50IHJldDsKICAgIHhtbENoYXIgKippbmNsdXNpdmVfbmFtZXNwYWNlcyA9IE5VTEw7CiAgICBjb25zdCBjaGFyICpuc2xpc3QgPSBOVUxMOwogICAgaW50IG5zc2l6ZTsKCgogICAgLyoKICAgICAqIGJ1aWxkIGFuIFhNTCB0cmVlIGZyb20gYSB0aGUgZmlsZTsgd2UgbmVlZCB0byBhZGQgZGVmYXVsdAogICAgICogYXR0cmlidXRlcyBhbmQgcmVzb2x2ZSBhbGwgY2hhcmFjdGVyIGFuZCBlbnRpdGllcyByZWZlcmVuY2VzCiAgICAgKi8KICAgIHhtbExvYWRFeHREdGREZWZhdWx0VmFsdWUgPSBYTUxfREVURUNUX0lEUyB8IFhNTF9DT01QTEVURV9BVFRSUzsKICAgIHhtbFN1YnN0aXR1dGVFbnRpdGllc0RlZmF1bHQoMSk7CgogICAgZG9jID0geG1sUmVhZEZpbGUoeG1sX2ZpbGVuYW1lLCBOVUxMLCBYTUxfUEFSU0VfRFREQVRUUiB8IFhNTF9QQVJTRV9OT0VOVCk7CiAgICBpZiAoZG9jID09IE5VTEwpIHsKCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IHVuYWJsZSB0byBwYXJzZSBmaWxlIFwiJXNcIlxuIiwgeG1sX2ZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiAgICAKICAgIC8qCiAgICAgKiBDaGVjayB0aGUgZG9jdW1lbnQgaXMgb2YgdGhlIHJpZ2h0IGtpbmQKICAgICAqLyAgICAKICAgIGlmKHhtbERvY0dldFJvb3RFbGVtZW50KGRvYykgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCJFcnJvcjogZW1wdHkgZG9jdW1lbnQgZm9yIGZpbGUgXCIlc1wiXG4iLCB4bWxfZmlsZW5hbWUpOwoJeG1sRnJlZURvYyhkb2MpOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICAvKiAKICAgICAqIGxvYWQgeHBhdGggZmlsZSBpZiBzcGVjaWZpZWQgCiAgICAgKi8KICAgIGlmKHhwYXRoX2ZpbGVuYW1lKSB7Cgl4cGF0aCA9IGxvYWRfeHBhdGhfZXhwcihkb2MsIHhwYXRoX2ZpbGVuYW1lKTsKCWlmKHhwYXRoID09IE5VTEwpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3I6IHVuYWJsZSB0byBldmFsdWF0ZSB4cGF0aCBleHByZXNzaW9uXG4iKTsKCSAgICB4bWxGcmVlRG9jKGRvYyk7IAoJICAgIHJldHVybigtMSk7Cgl9CiAgICB9CgogICAgaWYgKG5zX2ZpbGVuYW1lICE9IE5VTEwpIHsKICAgICAgICBpZiAobG9hZE1lbShuc19maWxlbmFtZSwgJm5zbGlzdCwgJm5zc2l6ZSkpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3I6IHVuYWJsZSB0byBldmFsdWF0ZSB4cGF0aCBleHByZXNzaW9uXG4iKTsKCSAgICBpZih4cGF0aCAhPSBOVUxMKSB4bWxYUGF0aEZyZWVPYmplY3QoeHBhdGgpOwoJICAgIHhtbEZyZWVEb2MoZG9jKTsgCgkgICAgcmV0dXJuKC0xKTsKCX0KICAgICAgICBpbmNsdXNpdmVfbmFtZXNwYWNlcyA9IHBhcnNlX2xpc3QoKHhtbENoYXIgKikgbnNsaXN0KTsKICAgIH0KCiAgICAvKgogICAgICogQ2Fub25pY2FsIGZvcm0KICAgICAqLyAgICAgIAogICAgLyogZnByaW50ZihzdGRlcnIsIkZpbGUgXCIlc1wiIGxvYWRlZDogc3RhcnQgY2Fub25pemF0aW9uXG4iLCB4bWxfZmlsZW5hbWUpOyAqLwogICAgcmV0ID0geG1sQzE0TkRvY0R1bXBNZW1vcnkoZG9jLCAKCSAgICAoeHBhdGgpID8geHBhdGgtPm5vZGVzZXR2YWwgOiBOVUxMLCAKCSAgICBleGNsdXNpdmUsIGluY2x1c2l2ZV9uYW1lc3BhY2VzLAoJICAgIHdpdGhfY29tbWVudHMsICZyZXN1bHQpOwogICAgaWYgKHJldCA+PSAwKSB7CglpZihyZXN1bHQgIT0gTlVMTCkgewoJICAgIGlmIChjb21wYXJlRmlsZU1lbShyZXN1bHRfZmlsZSwgKGNvbnN0IGNoYXIgKikgcmVzdWx0LCByZXQpKSB7CgkJZnByaW50ZihzdGRlcnIsICJSZXN1bHQgbWlzbWF0Y2ggZm9yICVzXG4iLCB4bWxfZmlsZW5hbWUpOwoJICAgICAgICByZXQgPSAtMTsKCSAgICB9Cgl9CiAgICB9IGVsc2UgewoJZnByaW50ZihzdGRlcnIsIkVycm9yOiBmYWlsZWQgdG8gY2Fub25pY2FsaXplIFhNTCBmaWxlIFwiJXNcIiAocmV0PSVkKVxuIiwgeG1sX2ZpbGVuYW1lLCByZXQpOwoJcmV0ID0gLTE7CiAgICB9CiAgICAgICAgCiAgICAvKgogICAgICogQ2xlYW51cAogICAgICovIAogICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB4bWxGcmVlKHJlc3VsdCk7CiAgICBpZih4cGF0aCAhPSBOVUxMKSB4bWxYUGF0aEZyZWVPYmplY3QoeHBhdGgpOwogICAgaWYgKGluY2x1c2l2ZV9uYW1lc3BhY2VzICE9IE5VTEwpIHhtbEZyZWUoaW5jbHVzaXZlX25hbWVzcGFjZXMpOwogICAgaWYgKG5zbGlzdCAhPSBOVUxMKSBmcmVlKChjaGFyICopIG5zbGlzdCk7CiAgICB4bWxGcmVlRG9jKGRvYyk7ICAgIAoKICAgIHJldHVybihyZXQpOwp9CgpzdGF0aWMgaW50CmMxNG5Db21tb25UZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgd2l0aF9jb21tZW50cywgaW50IGV4Y2x1c2l2ZSwKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3ViZGlyKSB7CiAgICBjaGFyIGJ1Zls1MDBdOwogICAgY2hhciBwcmVmaXhbNTAwXTsKICAgIGNvbnN0IGNoYXIgKmJhc2U7CiAgICBpbnQgbGVuOwogICAgY2hhciAqcmVzdWx0ID0gTlVMTDsKICAgIGNoYXIgKnhwYXRoID0gTlVMTDsKICAgIGNoYXIgKm5zID0gTlVMTDsKICAgIGludCByZXQgPSAwOwoKICAgIGJhc2UgPSBiYXNlRmlsZW5hbWUoZmlsZW5hbWUpOwogICAgbGVuID0gc3RybGVuKGJhc2UpOwogICAgbGVuIC09IDQ7CiAgICBtZW1jcHkocHJlZml4LCBiYXNlLCBsZW4pOwogICAgcHJlZml4W2xlbl0gPSAwOwoKICAgIHNucHJpbnRmKGJ1ZiwgNDk5LCAicmVzdWx0L2MxNG4vJXMvJXMiLCBzdWJkaXIscHJlZml4KTsKICAgIGlmICghY2hlY2tUZXN0RmlsZShidWYpKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIHJlc3VsdCBmaWxlICVzIiwgYnVmKTsKCXJldHVybigtMSk7CiAgICB9CiAgICByZXN1bHQgPSBzdHJkdXAoYnVmKTsKICAgIHNucHJpbnRmKGJ1ZiwgNDk5LCAidGVzdC9jMTRuLyVzLyVzLnhwYXRoIiwgc3ViZGlyLHByZWZpeCk7CiAgICBpZiAoY2hlY2tUZXN0RmlsZShidWYpKSB7Cgl4cGF0aCA9IHN0cmR1cChidWYpOwogICAgfQogICAgc25wcmludGYoYnVmLCA0OTksICJ0ZXN0L2MxNG4vJXMvJXMubnMiLCBzdWJkaXIscHJlZml4KTsKICAgIGlmIChjaGVja1Rlc3RGaWxlKGJ1ZikpIHsKCW5zID0gc3RyZHVwKGJ1Zik7CiAgICB9CgogICAgbmJfdGVzdHMrKzsKICAgIGlmIChjMTRuUnVuVGVzdChmaWxlbmFtZSwgd2l0aF9jb21tZW50cywgZXhjbHVzaXZlLAogICAgICAgICAgICAgICAgICAgIHhwYXRoLCBucywgcmVzdWx0KSA8IDApCiAgICAgICAgcmV0ID0gMTsKCiAgICBpZiAocmVzdWx0ICE9IE5VTEwpIGZyZWUocmVzdWx0KTsKICAgIGlmICh4cGF0aCAhPSBOVUxMKSBmcmVlKHhwYXRoKTsKICAgIGlmIChucyAhPSBOVUxMKSBmcmVlKG5zKTsKICAgIHJldHVybihyZXQpOwp9CgpzdGF0aWMgaW50CmMxNG5XaXRoQ29tbWVudFRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKCQkgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCgkJICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihjMTRuQ29tbW9uVGVzdChmaWxlbmFtZSwgMSwgMCwgIndpdGgtY29tbWVudHMiKSk7Cn0Kc3RhdGljIGludApjMTRuV2l0aG91dENvbW1lbnRUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsIEFUVFJJQlVURV9VTlVTRUQsCgkJICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAoJCSAgICBpbnQgb3B0aW9ucyBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oYzE0bkNvbW1vblRlc3QoZmlsZW5hbWUsIDAsIDAsICJ3aXRob3V0LWNvbW1lbnRzIikpOwp9CnN0YXRpYyBpbnQKYzE0bkV4Y1dpdGhvdXRDb21tZW50VGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAoJCSAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKCQkgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKGMxNG5Db21tb25UZXN0KGZpbGVuYW1lLCAwLCAxLCAiZXhjLXdpdGhvdXQtY29tbWVudHMiKSk7Cn0KI2VuZGlmCiNpZiBkZWZpbmVkKExJQlhNTF9USFJFQURfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKSAmJiBkZWZpbmVkIChMSUJYTUxfU0FYMV9FTkFCTEVEKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCQkJCQkJKgogKgkJCUNhdGFsb2cgYW5kIHRocmVhZHMgdGVzdAkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBtb3N0bHkgYSBjdXQgYW5kIHBhc3RlIGZyb20gdGVzdFRocmVhZHMuYwogKi8KI2RlZmluZQlNQVhfQVJHQwkyMAoKc3RhdGljIGNvbnN0IGNoYXIgKmNhdGFsb2cgPSAidGVzdC90aHJlYWRzL2NvbXBsZXgueG1sIjsKc3RhdGljIGNvbnN0IGNoYXIgKnRlc3RmaWxlc1tdID0gewogICAgInRlc3QvdGhyZWFkcy9hYmMueG1sIiwKICAgICJ0ZXN0L3RocmVhZHMvYWNiLnhtbCIsCiAgICAidGVzdC90aHJlYWRzL2JhYy54bWwiLAogICAgInRlc3QvdGhyZWFkcy9iY2EueG1sIiwKICAgICJ0ZXN0L3RocmVhZHMvY2FiLnhtbCIsCiAgICAidGVzdC90aHJlYWRzL2NiYS54bWwiLAogICAgInRlc3QvdGhyZWFkcy9pbnZhbGlkLnhtbCIsCn07CgpzdGF0aWMgY29uc3QgY2hhciAqT2theSA9ICJPSyI7CnN0YXRpYyBjb25zdCBjaGFyICpGYWlsZWQgPSAiRmFpbGVkIjsKCiNpZm5kZWYgeG1sRG9WYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlCiNlcnJvciB4bWxEb1ZhbGlkaXR5Q2hlY2tpbmdEZWZhdWx0VmFsdWUgaXMgbm90IGEgbWFjcm8KI2VuZGlmCiNpZm5kZWYgeG1sR2VuZXJpY0Vycm9yQ29udGV4dAojZXJyb3IgeG1sR2VuZXJpY0Vycm9yQ29udGV4dCBpcyBub3QgYSBtYWNybwojZW5kaWYKCnN0YXRpYyB2b2lkICoKdGhyZWFkX3NwZWNpZmljX2RhdGEodm9pZCAqcHJpdmF0ZV9kYXRhKQp7CiAgICB4bWxEb2NQdHIgbXlEb2M7CiAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IChjb25zdCBjaGFyICopIHByaXZhdGVfZGF0YTsKICAgIGludCBva2F5ID0gMTsKCiAgICBpZiAoIXN0cmNtcChmaWxlbmFtZSwgInRlc3QvdGhyZWFkcy9pbnZhbGlkLnhtbCIpKSB7CiAgICAgICAgeG1sRG9WYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlID0gMDsKICAgICAgICB4bWxHZW5lcmljRXJyb3JDb250ZXh0ID0gc3Rkb3V0OwogICAgfSBlbHNlIHsKICAgICAgICB4bWxEb1ZhbGlkaXR5Q2hlY2tpbmdEZWZhdWx0VmFsdWUgPSAxOwogICAgICAgIHhtbEdlbmVyaWNFcnJvckNvbnRleHQgPSBzdGRlcnI7CiAgICB9CiAgICBteURvYyA9IHhtbFBhcnNlRmlsZShmaWxlbmFtZSk7CiAgICBpZiAobXlEb2MpIHsKICAgICAgICB4bWxGcmVlRG9jKG15RG9jKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRmKCJwYXJzZSBmYWlsZWRcbiIpOwogICAgICAgIG9rYXkgPSAwOwogICAgfQogICAgaWYgKCFzdHJjbXAoZmlsZW5hbWUsICJ0ZXN0L3RocmVhZHMvaW52YWxpZC54bWwiKSkgewogICAgICAgIGlmICh4bWxEb1ZhbGlkaXR5Q2hlY2tpbmdEZWZhdWx0VmFsdWUgIT0gMCkgewogICAgICAgICAgICBwcmludGYoIlZhbGlkaXR5Q2hlY2tpbmdEZWZhdWx0VmFsdWUgb3ZlcnJpZGUgZmFpbGVkXG4iKTsKICAgICAgICAgICAgb2theSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICh4bWxHZW5lcmljRXJyb3JDb250ZXh0ICE9IHN0ZG91dCkgewogICAgICAgICAgICBwcmludGYoInhtbEdlbmVyaWNFcnJvckNvbnRleHQgb3ZlcnJpZGUgZmFpbGVkXG4iKTsKICAgICAgICAgICAgb2theSA9IDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoeG1sRG9WYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlICE9IDEpIHsKICAgICAgICAgICAgcHJpbnRmKCJWYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlIG92ZXJyaWRlIGZhaWxlZFxuIik7CiAgICAgICAgICAgIG9rYXkgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCAhPSBzdGRlcnIpIHsKICAgICAgICAgICAgcHJpbnRmKCJ4bWxHZW5lcmljRXJyb3JDb250ZXh0IG92ZXJyaWRlIGZhaWxlZFxuIik7CiAgICAgICAgICAgIG9rYXkgPSAwOwogICAgICAgIH0KICAgIH0KICAgIGlmIChva2F5ID09IDApCiAgICAgICAgcmV0dXJuICgodm9pZCAqKSBGYWlsZWQpOwogICAgcmV0dXJuICgodm9pZCAqKSBPa2F5KTsKfQoKI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoc29sYXJpcykKCiNpbmNsdWRlIDxwdGhyZWFkLmg+CgpzdGF0aWMgcHRocmVhZF90IHRpZFtNQVhfQVJHQ107CgpzdGF0aWMgaW50CnRlc3RUaHJlYWQodm9pZCkKewogICAgdW5zaWduZWQgaW50IGksIHJlcGVhdDsKICAgIHVuc2lnbmVkIGludCBudW1fdGhyZWFkcyA9IHNpemVvZih0ZXN0ZmlsZXMpIC8gc2l6ZW9mKHRlc3RmaWxlc1swXSk7CiAgICB2b2lkICpyZXN1bHRzW01BWF9BUkdDXTsKICAgIGludCByZXQ7CiAgICBpbnQgcmVzID0gMDsKICAgIAogICAgeG1sSW5pdFBhcnNlcigpOwoKICAgIGZvciAocmVwZWF0ID0gMDsgcmVwZWF0IDwgNTAwOyByZXBlYXQrKykgewogICAgICAgIHhtbExvYWRDYXRhbG9nKGNhdGFsb2cpOwogICAgICAgIG5iX3Rlc3RzKys7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGhyZWFkczsgaSsrKSB7CiAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBOVUxMOwogICAgICAgICAgICB0aWRbaV0gPSAocHRocmVhZF90KSAtIDE7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmdGlkW2ldLCAwLCB0aHJlYWRfc3BlY2lmaWNfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGVzdGZpbGVzW2ldKTsKICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInB0aHJlYWRfY3JlYXRlIGZhaWxlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gKDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGhyZWFkczsgaSsrKSB7CiAgICAgICAgICAgIHJldCA9IHB0aHJlYWRfam9pbih0aWRbaV0sICZyZXN1bHRzW2ldKTsKICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInB0aHJlYWRfam9pbiBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeG1sQ2F0YWxvZ0NsZWFudXAoKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykKICAgICAgICAgICAgaWYgKHJlc3VsdHNbaV0gIT0gKHZvaWQgKikgT2theSkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgJWQgaGFuZGxpbmcgJXMgZmFpbGVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBpLCB0ZXN0ZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgcmVzID0gMTsKICAgICAgICAgICAgfQogICAgfQogICAgcmV0dXJuIChyZXMpOwp9CgojZWxpZiBkZWZpbmVkIFdJTjMyCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgVEVTVF9SRVBFQVRfQ09VTlQgNTAwCgpzdGF0aWMgSEFORExFIHRpZFtNQVhfQVJHQ107CgpzdGF0aWMgRFdPUkQgV0lOQVBJCndpbjMyX3RocmVhZF9zcGVjaWZpY19kYXRhKHZvaWQgKnByaXZhdGVfZGF0YSkKewogICAgcmV0dXJuKChEV09SRCkgdGhyZWFkX3NwZWNpZmljX2RhdGEocHJpdmF0ZV9kYXRhKSk7Cn0KCnN0YXRpYyBpbnQKdGVzdFRocmVhZCh2b2lkKQp7CiAgICB1bnNpZ25lZCBpbnQgaSwgcmVwZWF0OwogICAgdW5zaWduZWQgaW50IG51bV90aHJlYWRzID0gc2l6ZW9mKHRlc3RmaWxlcykgLyBzaXplb2YodGVzdGZpbGVzWzBdKTsKICAgIERXT1JEIHJlc3VsdHNbTUFYX0FSR0NdOwogICAgQk9PTCByZXQ7CiAgICBpbnQgcmVzID0gMDsKCiAgICB4bWxJbml0UGFyc2VyKCk7CiAgICBmb3IgKHJlcGVhdCA9IDA7IHJlcGVhdCA8IFRFU1RfUkVQRUFUX0NPVU5UOyByZXBlYXQrKykgewogICAgICAgIHhtbExvYWRDYXRhbG9nKGNhdGFsb2cpOwogICAgICAgIG5iX3Rlc3RzKys7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGhyZWFkczsgaSsrKSB7CiAgICAgICAgICAgIHJlc3VsdHNbaV0gPSAwOwogICAgICAgICAgICB0aWRbaV0gPSAoSEFORExFKSAtIDE7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICBEV09SRCB1c2VsZXNzOwoKICAgICAgICAgICAgdGlkW2ldID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW4zMl90aHJlYWRfc3BlY2lmaWNfZGF0YSwgCgkJCQkgICh2b2lkICopIHRlc3RmaWxlc1tpXSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VsZXNzKTsKICAgICAgICAgICAgaWYgKHRpZFtpXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNyZWF0ZVRocmVhZCBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuKDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoV2FpdEZvck11bHRpcGxlT2JqZWN0cyhudW1fdGhyZWFkcywgdGlkLCBUUlVFLCBJTkZJTklURSkgPT0KICAgICAgICAgICAgV0FJVF9GQUlMRUQpIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIGZhaWxlZFxuIik7CgkgICAgcmV0dXJuKDEpOwoJfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXQgPSBHZXRFeGl0Q29kZVRocmVhZCh0aWRbaV0sICZyZXN1bHRzW2ldKTsKICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdldEV4aXRDb2RlVGhyZWFkIGZhaWxlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4oMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQ2xvc2VIYW5kbGUodGlkW2ldKTsKICAgICAgICB9CgogICAgICAgIHhtbENhdGFsb2dDbGVhbnVwKCk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgaWYgKHJlc3VsdHNbaV0gIT0gKERXT1JEKSBPa2F5KSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCAlZCBoYW5kbGluZyAlcyBmYWlsZWRcbiIsCgkJICAgICAgICBpLCB0ZXN0ZmlsZXNbaV0pOwoJICAgICAgICByZXMgPSAxOwoJICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIChyZXMpOwp9CgojZWxpZiBkZWZpbmVkIF9fQkVPU19fCiNpbmNsdWRlIDxPUy5oPgoKc3RhdGljIHRocmVhZF9pZCB0aWRbTUFYX0FSR0NdOwoKc3RhdGljIGludAp0ZXN0VGhyZWFkKHZvaWQpCnsKICAgIHVuc2lnbmVkIGludCBpLCByZXBlYXQ7CiAgICB1bnNpZ25lZCBpbnQgbnVtX3RocmVhZHMgPSBzaXplb2YodGVzdGZpbGVzKSAvIHNpemVvZih0ZXN0ZmlsZXNbMF0pOwogICAgdm9pZCAqcmVzdWx0c1tNQVhfQVJHQ107CiAgICBzdGF0dXNfdCByZXQ7CiAgICBpbnQgcmVzID0gMDsKCiAgICB4bWxJbml0UGFyc2VyKCk7CiAgICBmb3IgKHJlcGVhdCA9IDA7IHJlcGVhdCA8IDUwMDsgcmVwZWF0KyspIHsKICAgICAgICB4bWxMb2FkQ2F0YWxvZyhjYXRhbG9nKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXN1bHRzW2ldID0gTlVMTDsKICAgICAgICAgICAgdGlkW2ldID0gKHRocmVhZF9pZCkgLSAxOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICB0aWRbaV0gPQogICAgICAgICAgICAgICAgc3Bhd25fdGhyZWFkKHRocmVhZF9zcGVjaWZpY19kYXRhLCAieG1sVGVzdFRocmVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQl9OT1JNQUxfUFJJT1JJVFksICh2b2lkICopIHRlc3RmaWxlc1tpXSk7CiAgICAgICAgICAgIGlmICh0aWRbaV0gPCBCX09LKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJlb3NfdGhyZWFkX2NyZWF0ZSBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGYoImJlb3NfdGhyZWFkX2NyZWF0ZSAlZCAtPiAlZFxuIiwgaSwgdGlkW2ldKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgcmV0ID0gd2FpdF9mb3JfdGhyZWFkKHRpZFtpXSwgJnJlc3VsdHNbaV0pOwogICAgICAgICAgICBwcmludGYoImJlb3NfdGhyZWFkX3dhaXQgJWQgLT4gJWRcbiIsIGksIHJldCk7CiAgICAgICAgICAgIGlmIChyZXQgIT0gQl9PSykgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiZW9zX3RocmVhZF93YWl0IGZhaWxlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gKDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB4bWxDYXRhbG9nQ2xlYW51cCgpOwogICAgICAgIHJldCA9IEJfT0s7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspCiAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldICE9ICh2b2lkICopIE9rYXkpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiVGhyZWFkICVkIGhhbmRsaW5nICVzIGZhaWxlZFxuIiwgaSwgdGVzdGZpbGVzW2ldKTsKICAgICAgICAgICAgICAgIHJldCA9IEJfRVJST1I7CiAgICAgICAgICAgIH0KICAgIH0KICAgIGlmIChyZXQgIT0gQl9PSykKICAgICAgICByZXR1cm4oMSk7CiAgICByZXR1cm4gKDApOwp9CiNlbHNlCnN0YXRpYyBpbnQKdGVzdFRocmVhZCh2b2lkKQp7CiAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgIlNwZWNpZmljIHBsYXRmb3JtIHRocmVhZCBzdXBwb3J0IG5vdCBkZXRlY3RlZFxuIik7CiAgICByZXR1cm4gKC0xKTsKfQojZW5kaWYKc3RhdGljIGludCAKdGhyZWFkc1Rlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUgQVRUUklCVVRFX1VOVVNFRCwKCSAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAoJICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAoJICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybih0ZXN0VGhyZWFkKCkpOwp9CiNlbmRpZgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCQkJCQkJKgogKgkJCVRlc3RzIERlc2NyaXB0aW9ucwkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljCnRlc3REZXNjIHRlc3REZXNjcmlwdGlvbnNbXSA9IHsKICAgIHsgIlhNTCByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIG9sZFBhcnNlVGVzdCwgIi4vdGVzdC8qIiwgInJlc3VsdC8iLCAiIiwgTlVMTCwKICAgICAgMCB9LAogICAgeyAiWE1MIHJlZ3Jlc3Npb24gdGVzdHMgb24gbWVtb3J5IiAsCiAgICAgIG1lbVBhcnNlVGVzdCwgIi4vdGVzdC8qIiwgInJlc3VsdC8iLCAiIiwgTlVMTCwKICAgICAgMCB9LAogICAgeyAiWE1MIGVudGl0eSBzdWJzdCByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIG5vZW50UGFyc2VUZXN0LCAiLi90ZXN0LyoiLCAicmVzdWx0L25vZW50LyIsICIiLCBOVUxMLAogICAgICBYTUxfUEFSU0VfTk9FTlQgfSwKICAgIHsgIlhNTCBOYW1lc3BhY2VzIHJlZ3Jlc3Npb24gdGVzdHMiLAogICAgICBlcnJQYXJzZVRlc3QsICIuL3Rlc3QvbmFtZXNwYWNlcy8qIiwgInJlc3VsdC9uYW1lc3BhY2VzLyIsICIiLCAiLmVyciIsCiAgICAgIDAgfSwKICAgIHsgIkVycm9yIGNhc2VzIHJlZ3Jlc3Npb24gdGVzdHMiLAogICAgICBlcnJQYXJzZVRlc3QsICIuL3Rlc3QvZXJyb3JzLyoueG1sIiwgInJlc3VsdC9lcnJvcnMvIiwgIiIsICIuZXJyIiwKICAgICAgMCB9LAojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECiAgICB7ICJFcnJvciBjYXNlcyBzdHJlYW0gcmVncmVzc2lvbiB0ZXN0cyIsCiAgICAgIHN0cmVhbVBhcnNlVGVzdCwgIi4vdGVzdC9lcnJvcnMvKi54bWwiLCAicmVzdWx0L2Vycm9ycy8iLCBOVUxMLCAiLnN0ciIsCiAgICAgIDAgfSwKICAgIHsgIlJlYWRlciByZWdyZXNzaW9uIHRlc3RzIiwKICAgICAgc3RyZWFtUGFyc2VUZXN0LCAiLi90ZXN0LyoiLCAicmVzdWx0LyIsICIucmRyIiwgTlVMTCwKICAgICAgMCB9LAogICAgeyAiUmVhZGVyIGVudGl0aWVzIHN1YnN0aXR1dGlvbiByZWdyZXNzaW9uIHRlc3RzIiwKICAgICAgc3RyZWFtUGFyc2VUZXN0LCAiLi90ZXN0LyoiLCAicmVzdWx0LyIsICIucmRlIiwgTlVMTCwKICAgICAgWE1MX1BBUlNFX05PRU5UIH0sCiAgICB7ICJSZWFkZXIgb24gbWVtb3J5IHJlZ3Jlc3Npb24gdGVzdHMiLAogICAgICBzdHJlYW1NZW1QYXJzZVRlc3QsICIuL3Rlc3QvKiIsICJyZXN1bHQvIiwgIi5yZHIiLCBOVUxMLAogICAgICAwIH0sCiAgICB7ICJXYWxrZXIgcmVncmVzc2lvbiB0ZXN0cyIsCiAgICAgIHdhbGtlclBhcnNlVGVzdCwgIi4vdGVzdC8qIiwgInJlc3VsdC8iLCAiLnJkciIsIE5VTEwsCiAgICAgIDAgfSwKI2VuZGlmCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICB7ICJTQVgxIGNhbGxiYWNrcyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHNheFBhcnNlVGVzdCwgIi4vdGVzdC8qIiwgInJlc3VsdC8iLCAiLnNheCIsIE5VTEwsCiAgICAgIFhNTF9QQVJTRV9TQVgxIH0sCiAgICB7ICJTQVgyIGNhbGxiYWNrcyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHNheFBhcnNlVGVzdCwgIi4vdGVzdC8qIiwgInJlc3VsdC8iLCAiLnNheDIiLCBOVUxMLAogICAgICAwIH0sCiNlbmRpZgojaWZkZWYgTElCWE1MX1BVU0hfRU5BQkxFRAogICAgeyAiWE1MIHB1c2ggcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBwdXNoUGFyc2VUZXN0LCAiLi90ZXN0LyoiLCAicmVzdWx0LyIsICIiLCBOVUxMLAogICAgICAwIH0sCiNlbmRpZgojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgeyAiSFRNTCByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIGVyclBhcnNlVGVzdCwgIi4vdGVzdC9IVE1MLyoiLCAicmVzdWx0L0hUTUwvIiwgIiIsICIuZXJyIiwKICAgICAgWE1MX1BBUlNFX0hUTUwgfSwKI2lmZGVmIExJQlhNTF9QVVNIX0VOQUJMRUQKICAgIHsgIlB1c2ggSFRNTCByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHB1c2hQYXJzZVRlc3QsICIuL3Rlc3QvSFRNTC8qIiwgInJlc3VsdC9IVE1MLyIsICIiLCAiLmVyciIsCiAgICAgIFhNTF9QQVJTRV9IVE1MIH0sCiNlbmRpZgojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgeyAiSFRNTCBTQVggcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBzYXhQYXJzZVRlc3QsICIuL3Rlc3QvSFRNTC8qIiwgInJlc3VsdC9IVE1MLyIsICIuc2F4IiwgTlVMTCwKICAgICAgWE1MX1BBUlNFX0hUTUwgfSwKI2VuZGlmCiNlbmRpZgojaWZkZWYgTElCWE1MX1ZBTElEX0VOQUJMRUQKICAgIHsgIlZhbGlkIGRvY3VtZW50cyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIGVyclBhcnNlVGVzdCwgIi4vdGVzdC9WQ00vKiIsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIFhNTF9QQVJTRV9EVERWQUxJRCB9LAogICAgeyAiVmFsaWRpdHkgY2hlY2tpbmcgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBlcnJQYXJzZVRlc3QsICIuL3Rlc3QvVkMvKiIsICJyZXN1bHQvVkMvIiwgTlVMTCwgIiIsCiAgICAgIFhNTF9QQVJTRV9EVERWQUxJRCB9LAogICAgeyAiR2VuZXJhbCBkb2N1bWVudHMgdmFsaWQgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBlcnJQYXJzZVRlc3QsICIuL3Rlc3QvdmFsaWQvKiIsICJyZXN1bHQvdmFsaWQvIiwgIiIsICIuZXJyIiwKICAgICAgWE1MX1BBUlNFX0RURFZBTElEIH0sCiNlbmRpZgojaWZkZWYgTElCWE1MX1hJTkNMVURFX0VOQUJMRUQKICAgIHsgIlhJbmNsdWRlIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgZXJyUGFyc2VUZXN0LCAiLi90ZXN0L1hJbmNsdWRlL2RvY3MvKiIsICJyZXN1bHQvWEluY2x1ZGUvIiwgIiIsIE5VTEwsCiAgICAgIC8qIElnbm9yZSBlcnJvcnMgYXQgdGhpcyBwb2ludCAiLmVyciIsICovCiAgICAgIFhNTF9QQVJTRV9YSU5DTFVERSB9LAogICAgeyAiWEluY2x1ZGUgeG1sUmVhZGVyIHJlZ3Jlc3Npb24gdGVzdHMiLAogICAgICBzdHJlYW1QYXJzZVRlc3QsICIuL3Rlc3QvWEluY2x1ZGUvZG9jcy8qIiwgInJlc3VsdC9YSW5jbHVkZS8iLCAiLnJkciIsCiAgICAgIC8qIElnbm9yZSBlcnJvcnMgYXQgdGhpcyBwb2ludCAiLmVyciIsICovCiAgICAgIE5VTEwsIFhNTF9QQVJTRV9YSU5DTFVERSB9LAogICAgeyAiWEluY2x1ZGUgcmVncmVzc2lvbiB0ZXN0cyBzdHJpcHBpbmcgaW5jbHVkZSBub2RlcyIgLAogICAgICBlcnJQYXJzZVRlc3QsICIuL3Rlc3QvWEluY2x1ZGUvZG9jcy8qIiwgInJlc3VsdC9YSW5jbHVkZS8iLCAiIiwgTlVMTCwKICAgICAgLyogSWdub3JlIGVycm9ycyBhdCB0aGlzIHBvaW50ICIuZXJyIiwgKi8KICAgICAgWE1MX1BBUlNFX1hJTkNMVURFIHwgWE1MX1BBUlNFX05PWElOQ05PREUgfSwKICAgIHsgIlhJbmNsdWRlIHhtbFJlYWRlciByZWdyZXNzaW9uIHRlc3RzIHN0cmlwcGluZyBpbmNsdWRlIG5vZGVzIiwKICAgICAgc3RyZWFtUGFyc2VUZXN0LCAiLi90ZXN0L1hJbmNsdWRlL2RvY3MvKiIsICJyZXN1bHQvWEluY2x1ZGUvIiwgIi5yZHIiLAogICAgICAvKiBJZ25vcmUgZXJyb3JzIGF0IHRoaXMgcG9pbnQgIi5lcnIiLCAqLwogICAgICBOVUxMLCBYTUxfUEFSU0VfWElOQ0xVREUgfCBYTUxfUEFSU0VfTk9YSU5DTk9ERSB9LAojZW5kaWYKI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECiNpZmRlZiBMSUJYTUxfREVCVUdfRU5BQkxFRAogICAgeyAiWFBhdGggZXhwcmVzc2lvbnMgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICB4cGF0aEV4cHJUZXN0LCAiLi90ZXN0L1hQYXRoL2V4cHIvKiIsICJyZXN1bHQvWFBhdGgvZXhwci8iLCAiIiwgTlVMTCwKICAgICAgMCB9LAogICAgeyAiWFBhdGggZG9jdW1lbnQgcXVlcmllcyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHhwYXRoRG9jVGVzdCwgIi4vdGVzdC9YUGF0aC9kb2NzLyoiLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAwIH0sCiNpZmRlZiBMSUJYTUxfWFBUUl9FTkFCTEVECiAgICB7ICJYUG9pbnRlciBkb2N1bWVudCBxdWVyaWVzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgeHB0ckRvY1Rlc3QsICIuL3Rlc3QvWFBhdGgvZG9jcy8qIiwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgMCB9LAojZW5kaWYKICAgIHsgInhtbDppZCByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHhtbGlkRG9jVGVzdCwgIi4vdGVzdC94bWxpZC8qIiwgInJlc3VsdC94bWxpZC8iLCAiIiwgIi5lcnIiLAogICAgICAwIH0sCiNlbmRpZgojZW5kaWYKICAgIHsgIlVSSSBwYXJzaW5nIHRlc3RzIiAsCiAgICAgIHVyaVBhcnNlVGVzdCwgIi4vdGVzdC9VUkkvKi51cmkiLCAicmVzdWx0L1VSSS8iLCAiIiwgTlVMTCwKICAgICAgMCB9LAogICAgeyAiVVJJIGJhc2UgY29tcG9zaXRpb24gdGVzdHMiICwKICAgICAgdXJpQmFzZVRlc3QsICIuL3Rlc3QvVVJJLyouZGF0YSIsICJyZXN1bHQvVVJJLyIsICIiLCBOVUxMLAogICAgICAwIH0sCiAgICB7ICJQYXRoIFVSSSBjb252ZXJzaW9uIHRlc3RzIiAsCiAgICAgIHVyaVBhdGhUZXN0LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAwIH0sCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECiAgICB7ICJTY2hlbWFzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgc2NoZW1hc1Rlc3QsICIuL3Rlc3Qvc2NoZW1hcy8qXyoueHNkIiwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgMCB9LAogICAgeyAiUmVsYXgtTkcgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBybmdUZXN0LCAiLi90ZXN0L3JlbGF4bmcvKi5ybmciLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICBYTUxfUEFSU0VfRFREQVRUUiB8IFhNTF9QQVJTRV9OT0VOVCB9LAojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECiAgICB7ICJSZWxheC1ORyBzdHJlYW1pbmcgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBybmdTdHJlYW1UZXN0LCAiLi90ZXN0L3JlbGF4bmcvKi5ybmciLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICBYTUxfUEFSU0VfRFREQVRUUiB8IFhNTF9QQVJTRV9OT0VOVCB9LAojZW5kaWYKI2VuZGlmCiNpZmRlZiBMSUJYTUxfUEFUVEVSTl9FTkFCTEVECiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKICAgIHsgIlBhdHRlcm4gcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBwYXR0ZXJuVGVzdCwgIi4vdGVzdC9wYXR0ZXJuLyoucGF0IiwgInJlc3VsdC9wYXR0ZXJuLyIsIE5VTEwsIE5VTEwsCiAgICAgIDAgfSwKI2VuZGlmCiNlbmRpZgojaWZkZWYgTElCWE1MX0MxNE5fRU5BQkxFRAogICAgeyAiQzE0TiB3aXRoIGNvbW1lbnRzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgYzE0bldpdGhDb21tZW50VGVzdCwgIi4vdGVzdC9jMTRuL3dpdGgtY29tbWVudHMvKi54bWwiLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAwIH0sCiAgICB7ICJDMTROIHdpdGhvdXQgY29tbWVudHMgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBjMTRuV2l0aG91dENvbW1lbnRUZXN0LCAiLi90ZXN0L2MxNG4vd2l0aG91dC1jb21tZW50cy8qLnhtbCIsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIkMxNE4gZXhjbHVzaXZlIHdpdGhvdXQgY29tbWVudHMgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBjMTRuRXhjV2l0aG91dENvbW1lbnRUZXN0LCAiLi90ZXN0L2MxNG4vZXhjLXdpdGhvdXQtY29tbWVudHMvKi54bWwiLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAwIH0sCiNlbmRpZgojaWYgZGVmaW5lZChMSUJYTUxfVEhSRUFEX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQogICAgeyAiQ2F0YWxvZyBhbmQgVGhyZWFkcyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHRocmVhZHNUZXN0LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAwIH0sCiNlbmRpZgogICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDB9Cn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCQkJCQkJKgogKgkJVGhlIG1haW4gY29kZSBkcml2aW5nIHRoZSB0ZXN0cwkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludApsYXVuY2hUZXN0cyh0ZXN0RGVzY1B0ciB0c3QpIHsKICAgIGludCByZXMgPSAwLCBlcnIgPSAwOwogICAgc2l6ZV90IGk7CiAgICBjaGFyICpyZXN1bHQ7CiAgICBjaGFyICplcnJvcjsKICAgIGludCBtZW07CgogICAgaWYgKHRzdCA9PSBOVUxMKSByZXR1cm4oLTEpOwogICAgaWYgKHRzdC0+aW4gIT0gTlVMTCkgewoJZ2xvYl90IGdsb2JidWY7CgoJZ2xvYmJ1Zi5nbF9vZmZzID0gMDsKCWdsb2IodHN0LT5pbiwgR0xPQl9ET09GRlMsIE5VTEwsICZnbG9iYnVmKTsKCWZvciAoaSA9IDA7aSA8IGdsb2JidWYuZ2xfcGF0aGM7aSsrKSB7CgkgICAgaWYgKCFjaGVja1Rlc3RGaWxlKGdsb2JidWYuZ2xfcGF0aHZbaV0pKQoJICAgICAgICBjb250aW51ZTsKCSAgICBpZiAodHN0LT5zdWZmaXggIT0gTlVMTCkgewoJCXJlc3VsdCA9IHJlc3VsdEZpbGVuYW1lKGdsb2JidWYuZ2xfcGF0aHZbaV0sIHRzdC0+b3V0LAoJCQkJCXRzdC0+c3VmZml4KTsKCQlpZiAocmVzdWx0ID09IE5VTEwpIHsKCQkgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5ICFcbiIpOwoJCSAgICBmYXRhbEVycm9yKCk7CgkJfQoJICAgIH0gZWxzZSB7CgkgICAgICAgIHJlc3VsdCA9IE5VTEw7CgkgICAgfQoJICAgIGlmICh0c3QtPmVyciAhPSBOVUxMKSB7CgkJZXJyb3IgPSByZXN1bHRGaWxlbmFtZShnbG9iYnVmLmdsX3BhdGh2W2ldLCB0c3QtPm91dCwKCQkgICAgICAgICAgICAgICAgICAgICAgICB0c3QtPmVycik7CgkJaWYgKGVycm9yID09IE5VTEwpIHsKCQkgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5ICFcbiIpOwoJCSAgICBmYXRhbEVycm9yKCk7CgkJfQoJICAgIH0gZWxzZSB7CgkgICAgICAgIGVycm9yID0gTlVMTDsKCSAgICB9CgkgICAgaWYgKChyZXN1bHQpICYmKCFjaGVja1Rlc3RGaWxlKHJlc3VsdCkpKSB7CgkgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyByZXN1bHQgZmlsZSAlc1xuIiwgcmVzdWx0KTsKCSAgICB9IGVsc2UgaWYgKChlcnJvcikgJiYoIWNoZWNrVGVzdEZpbGUoZXJyb3IpKSkgewoJICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZXJyb3IgZmlsZSAlc1xuIiwgZXJyb3IpOwoJICAgIH0gZWxzZSB7CgkJbWVtID0geG1sTWVtVXNlZCgpOwoJCWV4dHJhTWVtb3J5RnJvbVJlc29sdmVyID0gMDsKCQl0ZXN0RXJyb3JzU2l6ZSA9IDA7CgkJdGVzdEVycm9yc1swXSA9IDA7CgkJcmVzID0gdHN0LT5mdW5jKGdsb2JidWYuZ2xfcGF0aHZbaV0sIHJlc3VsdCwgZXJyb3IsCgkJICAgICAgICAgICAgICAgIHRzdC0+b3B0aW9ucyB8IFhNTF9QQVJTRV9DT01QQUNUKTsKCQl4bWxSZXNldExhc3RFcnJvcigpOwoJCWlmIChyZXMgIT0gMCkgewoJCSAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGUgJXMgZ2VuZXJhdGVkIGFuIGVycm9yXG4iLAoJCSAgICAgICAgICAgIGdsb2JidWYuZ2xfcGF0aHZbaV0pOwoJCSAgICBuYl9lcnJvcnMrKzsKCQkgICAgZXJyKys7CgkJfQoJCWVsc2UgaWYgKHhtbE1lbVVzZWQoKSAhPSBtZW0pIHsKCQkgICAgaWYgKCh4bWxNZW1Vc2VkKCkgIT0gbWVtKSAmJgoJCSAgICAgICAgKGV4dHJhTWVtb3J5RnJvbVJlc29sdmVyID09IDApKSB7CgkJCWZwcmludGYoc3RkZXJyLCAiRmlsZSAlcyBsZWFrZWQgJWQgYnl0ZXNcbiIsCgkJCQlnbG9iYnVmLmdsX3BhdGh2W2ldLCB4bWxNZW1Vc2VkKCkgLSBtZW0pOwoJCQluYl9sZWFrcysrOwoJCQllcnIrKzsKCQkgICAgfQoJCX0KCQl0ZXN0RXJyb3JzU2l6ZSA9IDA7CgkgICAgfQoJICAgIGlmIChyZXN1bHQpCgkJZnJlZShyZXN1bHQpOwoJICAgIGlmIChlcnJvcikKCQlmcmVlKGVycm9yKTsKCX0KCWdsb2JmcmVlKCZnbG9iYnVmKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdGVzdEVycm9yc1NpemUgPSAwOwoJdGVzdEVycm9yc1swXSA9IDA7CglleHRyYU1lbW9yeUZyb21SZXNvbHZlciA9IDA7CiAgICAgICAgcmVzID0gdHN0LT5mdW5jKE5VTEwsIE5VTEwsIE5VTEwsIHRzdC0+b3B0aW9ucyk7CglpZiAocmVzICE9IDApIHsKCSAgICBuYl9lcnJvcnMrKzsKCSAgICBlcnIrKzsKCX0KICAgIH0KICAgIHJldHVybihlcnIpOwp9CgpzdGF0aWMgaW50IHZlcmJvc2UgPSAwOwpzdGF0aWMgaW50IHRlc3RzX3F1aWV0ID0gMDsKCnN0YXRpYyBpbnQKcnVudGVzdChpbnQgaSkgewogICAgaW50IHJldCA9IDAsIHJlczsKICAgIGludCBvbGRfZXJyb3JzLCBvbGRfdGVzdHMsIG9sZF9sZWFrczsKCiAgICBvbGRfZXJyb3JzID0gbmJfZXJyb3JzOwogICAgb2xkX3Rlc3RzID0gbmJfdGVzdHM7CiAgICBvbGRfbGVha3MgPSBuYl9sZWFrczsKICAgIGlmICgodGVzdHNfcXVpZXQgPT0gMCkgJiYgKHRlc3REZXNjcmlwdGlvbnNbaV0uZGVzYyAhPSBOVUxMKSkKCXByaW50ZigiIyMgJXNcbiIsIHRlc3REZXNjcmlwdGlvbnNbaV0uZGVzYyk7CiAgICByZXMgPSBsYXVuY2hUZXN0cygmdGVzdERlc2NyaXB0aW9uc1tpXSk7CiAgICBpZiAocmVzICE9IDApCglyZXQrKzsKICAgIGlmICh2ZXJib3NlKSB7CglpZiAoKG5iX2Vycm9ycyA9PSBvbGRfZXJyb3JzKSAmJiAobmJfbGVha3MgPT0gb2xkX2xlYWtzKSkKCSAgICBwcmludGYoIlJhbiAlZCB0ZXN0cywgbm8gZXJyb3JzXG4iLCBuYl90ZXN0cyAtIG9sZF90ZXN0cyk7CgllbHNlCgkgICAgcHJpbnRmKCJSYW4gJWQgdGVzdHMsICVkIGVycm9ycywgJWQgbGVha3NcbiIsCgkJICAgbmJfdGVzdHMgLSBvbGRfdGVzdHMsCgkJICAgbmJfZXJyb3JzIC0gb2xkX2Vycm9ycywKCQkgICBuYl9sZWFrcyAtIG9sZF9sZWFrcyk7CiAgICB9CiAgICByZXR1cm4ocmV0KTsKfQoKaW50Cm1haW4oaW50IGFyZ2MgQVRUUklCVVRFX1VOVVNFRCwgY2hhciAqKmFyZ3YgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaW50IGksIGEsIHJldCA9IDA7CiAgICBpbnQgc3Vic2V0ID0gMDsKCiAgICBpbml0aWFsaXplTGlieG1sMigpOwoKICAgIAogICAgZm9yIChhID0gMTsgYSA8IGFyZ2M7YSsrKSB7CiAgICAgICAgaWYgKCFzdHJjbXAoYXJndlthXSwgIi12IikpCgkgICAgdmVyYm9zZSA9IDE7CiAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FdLCAiLXF1aWV0IikpCgkgICAgdGVzdHNfcXVpZXQgPSAxOwoJZWxzZSB7CgkgICAgZm9yIChpID0gMDsgdGVzdERlc2NyaXB0aW9uc1tpXS5mdW5jICE9IE5VTEw7IGkrKykgewoJICAgICAgICBpZiAoc3Ryc3RyKHRlc3REZXNjcmlwdGlvbnNbaV0uZGVzYywgYXJndlthXSkpIHsKCQkgICAgcmV0ICs9IHJ1bnRlc3QoaSk7CgkJICAgIHN1YnNldCsrOwoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiAoc3Vic2V0ID09IDApIHsKCWZvciAoaSA9IDA7IHRlc3REZXNjcmlwdGlvbnNbaV0uZnVuYyAhPSBOVUxMOyBpKyspIHsKCSAgICByZXQgKz0gcnVudGVzdChpKTsKCX0KICAgIH0KICAgIGlmICgobmJfZXJyb3JzID09IDApICYmIChuYl9sZWFrcyA9PSAwKSkgewogICAgICAgIHJldCA9IDA7CglwcmludGYoIlRvdGFsICVkIHRlc3RzLCBubyBlcnJvcnNcbiIsCgkgICAgICAgbmJfdGVzdHMpOwogICAgfSBlbHNlIHsKICAgICAgICByZXQgPSAxOwoJcHJpbnRmKCJUb3RhbCAlZCB0ZXN0cywgJWQgZXJyb3JzLCAlZCBsZWFrc1xuIiwKCSAgICAgICBuYl90ZXN0cywgbmJfZXJyb3JzLCBuYl9sZWFrcyk7CiAgICB9CiAgICB4bWxDbGVhbnVwUGFyc2VyKCk7CiAgICB4bWxNZW1vcnlEdW1wKCk7CgogICAgcmV0dXJuKHJldCk7Cn0KCiNlbHNlIC8qICEgTElCWE1MX09VVFBVVF9FTkFCTEVEICovCmludAptYWluKGludCBhcmdjIEFUVFJJQlVURV9VTlVTRUQsIGNoYXIgKiphcmd2IEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGZwcmludGYoc3RkZXJyLCAicnVudGVzdCByZXF1aXJlcyBvdXRwdXQgdG8gYmUgZW5hYmxlZCBpbiBsaWJ4bWwyXG4iKTsKICAgIHJldHVybigxKTsKfQojZW5kaWYK