LyoKICAgVGVzdCBwcm9ncmFtIGZvciBUaW55WE1MLgoqLwoKCiNpZmRlZiBUSVhNTF9VU0VfU1RMCgkjaW5jbHVkZSA8aW9zdHJlYW0+CgkjaW5jbHVkZSA8c3N0cmVhbT4KCXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNlbHNlCgkjaW5jbHVkZSA8c3RkaW8uaD4KI2VuZGlmCgojaWYgZGVmaW5lZCggV0lOMzIgKSAmJiBkZWZpbmVkKCBUVU5FICkKCSNpbmNsdWRlIDxjcnRkYmcuaD4KCV9DcnRNZW1TdGF0ZSBzdGFydE1lbVN0YXRlOwoJX0NydE1lbVN0YXRlIGVuZE1lbVN0YXRlOwojZW5kaWYKCiNpbmNsdWRlICJ0aW55eG1sLmgiCgpib29sIFhtbFRlc3QgKGNvbnN0IGNoYXIqIHRlc3RTdHJpbmcsIGNvbnN0IGNoYXIqIGV4cGVjdGVkLCBjb25zdCBjaGFyKiBmb3VuZCwgYm9vbCBub0VjaG8gPSBmYWxzZSk7CmJvb2wgWG1sVGVzdCggY29uc3QgY2hhciogdGVzdFN0cmluZywgaW50IGV4cGVjdGVkLCBpbnQgZm91bmQsIGJvb2wgbm9FY2hvID0gZmFsc2UgKTsKCnN0YXRpYyBpbnQgZ1Bhc3MgPSAwOwpzdGF0aWMgaW50IGdGYWlsID0gMDsKCgoKYm9vbCBYbWxUZXN0IChjb25zdCBjaGFyKiB0ZXN0U3RyaW5nLCBjb25zdCBjaGFyKiBleHBlY3RlZCwgY29uc3QgY2hhciogZm91bmQsIGJvb2wgbm9FY2hvICkKewoJYm9vbCBwYXNzID0gIXN0cmNtcCggZXhwZWN0ZWQsIGZvdW5kICk7CglpZiAoIHBhc3MgKQoJCXByaW50ZiAoIltwYXNzXSIpOwoJZWxzZQoJCXByaW50ZiAoIltmYWlsXSIpOwoKCWlmICggbm9FY2hvICkKCQlwcmludGYgKCIgJXNcbiIsIHRlc3RTdHJpbmcpOwoJZWxzZQoJCXByaW50ZiAoIiAlcyBbJXNdWyVzXVxuIiwgdGVzdFN0cmluZywgZXhwZWN0ZWQsIGZvdW5kKTsKCglpZiAoIHBhc3MgKQoJCSsrZ1Bhc3M7CgllbHNlCgkJKytnRmFpbDsKCXJldHVybiBwYXNzOwp9CgoKYm9vbCBYbWxUZXN0KCBjb25zdCBjaGFyKiB0ZXN0U3RyaW5nLCBpbnQgZXhwZWN0ZWQsIGludCBmb3VuZCwgYm9vbCBub0VjaG8gKQp7Cglib29sIHBhc3MgPSAoIGV4cGVjdGVkID09IGZvdW5kICk7CglpZiAoIHBhc3MgKQoJCXByaW50ZiAoIltwYXNzXSIpOwoJZWxzZQoJCXByaW50ZiAoIltmYWlsXSIpOwoKCWlmICggbm9FY2hvICkKCQlwcmludGYgKCIgJXNcbiIsIHRlc3RTdHJpbmcpOwoJZWxzZQoJCXByaW50ZiAoIiAlcyBbJWRdWyVkXVxuIiwgdGVzdFN0cmluZywgZXhwZWN0ZWQsIGZvdW5kKTsKCglpZiAoIHBhc3MgKQoJCSsrZ1Bhc3M7CgllbHNlCgkJKytnRmFpbDsKCXJldHVybiBwYXNzOwp9CgoKdm9pZCBOdWxsTGluZUVuZGluZ3MoIGNoYXIqIHAgKQp7Cgl3aGlsZSggcCAmJiAqcCApIHsKCQlpZiAoICpwID09ICdcbicgfHwgKnAgPT0gJ1xyJyApIHsKCQkJKnAgPSAwOwoJCQlyZXR1cm47CgkJfQoJCSsrcDsKCX0KfQoKLy8KLy8gVGhpcyBmaWxlIGRlbW9uc3RyYXRlcyBzb21lIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgVGlueVhtbC4KLy8gTm90ZSB0aGF0IHRoZSBleGFtcGxlIGlzIHZlcnkgY29udHJpdmVkLiBJdCBwcmVzdW1lcyB5b3Uga25vdwovLyB3aGF0IGlzIGluIHRoZSBYTUwgZmlsZS4gQnV0IGl0IGRvZXMgdGVzdCB0aGUgYmFzaWMgb3BlcmF0aW9ucywKLy8gYW5kIHNob3cgaG93IHRvIGFkZCBhbmQgcmVtb3ZlIG5vZGVzLgovLwoKaW50IG1haW4oKQp7CgoJLy8KCS8vIFdlIHN0YXJ0IHdpdGggdGhlICdkZW1vU3RhcnQnIHRvZG8gbGlzdC4gUHJvY2VzcyBpdC4gQW5kCgkvLyBzaG91bGQgaG9wZWZ1bGx5IGVuZCB1cCB3aXRoIHRoZSB0b2RvIGxpc3QgYXMgaWxsdXN0cmF0ZWQuCgkvLwoJY29uc3QgY2hhciogZGVtb1N0YXJ0ID0KCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiICBzdGFuZGFsb25lPSdubycgPlxuIgoJCSI8IS0tIE91ciB0byBkbyBsaXN0IGRhdGEgLS0+IgoJCSI8VG9Ebz5cbiIKCQkiPCEtLSBEbyBJIG5lZWQgYSBzZWN1cmUgUERBPyAtLT5cbiIKCQkiPEl0ZW0gcHJpb3JpdHk9XCIxXCIgZGlzdGFuY2U9J2Nsb3NlJz4gR28gdG8gdGhlIDxib2xkPlRveSBzdG9yZSE8L2JvbGQ+PC9JdGVtPiIKCQkiPEl0ZW0gcHJpb3JpdHk9XCIyXCIgZGlzdGFuY2U9J25vbmUnPiBEbyBiaWxscyAgIDwvSXRlbT4iCgkJIjxJdGVtIHByaW9yaXR5PVwiMlwiIGRpc3RhbmNlPSdmYXIgJmFtcDsgYmFjayc+IExvb2sgZm9yIEV2aWwgRGlub3NhdXJzISA8L0l0ZW0+IgoJCSI8L1RvRG8+IjsKCQkKCXsKCgkjaWZkZWYgVElYTUxfVVNFX1NUTAoJCS8vCVdoYXQgdGhlIHRvZG8gbGlzdCBzaG91bGQgbG9vayBsaWtlIGFmdGVyIHByb2Nlc3NpbmcuCgkJLy8gSW4gc3RyZWFtIChubyBmb3JtYXR0aW5nKSByZXByZXNlbnRhdGlvbi4KCQljb25zdCBjaGFyKiBkZW1vRW5kID0KCQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBzdGFuZGFsb25lPVwibm9cIiA/PiIKCQkJIjwhLS0gT3VyIHRvIGRvIGxpc3QgZGF0YSAtLT4iCgkJCSI8VG9Ebz4iCgkJCSI8IS0tIERvIEkgbmVlZCBhIHNlY3VyZSBQREE/IC0tPiIKCQkJIjxJdGVtIHByaW9yaXR5PVwiMlwiIGRpc3RhbmNlPVwiY2xvc2VcIj5HbyB0byB0aGUiCgkJCSI8Ym9sZD5Ub3kgc3RvcmUhIgoJCQkiPC9ib2xkPiIKCQkJIjwvSXRlbT4iCgkJCSI8SXRlbSBwcmlvcml0eT1cIjFcIiBkaXN0YW5jZT1cImZhclwiPlRhbGsgdG86IgoJCQkiPE1lZXRpbmcgd2hlcmU9XCJTY2hvb2xcIj4iCgkJCSI8QXR0ZW5kZWUgbmFtZT1cIk1hcnBsZVwiIHBvc2l0aW9uPVwidGVhY2hlclwiIC8+IgoJCQkiPEF0dGVuZGVlIG5hbWU9XCJWb2VsXCIgcG9zaXRpb249XCJjb3Vuc2Vsb3JcIiAvPiIKCQkJIjwvTWVldGluZz4iCgkJCSI8TWVldGluZyB3aGVyZT1cIkx1bmNoXCIgLz4iCgkJCSI8L0l0ZW0+IgoJCQkiPEl0ZW0gcHJpb3JpdHk9XCIyXCIgZGlzdGFuY2U9XCJoZXJlXCI+RG8gYmlsbHMiCgkJCSI8L0l0ZW0+IgoJCQkiPC9Ub0RvPiI7CgkjZW5kaWYKCgkJLy8gVGhlIGV4YW1wbGUgcGFyc2VzIGZyb20gdGhlIGNoYXJhY3RlciBzdHJpbmcgKGFib3ZlKToKCQkjaWYgZGVmaW5lZCggV0lOMzIgKSAmJiBkZWZpbmVkKCBUVU5FICkKCQlfQ3J0TWVtQ2hlY2twb2ludCggJnN0YXJ0TWVtU3RhdGUgKTsKCQkjZW5kaWYJCgoJCXsKCQkJLy8gV3JpdGUgdG8gYSBmaWxlIGFuZCByZWFkIGl0IGJhY2ssIHRvIGNoZWNrIGZpbGUgSS9PLgoKCQkJVGlYbWxEb2N1bWVudCBkb2MoICJkZW1vdGVzdC54bWwiICk7CgkJCWRvYy5QYXJzZSggZGVtb1N0YXJ0ICk7CgoJCQlpZiAoIGRvYy5FcnJvcigpICkKCQkJewoJCQkJcHJpbnRmKCAiRXJyb3IgaW4gJXM6ICVzXG4iLCBkb2MuVmFsdWUoKSwgZG9jLkVycm9yRGVzYygpICk7CgkJCQlleGl0KCAxICk7CgkJCX0KCQkJZG9jLlNhdmVGaWxlKCk7CgkJfQoKCQlUaVhtbERvY3VtZW50IGRvYyggImRlbW90ZXN0LnhtbCIgKTsKCQlib29sIGxvYWRPa2F5ID0gZG9jLkxvYWRGaWxlKCk7CgoJCWlmICggIWxvYWRPa2F5ICkKCQl7CgkJCXByaW50ZiggIkNvdWxkIG5vdCBsb2FkIHRlc3QgZmlsZSAnZGVtb3Rlc3QueG1sJy4gRXJyb3I9JyVzJy4gRXhpdGluZy5cbiIsIGRvYy5FcnJvckRlc2MoKSApOwoJCQlleGl0KCAxICk7CgkJfQoKCQlwcmludGYoICIqKiBEZW1vIGRvYyByZWFkIGZyb20gZGlzazogKiogXG5cbiIgKTsKCQlwcmludGYoICIqKiBQcmludGluZyB2aWEgZG9jLlByaW50ICoqXG4iICk7CgkJZG9jLlByaW50KCBzdGRvdXQgKTsKCgkJewoJCQlwcmludGYoICIqKiBQcmludGluZyB2aWEgVGlYbWxQcmludGVyICoqXG4iICk7CgkJCVRpWG1sUHJpbnRlciBwcmludGVyOwoJCQlkb2MuQWNjZXB0KCAmcHJpbnRlciApOwoJCQlmcHJpbnRmKCBzdGRvdXQsICIlcyIsIHByaW50ZXIuQ1N0cigpICk7CgkJfQoJCSNpZmRlZiBUSVhNTF9VU0VfU1RMCQoJCXsKCQkJcHJpbnRmKCAiKiogUHJpbnRpbmcgdmlhIG9wZXJhdG9yPDwgKipcbiIgKTsKCQkJc3RkOjpjb3V0IDw8IGRvYzsKCQl9CgkJI2VuZGlmCgkJVGlYbWxOb2RlKiBub2RlID0gMDsKCQlUaVhtbEVsZW1lbnQqIHRvZG9FbGVtZW50ID0gMDsKCQlUaVhtbEVsZW1lbnQqIGl0ZW1FbGVtZW50ID0gMDsKCgoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJLy8gQW4gZXhhbXBsZSBvZiBjaGFuZ2luZyBleGlzdGluZyBhdHRyaWJ1dGVzLCBhbmQgcmVtb3ZpbmcKCQkvLyBhbiBlbGVtZW50IGZyb20gdGhlIGRvY3VtZW50LgoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJCS8vIEdldCB0aGUgIlRvRG8iIGVsZW1lbnQuCgkJLy8gSXQgaXMgYSBjaGlsZCBvZiB0aGUgZG9jdW1lbnQsIGFuZCBjYW4gYmUgc2VsZWN0ZWQgYnkgbmFtZS4KCQlub2RlID0gZG9jLkZpcnN0Q2hpbGQoICJUb0RvIiApOwoJCWFzc2VydCggbm9kZSApOwoJCXRvZG9FbGVtZW50ID0gbm9kZS0+VG9FbGVtZW50KCk7CgkJYXNzZXJ0KCB0b2RvRWxlbWVudCAgKTsKCgkJLy8gR29pbmcgdG8gdGhlIHRveSBzdG9yZSBpcyBub3cgb3VyIHNlY29uZCBwcmlvcml0eS4uLgoJCS8vIFNvIHNldCB0aGUgInByaW9yaXR5IiBhdHRyaWJ1dGUgb2YgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuCgkJbm9kZSA9IHRvZG9FbGVtZW50LT5GaXJzdENoaWxkRWxlbWVudCgpOwkvLyBUaGlzIHNraXBzIHRoZSAiUERBIiBjb21tZW50LgoJCWFzc2VydCggbm9kZSApOwoJCWl0ZW1FbGVtZW50ID0gbm9kZS0+VG9FbGVtZW50KCk7CgkJYXNzZXJ0KCBpdGVtRWxlbWVudCAgKTsKCQlpdGVtRWxlbWVudC0+U2V0QXR0cmlidXRlKCAicHJpb3JpdHkiLCAyICk7CgoJCS8vIENoYW5nZSB0aGUgZGlzdGFuY2UgdG8gImRvaW5nIGJpbGxzIiBmcm9tCgkJLy8gIm5vbmUiIHRvICJoZXJlIi4gSXQncyB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQuCgkJaXRlbUVsZW1lbnQgPSBpdGVtRWxlbWVudC0+TmV4dFNpYmxpbmdFbGVtZW50KCk7CgkJYXNzZXJ0KCBpdGVtRWxlbWVudCApOwoJCWl0ZW1FbGVtZW50LT5TZXRBdHRyaWJ1dGUoICJkaXN0YW5jZSIsICJoZXJlIiApOwoKCQkvLyBSZW1vdmUgdGhlICJMb29rIGZvciBFdmlsIERpbm9zYXVycyEiIGl0ZW0uCgkJLy8gSXQgaXMgMSBtb3JlIHNpYmxpbmcgYXdheS4gV2UgYXNrIHRoZSBwYXJlbnQgdG8gcmVtb3ZlCgkJLy8gYSBwYXJ0aWN1bGFyIGNoaWxkLgoJCWl0ZW1FbGVtZW50ID0gaXRlbUVsZW1lbnQtPk5leHRTaWJsaW5nRWxlbWVudCgpOwoJCXRvZG9FbGVtZW50LT5SZW1vdmVDaGlsZCggaXRlbUVsZW1lbnQgKTsKCgkJaXRlbUVsZW1lbnQgPSAwOwoKCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCS8vIFdoYXQgZm9sbG93cyBpcyBhbiBleGFtcGxlIG9mIGNyZWF0ZWQgZWxlbWVudHMgYW5kIHRleHQKCQkvLyBub2RlcyBhbmQgYWRkaW5nIHRoZW0gdG8gdGhlIGRvY3VtZW50LgoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJCS8vIEFkZCBzb21lIG1lZXRpbmdzLgoJCVRpWG1sRWxlbWVudCBpdGVtKCAiSXRlbSIgKTsKCQlpdGVtLlNldEF0dHJpYnV0ZSggInByaW9yaXR5IiwgIjEiICk7CgkJaXRlbS5TZXRBdHRyaWJ1dGUoICJkaXN0YW5jZSIsICJmYXIiICk7CgoJCVRpWG1sVGV4dCB0ZXh0KCAiVGFsayB0bzoiICk7CgoJCVRpWG1sRWxlbWVudCBtZWV0aW5nMSggIk1lZXRpbmciICk7CgkJbWVldGluZzEuU2V0QXR0cmlidXRlKCAid2hlcmUiLCAiU2Nob29sIiApOwoKCQlUaVhtbEVsZW1lbnQgbWVldGluZzIoICJNZWV0aW5nIiApOwoJCW1lZXRpbmcyLlNldEF0dHJpYnV0ZSggIndoZXJlIiwgIkx1bmNoIiApOwoKCQlUaVhtbEVsZW1lbnQgYXR0ZW5kZWUxKCAiQXR0ZW5kZWUiICk7CgkJYXR0ZW5kZWUxLlNldEF0dHJpYnV0ZSggIm5hbWUiLCAiTWFycGxlIiApOwoJCWF0dGVuZGVlMS5TZXRBdHRyaWJ1dGUoICJwb3NpdGlvbiIsICJ0ZWFjaGVyIiApOwoKCQlUaVhtbEVsZW1lbnQgYXR0ZW5kZWUyKCAiQXR0ZW5kZWUiICk7CgkJYXR0ZW5kZWUyLlNldEF0dHJpYnV0ZSggIm5hbWUiLCAiVm9lbCIgKTsKCQlhdHRlbmRlZTIuU2V0QXR0cmlidXRlKCAicG9zaXRpb24iLCAiY291bnNlbG9yIiApOwoKCQkvLyBBc3NlbWJsZSB0aGUgbm9kZXMgd2UndmUgY3JlYXRlZDoKCQltZWV0aW5nMS5JbnNlcnRFbmRDaGlsZCggYXR0ZW5kZWUxICk7CgkJbWVldGluZzEuSW5zZXJ0RW5kQ2hpbGQoIGF0dGVuZGVlMiApOwoKCQlpdGVtLkluc2VydEVuZENoaWxkKCB0ZXh0ICk7CgkJaXRlbS5JbnNlcnRFbmRDaGlsZCggbWVldGluZzEgKTsKCQlpdGVtLkluc2VydEVuZENoaWxkKCBtZWV0aW5nMiApOwoKCQkvLyBBbmQgYWRkIHRoZSBub2RlIHRvIHRoZSBleGlzdGluZyBsaXN0IGFmdGVyIHRoZSBmaXJzdCBjaGlsZC4KCQlub2RlID0gdG9kb0VsZW1lbnQtPkZpcnN0Q2hpbGQoICJJdGVtIiApOwoJCWFzc2VydCggbm9kZSApOwoJCWl0ZW1FbGVtZW50ID0gbm9kZS0+VG9FbGVtZW50KCk7CgkJYXNzZXJ0KCBpdGVtRWxlbWVudCApOwoKCQl0b2RvRWxlbWVudC0+SW5zZXJ0QWZ0ZXJDaGlsZCggaXRlbUVsZW1lbnQsIGl0ZW0gKTsKCgkJcHJpbnRmKCAiXG4qKiBEZW1vIGRvYyBwcm9jZXNzZWQ6ICoqIFxuXG4iICk7CgkJZG9jLlByaW50KCBzdGRvdXQgKTsKCgoJI2lmZGVmIFRJWE1MX1VTRV9TVEwKCQlwcmludGYoICIqKiBEZW1vIGRvYyBwcm9jZXNzZWQgdG8gc3RyZWFtOiAqKiBcblxuIiApOwoJCWNvdXQgPDwgZG9jIDw8IGVuZGwgPDwgZW5kbDsKCSNlbmRpZgoKCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCS8vIERpZmZlcmVudCB0ZXN0cy4uLmRvIHdlIGhhdmUgd2hhdCB3ZSBleHBlY3Q/CgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgkJaW50IGNvdW50ID0gMDsKCQlUaVhtbEVsZW1lbnQqCWVsZW1lbnQ7CgoJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCSNpZmRlZiBUSVhNTF9VU0VfU1RMCgkJY291dCA8PCAiKiogQmFzaWMgc3RydWN0dXJlLiAqKlxuIjsKCQlvc3RyaW5nc3RyZWFtIG91dHB1dFN0cmVhbSggb3N0cmluZ3N0cmVhbTo6b3V0ICk7CgkJb3V0cHV0U3RyZWFtIDw8IGRvYzsKCQlYbWxUZXN0KCAiT3V0cHV0IHN0cmVhbSBjb3JyZWN0LiIsCXN0cmluZyggZGVtb0VuZCApLmNfc3RyKCksCgkJCQkJCQkJCQkJb3V0cHV0U3RyZWFtLnN0cigpLmNfc3RyKCksIHRydWUgKTsKCSNlbmRpZgoKCQlub2RlID0gZG9jLlJvb3RFbGVtZW50KCk7CgkJYXNzZXJ0KCBub2RlICk7CgkJWG1sVGVzdCggIlJvb3QgZWxlbWVudCBleGlzdHMuIiwgdHJ1ZSwgKCBub2RlICE9IDAgJiYgbm9kZS0+VG9FbGVtZW50KCkgKSApOwoJCVhtbFRlc3QgKCAiUm9vdCBlbGVtZW50IHZhbHVlIGlzICdUb0RvJy4iLCAiVG9EbyIsICBub2RlLT5WYWx1ZSgpKTsKCgkJbm9kZSA9IG5vZGUtPkZpcnN0Q2hpbGQoKTsKCQlYbWxUZXN0KCAiRmlyc3QgY2hpbGQgZXhpc3RzICYgaXMgYSBjb21tZW50LiIsIHRydWUsICggbm9kZSAhPSAwICYmIG5vZGUtPlRvQ29tbWVudCgpICkgKTsKCQlub2RlID0gbm9kZS0+TmV4dFNpYmxpbmcoKTsKCQlYbWxUZXN0KCAiU2libGluZyBlbGVtZW50IGV4aXN0cyAmIGlzIGFuIGVsZW1lbnQuIiwgdHJ1ZSwgKCBub2RlICE9IDAgJiYgbm9kZS0+VG9FbGVtZW50KCkgKSApOwoJCVhtbFRlc3QgKCAiVmFsdWUgaXMgJ0l0ZW0nLiIsICJJdGVtIiwgbm9kZS0+VmFsdWUoKSApOwoKCQlub2RlID0gbm9kZS0+Rmlyc3RDaGlsZCgpOwoJCVhtbFRlc3QgKCAiRmlyc3QgY2hpbGQgZXhpc3RzLiIsIHRydWUsICggbm9kZSAhPSAwICYmIG5vZGUtPlRvVGV4dCgpICkgKTsKCQlYbWxUZXN0ICggIlZhbHVlIGlzICdHbyB0byB0aGUnLiIsICJHbyB0byB0aGUiLCBub2RlLT5WYWx1ZSgpICk7CgoKCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCQlwcmludGYgKCJcbioqIEl0ZXJhdG9ycy4gKipcbiIpOwoKCQkvLyBXYWxrIGFsbCB0aGUgdG9wIGxldmVsIG5vZGVzIG9mIHRoZSBkb2N1bWVudC4KCQljb3VudCA9IDA7CgkJZm9yKCBub2RlID0gZG9jLkZpcnN0Q2hpbGQoKTsKCQkJIG5vZGU7CgkJCSBub2RlID0gbm9kZS0+TmV4dFNpYmxpbmcoKSApCgkJewoJCQljb3VudCsrOwoJCX0KCQlYbWxUZXN0KCAiVG9wIGxldmVsIG5vZGVzLCB1c2luZyBGaXJzdCAvIE5leHQuIiwgMywgY291bnQgKTsKCgkJY291bnQgPSAwOwoJCWZvciggbm9kZSA9IGRvYy5MYXN0Q2hpbGQoKTsKCQkJIG5vZGU7CgkJCSBub2RlID0gbm9kZS0+UHJldmlvdXNTaWJsaW5nKCkgKQoJCXsKCQkJY291bnQrKzsKCQl9CgkJWG1sVGVzdCggIlRvcCBsZXZlbCBub2RlcywgdXNpbmcgTGFzdCAvIFByZXZpb3VzLiIsIDMsIGNvdW50ICk7CgoJCS8vIFdhbGsgYWxsIHRoZSB0b3AgbGV2ZWwgbm9kZXMgb2YgdGhlIGRvY3VtZW50LAoJCS8vIHVzaW5nIGEgZGlmZmVyZW50IHN5bnRheC4KCQljb3VudCA9IDA7CgkJZm9yKCBub2RlID0gZG9jLkl0ZXJhdGVDaGlsZHJlbiggMCApOwoJCQkgbm9kZTsKCQkJIG5vZGUgPSBkb2MuSXRlcmF0ZUNoaWxkcmVuKCBub2RlICkgKQoJCXsKCQkJY291bnQrKzsKCQl9CgkJWG1sVGVzdCggIlRvcCBsZXZlbCBub2RlcywgdXNpbmcgSXRlcmF0ZUNoaWxkcmVuLiIsIDMsIGNvdW50ICk7CgoJCS8vIFdhbGsgYWxsIHRoZSBlbGVtZW50cyBpbiBhIG5vZGUuCgkJY291bnQgPSAwOwoJCWZvciggZWxlbWVudCA9IHRvZG9FbGVtZW50LT5GaXJzdENoaWxkRWxlbWVudCgpOwoJCQkgZWxlbWVudDsKCQkJIGVsZW1lbnQgPSBlbGVtZW50LT5OZXh0U2libGluZ0VsZW1lbnQoKSApCgkJewoJCQljb3VudCsrOwoJCX0KCQlYbWxUZXN0KCAiQ2hpbGRyZW4gb2YgdGhlICdUb0RvJyBlbGVtZW50LCB1c2luZyBGaXJzdCAvIE5leHQuIiwKCQkJMywgY291bnQgKTsKCgkJLy8gV2FsayBhbGwgdGhlIGVsZW1lbnRzIGluIGEgbm9kZSBieSB2YWx1ZS4KCQljb3VudCA9IDA7CgkJZm9yKCBub2RlID0gdG9kb0VsZW1lbnQtPkZpcnN0Q2hpbGQoICJJdGVtIiApOwoJCQkgbm9kZTsKCQkJIG5vZGUgPSBub2RlLT5OZXh0U2libGluZyggIkl0ZW0iICkgKQoJCXsKCQkJY291bnQrKzsKCQl9CgkJWG1sVGVzdCggIidJdGVtJyBjaGlsZHJlbiBvZiB0aGUgJ1RvRG8nIGVsZW1lbnQsIHVzaW5nIEZpcnN0L05leHQuIiwgMywgY291bnQgKTsKCgkJY291bnQgPSAwOwoJCWZvciggbm9kZSA9IHRvZG9FbGVtZW50LT5MYXN0Q2hpbGQoICJJdGVtIiApOwoJCQkgbm9kZTsKCQkJIG5vZGUgPSBub2RlLT5QcmV2aW91c1NpYmxpbmcoICJJdGVtIiApICkKCQl7CgkJCWNvdW50Kys7CgkJfQoJCVhtbFRlc3QoICInSXRlbScgY2hpbGRyZW4gb2YgdGhlICdUb0RvJyBlbGVtZW50LCB1c2luZyBMYXN0L1ByZXZpb3VzLiIsIDMsIGNvdW50ICk7CgoJI2lmZGVmIFRJWE1MX1VTRV9TVEwKCQl7CgkJCWNvdXQgPDwgIlxuKiogUGFyc2luZy4gKipcbiI7CgkJCWlzdHJpbmdzdHJlYW0gcGFyc2UwKCAiPEVsZW1lbnQwIGF0dHJpYnV0ZTA9J2ZvbzAnIGF0dHJpYnV0ZTE9IG5vcXVvdGVzIGF0dHJpYnV0ZTIgPSAnJmd0OycgLz4iICk7CgkJCVRpWG1sRWxlbWVudCBlbGVtZW50MCggImRlZmF1bHQiICk7CgkJCXBhcnNlMCA+PiBlbGVtZW50MDsKCgkJCVhtbFRlc3QgKCAiRWxlbWVudCBwYXJzZWQsIHZhbHVlIGlzICdFbGVtZW50MCcuIiwgIkVsZW1lbnQwIiwgZWxlbWVudDAuVmFsdWUoKSApOwoJCQlYbWxUZXN0ICggIlJlYWRzIGF0dHJpYnV0ZSAnYXR0cmlidXRlMD1cImZvbzBcIicuIiwgImZvbzAiLCBlbGVtZW50MC5BdHRyaWJ1dGUoICJhdHRyaWJ1dGUwIiApKTsKCQkJWG1sVGVzdCAoICJSZWFkcyBpbmNvcnJlY3RseSBmb3JtYXR0ZWQgJ2F0dHJpYnV0ZTE9bm9xdW90ZXMnLiIsICJub3F1b3RlcyIsIGVsZW1lbnQwLkF0dHJpYnV0ZSggImF0dHJpYnV0ZTEiICkgKTsKCQkJWG1sVGVzdCAoICJSZWFkIGF0dHJpYnV0ZSB3aXRoIGVudGl0eSB2YWx1ZSAnPicuIiwgIj4iLCBlbGVtZW50MC5BdHRyaWJ1dGUoICJhdHRyaWJ1dGUyIiApICk7CgkJfQoJI2VuZGlmCgoJCXsKCQkJY29uc3QgY2hhciogZXJyb3IgPQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIHN0YW5kYWxvbmU9XCJub1wiID8+XG4iCgkJCQkJCQkJIjxwYXNzYWdlcyBjb3VudD1cIjAwNlwiIGZvcm1hdHZlcnNpb249XCIyMDAyMDYyMFwiPlxuIgoJCQkJCQkJCSIgICAgPHdyb25nIGVycm9yPlxuIgoJCQkJCQkJCSI8L3Bhc3NhZ2VzPiI7CgoJCQlUaVhtbERvY3VtZW50IGRvY1Rlc3Q7CgkJCWRvY1Rlc3QuUGFyc2UoIGVycm9yICk7CgkJCVhtbFRlc3QoICJFcnJvciByb3ciLCBkb2NUZXN0LkVycm9yUm93KCksIDMgKTsKCQkJWG1sVGVzdCggIkVycm9yIGNvbHVtbiIsIGRvY1Rlc3QuRXJyb3JDb2woKSwgMTcgKTsKCQkJLy9wcmludGYoICJlcnJvcj0lZCBpZD0nJXMnIHJvdyAlZCBjb2wlZFxuIiwgKGludCkgZG9jLkVycm9yKCksIGRvYy5FcnJvckRlc2MoKSwgZG9jLkVycm9yUm93KCkrMSwgZG9jLkVycm9yQ29sKCkgKyAxICk7CgoJCX0KCgkjaWZkZWYgVElYTUxfVVNFX1NUTAoJCXsKCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkJCWNvdXQgPDwgIlxuKiogU3RyZWFtaW5nLiAqKlxuIjsKCgkJCS8vIFJvdW5kIHRyaXAgY2hlY2s6IHN0cmVhbSBpbiwgdGhlbiBzdHJlYW0gYmFjayBvdXQgdG8gdmVyaWZ5LiBUaGUgc3RyZWFtCgkJCS8vIG91dCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQsIGFib3ZlLiBXZSB1c2UgdGhlIG91dHB1dAoKCQkJaXN0cmluZ3N0cmVhbSBpbnB1dFN0cmluZ1N0cmVhbSggb3V0cHV0U3RyZWFtLnN0cigpICk7CgkJCVRpWG1sRG9jdW1lbnQgZG9jdW1lbnQwOwoKCQkJaW5wdXRTdHJpbmdTdHJlYW0gPj4gZG9jdW1lbnQwOwoKCQkJb3N0cmluZ3N0cmVhbSBvdXRwdXRTdHJlYW0wKCBvc3RyaW5nc3RyZWFtOjpvdXQgKTsKCQkJb3V0cHV0U3RyZWFtMCA8PCBkb2N1bWVudDA7CgoJCQlYbWxUZXN0KCAiU3RyZWFtIHJvdW5kIHRyaXAgY29ycmVjdC4iLAlzdHJpbmcoIGRlbW9FbmQgKS5jX3N0cigpLCAKCQkJCQkJCQkJCQkJCW91dHB1dFN0cmVhbTAuc3RyKCkuY19zdHIoKSwgdHJ1ZSApOwoKCQkJc3RkOjpzdHJpbmcgc3RyOwoJCQlzdHIgPDwgZG9jdW1lbnQwOwoKCQkJWG1sVGVzdCggIlN0cmluZyBwcmludGluZyBjb3JyZWN0LiIsIHN0cmluZyggZGVtb0VuZCApLmNfc3RyKCksIAoJCQkJCQkJCQkJCQkgc3RyLmNfc3RyKCksIHRydWUgKTsKCQl9CgkjZW5kaWYKCX0KCgl7CgkJY29uc3QgY2hhciogc3RyID0gIjxkb2MgYXR0cjA9JzEnIGF0dHIxPScyLjAnIGF0dHIyPSdmb28nIC8+IjsKCgkJVGlYbWxEb2N1bWVudCBkb2M7CgkJZG9jLlBhcnNlKCBzdHIgKTsKCgkJVGlYbWxFbGVtZW50KiBlbGUgPSBkb2MuRmlyc3RDaGlsZEVsZW1lbnQoKTsKCgkJaW50IGlWYWwsIHJlc3VsdDsKCQlkb3VibGUgZFZhbDsKCgkJcmVzdWx0ID0gZWxlLT5RdWVyeURvdWJsZUF0dHJpYnV0ZSggImF0dHIwIiwgJmRWYWwgKTsKCQlYbWxUZXN0KCAiUXVlcnkgYXR0cmlidXRlOiBpbnQgYXMgZG91YmxlIiwgcmVzdWx0LCBUSVhNTF9TVUNDRVNTICk7CgkJWG1sVGVzdCggIlF1ZXJ5IGF0dHJpYnV0ZTogaW50IGFzIGRvdWJsZSIsIChpbnQpZFZhbCwgMSApOwoJCXJlc3VsdCA9IGVsZS0+UXVlcnlEb3VibGVBdHRyaWJ1dGUoICJhdHRyMSIsICZkVmFsICk7CgkJWG1sVGVzdCggIlF1ZXJ5IGF0dHJpYnV0ZTogZG91YmxlIGFzIGRvdWJsZSIsIChpbnQpZFZhbCwgMiApOwoJCXJlc3VsdCA9IGVsZS0+UXVlcnlJbnRBdHRyaWJ1dGUoICJhdHRyMSIsICZpVmFsICk7CgkJWG1sVGVzdCggIlF1ZXJ5IGF0dHJpYnV0ZTogZG91YmxlIGFzIGludCIsIHJlc3VsdCwgVElYTUxfU1VDQ0VTUyApOwoJCVhtbFRlc3QoICJRdWVyeSBhdHRyaWJ1dGU6IGRvdWJsZSBhcyBpbnQiLCBpVmFsLCAyICk7CgkJcmVzdWx0ID0gZWxlLT5RdWVyeUludEF0dHJpYnV0ZSggImF0dHIyIiwgJmlWYWwgKTsKCQlYbWxUZXN0KCAiUXVlcnkgYXR0cmlidXRlOiBub3QgYSBudW1iZXIiLCByZXN1bHQsIFRJWE1MX1dST05HX1RZUEUgKTsKCQlyZXN1bHQgPSBlbGUtPlF1ZXJ5SW50QXR0cmlidXRlKCAiYmFyIiwgJmlWYWwgKTsKCQlYbWxUZXN0KCAiUXVlcnkgYXR0cmlidXRlOiBkb2VzIG5vdCBleGlzdCIsIHJlc3VsdCwgVElYTUxfTk9fQVRUUklCVVRFICk7Cgl9CgoJewoJCWNvbnN0IGNoYXIqIHN0ciA9ICI8ZG9jLz4iOwoKCQlUaVhtbERvY3VtZW50IGRvYzsKCQlkb2MuUGFyc2UoIHN0ciApOwoKCQlUaVhtbEVsZW1lbnQqIGVsZSA9IGRvYy5GaXJzdENoaWxkRWxlbWVudCgpOwoKCQlpbnQgaVZhbDsKCQlkb3VibGUgZFZhbDsKCgkJZWxlLT5TZXRBdHRyaWJ1dGUoICJzdHIiLCAic3RyVmFsdWUiICk7CgkJZWxlLT5TZXRBdHRyaWJ1dGUoICJpbnQiLCAxICk7CgkJZWxlLT5TZXREb3VibGVBdHRyaWJ1dGUoICJkb3VibGUiLCAtMS4wICk7CgoJCWNvbnN0IGNoYXIqIGNTdHIgPSBlbGUtPkF0dHJpYnV0ZSggInN0ciIgKTsKCQllbGUtPlF1ZXJ5SW50QXR0cmlidXRlKCAiaW50IiwgJmlWYWwgKTsKCQllbGUtPlF1ZXJ5RG91YmxlQXR0cmlidXRlKCAiZG91YmxlIiwgJmRWYWwgKTsKCgkJWG1sVGVzdCggIkF0dHJpYnV0ZSByb3VuZCB0cmlwLiBjLXN0cmluZy4iLCAic3RyVmFsdWUiLCBjU3RyICk7CgkJWG1sVGVzdCggIkF0dHJpYnV0ZSByb3VuZCB0cmlwLiBpbnQuIiwgMSwgaVZhbCApOwoJCVhtbFRlc3QoICJBdHRyaWJ1dGUgcm91bmQgdHJpcC4gZG91YmxlLiIsIC0xLCAoaW50KWRWYWwgKTsKCX0KCQoJewoJCWNvbnN0IGNoYXIqIHN0ciA9CSJcdDw/eG1sIHZlcnNpb249XCIxLjBcIiBzdGFuZGFsb25lPVwibm9cIiA/Plx0PHJvb20gZG9vcnM9JzInPlxuIgoJCQkJCQkJIjwvcm9vbT4iOwoKCQlUaVhtbERvY3VtZW50IGRvYzsKCQlkb2MuU2V0VGFiU2l6ZSggOCApOwoJCWRvYy5QYXJzZSggc3RyICk7CgoJCVRpWG1sSGFuZGxlIGRvY0hhbmRsZSggJmRvYyApOwoJCVRpWG1sSGFuZGxlIHJvb21IYW5kbGUgPSBkb2NIYW5kbGUuRmlyc3RDaGlsZEVsZW1lbnQoICJyb29tIiApOwoKCQlhc3NlcnQoIGRvY0hhbmRsZS5Ob2RlKCkgKTsKCQlhc3NlcnQoIHJvb21IYW5kbGUuRWxlbWVudCgpICk7CgoJCVRpWG1sRWxlbWVudCogcm9vbSA9IHJvb21IYW5kbGUuRWxlbWVudCgpOwoJCWFzc2VydCggcm9vbSApOwoJCVRpWG1sQXR0cmlidXRlKiBkb29ycyA9IHJvb20tPkZpcnN0QXR0cmlidXRlKCk7CgkJYXNzZXJ0KCBkb29ycyApOwoKCQlYbWxUZXN0KCAiTG9jYXRpb24gdHJhY2tpbmc6IFRhYiA4OiByb29tIHJvdyIsIHJvb20tPlJvdygpLCAxICk7CgkJWG1sVGVzdCggIkxvY2F0aW9uIHRyYWNraW5nOiBUYWIgODogcm9vbSBjb2wiLCByb29tLT5Db2x1bW4oKSwgNDkgKTsKCQlYbWxUZXN0KCAiTG9jYXRpb24gdHJhY2tpbmc6IFRhYiA4OiBkb29ycyByb3ciLCBkb29ycy0+Um93KCksIDEgKTsKCQlYbWxUZXN0KCAiTG9jYXRpb24gdHJhY2tpbmc6IFRhYiA4OiBkb29ycyBjb2wiLCBkb29ycy0+Q29sdW1uKCksIDU1ICk7Cgl9CgkKCXsKCQljb25zdCBjaGFyKiBzdHIgPQkiXHQ8P3htbCB2ZXJzaW9uPVwiMS4wXCIgc3RhbmRhbG9uZT1cIm5vXCIgPz5cdDxyb29tIGRvb3JzPScyJz5cbiIKCQkJCQkJCSIgIDwhLS0gU2lsbHkgZXhhbXBsZSAtLT5cbiIKCQkJCQkJCSIgICAgPGRvb3Igd2FsbD0nbm9ydGgnPkEgZ3JlYXQgZG9vciE8L2Rvb3I+XG4iCgkJCQkJCQkiXHQ8ZG9vciB3YWxsPSdlYXN0Jy8+IgoJCQkJCQkJIjwvcm9vbT4iOwoKCQlUaVhtbERvY3VtZW50IGRvYzsKCQlkb2MuUGFyc2UoIHN0ciApOwoKCQlUaVhtbEhhbmRsZSBkb2NIYW5kbGUoICZkb2MgKTsKCQlUaVhtbEhhbmRsZSByb29tSGFuZGxlID0gZG9jSGFuZGxlLkZpcnN0Q2hpbGRFbGVtZW50KCAicm9vbSIgKTsKCQlUaVhtbEhhbmRsZSBjb21tZW50SGFuZGxlID0gZG9jSGFuZGxlLkZpcnN0Q2hpbGRFbGVtZW50KCAicm9vbSIgKS5GaXJzdENoaWxkKCk7CgkJVGlYbWxIYW5kbGUgdGV4dEhhbmRsZSA9IGRvY0hhbmRsZS5GaXJzdENoaWxkRWxlbWVudCggInJvb20iICkuQ2hpbGRFbGVtZW50KCAiZG9vciIsIDAgKS5GaXJzdENoaWxkKCk7CgkJVGlYbWxIYW5kbGUgZG9vcjBIYW5kbGUgPSBkb2NIYW5kbGUuRmlyc3RDaGlsZEVsZW1lbnQoICJyb29tIiApLkNoaWxkRWxlbWVudCggMCApOwoJCVRpWG1sSGFuZGxlIGRvb3IxSGFuZGxlID0gZG9jSGFuZGxlLkZpcnN0Q2hpbGRFbGVtZW50KCAicm9vbSIgKS5DaGlsZEVsZW1lbnQoIDEgKTsKCgkJYXNzZXJ0KCBkb2NIYW5kbGUuTm9kZSgpICk7CgkJYXNzZXJ0KCByb29tSGFuZGxlLkVsZW1lbnQoKSApOwoJCWFzc2VydCggY29tbWVudEhhbmRsZS5Ob2RlKCkgKTsKCQlhc3NlcnQoIHRleHRIYW5kbGUuVGV4dCgpICk7CgkJYXNzZXJ0KCBkb29yMEhhbmRsZS5FbGVtZW50KCkgKTsKCQlhc3NlcnQoIGRvb3IxSGFuZGxlLkVsZW1lbnQoKSApOwoKCQlUaVhtbERlY2xhcmF0aW9uKiBkZWNsYXJhdGlvbiA9IGRvYy5GaXJzdENoaWxkKCktPlRvRGVjbGFyYXRpb24oKTsKCQlhc3NlcnQoIGRlY2xhcmF0aW9uICk7CgkJVGlYbWxFbGVtZW50KiByb29tID0gcm9vbUhhbmRsZS5FbGVtZW50KCk7CgkJYXNzZXJ0KCByb29tICk7CgkJVGlYbWxBdHRyaWJ1dGUqIGRvb3JzID0gcm9vbS0+Rmlyc3RBdHRyaWJ1dGUoKTsKCQlhc3NlcnQoIGRvb3JzICk7CgkJVGlYbWxUZXh0KiB0ZXh0ID0gdGV4dEhhbmRsZS5UZXh0KCk7CgkJVGlYbWxDb21tZW50KiBjb21tZW50ID0gY29tbWVudEhhbmRsZS5Ob2RlKCktPlRvQ29tbWVudCgpOwoJCWFzc2VydCggY29tbWVudCApOwoJCVRpWG1sRWxlbWVudCogZG9vcjAgPSBkb29yMEhhbmRsZS5FbGVtZW50KCk7CgkJVGlYbWxFbGVtZW50KiBkb29yMSA9IGRvb3IxSGFuZGxlLkVsZW1lbnQoKTsKCgkJWG1sVGVzdCggIkxvY2F0aW9uIHRyYWNraW5nOiBEZWNsYXJhdGlvbiByb3ciLCBkZWNsYXJhdGlvbi0+Um93KCksIDEgKTsKCQlYbWxUZXN0KCAiTG9jYXRpb24gdHJhY2tpbmc6IERlY2xhcmF0aW9uIGNvbCIsIGRlY2xhcmF0aW9uLT5Db2x1bW4oKSwgNSApOwoJCVhtbFRlc3QoICJMb2NhdGlvbiB0cmFja2luZzogcm9vbSByb3ciLCByb29tLT5Sb3coKSwgMSApOwoJCVhtbFRlc3QoICJMb2NhdGlvbiB0cmFja2luZzogcm9vbSBjb2wiLCByb29tLT5Db2x1bW4oKSwgNDUgKTsKCQlYbWxUZXN0KCAiTG9jYXRpb24gdHJhY2tpbmc6IGRvb3JzIHJvdyIsIGRvb3JzLT5Sb3coKSwgMSApOwoJCVhtbFRlc3QoICJMb2NhdGlvbiB0cmFja2luZzogZG9vcnMgY29sIiwgZG9vcnMtPkNvbHVtbigpLCA1MSApOwoJCVhtbFRlc3QoICJMb2NhdGlvbiB0cmFja2luZzogQ29tbWVudCByb3ciLCBjb21tZW50LT5Sb3coKSwgMiApOwoJCVhtbFRlc3QoICJMb2NhdGlvbiB0cmFja2luZzogQ29tbWVudCBjb2wiLCBjb21tZW50LT5Db2x1bW4oKSwgMyApOwoJCVhtbFRlc3QoICJMb2NhdGlvbiB0cmFja2luZzogdGV4dCByb3ciLCB0ZXh0LT5Sb3coKSwgMyApOyAKCQlYbWxUZXN0KCAiTG9jYXRpb24gdHJhY2tpbmc6IHRleHQgY29sIiwgdGV4dC0+Q29sdW1uKCksIDI0ICk7CgkJWG1sVGVzdCggIkxvY2F0aW9uIHRyYWNraW5nOiBkb29yMCByb3ciLCBkb29yMC0+Um93KCksIDMgKTsKCQlYbWxUZXN0KCAiTG9jYXRpb24gdHJhY2tpbmc6IGRvb3IwIGNvbCIsIGRvb3IwLT5Db2x1bW4oKSwgNSApOwoJCVhtbFRlc3QoICJMb2NhdGlvbiB0cmFja2luZzogZG9vcjEgcm93IiwgZG9vcjEtPlJvdygpLCA0ICk7CgkJWG1sVGVzdCggIkxvY2F0aW9uIHRyYWNraW5nOiBkb29yMSBjb2wiLCBkb29yMS0+Q29sdW1uKCksIDUgKTsKCX0KCgoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIFVURi04IHRlc3RpbmcuIEl0IGlzIGltcG9ydGFudCB0byB0ZXN0OgoJLy8JMS4gTWFraW5nIHN1cmUgbmFtZSwgdmFsdWUsIGFuZCB0ZXh0IHJlYWQgY29ycmVjdGx5CgkvLwkyLiBSb3csIENvbCBmdW5jdGlvbmFsaXR5CgkvLwkzLiBDb3JyZWN0IG91dHB1dAoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCXByaW50ZiAoIlxuKiogVVRGLTggKipcbiIpOwoJewoJCVRpWG1sRG9jdW1lbnQgZG9jKCAidXRmOHRlc3QueG1sIiApOwoJCWRvYy5Mb2FkRmlsZSgpOwoJCWlmICggZG9jLkVycm9yKCkgJiYgZG9jLkVycm9ySWQoKSA9PSBUaVhtbEJhc2U6OlRJWE1MX0VSUk9SX09QRU5JTkdfRklMRSApIHsKCQkJcHJpbnRmKCAiV0FSTklORzogRmlsZSAndXRmOHRlc3QueG1sJyBub3QgZm91bmQuXG4iCgkJCQkJIihBcmUgeW91IHJ1bm5pbmcgdGhlIHRlc3QgZnJvbSB0aGUgd3JvbmcgZGlyZWN0b3J5PylcbiIKCQkJCSAgICAiQ291bGQgbm90IHRlc3QgVVRGLTggZnVuY3Rpb25hbGl0eS5cbiIgKTsKCQl9CgkJZWxzZQoJCXsKCQkJVGlYbWxIYW5kbGUgZG9jSCggJmRvYyApOwoJCQkvLyBHZXQgdGhlIGF0dHJpYnV0ZSAidmFsdWUiIGZyb20gdGhlICJSdXNzaWFuIiBlbGVtZW50IGFuZCBjaGVjayBpdC4KCQkJVGlYbWxFbGVtZW50KiBlbGVtZW50ID0gZG9jSC5GaXJzdENoaWxkRWxlbWVudCggImRvY3VtZW50IiApLkZpcnN0Q2hpbGRFbGVtZW50KCAiUnVzc2lhbiIgKS5FbGVtZW50KCk7CgkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgY29ycmVjdFZhbHVlW10gPSB7CTB4ZDFVLCAweDg2VSwgMHhkMFUsIDB4YjVVLCAweGQwVSwgMHhiZFUsIDB4ZDBVLCAweGJkVSwgCgkJCQkJCQkJCQkJCQkweGQwVSwgMHhiZVUsIDB4ZDFVLCAweDgxVSwgMHhkMVUsIDB4ODJVLCAweGQxVSwgMHg4Y1UsIDAgfTsKCgkJCVhtbFRlc3QoICJVVEYtODogUnVzc2lhbiB2YWx1ZS4iLCAoY29uc3QgY2hhciopY29ycmVjdFZhbHVlLCBlbGVtZW50LT5BdHRyaWJ1dGUoICJ2YWx1ZSIgKSwgdHJ1ZSApOwoJCQlYbWxUZXN0KCAiVVRGLTg6IFJ1c3NpYW4gdmFsdWUgcm93LiIsIDQsIGVsZW1lbnQtPlJvdygpICk7CgkJCVhtbFRlc3QoICJVVEYtODogUnVzc2lhbiB2YWx1ZSBjb2x1bW4uIiwgNSwgZWxlbWVudC0+Q29sdW1uKCkgKTsKCgkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgcnVzc2lhbkVsZW1lbnROYW1lW10gPSB7CTB4ZDBVLCAweGEwVSwgMHhkMVUsIDB4ODNVLAoJCQkJCQkJCQkJCQkJCQkweGQxVSwgMHg4MVUsIDB4ZDFVLCAweDgxVSwKCQkJCQkJCQkJCQkJCQkJMHhkMFUsIDB4YmFVLCAweGQwVSwgMHhiOFUsCgkJCQkJCQkJCQkJCQkJCTB4ZDBVLCAweGI5VSwgMCB9OwoJCQljb25zdCBjaGFyIHJ1c3NpYW5UZXh0W10gPSAiPFx4RDBceEI4XHhEMFx4QkNceEQwXHhCNVx4RDBceEI1XHhEMVx4ODI+IjsKCgkJCVRpWG1sVGV4dCogdGV4dCA9IGRvY0guRmlyc3RDaGlsZEVsZW1lbnQoICJkb2N1bWVudCIgKS5GaXJzdENoaWxkRWxlbWVudCggKGNvbnN0IGNoYXIqKSBydXNzaWFuRWxlbWVudE5hbWUgKS5DaGlsZCggMCApLlRleHQoKTsKCQkJWG1sVGVzdCggIlVURi04OiBCcm93c2luZyBydXNzaWFuIGVsZW1lbnQgbmFtZS4iLAoJCQkJCSBydXNzaWFuVGV4dCwKCQkJCQkgdGV4dC0+VmFsdWUoKSwKCQkJCQkgdHJ1ZSApOwoJCQlYbWxUZXN0KCAiVVRGLTg6IFJ1c3NpYW4gZWxlbWVudCBuYW1lIHJvdy4iLCA3LCB0ZXh0LT5Sb3coKSApOwoJCQlYbWxUZXN0KCAiVVRGLTg6IFJ1c3NpYW4gZWxlbWVudCBuYW1lIGNvbHVtbi4iLCA0NywgdGV4dC0+Q29sdW1uKCkgKTsKCgkJCVRpWG1sRGVjbGFyYXRpb24qIGRlYyA9IGRvY0guQ2hpbGQoIDAgKS5Ob2RlKCktPlRvRGVjbGFyYXRpb24oKTsKCQkJWG1sVGVzdCggIlVURi04OiBEZWNsYXJhdGlvbiBjb2x1bW4uIiwgMSwgZGVjLT5Db2x1bW4oKSApOwoJCQlYbWxUZXN0KCAiVVRGLTg6IERvY3VtZW50IGNvbHVtbi4iLCAxLCBkb2MuQ29sdW1uKCkgKTsKCgkJCS8vIE5vdyB0cnkgZm9yIGEgcm91bmQgdHJpcC4KCQkJZG9jLlNhdmVGaWxlKCAidXRmOHRlc3RvdXQueG1sIiApOwoKCQkJLy8gQ2hlY2sgdGhlIHJvdW5kIHRyaXAuCgkJCWNoYXIgc2F2ZWRCdWZbMjU2XTsKCQkJY2hhciB2ZXJpZnlCdWZbMjU2XTsKCQkJaW50IG9rYXkgPSAxOwoKCQkJRklMRSogc2F2ZWQgID0gZm9wZW4oICJ1dGY4dGVzdG91dC54bWwiLCAiciIgKTsKCQkJRklMRSogdmVyaWZ5ID0gZm9wZW4oICJ1dGY4dGVzdHZlcmlmeS54bWwiLCAiciIgKTsKCgkJCS8vYm9vbCBmaXJzdExpbmVCT009dHJ1ZTsKCQkJaWYgKCBzYXZlZCAmJiB2ZXJpZnkgKQoJCQl7CgkJCQl3aGlsZSAoIGZnZXRzKCB2ZXJpZnlCdWYsIDI1NiwgdmVyaWZ5ICkgKQoJCQkJewoJCQkJCWZnZXRzKCBzYXZlZEJ1ZiwgMjU2LCBzYXZlZCApOwoJCQkJCU51bGxMaW5lRW5kaW5ncyggdmVyaWZ5QnVmICk7CgkJCQkJTnVsbExpbmVFbmRpbmdzKCBzYXZlZEJ1ZiApOwoKCQkJCQlpZiAoIC8qIWZpcnN0TGluZUJPTSAmJiAqLyBzdHJjbXAoIHZlcmlmeUJ1Ziwgc2F2ZWRCdWYgKSApCgkJCQkJewoJCQkJCQlwcmludGYoICJ2ZXJpZnk6JXM8XG4iLCB2ZXJpZnlCdWYgKTsKCQkJCQkJcHJpbnRmKCAic2F2ZWQgOiVzPFxuIiwgc2F2ZWRCdWYgKTsKCQkJCQkJb2theSA9IDA7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQkvL2ZpcnN0TGluZUJPTSA9IGZhbHNlOwoJCQkJfQoJCQl9CgkJCWlmICggc2F2ZWQgKQoJCQkJZmNsb3NlKCBzYXZlZCApOwoJCQlpZiAoIHZlcmlmeSApCgkJCQlmY2xvc2UoIHZlcmlmeSApOwoJCQlYbWxUZXN0KCAiVVRGLTg6IFZlcmlmaWVkIG11bHRpLWxhbmd1YWdlIHJvdW5kIHRyaXAuIiwgMSwgb2theSApOwoKCQkJLy8gT24gbW9zdCBXZXN0ZXJuIG1hY2hpbmVzLCB0aGlzIGlzIGFuIGVsZW1lbnQgdGhhdCBjb250YWlucwoJCQkvLyB0aGUgd29yZCAicmVzdW1lIiB3aXRoIHRoZSBjb3JyZWN0IGFjY2VudHMsIGluIGEgbGF0aW4gZW5jb2RpbmcuCgkJCS8vIEl0IHdpbGwgYmUgc29tZXRoaW5nIGVsc2UgY29tcGxldGVseSBvbiBub24td2VzdGVyIG1hY2hpbmVzLAoJCQkvLyB3aGljaCBpcyB3aHkgVGlueVhtbCBpcyBzd2l0Y2hpbmcgdG8gVVRGLTguCgkJCWNvbnN0IGNoYXIgbGF0aW5bXSA9ICI8ZWxlbWVudD5yXHg4MnN1bVx4ODI8L2VsZW1lbnQ+IjsKCgkJCVRpWG1sRG9jdW1lbnQgbGF0aW5Eb2M7CgkJCWxhdGluRG9jLlBhcnNlKCBsYXRpbiwgMCwgVElYTUxfRU5DT0RJTkdfTEVHQUNZICk7CgoJCQl0ZXh0ID0gbGF0aW5Eb2MuRmlyc3RDaGlsZEVsZW1lbnQoKS0+Rmlyc3RDaGlsZCgpLT5Ub1RleHQoKTsKCQkJWG1sVGVzdCggIkxlZ2FjeSBlbmNvZGluZzogVmVyaWZ5IHRleHQgZWxlbWVudC4iLCAiclx4ODJzdW1ceDgyIiwgdGV4dC0+VmFsdWUoKSApOwoJCX0KCX0JCQoKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vIENvcHkgYW5kIGFzc2lnbm1lbnQKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCXByaW50ZiAoIlxuKiogQ29weSBhbmQgQXNzaWdubWVudCAqKlxuIik7Cgl7CgkJVGlYbWxFbGVtZW50IGVsZW1lbnQoICJmb28iICk7CgkJZWxlbWVudC5QYXJzZSggIjxlbGVtZW50IG5hbWU9J3ZhbHVlJyAvPiIsIDAsIFRJWE1MX0VOQ09ESU5HX1VOS05PV04gKTsKCgkJVGlYbWxFbGVtZW50IGVsZW1lbnRDb3B5KCBlbGVtZW50ICk7CgkJVGlYbWxFbGVtZW50IGVsZW1lbnRBc3NpZ24oICJmb28iICk7CgkJZWxlbWVudEFzc2lnbi5QYXJzZSggIjxpbmNvcnJlY3QgZm9vPSdiYXInLz4iLCAwLCBUSVhNTF9FTkNPRElOR19VTktOT1dOICk7CgkJZWxlbWVudEFzc2lnbiA9IGVsZW1lbnQ7CgoJCVhtbFRlc3QoICJDb3B5L0Fzc2lnbjogZWxlbWVudCBjb3B5ICMxLiIsICJlbGVtZW50IiwgZWxlbWVudENvcHkuVmFsdWUoKSApOwoJCVhtbFRlc3QoICJDb3B5L0Fzc2lnbjogZWxlbWVudCBjb3B5ICMyLiIsICJ2YWx1ZSIsIGVsZW1lbnRDb3B5LkF0dHJpYnV0ZSggIm5hbWUiICkgKTsKCQlYbWxUZXN0KCAiQ29weS9Bc3NpZ246IGVsZW1lbnQgYXNzaWduICMxLiIsICJlbGVtZW50IiwgZWxlbWVudEFzc2lnbi5WYWx1ZSgpICk7CgkJWG1sVGVzdCggIkNvcHkvQXNzaWduOiBlbGVtZW50IGFzc2lnbiAjMi4iLCAidmFsdWUiLCBlbGVtZW50QXNzaWduLkF0dHJpYnV0ZSggIm5hbWUiICkgKTsKCQlYbWxUZXN0KCAiQ29weS9Bc3NpZ246IGVsZW1lbnQgYXNzaWduICMzLiIsIHRydWUsICggMCA9PSBlbGVtZW50QXNzaWduLkF0dHJpYnV0ZSggImZvbyIgKSkgKTsKCgkJVGlYbWxDb21tZW50IGNvbW1lbnQ7CgkJY29tbWVudC5QYXJzZSggIjwhLS1jb21tZW50LS0+IiwgMCwgVElYTUxfRU5DT0RJTkdfVU5LTk9XTiApOwoJCVRpWG1sQ29tbWVudCBjb21tZW50Q29weSggY29tbWVudCApOwoJCVRpWG1sQ29tbWVudCBjb21tZW50QXNzaWduOwoJCWNvbW1lbnRBc3NpZ24gPSBjb21tZW50Q29weTsKCQlYbWxUZXN0KCAiQ29weS9Bc3NpZ246IGNvbW1lbnQgY29weS4iLCAiY29tbWVudCIsIGNvbW1lbnRDb3B5LlZhbHVlKCkgKTsKCQlYbWxUZXN0KCAiQ29weS9Bc3NpZ246IGNvbW1lbnQgYXNzaWduLiIsICJjb21tZW50IiwgY29tbWVudEFzc2lnbi5WYWx1ZSgpICk7CgoJCVRpWG1sVW5rbm93biB1bmtub3duOwoJCXVua25vd24uUGFyc2UoICI8W3Vua25vd25dPiIsIDAsIFRJWE1MX0VOQ09ESU5HX1VOS05PV04gKTsKCQlUaVhtbFVua25vd24gdW5rbm93bkNvcHkoIHVua25vd24gKTsKCQlUaVhtbFVua25vd24gdW5rbm93bkFzc2lnbjsKCQl1bmtub3duQXNzaWduLlBhcnNlKCAiaW5jb3JyZWN0IiwgMCwgVElYTUxfRU5DT0RJTkdfVU5LTk9XTiApOwoJCXVua25vd25Bc3NpZ24gPSB1bmtub3duQ29weTsKCQlYbWxUZXN0KCAiQ29weS9Bc3NpZ246IHVua25vd24gY29weS4iLCAiW3Vua25vd25dIiwgdW5rbm93bkNvcHkuVmFsdWUoKSApOwoJCVhtbFRlc3QoICJDb3B5L0Fzc2lnbjogdW5rbm93biBhc3NpZ24uIiwgIlt1bmtub3duXSIsIHVua25vd25Bc3NpZ24uVmFsdWUoKSApOwoJCQoJCVRpWG1sVGV4dCB0ZXh0KCAiVGV4dE5vZGUiICk7CgkJVGlYbWxUZXh0IHRleHRDb3B5KCB0ZXh0ICk7CgkJVGlYbWxUZXh0IHRleHRBc3NpZ24oICJpbmNvcnJlY3QiICk7CgkJdGV4dEFzc2lnbiA9IHRleHQ7CgkJWG1sVGVzdCggIkNvcHkvQXNzaWduOiB0ZXh0IGNvcHkuIiwgIlRleHROb2RlIiwgdGV4dENvcHkuVmFsdWUoKSApOwoJCVhtbFRlc3QoICJDb3B5L0Fzc2lnbjogdGV4dCBhc3NpZ24uIiwgIlRleHROb2RlIiwgdGV4dEFzc2lnbi5WYWx1ZSgpICk7CgoJCVRpWG1sRGVjbGFyYXRpb24gZGVjOwoJCWRlYy5QYXJzZSggIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+IiwgMCwgVElYTUxfRU5DT0RJTkdfVU5LTk9XTiApOwoJCVRpWG1sRGVjbGFyYXRpb24gZGVjQ29weSggZGVjICk7CgkJVGlYbWxEZWNsYXJhdGlvbiBkZWNBc3NpZ247CgkJZGVjQXNzaWduID0gZGVjOwoKCQlYbWxUZXN0KCAiQ29weS9Bc3NpZ246IGRlY2xhcmF0aW9uIGNvcHkuIiwgIlVURi04IiwgZGVjQ29weS5FbmNvZGluZygpICk7CgkJWG1sVGVzdCggIkNvcHkvQXNzaWduOiB0ZXh0IGFzc2lnbi4iLCAiVVRGLTgiLCBkZWNBc3NpZ24uRW5jb2RpbmcoKSApOwoKCQlUaVhtbERvY3VtZW50IGRvYzsKCQllbGVtZW50Q29weS5JbnNlcnRFbmRDaGlsZCggdGV4dENvcHkgKTsKCQlkb2MuSW5zZXJ0RW5kQ2hpbGQoIGRlY0Fzc2lnbiApOwoJCWRvYy5JbnNlcnRFbmRDaGlsZCggZWxlbWVudENvcHkgKTsKCQlkb2MuSW5zZXJ0RW5kQ2hpbGQoIHVua25vd25Bc3NpZ24gKTsKCgkJVGlYbWxEb2N1bWVudCBkb2NDb3B5KCBkb2MgKTsKCQlUaVhtbERvY3VtZW50IGRvY0Fzc2lnbjsKCQlkb2NBc3NpZ24gPSBkb2NDb3B5OwoKCQkjaWZkZWYgVElYTUxfVVNFX1NUTAoJCXN0ZDo6c3RyaW5nIG9yaWdpbmFsLCBjb3B5LCBhc3NpZ247CgkJb3JpZ2luYWwgPDwgZG9jOwoJCWNvcHkgPDwgZG9jQ29weTsKCQlhc3NpZ24gPDwgZG9jQXNzaWduOwoJCVhtbFRlc3QoICJDb3B5L0Fzc2lnbjogZG9jdW1lbnQgY29weS4iLCBvcmlnaW5hbC5jX3N0cigpLCBjb3B5LmNfc3RyKCksIHRydWUgKTsKCQlYbWxUZXN0KCAiQ29weS9Bc3NpZ246IGRvY3VtZW50IGFzc2lnbi4iLCBvcmlnaW5hbC5jX3N0cigpLCBhc3NpZ24uY19zdHIoKSwgdHJ1ZSApOwoKCQkjZW5kaWYKCX0JCgoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiNpZmRlZiBUSVhNTF9VU0VfU1RMCglwcmludGYgKCJcbioqIFBhcnNpbmcsIG5vIENvbmRlbnNlIFdoaXRlc3BhY2UgKipcbiIpOwoJVGlYbWxCYXNlOjpTZXRDb25kZW5zZVdoaXRlU3BhY2UoIGZhbHNlICk7Cgl7CgkJaXN0cmluZ3N0cmVhbSBwYXJzZTEoICI8c3RhcnQ+VGhpcyAgaXMgICAgXG50ZXh0PC9zdGFydD4iICk7CgkJVGlYbWxFbGVtZW50IHRleHQxKCAidGV4dCIgKTsKCQlwYXJzZTEgPj4gdGV4dDE7CgoJCVhtbFRlc3QgKCAiQ29uZGVuc2Ugd2hpdGUgc3BhY2UgT0ZGLiIsICJUaGlzICBpcyAgICBcbnRleHQiLAoJCQkJCXRleHQxLkZpcnN0Q2hpbGQoKS0+VmFsdWUoKSwKCQkJCQl0cnVlICk7Cgl9CglUaVhtbEJhc2U6OlNldENvbmRlbnNlV2hpdGVTcGFjZSggdHJ1ZSApOwojZW5kaWYKCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vIEdldFRleHQoKTsKCXsKCQljb25zdCBjaGFyKiBzdHIgPSAiPGZvbz5UaGlzIGlzIHRleHQ8L2Zvbz4iOwoJCVRpWG1sRG9jdW1lbnQgZG9jOwoJCWRvYy5QYXJzZSggc3RyICk7CgkJY29uc3QgVGlYbWxFbGVtZW50KiBlbGVtZW50ID0gZG9jLlJvb3RFbGVtZW50KCk7CgoJCVhtbFRlc3QoICJHZXRUZXh0KCkgbm9ybWFsIHVzZS4iLCAiVGhpcyBpcyB0ZXh0IiwgZWxlbWVudC0+R2V0VGV4dCgpICk7CgoJCXN0ciA9ICI8Zm9vPjxiPlRoaXMgaXMgdGV4dDwvYj48L2Zvbz4iOwoJCWRvYy5DbGVhcigpOwoJCWRvYy5QYXJzZSggc3RyICk7CgkJZWxlbWVudCA9IGRvYy5Sb290RWxlbWVudCgpOwoKCQlYbWxUZXN0KCAiR2V0VGV4dCgpIGNvbnRhaW5lZCBlbGVtZW50LiIsIGVsZW1lbnQtPkdldFRleHQoKSA9PSAwLCB0cnVlICk7CgoJCXN0ciA9ICI8Zm9vPlRoaXMgaXMgPGI+dGV4dDwvYj48L2Zvbz4iOwoJCWRvYy5DbGVhcigpOwoJCVRpWG1sQmFzZTo6U2V0Q29uZGVuc2VXaGl0ZVNwYWNlKCBmYWxzZSApOwoJCWRvYy5QYXJzZSggc3RyICk7CgkJVGlYbWxCYXNlOjpTZXRDb25kZW5zZVdoaXRlU3BhY2UoIHRydWUgKTsKCQllbGVtZW50ID0gZG9jLlJvb3RFbGVtZW50KCk7CgoJCVhtbFRlc3QoICJHZXRUZXh0KCkgcGFydGlhbC4iLCAiVGhpcyBpcyAiLCBlbGVtZW50LT5HZXRUZXh0KCkgKTsKCX0KCgoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkvLyBDREFUQQoJewoJCWNvbnN0IGNoYXIqIHN0ciA9CSI8eG1sRWxlbWVudD4iCgkJCQkJCQkJIjwhW0NEQVRBWyIKCQkJCQkJCQkJIkkgYW0gPiB0aGUgcnVsZXMhXG4iCgkJCQkJCQkJCSIuLi5zaW5jZSBJIG1ha2Ugc3ltYm9saWMgcHVucyIKCQkJCQkJCQkiXV0+IgoJCQkJCQkJIjwveG1sRWxlbWVudD4iOwoJCVRpWG1sRG9jdW1lbnQgZG9jOwoJCWRvYy5QYXJzZSggc3RyICk7CgkJZG9jLlByaW50KCk7CgoJCVhtbFRlc3QoICJDREFUQSBwYXJzZS4iLCBkb2MuRmlyc3RDaGlsZEVsZW1lbnQoKS0+Rmlyc3RDaGlsZCgpLT5WYWx1ZSgpLCAKCQkJCQkJCQkgIkkgYW0gPiB0aGUgcnVsZXMhXG4uLi5zaW5jZSBJIG1ha2Ugc3ltYm9saWMgcHVucyIsCgkJCQkJCQkJIHRydWUgKTsKCgkJI2lmZGVmIFRJWE1MX1VTRV9TVEwKCQkvL2NvdXQgPDwgZG9jIDw8ICdcbic7CgoJCWRvYy5DbGVhcigpOwoKCQlpc3RyaW5nc3RyZWFtIHBhcnNlMCggc3RyICk7CgkJcGFyc2UwID4+IGRvYzsKCQkvL2NvdXQgPDwgZG9jIDw8ICdcbic7CgoJCVhtbFRlc3QoICJDREFUQSBzdHJlYW0uIiwgZG9jLkZpcnN0Q2hpbGRFbGVtZW50KCktPkZpcnN0Q2hpbGQoKS0+VmFsdWUoKSwgCgkJCQkJCQkJICJJIGFtID4gdGhlIHJ1bGVzIVxuLi4uc2luY2UgSSBtYWtlIHN5bWJvbGljIHB1bnMiLAoJCQkJCQkJCSB0cnVlICk7CgkJI2VuZGlmCgoJCVRpWG1sRG9jdW1lbnQgZG9jMSA9IGRvYzsKCQkvL2RvYy5QcmludCgpOwoKCQlYbWxUZXN0KCAiQ0RBVEEgY29weS4iLCBkb2MxLkZpcnN0Q2hpbGRFbGVtZW50KCktPkZpcnN0Q2hpbGQoKS0+VmFsdWUoKSwgCgkJCQkJCQkJICJJIGFtID4gdGhlIHJ1bGVzIVxuLi4uc2luY2UgSSBtYWtlIHN5bWJvbGljIHB1bnMiLAoJCQkJCQkJCSB0cnVlICk7Cgl9Cgl7CgkJLy8gWyAxNDgyNzI4IF0gV3Jvbmcgd2lkZSBjaGFyIHBhcnNpbmcKCQljaGFyIGJ1ZlsyNTZdOwoJCWJ1ZlsyNTVdID0gMDsKCQlmb3IoIGludCBpPTA7IGk8MjU1OyArK2kgKSB7CgkJCWJ1ZltpXSA9IChjaGFyKSgoaT49MzIpID8gaSA6IDMyKTsKCQl9CgkJVElYTUxfU1RSSU5HIHN0ciggIjx4bWxFbGVtZW50PjwhW0NEQVRBWyIgKTsKCQlzdHIgKz0gYnVmOwoJCXN0ciArPSAiXV0+PC94bWxFbGVtZW50PiI7CgoJCVRpWG1sRG9jdW1lbnQgZG9jOwoJCWRvYy5QYXJzZSggc3RyLmNfc3RyKCkgKTsKCgkJVGlYbWxQcmludGVyIHByaW50ZXI7CgkJcHJpbnRlci5TZXRTdHJlYW1QcmludGluZygpOwoJCWRvYy5BY2NlcHQoICZwcmludGVyICk7CgoJCVhtbFRlc3QoICJDREFUQSB3aXRoIGFsbCBieXRlcyAjMS4iLCBzdHIuY19zdHIoKSwgcHJpbnRlci5DU3RyKCksIHRydWUgKTsKCgkJI2lmZGVmIFRJWE1MX1VTRV9TVEwKCQlkb2MuQ2xlYXIoKTsKCQlpc3RyaW5nc3RyZWFtIGlzcyggcHJpbnRlci5TdHIoKSApOwoJCWlzcyA+PiBkb2M7CgkJc3RkOjpzdHJpbmcgb3V0OwoJCW91dCA8PCBkb2M7CgkJWG1sVGVzdCggIkNEQVRBIHdpdGggYWxsIGJ5dGVzICMyLiIsIG91dC5jX3N0cigpLCBwcmludGVyLkNTdHIoKSwgdHJ1ZSApOwoJCSNlbmRpZgoJfQoJewoJCS8vIFsgMTQ4MDEwNyBdIEJ1Zy1maXggZm9yIFNUTC1zdHJlYW1pbmcgb2YgQ0RBVEEgdGhhdCBjb250YWlucyB0YWdzCgkJLy8gQ0RBVEEgc3RyZWFtaW5nIGhhZCBhIGNvdXBsZSBvZiBidWdzLCB0aGF0IHRoaXMgdGVzdHMgZm9yLgoJCWNvbnN0IGNoYXIqIHN0ciA9CSI8eG1sRWxlbWVudD4iCgkJCQkJCQkJIjwhW0NEQVRBWyIKCQkJCQkJCQkJIjxiPkkgYW0gPiB0aGUgcnVsZXMhPC9iPlxuIgoJCQkJCQkJCQkiLi4uc2luY2UgSSBtYWtlIHN5bWJvbGljIHB1bnMiCgkJCQkJCQkJIl1dPiIKCQkJCQkJCSI8L3htbEVsZW1lbnQ+IjsKCQlUaVhtbERvY3VtZW50IGRvYzsKCQlkb2MuUGFyc2UoIHN0ciApOwoJCWRvYy5QcmludCgpOwoKCQlYbWxUZXN0KCAiQ0RBVEEgcGFyc2UuIFsgMTQ4MDEwNyBdIiwgZG9jLkZpcnN0Q2hpbGRFbGVtZW50KCktPkZpcnN0Q2hpbGQoKS0+VmFsdWUoKSwgCgkJCQkJCQkJICI8Yj5JIGFtID4gdGhlIHJ1bGVzITwvYj5cbi4uLnNpbmNlIEkgbWFrZSBzeW1ib2xpYyBwdW5zIiwKCQkJCQkJCQkgdHJ1ZSApOwoKCQkjaWZkZWYgVElYTUxfVVNFX1NUTAoKCQlkb2MuQ2xlYXIoKTsKCgkJaXN0cmluZ3N0cmVhbSBwYXJzZTAoIHN0ciApOwoJCXBhcnNlMCA+PiBkb2M7CgoJCVhtbFRlc3QoICJDREFUQSBzdHJlYW0uIFsgMTQ4MDEwNyBdIiwgZG9jLkZpcnN0Q2hpbGRFbGVtZW50KCktPkZpcnN0Q2hpbGQoKS0+VmFsdWUoKSwgCgkJCQkJCQkJICI8Yj5JIGFtID4gdGhlIHJ1bGVzITwvYj5cbi4uLnNpbmNlIEkgbWFrZSBzeW1ib2xpYyBwdW5zIiwKCQkJCQkJCQkgdHJ1ZSApOwoJCSNlbmRpZgoKCQlUaVhtbERvY3VtZW50IGRvYzEgPSBkb2M7CgkJLy9kb2MuUHJpbnQoKTsKCgkJWG1sVGVzdCggIkNEQVRBIGNvcHkuIFsgMTQ4MDEwNyBdIiwgZG9jMS5GaXJzdENoaWxkRWxlbWVudCgpLT5GaXJzdENoaWxkKCktPlZhbHVlKCksIAoJCQkJCQkJCSAiPGI+SSBhbSA+IHRoZSBydWxlcyE8L2I+XG4uLi5zaW5jZSBJIG1ha2Ugc3ltYm9saWMgcHVucyIsCgkJCQkJCQkJIHRydWUgKTsKCX0KCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy8gVmlzaXQoKQoKCgoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCglwcmludGYoICJcbioqIEZ1enppbmcuLi4gKipcbiIgKTsKCgljb25zdCBpbnQgRlVaWl9JVEVSQVRJT04gPSAzMDA7CgoJLy8gVGhlIG9ubHkgZ29hbCBpcyBub3QgdG8gY3Jhc2ggb24gYmFkIGlucHV0LgoJaW50IGxlbiA9IChpbnQpIHN0cmxlbiggZGVtb1N0YXJ0ICk7Cglmb3IoIGludCBpPTA7IGk8RlVaWl9JVEVSQVRJT047ICsraSApIAoJewoJCWNoYXIqIGRlbW9Db3B5ID0gbmV3IGNoYXJbIGxlbisxIF07CgkJc3RyY3B5KCBkZW1vQ29weSwgZGVtb1N0YXJ0ICk7CgoJCWRlbW9Db3B5WyBpJWxlbiBdID0gKGNoYXIpKChpKzEpKjMpOwoJCWRlbW9Db3B5WyAoaSo3KSVsZW4gXSA9ICc+JzsKCQlkZW1vQ29weVsgKGkqMTEpJWxlbiBdID0gJzwnOwoKCQlUaVhtbERvY3VtZW50IHhtbDsKCQl4bWwuUGFyc2UoIGRlbW9Db3B5ICk7CgoJCWRlbGV0ZSBbXSBkZW1vQ29weTsKCX0KCXByaW50ZiggIioqIEZ1enppbmcgQ29tcGxldGUuICoqXG4iICk7CgkKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJcHJpbnRmICgiXG4qKiBCdWcgcmVncmVzc2lvbiB0ZXN0cyAqKlxuIik7CgoJLy8gSW5zZXJ0QmVmb3JlQ2hpbGQgYW5kIEluc2VydEFmdGVyQ2hpbGQgY2F1c2VzIGNyYXNoLgoJewoJCVRpWG1sRWxlbWVudCBwYXJlbnQoICJQYXJlbnQiICk7CgkJVGlYbWxFbGVtZW50IGNoaWxkVGV4dDAoICJjaGlsZFRleHQwIiApOwoJCVRpWG1sRWxlbWVudCBjaGlsZFRleHQxKCAiY2hpbGRUZXh0MSIgKTsKCQlUaVhtbE5vZGUqIGNoaWxkTm9kZTAgPSBwYXJlbnQuSW5zZXJ0RW5kQ2hpbGQoIGNoaWxkVGV4dDAgKTsKCQlUaVhtbE5vZGUqIGNoaWxkTm9kZTEgPSBwYXJlbnQuSW5zZXJ0QmVmb3JlQ2hpbGQoIGNoaWxkTm9kZTAsIGNoaWxkVGV4dDEgKTsKCgkJWG1sVGVzdCggIlRlc3QgSW5zZXJ0QmVmb3JlQ2hpbGQgb24gZW1wdHkgbm9kZS4iLCAoIGNoaWxkTm9kZTEgPT0gcGFyZW50LkZpcnN0Q2hpbGQoKSApLCB0cnVlICk7Cgl9CgoJewoJCS8vIEluc2VydEJlZm9yZUNoaWxkIGFuZCBJbnNlcnRBZnRlckNoaWxkIGNhdXNlcyBjcmFzaC4KCQlUaVhtbEVsZW1lbnQgcGFyZW50KCAiUGFyZW50IiApOwoJCVRpWG1sRWxlbWVudCBjaGlsZFRleHQwKCAiY2hpbGRUZXh0MCIgKTsKCQlUaVhtbEVsZW1lbnQgY2hpbGRUZXh0MSggImNoaWxkVGV4dDEiICk7CgkJVGlYbWxOb2RlKiBjaGlsZE5vZGUwID0gcGFyZW50Lkluc2VydEVuZENoaWxkKCBjaGlsZFRleHQwICk7CgkJVGlYbWxOb2RlKiBjaGlsZE5vZGUxID0gcGFyZW50Lkluc2VydEFmdGVyQ2hpbGQoIGNoaWxkTm9kZTAsIGNoaWxkVGV4dDEgKTsKCgkJWG1sVGVzdCggIlRlc3QgSW5zZXJ0QWZ0ZXJDaGlsZCBvbiBlbXB0eSBub2RlLiAiLCAoIGNoaWxkTm9kZTEgPT0gcGFyZW50Lkxhc3RDaGlsZCgpICksIHRydWUgKTsKCX0KCgkvLyBSZXBvcnRzIG9mIG1pc3NpbmcgY29uc3RydWN0b3JzLCBpcnJlZ3VsYXIgc3RyaW5nIHByb2JsZW1zLgoJewoJCS8vIE1pc3NpbmcgY29uc3RydWN0b3IgaW1wbGVtZW50YXRpb24uIE5vIHRlc3QgLS0ganVzdCBjb21waWxlcy4KCQlUaVhtbFRleHQgdGV4dCggIk1pc3NpbmciICk7CgoJCSNpZmRlZiBUSVhNTF9VU0VfU1RMCgkJCS8vIE1pc3NpbmcgaW1wbGVtZW50YXRpb246CgkJCVRpWG1sRG9jdW1lbnQgZG9jOwoJCQlzdHJpbmcgbmFtZSA9ICJtaXNzaW5nIjsKCQkJZG9jLkxvYWRGaWxlKCBuYW1lICk7CgoJCQlUaVhtbFRleHQgdGV4dFNUTCggbmFtZSApOwoJCSNlbHNlCgkJCS8vIHZlcmlmeWluZyBzb21lIGJhc2ljIHN0cmluZyBmdW5jdGlvbnM6CgkJCVRpWG1sU3RyaW5nIGE7CgkJCVRpWG1sU3RyaW5nIGIoICJIZWxsbyIgKTsKCQkJVGlYbWxTdHJpbmcgYyggIm9vZ2EiICk7CgoJCQljID0gIiBXb3JsZCEiOwoJCQlhID0gYjsKCQkJYSArPSBjOwoJCQlhID0gYTsKCgkJCVhtbFRlc3QoICJCYXNpYyBUaVhtbFN0cmluZyB0ZXN0LiAiLCAiSGVsbG8gV29ybGQhIiwgYS5jX3N0cigpICk7CgkJI2VuZGlmCiAJfQoKCS8vIExvbmcgZmlsZW5hbWVzIGNyYXNoaW5nIFNUTCB2ZXJzaW9uCgl7CgkJVGlYbWxEb2N1bWVudCBkb2MoICJtaWRzdW1tZXJOaWdodHNEcmVhbVdpdGhBVmVyeUxvbmdGaWxlbmFtZVRvQ29uZnVzZVRoZVN0cmluZ0hhbmRsaW5nUm91dGluZXMueG1sIiApOwoJCWJvb2wgbG9hZE9rYXkgPSBkb2MuTG9hZEZpbGUoKTsKCQlsb2FkT2theSA9IHRydWU7CS8vIGdldCByaWQgb2YgY29tcGlsZXIgd2FybmluZy4KCQkvLyBXb24ndCBwYXNzIG9uIG5vbi1kZXYgc3lzdGVtcy4gSnVzdCBhICJubyBjcmFzaCIgY2hlY2suCgkJLy9YbWxUZXN0KCAiTG9uZyBmaWxlbmFtZS4gIiwgdHJ1ZSwgbG9hZE9rYXkgKTsKCX0KCgl7CgkJLy8gRW50aXRpZXMgbm90IGJlaW5nIHdyaXR0ZW4gY29ycmVjdGx5LgoJCS8vIEZyb20gTHlubiBBbGxlbgoKCQljb25zdCBjaGFyKiBwYXNzYWdlcyA9CgkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgc3RhbmRhbG9uZT1cIm5vXCIgPz4iCgkJCSI8cGFzc2FnZXMgY291bnQ9XCIwMDZcIiBmb3JtYXR2ZXJzaW9uPVwiMjAwMjA2MjBcIj4iCgkJCQkiPHBzZyBjb250ZXh0PVwiTGluZSA1IGhhcyAmcXVvdDtxdW90YXRpb24gbWFya3MmcXVvdDsgYW5kICZhcG9zO2Fwb3N0cm9waGUgbWFya3MmYXBvczsuIgoJCQkJIiBJdCBhbHNvIGhhcyAmbHQ7LCAmZ3Q7LCBhbmQgJmFtcDssIGFzIHdlbGwgYXMgYSBmYWtlIGNvcHlyaWdodCAmI3hBOTsuXCI+IDwvcHNnPiIKCQkJIjwvcGFzc2FnZXM+IjsKCgkJVGlYbWxEb2N1bWVudCBkb2MoICJwYXNzYWdlcy54bWwiICk7CgkJZG9jLlBhcnNlKCBwYXNzYWdlcyApOwoJCVRpWG1sRWxlbWVudCogcHNnID0gZG9jLlJvb3RFbGVtZW50KCktPkZpcnN0Q2hpbGRFbGVtZW50KCk7CgkJY29uc3QgY2hhciogY29udGV4dCA9IHBzZy0+QXR0cmlidXRlKCAiY29udGV4dCIgKTsKCQljb25zdCBjaGFyKiBleHBlY3RlZCA9ICJMaW5lIDUgaGFzIFwicXVvdGF0aW9uIG1hcmtzXCIgYW5kICdhcG9zdHJvcGhlIG1hcmtzJy4gSXQgYWxzbyBoYXMgPCwgPiwgYW5kICYsIGFzIHdlbGwgYXMgYSBmYWtlIGNvcHlyaWdodCBceEMyXHhBOS4iOwoKCQlYbWxUZXN0KCAiRW50aXR5IHRyYW5zZm9ybWF0aW9uOiByZWFkLiAiLCBleHBlY3RlZCwgY29udGV4dCwgdHJ1ZSApOwoKCQlGSUxFKiB0ZXh0ZmlsZSA9IGZvcGVuKCAidGV4dGZpbGUudHh0IiwgInciICk7CgkJaWYgKCB0ZXh0ZmlsZSApCgkJewoJCQlwc2ctPlByaW50KCB0ZXh0ZmlsZSwgMCApOwoJCQlmY2xvc2UoIHRleHRmaWxlICk7CgkJfQoJCXRleHRmaWxlID0gZm9wZW4oICJ0ZXh0ZmlsZS50eHQiLCAiciIgKTsKCQlhc3NlcnQoIHRleHRmaWxlICk7CgkJaWYgKCB0ZXh0ZmlsZSApCgkJewoJCQljaGFyIGJ1ZlsgMTAyNCBdOwoJCQlmZ2V0cyggYnVmLCAxMDI0LCB0ZXh0ZmlsZSApOwoJCQlYbWxUZXN0KCAiRW50aXR5IHRyYW5zZm9ybWF0aW9uOiB3cml0ZS4gIiwKCQkJCQkgIjxwc2cgY29udGV4dD1cJ0xpbmUgNSBoYXMgJnF1b3Q7cXVvdGF0aW9uIG1hcmtzJnF1b3Q7IGFuZCAmYXBvczthcG9zdHJvcGhlIG1hcmtzJmFwb3M7LiIKCQkJCQkgIiBJdCBhbHNvIGhhcyAmbHQ7LCAmZ3Q7LCBhbmQgJmFtcDssIGFzIHdlbGwgYXMgYSBmYWtlIGNvcHlyaWdodCBceEMyXHhBOS4nIC8+IiwKCQkJCQkgYnVmLAoJCQkJCSB0cnVlICk7CgkJfQoJCWZjbG9zZSggdGV4dGZpbGUgKTsKCX0KCiAgICB7CgkJRklMRSogdGV4dGZpbGUgPSBmb3BlbiggInRlc3Q1LnhtbCIsICJ3IiApOwoJCWlmICggdGV4dGZpbGUgKQoJCXsKICAgICAgICAgICAgZnB1dHMoIjw/eG1sIHZlcnNpb249JzEuMCc/PjxhLmVsZW0geG1pLnZlcnNpb249JzIuMCcvPiIsIHRleHRmaWxlKTsKICAgICAgICAgICAgZmNsb3NlKHRleHRmaWxlKTsKCgkJCVRpWG1sRG9jdW1lbnQgZG9jOwogICAgICAgICAgICBkb2MuTG9hZEZpbGUoICJ0ZXN0NS54bWwiICk7CiAgICAgICAgICAgIFhtbFRlc3QoICJkb3QgaW4gZWxlbWVudCBhdHRyaWJ1dGVzIGFuZCBuYW1lcyIsIGRvYy5FcnJvcigpLCAwKTsKCQl9CiAgICB9CgoJewoJCUZJTEUqIHRleHRmaWxlID0gZm9wZW4oICJ0ZXN0Ni54bWwiLCAidyIgKTsKCQlpZiAoIHRleHRmaWxlICkKCQl7CiAgICAgICAgICAgIGZwdXRzKCI8ZWxlbWVudD48TmFtZT4xLjEgU3RhcnQgZWFzeSBpZ25vcmUgZmluIHRoaWNrbmVzcyYjeEE7PC9OYW1lPjwvZWxlbWVudD4iLCB0ZXh0ZmlsZSApOwogICAgICAgICAgICBmY2xvc2UodGV4dGZpbGUpOwoKICAgICAgICAgICAgVGlYbWxEb2N1bWVudCBkb2M7CiAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gZG9jLkxvYWRGaWxlKCAidGVzdDYueG1sIiApOwogICAgICAgICAgICBYbWxUZXN0KCAiRW50aXR5IHdpdGggb25lIGRpZ2l0LiIsIHJlc3VsdCwgdHJ1ZSApOwoKCQkJVGlYbWxUZXh0KiB0ZXh0ID0gZG9jLkZpcnN0Q2hpbGRFbGVtZW50KCktPkZpcnN0Q2hpbGRFbGVtZW50KCktPkZpcnN0Q2hpbGQoKS0+VG9UZXh0KCk7CgkJCVhtbFRlc3QoICJFbnRpdHkgd2l0aCBvbmUgZGlnaXQuIiwKCQkJCQkJdGV4dC0+VmFsdWUoKSwgIjEuMSBTdGFydCBlYXN5IGlnbm9yZSBmaW4gdGhpY2tuZXNzXG4iICk7CgkJfQogICAgfQoKCXsKCQkvLyBET0NUWVBFIG5vdCBwcmVzZXJ2ZWQgKDk1MDE3MSkKCQkvLyAKCQljb25zdCBjaGFyKiBkb2N0eXBlID0KCQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiA/PiIKCQkJIjwhRE9DVFlQRSBQTEFZIFNZU1RFTSAncGxheS5kdGQnPiIKCQkJIjwhRUxFTUVOVCB0aXRsZSAoI1BDREFUQSk+IgoJCQkiPCFFTEVNRU5UIGJvb2tzICh0aXRsZSxhdXRob3JzKT4iCgkJCSI8ZWxlbWVudCAvPiI7CgoJCVRpWG1sRG9jdW1lbnQgZG9jOwoJCWRvYy5QYXJzZSggZG9jdHlwZSApOwoJCWRvYy5TYXZlRmlsZSggInRlc3Q3LnhtbCIgKTsKCQlkb2MuQ2xlYXIoKTsKCQlkb2MuTG9hZEZpbGUoICJ0ZXN0Ny54bWwiICk7CgkJCgkJVGlYbWxIYW5kbGUgZG9jSCggJmRvYyApOwoJCVRpWG1sVW5rbm93biogdW5rbm93biA9IGRvY0guQ2hpbGQoIDEgKS5Vbmtub3duKCk7CgkJWG1sVGVzdCggIkNvcnJlY3QgdmFsdWUgb2YgdW5rbm93bi4iLCAiIURPQ1RZUEUgUExBWSBTWVNURU0gJ3BsYXkuZHRkJyIsIHVua25vd24tPlZhbHVlKCkgKTsKCQkjaWZkZWYgVElYTUxfVVNFX1NUTAoJCVRpWG1sTm9kZSogbm9kZSA9IGRvY0guQ2hpbGQoIDIgKS5Ob2RlKCk7CgkJc3RkOjpzdHJpbmcgc3RyOwoJCXN0ciA8PCAoKm5vZGUpOwoJCVhtbFRlc3QoICJDb3JyZWN0IHN0cmVhbWluZyBvZiB1bmtub3duLiIsICI8IUVMRU1FTlQgdGl0bGUgKCNQQ0RBVEEpPiIsIHN0ci5jX3N0cigpICk7CgkJI2VuZGlmCgl9CgoJewoJCS8vIFsgNzkxNDExIF0gRm9ybWF0dGluZyBidWcKCQkvLyBDb21tZW50cyBkbyBub3Qgc3RyZWFtIG91dCBjb3JyZWN0bHkuCgkJY29uc3QgY2hhciogZG9jdHlwZSA9IAoJCQkiPCEtLSBTb21ld2hhdDxldmlsPiAtLT4iOwoJCVRpWG1sRG9jdW1lbnQgZG9jOwoJCWRvYy5QYXJzZSggZG9jdHlwZSApOwoKCQlUaVhtbEhhbmRsZSBkb2NIKCAmZG9jICk7CgkJVGlYbWxDb21tZW50KiBjb21tZW50ID0gZG9jSC5DaGlsZCggMCApLk5vZGUoKS0+VG9Db21tZW50KCk7CgoJCVhtbFRlc3QoICJDb21tZW50IGZvcm1hdHRpbmcuIiwgIiBTb21ld2hhdDxldmlsPiAiLCBjb21tZW50LT5WYWx1ZSgpICk7CgkJI2lmZGVmIFRJWE1MX1VTRV9TVEwKCQlzdGQ6OnN0cmluZyBzdHI7CgkJc3RyIDw8ICgqY29tbWVudCk7CgkJWG1sVGVzdCggIkNvbW1lbnQgc3RyZWFtaW5nLiIsICI8IS0tIFNvbWV3aGF0PGV2aWw+IC0tPiIsIHN0ci5jX3N0cigpICk7CgkJI2VuZGlmCgl9CgoJewoJCS8vIFsgODcwNTAyIF0gV2hpdGUgc3BhY2UgaXNzdWVzCgkJVGlYbWxEb2N1bWVudCBkb2M7CgkJVGlYbWxUZXh0KiB0ZXh0OwoJCVRpWG1sSGFuZGxlIGRvY0goICZkb2MgKTsKCQoJCWNvbnN0IGNoYXIqIGRvY3R5cGUwID0gIjxlbGVtZW50PiBUaGlzIGhhcyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZSA8L2VsZW1lbnQ+IjsKCQljb25zdCBjaGFyKiBkb2N0eXBlMSA9ICI8ZWxlbWVudD5UaGlzIGhhcyAgaW50ZXJuYWwgc3BhY2U8L2VsZW1lbnQ+IjsKCQljb25zdCBjaGFyKiBkb2N0eXBlMiA9ICI8ZWxlbWVudD4gVGhpcyBoYXMgbGVhZGluZywgdHJhaWxpbmcsIGFuZCAgaW50ZXJuYWwgc3BhY2UgPC9lbGVtZW50PiI7CgoJCVRpWG1sQmFzZTo6U2V0Q29uZGVuc2VXaGl0ZVNwYWNlKCBmYWxzZSApOwoJCWRvYy5DbGVhcigpOwoJCWRvYy5QYXJzZSggZG9jdHlwZTAgKTsKCQl0ZXh0ID0gZG9jSC5GaXJzdENoaWxkRWxlbWVudCggImVsZW1lbnQiICkuQ2hpbGQoIDAgKS5UZXh0KCk7CgkJWG1sVGVzdCggIldoaXRlIHNwYWNlIGtlcHQuIiwgIiBUaGlzIGhhcyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZSAiLCB0ZXh0LT5WYWx1ZSgpICk7CgoJCWRvYy5DbGVhcigpOwoJCWRvYy5QYXJzZSggZG9jdHlwZTEgKTsKCQl0ZXh0ID0gZG9jSC5GaXJzdENoaWxkRWxlbWVudCggImVsZW1lbnQiICkuQ2hpbGQoIDAgKS5UZXh0KCk7CgkJWG1sVGVzdCggIldoaXRlIHNwYWNlIGtlcHQuIiwgIlRoaXMgaGFzICBpbnRlcm5hbCBzcGFjZSIsIHRleHQtPlZhbHVlKCkgKTsKCgkJZG9jLkNsZWFyKCk7CgkJZG9jLlBhcnNlKCBkb2N0eXBlMiApOwoJCXRleHQgPSBkb2NILkZpcnN0Q2hpbGRFbGVtZW50KCAiZWxlbWVudCIgKS5DaGlsZCggMCApLlRleHQoKTsKCQlYbWxUZXN0KCAiV2hpdGUgc3BhY2Uga2VwdC4iLCAiIFRoaXMgaGFzIGxlYWRpbmcsIHRyYWlsaW5nLCBhbmQgIGludGVybmFsIHNwYWNlICIsIHRleHQtPlZhbHVlKCkgKTsKCgkJVGlYbWxCYXNlOjpTZXRDb25kZW5zZVdoaXRlU3BhY2UoIHRydWUgKTsKCQlkb2MuQ2xlYXIoKTsKCQlkb2MuUGFyc2UoIGRvY3R5cGUwICk7CgkJdGV4dCA9IGRvY0guRmlyc3RDaGlsZEVsZW1lbnQoICJlbGVtZW50IiApLkNoaWxkKCAwICkuVGV4dCgpOwoJCVhtbFRlc3QoICJXaGl0ZSBzcGFjZSBjb25kZW5zZWQuIiwgIlRoaXMgaGFzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIiwgdGV4dC0+VmFsdWUoKSApOwoKCQlkb2MuQ2xlYXIoKTsKCQlkb2MuUGFyc2UoIGRvY3R5cGUxICk7CgkJdGV4dCA9IGRvY0guRmlyc3RDaGlsZEVsZW1lbnQoICJlbGVtZW50IiApLkNoaWxkKCAwICkuVGV4dCgpOwoJCVhtbFRlc3QoICJXaGl0ZSBzcGFjZSBjb25kZW5zZWQuIiwgIlRoaXMgaGFzIGludGVybmFsIHNwYWNlIiwgdGV4dC0+VmFsdWUoKSApOwoKCQlkb2MuQ2xlYXIoKTsKCQlkb2MuUGFyc2UoIGRvY3R5cGUyICk7CgkJdGV4dCA9IGRvY0guRmlyc3RDaGlsZEVsZW1lbnQoICJlbGVtZW50IiApLkNoaWxkKCAwICkuVGV4dCgpOwoJCVhtbFRlc3QoICJXaGl0ZSBzcGFjZSBjb25kZW5zZWQuIiwgIlRoaXMgaGFzIGxlYWRpbmcsIHRyYWlsaW5nLCBhbmQgaW50ZXJuYWwgc3BhY2UiLCB0ZXh0LT5WYWx1ZSgpICk7Cgl9CgoJewoJCS8vIERvdWJsZSBhdHRyaWJ1dGVzCgkJY29uc3QgY2hhciogZG9jdHlwZSA9ICI8ZWxlbWVudCBhdHRyPSdyZWQnIGF0dHI9J2JsdWUnIC8+IjsKCgkJVGlYbWxEb2N1bWVudCBkb2M7CgkJZG9jLlBhcnNlKCBkb2N0eXBlICk7CgkJCgkJWG1sVGVzdCggIlBhcnNpbmcgcmVwZWF0ZWQgYXR0cmlidXRlcy4iLCB0cnVlLCBkb2MuRXJyb3IoKSApOwkvLyBpcyBhbiAgZXJyb3IgdG8gdGlueXhtbCAoZGlkbid0IHVzZSB0byBiZSwgYnV0IGNhdXNlZCBpc3N1ZXMpCgkJLy9YbWxUZXN0KCAiUGFyc2luZyByZXBlYXRlZCBhdHRyaWJ1dGVzLiIsICJibHVlIiwgZG9jLkZpcnN0Q2hpbGRFbGVtZW50KCAiZWxlbWVudCIgKS0+QXR0cmlidXRlKCAiYXR0ciIgKSApOwoJfQoKCXsKCQkvLyBFbWJlZGRlZCBudWxsIGluIHN0cmVhbS4KCQljb25zdCBjaGFyKiBkb2N0eXBlID0gIjxlbGVtZW50IGF0dFwwcj0ncmVkJyBhdHRyPSdibHVlJyAvPiI7CgoJCVRpWG1sRG9jdW1lbnQgZG9jOwoJCWRvYy5QYXJzZSggZG9jdHlwZSApOwoJCVhtbFRlc3QoICJFbWJlZGRlZCBudWxsIHRocm93cyBlcnJvci4iLCB0cnVlLCBkb2MuRXJyb3IoKSApOwoKCQkjaWZkZWYgVElYTUxfVVNFX1NUTAoJCWlzdHJpbmdzdHJlYW0gc3RybSggZG9jdHlwZSApOwoJCWRvYy5DbGVhcigpOwoJCWRvYy5DbGVhckVycm9yKCk7CgkJc3RybSA+PiBkb2M7CgkJWG1sVGVzdCggIkVtYmVkZGVkIG51bGwgdGhyb3dzIGVycm9yLiIsIHRydWUsIGRvYy5FcnJvcigpICk7CgkJI2VuZGlmCgl9CgogICAgewogICAgICAgICAgICAvLyBMZWdhY3kgbW9kZSB0ZXN0LiAoVGhpcyB0ZXN0IG1heSBvbmx5IHBhc3Mgb24gYSB3ZXN0ZXJuIHN5c3RlbSkKICAgICAgICAgICAgY29uc3QgY2hhciogc3RyID0KICAgICAgICAgICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIklTTy04ODU5LTFcIj8+IgogICAgICAgICAgICAgICAgICAgICAgICAiPOQ+IgogICAgICAgICAgICAgICAgICAgICAgICAiQ/ZudORudN/k9vzE1twiCiAgICAgICAgICAgICAgICAgICAgICAgICI8L+Q+IjsKCiAgICAgICAgICAgIFRpWG1sRG9jdW1lbnQgZG9jOwogICAgICAgICAgICBkb2MuUGFyc2UoIHN0ciApOwoKICAgICAgICAgICAgVGlYbWxIYW5kbGUgZG9jSGFuZGxlKCAmZG9jICk7CiAgICAgICAgICAgIFRpWG1sSGFuZGxlIGFIYW5kbGUgPSBkb2NIYW5kbGUuRmlyc3RDaGlsZEVsZW1lbnQoICLkIiApOwogICAgICAgICAgICBUaVhtbEhhbmRsZSB0SGFuZGxlID0gYUhhbmRsZS5DaGlsZCggMCApOwogICAgICAgICAgICBhc3NlcnQoIGFIYW5kbGUuRWxlbWVudCgpICk7CiAgICAgICAgICAgIGFzc2VydCggdEhhbmRsZS5UZXh0KCkgKTsKICAgICAgICAgICAgWG1sVGVzdCggIklTTy04ODU5LTEgUGFyc2luZy4iLCAiQ/ZudORudN/k9vzE1twiLCB0SGFuZGxlLlRleHQoKS0+VmFsdWUoKSApOwogICAgfQoKCXsKCQkvLyBFbXB0eSBkb2N1bWVudHMgc2hvdWxkIHJldHVybiBUSVhNTF9FUlJPUl9QQVJTSU5HX0VNUFRZLCBidWcgMTA3MDcxNwoJCWNvbnN0IGNoYXIqIHN0ciA9ICIgICAgIjsKCQlUaVhtbERvY3VtZW50IGRvYzsKCQlkb2MuUGFyc2UoIHN0ciApOwoJCVhtbFRlc3QoICJFbXB0eSBkb2N1bWVudCBlcnJvciBUSVhNTF9FUlJPUl9ET0NVTUVOVF9FTVBUWSIsIFRpWG1sQmFzZTo6VElYTUxfRVJST1JfRE9DVU1FTlRfRU1QVFksIGRvYy5FcnJvcklkKCkgKTsKCX0KCSNpZm5kZWYgVElYTUxfVVNFX1NUTAoJewoJCS8vIFN0cmluZyBlcXVhbGl0eS4gWyAxMDA2NDA5IF0gc3RyaW5nIG9wZXJhdG9yPT0vIT0gbm8gd29ya3kgaW4gYWxsIGNhc2VzCgkJVGlYbWxTdHJpbmcgdGVtcDsKCQlYbWxUZXN0KCAiRW1wdHkgdGlueXhtbCBzdHJpbmcgY29tcGFyZSBlcXVhbCIsICggdGVtcCA9PSAiIiApLCB0cnVlICk7CgoJCVRpWG1sU3RyaW5nICAgIGZvbzsKCQlUaVhtbFN0cmluZyAgICBiYXIoICIiICk7CgkJWG1sVGVzdCggIkVtcHR5IHRpbnl4bWwgc3RyaW5nIGNvbXBhcmUgZXF1YWwiLCAoIGZvbyA9PSBiYXIgKSwgdHJ1ZSApOwoJfQoKCSNlbmRpZgoJewoJCS8vIEJ1ZyBbIDExOTU2OTYgXSBmcm9tIG1hcmxvbmlzbQoJCVRpWG1sQmFzZTo6U2V0Q29uZGVuc2VXaGl0ZVNwYWNlKGZhbHNlKTsgCgkJVGlYbWxEb2N1bWVudCB4bWw7IAoJCXhtbC5QYXJzZSgiPHRleHQ+PGJyZWFrLz5UaGlzIGhhbmdzPC90ZXh0PiIpOyAKCQlYbWxUZXN0KCAiVGVzdCBzYWZlIGVycm9yIHJldHVybi4iLCB4bWwuRXJyb3IoKSwgZmFsc2UgKTsKCX0KCgl7CgkJLy8gQnVnIFsgMTI0Mzk5MiBdIC0gYW5vdGhlciBpbmZpbml0ZSBsb29wCgkJVGlYbWxEb2N1bWVudCBkb2M7CgkJZG9jLlNldENvbmRlbnNlV2hpdGVTcGFjZShmYWxzZSk7CgkJZG9jLlBhcnNlKCI8cD48cGI+PC9wYj50ZXN0PC9wPiIpOwoJfSAKCXsKCQkvLyBMb3cgZW50aXRpZXMKCQlUaVhtbERvY3VtZW50IHhtbDsKCQl4bWwuUGFyc2UoICI8dGVzdD4mI3gwZTs8L3Rlc3Q+IiApOwoJCWNvbnN0IGNoYXIgcmVzdWx0W10gPSB7IDB4MGUsIDAgfTsKCQlYbWxUZXN0KCAiTG93IGVudGl0aWVzLiIsIHhtbC5GaXJzdENoaWxkRWxlbWVudCgpLT5HZXRUZXh0KCksIHJlc3VsdCApOwoJCXhtbC5QcmludCgpOwoJfQoJewoJCS8vIEJ1ZyBbIDE0NTE2NDkgXSBBdHRyaWJ1dGUgdmFsdWVzIHdpdGggdHJhaWxpbmcgcXVvdGVzIG5vdCBoYW5kbGVkIGNvcnJlY3RseQoJCVRpWG1sRG9jdW1lbnQgeG1sOwoJCXhtbC5QYXJzZSggIjxmb28gYXR0cmlidXRlPWJhclwiIC8+IiApOwoJCVhtbFRlc3QoICJUaHJvdyBlcnJvciB3aXRoIGJhZCBlbmQgcXVvdGVzLiIsIHhtbC5FcnJvcigpLCB0cnVlICk7Cgl9CgkjaWZkZWYgVElYTUxfVVNFX1NUTAoJewoJCS8vIEJ1ZyBbIDE0NDk0NjMgXSBDb25zaWRlciBnZW5lcmljIHF1ZXJ5CgkJVGlYbWxEb2N1bWVudCB4bWw7CgkJeG1sLlBhcnNlKCAiPGZvbyBiYXI9JzMnIGJhclN0cj0nYSBzdHJpbmcnLz4iICk7CgoJCVRpWG1sRWxlbWVudCogZWxlID0geG1sLkZpcnN0Q2hpbGRFbGVtZW50KCk7CgkJZG91YmxlIGQ7CgkJaW50IGk7CgkJZmxvYXQgZjsKCQlib29sIGI7CgkJc3RkOjpzdHJpbmcgc3RyOwoKCQlYbWxUZXN0KCAiUXVlcnlWYWx1ZUF0dHJpYnV0ZSIsIGVsZS0+UXVlcnlWYWx1ZUF0dHJpYnV0ZSggImJhciIsICZkICksIFRJWE1MX1NVQ0NFU1MgKTsKCQlYbWxUZXN0KCAiUXVlcnlWYWx1ZUF0dHJpYnV0ZSIsIGVsZS0+UXVlcnlWYWx1ZUF0dHJpYnV0ZSggImJhciIsICZpICksIFRJWE1MX1NVQ0NFU1MgKTsKCQlYbWxUZXN0KCAiUXVlcnlWYWx1ZUF0dHJpYnV0ZSIsIGVsZS0+UXVlcnlWYWx1ZUF0dHJpYnV0ZSggImJhciIsICZmICksIFRJWE1MX1NVQ0NFU1MgKTsKCQlYbWxUZXN0KCAiUXVlcnlWYWx1ZUF0dHJpYnV0ZSIsIGVsZS0+UXVlcnlWYWx1ZUF0dHJpYnV0ZSggImJhciIsICZiICksIFRJWE1MX1dST05HX1RZUEUgKTsKCQlYbWxUZXN0KCAiUXVlcnlWYWx1ZUF0dHJpYnV0ZSIsIGVsZS0+UXVlcnlWYWx1ZUF0dHJpYnV0ZSggIm5vYmFyIiwgJmIgKSwgVElYTUxfTk9fQVRUUklCVVRFICk7CgkJWG1sVGVzdCggIlF1ZXJ5VmFsdWVBdHRyaWJ1dGUiLCBlbGUtPlF1ZXJ5VmFsdWVBdHRyaWJ1dGUoICJiYXJTdHIiLCAmc3RyICksIFRJWE1MX1NVQ0NFU1MgKTsKCgkJWG1sVGVzdCggIlF1ZXJ5VmFsdWVBdHRyaWJ1dGUiLCAoZD09My4wKSwgdHJ1ZSApOwoJCVhtbFRlc3QoICJRdWVyeVZhbHVlQXR0cmlidXRlIiwgKGk9PTMpLCB0cnVlICk7CgkJWG1sVGVzdCggIlF1ZXJ5VmFsdWVBdHRyaWJ1dGUiLCAoZj09My4wZiksIHRydWUgKTsKCQlYbWxUZXN0KCAiUXVlcnlWYWx1ZUF0dHJpYnV0ZSIsIChzdHI9PXN0ZDo6c3RyaW5nKCAiYSBzdHJpbmciICkpLCB0cnVlICk7Cgl9CgkjZW5kaWYKCgkjaWZkZWYgVElYTUxfVVNFX1NUTAoJewoJCS8vIFsgMTUwNTI2NyBdIHJlZHVuZGFudCBtYWxsb2MgaW4gVGlYbWxFbGVtZW50OjpBdHRyaWJ1dGUKCQlUaVhtbERvY3VtZW50IHhtbDsKCQl4bWwuUGFyc2UoICI8Zm9vIGJhcj0nMycgLz4iICk7CgkJVGlYbWxFbGVtZW50KiBlbGUgPSB4bWwuRmlyc3RDaGlsZEVsZW1lbnQoKTsKCQlkb3VibGUgZDsKCQlpbnQgaTsKCgkJc3RkOjpzdHJpbmcgYmFyID0gImJhciI7CgoJCWNvbnN0IHN0ZDo6c3RyaW5nKiBhdHJyaWIgPSBlbGUtPkF0dHJpYnV0ZSggYmFyICk7CgkJZWxlLT5BdHRyaWJ1dGUoIGJhciwgJmQgKTsKCQllbGUtPkF0dHJpYnV0ZSggYmFyLCAmaSApOwoKCQlYbWxUZXN0KCAiQXR0cmlidXRlIiwgYXRycmliLT5lbXB0eSgpLCBmYWxzZSApOwoJCVhtbFRlc3QoICJBdHRyaWJ1dGUiLCAoZD09My4wKSwgdHJ1ZSApOwoJCVhtbFRlc3QoICJBdHRyaWJ1dGUiLCAoaT09MyksIHRydWUgKTsKCX0KCSNlbmRpZgoKCXsKCQkvLyBbIDEzNTYwNTkgXSBBbGxvdyBUaVhNTERvY3VtZW50IHRvIG9ubHkgYmUgYXQgdGhlIHRvcCBsZXZlbAoJCVRpWG1sRG9jdW1lbnQgeG1sLCB4bWwyOwoJCXhtbC5JbnNlcnRFbmRDaGlsZCggeG1sMiApOwoJCVhtbFRlc3QoICJEb2N1bWVudCBvbmx5IGF0IHRvcCBsZXZlbC4iLCB4bWwuRXJyb3IoKSwgdHJ1ZSApOwoJCVhtbFRlc3QoICJEb2N1bWVudCBvbmx5IGF0IHRvcCBsZXZlbC4iLCB4bWwuRXJyb3JJZCgpLCBUaVhtbEJhc2U6OlRJWE1MX0VSUk9SX0RPQ1VNRU5UX1RPUF9PTkxZICk7Cgl9CgoJewoJCS8vIFsgMTY2Mzc1OCBdIEZhaWx1cmUgdG8gcmVwb3J0IGVycm9yIG9uIGJhZCBYTUwKCQlUaVhtbERvY3VtZW50IHhtbDsKCQl4bWwuUGFyc2UoIjx4PiIpOwoJCVhtbFRlc3QoIk1pc3NpbmcgZW5kIHRhZyBhdCBlbmQgb2YgaW5wdXQiLCB4bWwuRXJyb3IoKSwgdHJ1ZSk7CgkJeG1sLlBhcnNlKCI8eD4gIik7CgkJWG1sVGVzdCgiTWlzc2luZyBlbmQgdGFnIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSIsIHhtbC5FcnJvcigpLCB0cnVlKTsKCX0gCgoJewoJCS8vIFsgMTYzNTcwMSBdIGZhaWwgdG8gcGFyc2UgZmlsZXMgd2l0aCBhIHRhZyBzZXBhcmF0ZWQgaW50byB0d28gbGluZXMKCQkvLyBJJ20gbm90IHN1cmUgdGhpcyBpcyBhIGJ1Zy4gTWFya2VkICdwZW5kaW5nJyBmb3IgZmVlZGJhY2suCgkJVGlYbWxEb2N1bWVudCB4bWw7CgkJeG1sLlBhcnNlKCAiPHRpdGxlPjxwPnRleHQ8L3Bcbj48dGl0bGU+IiApOwoJCS8veG1sLlByaW50KCk7CgkJLy9YbWxUZXN0KCAiVGFnIHNwbGl0IGJ5IG5ld2xpbmUiLCB4bWwuRXJyb3IoKSwgZmFsc2UgKTsKCX0KCgkjaWZkZWYgVElYTUxfVVNFX1NUTAoJewoJCS8vIFsgMTQ3NTIwMSBdIFRpbnlYTUwgcGFyc2VzIGVudGl0aWVzIGluIGNvbW1lbnRzCgkJVGlYbWxEb2N1bWVudCB4bWw7CgkJaXN0cmluZ3N0cmVhbSBwYXJzZTEoICI8IS0tIGRlY2xhcmF0aW9ucyBmb3IgPGhlYWQ+ICYgPGJvZHk+IC0tPiIKCQkJCQkJICAgICAgIjwhLS0gZmFyICZhbXA7IGF3YXkgLS0+IiApOwoJCXBhcnNlMSA+PiB4bWw7CgoJCVRpWG1sTm9kZSogZTAgPSB4bWwuRmlyc3RDaGlsZCgpOwoJCVRpWG1sTm9kZSogZTEgPSBlMC0+TmV4dFNpYmxpbmcoKTsKCQlUaVhtbENvbW1lbnQqIGMwID0gZTAtPlRvQ29tbWVudCgpOwoJCVRpWG1sQ29tbWVudCogYzEgPSBlMS0+VG9Db21tZW50KCk7CgoJCVhtbFRlc3QoICJDb21tZW50cyBpZ25vcmUgZW50aXRpZXMuIiwgIiBkZWNsYXJhdGlvbnMgZm9yIDxoZWFkPiAmIDxib2R5PiAiLCBjMC0+VmFsdWUoKSwgdHJ1ZSApOwoJCVhtbFRlc3QoICJDb21tZW50cyBpZ25vcmUgZW50aXRpZXMuIiwgIiBmYXIgJmFtcDsgYXdheSAiLCBjMS0+VmFsdWUoKSwgdHJ1ZSApOwoJfQoJI2VuZGlmCgoJewoJCS8vIFsgMTQ3NTIwMSBdIFRpbnlYTUwgcGFyc2VzIGVudGl0aWVzIGluIGNvbW1lbnRzCgkJVGlYbWxEb2N1bWVudCB4bWw7CgkJeG1sLlBhcnNlKCI8IS0tIGRlY2xhcmF0aW9ucyBmb3IgPGhlYWQ+ICYgPGJvZHk+IC0tPiIKCQkJCSAgIjwhLS0gZmFyICZhbXA7IGF3YXkgLS0+IiApOwoKCQlUaVhtbE5vZGUqIGUwID0geG1sLkZpcnN0Q2hpbGQoKTsKCQlUaVhtbE5vZGUqIGUxID0gZTAtPk5leHRTaWJsaW5nKCk7CgkJVGlYbWxDb21tZW50KiBjMCA9IGUwLT5Ub0NvbW1lbnQoKTsKCQlUaVhtbENvbW1lbnQqIGMxID0gZTEtPlRvQ29tbWVudCgpOwoKCQlYbWxUZXN0KCAiQ29tbWVudHMgaWdub3JlIGVudGl0aWVzLiIsICIgZGVjbGFyYXRpb25zIGZvciA8aGVhZD4gJiA8Ym9keT4gIiwgYzAtPlZhbHVlKCksIHRydWUgKTsKCQlYbWxUZXN0KCAiQ29tbWVudHMgaWdub3JlIGVudGl0aWVzLiIsICIgZmFyICZhbXA7IGF3YXkgIiwgYzEtPlZhbHVlKCksIHRydWUgKTsKCX0KCgl7CgkJVGlYbWxEb2N1bWVudCB4bWw7CgkJeG1sLlBhcnNlKCAiPFBhcmVudD4iCgkJCQkJCSI8Y2hpbGQxIGF0dD0nJy8+IgoJCQkJCQkiPCEtLSBXaXRoIHRoaXMgY29tbWVudCwgY2hpbGQyIHdpbGwgbm90IGJlIHBhcnNlZCEgLS0+IgoJCQkJCQkiPGNoaWxkMiBhdHQ9JycvPiIKCQkJCQkiPC9QYXJlbnQ+IiApOwoJCWludCBjb3VudCA9IDA7CgoJCVRpWG1sTm9kZSogZWxlID0gMDsKCQl3aGlsZSAoIChlbGUgPSB4bWwuRmlyc3RDaGlsZEVsZW1lbnQoICJQYXJlbnQiICktPkl0ZXJhdGVDaGlsZHJlbiggZWxlICkgKSAhPSAwICkgewoJCQkrK2NvdW50OwoJCX0KCQlYbWxUZXN0KCAiQ29tbWVudHMgaXRlcmF0ZSBjb3JyZWN0bHkuIiwgMywgY291bnQgKTsKCX0KCgl7CgkJLy8gdHJ5aW5nIHRvIHJlcHJvIF0xODc0MzAxXS4gSWYgaXQgZG9lc24ndCBnbyBpbnRvIGFuIGluZmluaXRlIGxvb3AsIGFsbCBpcyB3ZWxsLgoJCXVuc2lnbmVkIGNoYXIgYnVmW10gPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIj8+PGZlZWQ+PCFbQ0RBVEFbVGVzdCBYTUxibGFibGFibGFsYmxibCI7CgkJYnVmWzYwXSA9IDIzOTsKCQlidWZbNjFdID0gMDsKCgkJVGlYbWxEb2N1bWVudCBkb2M7CgkJZG9jLlBhcnNlKCAoY29uc3QgY2hhciopYnVmKTsKCX0gCgoKCXsKCQkvLyBidWcgMTgyNzI0OCBFcnJvciB3aGlsZSBwYXJzaW5nIGEgbGl0dGxlIGJpdCBtYWxmb3JtZWQgZmlsZQoJCS8vIEFjdHVhbGx5IG5vdCBtYWxmb3JtZWQgLSBzaG91bGQgd29yay4KCQlUaVhtbERvY3VtZW50IHhtbDsKCQl4bWwuUGFyc2UoICI8YXR0cmlidXRlbGlzdD4gPC9hdHRyaWJ1dGVsaXN0ID4iICk7CgkJWG1sVGVzdCggIkhhbmRsZSBlbmQgdGFnIHdoaXRlc3BhY2UiLCBmYWxzZSwgeG1sLkVycm9yKCkgKTsKCX0KCgl7CgkJLy8gVGhpcyBvbmUgbXVzdCBub3QgcmVzdWx0IGluIGFuIGluZmluaXRlIGxvb3AKCQlUaVhtbERvY3VtZW50IHhtbDsKCQl4bWwuUGFyc2UoICI8aW5maW5pdGU+bG9vcCIgKTsKCQlYbWxUZXN0KCAiSW5maW5pdGUgbG9vcCB0ZXN0LiIsIHRydWUsIHRydWUgKTsKCX0KCgl7CgkJLy8gMTcwOTkwNCAtIGNhbiBub3QgcmVwcm8gdGhlIGNyYXNoCgkJewoJCQlUaVhtbERvY3VtZW50IHhtbDsKCQkJeG1sLlBhcnNlKCAiPHRhZz4vPC90YWc+IiApOwoJCQlYbWxUZXN0KCAiT2RkIFhNTCBwYXJzaW5nLiIsIHhtbC5GaXJzdENoaWxkKCktPlZhbHVlKCksICJ0YWciICk7CgkJfQoJCS8qIENvdWxkIG5vdCByZXByby4gewoJCQlUaVhtbERvY3VtZW50IHhtbDsKCQkJeG1sLkxvYWRGaWxlKCAiRVFVSV9JbnZlbnRvcnkueG1sIiApOwoJCQkvL1htbFRlc3QoICJPZGQgWE1MIHBhcnNpbmcuIiwgeG1sLkZpcnN0Q2hpbGRFbGVtZW50KCktPlZhbHVlKCksICJYTUwiICk7CgkJCVRpWG1sUHJpbnRlciBwcmludGVyOwoJCQl4bWwuQWNjZXB0KCAmcHJpbnRlciApOwoJCQlmcHJpbnRmKCBzdGRvdXQsICIlcyIsIHByaW50ZXIuQ1N0cigpICk7CgkJfSovCgl9CgoJLyogIDE0MTc3MTcgZXhwZXJpbWVudAoJewoJCVRpWG1sRG9jdW1lbnQgeG1sOwoJCXhtbC5QYXJzZSgiPHRleHQ+RGFuICYgVHJhY2llPC90ZXh0PiIpOwoJCXhtbC5QcmludChzdGRvdXQpOwoJfQoJewoJCVRpWG1sRG9jdW1lbnQgeG1sOwoJCXhtbC5QYXJzZSgiPHRleHQ+RGFuICZmb287IFRyYWNpZTwvdGV4dD4iKTsKCQl4bWwuUHJpbnQoc3Rkb3V0KTsKCX0KCSovCgoJI2lmIGRlZmluZWQoIFdJTjMyICkgJiYgZGVmaW5lZCggVFVORSApCglfQ3J0TWVtQ2hlY2twb2ludCggJmVuZE1lbVN0YXRlICk7CgkvL19DcnRNZW1EdW1wU3RhdGlzdGljcyggJmVuZE1lbVN0YXRlICk7CgoJX0NydE1lbVN0YXRlIGRpZmZNZW1TdGF0ZTsKCV9DcnRNZW1EaWZmZXJlbmNlKCAmZGlmZk1lbVN0YXRlLCAmc3RhcnRNZW1TdGF0ZSwgJmVuZE1lbVN0YXRlICk7CglfQ3J0TWVtRHVtcFN0YXRpc3RpY3MoICZkaWZmTWVtU3RhdGUgKTsKCSNlbmRpZgoKCXByaW50ZiAoIlxuUGFzcyAlZCwgRmFpbCAlZFxuIiwgZ1Bhc3MsIGdGYWlsKTsKCXJldHVybiBnRmFpbDsKfQo=