LyoKICogICBDb3B5cmlnaHQgKEMpIEJ1bGwgUy5BLiAyMDAxCiAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMQogKgogKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQogKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogKi8KLyoKICogVGVzdCBOYW1lOiBta25vZDA5CiAqCiAqIFRlc3QgRGVzY3JpcHRpb246CiAqICBWZXJpZnkgdGhhdCwgbWtub2QoKSBmYWlscyB3aXRoIC0xIGFuZCBzZXRzIGVycm5vIHRvIEVJTlZBTCBpZiB0aGUgbW9kZSBpcwogKiAgZGlmZmVyZW50IHRoYW4gYSBub3JtYWwgZmlsZSwgZGV2aWNlIHNwZWNpYWwgZmlsZSBvciBGSUZPLgogKgogKiBFeHBlY3RlZCBSZXN1bHQ6CiAqICBta25vZCgpIHNob3VsZCBmYWlsIHdpdGggcmV0dXJuIHZhbHVlIC0xIGFuZCBzZXRzIGV4cGVjdGVkIGVycm5vLgogKgogKiBBbGdvcml0aG06CiAqICBTZXR1cDoKICogICBTZXR1cCBzaWduYWwgaGFuZGxpbmcuCiAqICAgQ2hlY2sgaWQgaXMgc3VwZXIvcm9vdAogKiAgIFBhdXNlIGZvciBTSUdVU1IxIGlmIG9wdGlvbiBzcGVjaWZpZWQuCiAqICAgQ3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkuCiAqCiAqICBUZXN0OgogKiAgIExvb3AgaWYgdGhlIHByb3BlciBvcHRpb25zIGFyZSBnaXZlbi4KICogICBFeGVjdXRlIHN5c3RlbSBjYWxsCiAqICAgQ2hlY2sgcmV0dXJuIGNvZGUsIGlmIHN5c3RlbSBjYWxsIGZhaWxlZCAocmV0dXJuPS0xKQogKglpZiBlcnJubyBzZXQgPT0gZXhwZWN0ZWQgZXJybm8KICoJCUlzc3VlIHN5cyBjYWxsIGZhaWxzIHdpdGggZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGFuZCBlcnJuby4KICoJT3RoZXJ3aXNlLAogKgkJSXNzdWUgc3lzIGNhbGwgZmFpbHMgd2l0aCB1bmV4cGVjdGVkIGVycm5vLgogKiAgIE90aGVyd2lzZSwKICoJSXNzdWUgc3lzIGNhbGwgcmV0dXJucyB1bmV4cGVjdGVkIHZhbHVlLgogKgogKiAgQ2xlYW51cDoKICogICBQcmludCBlcnJubyBsb2cgYW5kL29yIHRpbWluZyBzdGF0cyBpZiBvcHRpb25zIGdpdmVuCiAqICAgRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGNyZWF0ZWQuCiAqCiAqIFVzYWdlOiAgPGZvciBjb21tYW5kLWxpbmU+CiAqICBta25vZDA5IFstYyBuXSBbLWVdIFstZl0gWy1pIG5dIFstSSB4XSBbLVAgeF0gWy10XQogKiAgICAgd2hlcmUsICAtYyBuIDogUnVuIG4gY29waWVzIGNvbmN1cnJlbnRseS4KICogICAgICAgICAgICAgLWUgICA6IFR1cm4gb24gZXJybm8gbG9nZ2luZy4KICogICAgICAgICAgICAgLWYgICA6IFR1cm4gb2ZmIGZ1bmN0aW9uYWxpdHkgVGVzdGluZy4KICoJICAgICAgIC1pIG4gOiBFeGVjdXRlIHRlc3QgbiB0aW1lcy4KICoJICAgICAgIC1JIHggOiBFeGVjdXRlIHRlc3QgZm9yIHggc2Vjb25kcy4KICoJICAgICAgIC1QIHggOiBQYXVzZSBmb3IgeCBzZWNvbmRzIGJldHdlZW4gaXRlcmF0aW9ucy4KICoJICAgICAgIC10ICAgOiBUdXJuIG9uIHN5c2NhbGwgdGltaW5nLgogKgogKiBISVNUT1JZCiAqCTA1LzIwMDIgUG9ydGVkIGJ5IEFuZHLpIE1lcmxpZXIKICoKICogUkVTVFJJQ1RJT05TOgogKiAgVGhpcyB0ZXN0IHNob3VsZCBiZSBydW4gYnkgJ3N1cGVyLXVzZXInIChyb290KSBvbmx5LgogKgogKi8KCiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgInRlc3QuaCIKCiNkZWZpbmUgTU9ERV9SV1gJU19JRk1UCS8qIG1vZGUgZGlmZmVyZW50IGZyb20gdGhvc2UgZXhwZWN0ZWQgKi8KI2RlZmluZSBUTk9ERQkJInRub2RlIgkvKnBhdGhuYW1lICovCgpjaGFyICpUQ0lEID0gIm1rbm9kMDkiOwppbnQgVFNUX1RPVEFMID0gMTsKCnZvaWQgc2V0dXAoKTsJCQkvKiBzZXR1cCBmdW5jdGlvbiBmb3IgdGhlIHRlc3QgKi8Kdm9pZCBjbGVhbnVwKCk7CQkJLyogY2xlYW51cCBmdW5jdGlvbiBmb3IgdGhlIHRlc3QgKi8KCmludCBtYWluKGludCBhYywgY2hhciAqKmF2KQp7CglpbnQgbGM7Cgljb25zdCBjaGFyICptc2c7CgljaGFyICp0ZXN0X2Rlc2M7CS8qIHRlc3Qgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZSAqLwoKCW1zZyA9IHBhcnNlX29wdHMoYWMsIGF2LCBOVUxMLCBOVUxMKTsKCWlmIChtc2cgIT0gTlVMTCkgewoJCXRzdF9icmttKFRCUk9LLCBOVUxMLCAiT1BUSU9OIFBBUlNJTkcgRVJST1IgLSAlcyIsIG1zZyk7CgoJfQoKCXNldHVwKCk7CgoJZm9yIChsYyA9IDA7IFRFU1RfTE9PUElORyhsYyk7IGxjKyspIHsKCQl0ZXN0X2Rlc2MgPSAiRUlOVkFMIjsKCgkJdHN0X2NvdW50ID0gMDsKCgkJLyoKCQkgKiBDYWxsIG1rbm9kKDIpIHRvIHRlc3QgY29uZGl0aW9uLgoJCSAqIHZlcmlmeSB0aGF0IGl0IGZhaWxzIHdpdGggLTEgcmV0dXJuIHZhbHVlIGFuZAoJCSAqIHNldHMgYXBwcm9wcmlhdGUgZXJybm8uCgkJICovCgkJVEVTVChta25vZChUTk9ERSwgTU9ERV9SV1gsIDApKTsKCgkJLyogQ2hlY2sgcmV0dXJuIGNvZGUgZnJvbSBta25vZCgyKSAqLwoJCWlmIChURVNUX1JFVFVSTiAhPSAtMSkgewoJCQl0c3RfcmVzbShURkFJTCwgIm1rbm9kKCkgcmV0dXJuZWQgJWxkLCIKCQkJCSAiZXhwZWN0ZWQgLTEsIGVycm5vPSVkIiwgVEVTVF9SRVRVUk4sCgkJCQkgRUlOVkFMKTsKCQl9IGVsc2UgewoJCQlpZiAoVEVTVF9FUlJOTyA9PSBFSU5WQUwpIHsKCQkJCXRzdF9yZXNtKFRQQVNTLCAibWtub2QoKSBmYWlscyB3aXRoIGV4cGVjdGVkICIKCQkJCQkgImVycm9yIEVJTlZBTCBlcnJubzolZCIsIFRFU1RfRVJSTk8pOwoJCQl9IGVsc2UgewoJCQkJdHN0X3Jlc20oVEZBSUwsICJta25vZCgpIGZhaWxzLCAlcywgIgoJCQkJCSAiZXJybm89JWQsIGV4cGVjdGVkIGVycm5vPSVkIiwKCQkJCQkgdGVzdF9kZXNjLCBURVNUX0VSUk5PLCBFSU5WQUwpOwoJCQl9CgkJfQoJfQoKCWNsZWFudXAoKTsKCgl0c3RfZXhpdCgpOwp9CgovKgogKiBzZXR1cCh2b2lkKQogKi8Kdm9pZCBzZXR1cCh2b2lkKQp7Cgl0c3RfcmVxdWlyZV9yb290KE5VTEwpOwoKCS8qIENhcHR1cmUgdW5leHBlY3RlZCBzaWduYWxzICovCgl0c3Rfc2lnKE5PRk9SSywgREVGX0hBTkRMRVIsIGNsZWFudXApOwoKCVRFU1RfUEFVU0U7CgoJLyogTWFrZSBhIHRlbXAgZGlyIGFuZCBjZCB0byBpdCAqLwoJdHN0X3RtcGRpcigpOwp9CgovKgogKiBjbGVhbnVwKCkKICovCnZvaWQgY2xlYW51cCh2b2lkKQp7CgoJdHN0X3JtZGlyKCk7Cgp9Cg==