LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICoKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCiAqIGNvcGllcy4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAogKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCiAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgovKgogKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCiAqLwoKCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgogICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIFQgTCAuIEMKCiAgT1ZFUlZJRVc6CgogIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gVHJhbnNwb3J0IExheWVyLgoKICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIE9OTFkgYnkgb3RoZXIKICBXTEFOIG1vZHVsZXMgdGhhdCBwcm9wZXJseSByZWdpc3RlciB3aXRoIHRoZSBUcmFuc3BvcnQgTGF5ZXIgaW5pdGlhbGx5LgoKICBERVBFTkRFTkNJRVM6CgogIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgoKCiAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCgoKICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgoKCiAgICRIZWFkZXIkJERhdGVUaW1lJCRBdXRob3IkCgoKICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMjAxMC0wNy0xMyAgICBjX3NoaW5kZSBGaXhlZCBhbiBpc3N1ZSB3aGVyZSBXQVBJIHJla2V5aW5nIHdhcyBmYWlsaW5nIGJlY2F1c2UgCiAgICAgICAgICAgICAgICAgICAgICBXQUkgZnJhbWUgc2VudCBvdXQgZHVyaW5nIHJla2V5aW5nIGhhZCB0aGUgcHJvdGVjdGVkIGJpdAogICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIDEuCjIwMTAtMDUtMDYgICAgcm5haXIgICBDaGFuZ2VkIG5hbWUgb2YgdmFyaWFibGUgZnJvbSB1c0xsY1R5cGUgdG8gdXNFdGhlclR5cGUKICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgZnVuY3Rpb24gbmFtZSBmcm9tIEdldExMQ1R5cGUgdG8gR2V0RXRoZXJUeXBlCiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCA4MDIuMyB0byA4MDIuMTEgZnJhbWUgdHJhbnNsYXRpb24gaXNzdWUgd2hlcmUgdHdvIAogICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIExMQyBoZWFkZXIgd2FzIGdldHRpbmcgb3ZlcndyaXR0ZW4gaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICBub24tUW9zIHBhdGgKMjAxMC0wNS0wNiAgICBybmFpciAgIFJ4QXV0aCBwYXRoIGZpeCBmb3IgbW9kaWZ5aW5nIHRoZSBoZWFkZXIgYmVmb3JlIGV0aGVyCiAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHJldHJlaXZlZCAoRGV0ZWN0ZWQgd2hpbGUgdGVzdGluZyByZWtleWluZwogICAgICAgICAgICAgICAgICAgICAgaW4gV0FQSSBWb2xhbnMpCjIwMTAtMDItMTkgICAgYmFkICAgICBGaXhlZCA4MDIuMTEgdG8gODAyLjMgZnQgaXNzdWVzIHdpdGggV0FQSQoyMDEwLTAyLTE5ICAgIHJuYWlyICAgV0FQSTogSWYgZnJhbWUgaXMgYSBXQUkgZnJhbWUgaW4gVHhDb25uIGFuZCBUeEF1dGgsIFRMIAogICAgICAgICAgICAgICAgICAgICAgZG9lcyBmcmFtZSB0cmFuc2xhdGlvbi4gCjIwMTAtMDItMDEgICAgcm5haXIgICBXQVBJOiBGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgdmFsdWUgb2YgdWNJc1dhcGlTdGEgd2FzIG5vdCAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHNldCBpbiB0aGUgVEwgY29udHJvbCBibG9jayBpbiB0aGUgUmVnaXN0ZXJTVEEgZnVuYy4gCjIwMTAtMDEtMDggICAgbHRpICAgICBBZGRlZCBUTCBEYXRhIENhY2hpbmcgCjIwMDktMTEtMDQgICAgcm5haXIgICBXQVBJOiBNb3ZpbmcgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdG8gYSBzZXBlcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIFdMQU5UTF9HZXRMTENUeXBlCjIwMDktMTAtMTUgICAgcm5haXIgICBXQVBJOiBGZWF0dXJpemluZyBXQVBJIGNvZGUKMjAwOS0xMC0wOSAgICBybmFpciAgIFdBUEk6IE1vZGlmaWNhdGlvbnMgdG8gYXV0aGVudGljYXRlZCBzdGF0ZSBoYW5kbGluZyBvZiBSeCBkYXRhCjIwMDktMTAtMDYgICAgcm5haXIgICBBZGRpbmcgc3VwcG9ydCBmb3IgV0FQSSAKMjAwOS0wOS0yMiAgICBsdGkgICAgIEFkZCBkZXJlZ2lzdHJhdGlvbiBBUEkgZm9yIG1hbmFnZW1lbnQgY2xpZW50CjIwMDktMDctMTYgICAgcm5haXIgICBUZW1wb3JhcnkgZml4IHRvIGxldCBUTCBmZXRjaCBwYWNrZXRzIHdoZW4gbXVsdGlwbGUgCiAgICAgICAgICAgICAgICAgICAgICBwZWVycyBleGlzdCBpbiBhbiBJQlNTCjIwMDktMDYtMTAgICAgbHRpICAgICBGaXggZm9yIGNoZWNraW5nIFRJRCB2YWx1ZSBvZiBtZXRhIGluZm8gb24gVFggLSBwcmV2ZW50CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgb3ZlcndyaXRlIAogICAgICAgICAgICAgICAgICAgICAgRml4IGZvciBwcm9wZXJseSBjaGVja2luZyB0aGUgc3RhIGlkIGZvciByZXN1bWluZyB0cmlnZ2VyCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBnZW5lcmF0aW9uCjIwMDktMDUtMTQgICAgbHRpICAgICBGaXggZm9yIHNlbmRpbmcgb3V0IHRyaWdnZXIgZnJhbWVzCjIwMDktMDUtMTUgICAgbHRpICAgICBBZGRyMyBmaWx0ZXJpbmcgCjIwMDktMDQtMTMgICAgbHRpICAgICBBc3NlcnQgaWYgcGFja2V0IGxhcmdlciB0aGVuIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgIERyb3AgcGFja2V0IHRoYXQgZmFpbHMgZmxhdHRlbgoyMDA5LTA0LTAyICAgIGx0aSAgICAgUGVyZm9ybWFuY2UgZml4ZXMgZm9yIFRMIAoyMDA5LTAyLTE5ICAgIGx0aSAgICAgQWRkZWQgZml4IGZvciBMTEMgbWFuYWdlbWVudCBvbiBSeCBDb25uZWN0IAoyMDA5LTAxLTE2ICAgIGx0aSAgICAgUmVwbGFjZWQgcGVlayBkYXRhIHdpdGggZXh0cmFjdCBkYXRhIGZvciBub24gQkQgb3BlcnRpb25zCiAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0ZWQgZnJhbWUgY29udHJvbCBpbiBUbCBhbmQgcGFzcyB0byBIQUwgZm9yIGZyYW1lIAogICAgICAgICAgICAgICAgICAgICAgdHlwZSBldmFsdWF0aW9uCjIwMDktMDItMDIgICAgc2NoICAgICBBZGQgaGFuZG9mZiBzdXBwb3J0CjIwMDgtMTItMDkgICAgbHRpICAgICBGaXhlcyBmb3IgQU1TUyBjb21waWxhdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgYXNzZXJ0IG9uIHJlY2VpdmUgd2hlbiB0aGVyZSBpcyBubyBzdGF0aW9uCjIwMDgtMTItMDIgICAgbHRpICAgICBGaXggZm8gdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uIAoyMDA4LTEwLTMxICAgIGx0aSAgICAgRml4IGZvIFRMIHR4IHN1c3BlbmQKMjAwOC0xMC0wMSAgICBsdGkgICAgIE1lcmdlZCBpbiBmaXhlcyBmcm9tIHJlb3JkZXJpbmcKICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkIHBhcnQgb2YgVUFQU0QgZnVuY3Rpb25hbGl0eSBpbiBUTAogICAgICAgICAgICAgICAgICAgICAgKHdpbGwgYmUgcmUtZW5hYmxlZCBvbmNlIFVBUFNEIGlzIHRlc3RlZCkKICAgICAgICAgICAgICAgICAgICAgIEZpeCBmb3IgVUFQU0QgbXVsdGlwbGUgZW5hYmxlCjIwMDgtMDgtMTAgICAgbHRpICAgICBGaXhlcyBmb2xsb3dpbmcgVUFQU0QgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgaW5maW5pdGUgbG9vcCBvbiBtYXNrIGNvbXB1dGF0aW9uIHdoZW4gU1RBIG5vIHJlZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgRml4ZXMgYWZ0ZXIgUU9TIHVuaXQgdGVzdGluZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgQWRkZWQgUU9TIHN1cHBvcnQKMjAwOC0wNy0yMyAgICBsdGkgICAgIEZpeCBmb3Igdm9zIHBhY2tldCBkcmFpbmluZwoyMDA4LTA3LTE3ICAgIGx0aSAgICAgRml4IGZvciBkYXRhIHR5cGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZyYW1lIHRyYW5zbGF0aW9uIGNvZGUgaW4gVEwKICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJldHVybmluZyBmYWlsdXJlIHRvIFBFIGluIGNhc2UgcHJldmlvdXMgZnJhbWUgaXMKICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIHBlbmRpbmc7IGZhaWwgcHJldmlvdXMgYW5kIGNhY2hlIG5ldyBvbmUgZm9yIHR4CiAgICAgICAgICAgICAgICAgICAgICBHZXQgZnJhbWVzIHJldHVybmluZyBib29sZWFuIHRydWUgaWYgbW9yZSBmcmFtZXMgYXJlIHBlbmRpbmcKMjAwOC0wNy0wMyAgICBsdGkgICAgIEZpeGVzIGZvbGxvd2luZyBwcmUtaW50ZWdyYXRpb24gdGVzdGluZwoyMDA4LTA2LTI2ICAgIGx0aSAgICAgRml4ZXMgZm9sbG93aW5nIHVuaXQgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgYWxsb2MgYW5kIGZyZWUgZm9yIFRMIGNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIGF0b21pYyBzZXQgdTggaW5zdGVhZCBvZiB1MzIKMjAwOC0wNS0xNiAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEluY2x1ZGUgRmlsZXMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaV9iYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsX2hvc3VwcG9ydC5oIgojaW5jbHVkZSAidm9zX3R5cGVzLmgiCiNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKI2luY2x1ZGUgIndsYW5fcWN0X3RsX3RyYWNlLmgiCiNpbmNsdWRlICJ0bERlYnVnLmgiCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQovKkluY2x1ZGVkIHRvIGFjY2VzcyBXRElfUnhCZFR5cGUgKi8KI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9iZC5oIgojZW5kaWYKLypFbmFibGVzIGRlYnVnZ2luZyBiZWhhdmlvciBpbiBUTCovCiNkZWZpbmUgVExfREVCVUcKLypFbmFibGVzIGRlYnVnZ2luZyBGQyBjb250cm9sIGZyYW1lIGluIFRMKi8KLy8jZGVmaW5lIFRMX0RFQlVHX0ZDCi8vI2RlZmluZSBXTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTgovLyNkZWZpbmUgQlRBTVBfVEVTVAojaWZkZWYgVExfREVCVUdfRkMKI2luY2x1ZGUgPHdsYW5fcWN0X3BhbF9zdGF0dXMuaD4KI2luY2x1ZGUgPHdsYW5fcWN0X3BhbF9kZXZpY2UuaD4gLy8gd3BhbFJlYWRSZWdpc3RlcgojZW5kaWYKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLypMTEMgaGVhZGVyIHZhbHVlKi8Kc3RhdGljIHZfVThfdCBXTEFOVExfTExDX0hFQURFUltdID0gIHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweDAwIH07CgojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQovKkFpcm9uZXQgU05BUCBoZWFkZXIgdmFsdWUqLwpzdGF0aWMgdl9VOF90IFdMQU5UTF9BSVJPTkVUX1NOQVBfSEVBREVSW10gPSAgezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDAgfTsKI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0VTRQoKLypCVC1BTVAgcGFja2V0IExMQyBPVUkgdmFsdWUqLwpjb25zdCB2X1U4X3QgV0xBTlRMX0JUX0FNUF9PVUlbXSA9ICB7MHgwMCwgMHgxOSwgMHg1OCB9OwoKI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCmV4dGVybiBjb25zdCB2X1U4X3QgIFdMQU5UTF9USURfMl9BQ1tXTEFOX01BWF9USURdOwoKI2VuZGlmCgojZGVmaW5lIFdMQU5UTF9NQVhfU05SX0RBVEFfU0FNUExFUyAyMAoKI2lmZGVmIFZPTEFOU19QRVJGCiNkZWZpbmUgV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfRU5BQkxFX1RIUkVTSE9MRCAgMTIwCiNkZWZpbmUgV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfR0VUX1RIUkVTSE9MRCAgMTIwCgovKiBUTCBCRC9QRFUgdGhyZXNob2xkIHRvIGVuYWJsZSBpbnRlcnJ1cHQgKi8KaW50IGJkUGR1SW50ZXJydXB0RW5hYmxlVGhyZXNob2xkID0gV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfRU5BQkxFX1RIUkVTSE9MRDsKaW50IGJkUGR1SW50ZXJydXB0R2V0VGhyZXNob2xkID0gV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfR0VUX1RIUkVTSE9MRDsKI2VuZGlmIC8qIFZPTEFOU19QRVJGICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogfCAgIFR5cGUoMmIpICAgfCAgICAgU3ViLXR5cGUoNGIpICAgfAogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZSBXTEFOVExfSVNfREFUQV9GUkFNRShfdHlwZV9zdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfREFUQV9GUkFNRV9UWVBFID09ICggKF90eXBlX3N1YikgJiAweDMwICkpCgojZGVmaW5lIFdMQU5UTF9JU19RT1NfREFUQV9GUkFNRShfdHlwZV9zdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICgoIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkgJiYgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4RiApKSkgCgojZGVmaW5lIFdMQU5UTF9JU19NR01UX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF9NR01UX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkKCiNkZWZpbmUgV0xBTlRMX0lTX01HTVRfQUNUSU9OX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICgoIFdMQU5UTF9NR01UX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkgJiYgICAgXAogICAgICggKCBXTEFOVExfODAyMTFfTUdNVF9BQ1RJT05fU1VCVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHhGICkpIHx8IFwKICAgICAgICggV0xBTlRMXzgwMjExX01HTVRfQUNUSU9OX05PX0FDS19TVUJUWVBFID09ICggKF90eXBlX3N1YikgJiAweEYgKSkpKQoKI2RlZmluZSBXTEFOVExfSVNfQ1RSTF9GUkFNRShfdHlwZV9zdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfQ1RSTF9GUkFNRV9UWVBFID09ICggKF90eXBlX3N1YikgJiAweDMwICkpCgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKI2RlZmluZSBXTEFOVExfSVNfVERMU19GUkFNRShfZXRoX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfTExDX1RETFNfVFlQRSA9PSAoIF9ldGhfdHlwZSkpCiNlbmRpZgoKLypNQVggQWxsb3dlZCBsZW4gcHJvY2Vzc2VkIGJ5IFRMIC0gTUF4IE1UVSArIDgwMi4zIGhlYWRlciArIEJEK0RYRStYVEwqLwojZGVmaW5lIFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4gICAgKDE1MTQgKyAxMDApCgojZGVmaW5lIFdMQU5UTF9NQVNLX0FDICAweDAzCgovL3NvbWUgZmxvd19jb250cm9sIGRlZmluZQovL0xXTSBtb2RlIHdpbGwgYmUgZW5hYmxlZCBmb3IgdGhpcyBzdGF0aW9uIGlmIHRoZSBlZ3Jlc3MvaW5ncmVzcyBmYWxscyBiZWxvdyB0aGlzIHJhdGlvCiNkZWZpbmUgV0xBTlRMX0xXTV9FR1JFU1NfSU5HUkVTU19USFJFU0hPTEQgKDAuNzUpCgovL0dldCBlbm91Z2ggc2FtcGxlIHRvIGRvIHRoZSBMV00gcmVsYXRlZCBjYWxjdWxhdGlvbgojZGVmaW5lIFdMQU5UTF9MV01fSU5HUkVTU19TQU1QTEVfVEhSRVNIT0xEICg2NCkKCi8vTWF4aW1hbCBvbi1mbHkgcGFja2V0IHBlciBzdGF0aW9uIGluIExXTSBtb2RlCiNkZWZpbmUgV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWCAoMjU2KQoKI2RlZmluZSBXTEFOVExfQUNfTUFTSyAoMHg3KQojZGVmaW5lIFdMQU5UTF9TVEFJRF9PRkZTRVQgKDB4NikKCi8qIFVJTlQzMiB0eXBlIGVuZGlhbiBzd2FwICovCiNkZWZpbmUgU1dBUF9FTkRJQU5fVUlOVDMyKGEpICAgICAgICAgICgoYSkgPSAoKGEpID4+IDB4MTggKSB8KCgoYSkgJiAweEZGMDAwMCkgPj4gMHgwOCkgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgJiAweEZGMDApIDw8IDB4MDgpICB8ICgoKGEpICYgMHhGRikgPDwgMHgxOCkpCgovKiBNYXhpbXVtIHZhbHVlIG9mIFNOUiB0aGF0IGNhbiBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBIVyAqLwojZGVmaW5lIFdMQU5UTF9NQVhfSFdfU05SIDM1CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogVHlwZSBEZWNsYXJhdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNkZWZpbmUgVExfTElUVExFX0JJVF9FTkRJQU4KCnR5cGVkZWYgc3RydWN0CnsKCgogICB2X1U4X3QgcHJvdFZlciA6MjsKICAgdl9VOF90IHR5cGUgOjI7CiAgIHZfVThfdCBzdWJUeXBlIDo0OwoKICAgdl9VOF90IHRvRFMgOjE7CiAgIHZfVThfdCBmcm9tRFMgOjE7CiAgIHZfVThfdCBtb3JlRnJhZyA6MTsKICAgdl9VOF90IHJldHJ5IDoxOwogICB2X1U4X3QgcG93ZXJNZ210IDoxOwogICB2X1U4X3QgbW9yZURhdGEgOjE7CiAgIHZfVThfdCB3ZXAgOjE7CiAgIHZfVThfdCBvcmRlciA6MTsKCgp9IFdMQU5UTF9NQUNGQ1R5cGU7CgovKiA4MDIuMTEgaGVhZGVyICovCnR5cGVkZWYgc3RydWN0CnsKIC8qIEZyYW1lIGNvbnRyb2wgZmllbGQgKi8KIFdMQU5UTF9NQUNGQ1R5cGUgIHdGcm1DdHJsOwoKIC8qIER1cmF0aW9uIElEICovCiB2X1UxNl90ICB1c0R1cmF0aW9uSWQ7CgogLyogQWRkcmVzcyAxIGZpZWxkICAqLwogdl9VOF90ICAgdkExW1ZPU19NQUNfQUREUl9TSVpFXTsKCiAvKiBBZGRyZXNzIDIgZmllbGQgKi8KIHZfVThfdCAgIHZBMltWT1NfTUFDX0FERFJfU0laRV07CgogLyogQWRkcmVzcyAzIGZpZWxkICovCiB2X1U4X3QgICB2QTNbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIFNlcXVlbmNlIGNvbnRyb2wgZmllbGQgKi8KIHZfVTE2X3QgIHVzU2VxQ3RybDsKCiAvLyBGaW5kIHRoZSBzaXplIG9mIHRoZSBtYW5kYXRvcnkgaGVhZGVyIHNpemUuCiNkZWZpbmUgV0xBTjgwMjExX01BTkRBVE9SWV9IRUFERVJfU0laRSBcCiAgICAoc2l6ZW9mKFdMQU5UTF9NQUNGQ1R5cGUpICsgc2l6ZW9mKHZfVTE2X3QpICsgXAogICAgKDMgKiAoc2l6ZW9mKHZfVThfdCkgKiBWT1NfTUFDX0FERFJfU0laRSkpICArIFwKICAgIHNpemVvZih2X1UxNl90KSkKCiAvKiBPcHRpb25hbCBBNCBhZGRyZXNzICovCiB2X1U4X3QgICBvcHR2QTRbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIE9wdGlvbmFsIFFPUyBjb250cm9sIGZpZWxkICovCiB2X1UxNl90ICB1c1Fvc0N0cmw7Cn1XTEFOVExfODAyMTFIZWFkZXJUeXBlOwoKLyogODAyLjMgaGVhZGVyICovCnR5cGVkZWYgc3RydWN0CnsKIC8qIERlc3RpbmF0aW9uIGFkZHJlc3MgZmllbGQgKi8KIHZfVThfdCAgIHZEQVtWT1NfTUFDX0FERFJfU0laRV07CgogLyogU291cmNlIGFkZHJlc3MgZmllbGQgKi8KIHZfVThfdCAgIHZTQVtWT1NfTUFDX0FERFJfU0laRV07CgogLyogTGVuZ3RoIGZpZWxkICovCiB2X1UxNl90ICB1c0xlblR5cGU7Cn1XTEFOVExfODAyM0hlYWRlclR5cGU7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNkZWZpbmUgV0xBTl9UTF9JTlZBTElEX1VfU0lHIDI1NQojZGVmaW5lIFdMQU5fVExfSU5WQUxJRF9CX1NJRyAyNTUKI2RlZmluZSBFTlRFUigpIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJFbnRlcjolcyIsIF9fZnVuY19fKQoKI2RlZmluZSBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyggX3BTVEEsIF91Y0FDTWFzaywgaSApIFwKICBkb1wKICB7XAogICAgX3VjQUNNYXNrID0gMDsgXAogICAgZm9yICggaSA9IDA7IGkgPCBXTEFOVExfTUFYX0FDOyBpKysgKSBcCiAgICB7IFwKICAgICAgaWYgKCAwICE9IChfcFNUQSktPmF1Y0FDTWFza1tpXSApIFwKICAgICAgeyBcCiAgICAgICAgX3VjQUNNYXNrIHw9ICggMSA8PCBpICk7IFwKICAgICAgfSBcCiAgICB9IFwKICB9IHdoaWxlICgwKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBTdGF0aWMgVmFyaWFibGUgRGVmaW5pdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpzdGF0aWMgVk9TX1NUQVRVUyAKV0xBTlRMX0dldEV0aGVyVHlwZQooCiAgdl9VOF90ICAgICAgICAgICAgICAgKiBhdWNCREhlYWRlciwKICB2b3NfcGt0X3QgICAgICAgICAgICAqIHZvc0RhdGFCdWZmLAogIHZfVThfdCAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwKICB2X1UxNl90ICAgICAgICAgICAgICAqIHVzRXRoZXJUeXBlCik7CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFNfSU5URVJOQUwKLyogRklYTUVfTVVTVDogZHVyaW5nIFRETFMgaW50ZWdyYXRpb24gdG8gbWFpbi9sYXRlc3QsIFdMQU5UTF9HZXRFdGhlclR5cGUoKSBjb25mbGljdHMuCkJ1dCB0aGVyZSBpcyBkaWZmZXJlbmNlLiBleGlzdGluZyBXTEFOVExfR2V0RXRoZXJUeXBlKCkgZXhwZWN0cyB2b3NEYXRhQnVmZi0+b2Zmc2V0IHBvaW50cyB0byBNUERVIEhlYWRlciwKd2hlcmVhc2UgVERMUyBleHBlY3Qgdm9zRGF0YUJ1ZmYtPm9mZnNldCBzaG91bGQgc3RpbGwgcG9pbnRzIHRvIFJ4QmQuIApTbyBmYXIsIGRhdGEgZnJtYWUgc3RyaXBwZWQgUnhCRCBhbmQgcGFzc2VkIHRvIGRhdGEgZnJhbWUgaGFuZGxlci4KKFJ4QmQgc2hvdWxkIG5vdCBiZSBzdHJpcHBlZCBpbiBjYXNlIFRETFMsIGJlY2F1c2UgaXQgd2lsbCBiZSBldmVudHVhbGx5IHJvdXRlZCB0byBtZ210IHBhY2tldCAKaGFuZGxlciwgd2hlcmUgUlggQkQgc2hvdWxkIGJlIHByZXNlcnZlZCkKVG8gYXZvaWQgYnJlYWtpbmcgZXhpc3RpbmcgZnVuY3Rpb25hbGl0eSwgZm9yIG5vdywgSSB0ZW1wb3JhcmlseSByZW5hbWUgdG8KV0xBTlRMX0dldEV0aGVyVHlwZV8yKCkuIEV2ZW50dWFsbHkgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBhbmQgbWVyZ2VkIHRvIFdMQU5UTF9HZXRFdGhlclR5cGUoKQoqLwpzdGF0aWMgVk9TX1NUQVRVUyAKV0xBTlRMX0dldEV0aGVyVHlwZV8yCigKICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogIHZvc19wa3RfdCAgICAgICAgICAgICogdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLAogIHZfVTE2X3QgICAgICAgICAgICAgICogdXNFdGhlclR5cGUKKTsKI2VuZGlmCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBBZGRpbmcgYSBnbG9iYWwgdmFyaWFibGUgdG8gYmUgdXNlZCB3aGVuIGRvaW5nIGZyYW1lIHRyYW5zbGF0aW9uIGluIFR4QXV0aAogKiBzdGF0ZSBzbyBhcyB0byBub3Qgc2V0IHRoZSBwcm90ZWN0ZWQgYml0IHRvIDEgaW4gdGhlIGNhc2Ugb2YgV0FJIGZyYW1lcwogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZfVThfdCBnVWNJc1dhaTsKI2VuZGlmCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRXh0ZXJuYWxpemVkIEZ1bmN0aW9uIERlZmluaXRpb25zCiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEb2N1bWVudGF0aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgICAgICBXTEFOVExfRnJlZUNsaWVudE1lbW9yeQoKICBERVNDUklQVElPTgogIEl0IGZyZWVzIHVwIHRoZSBtZW1vcnkgYWxsb2NhdGVkIHRvIGFsbCB0aGUgU1RBIGNsaWVudHMgaW4gVExDQiBibG9jawogIENhbiBiZSBjYWxsZWQgaW5zaWRlIENsb3NlLCBTdG9wIG9yIHdoZW4gc29tZSBGQVVMVCBvY2N1cnMKCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgSU4KICBwQ2xpZW50U1RBOiAgICBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2xpZW50IHBvaW50ZXIgYXJyYXkKCiAgUkVUVVJOIFZBTFVFCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkKKFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBW1dMQU5fTUFYX1NUQV9DT1VOVF0pCnsKICAgIHZfVTMyX3QgaSA9IDA7CiAgICBmb3IoaSA9MDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKQogICAgewogICAgICAgIGlmKCBOVUxMICE9IHBDbGllbnRTVEFbaV0gKQogICAgICAgIHsKICAgICAgICAgICB2b3NfbWVtX2ZyZWUocENsaWVudFNUQVtpXSk7CiAgICAgICAgfQogICAgICAgIHBDbGllbnRTVEFbaV0gPSBOVUxMOwogICAgfQogICAgcmV0dXJuOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9PcGVuCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIGF0IGRyaXZlciBpbml0aWFsaXphdGlvbi4gVEwgd2lsbCBpbml0aWFsaXplIGFsbCBpdHMKICAgIGludGVybmFsIHJlc291cmNlcyBhbmQgd2lsbCB3YWl0IGZvciB0aGUgY2FsbCB0byBzdGFydCB0byByZWdpc3RlcgogICAgd2l0aCB0aGUgb3RoZXIgbW9kdWxlcy4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwVExDb25maWc6ICAgICAgVEwgQ29uZmlndXJhdGlvbgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9PcGVuCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfQ29uZmlnSW5mb1R5cGUqICBwVExDb25maWcKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsgCiAgdl9VOF90ICAgICAgICAgIHVjSW5kZXg7IAogIHRIYWxIYW5kbGUgICAgICBzbWVDb250ZXh0OwogIHZfVTMyX3QgaSA9IDA7CiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgVk9TX1NUQVRVUyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKI2VuZGlmCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEVOVEVSKCk7CiAgdm9zX2FsbG9jX2NvbnRleHQoIHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCAKICAgICAgICAgICAgICAgICAgICAodm9pZCopJnBUTENiLCBzaXplb2YoV0xBTlRMX0NiVHlwZSkpOwoKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCAoIE5VTEwgPT0gcFRMQ29uZmlnICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAgIldMQU4gVEw6IEludmFsaWQgaW5wdXQgcG9pbnRlciBvbiBXTEFOVExfT3BlbiBUTCAlcCBDb25maWcgJXAiLCBwVExDYiwgcFRMQ29uZmlnICkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qIFNldCB0aGUgZGVmYXVsdCBsb2cgbGV2ZWwgdG8gVk9TX1RSQUNFX0xFVkVMX0VSUk9SICovCiAgdm9zX3RyYWNlX3NldExldmVsKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUik7CgogIHNtZUNvbnRleHQgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9TTUUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gc21lQ29udGV4dCApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHNtZUNvbnRleHQiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qIFplcm8gb3V0IHRoZSBtZW1vcnkgc28gd2UgYXJlIE9LLCB3aGVuIENsZWFuQ0IgaXMgY2FsbGVkLiovCiAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXBUTENiLCBzaXplb2YoV0xBTlRMX0NiVHlwZSkpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYW4gdXAgVEwgY29udHJvbCBibG9jaywgaW5pdGlhbGl6ZSBhbGwgdmFsdWVzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9PcGVuIikpOwoKICBmb3IgKCBpID0wOyBpPFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrICkKICB7CiAgICAgIGlmICggaSA8IFdMQU5fTk9OMzJfU1RBX0NPVU5UICkKICAgICAgewogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0gPSB2b3NfbWVtX21hbGxvYyhzaXplb2YoV0xBTlRMX1NUQUNsaWVudFR5cGUpKTsKICAgICAgICAgIC8qIEFsbG9jYXRpbmcgbWVtb3J5IGZvciBMRUdBQ1kgU1RBIENPVU5UIHNvIGFzIHRvIGF2b2lkIHJlZ3Jlc3Npb24gaXNzdWVzLiAgKi8KICAgICAgICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldICkKICAgICAgICAgewogICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOIFRMOiBTdGFDbGllbnQgYWxsb2NhdGlvbiBmYWlsZWQiKSk7CiAgICAgICAgICAgICBXTEFOVExfRnJlZUNsaWVudE1lbW9yeShwVExDYi0+YXRsU1RBQ2xpZW50cyk7CiAgICAgICAgICAgICB2b3NfZnJlZV9jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCBwVExDYik7CiAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgICAgICB9CiAgICAgICAgIHZvc19tZW1femVybygodl9WT0lEX3QgKikgcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0sIHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0gPSBOVUxMOwogICAgICB9CiAgfQoKICBwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YoV0xBTlRMX1JFT1JERVJfQlVGRkVSX1QpICogV0xBTlRMX01BWF9CQV9TRVNTSU9OKTsKICBpZiAoTlVMTCA9PSBwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOIFRMOiBSZW9yZGVyIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKICAgIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5KHBUTENiLT5hdGxTVEFDbGllbnRzKTsKICAgIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopcFRMQ2ItPnJlb3JkZXJCdWZmZXJQb29sLCBzaXplb2YoV0xBTlRMX1JFT1JERVJfQlVGRkVSX1QpICogV0xBTlRMX01BWF9CQV9TRVNTSU9OKTsKCiAgV0xBTlRMX0NsZWFuQ0IocFRMQ2IsIDAgLypkbyBub3QgZW1wdHkqLyk7CgogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjSW5kZXhdID0gcFRMQ29uZmlnLT51Y0FjV2VpZ2h0c1t1Y0luZGV4XTsKICB9CgogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjUmVvcmRlckFnaW5nVGltZVt1Y0luZGV4XSA9IHBUTENvbmZpZy0+dWNSZW9yZGVyQWdpbmdUaW1lW3VjSW5kZXhdOwogIH0KCiAgLy8gc2NoZWR1bGluZyBpbml0IHRvIGJlIHRoZSBsYXN0IG9uZSBvZiBwcmV2aW91cyByb3VuZAogIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfQks7CiAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA9IDE7CiAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IFdMQU5fTUFYX1NUQV9DT1VOVC0xOwoKI2lmIDAKICAvL2Zsb3cgY29udHJvbCBmaWVsZCBpbml0CiAgdm9zX21lbV96ZXJvKCZwVExDYi0+dGxGQ0luZm8sIHNpemVvZih0RmNUeFBhcmFtc190eXBlKSk7CiAgLy9iaXQgMDogc2V0IChCZC9wZHUgY291bnQpIGJpdCAxOiBzZXQgKHJlcXVlc3Qgc3RhdGlvbiBQUyBjaGFuZ2Ugbm90aWZpY2F0aW9uKQogIHBUTENiLT50bEZDSW5mby5mY0NvbmZpZyA9IDB4MTsKI2VuZGlmCgogIHBUTENiLT52b3NUeEZDQnVmID0gTlVMTDsKICBwVExDYi0+dGxDb25maWdJbmZvLnVNaW5GcmFtZXNQcm9jVGhyZXMgPQogICAgICAgICAgICAgICAgcFRMQ29uZmlnLT51TWluRnJhbWVzUHJvY1RocmVzOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCA9IDA7CiNlbmRpZgoKICBwVExDYi0+dGxDb25maWdJbmZvLnVEZWxheWVkVHJpZ2dlckZybUludCA9CiAgICAgICAgICAgICAgICBwVExDb25maWctPnVEZWxheWVkVHJpZ2dlckZybUludDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFsbG9jYXRlIGludGVybmFsIHJlc291cmNlcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19wa3RfZ2V0X3BhY2tldCgmcFRMQ2ItPnZvc0R1bW15QnVmLCBWT1NfUEtUX1RZUEVfUlhfUkFXLCAxLCAxLAogICAgICAgICAgICAgICAgICAgICAxLyp0cnVlKi8sTlVMTCwgTlVMTCk7CgogIFdMQU5UTF9Jbml0QkFSZW9yZGVyQnVmZmVyKHB2b3NHQ3R4KTsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgLyogSW5pdGlhbGl6ZSBIYW5kb2ZmIHN1cHBvcnQgbW9kdWUKICAgICogUlNTSSBtZWFzdXJlIGFuZCBUcmFmZmljIHN0YXRlIG1vbml0b3JpbmcgKi8KICBzdGF0dXMgPSBXTEFOVExfSFNJbml0KHB2b3NHQ3R4KTsKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIkhhbmRvZmYgc3VwcG9ydCBtb2R1bGUgaW5pdCBmYWlsIikpOwogICAgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkocFRMQ2ItPmF0bFNUQUNsaWVudHMpOwogICAgdm9zX21lbV9mcmVlKHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCk7CiAgICB2b3NfZnJlZV9jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCBwVExDYik7CiAgICByZXR1cm4gc3RhdHVzOwogIH0KI2VuZGlmCgogIHBUTENiLT5pc0JNUFMgPSBWT1NfRkFMU0U7CiAgcG1jUmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCggc21lQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUG93ZXJTdGF0ZUNoYW5nZWRDQiwgcHZvc0dDdHggKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9PcGVuICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TdGFydAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IEhERCBhcyBwYXJ0IG9mIHRoZSBvdmVyYWxsIHN0YXJ0IHByb2NlZHVyZS4gVEwgd2lsbCB1c2UgdGhpcwogICAgY2FsbCB0byByZWdpc3RlciB3aXRoIEJBTCBhcyBhIHRyYW5zcG9ydCBsYXllciBlbnRpdHkuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgIE90aGVyIGNvZGVzIGNhbiBiZSByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBhIEJBTCBmYWlsdXJlOyBzZWUgQkFMIEFQSQogICAgZm9yIG1vcmUgaW5mbwoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TdGFydAooCiAgdl9QVk9JRF90ICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiICAgICAgPSBOVUxMOwogIHZfVTMyX3QgICAgICAgICAgICAgdVJlc0NvdW50ID0gV0RBX1RMSV9NSU5fUkVTX0RBVEE7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEVOVEVSKCk7CiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N0YXJ0IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZWdpc3RlciB3aXRoIFdEQSBhcyB0cmFuc3BvcnQgbGF5ZXIgY2xpZW50CiAgICBSZXF1ZXN0IHJlc291cmNlcyBmb3IgdHggZnJvbSBidXMKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOIFRMOldMQU5UTF9TdGFydCIpKTsKCiAgdGxUcmFjZUluaXQoKTsKICB2b3NTdGF0dXMgPSBXREFfRFNfUmVnaXN0ZXIoIHB2b3NHQ3R4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfVHhDb21wLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUnhGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0dldEZyYW1lcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX1Jlc291cmNlQ0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0RBX1RMSV9NSU5fUkVTX0RBVEEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHB2b3NHQ3R4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAmdVJlc0NvdW50ICk7IAoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCiAgICAgICAgICAgICAgICJXTEFOIFRMOlRMIGZhaWxlZCB0byByZWdpc3RlciB3aXRoIEJBTC9XREEsIEVycjogJWQiLAogICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICAvKiBFbmFibGUgdHJhbnNtaXNzaW9uICovCiAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMCk7CgogIHBUTENiLT51UmVzQ291bnQgPSB1UmVzQ291bnQ7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TdGFydCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU3RvcAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IEhERCB0byBzdG9wIG9wZXJhdGlvbiBpbiBUTCwgYmVmb3JlIGNsb3NlLiBUTCB3aWxsIHN1c3BlbmQgYWxsCiAgICBmcmFtZSB0cmFuc2ZlciBvcGVyYXRpb24gYW5kIHdpbGwgd2FpdCBmb3IgdGhlIGNsb3NlIHJlcXVlc3QgdG8gY2xlYW4gdXAKICAgIGl0cyByZXNvdXJjZXMuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TdG9wCigKICB2X1BWT0lEX3QgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgdl9VOF90ICAgICAgdWNJbmRleDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0b3AgVEwgYW5kIGVtcHR5IFN0YXRpb24gbGlzdAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfU3RvcCIpKTsKCiAgLyogRGlzYWJsZSB0cmFuc21pc3Npb24gKi8KICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAxKTsKCiAgaWYgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOwogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgPSBOVUxMOwogIH0KCiAgaWYgKCBOVUxMICE9IHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKQogIHsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKICAgIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgPSBOVUxMOwogIH0KCiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IFdMQU5UTF9IU1N0b3AocHZvc0dDdHgpKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAiSGFuZG9mZiBTdXBwb3J0IG1vZHVsZSBzdG9wIGZhaWwiKSk7CiAgfQojZW5kaWYKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGVhbiBjbGllbnQgc3RhdGlvbnMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9TVEFfQ09VTlQ7IHVjSW5kZXgrKykKICB7CiAgICBpZiAoIE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0gKQogICAgewogICAgICAgIFdMQU5UTF9DbGVhblNUQShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSwgMSAvKmVtcHR5IGFsbCBxdWV1ZXMqLyk7CiAgICB9CiAgfQoKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TdG9wICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9DbG9zZQoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IEhERCBkdXJpbmcgZ2VuZXJhbCBkcml2ZXIgY2xvc2UgcHJvY2VkdXJlLiBUTCB3aWxsIGNsZWFuIHVwCiAgICBhbGwgdGhlIGludGVybmFsIHJlc291cmNlcy4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0Nsb3NlCigKICB2X1BWT0lEX3QgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgdEhhbEhhbmRsZSBzbWVDb250ZXh0OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBFTlRFUigpOwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBEZXJlZ2lzdGVyIGZyb20gUE1DCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgc21lQ29udGV4dCA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgcHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBzbWVDb250ZXh0ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgc21lQ29udGV4dCIsIF9fZnVuY19fKSk7CiAgICAvLyBjb250aW51ZSBzbyB0aGF0IHdlIGNhbiBjbGVhbnVwIGFzIG11Y2ggYXMgcG9zc2libGUKICB9CiAgZWxzZQogIHsKICAgIHBtY0RlcmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCggc21lQ29udGV4dCwgV0xBTlRMX1Bvd2VyU3RhdGVDaGFuZ2VkQ0IgKTsKICB9CgojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXTEFOVExfSFNEZUluaXQocHZvc0dDdHgpKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAiSGFuZG9mZiBTdXBwb3J0IG1vZHVsZSBEZUluaXQgZmFpbCIpKTsKICB9CiNlbmRpZgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYW51cCBUTCBjb250cm9sIGJsb2NrLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDogV0xBTlRMX0Nsb3NlIikpOwogIFdMQU5UTF9DbGVhbkNCKHBUTENiLCAxIC8qIGVtcHR5IHF1ZXVlcy9saXN0cy9wa3RzIGlmIGFueSovKTsKCiAgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkocFRMQ2ItPmF0bFNUQUNsaWVudHMpOwoKICB2b3NfbWVtX2ZyZWUocFRMQ2ItPnJlb3JkZXJCdWZmZXJQb29sKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZyZWUgVEwgY29udGV4dCBmcm9tIFZPU1MgZ2xvYmFsCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX2ZyZWVfY29udGV4dChwdm9zR0N0eCwgVk9TX01PRFVMRV9JRF9UTCwgcFRMQ2IpOwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfQ2xvc2UgKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSU5URVJBQ1RJT04gV0lUSCBIREQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NvbmZpZ3VyZVN3RnJhbWVUWFhsYXRpb25Gb3JBbGwKCiAgREVTQ1JJUFRJT04KICAgICBGdW5jdGlvbiB0byBkaXNhYmxlL2VuYWJsZSBmcmFtZSB0cmFuc2xhdGlvbiBmb3IgYWxsIGFzc29jaWF0aW9uIHN0YXRpb25zLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwogICBJTgogICAgcHZvc0dDdHg6IFZPUyBjb250ZXh0IAogICAgRW5hYmxlRnJhbWVYbGF0aW9uIFRSVUUgbWVhbnMgZW5hYmxlIFNXIHRyYW5zbGF0aW9uIGZvciBhbGwgc3RhdGlvbnMuCiAgICAuCgogIFJFVFVSTiBWQUxVRQoKICAgdm9pZC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2b2lkCldMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsCigKICB2X1BWT0lEX3QgcHZvc0dDdHgsIAogIHZfQk9PTF90IGVuYWJsZUZyYW1lWGxhdGlvbgopCnsKICB2X1U4X3QgdWNJbmRleDsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gIgogICAgICAgICAgICJXTEFOVExfQ29uZmlndXJlU3dGcmFtZVRYWGxhdGlvbkZvckFsbCIpKTsKICAgIHJldHVybjsKICB9CgogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICJXTEFOVExfQ29uZmlndXJlU3dGcmFtZVRYWGxhdGlvbkZvckFsbDogQ29uZmlndXJlIFNXIGZyYW1lWGxhdGlvbiAlZCIsIAogICAgICBlbmFibGVGcmFtZVhsYXRpb24pKTsKCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9USUQ7IHVjSW5kZXgrKykgCiAgewogICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdOwogICAgaWYgKCBOVUxMICE9IHBDbGllbnRTVEEgJiYgMCAhPSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgICB7CiNpZmRlZiBXTEFOX1NPRlRBUF9WU1RBX0ZFQVRVUkUKICAgICAgLy8gaWYgdGhpcyBzdGF0aW9uIHdhcyBub3QgYWxsb2NhdGVkIHJlc291cmNlcyB0byBwZXJmb3JtIEhXLWJhc2VkCiAgICAgIC8vIFRYIGZyYW1lIHRyYW5zbGF0aW9uIHRoZW4gZm9yY2UgU1ctYmFzZWQgVFggZnJhbWUgdHJhbnNsYXRpb24KICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgZnJhbWUgdHJhbnNsYXRpb24gc3VwcGxpZWQgYnkgdGhlIGNsaWVudAogICAgICBpZiAoIVdEQV9Jc0h3RnJhbWVUeFRyYW5zbGF0aW9uQ2FwYWJsZShwdm9zR0N0eCwgdWNJbmRleCkpCiAgICAgIHsKICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gPSAxOwogICAgICB9CiAgICAgIGVsc2UKI2VuZGlmCiAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gZW5hYmxlRnJhbWVYbGF0aW9uOwogICAgfQogIH0KfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZwoKICBERVNDUklQVElPTgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc2sgc2VyaWFsaXphdGlvbiB0aHJvdWdoIFRYIHRocmVhZCBvZiB0aGUgICAKICAgIGNhY2hlZCBmcmFtZSBmb3J3YXJkaW5nIChpZiBzdGF0YXRpb24gaGFzIGJlZW4gcmVnaXN0ZXJlZCBpbiB0aGUgbWVhbiB3aGlsZSkgCiAgICBvciBmbHVzaGluZyAoaWYgc3RhdGlvbiBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGUgdGltZSkKCiAgICBJbiBjYXNlIG9mIGZvcndhcmRpbmcsIHVwcGVyIGxheWVyIGlzIG9ubHkgcmVxdWlyZWQgdG8gY2FsbCBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQoKQogICAgYW5kIGRvZXNuJ3QgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZXhwbGljaXRseS4gVEwgd2lsbCBoYW5kbGUgdGhpcyBpbnNpZGUgCiAgICBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQoKS4gCiAgICAKICAgIEluIGNhc2Ugb2YgZmx1c2hpbmcsIHVwcGVyIGxheWVyIGlzIHJlcXVpcmVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBleHBsaWNpdGx5CiAgICAKICBERVBFTkRFTkNJRVMKCiAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgIAogIFBBUkFNRVRFUlMKCiAgIHVjU1RBSWQ6ICAgc3RhdGlvbiBpZCAKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KICAgIFBsZWFzZSBjaGVjayByZXR1cm4gdmFsdWVzIG9mIHZvc190eF9tcV9zZXJpYWxpemUuCgogIFNJREUgRUZGRUNUUwogICAgSWYgVEwgd2FzIGFza2VkIHRvIHBlcmZvcm0gV0xBTlRMX0NhY2hlU1RBRnJhbWUoKSBpbiBXTEFOVExfUnhGcmFtZXMoKSwgCiAgICBlaXRoZXIgV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50KCkgb3IgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCAKICAgIHdpdGhpbiByZWFzb25hYmxlIHRpbWUuIE90aGVyd2lzZSwgVEwgd2lsbCBrZWVwIGNhY2hlZCB2b3MgYnVmZmVyIHVudGlsCiAgICBvbmUgb2YgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGFuZCBtYXkgZW5kIHVwIHdpdGggc3lzdGVtIGJ1ZmZlciBleGhhc3V0aW9uLiAKCiAgICBJdCdzIGFuIHVwcGVyIGxheWVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGNhc2Ugb2YKICAgIGZsdXNoaW5nCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KClZPU19TVEFUVVMgCldMQU5UTF9TdGFydEZvcndhcmRpbmcKKAogIHZfVThfdCB1Y1NUQUlkLAogIHZfVThfdCB1Y1VjYXN0U2lnLCAKICB2X1U4X3QgdWNCY2FzdFNpZyAKKQp7CiAgdm9zX21zZ190ICAgICAgc01lc3NhZ2U7CiAgdl9VMzJfdCAgICAgICAgdURhdGE7ICAgICAgICAgICAgIAogLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KCiAgLyogU2lnbmFsIHRoZSBPUyB0byBzZXJpYWxpemUgb3VyIGV2ZW50ICovCiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICJTZXJpYWxpemluZyBUTCBTdGFydCBGb3J3YXJkaW5nIENhY2hlZCBmb3IgY29udHJvbCBTVEEgJWQiLCAKICAgICAgICAgICAgICB1Y1NUQUlkICk7CgogIHZvc19tZW1femVybyggJnNNZXNzYWdlLCBzaXplb2Yodm9zX21zZ190KSApOwoKICB1RGF0YSA9IHVjU1RBSWQgfCAodWNVY2FzdFNpZyA8PCA4ICkgfCAodWNCY2FzdFNpZyA8PCAxNik7IAogIHNNZXNzYWdlLmJvZHl2YWwgPSB1RGF0YTsKICBzTWVzc2FnZS50eXBlICAgID0gV0xBTlRMX1JYX0ZXRF9DQUNIRUQ7CgogIHJldHVybiB2b3NfcnhfbXFfc2VyaWFsaXplKFZPU19NUV9JRF9UTCwgJnNNZXNzYWdlKTsKCn0gLyogV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZygpICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfRW5hYmxlQ2FjaGluZwoKICBERVNDUklQVElPTgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBlbmFibGUgY2FjaGluZyBvbmx5IHdoZW4gYXNzb2MvcmVhc3NvYyByZXEgaXMgc2VuZC4KICAgIHRoYXQgaXMgY2FjaGUgcGFja2V0cyBvbmx5IGZvciBzdWNoIFNUQSBJRC4KCgogIERFUEVOREVOQ0lFUwoKICAgIFRMIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKCiAgUEFSQU1FVEVSUwoKICAgc3RhSWQ6ICAgc3RhdGlvbiBpZAoKICBSRVRVUk4gVkFMVUUKCiAgIG5vbmUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2b2lkIFdMQU5UTF9FbmFibGVDYWNoaW5nKHZfVThfdCBzdGFJZCkKewogIHZfUFZPSURfdCBwdm9zR0N0eD0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLE5VTEwpOwogIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gIgogICAgICAgICAgICJXTEFOVExfRW5hYmxlQ2FjaGluZyIpKTsKICAgIHJldHVybjsKICB9CiAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhSWRdLT5lbmFibGVDYWNoaW5nID0gMTsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0Fzc29jRmFpbGVkCgogIERFU0NSSVBUSU9OCgogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IFBFIHRvIG5vdGlmeSBUTCB0aGF0IGNhY2hlIG5lZWRzIHRvIGZsdXNoZWQnIAogICAgd2hlbiBhc3NvY2lhdGlvbiBpcyBub3Qgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAKCiAgICBJbnRlcm5hbGx5LCBUTCBwb3N0IGEgbWVzc2FnZSB0byBUWF9UaHJlYWQgdG8gc2VyaWFsaXplIHRoZSByZXF1ZXN0IHRvIAogICAga2VlcCBsb2NrLWZyZWUgbWVjaGFuaXNtLgoKICAgCiAgREVQRU5ERU5DSUVTCgogICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogICAKICBQQVJBTUVURVJTCgogICB1Y1NUQUlkOiAgIHN0YXRpb24gaWQgCgogIFJFVFVSTiBWQUxVRQoKICAgbm9uZQogICAKICBTSURFIEVGRkVDVFMKICAgVGhlcmUgbWF5IGJlIHJhY2UgY29uZGl0aW9uIHRoYXQgUEUgY2FsbCB0aGlzIEFQSSBhbmQgc2VuZCBhbm90aGVyIGFzc29jaWF0aW9uCiAgIHJlcXVlc3QgaW1tZWRpYXRlbHkgd2l0aCBzYW1lIHN0YUlkIGJlZm9yZSBUWF90aHJlYWQgY2FuIHByb2Nlc3MgdGhlIG1lc3NhZ2UuCgogICBUbyBhdm9pZCB0aGlzLCB3ZSBtaWdodCBuZWVkIFBFIHRvIHdhaXQgZm9yIFRYX3RocmVhZCBwcm9jZXNzIHRoZSBtZXNzYWdlLAogICBidXQgdGhpcyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiAKICAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2b2lkIFdMQU5UTF9Bc3NvY0ZhaWxlZCh2X1U4X3Qgc3RhSWQpCnsKICAvLyBmbHVzaGluZyBmcmFtZXMgYW5kIGZvcndhcmRpbmcgZnJhbWVzIHVzZXMgdGhlIHNhbWUgbWVzc2FnZQogIC8vIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkCiAgLy8gaWYgdGhlIFNUQSBleGlzdCwgdGhlIGZyYW1lcyB3aWxsIGJlIGZvcndhcmRlZAogIC8vIGFuZCBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGUgZnJhbWVzIHdpbGwgYmUgZmx1c2hlZAogIC8vIGluIHRoaXMgY2FzZSB3ZSBrbm93IGl0IHdvbid0IGV4aXN0IHNvIHRoZSBEUFUgaW5kZXggc2lnbmF0dXJlIHZhbHVlcyBkb24ndCBtYXR0ZXIKICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfQVNTT0NfRkFJTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFJZCwgMCkpOwoKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKFdMQU5UTF9TdGFydEZvcndhcmRpbmcoc3RhSWQsMCwwKSkpCiAgewogICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICIgJXMgZmFpbHMgdG8gc3RhcnQgZm9yd2FyZGluZyAoc3RhSWQgJWQpIiwgX19mdW5jX18sIHN0YUlkKTsKICB9Cn0KICAKICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgV0xBTlRMX0ZpbmlzaF9VTEEKCiAgREVTQ1JJUFRJT04KICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgSEREIHRvIG5vdGlmeSBUTCB0byBmaW5pc2ggVXBwZXIgbGF5ZXIgYXV0aGVudGljYXRpb24KICAgICBpbmNhc2UgdGhlIGxhc3QgRUFQT0wgcGFja2V0IGlzIHBlbmRpbmcgaW4gdGhlIFRMIHF1ZXVlLiAKICAgICBUbyBhdm9pZCB0aGUgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBzbWUgc2V0IGtleSBhbmQgdGhlIGxhc3QgRUFQT0wgcGFja2V0IAogICAgIHRoZSBIREQgbW9kdWxlIGNhbGxzIHRoaXMgZnVuY3Rpb24ganVzdCBiZWZvcmUgY2FsbGluZyB0aGUgc21lX1JvYW1TZXRLZXkuCgogIERFUEVOREVOQ0lFUwoKICAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KICAKICBQQVJBTUVURVJTCgogICBjYWxsYmFja1JvdXRpbmU6ICAgSEREIENhbGxiYWNrIGZ1bmN0aW9uLgogICBjYWxsYmFja0NvbnRleHQgOiBIREQgdXNlcmRhdGEgY29udGV4dC4KICAKICAgUkVUVVJOIFZBTFVFCgogICBWT1NfU1RBVFVTX1NVQ0NFU1MvVk9TX1NUQVRVU19GQUlMVVJFCiAgIAogIFNJREUgRUZGRUNUUwogICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTIFdMQU5UTF9GaW5pc2hfVUxBKCB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0KQp7CiAgIHJldHVybiBXREFfRFNfRmluaXNoVUxBKCBjYWxsYmFja1JvdXRpbmUsIGNhbGxiYWNrQ29udGV4dCk7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQKCiAgREVTQ1JJUFRJT04KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgSEREIHRvIHJlZ2lzdGVyIGFzIGEgY2xpZW50IGZvciBkYXRhIHNlcnZpY2VzCiAgICB3aXRoIFRMLiBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIGZvciBlYWNoIG5ldyBzdGF0aW9uIHRoYXQgaXQgYWRkcywKICAgIHRodXMgaGF2aW5nIHRoZSBmbGV4aWJpbGl0eSBvZiByZWdpc3RlcmluZyBkaWZmZXJlbnQgY2FsbGJhY2sgZm9yIGVhY2gKICAgIFNUQSBpdCBzZXJ2aWNlcy4KCiAgREVQRU5ERU5DSUVTCgogICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogICAgUmVzdHJpY3Rpb246CiAgICAgIE1haW4gdGhyZWFkIHdpbGwgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgdGhhdCBUeCBhbmQgUnggdGhyZWFkcyB0aHVzCiAgICAgIGd1YXJhbnRlZWluZyB0aGF0IGEgc3RhdGlvbiB3aWxsIGJlIGFkZGVkIGJlZm9yZSBhbnkgZGF0YSBjYW4gYmUKICAgICAgcmVjZWl2ZWQgZm9yIGl0LiAoVGhpcyBlbmFibGVzIFRMIHRvIGJlIGxvY2sgZnJlZSkKCiAgUEFSQU1FVEVSUwoKICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICBwZm5TdEFSeDogICAgICAgIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHJlY2VpdmUgcGFja2V0IGhhbmRsZXIgZnJvbSBIREQKICAgcGZuU1RBVHhDb21wOiAgICBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSB0cmFuc21pdCBjb21wbGV0ZSBjb25maXJtYXRpb24KICAgICAgICAgICAgICAgICAgICBoYW5kbGVyIGZyb20gSERECiAgIHBmblNUQUZldGNoUGt0OiAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgcGFja2V0IHJldHJpZXZhbCByb3V0aW5lIGluIEhERAogICB3U1RBRGVzY1R5cGU6ICAgIFNUQSBEZXNjcmlwdG9yLCBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZQogICAgICAgICAgICAgICAgICAgIG5ldyBhZGRlZCBTVEEKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6IElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgV0xBTlRMX1NUQVJ4Q0JUeXBlICAgICAgICBwZm5TVEFSeCwKICBXTEFOVExfVHhDb21wQ0JUeXBlICAgICAgIHBmblNUQVR4Q29tcCwKICBXTEFOVExfU1RBRmV0Y2hQa3RDQlR5cGUgIHBmblNUQUZldGNoUGt0LAogIFdMQU5fU1RBRGVzY1R5cGUqICAgICAgICAgcHdTVEFEZXNjVHlwZSwKICB2X1M3X3QgICAgICAgICAgICAgICAgICAgIHJzc2kKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgdl9VOF90ICAgIHVjVGlkID0gMDsvKkxvY2FsIHZhcmlhYmxlIHRvIGNsZWFyIHByZXZpb3VzIHJlcGxheSBjb3VudGVycyBvZiBTVEEgb24gYWxsIFRJRHMqLwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBpZiAoKCBOVUxMID09IHB3U1RBRGVzY1R5cGUgKSB8fCAoIE5VTEwgPT0gcGZuU1RBUnggKSB8fAogICAgICAoIE5VTEwgPT0gcGZuU1RBRmV0Y2hQa3QgKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvL0NvZGUgZm9yIGNoZWNraW5nIGFuZCBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgbmV3IFNUQQogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSApewogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSA9IHZvc19tZW1fbWFsbG9jKHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkpOwogICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0gKXsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOiBTVEEgQ2xpZW50IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBpbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICAgIH0KICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICJXTEFOIFRMOiBTVEEgQ2xpZW50IG1lbW9yeSBhbGxvY2F0aW9uIGluIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSxzaXplb2YoV0xBTlRMX1NUQUNsaWVudFR5cGUpKTsKICB9CgogIC8vQXNzaWduaW5nIHRoZSBwb2ludGVyIHRvIGxvY2FsIHZhcmlhYmxlIGZvciBlYXN5IGFjY2VzcyBpbiBmdXR1cmUKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF07CiAgaWYgKCAwICE9IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBwQ2xpZW50U1RBLT51Y0V4aXN0cysrOwogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVnaXN0ZXIgc3RhdGlvbiB3aXRoIFRMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX1JFR0lTVEVSX1NUQV9DTElFTlQsCiAgICAgICAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAodW5zaWduZWQgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKihwd1NUQURlc2NUeXBlLT52U1RBTUFDQWRkcmVzcy5ieXRlcysyKTw8MjQgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwd1NUQURlc2NUeXBlLT52U1RBTUFDQWRkcmVzcy5ieXRlcyszKTw8MTYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwd1NUQURlc2NUeXBlLT52U1RBTUFDQWRkcmVzcy5ieXRlcys0KTw8OCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB3U1RBRGVzY1R5cGUtPnZTVEFNQUNBZGRyZXNzLmJ5dGVzKzUpKSkpOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQiLCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkICkpOwoKICBwQ2xpZW50U1RBLT5wZm5TVEFSeCAgICAgICA9IHBmblNUQVJ4OwogIHBDbGllbnRTVEEtPnBmblNUQUZldGNoUGt0ID0gcGZuU1RBRmV0Y2hQa3Q7CgogIC8qIE9ubHkgcmVnaXN0ZXIgaWYgZGlmZmVyZW50IGZyb20gTlVMTCAtIFRMIGRlZmF1bHQgVHggQ29tcCBDYiB3aWxsCiAgICByZWxlYXNlIHRoZSB2b3MgcGFja2V0ICovCiAgaWYgKCBOVUxMICE9IHBmblNUQVR4Q29tcCApCiAgewogICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wICAgPSBwZm5TVEFUeENvbXA7CiAgfQoKICBwQ2xpZW50U1RBLT50bFN0YXRlICA9IFdMQU5UTF9TVEFfSU5JVDsKICBwQ2xpZW50U1RBLT50bFByaSAgICA9IFdMQU5UTF9TVEFfUFJJX05PUk1BTDsKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1NUQUlkICA9IHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQ7CiAgcENsaWVudFNUQS0+cHRrSW5zdGFsbGVkID0gMDsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIHdpdGggVUMgJWQgYW5kIEJDICVkIiwgCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKICAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1VjYXN0U2lnLCBwd1NUQURlc2NUeXBlLT51Y0JjYXN0U2lnKSk7CgogIHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlID0gcHdTVEFEZXNjVHlwZS0+d1NUQVR5cGU7CgogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCA9IHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZDsKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNBZGRSbXZMTEMgPSBwd1NUQURlc2NUeXBlLT51Y0FkZFJtdkxMQzsKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNQcm90ZWN0ZWRGcmFtZSA9IHB3U1RBRGVzY1R5cGUtPnVjUHJvdGVjdGVkRnJhbWU7CgojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNFc2VTdGEgPSBwd1NUQURlc2NUeXBlLT51Y0lzRXNlU3RhOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQgUW9TICVkIEFkZCBMTEMgJWQgUHJvdEZyYW1lICVkIEVzZVN0YSAlZCIsCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZCwKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjQWRkUm12TExDLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNQcm90ZWN0ZWRGcmFtZSwKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjSXNFc2VTdGEpKTsKI2Vsc2UKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIFFvUyAlZCBBZGQgTExDICVkIFByb3RGcmFtZSAlZCIsIAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCwgCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1Fvc0VuYWJsZWQsCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y0FkZFJtdkxMQywKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjUHJvdGVjdGVkRnJhbWUpKTsKCiNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9FU0UKI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQogIC8vIGlmIHRoaXMgc3RhdGlvbiB3YXMgbm90IGFsbG9jYXRlZCByZXNvdXJjZXMgdG8gcGVyZm9ybSBIVy1iYXNlZAogIC8vIFRYIGZyYW1lIHRyYW5zbGF0aW9uIHRoZW4gZm9yY2UgU1ctYmFzZWQgVFggZnJhbWUgdHJhbnNsYXRpb24KICAvLyBvdGhlcndpc2UgdXNlIHRoZSBmcmFtZSB0cmFuc2xhdGlvbiBzdXBwbGllZCBieSB0aGUgY2xpZW50CgogIGlmICghV0RBX0lzSHdGcmFtZVR4VHJhbnNsYXRpb25DYXBhYmxlKHB2b3NHQ3R4LCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkKQogICAgICB8fCAoIFdMQU5fU1RBX0JUX0FNUCA9PSBwd1NUQURlc2NUeXBlLT53U1RBVHlwZSkpCiAgewogICAgICBwd1NUQURlc2NUeXBlLT51Y1N3RnJhbWVUWFhsYXRpb24gPSAxOwogIH0KI2VuZGlmCgogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IHB3U1RBRGVzY1R5cGUtPnVjU3dGcmFtZVRYWGxhdGlvbjsKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24gPSBwd1NUQURlc2NUeXBlLT51Y1N3RnJhbWVSWFhsYXRpb247CgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0lzV2FwaVN0YSA9IHB3U1RBRGVzY1R5cGUtPnVjSXNXYXBpU3RhOwojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KCiAgdm9zX2NvcHlfbWFjYWRkciggJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzLCAmcHdTVEFEZXNjVHlwZS0+dlNUQU1BQ0FkZHJlc3MpOwoKICB2b3NfY29weV9tYWNhZGRyKCAmcENsaWVudFNUQS0+d1NUQURlc2MudkJTU0lEZm9ySUJTUywgJnB3U1RBRGVzY1R5cGUtPnZCU1NJRGZvcklCU1MpOwoKICB2b3NfY29weV9tYWNhZGRyKCAmcENsaWVudFNUQS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzLCAmcHdTVEFEZXNjVHlwZS0+dlNlbGZNQUNBZGRyZXNzKTsKCiAgLyogSW4gdm9sYW5zIHJlbGVhc2UgTCByZXBsYXkgY2hlY2sgaXMgZG9uZSBhdCBUTCAqLwogIHBDbGllbnRTVEEtPnVjSXNSZXBsYXlDaGVja1ZhbGlkID0gcHdTVEFEZXNjVHlwZS0+dWNJc1JlcGxheUNoZWNrVmFsaWQ7CiAgcENsaWVudFNUQS0+dWxUb3RhbFJlcGxheVBhY2tldHNEZXRlY3RlZCA9ICAwOwovKkNsZWFyIHJlcGxheSBjb3VudGVycyBvZiB0aGUgU1RBIG9uIGFsbCBUSURzKi8KICBmb3IodWNUaWQgPSAwOyB1Y1RpZCA8IFdMQU5UTF9NQVhfVElEIDsgdWNUaWQrKykKICB7CiAgICBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9ICAwOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBTZXQgdGhlIEFDIGZvciB0aGUgcmVnaXN0ZXJlZCBzdGF0aW9uIHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IEFDCiAgICAgIEV2ZW4gaWYgdGhpcyBBQyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzdGF0aW9uLCBjb3JyZWN0aW9uIHdpbGwgYmUKICAgICAgbWFkZSBpbiB0aGUgbWFpbiBUTCBsb29wIGFmdGVyIHRoZSBzdXBwb3J0ZWQgbWFzayBpcyBwcm9wZXJseQogICAgICB1cGRhdGVkIGluIHRoZSBwZW5kaW5nIHBhY2tldHMgY2FsbAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnVjQ3VycmVudEFDICAgICA9IFdMQU5UTF9BQ19WTzsKICBwQ2xpZW50U1RBLT51Y0N1cnJlbnRXZWlnaHQgPSAwOwogIHBDbGllbnRTVEEtPnVjU2VydmljZWRBQyAgICA9IFdMQU5UTF9BQ19CSzsKICBwQ2xpZW50U1RBLT51Y0VhcG9sUGt0UGVuZGluZyA9IDA7CgogIHZvc19tZW1femVybyggcENsaWVudFNUQS0+YXVjQUNNYXNrLCBzaXplb2YocENsaWVudFNUQS0+YXVjQUNNYXNrKSk7CgogIHZvc19tZW1femVybyggJnBDbGllbnRTVEEtPndVQVBTREluZm8sIHNpemVvZihwQ2xpZW50U1RBLT53VUFQU0RJbmZvKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlb3JkZXJpbmcgaW5mbyBhbmQgQU1TRFUgZGUtYWdncmVnYXRpb24KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfbWVtX3plcm8oIHBDbGllbnRTVEEtPmF0bEJBUmVvcmRlckluZm8sCiAgICAgc2l6ZW9mKHBDbGllbnRTVEEtPmF0bEJBUmVvcmRlckluZm9bMF0pKgogICAgIFdMQU5fTUFYX1RJRCk7CgogIHZvc19tZW1femVybyggcENsaWVudFNUQS0+YXVjTVBEVUhlYWRlciwKICAgICAgICAgICAgICAgIFdMQU5UTF9NUERVX0hFQURFUl9MRU4pOwoKICBwQ2xpZW50U1RBLT51Y01QRFVIZWFkZXJMZW4gICA9IDA7CiAgcENsaWVudFNUQS0+dm9zQU1TRFVDaGFpbiAgICAgPSBOVUxMOwogIHBDbGllbnRTVEEtPnZvc0FNU0RVQ2hhaW5Sb290ID0gTlVMTDsKCgogIC8qIFJlb3JkZXIgTE9DSwogICAqIER1cmluZyBoYW5kbGUgbm9ybWFsIFJYIGZyYW1lIHdpdGhpbiBSWCB0aHJlYWQsCiAgICogaWYgTUMgdGhyZWFkIHRyeSB0byBwcmVlbXB0LCBBRERCQSwgREVMQkEsIFRJTUVSCiAgICogQ29udGV4dCBzaG91bGQgYmUgcHJvdGVjdGVkIGZyb20gcmFjZSAqLwogIGZvciAodWNUaWQgPSAwOyB1Y1RpZCA8IFdMQU5fTUFYX1RJRCA7IHVjVGlkKyspCiAgewogICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoCiAgICAgICAgdm9zX2xvY2tfaW5pdCgmcENsaWVudFNUQS0+YXRsQkFSZW9yZGVySW5mb1t1Y1RpZF0ucmVvcmRlckxvY2spKSkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJMb2NrIEluaXQgRmFpbCIpKTsKICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RhdHMgaW5mbwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19tZW1femVybyggcENsaWVudFNUQS0+YXVSeENvdW50LAogICAgICBzaXplb2YocENsaWVudFNUQS0+YXVSeENvdW50WzBdKSoKICAgICAgV0xBTl9NQVhfVElEKTsKCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdVR4Q291bnQsCiAgICAgIHNpemVvZihwQ2xpZW50U1RBLT5hdVJ4Q291bnRbMF0pKgogICAgICBXTEFOX01BWF9USUQpOwogIC8qIEluaXRpYWwgUlNTSSBpcyBhbHdheXMgcmVwb3J0ZWQgYXMgemVybyBiZWNhdXNlIFRMIGRvZXNudCBoYXZlIGVub3VnaAogICAgIGRhdGEgdG8gY2FsY3VsYXRlIFJTU0kuIFNvIHRvIGF2b2lkIHJlcG9ydGluZyB6ZXJvLCB3ZSBhcmUgaW5pdGlhbGl6aW5nCiAgICAgUlNTSSB3aXRoIFJTU0kgc2F2ZWQgaW4gQnNzRGVzY3JpcHRpb24gZHVyaW5nIHNjYW5uaW5nLiAqLwogIHBDbGllbnRTVEEtPnJzc2lBdmcgPSByc3NpOwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZihXTEFOX1NUQV9URExTID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKQogIHsKICAgIC8qIElmIGNsaWVudCBpcyBURExTLCB1c2UgVERMUyBzcGVjaWZpYyBhbHBoYSAqLwogICAgcENsaWVudFNUQS0+cnNzaUFscGhhID0gV0xBTlRMX0hPX1RETFNfQUxQSEE7CiAgfQogIGVsc2UKICB7CiAgICBwQ2xpZW50U1RBLT5yc3NpQWxwaGEgPSBXTEFOVExfSE9fREVGQVVMVF9BTFBIQTsKICB9CiNlbHNlCiAgICBwQ2xpZW50U1RBLT5yc3NpQWxwaGEgPSBXTEFOVExfSE9fREVGQVVMVF9BTFBIQTsKI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9URExTICovCiNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUwogIHBDbGllbnRTVEEtPnJzc2lEYXRhQWxwaGEgPSBXTEFOVExfSE9fREVGQVVMVF9BTFBIQTsKICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzBdLmFjID0gV0xBTlRMX0FDX0JLOwogIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMV0uYWMgPSBXTEFOVExfQUNfQkU7CiAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1syXS5hYyA9IFdMQU5UTF9BQ19WSTsKICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzNdLmFjID0gV0xBTlRMX0FDX1ZPOwojZW5kaWYKCiAgLypUeCBub3Qgc3VzcGVuZGVkIGFuZCBzdGF0aW9uIGZ1bGx5IHJlZ2lzdGVyZWQqLwogIHZvc19hdG9taWNfc2V0X1U4KAogICAgICAgICZwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkLCAwKTsKCiAgLyogVXNlZCB1bnRpbCBtdWx0aXBsZSBzdGF0aW9uIHN1cHBvcnQgd2lsbCBiZSBhZGRlZCovCiAgcFRMQ2ItPnVjUmVnaXN0ZXJlZFN0YUlkID0gcHdTVEFEZXNjVHlwZS0+dWNTVEFJZDsKCiAgLyogU2F2ZSB0aGUgQkFQIHN0YXRpb24gSUQgZm9yIGZ1dHVyZSB1c2FnZSAqLwogIGlmICggV0xBTl9TVEFfQlRfQU1QID09IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlICkKICB7CiAgICBwVExDYi0+dGxCQVBDbGllbnQudWNCQVBTVEFJZCA9IHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RhdGlzdGljcyBpbmZvIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIG1lbXNldCgmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MsCiAgICAgICAgIDAsIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGFydCB3aXRoIHRoZSBzdGF0ZSBzdWdnZXN0ZWQgYnkgY2xpZW50IGNhbGxlcgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnRsU3RhdGUgPSBwd1NUQURlc2NUeXBlLT51Y0luaXRTdGF0ZTsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBZnRlciBhbGwgdGhlIGluaXQgaXMgY29tcGxldGUgd2UgY2FuIG1hcmsgdGhlIGV4aXN0YW5jZSBmbGFnIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+dWNFeGlzdHMrKzsKCiAgLy9mbG93IGNvbnRyb2wgZmllbGRzIGluaXQKICBwQ2xpZW50U1RBLT51Y0x3bU1vZGVFbmFibGVkID0gRkFMU0U7CiAgcENsaWVudFNUQS0+dWNMd21FdmVudFJlcG9ydGVkID0gRkFMU0U7CiAgcENsaWVudFNUQS0+Ym11TWVtQ29uc3VtZWQgPSAwOwogIHBDbGllbnRTVEEtPnVJbmdyZXNzX2xlbmd0aCA9IDA7CiAgcENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggPSBXTEFOVExfU1RBX0JNVV9USFJFU0hPTERfTUFYOwoKICBwQ2xpZW50U1RBLT51THdtVGhyZXNob2xkID0gV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWCAvIDM7CgogIC8vQEBAIEhERFNPRlRBUCBkb2VzIG5vdCBxdWV1ZSB1bnJlZ2lzdGVyZWQgcGFja2V0IGZvciBub3cKICBpZiAoIFdMQU5fU1RBX1NPRlRBUCAhPSBwd1NUQURlc2NUeXBlLT53U1RBVHlwZSApCiAgeyAKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIEZvcndhcmQgcmVjZWl2ZWQgZnJhbWVzIHdoaWxlIFNUQSB3YXMgbm90IHlldCByZWdpc3RlcmVkIAogICAgLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKFdMQU5UTF9TdGFydEZvcndhcmRpbmcoIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1VjYXN0U2lnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNCY2FzdFNpZykpKQogICAgewogICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiICVzIGZhaWxzIHRvIHN0YXJ0IGZvcndhcmRpbmciLCBfX2Z1bmNfXyk7CiAgICB9CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgaWYoIFdMQU5fU1RBX1RETFMgPT0gcHdTVEFEZXNjVHlwZS0+d1NUQVR5cGUgKQogICAgICAgIHBUTENiLT51Y1RkbHNQZWVyQ291bnQrKzsKI2VuZGlmCiAgfQogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9DbGVhclNUQUNsaWVudAoKICBERVNDUklQVElPTgoKICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgd2hlbiBpdCBubyBsb25nZXIgbmVlZHMgZGF0YSBzZXJ2aWNlcyBmb3IgdGhlCiAgICBwYXJ0aWN1bGFyIHN0YXRpb24uCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2xlYXIgcmVnaXN0cmF0aW9uIGlzCiAgICBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIHB2b3NHQ3R4OiAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRvIGJlIGNsZWFyZWQKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6IFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ2xlYXJTVEFDbGllbnQKKAogIHZfUFZPSURfdCAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgIHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsgCiAgdl9VOF90ICB1Y0luZGV4OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICBFTlRFUigpOwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ2xlYXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DbGVhclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0NsZWFyU1RBQ2xpZW50IikpOwogICAgLyogQ2xlYW4gcGFja2V0cyBjYWNoZWQgZm9yIHRoZSBTVEEgKi8KICAgIFdMQU5UTF9TdGFydEZvcndhcmRpbmcodWNTVEFJZCwwLDApOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKiBEZWxldGUgQkEgc2Vzc2lvbnMgb24gYWxsIFRJRCdzICovCiAgZm9yICh1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1RJRCA7IHVjSW5kZXgrKykKICB7CiAgICAgV0xBTlRMX0JhU2Vzc2lvbkRlbChwdm9zR0N0eCwgdWNTVEFJZCwgdWNJbmRleCk7CiAgICAgdm9zX2xvY2tfZGVzdHJveSgmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckxvY2spOwogIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIC8qIGRlY3JlbWVudCB1Y1RkbHNQZWVyQ291bnQgb25seSBpZiBpdCBpcyBub24temVybyAqLyAgCiAgaWYoV0xBTl9TVEFfVERMUyA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1NUQURlc2Mud1NUQVR5cGUKICAgICAgJiYgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCkKICAgICAgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudC0tOwojZW5kaWYKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFyIHN0YXRpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6Q2xlYXJpbmcgU1RBIENsaWVudCBJRDogJWQiLCB1Y1NUQUlkICkpOwogIFdMQU5UTF9DbGVhblNUQShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSwgMSAvKmVtcHR5IHBhY2tldHMqLyk7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpDbGVhcmluZyBTVEEgUmVzZXQgSGlzdG9yeSBSU1NJIGFuZCBSZWdpb24gbnVtYmVyIikpOwogIHBUTENiLT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGUuaGlzdG9yeVJTU0kgPSAwOwogIHBUTENiLT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGUucmVnaW9uTnVtYmVyID0gMDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9DbGVhclNUQUNsaWVudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NoYW5nZVNUQVN0YXRlCgogIERFU0NSSVBUSU9OCgogICAgSEREIHdpbGwgbWFrZSB0aGlzIG5vdGlmaWNhdGlvbiB3aGVuZXZlciBhIGNoYW5nZSBvY2N1cnMgaW4gdGhlCiAgICBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjaGFuZ2Ugc3RhdGUgY2FuIGJlCiAgICBjYWxsZWQuCgogICAgUkVTVFJJQ1RJT046IEEgc3RhdGlvbiBpcyBiZWluZyBub3RpZmllZCBhcyBhdXRoZW50aWNhdGVkIGJlZm9yZSB0aGUKICAgICAgICAgICAgICAgICBrZXlzIGFyZSBpbnN0YWxsZWQgaW4gSFcuIFRoaXMgd2F5IGlmIGEgZnJhbWUgaXMgcmVjZWl2ZWQKICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGtleXMgYXJlIGluc3RhbGxlZCBEUFUgd2lsbCBkcm9wIHRoYXQgZnJhbWUuCgogICAgTWFpbiB0aHJlYWQgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGF0IFR4IGFuZCBSeCB0aHJlYWRzIHRodXMgZ3VhcmFudGVlaW5nCiAgICB0aGUgZm9sbG93aW5nOgogICAgICAgIC0gYSBzdGF0aW9uIHdpbGwgYmUgaW4gYXNzb2Mgc3RhdGUgaW4gVEwgYmVmb3JlIFRMIHJlY2VpdmVzIGFueSBkYXRhCiAgICAgICAgICBmb3IgaXQKCiAgUEFSQU1FVEVSUwoKICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdGhhdCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbgogICB0bFNUQVN0YXRlOiAgICAgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gc3RhdGlvbgoKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DaGFuZ2VTVEFTdGF0ZQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9TVEFTdGF0ZVR5cGUgICB0bFNUQVN0YXRlCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIHRsU1RBU3RhdGUgPj0gV0xBTlRMX1NUQV9NQVhfU1RBVEUgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGFuZ2UgU1RBIHN0YXRlCiAgICBObyBuZWVkIHRvIGxvY2sgdGhpcyBvcGVyYXRpb24sIHNlZSByZXN0cmljdGlvbnMgYWJvdmUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6Q2hhbmdpbmcgc3RhdGUgZm9yIFNUQSBDbGllbnQgSUQ6ICVkIGZyb20gJWQgdG8gJWQiLAogICAgICAgICAgICAgdWNTVEFJZCwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnRsU3RhdGUsIHRsU1RBU3RhdGUpKTsKCiAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLAogICAgICAgICAgICAgICAgICAgVFJBQ0VfQ09ERV9UTF9TVEFfU1RBVEUsIHVjU1RBSWQsdGxTVEFTdGF0ZSApKTsKCiAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnRsU3RhdGUgPSB0bFNUQVN0YXRlOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0NoYW5nZVNUQVN0YXRlICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU1RBUHRrSW5zdGFsbGVkCgogIERFU0NSSVBUSU9OCgogICAgSEREIHdpbGwgbWFrZSB0aGlzIG5vdGlmaWNhdGlvbiB3aGVuZXZlciBQVEsgaXMgaW5zdGFsbGVkIGZvciB0aGUgU1RBCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2hhbmdlIHN0YXRlIGNhbiBiZQogICAgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSBmb3Igd2hpY2ggUGFpcndpc2Uga2V5IGlzCiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUHRrSW5zdGFsbGVkCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICBGTCgiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIpKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIEZMKCJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQiKSkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgRkwoIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCIpKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5wdGtJbnN0YWxsZWQgPSAxOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVB0a0luc3RhbGxlZCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFNUQVN0YXRlCgogIERFU0NSSVBUSU9OCgogICAgUmV0dXJucyBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIGl0cyBzdGF0ZSBjYW4gYmUgcmV0cmlldmVkLgoKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uCgogICAgT1VUCiAgICBwdGxTVEFTdGF0ZTogICAgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIHN0YXRpb24KCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0U1RBU3RhdGUKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfU1RBU3RhdGVUeXBlICAgKnB0bFNUQVN0YXRlCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHRsU1RBU3RhdGUgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0U1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0U1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldFNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfR2V0U1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBHZXQgU1RBIHN0YXRlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgKnB0bFNUQVN0YXRlID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnRsU3RhdGU7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0U1RBU3RhdGUgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9VcGRhdGVTVEFCc3NJZGZvcklCU1MKCiAgREVTQ1JJUFRJT04KICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgdG8gdXBkYXRlIHRoZSBCU1NJRCBmb3IgdGhpcyBTdGF0aW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBIREQgU2hvdWxkIHJlZ2lzdGVyZWQgdGhlIHN0YUlEIHdpdGggVEwgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgUG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIElOCiAgICB1Y1NUQUlkICAgICAgIFRoZSBTdGF0aW9uIElEIGZvciBCc3NpZCB0byBiZSB1cGRhdGVkCiAgICBJTgogICAgcEJzc2lkICAgICAgICAgIEJTU0lEIHRvIGJlIHVwZGF0ZWQKCiAgUkVUVVJOIFZBTFVFCiAgICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgU0lERSBFRkZFQ1RTCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKClZPU19TVEFUVVMKV0xBTlRMX1VwZGF0ZVNUQUJzc0lkZm9ySUJTUwooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgICAgICAgICpwQnNzaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4ICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVXBkYXRlIHRoZSBJQlNTIEJTU0lECiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX21lbV9jb3B5KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLnZCU1NJRGZvcklCU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzaWQsIHNpemVvZih2X01BQ0FERFJfdCkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU1RBUGt0UGVuZGluZwoKICBERVNDUklQVElPTgoKICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgd2hlbiBhIHBhY2tldCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbiBpbiBpdHMKICAgIHF1ZXVlcy4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBwYWNrZXQgcGVuZGluZwogICAgbm90aWZpY2F0aW9uIGNhbiBiZSBzZW50LgoKICAgIFJFU1RSSUNUSU9OOiBUTCB3aWxsIG5vdCBjb3VudCBwYWNrZXRzIGZvciBwZW5kaW5nIG5vdGlmaWNhdGlvbi4KICAgICAgICAgICAgICAgICBIREQgaXMgZXhwZWN0ZWQgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9uIG9ubHkgd2hlbgogICAgICAgICAgICAgICAgIG5vbi1lbXB0eSBldmVudCBnZXRzIHRyaWdnZXJlZC4gV29yc3QgY2FzZSBzY2VuYXJpbwogICAgICAgICAgICAgICAgIGlzIHRoYXQgVEwgbWlnaHQgZW5kIHVwIG1ha2luZyBhIGNhbGwgd2hlbiBIZGRzCiAgICAgICAgICAgICAgICAgcXVldWVzIGFyZSBhY3R1YWxseSBlbXB0eS4KCiAgUEFSQU1FVEVSUwoKICAgIHB2b3NHQ3R4OiAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdGhhdCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbgoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVBrdFBlbmRpbmcKKAogIHZfUFZPSURfdCAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX0FDRW51bVR5cGUgICAgdWNBYwopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgIldMQU4gVEw6UGFja2V0IHBlbmRpbmcgaW5kaWNhdGlvbiBmb3IgU1RBOiAlZCBBQzogJWQiLCB1Y1NUQUlkLCB1Y0FjKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9TVEFQa3RQZW5kaW5nIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVBrdFBlbmRpbmciKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1NUQVBrdFBlbmRpbmciKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUZW1wb3JhcnkgZml4IHRvIGVuYWJsZSBUTCB0byBmZXRjaCBwYWNrZXRzIHdoZW4gbXVsdGlwbGUgcGVlcnMgam9pbgogICAgYW4gSUJTUy4gVG8gZml4IENSMTc3MzAxLiBOZWVkcyB0byBnbyBhd2F5IHdoZW4gdGhlIGFjdHVhbCBmaXggb2YKICAgIGdvaW5nIHRocm91Z2ggYWxsIFNUQSdzIGluIHJvdW5kIHJvYmluIGZhc2hpb24gZ2V0cyBtZXJnZWQgaW4gZnJvbQogICAgQlQgQU1QIGJyYW5jaC4KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYi0+dWNSZWdpc3RlcmVkU3RhSWQgPSB1Y1NUQUlkOwoKICBpZiggV0xBTlRMX1NUQV9DT05ORUNURUQgPT0gcENsaWVudFNUQS0+dGxTdGF0ZSApCiAgeyAvKiBFQVBPTF9ISV9QUklPUklUWSA6IG5lZWQgdG8gZmluZCBvdXQgd2hldGhlciBFQVBPTCBpcyBwZW5kaW5nIGJlZm9yZQogICAgICAgV0xBTlRMX0ZldGNoUGFja2V0KCkvV0xBTlRMX1R4Q29ubigpIGlzIGNhbGxlZC4KICAgICAgIGNoYW5nZSBTVEFfQVVUSEVOVElDQVRFRCAhPSB0bFN0YXRlIHRvIENPTk5FQ1RFRCA9PSB0bFN0YXRlCiAgICAgICB0byBtYWtlIHN1cmUgVEwgaXMgaW5kZWVkIHdhaXRpbmcgZm9yIEVBUE9MLgogICAgICAgSnVzdCBpbiB0aGUgY2FzZSB3aGVuIFNUQSBnb3QgZGlzY29ubmVjdGVkIHNob3J0bHkgYWZ0ZXIgY29ubmVjdGVjdGlvbiAqLwogICAgcENsaWVudFNUQS0+dWNFYXBvbFBrdFBlbmRpbmcgPSAxOwoKICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwKICAgICAgICAgICBUUkFDRV9DT0RFX1RMX0VBUE9MX1BLVF9QRU5ESU5HLCB1Y1NUQUlkLCB1Y0FjKSk7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiV0xBTiBUTDpQYWNrZXQgcGVuZGluZyBpbmRpY2F0aW9uIGZvciBTVEE6ICVkIEFDOiAlZCBTdGF0ZTogJWQiLCAKICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBYywgcENsaWVudFNUQS0+dGxTdGF0ZSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFbmFibGUgdGhpcyBBQyBpbiB0aGUgQUMgbWFzayBpbiBvcmRlciBmb3IgVEwgdG8gc3RhcnQgc2VydmljaW5nIGl0CiAgICBTZXQgcGFja2V0IHBlbmRpbmcgZmxhZyAKICAgIFRvIGF2b2lkIHJhY2UgY29uZGl0aW9uLCBzZXJpYWxpemUgdGhlIHVwZGF0aW9uIG9mIEFDIGFuZCBBQyBtYXNrIAogICAgdGhyb3VnaCBXTEFOVExfVFhfU1RBSURfQUNfSU5EIG1lc3NhZ2UuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgcENsaWVudFNUQS0+YXVjQUNNYXNrW3VjQWNdID0gMTsKCiAgICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nLCAxKTsKCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgQ2hlY2sgaWYgdGhlcmUgYXJlIGVub3VnaCByZXNvdXJjZXMgZm9yIHRyYW5zbWlzc2lvbiBhbmQgdHggaXMgbm90CiAgICAgICAgc3VzcGVuZGVkLgogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfREFUQSApICYmCiAgICAgICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSkKICAgICAgewogICAgICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9TVEFfUEtUX1BFTkRJTkcsCiAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bFN0YXRlICkpOwoKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICJJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwiKSk7CiAgICAgICAgICAgV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIE5vIGVycm9yIGNvZGUgaXMgc2VudCBiZWNhdXNlIFRMIHdpbGwgcmVzdW1lIHR4IGF1dG9ub21vdXNseSBpZgogICAgICAgICAgcmVzb3VyY2VzIGJlY29tZSBhdmFpbGFibGUgb3IgdHggZ2V0cyByZXN1bWVkCiAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDpSZXF1ZXN0IHRvIHNlbmQgYnV0IGNvbmRpdGlvbiBub3QgbWV0LiBSZXM6ICVkLFN1c3BlbmQ6ICVkIiwKICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50LCBwVExDYi0+dWNUeFN1c3BlbmRlZCApOwogICAgICB9CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFQa3RQZW5kaW5nICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TZXRTVEFQcmlvcml0eQoKICBERVNDUklQVElPTgoKICAgIFRMIGV4cG9zZXMgdGhpcyBBUEkgdG8gYWxsb3cgdXBwZXIgbGF5ZXJzIGEgcm91Z2ggY29udHJvbCBvdmVyIHRoZQogICAgcHJpb3JpdHkgb2YgdHJhbnNtaXNzaW9uIGZvciBhIGdpdmVuIHN0YXRpb24gd2hlbiBzdXBwb3J0aW5nIG11bHRpcGxlCiAgICBjb25uZWN0aW9ucy4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjaGFuZ2UgaW4gcHJpb3JpdHkgY2FuIGJlCiAgICBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRoYXQgaGFzIHRvIGNoYW5nZSBwcmlvcml0eQoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NldFNUQVByaW9yaXR5CigKICB2X1BWT0lEX3QgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9TVEFQcmlvcml0eVR5cGUgICB0bFNUQVByaQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfU2V0U1RBUHJpb3JpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NldFNUQVByaW9yaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfU2V0U1RBUHJpb3JpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZS1hbmFsaXplIGlmIGxvY2sgaXMgbmVlZGVkIHdoZW4gYWRkaW5nIG11bHRpcGxlIHN0YXRpb25zCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkNoYW5naW5nIHN0YXRlIGZvciBTVEEgUHJpIElEOiAlZCBmcm9tICVkIHRvICVkIiwKICAgICAgICAgICAgIHVjU1RBSWQsIHBDbGllbnRTVEEtPnRsUHJpLCB0bFNUQVByaSkpOwogIHBDbGllbnRTVEEtPnRsUHJpID0gdGxTVEFQcmk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU2V0U1RBUHJpb3JpdHkgKi8KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggQkFQCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBTTUUgdG8gcmVnaXN0ZXIgaXRzZWxmIGFzIGNsaWVudCBmb3Igbm9uLWRhdGEgQlQtQU1QIHBhY2tldHMuCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgcGZuVGxCQVBSeEZybTogIHBvaW50ZXIgdG8gdGhlIHJlY2VpdmUgcHJvY2Vzc2luZyByb3V0aW5lIGZvciBub24tZGF0YQogICAgICAgICAgICAgICAgICAgIEJULUFNUCBwYWNrZXRzCiAgICBwZm5GbHVzaE9wQ29tcGxldGVDYjoKICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjYWxsIGJhY2sgZnVuY3Rpb24sIGZvciB0aGUgRmx1c2ggb3BlcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbi4KCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IEJBTCBjbGllbnQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9CQVBSeENCVHlwZSAgICAgcGZuVGxCQVBSeEZybSwKICBXTEFOVExfRmx1c2hPcENvbXBDQlR5cGUgIHBmbkZsdXNoT3BDb21wbGV0ZUNiCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcGZuVGxCQVBSeEZybSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggTlVMTCA9PSBwZm5GbHVzaE9wQ29tcGxldGVDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiSW52YWxpZCBGbHVzaCBDb21wbGV0ZSBDYiBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1ha2Ugc3VyZSB0aGlzIGlzIHRoZSBmaXJzdCByZWdpc3RyYXRpb24gYXR0ZW1wdAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCAhPSBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMgKQogIHsKICAgIHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cysrOwogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkJBUCBjbGllbnQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlZ2lzdGVyIHN0YXRpb24gd2l0aCBUTAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBCQVAgQ2xpZW50IiApKTsKCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzKys7CgogIGlmICggTlVMTCAhPSBwZm5UbEJBUFJ4RnJtICkgCiAgewogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUnggICAgICAgICAgICAgPSBwZm5UbEJBUFJ4RnJtOwogIH0KCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmbkZsdXNoT3BDb21wbGV0ZUNiICAgPSBwZm5GbHVzaE9wQ29tcGxldGVDYjsKCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiAgICAgPSBOVUxMOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50ICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVHhCQVBGcm0KCiAgREVTQ1JJUFRJT04KICAgIEJBUCBjYWxscyB0aGlzIHdoZW4gaXQgd2FudHMgdG8gc2VuZCBhIGZyYW1lIHRvIHRoZSBtb2R1bGUKCiAgREVQRU5ERU5DSUVTCiAgICBCQVAgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgICBSRVNUUklDVElPTjogQkFQIENBTk5PVCBwdXNoIGFueSBwYWNrZXRzIHRvIFRMIHVudGlsIGl0IGRpZCBub3QgcmVjZWl2ZQogICAgICAgICAgICAgICAgIGEgdHggY29tcGxldGUgZnJvbSB0aGUgcHJldmlvdXMgcGFja2V0LCB0aGF0IG1lYW5zIEJBUAogICAgICAgICAgICAgICAgIHNlbmRzIG9uZSBwYWNrZXQsIHdhaXQgZm9yIHR4IGNvbXBsZXRlIGFuZCB0aGVuCiAgICAgICAgICAgICAgICAgc2VuZHMgYW5vdGhlciBvbmUKCiAgICAgICAgICAgICAgICAgSWYgQkFQIHNlbmRzIGFub3RoZXIgcGFja2V0IGJlZm9yZSBUTCBtYW5hZ2VzIHRvIHByb2Nlc3MgdGhlCiAgICAgICAgICAgICAgICAgcHJldmlvdXNseSBzZW50IHBhY2tldCBjYWxsIHdpbGwgZW5kIGluIGZhaWx1cmUKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgQkFQJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHZPU1MgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHBhY2tldCB0byBiZQogICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVkCiAgICBwTWV0YUluZm86ICAgICAgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFja2V0CiAgICBwZm5UbEJBUFR4Q29tcDogcG9pbnRlciB0byBhIHRyYW5zbWl0IGNvbXBsZXRlIHJvdXRpbmUgZm9yIG5vdGlmeWluZwogICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBvdmVyIHRoZSBidXMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBCQUwgY2xpZW50IHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfRV9CVVNZOiAgIFRoZSBwcmV2aW91cyBCVC1BTVAgcGFja2V0IHdhcyBub3QgeWV0IHRyYW5zbWl0dGVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgICBPdGhlciBmYWlsdXJlIG1lc3NhZ2VzIG1heSBiZSByZXR1cm5lZCBmcm9tIHRoZSBCRCBoZWFkZXIgaGFuZGxpbmcKICAgIHJvdXRpbmVzLCBwbGVhc2UgY2hlY2sgYXByb3ByaWF0ZSBBUEkgZm9yIG1vcmUgaW5mby4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhCQVBGcm0KKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgICAgICAgICAgIHZvc0RhdGFCdWZmLAogIFdMQU5UTF9NZXRhSW5mb1R5cGUqICAgIHBNZXRhSW5mbywKICBXTEFOVExfVHhDb21wQ0JUeXBlICAgICBwZm5UbEJBUFR4Q29tcAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgICAgICA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgdl9NQUNBRERSX3QgICAgIHZEZXN0TWFjQWRkcjsKICB2X1UxNl90ICAgICAgICAgdXNQa3RMZW47CiAgdl9VOF90ICAgICAgICAgIHVjU3RhSWQgPSAwOwogIHZfVThfdCAgICAgICAgICBleHRyYUhlYWRTcGFjZSA9IDA7CiAgdl9VOF90ICAgICAgICAgIHVjV0RTRW5hYmxlZCA9IDA7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9UeEJBUEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRW5zdXJlIHRoYXQgQkFQIGNsaWVudCB3YXMgcmVnaXN0ZXJlZCBwcmV2aW91c2x5CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggMCA9PSBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMgKSB8fAogICAgICAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRChwVExDYi0+dGxCQVBDbGllbnQudWNCQVBTVEFJZCkgKSkKICB7CiAgICBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMrKzsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6QkFQIGNsaWVudCBub3QgcmVnaXN0ZXIgb24gV0xBTlRMX1R4QkFQRnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBDaGVjayBpZiBhbnkgQlQtQU1QIEZybSBpcyBwZW5kaW5nCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkJULUFNUCBGcmFtZSBhbHJlYWR5IHBlbmRpbmcgdHggaW4gVEwgb24gV0xBTlRMX1R4QkFQRnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9CVVNZOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgYnVmZmVyIGFuZCBub3RpZnkgQkFMOyBubyBsb2NrIGlzIG5lZWRlZCBpZiB0aGUgYWJvdmUgcmVzdHJpY3Rpb24KICAgIGlzIG1ldAogICAgU2F2ZSB0aGUgdHggY29tcGxldGUgZm5jdCBwb2ludGVyIGFzIHRsIHNwZWNpZmljIGRhdGEgaW4gdGhlIHZvcyBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1N0YUlkID0gcFRMQ2ItPnRsQkFQQ2xpZW50LnVjQkFQU1RBSWQ7CiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdICkKICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQogIGlmICgoIDAgPT0gcE1ldGFJbmZvLT51Y0Rpc2FibGVGcm1YdGwgKSAmJiAKICAgICAgKCAwICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gKSkKICB7CiAgICB2b3NTdGF0dXMgPSAgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKCB2b3NEYXRhQnVmZiwgJnZvc1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLCAmdWNTdGFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXRhSW5mbywgJnVjV0RTRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRyYUhlYWRTcGFjZSk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3Igd2hlbiB0cmFuc2xhdGluZyBoZWFkZXIgV0xBTlRMX1R4QkFQRnJtIikpOwoKICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KCiAgICBwTWV0YUluZm8tPnVjRGlzYWJsZUZybVh0bCA9IDE7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENhbGwgSEFMIHRvIGZpbGwgQkQgaGVhZGVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAvKiBBZGRpbmcgVHlwZSwgU3ViVHlwZSB3aGljaCB3YXMgbWlzc2luZyBmb3IgRUFQT0wgZnJvbSBCQVAgKi8KICBwTWV0YUluZm8tPnVjVHlwZSB8PSAoV0xBTlRMXzgwMjExX0RBVEFfVFlQRSA8PCA0KTsKICBwTWV0YUluZm8tPnVjVHlwZSB8PSAoV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEUpOwoKICB2b3NTdGF0dXMgPSBXREFfRFNfQnVpbGRUeFBhY2tldEluZm8oIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiAsIAogICAgICAgICAgICAgICAgICAgICZ2RGVzdE1hY0FkZHIsIHBNZXRhSW5mby0+dWNEaXNhYmxlRnJtWHRsLCAKICAgICAgICAgICAgICAgICAgICAmdXNQa3RMZW4sIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgdWNXRFNFbmFibGVkLCBleHRyYUhlYWRTcGFjZSwgcE1ldGFJbmZvLT51Y1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0tPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICBwTWV0YUluZm8tPnVjVElELCAwIC8qIE5vIEFDSyAqLywgcE1ldGFJbmZvLT51c1RpbWVTdGFtcCwKICAgICAgICAgICAgICAgICAgICBwTWV0YUluZm8tPnVjSXNFYXBvbCB8fCBwTWV0YUluZm8tPnVjSXNXYWksIHBNZXRhSW5mby0+dWNVUCApOwoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGJ1aWxkaW5nIFRYIGhlYWRlciAlZCIsIHZvc1N0YXR1cykpOwogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIGlmICggTlVMTCAhPSBwZm5UbEJBUFR4Q29tcCApCiAgewogICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwZm5UbEJBUFR4Q29tcCk7CiAgfQogIGVsc2UKICB7CiAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KVdMQU5UTF9UeENvbXBEZWZhdWx0Q2IpOwoKICB9CgogIHZvc19hdG9taWNfc2V0KCAodWludHB0cl90KikmcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICh1aW50cHRyX3Qpdm9zRGF0YUJ1ZmYpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhyZSBhcmUgZW5vdWdoIHJlc291cmNlcyBmb3IgdHJhbnNtaXNzaW9uIGFuZCB0eCBpcyBub3QKICAgIHN1c3BlbmRlZC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfQkFQICkgJiYKICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkpCiAgewogICAgV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CiAgfQogIGVsc2UKICB7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBObyBlcnJvciBjb2RlIGlzIHNlbnQgYmVjYXVzZSBUTCB3aWxsIHJlc3VtZSB0eCBhdXRvbm9tb3VzbHkgaWYKICAgICAgcmVzb3VyY2VzIGJlY29tZSBhdmFpbGFibGUgb3IgdHggZ2V0cyByZXN1bWVkCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAiV0xBTiBUTDpSZXF1ZXN0IHRvIHNlbmQgZnJvbSBCQVAgYnV0IGNvbmRpdGlvbiBub3QgbWV0LlJlczogJWQsIgogICAgICAgICAgICAgICAgICJTdXNwZW5kOiAlZCIsIHBUTENiLT51UmVzQ291bnQsIHBUTENiLT51Y1R4U3VzcGVuZGVkICkpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9UeEJBUEZybSAqLwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSU5URVJBQ1RJT04gV0lUSCBTTUUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRSc3NpCgogIERFU0NSSVBUSU9OCiAgICBUTCB3aWxsIGV4dHJhY3QgdGhlIFJTU0kgaW5mb3JtYXRpb24gZnJvbSBldmVyeSBkYXRhIHBhY2tldCBmcm9tIHRoZQogICAgb25nb2luZyB0cmFmZmljIGFuZCB3aWxsIHN0b3JlIGl0LiBJdCB3aWxsIHByb3ZpZGUgdGhlIHJlc3VsdCB0byBTTUUKICAgIHVwb24gcmVxdWVzdC4KCiAgREVQRU5ERU5DSUVTCgogICAgV0FSTklORzogdGhlIHJlYWQgYW5kIHdyaXRlIG9mIHRoaXMgdmFsdWUgd2lsbCBub3QgYmUgcHJvdGVjdGVkCiAgICAgICAgICAgICBieSBsb2NrcywgdGhlcmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBvYnRhaW5lZCBhZnRlciBhIHJlYWQKICAgICAgICAgICAgIG1pZ2h0IG5vdCBhbHdheXMgYmUgY29uc2lzdGVudC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0ZWQgdmFsdWUKCiAgICBPVVQKICAgIHB1UnNzaTogICAgICAgICB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgUlNTSQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTVEEgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldFJzc2kKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICB1Y1NUQUlkLAogIHZfUzdfdCogICAgICAgICAgcFJzc2kKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcFJzc2kgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0UnNzaSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldFJzc2kiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0UnNzaSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfR2V0UnNzaSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENvcHkgd2lsbCBub3QgYmUgbG9ja2VkOyBwbGVhc2UgcmVhZCByZXN0cmljdGlvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmKHBUTENiLT5pc0JNUFMgfHwgSVNfQUNUSVZFTU9ERV9PRkZMT0FEX0ZFQVRVUkVfRU5BQkxFKQogIHsKICAgICpwUnNzaSA9IHBDbGllbnRTVEEtPnJzc2lBdmdCbXBzOwogICAgLyogQ2hlY2sgSWYgUlNTSSBpcyB6ZXJvIGJlY2F1c2Ugd2UgYXJlIHJlYWRpbmcgcnNzQXZnQm1wcyB1cGRhdGVkIGJ5IEhBTCBpbiAKICAgIHByZXZpb3VzIEdldFN0YXRzUmVxdWVzdC4gSXQgbWF5IGJlIHVwZGF0ZWQgYXMgemVybyBieSBIYWwgYmVjYXVzZSBFbnRlckJtcHMgCiAgICBtaWdodCBub3QgaGF2ZSBoYXBwZW5kIGJ5IHRoYXQgdGltZS4gSGVuY2UgcmVhZGluZyB0aGUgbW9zdCByZWNlbnQgUnNzaSAKICAgIGNhbGNsdWF0ZWQgYnkgVEwqLwogICAgaWYoMCA9PSAqcFJzc2kpCiAgICB7CiAgICAgICpwUnNzaSA9IHBDbGllbnRTVEEtPnJzc2lBdmc7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICAqcFJzc2kgPSBwQ2xpZW50U1RBLT5yc3NpQXZnOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfR2V0UnNzaSBmb3IgU1RBOiAlZCBSU1NJOiAlZCVzIiwKICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCAqcFJzc2ksCiAgICAgICAgICAgICAgICAgICAgcFRMQ2ItPmlzQk1QUyA/ICIgaW4gQk1QUyIgOiAiIikpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFJzc2kgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFNucgoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBleHRyYWN0IHRoZSBTTlIgaW5mb3JtYXRpb24gZnJvbSBldmVyeSBkYXRhIHBhY2tldCBmcm9tIHRoZQogICAgb25nb2luZyB0cmFmZmljIGFuZCB3aWxsIHN0b3JlIGl0LiBJdCB3aWxsIHByb3ZpZGUgdGhlIHJlc3VsdCB0byBTTUUKICAgIHVwb24gcmVxdWVzdC4KCiAgREVQRU5ERU5DSUVTCgogICAgV0FSTklORzogdGhlIHJlYWQgYW5kIHdyaXRlIG9mIHRoaXMgdmFsdWUgd2lsbCBub3QgYmUgcHJvdGVjdGVkCiAgICAgICAgICAgICBieSBsb2NrcywgdGhlcmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBvYnRhaW5lZCBhZnRlciBhIHJlYWQKICAgICAgICAgICAgIG1pZ2h0IG5vdCBhbHdheXMgYmUgY29uc2lzdGVudC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0ZWQgdmFsdWUKCiAgICBPVVQKICAgIHBTbnI6ICAgICAgICAgdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIFNOUgoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTVEEgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldFNucgooCiAgdEFOSV9VOCAgICAgICAgICAgdWNTVEFJZCwKICB0QU5JX1M4KiAgICAgICAgICBwU25yCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKE5VTEwgPT0gcFNucikKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmIChXTEFOVExfU1RBX0lEX0lOVkFMSUQodWNTVEFJZCkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0Iodm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLCBOVUxMKSk7CiAgaWYgKE5VTEwgPT0gcFRMQ2IpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmIChOVUxMID09IHBDbGllbnRTVEEpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ29weSB3aWxsIG5vdCBiZSBsb2NrZWQ7IHBsZWFzZSByZWFkIHJlc3RyaWN0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKHBUTENiLT5pc0JNUFMpCiAgewogICAgKnBTbnIgPSBwQ2xpZW50U1RBLT5zbnJBdmdCbXBzOwogIH0KICBlbHNlCiAgewogICAgLyogU05SIGlzIGF2ZXJhZ2VkIG92ZXIgV0xBTlRMX01BWF9TTlJfREFUQV9TQU1QTEVTLCBpZiB0aGVyZSBhcmUgbm90IGVub3VnaAogICAgICogZGF0YSBzYW1wbGVzIChzbnJpZHgpIHRvIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB0aGVuIHJldHVybiB0aGUKICAgICAqIGF2ZXJhZ2UgZm9yIHRoZSB3aW5kb3cgb2YgcHJldm9pdXMgMjAgcGFja2V0cy4gQW5kIGlmIHRoZXJlIGFyZW4ndAogICAgICogZW5vdWdoIHNhbXBsZXMgYW5kIHRoZSBhdmVyYWdlIGZvciBwcmV2aW91cyB3aW5kb3cgb2YgMjAgcGFja2V0cyBpcwogICAgICogbm90IGF2YWlsYWJsZSB0aGVuIHJldHVybiBhIHByZWRlZmluZWQgdmFsdWUKICAgICAqCiAgICAgKiBOT1RFOiB0aGUgU05SX0hBQ0tfQk1QUyB2YWx1ZSBpcyBkZWZpbmVkIHRvIDEyNywgZG9jdW1lbnRzIGZyb20gSFcKICAgICAqIHRlYW0gcmV2ZWFsIHRoYXQgdGhlIFNOUiB2YWx1ZSBoYXMgYSBjZWlsaW5nIHdlbGwgYmVsb3cgMTI3IGRCbSwKICAgICAqIHNvIGlmIFNOUiBoYXMgdmFsdWUgb2YgMTI3IHRoZSB1c2Vyc3BhY2UgYXBwbGljYXRpb25zIGNhbiBrbm93IHRoYXQKICAgICAqIHRoZSBTTlIgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIHlldCBiZWNhdXNlIGVub3VnaCBkYXRhIHdhcyBub3QKICAgICAqIGF2YWlsYWJsZSBmb3IgU05SIGNhbGN1bGF0aW9uCiAgICAgKi8KICAgIGlmIChwQ2xpZW50U1RBLT5zbnJJZHggPiAoV0xBTlRMX01BWF9TTlJfREFUQV9TQU1QTEVTLzIpCiAgICAgICAgfHwgIShwQ2xpZW50U1RBLT5wcmV2U25yQXZnKSkKICAgIHsKICAgICAgICpwU25yID0gcENsaWVudFNUQS0+c25yU3VtIC8gcENsaWVudFNUQS0+c25ySWR4OwogICAgfQogICAgZWxzZSBpZiAocENsaWVudFNUQS0+cHJldlNuckF2ZykKICAgIHsKICAgICAgICpwU25yID0gcENsaWVudFNUQS0+cHJldlNuckF2ZzsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICpwU25yID0gU05SX0hBQ0tfQk1QUzsKICAgIH0KICB9CgogIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfR2V0U25yIGZvciBTVEE6ICVkIFNOUjogJWQlcyIsCiAgICAgICAgICAgIHVjU1RBSWQsICpwU25yLAogICAgICAgICAgICBwVExDYi0+aXNCTVBTID8gIiBpbiBCTVBTIiA6ICIiKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRTbnIgKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0TGlua1F1YWxpdHkKCiAgREVTQ1JJUFRJT04KICAgIFRMIHdpbGwgZXh0cmFjdCB0aGUgU05SIGluZm9ybWF0aW9uIGZyb20gZXZlcnkgZGF0YSBwYWNrZXQgZnJvbSB0aGUKICAgIG9uZ29pbmcgdHJhZmZpYyBhbmQgd2lsbCBzdG9yZSBpdC4gSXQgd2lsbCBwcm92aWRlIHRoZSByZXN1bHQgdG8gU01FCiAgICB1cG9uIHJlcXVlc3QuCgogIERFUEVOREVOQ0lFUwoKICAgIFdBUk5JTkc6IHRoZSByZWFkIGFuZCB3cml0ZSBvZiB0aGlzIHZhbHVlIHdpbGwgbm90IGJlIHByb3RlY3RlZAogICAgICAgICAgICAgYnkgbG9ja3MsIHRoZXJlZm9yZSB0aGUgaW5mb3JtYXRpb24gb2J0YWluZWQgYWZ0ZXIgYSByZWFkCiAgICAgICAgICAgICBtaWdodCBub3QgYWx3YXlzIGJlIGNvbnNpc3RlbnQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIHZhbHVlCgogICAgT1VUCiAgICBwdUxpbmtRdWFsaXR5OiAgICAgICAgIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBTTlIKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU1RBIHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRMaW5rUXVhbGl0eQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIHZfVTMyX3QqICAgICAgICAgICAgICBwdUxpbmtRdWFsaXR5CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB1TGlua1F1YWxpdHkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiSW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0TGlua1F1YWxpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0TGlua1F1YWxpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiU3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfR2V0TGlua1F1YWxpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDb3B5IHdpbGwgbm90IGJlIGxvY2tlZDsgcGxlYXNlIHJlYWQgcmVzdHJpY3Rpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAqcHVMaW5rUXVhbGl0eSA9IHBDbGllbnRTVEEtPnVMaW5rUXVhbGl0eUF2ZzsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU5UTF9HZXRMaW5rUXVhbGl0eSBmb3IgU1RBOiAlZCBMaW5rUXVhbGl0eTogJWQiLCB1Y1NUQUlkLCAqcHVMaW5rUXVhbGl0eSkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldExpbmtRdWFsaXR5ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9GbHVzaFN0YVRJRAoKICBERVNDUklQVElPTgogICAgVEwgcHJvdmlkZXMgdGhpcyBBUEkgYXMgYW4gaW50ZXJmYWNlIHRvIFNNRSAoQkFQKSBsYXllci4gVEwgaW50dXJuIHBvc3RzIGEKICAgIG1lc3NhZ2UgdG8gSEFMLiBUaGlzIEFQSSBpcyBjYWxsZWQgYnkgdGhlIFNNRSBpbm9yZGVyIHRvIHBlcmZvcm0gYSBmbHVzaAogICAgb3BlcmF0aW9uLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0ZWQgdmFsdWUKICAgIHVjVGlkOiAgICAgICAgICBUc3BlYyBJRCBmb3IgdGhlIG5ldyBCQSBzZXNzaW9uCgogICAgT1VUCiAgICBUaGUgcmVzcG9uc2UgZm9yIHRoaXMgcG9zdCBpcyByZWNlaXZlZCBpbiB0aGUgbWFpbiB0aHJlYWQsIHZpYSBhIHJlc3BvbnNlCiAgICBtZXNzYWdlIGZyb20gSEFMIHRvIFRMLgoKICBSRVRVUk4gVkFMVUUKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0ZsdXNoU3RhVElECigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjVGlkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgdHBGbHVzaEFDUmVxIEZsdXNoQUNSZXFQdHIgPSBOVUxMOwogIHZvc19tc2dfdCB2b3NNZXNzYWdlOwoKCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9GbHVzaFN0YVRJRCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfRmx1c2hTdGFUSUQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0ZsdXNoU3RhVElEIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIFdlIG5lZWQgdG8gcG9zdCBhIG1lc3NhZ2Ugd2l0aCB0aGUgU1RBLCBUSUQgdmFsdWUgdG8gSEFMLiBIQUwgcGVyZm9ybXMgdGhlIGZsdXNoCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBGbHVzaEFDUmVxUHRyID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRGbHVzaEFDUmVxKSk7CgogIGlmICggTlVMTCA9PSBGbHVzaEFDUmVxUHRyICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6IGZhdGFsIGZhaWx1cmUsIGNhbm5vdCBhbGxvY2F0ZSBGbHVzaCBSZXEgc3RydWN0dXJlIikpOwogICAgVk9TX0FTU0VSVCgwKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CiAgfQoKICAvLyBTdGFydCBjb25zdHJ1Y3RpbmcgdGhlIG1lc3NhZ2UgZm9yIEhBTAogIEZsdXNoQUNSZXFQdHItPm1lc2dUeXBlICAgID0gU0lSX1RMX0hBTF9GTFVTSF9BQ19SRVE7CiAgRmx1c2hBQ1JlcVB0ci0+bWVzZ0xlbiAgICAgPSBzaXplb2YodEZsdXNoQUNSZXEpOwogIEZsdXNoQUNSZXFQdHItPm1lc2dMZW4gICAgID0gc2l6ZW9mKHRGbHVzaEFDUmVxKTsKICBGbHVzaEFDUmVxUHRyLT51Y1NUQUlkID0gdWNTVEFJZDsKICBGbHVzaEFDUmVxUHRyLT51Y1RpZCA9IHVjVGlkOwoKICB2b3NNZXNzYWdlLnR5cGUgICAgICAgICAgICA9IFdEQV9UTF9GTFVTSF9BQ19SRVE7CiAgdm9zTWVzc2FnZS5ib2R5cHRyID0gKHZvaWQgKilGbHVzaEFDUmVxUHRyOwoKICB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NUV9JRF9XREEsICZ2b3NNZXNzYWdlKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJTlRFUkFDVElPTiBXSVRIIFBFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50CgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgUEUgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzIGRlbGl2ZXJ5LgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgQVBJIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHBmblRsTWdtdEZybVJ4OiAgICAgcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQgZnJhbWVzCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogTWdtdCBGcmFtZSBjbGllbnQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgV0xBTlRMX01nbXRGcm1SeENCVHlwZSAgcGZuVGxNZ210RnJtUngKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwZm5UbE1nbXRGcm1SeCApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHJlZ2lzdHJhdGlvbiBhdHRlbXB0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgKQogIHsKICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMrKzsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IGZyYW1lIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVnaXN0ZXIgc3RhdGlvbiB3aXRoIFRMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgTWFuYWdlbWVudCBGcmFtZSBDbGllbnQiICkpOwoKICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzKys7CgogIGlmICggTlVMTCAhPSBwZm5UbE1nbXRGcm1SeCApCiAgewogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCA9IHBmblRsTWdtdEZybVJ4OwogIH0KCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgPSBOVUxMOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfRGVSZWdpc3Rlck1nbXRGcm1DbGllbnQKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBQRSB0byBkZXJlZ2lzdGVyIGFzIGEgY2xpZW50IGZvciBtYW5hZ2VtZW50IGZyYW1lcyBkZWxpdmVyeS4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIEFQSSBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0bwogICAgICAgICAgICAgICAgICAgICAgICBUTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBNZ210IEZyYW1lIGNsaWVudCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0RlUmVnaXN0ZXJNZ210RnJtQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHJlZ2lzdHJhdGlvbiBhdHRlbXB0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwID09IHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IGZyYW1lIGNsaWVudCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFyIHJlZ2lzdHJhdGlvbiB3aXRoIFRMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIldMQU4gVEw6RGVyZWdpc3RlcmluZyBNYW5hZ2VtZW50IEZyYW1lIENsaWVudCIgKSk7CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUnggPSBXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiOwogIGlmICggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZikKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IGNhY2hlIGJ1ZmZlciBub3QgZW1wdHkgb24gZGVyZWdpc3RlcmluZyIKICAgICAgICAgICAgICAgIiAtIGRyb3BwaW5nIHBhY2tldCIgKSk7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOwoKICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmID0gTlVMTDsgCiAgfQoKICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzID0gMDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZWdpc3Rlck1nbXRGcm1DbGllbnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4TWdtdEZybQoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFBFIHdoZW4gaXQgd2FudCB0byBzZW5kIG91dCBhIG1hbmFnZW1lbnQgZnJhbWUuCiAgICBIQUwgd2lsbCBhbHNvIHVzZSB0aGlzIEFQSSBmb3IgdGhlIGZldyBmcmFtZXMgaXQgc2VuZHMgb3V0LCB0aGV5IGFyZSBub3QKICAgIG1hbmFnZW1lbnQgZnJhbWVzIGhvd2V2ZXJlIGl0IGlzIGFjY2VwdGVkIHRoYXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUKICAgIGFsbG93ZWQgT05MWSBmb3IgdGhlIHVzYWdlIG9mIEhBTC4KICAgIEdlbmVyaWMgZGF0YSBmcmFtZXMgU0hPVUxEIE5PVCB0cmF2ZWwgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgQVBJIGNhbiBiZSBjYWxsZWQuCgogICAgUkVTVFJJQ1RJT046IElmIFBFIHNlbmRzIGFub3RoZXIgcGFja2V0IGJlZm9yZSBUTCBtYW5hZ2VzIHRvIHByb2Nlc3MgdGhlCiAgICAgICAgICAgICAgICAgcHJldmlvdXNseSBzZW50IHBhY2tldCBjYWxsIHdpbGwgZW5kIGluIGZhaWx1cmUKCiAgICAgICAgICAgICAgICAgRnJhbWVzIGNvbW1pbmcgdGhyb3VnaCBoZXJlIG11c3QgYmUgODAyLjExIGZyYW1lcywgZnJhbWUKICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbiBpbiBVTUEgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRpc2FibGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7YSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB2b3NGcm1CdWY6ICAgICAgcG9pbnRlciB0byBhIHZPU1MgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG1hbmFnZW1lbnQKICAgICAgICAgICAgICAgICAgICBmcmFtZSB0byBiZSB0cmFuc21pdHRlZAogICAgdXNGcm1MZW46ICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkOyBpbmZvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIHZPU1MgYnVmZmVyCiAgICB3RnJtVHlwZTogICAgICAgdGhlIHR5cGUgb2YgdGhlIGZyYW1lIGJlaW5nIHRyYW5zbWl0dGVkCiAgICB0aWQ6ICAgICAgICAgICAgdGlkIHVzZWQgdG8gdHJhbnNtaXQgdGhpcyBmcmFtZQogICAgcGZuQ29tcFR4RnVuYzogIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IGNvbXBsZXRlIHJvdXRpbmUKICAgIHB2QkRIZWFkZXI6ICAgICBwb2ludGVyIHRvIHRoZSBCRCBoZWFkZXIsIGlmIE5VTEwgaXQgbWVhbnMgaXQgd2FzIG5vdAogICAgICAgICAgICAgICAgICAgIHlldCBjb25zdHJ1Y3RlZCBhbmQgaXQgbGllcyB3aXRoaW4gVEwncyByZXNwb25zaWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHRvIGRvIHNvOyBpZiBub3QgTlVMTCBpdCBpcyBleHBlY3RlZCB0aGF0IGl0IHdhcwogICAgICAgICAgICAgICAgICAgIGFscmVhZHkgcGFja2VkIGluc2lkZSB0aGUgdm9zIHBhY2tldAogICAgdWNBY2tSZXNwb25zZTogIGZsYWcgbm90aWZ5aW5nIGl0IGFuIGludGVycnVwdCBpcyBuZWVkZWQgZm9yIHRoZQogICAgICAgICAgICAgICAgICAgIGFja25vd2xlZGdlbWVudCByZWNlaXZlZCB3aGVuIHRoZSBmcmFtZSBpcyBzZW50IG91dAogICAgICAgICAgICAgICAgICAgIHRoZSBhaXIgYW5kIDsgdGhlIGludGVycnVwdCB3aWxsIGJlIHByb2Nlc3NlZCBieSBIQUwsCiAgICAgICAgICAgICAgICAgICAgb25seSBvbmUgc3VjaCBmcmFtZSBjYW4gYmUgcGVuZGluZyBpbiB0aGUgc3lzdGVtIGF0CiAgICAgICAgICAgICAgICAgICAgb25lIHRpbWUuCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IE1nbXQgRnJhbWUgY2xpZW50IHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfRV9CVVNZOiAgIFRoZSBwcmV2aW91cyBNZ210IHBhY2tldCB3YXMgbm90IHlldCB0cmFuc21pdHRlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgT3RoZXIgZmFpbHVyZSBtZXNzYWdlcyBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUgQkQgaGVhZGVyIGhhbmRsaW5nCiAgICByb3V0aW5lcywgcGxlYXNlIGNoZWNrIGFwcm9wcmlhdGUgQVBJIGZvciBtb3JlIGluZm8uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4TWdtdEZybQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90KiAgICAgICAgICAgdm9zRnJtQnVmLAogIHZfVTE2X3QgICAgICAgICAgICAgIHVzRnJtTGVuLAogIHZfVThfdCAgICAgICAgICAgICAgIHdGcm1UeXBlLAogIHZfVThfdCAgICAgICAgICAgICAgIHVjVGlkLAogIFdMQU5UTF9UeENvbXBDQlR5cGUgIHBmbkNvbXBUeEZ1bmMsCiAgdl9QVk9JRF90ICAgICAgICAgICAgcHZCREhlYWRlciwKICB2X1UzMl90ICAgICAgICAgICAgICB1Y0Fja1Jlc3BvbnNlCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgdl9NQUNBRERSX3QgICAgIHZEZXN0TWFjQWRkcjsKICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIHZfVTE2X3QgICAgICAgICB1c1BrdExlbjsKICB2X1UzMl90ICAgICAgICAgdXNUaW1lU3RhbXAgPSAwOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHZvc0ZybUJ1ZiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9UeE1nbXRGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1R4TWdtdEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRW5zdXJlIHRoYXQgbWFuYWdlbWVudCBmcmFtZSBjbGllbnQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCA9PSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzICkKICB7CiAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzKys7CiAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IEZyYW1lIGNsaWVudCBub3QgcmVnaXN0ZXIgb24gV0xBTlRMX1R4TWdtdEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBhbnkgTWdtdCBGcm0gaXMgcGVuZGluZwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIC8vdm9zVGVtcEJ1ZmYgPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZjsKICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKQogIHsKCiAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6TWFuYWdlbWVudCBGcmFtZSBhbHJlYWR5IHBlbmRpbmcgdHggaW4gVEw6IGZhaWxpbmcgb2xkIG9uZSIpKTsKCgogICAgLypGYWlsaW5nIHRoZSB0eCBmb3IgdGhlIHByZXZpb3VzIHBhY2tldCBlbnF1ZWQgYnkgUEUqLwogICAgLy92b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgLy8gICAgICAgICAgICAgICAgICAgICh1aW50cHRyX3QpTlVMTCk7CgogICAgLy92b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCB2b3NUZW1wQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnBmblR4Q29tcCk7CgogICAgLyppdCBzaG91bGQgbmV2ZXIgYmUgTlVMTCAtIGRlZmF1bHQgaGFuZGxlciBzaG91bGQgYmUgcmVnaXN0ZXJlZCBpZiBub25lKi8KICAgIC8vaWYgKCBOVUxMID09IHBmblR4Q29tcCApCiAgICAvL3sKICAgIC8vICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgIC8vICAgICAgICAgICAgIk5VTEwgcG9pbnRlciB0byBUeCBDb21wbGV0ZSBvbiBXTEFOVExfVHhNZ210RnJtIik7CiAgICAvLyAgVk9TX0FTU0VSVCgwKTsKICAgIC8vICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgLy99CgogICAgLy9wZm5UeENvbXAoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZiwgVk9TX1NUQVRVU19FX1JFU09VUkNFUyApOwogICAgLy9yZXR1cm4gVk9TX1NUQVRVU19FX0JVU1k7CgoKICAgIC8vcGZuQ29tcFR4RnVuYyggcHZvc0dDdHgsIHZvc0ZybUJ1ZiwgVk9TX1NUQVRVU19FX1JFU09VUkNFUyk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX1JFU09VUkNFUzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgQkQgaGVhZGVyIHdhcyBidWlsZCwgaWYgbm90IGNvbnN0cnVjdAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdkJESGVhZGVyICkKICB7CiAgICAgdl9NQUNBRERSX3QqICAgICBwdkFkZHIyTWFjQWRkcjsKICAgICB2X1U4X3QgICB1UW9zSGRyID0gVk9TX0ZBTFNFOwoKICAgICAvKiBHZXQgYWRkcmVzcyAyIG9mIE1hbmdlbWVudCBGcmFtZSB0byBnaXZlIHRvIFdMQU5IQUxfRmlsbFR4QmQgKi8KICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSggdm9zRnJtQnVmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01BQ19BRERSX0FMSUdOKDEpICsgVk9TX01BQ19BRERSX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2QWRkcjJNYWNBZGRyLCBWT1NfTUFDX0FERFJfU0laRSk7CgogICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICAgewogICAgICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZ2V0IGFkZHIyICVkIiwgdm9zU3RhdHVzKSk7CiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgIH0KCiAgICAvKiBFU0UgSUFQUC9URExTIEZyYW1lIHdoaWNoIGFyZSBkYXRhIGZyYW1lcyBidXQgdGVjaG5pY2FsbHkgdXNlZAogICAgICogZm9yIG1hbmFnZW1lbnQgZnVuY3Rpb25hbGl0eSBjb21lcyB0aHJvdWdoIHJvdXRlLgogICAgICovCiAgICBpZiAoV0xBTlRMX0lTX1FPU19EQVRBX0ZSQU1FKHdGcm1UeXBlKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIHsKICAgICAgICB1UW9zSGRyID0gVk9TX1RSVUU7CiAgICB9CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2FsbCBXREEgdG8gYnVpbGQgVFggaGVhZGVyCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB2b3NTdGF0dXMgPSBXREFfRFNfQnVpbGRUeFBhY2tldEluZm8oIHB2b3NHQ3R4LCB2b3NGcm1CdWYgLCAmdkRlc3RNYWNBZGRyLCAKICAgICAgICAgICAgICAgICAgIDEgLyogYWx3YXlzIDgwMi4xMSBmcmFtZXMqLywgJnVzUGt0TGVuLCB1UW9zSGRyIC8qcW9zIG5vdCBlbmFibGVkICEhISovLCAKICAgICAgICAgICAgICAgICAgIDAgLyogV0RTIG9mZiAqLywgMCwgd0ZybVR5cGUsIHB2QWRkcjJNYWNBZGRyLCB1Y1RpZCwgCiAgICAgICAgICAgICAgICAgICB1Y0Fja1Jlc3BvbnNlLCB1c1RpbWVTdGFtcCwgMCwgMCApOwoKCiAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCiAgICB7CiAgICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGJ1aWxkIFRYIGhlYWRlciAlZCIsIHZvc1N0YXR1cykpOwogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQogICB9LyogaWYgQkQgaGVhZGVyIG5vdCBwcmVzZW50ICovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIGJ1ZmZlciBhbmQgbm90aWZ5IEJBTDsgbm8gbG9jayBpcyBuZWVkZWQgaWYgdGhlIGFib3ZlIHJlc3RyaWN0aW9uCiAgICBpcyBtZXQKICAgIFNhdmUgdGhlIHR4IGNvbXBsZXRlIGZuY3QgcG9pbnRlciBhcyB0bCBzcGVjaWZpYyBkYXRhIGluIHRoZSB2b3MgYnVmZmVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMICE9IHBmbkNvbXBUeEZ1bmMgKQogIHsKICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0ZybUJ1ZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBmbkNvbXBUeEZ1bmMpOwogIH0KICBlbHNlCiAgewogICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRnJtQnVmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpV0xBTlRMX1R4Q29tcERlZmF1bHRDYik7CgogIH0KICB2b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgKHVpbnRwdHJfdCl2b3NGcm1CdWYpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhyZSBhcmUgZW5vdWdoIHJlc291cmNlcyBmb3IgdHJhbnNtaXNzaW9uIGFuZCB0eCBpcyBub3QKICAgIHN1c3BlbmRlZC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19NRiApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDpJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwgZm9yIE1HTVQiKSk7CiAgICB2b3NTdGF0dXMgPSBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCiAgICB7CiAgICAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAgIldMQU4gVEw6V0RBX0RTX1N0YXJ0WG1pdCBmYWlscy4gdm9zU3RhdHVzICVkIiwgdm9zU3RhdHVzKSk7CiAgICAgICB2b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLDApOwogICAgfQogICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIAogIH0KICBlbHNlCiAgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgTm8gZXJyb3IgY29kZSBpcyBzZW50IGJlY2F1c2UgVEwgd2lsbCByZXN1bWUgdHggYXV0b25vbW91c2x5IGlmCiAgICAgIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlIG9yIHR4IGdldHMgcmVzdW1lZAogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBmb3IgTWdtdCBGcm0gYnV0IGNvbmRpdGlvbiBub3QgbWV0LiBSZXM6ICVkIiwKICAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCkpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9UeE1nbXRGcm0gKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSU5URVJBQ1RJT04gV0lUSCBIQUwKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZXNldE5vdGlmaWNhdGlvbgoKICBERVNDUklQVElPTgogICAgSEFMIG5vdGlmaWVzIFRMIHdoZW4gdGhlIG1vZHVsZSBpcyBiZWluZyByZXNldC4KICAgIEN1cnJlbnRseSBub3QgdXNlZC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZXNldE5vdGlmaWNhdGlvbgooCiAgdl9QVk9JRF90ICAgcHZvc0dDdHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUmVzZXROb3RpZmljYXRpb24iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgV0xBTlRMX0NsZWFuQ0IocFRMQ2IsIDEgLyplbXB0eSBhbGwgcXVldWVzIGFuZCBwZW5kaW5nIHBhY2tldHMqLyk7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZXNldE5vdGlmaWNhdGlvbiAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU3VzcGVuZERhdGFUeAoKICBERVNDUklQVElPTgogICAgSEFMIGNhbGxzIHRoaXMgQVBJIHdoZW4gaXQgd2lzaGVzIHRvIHN1c3BlbmQgdHJhbnNtaXNzaW9uIGZvciBhCiAgICBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIG11c3QgYmUgZmlyc3QgcmVnaXN0ZXJlZCB3aXRoCiAgICBUTCBieSBIREQuCgogICAgUkVTVFJJQ1RJT046ICBJbiBjYXNlIG9mIGEgc3VzcGVuZCwgdGhlIGZsYWcgd3JpdGUgYW5kIHJlYWQgd2lsbCBub3QgYmUKICAgICAgICAgICAgICAgICAgbG9ja2VkOiB3b3JzdCBjYXNlIHNjZW5hcmlvIG9uZSBtb3JlIHBhY2tldCBjYW4gZ2V0CiAgICAgICAgICAgICAgICAgIHRocm91Z2ggYmVmb3JlIHRoZSBmbGFnIGdldHMgdXBkYXRlZCAod2UgY2FuIG1ha2UgdGhpcwogICAgICAgICAgICAgICAgICB3cml0ZSBhdG9taWMgYXMgd2VsbCB0byBndWFyYW50ZWUgY29uc2lzdGVuY3kpCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwdWNTVEFJZDogICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZTsKICAgICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIE5VTEwgYXNzdW1lcyBzdXNwZW5kIG9uIGFsbCBhY3RpdmUgc3RhdGlvbgogICAgcGZuU3VzcGVuZFR4Q0I6IHBvaW50ZXIgdG8gdGhlIHN1c3BlbmQgcmVzdWx0IG5vdGlmaWNhdGlvbiBpbiBjYXNlIHRoZQogICAgICAgICAgICAgICAgICAgIGNhbGwgaXMgYXN5bmNocm9ub3VzCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTCldMQU5UTF9TdXNwZW5kRGF0YVR4CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgICAgICAgICAgcHVjU1RBSWQsCiAgV0xBTlRMX1N1c3BlbmRDQlR5cGUgICBwZm5TdXNwZW5kVHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB2b3NfbXNnX3QgICAgICAgdm9zTXNnOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TdXNwZW5kRGF0YVR4IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayB0aGUgdHlwZSBvZiByZXF1ZXN0OiBnZW5lcmljIHN1c3BlbmQsIG9yIHBlciBzdGF0aW9uIHN1c3BlbmQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoTlVMTCA9PSBwdWNTVEFJZCkKICB7CiAgICAvKiBHZW5lcmFsIFN1c3BlbmQgUmVxdWVzdCByZWNlaXZlZCAqLwogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDpHZW5lcmFsIHN1c3BlbmQgcmVxdWVzdGVkIikpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMSk7CiAgICB2b3NNc2cucmVzZXJ2ZWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggKnB1Y1NUQUlkICkgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgJWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9TdXNwZW5kRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0gKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcFRMQ2ItPmF0bFNUQUNsaWVudHMgcG9pbnRlciBmb3IgU1RBIElkIDolZCBvbiAiCiAgICAgICAgICAgICJXTEFOVExfU3VzcGVuZERhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0V4aXN0cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gJWQgd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1N1c3BlbmREYXRhVHgiLCAqcHVjU1RBSWQpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgIldMQU4gVEw6U3VzcGVuZCByZXF1ZXN0IGZvciBzdGF0aW9uOiAlZCIsICpwdWNTVEFJZCkpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y1R4U3VzcGVuZGVkLCAxKTsKICAgIHZvc01zZy5yZXNlcnZlZCA9ICpwdWNTVEFJZDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTZXJpYWxpemUgcmVxdWVzdCB0aHJvdWdoIFRYIHRocmVhZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc01zZy50eXBlICAgICA9IFdMQU5UTF9UWF9TSUdfU1VTUEVORDsKICB2b3NNc2cuYm9keXB0ciAgICAgPSAodl9QVk9JRF90KXBmblN1c3BlbmRUeDsKCiAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX1NVU1BFTkRfREFUQV9UWCwKICAgICAgICAgICAgICAgICAgICB2b3NNc2cucmVzZXJ2ZWQgLCAwICkpOwoKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NUV9JRF9UTCwgJnZvc01zZykpKQogIHsKICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiICVzIGZhaWxzIHRvIHBvc3QgbWVzc2FnZSIsIF9fZnVuY19fKTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU3VzcGVuZERhdGFUeCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUmVzdW1lRGF0YVR4CgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEFMIHRvIHJlc3VtZSBkYXRhIHRyYW5zbWlzc2lvbiBmb3IgYSBnaXZlbiBTVEEuCgogICAgV0FSTklORzogSWYgYSBzdGF0aW9uIHdhcyBpbmRpdmlkdWFsbHkgc3VzcGVuZGVkIGEgZ2xvYmFsIHJlc3VtZSB3aWxsCiAgICAgICAgICAgICBub3QgcmVzdW1lIHRoYXQgc3RhdGlvbgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHB1Y1NUQUlkOiAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIHdoaWNoIGlzIGJlaW5nIHJlc3VtZWQ7IE5VTEwKICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVzIGludG8gZ2xvYmFsIHJlc3VtZQoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTCldMQU5UTF9SZXN1bWVEYXRhVHgKKAogIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgIHB1Y1NUQUlkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1Jlc3VtZURhdGFUeCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgdG8gc2VlIHRoZSB0eXBlIG9mIHJlc3VtZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdWNTVEFJZCApCiAgewogICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX1JFU1VNRV9EQVRBX1RYLAogICAgICAgICAgICAgICAgICAgICAgNDEgLCAwICkpOwoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6R2VuZXJhbCByZXN1bWUgcmVxdWVzdGVkIikpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMCk7CiAgfQogIGVsc2UKICB7CiAgICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfUkVTVU1FX0RBVEFfVFgsCiAgICAgICAgICAgICAgICAgICAgICAqcHVjU1RBSWQgLCAwICkpOwoKICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCAqcHVjU1RBSWQgKSkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgJWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9SZXN1bWVEYXRhVHgiLCAqcHVjU1RBSWQpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXSApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwVExDYi0+YXRsU1RBQ2xpZW50cyBwb2ludGVyIGZvciBTVEEgSWQgOiVkIG9uICIKICAgICAgICAgICAgIldMQU5UTF9SZXN1bWVEYXRhVHgiLCAqcHVjU1RBSWQpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNFeGlzdHMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpTdGF0aW9uICVkIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9SZXN1bWVEYXRhVHgiLCAqcHVjU1RBSWQpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgIldMQU4gVEw6UmVzdW1lIHJlcXVlc3QgZm9yIHN0YXRpb246ICVkIiwgKnB1Y1NUQUlkKSk7CiAgICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjVHhTdXNwZW5kZWQsIDApOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlc3VtaW5nIHRyYW5zbWlzc2lvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19NRiApICYmCiAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOlJlc3VtaW5nIHRyYW5zbWlzc2lvbiIpKTsKICAgIHJldHVybiBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVzdW1lRGF0YVR4ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1N1c3BlbmRDQgoKICBERVNDUklQVElPTgogICAgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHNlcmlhbGl6aW5nIFN1c3BlbmQgc2lnbmFsIHRocm91Z2ggVHggdGhyZWFkCgogIERFUEVOREVOQ0lFUwogICAgSnVzdCBub3RpZnkgSEFMIHRoYXQgc3VzcGVuZCBpbiBUTCBpcyBjb21wbGV0ZS4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgcFVzZXJEYXRhOiAgICAgIHVzZXIgZGF0YSBzZW50IHdpdGggdGhlIGNhbGxiYWNrCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TdXNwZW5kQ0IKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfU3VzcGVuZENCVHlwZSAgcGZuU3VzcGVuZENCLAogIHZfVTE2X3QgICAgICAgICAgICAgICB1c1Jlc2VydmVkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiAgID0gTlVMTDsKICB2X1U4X3QgICAgICAgICAgdWNTVEFJZCA9ICh2X1U4X3QpdXNSZXNlcnZlZDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwZm5TdXNwZW5kQ0IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogTm8gQ2FsbCBiYWNrIHByb2Nlc3NpbmcgcmVxdWVzdGVkIFdMQU5UTF9TdXNwZW5kQ0IiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TdXNwZW5kQ0IiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgcGZuU3VzcGVuZENCKHB2b3NHQ3R4LCBOVUxMLCBWT1NfU1RBVFVTX1NVQ0NFU1MpOwogIH0KICBlbHNlCiAgewogICAgcGZuU3VzcGVuZENCKHB2b3NHQ3R4LCAmdWNTVEFJZCwgVk9TX1NUQVRVU19TVUNDRVNTKTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9TdXNwZW5kQ0IqLwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ0xJRU5UIElOREVQRU5ERU5UIElOVEVSRkFDRQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFR4UGt0Q291bnQKCiAgREVTQ1JJUFRJT04KICAgIFRMIHdpbGwgcHJvdmlkZSB0aGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHBhY2tldHMgY291bnRlZCBwZXIKICAgIFNUQSBwZXIgVElELgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uCiAgICB1Y1RpZDogICAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgdHNwZWMKCiAgICBPVVQKICAgIHB1VHhQa3RDb3VudDogICB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdHggcGFja2V0IGZvciB0aGlzIFNUQSBhbmQgVElECgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldFR4UGt0Q291bnQKKAogIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgIHVjU1RBSWQsCiAgdl9VOF90ICAgICAgICAgdWNUaWQsCiAgdl9VMzJfdCogICAgICAgcHVUeFBrdENvdW50CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHVUeFBrdENvdW50ICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldFR4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSB8fCBXTEFOVExfVElEX0lOVkFMSUQoIHVjVGlkKSApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCAlZC90aWQgJWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9HZXRUeFBrdENvdW50IiwKICAgICAgICAgICAgdWNTVEFJZCwgdWNUaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBpZiBzdGF0aW9uIGV4aXN0cwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldFR4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9HZXRUeFBrdENvdW50ICVkIiwKICAgICB1Y1NUQUlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXR1cm4gZGF0YQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIC8vVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCiAgICAvLyAgICAgICAgICJXTEFOIFRMOlJlcXVlc3RlZCB0eCBwYWNrZXQgY291bnQgZm9yIFNUQTogJWQsIFRJRDogJWQiLCAKICAgICAgLy8gICAgICAgICB1Y1NUQUlkLCB1Y1RpZCk7CgogICpwdVR4UGt0Q291bnQgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+YXVUeENvdW50W3VjVGlkXTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRUeFBrdENvdW50ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRSeFBrdENvdW50CgogIERFU0NSSVBUSU9OCiAgICBUTCB3aWxsIHByb3ZpZGUgdGhlIG51bWJlciBvZiByZWNlaXZlZCBwYWNrZXRzIGNvdW50ZWQgcGVyCiAgICBTVEEgcGVyIFRJRC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbgogICAgdWNUaWQ6ICAgICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHRzcGVjCgogICBPVVQKICAgIHB1VHhQa3RDb3VudDogICB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcnggcGFja2V0IGZvciB0aGlzIFNUQSBhbmQgVElECgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldFJ4UGt0Q291bnQKKAogIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgIHVjU1RBSWQsCiAgdl9VOF90ICAgICAgICAgdWNUaWQsCiAgdl9VMzJfdCogICAgICAgcHVSeFBrdENvdW50CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB1UnhQa3RDb3VudCApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRSeFBrdENvdW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgfHwgV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCAlZC90aWQgJWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9HZXRSeFBrdENvdW50IiwKICAgICAgICAgICAgIHVjU1RBSWQsIHVjVGlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRSeFBrdENvdW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9HZXRSeFBrdENvdW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmV0dXJuIGRhdGEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzMoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCiAgICAgICAgICAgICJXTEFOIFRMOlJlcXVlc3RlZCByeCBwYWNrZXQgY291bnQgZm9yIFNUQTogJWQsIFRJRDogJWQiLAogICAgICAgICAgICAgdWNTVEFJZCwgdWNUaWQpKTsKCiAgKnB1UnhQa3RDb3VudCA9IHBDbGllbnRTVEEtPmF1UnhDb3VudFt1Y1RpZF07CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0UnhQa3RDb3VudCAqLwoKVk9TX1NUQVRVUwpXTEFOVExfVHhGQ0ZyYW1lCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgKKTsKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICBUTCBJTlRFUk5BTCBBUEkgREVGSU5JVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldEZyYW1lcwoKICBERVNDUklQVElPTgoKICAgIEJBTCBjYWxscyB0aGlzIGZ1bmN0aW9uIGF0IHRoZSByZXF1ZXN0IG9mIHRoZSBsb3dlciBidXMgaW50ZXJmYWNlLgogICAgV2hlbiB0aGlzIHJlcXVlc3QgaXMgYmVpbmcgcmVjZWl2ZWQgVEwgd2lsbCByZXRyaWV2ZSBwYWNrZXRzIGZyb20gSERECiAgICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHByaW9yaXR5IHJ1bGVzIGFuZCB0aGUgY291bnQgc3VwcGxpZWQgYnkgQkFMLgoKICBERVBFTkRFTkNJRVMKCiAgICBIREQgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgd2l0aCBUTCBhdCBsZWFzdCBvbmUgU1RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uCiAgICBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBCQUwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdVNpemU6ICAgICAgICAgIG1heGltdW0gc2l6ZSBhY2NlcHRlZCBieSB0aGUgbG93ZXIgbGF5ZXIKICAgIHVGbG93TWFzayAgICAgICBUWCBmbG93IGNvbnRyb2wgbWFzayBmb3IgUHJpbWEuIEVhY2ggYml0IGlzIGRlZmluZWQgYXMgCiAgICAgICAgICAgICAgICAgICAgV0RBX1RYRmxvd0VudW1UeXBlCgogICAgT1VUCiAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBidWZmZXIgc3VwcGxpZWQKICAgICAgICAgICAgICAgICAgICBieSBUTCwgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWNrZXQgc3VwcGxpZWQsIFRMCiAgICAgICAgICAgICAgICAgICAgd2lsbCBjaGFpbiB0aGVtIHRocm91Z2ggdk9TUyBidWZmZXJzCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgMSBvciBtb3JlOiBudW1iZXIgb2YgcmVxdWlyZWQgcmVzb3VyY2VzIGlmIHRoZXJlIGFyZSBzdGlsbCBmcmFtZXMgdG8gZmV0Y2gKICAgIDAgOiBlcnJvciBvciBIREQgcXVldWVzIGFyZSBkcmFpbmVkCgogIFNJREUgRUZGRUNUUwoKICBOT1RFCiAgICAKICAgIEZlYXR1cml6ZWQgdUZsb3dNYXNrLiBJZiB3ZSB3YW50IHRvIHJlbW92ZSBmZWF0dXJpemF0aW9uLCB3ZSBuZWVkIHRvIGNoYW5nZQogICAgQkFMIG9uIFZvbGFucy4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X1UzMl90CldMQU5UTF9HZXRGcmFtZXMKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QgICAgICoqcHBGcmFtZURhdGFCdWZmLAogIHZfVTMyX3QgICAgICAgICB1U2l6ZSwKICB2X1U4X3QgICAgICAgICAgdUZsb3dNYXNrLAogIHZfQk9PTF90KiAgICAgICBwYlVyZ2VudAopCnsKICAgdm9zX3BrdF90KiogICAgICAgICBwdm9zRGF0YUJ1ZmYgPSAodm9zX3BrdF90KiopcHBGcmFtZURhdGFCdWZmOwogICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogICB2X1UzMl90ICAgICAgICAgICAgIHVSZW1haW5pbmcgPSB1U2l6ZTsKICAgdm9zX3BrdF90KiAgICAgICAgICB2b3NSb290OwogICB2b3NfcGt0X3QqICAgICAgICAgIHZvc1RlbXBCdWY7CiAgIFdMQU5UTF9TVEFGdW5jVHlwZSAgcGZuU1RBRnNtOwogICB2X1UxNl90ICAgICAgICAgICAgIHVzUGt0TGVuOwogICB2X1UzMl90ICAgICAgICAgICAgIHVSZXNMZW47CiAgIHZfVThfdCAgICAgICAgICAgICAgdWNTVEFJZDsKICAgdl9VOF90ICAgICAgICAgICAgICB1Y0FDOwogICB2b3NfcGt0X3QqICAgICAgICAgIHZvc0RhdGFCdWZmOwogICB2X1UzMl90ICAgICAgICAgICAgIHVUb3RhbFBrdExlbjsKICAgdl9VMzJfdCAgICAgICAgICAgICBpPTA7CiAgIHZfVTMyX3QgICAgICAgICAgICAgaj0wOwogICB2X1UzMl90ICAgICAgICAgICAgIHVjUmVzdWx0ID0gMDsKICAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgIFdMQU5UTF9TVEFFdmVudFR5cGUgICB3U1RBRXZlbnQ7CiAgIHRCc3NTeXN0ZW1Sb2xlICAgICAgIHN5c3RlbVJvbGU7CiAgIHRwQW5pU2lyR2xvYmFsIHBNYWM7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8ICggTlVMTCA9PSBwdm9zRGF0YUJ1ZmYgKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiB1Y1Jlc3VsdDsKICB9CgogIHBNYWMgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9QRSwgcHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwTWFjICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcE1hYyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gdWNSZXN1bHQ7CiAgfQoKICB2b3NEYXRhQnVmZiA9IHBUTENiLT52b3NEdW1teUJ1ZjsgLyogSnVzdCB0byBhdm9pZCBjaGVja2luZyBmb3IgTlVMTCBhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggaXRlcmF0aW9uICovCgogIHBUTENiLT51UmVzQ291bnQgPSB1U2l6ZTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSB0aGUgcm9vdCBhcyB3ZSB3aWxsIHdhbGsgdGhpcyBjaGFpbiBhcyB3ZSBmaWxsIGl0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NSb290ID0gdm9zRGF0YUJ1ZmY7CiAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUaGVyZSBpcyBzdGlsbCBkYXRhIC0gdW50aWwgRlNNIGZ1bmN0aW9uIHNheXMgb3RoZXJ3aXNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYi0+YlVyZ2VudCAgICAgID0gRkFMU0U7CgogIHdoaWxlICgoIHBUTENiLT50bENvbmZpZ0luZm8udU1pbkZyYW1lc1Byb2NUaHJlcyA8IHBUTENiLT51UmVzQ291bnQgKSAmJgogICAgICAgICAoIDAgPCB1UmVtYWluaW5nICkpCiAgewogICAgc3lzdGVtUm9sZSA9IHdkYUdldEdsb2JhbFN5c3RlbVJvbGUocE1hYyk7CiNpZmRlZiBXTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTgovKiBGSVhNRTogVGhlIGNvZGUgaGFzIGJlZW4gZGlzYWJsZWQgc2luY2UgaXQgaXMgY3JlYXRpbmcgaXNzdWVzIGluIHBvd2VyIHNhdmUgKi8KICAgIGlmIChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkKICAgIHsKICAgICAgIGlmIChwVExDYi0+ZG9uZV9vbmNlID09IDAgJiYgTlVMTCA9PSBwVExDYi0+dm9zVHhGQ0J1ZikKICAgICAgIHsKICAgICAgICAgIFdMQU5UTF9UeEZDRnJhbWUgKHB2b3NHQ3R4KTsKICAgICAgICAgIHBUTENiLT5kb25lX29uY2UgKys7CiAgICAgICB9CiAgICB9IAogICAgaWYgKCBOVUxMICE9IHBUTENiLT52b3NUeEZDQnVmICkKICAgIHsKICAgICAgIC8vdGhlcmUgaXMgZmxvdyBjb250cm9sIHBhY2tldCB3YWl0aW5nIHRvIGJlIHNlbnQKICAgICAgIFdEQV9UTElfUFJPQ0VTU19GUkFNRV9MRU4oIHBUTENiLT52b3NUeEZDQnVmLCB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKICAgIAogICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPiB1UmVzTGVuICkgJiYKICAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkgJiYKICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19GQyApICkgKQogICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIEZDIGZyYW1lIGZpcnN0IG9uIEdldEZyYW1lIikpOwoKICAgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwgcFRMQ2ItPnZvc1R4RkNCdWYsIDEgLyp0cnVlKi8gKTsKCiAgICAgICAgICB2b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT52b3NUeEZDQnVmLCAodWludHB0cl90KSBOVUxMKTsKCiAgICAgICAgICAvKkZDIGZyYW1lcyBjYW5ub3QgYmUgZGVsYXllZCovCiAgICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgICB1UmVtYWluaW5nICAgICAgICAtPSAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAtPSB1UmVzTGVuOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpzZW5kIGZjIG91dCBvZiBzb3VyY2UgJXMiLCBfX2Z1bmNfXykpOwogICAgICAgICAgdWNSZXN1bHQgPSAoIHBUTENiLT51UmVzQ291bnQgPiB1UmVzTGVuICk/Vk9TX1RSVUU6Vk9TX0ZBTFNFOwogICAgICAgICAgYnJlYWs7IC8qIE91dCBvZiByZXNvdXJjZXMgb3IgcmVhY2hlZCBtYXggbGVuICovCiAgICAgICB9CiAgIH0KICAgZWxzZSAKI2VuZGlmIC8vV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KCiAgICBpZiAoKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkgJiYKICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX01HTVQgKSApICkKICAgIHsKICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CgogICAgICBpZiAodXNQa3RMZW4gPiBXTEFOVExfTUFYX0FMTE9XRURfTEVOKQogICAgICB7CiAgICAgICAgICB1c1BrdExlbiA9IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU47CiAgICAgICAgICBWT1NfQVNTRVJUKDApOwogICAgICB9CgogICAgICBpZiAoICggcFRMQ2ItPnVSZXNDb3VudCA+IHVSZXNMZW4gKSAmJgogICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApICYmCiAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19NR01UICkgKSApCiAgICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgbWFuYWdlbWVudCBmcmFtZSBvbiBHZXRGcmFtZSIpKTsKCiAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKnRydWUqLyApOwoKICAgICAgICB2b3NfYXRvbWljX3NldCggKHVpbnRwdHJfdCopJnBUTENiLT50bE1nbXRGcm1DbGllbnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NQZW5kaW5nRGF0YUJ1ZmYsICh1aW50cHRyX3QpTlVMTCk7CgogICAgICAgIC8qbWFuYWdlbWVudCBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogICAgICAgIHBUTENiLT5iVXJnZW50ICAgICAgPSBUUlVFOwoKICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgdVJlbWFpbmluZyAgICAgICAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgIC8qVXBkYXRlIHJlc291cmNlIGNvdW50ICovCiAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAtPSB1UmVzTGVuOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHVjUmVzdWx0ID0gKCBwVExDYi0+dVJlc0NvdW50ID4gdVJlc0xlbiApP1ZPU19UUlVFOlZPU19GQUxTRTsKICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoKCBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkgJiYKICAgICAgICAgICAgICggV0RBX1RMSV9NSU5fUkVTX0JBUCA8PSBwVExDYi0+dVJlc0NvdW50ICkgJiYKICAgICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICAgICAgICAgICkKICAgIHsKICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKCiAgICAgIGlmICh1c1BrdExlbiA+IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4pCiAgICAgIHsKICAgICAgICAgIHVzUGt0TGVuID0gV0xBTlRMX01BWF9BTExPV0VEX0xFTjsKICAgICAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIH0KCiAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID4gKHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfTUYgKSApICYmCiAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkpCiAgICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgQlQtQU1QIGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyp0cnVlKi8gKTsKCiAgICAgICAgLypCQVAgZnJhbWVzIGNhbm5vdCBiZSBkZWxheWVkKi8KICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgdm9zX2F0b21pY19zZXQoICh1aW50cHRyX3QqKSZwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KSBOVUxMKTsKCiAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgIHVSZW1haW5pbmcgICAgICAgIC09ICAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICBwVExDYi0+dVJlc0NvdW50ICAtPSB1UmVzTGVuOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHVjUmVzdWx0ID0gdVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19NRjsKICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KICAgICAgfQogICAgfQogICAgLyogbm90ZTogdGhpcyBmZWF0dXJlIGltcGxlbWVudGVkIG9ubHkgYWZ0ZXIgV0xBTl9JTkdFVFJBVEVEX1NPQyAqLwogICAgLyogc2VhcmNoICdFQVBPTF9ISV9QUklPUklUWScgd2lsbCBzaG93IEVBUE9MIEhJX1BSSU9SSVRZIGNoYW5nZSBpbiBUTCBhbmQgV0RJCiAgICAgICBieSBkZWZhdWx0LCBFQVBPTCB3aWxsIGJlIHRyZWF0ZWQgYXMgaGlnaGVyIHByaW9yaXR5LCB3aGljaCBtZWFucwogICAgICAgdXNlIG1nbXRfcG9vbCBhbmQgRFhFX1RYX0hJIHByb3JpdHkgY2hhbm5lbC4KICAgICAgIHRoaXMgaXMgaW50cm9kdWNlZCB0byBhZGRyZXNzIEVBUE9MIGZhaWx1cmUgdW5kZXIgaGlnaCBiYWNrZ3JvdW5kIHRyYWZmaWMKICAgICAgIHdpdGggbXVsdGktY2hhbm5lbCBjb25jdXJyZW50IG1vZGUuIEJ1dCB0aGlzIGNoYW5nZSB3b3JrcyBpbiBTQ0Mgb3Igc3RhbmRhbG9uZSwgdG9vLgogICAgICAgc2VlIENSIzM4NzAwOSBhbmQgV0NOU09TLTgKICAgICAqLwogICAgZWxzZSBpZiAoKCBXREFfVExJX01JTl9SRVNfTUYgPD0gcFRMQ2ItPnVSZXNDb3VudCApJiYKICAgICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICYmCiAgICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX01HTVQgKSApCiAgICAgICAgICAgICkKICAgIHsKICAgICAgICB2b3NUZW1wQnVmID0gTlVMTDsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBDaGVjayB0byBzZWUgaWYgdGhlcmUgd2FzIGFueSBFQVBPTCBwYWNrZXQgaXMgcGVuZGluZwogICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGZvciAoIGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICAgICAgewogICAgICAgICAgIGlmICgoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSkgJiYKICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y0V4aXN0cykgJiYKICAgICAgICAgICAgICAgKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjVHhTdXNwZW5kZWQpICYmCiAgICAgICAgICAgICAgIChXTEFOVExfU1RBX0NPTk5FQ1RFRCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dGxTdGF0ZSkgJiYKICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y1BrdFBlbmRpbmcpCiAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA+PSBXTEFOX01BWF9TVEFfQ09VTlQpCiAgICAgICAgewogICAgICAgICAgIC8qIE5vIE1vcmUgdG8gU2VydmUgRXhpdCBHZXQgRnJhbWVzICovCiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIFNlcnZlIEVBUE9MIGZyYW1lIHdpdGggSElfRkxPV19NQVNLICovCiAgICAgICAgdWNTVEFJZCA9IGk7CgogICAgICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwKICAgICAgICAgICAgICAgICAgIFRSQUNFX0NPREVfVExfR0VUX0ZSQU1FU19FQVBPTCwgdWNTVEFJZCwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnRsU3RhdGUpKTsKCiAgICAgICAgZm9yIChqID0gV0xBTlRMX01BWF9BQyA7IGogPiAwOyBqLS0pCiAgICAgICAgewogICAgICAgICAgaWYgKDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPmF1Y0FDTWFza1tqLTFdKQogICAgICAgICAgewogICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNDdXJyZW50QUMgPSBqLTE7CiAgICAgICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBqLTE7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogICAgICAgIHdTVEFFdmVudCA9IFdMQU5UTF9UWF9FVkVOVDsKCiAgICAgICAgcGZuU1RBRnNtID0gdGxTVEFGc21bcENsaWVudFNUQS0+dGxTdGF0ZV0uCiAgICAgICAgICAgICAgICAgICAgICAgIHBmblNUQVRibFt3U1RBRXZlbnRdOwoKICAgICAgICBpZiAoIE5VTEwgIT0gcGZuU1RBRnNtICkKICAgICAgICB7CiAgICAgICAgICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAwOwogICAgICAgICAgdm9zU3RhdHVzICA9IHBmblNUQUZzbSggcHZvc0dDdHgsIHVjU1RBSWQsICZ2b3NUZW1wQnVmLCBWT1NfRkFMU0UpOwoKICAgICAgICAgIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSAmJgogICAgICAgICAgICAgICggTlVMTCAhPSB2b3NUZW1wQnVmICkpCiAgICAgICAgICB7CiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCggcHZvc0dDdHgsIHZvc1RlbXBCdWYsIHZvc1N0YXR1cyApOwogICAgICAgICAgICAgICB2b3NUZW1wQnVmID0gTlVMTDsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9Lyogc3RhdHVzIHN1Y2Nlc3MqLwogICAgICAgIH0KCiAgICAgICAgaWYgKE5VTEwgIT0gdm9zVGVtcEJ1ZikKICAgICAgICB7CiAgICAgICAgICAgIFdEQV9UTElfUFJPQ0VTU19GUkFNRV9MRU4oIHZvc1RlbXBCdWYsIHVzUGt0TGVuLCB1UmVzTGVuLCB1VG90YWxQa3RMZW4pOwoKICAgICAgICAgICAgaWYgKHVzUGt0TGVuID4gV0xBTlRMX01BWF9BTExPV0VEX0xFTikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdXNQa3RMZW4gPSBXTEFOVExfTUFYX0FMTE9XRURfTEVOOwogICAgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6UmVzb3VyY2VzIG5lZWRlZCBieSBmcmFtZTogJWQiLCB1UmVzTGVuKSk7CgogICAgICAgICAgICBpZiAoICggcFRMQ2ItPnVSZXNDb3VudCA+PSAodVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19NRiApICkgJiYKICAgICAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkKICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgZGF0YSBmcmFtZSBvbiBHZXRGcmFtZSIpKTsKCiAgICAgICAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLCB2b3NUZW1wQnVmLCAxIC8qdHJ1ZSovICk7CgogICAgICAgICAgICAgIC8qRUFQT0wgZnJhbWUgY2Fubm90IGJlIGRlbGF5ZWQqLwogICAgICAgICAgICAgIHBUTENiLT5iVXJnZW50ICAgICAgPSBUUlVFOwoKICAgICAgICAgICAgICB2b3NUZW1wQnVmID0gIE5VTEw7CgogICAgICAgICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KICAgICAgICAgICAgICB1UmVtYWluaW5nICAtPSAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgICAgICAgIC8qVXBkYXRlIHJlc291cmNlIGNvdW50ICovCiAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAgLT0gdVJlc0xlbjsKCiAgICAgICAgICAgICAgLy9mb3cgY29udHJvbCB1cGRhdGUKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51SW5ncmVzc19sZW5ndGggKz0gdVJlc0xlbjsKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCA9IChwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCA+PSB1UmVzTGVuKSA/CiAgICAgICAgICAgICAgICAocENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggLSB1UmVzTGVuKSA6IDA7CiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWNFYXBvbFBrdFBlbmRpbmcgPSAwOwogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkdldEZyYW1lcyBTVEE6ICVkIEVBUE9MUGt0UGVuZGluZyAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT51Y0VhcG9sUGt0UGVuZGluZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsgIC8vIG5vIEVBUE9MIGZyYW1lcyBleGl0IEdldCBmcmFtZXMKICAgICAgICAgICAgVExMT0cyKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6R2V0RnJhbWVzIFNUQTogJWQsIG5vIEVBUE9MIGZyYW1lLCBjb250aW51ZS4iLAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgfQoKICAgIGVsc2UgaWYgKCggV0RBX1RMSV9NSU5fUkVTX0RBVEEgPD0gcFRMQ2ItPnVSZXNDb3VudCApICYmCiAgICAgICAgICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSAmJgogICAgICAgICAgICAgKCggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfQksgKSApIHx8CiAgICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19CRSApICkgfHwKICAgICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX1ZJICkgKSB8fAogICAgICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfVk8gKSApKSApCiAgICB7CiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbnkgcGFja2V0IGxlZnQgYmVoaW5kIHByZXZpb3VzbHkgZHVlIHRvCiAgICAgICAgc2l6ZSBjb25zdHJhaW50cwogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgdm9zVGVtcEJ1ZiA9IE5VTEw7CgogICAgICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnZvc1RlbXBCdWYgKSAKICAgICAgewogICAgICAgIHZvc1RlbXBCdWYgICAgICAgICAgPSBwVExDYi0+dm9zVGVtcEJ1ZjsKICAgICAgICBwVExDYi0+dm9zVGVtcEJ1ZiAgID0gTlVMTDsKICAgICAgICB1Y1NUQUlkICAgICAgICAgICAgID0gcFRMQ2ItPnVjQ2FjaGVkU1RBSWQ7IAogICAgICAgIHVjQUMgICAgICAgICAgICAgICAgPSBwVExDYi0+dWNDYWNoZWRBQzsKCiAgICAgICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y05vTW9yZURhdGEgPSAwOwogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIGNhY2hlZCBkYXRhIGZyYW1lIG9uIEdldEZyYW1lIikpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFdMQU5fVExHZXROZXh0VHhJZHMoIHB2b3NHQ3R4LCAmdWNTVEFJZCk7CiAgICAgICAgaWYgKHVjU1RBSWQgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKQogICAgICAgIHsKICAgICAgICAgLyogUGFja2V0cyBzdGFydCBjb21pbmcgaW4gZXZlbiBhZnRlciBpbnNtb2QgV2l0aG91dCAqCiAgICAgICAgICAgIHN0YXJ0aW5nIEhvc3RhcGQgb3IgSW50ZXJmYWNlIGJlaW5nIHVwICAgICAgICAgICAgKgogICAgICAgICAgICBEdXJpbmcgd2hpY2ggY2FzZXMgU1RBSUQgaXMgaW52YWxlZCBhbmQgaGVuY2UgCiAgICAgICAgICAgIHRoZSBjaGVjay4gSGFsTXNnX1NjbmFDb21wbGV0ZSBUcmlnZ2VycyAqLwoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIHVjQ3VycmVudEFDIHNob3VsZCBoYXZlIGNvcnJlY3QgQUMgdG8gYmUgc2VydmVkIGJ5IGNhbGxpbmcKICAgICAgICAgICBXTEFOX1RMR2V0TmV4dFR4SWRzICovCiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwogICAgICAgIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHVjQUMgPSBwQ2xpZW50U1RBLT51Y0N1cnJlbnRBQzsKCiAgICAgICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMTsKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogJXMgZ2V0IG9uZSBkYXRhIGZyYW1lLCBzdGF0aW9uIElEICVkICIsIF9fZnVuY19fLCB1Y1NUQUlkKSk7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgQ2hlY2sgdG8gc2VlIHRoYXQgU1RBIGlzIHZhbGlkIGFuZCB0eCBpcyBub3Qgc3VzcGVuZGVkCiAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGlmICggKCAhIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkgJiYKICAgICAgICAgICAoIDAgPT0gcENsaWVudFNUQS0+dWNUeFN1c3BlbmRlZCApICYmCiAgICAgICAgICAgKCAwID09IHBDbGllbnRTVEEtPmZjU3RhVHhEaXNhYmxlZCkgKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiAlcyBzdGEgaWQgdmFsaWQgYW5kIG5vdCBzdXNwZW5kZWQgIixfX2Z1bmNfXykpOwogICAgICAgICAgd1NUQUV2ZW50ID0gV0xBTlRMX1RYX0VWRU5UOwoKICAgICAgICAgIHBmblNUQUZzbSA9IHRsU1RBRnNtW3BDbGllbnRTVEEtPnRsU3RhdGVdLgogICAgICAgICAgICAgICAgICAgICAgICBwZm5TVEFUYmxbd1NUQUV2ZW50XTsKCiAgICAgICAgICBpZiAoIE5VTEwgIT0gcGZuU1RBRnNtICkKICAgICAgICAgIHsKICAgICAgICAgICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMDsKICAgICAgICAgICAgdm9zU3RhdHVzICA9IHBmblNUQUZzbSggcHZvc0dDdHgsIHVjU1RBSWQsICZ2b3NUZW1wQnVmLCBWT1NfRkFMU0UpOwoKICAgICAgICAgICAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApICYmCiAgICAgICAgICAgICAgICAoIE5VTEwgIT0gdm9zVGVtcEJ1ZiApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wKCBwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NTdGF0dXMgKTsKICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmID0gTlVMTDsKICAgICAgICAgICAgfS8qIHN0YXR1cyBzdWNjZXNzKi8KICAgICAgICAgIH0vKk5VTEwgZnVuY3Rpb24gc3RhdGUqLwogICAgICAgIH0vKiB2YWxpZCBTVEEgaWQgYW5kICEgc3VzcGVuZGVkKi8KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgIGlmICggISBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApIAogICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Tm90IGZldGNoaW5nIGZyYW1lIGJlY2F1c2Ugc3VzcGVuZGVkIGZvciBzdGEgSUQgJWQiLCAKICAgICAgICAgICAgICAgICAgIHVjU1RBSWQpKTsKICAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LyogZGF0YSAqLwoKICAgICAgaWYgKCBOVUxMICE9IHZvc1RlbXBCdWYgKQogICAgICB7CiAgICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggdm9zVGVtcEJ1ZiwgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CgogICAgICAgIGlmICh1c1BrdExlbiA+IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4pCiAgICAgICAgewogICAgICAgICAgICB1c1BrdExlbiA9IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU47CiAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgICAgfQoKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlJlc291cmNlcyBuZWVkZWQgYnkgZnJhbWU6ICVkIiwgdVJlc0xlbikpOwoKICAgICAgICBpZiAoICggcFRMQ2ItPnVSZXNDb3VudCA+PSAodVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19CQVAgKSApICYmCiAgICAgICAgICAgICAoIHVSZW1haW5pbmcgPiB1VG90YWxQa3RMZW4gKSAmJgogICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgdWNBQyApICkgKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgZGF0YSBmcmFtZSBvbiBHZXRGcmFtZSIpKTsKCiAgICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsIHZvc1RlbXBCdWYsIDEgLyp0cnVlKi8gKTsKICAgICAgICAgIHZvc1RlbXBCdWYgPSAgTlVMTDsKCiAgICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgICB1UmVtYWluaW5nICAgICAgICAtPSAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICAgIHBUTENiLT51UmVzQ291bnQgIC09IHVSZXNMZW47CgogICAgICAgICAgLy9mb3cgY29udHJvbCB1cGRhdGUKICAgICAgICAgIHBDbGllbnRTVEEtPnVJbmdyZXNzX2xlbmd0aCArPSB1UmVzTGVuOwogICAgICAgICAgcENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggPSAocENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggPj0gdVJlc0xlbikgPwogICAgICAgICAgICAocENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggLSB1UmVzTGVuKSA6IDA7CgogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgLyogU3RvcmUgdGhpcyBmb3IgbGF0ZXIgdHggLSBhbHJlYWR5IGZldGNoZWQgZnJvbSBIREQgKi8KICAgICAgICAgIHBUTENiLT52b3NUZW1wQnVmID0gdm9zVGVtcEJ1ZjsKICAgICAgICAgIHBUTENiLT51Y0NhY2hlZFNUQUlkID0gdWNTVEFJZDsKICAgICAgICAgIHBUTENiLT51Y0NhY2hlZEFDICAgID0gdWNBQzsKICAgICAgICAgIHVjUmVzdWx0ID0gdVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19CQVA7CiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAibWluICVkIHJlcyByZXF1aXJlZCBieSBUTC4iLCB1Y1Jlc3VsdCApKTsKICAgICAgICAgIGJyZWFrOyAvKiBPdXQgb2YgcmVzb3VyY2VzIG9yIHJlYWNoZWQgbWF4IGxlbiAqLwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKQogICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSAmJiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjRXhpc3RzKSAmJgogICAgICAgICAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjUGt0UGVuZGluZykpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAvKiBUaGVyZSBpcyBzdGF0aW9uIHRvIGJlIFNlcnZlZCAqLwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGlmIChpID49IFdMQU5fTUFYX1NUQV9DT1VOVCkKICAgICAgICAgICB7CiAgICAgICAgICAgICAgLyogTm8gTW9yZSB0byBTZXJ2ZSBFeGl0IEdldCBGcmFtZXMgKi8KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQogICAgICAgICAgIHsKICAgICAgICAgICAgICAvKiBNb3JlIHRvIGJlIFNlcnZlZCAqLwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIH0KICAgICAgICB9IAogICAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZXR1cm5pbmcgZnJvbSBHZXRGcmFtZTogcmVzb3VyY2VzID0gJWQgc3VzcGVuZGVkID0gJWQiLAogICAgICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQsIHBUTENiLT51Y1R4U3VzcGVuZGVkKSk7CiAgICAgIC8qIFRMIGlzIHN0YXJ2aW5nIGV2ZW4gd2hlbiBEWEUgaXMgbm90IGluIGxvdyByZXNvdXJjZSBjb25kaXRpb24gCiAgICAgICAgIFJldHVybiBtaW4gcmVzb3VyY2UgbnVtYmVyIHJlcXVpcmVkIGFuZCBMZXQgRFhFIGRlY2VpZGUgd2hhdCB0byBkbyAqLwogICAgICBpZigoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSAmJiAKICAgICAgICAgKCggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfQksgKSApIHx8IAogICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19CRSApICkgfHwKICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfVkkgKSApIHx8IAogICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19WTyApICkpKQogICAgICB7CiAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAiV0xBTiBUTDpSZXR1cm5pbmcgZnJvbSBHZXRGcmFtZTogcmVzb3VyY2VzID0gJWQiLAogICAgICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQpKTsKICAgICAgICAgdWNSZXN1bHQgPSBXREFfVExJX01JTl9SRVNfREFUQTsKICAgICAgfQogICAgICAgYnJlYWs7IC8qb3V0IG9mIG1pbiBkYXRhIHJlc291cmNlcyovCiAgICB9CgogICAgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCsrOwogICAgLyogTW92ZSBkYXRhIGJ1ZmZlciB1cCBvbmUgcGFja2V0ICovCiAgICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwgJnZvc0RhdGFCdWZmLCAwLypmYWxzZSovICk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFBhY2tldCBjaGFpbiBzdGFydHMgYXQgcm9vdCArIDEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zUm9vdCwgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8gKTsKCiAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOwogIGlmIChwYlVyZ2VudCkKICB7CiAgICAgICpwYlVyZ2VudCAgICAgPSBwVExDYi0+YlVyZ2VudDsKICB9CiAgZWxzZQogIHsKICAgICAgVk9TX0FTU0VSVCggcGJVcmdlbnQgKTsKICB9CiAgcmV0dXJuIHVjUmVzdWx0Owp9LyogV0xBTlRMX0dldEZyYW1lcyAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4Q29tcAoKICBERVNDUklQVElPTgogICAgSXQgaXMgYmVpbmcgY2FsbGVkIGJ5IEJBTCB1cG9uIGFzeW5jaHJvbm91cyBub3RpZmljYXRpb24gb2YgdGhlIHBhY2tldAogICAgb3IgcGFja2V0cyAgYmVpbmcgc2VudCBvdmVyIHRoZSBidXMuCgogIERFUEVOREVOQ0lFUwogICAgVHggY29tcGxldGUgY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGEgcHJldmlvdXMgdHJhbnNtaXQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBidWZmZXIgZm9yIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCByZXBvcnQgaXMgYmVpbmcgbWFkZSwgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZQogICAgICAgICAgICAgICAgICAgIHBhY2tldCB0aGV5IHdpbGwgYmUgY2hhaW5lZCB1c2luZyB2T1NTIGJ1ZmZlcnMuCiAgICB3VHhTdGF0dXM6ICAgICAgdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0LCBzZWUgYWJvdmUgY2hhcHRlcgogICAgICAgICAgICAgICAgICAgIG9uIEhERCBpbnRlcmFjdGlvbiBmb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeENvbXAKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QgICAgICAqcEZyYW1lRGF0YUJ1ZmYsCiAgVk9TX1NUQVRVUyAgICAgIHdUeFN0YXR1cwopCnsKICB2b3NfcGt0X3QqICAgICAgICAgICB2b3NEYXRhQnVmZiA9ICh2b3NfcGt0X3QqKXBGcmFtZURhdGFCdWZmOwogIFdMQU5UTF9DYlR5cGUqICAgICAgIHBUTENiICAgICA9IE5VTEw7CiAgV0xBTlRMX1R4Q29tcENCVHlwZSAgcGZuVHhDb21wID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgdm9zX3BrdF90KiAgICAgICAgICAgdm9zVGVtcFR4ID0gTlVMTDsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXh0cmFuZW91cyBOVUxMIGRhdGEgcG9pbnRlciBvbiBXTEFOVExfVHhDb21wIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1R4Q29tcCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICB3aGlsZSAoKDAgPCBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50KSAmJgogICAgICAgICAoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMgKSAmJgogICAgICAgICAoIE5VTEwgIT0gIHZvc0RhdGFCdWZmKSkKICB7CiAgICB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCAgdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcGZuVHhDb21wKTsKCiAgICAvKml0IHNob3VsZCBuZXZlciBiZSBOVUxMIC0gZGVmYXVsdCBoYW5kbGVyIHNob3VsZCBiZSByZWdpc3RlcmVkIGlmIG5vbmUqLwogICAgaWYgKCBOVUxMID09IHBmblR4Q29tcCApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOk5VTEwgcG9pbnRlciB0byBUeCBDb21wbGV0ZSBvbiBXTEFOVExfVHhDb21wIikpOwogICAgICBWT1NfQVNTRVJUKDApOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbGxpbmcgVHggY29tcGxldGUgZm9yIHBrdCAlcCBpbiBmdW5jdGlvbiAlcCIsCiAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmLCBwZm5UeENvbXApKTsKCiAgICB2b3NUZW1wVHggPSB2b3NEYXRhQnVmZjsKICAgIHZvc1N0YXR1cyA9IHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8pOwoKICAgIHBmblR4Q29tcCggcHZvc0dDdHgsIHZvc1RlbXBUeCwgd1R4U3RhdHVzICk7CgogICAgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudC0tOwogIH0KCiAKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDogY3VycmVudCBUTCB2YWx1ZXMgYXJlOiByZXNvdXJjZXMgPSAlZCAiCiAgICAgICAgICAgICJwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50ID0gJWQiLAogICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQsIHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9UeENvbXAgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NhY2hlU1RBRnJhbWUKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGZvciBjYWNoaW5nIGluY29taW5nIGRhdGEgZnJhbWVzIHRoYXQgZG8gCiAgICBub3QgaGF2ZSBhIHJlZ2lzdGVyZWQgc3RhdGlvbiB5ZXQuIAoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgSW4gb3JkZXIgdG8gYmVuZWZpdCBmcm9tIHRoc2kgY2FjaGluZywgdGhlIGNvbXBvbmVudHMgbXVzdCBlbnN1cmUgdGhhdAogICAgdGhleSB3aWxsIG9ubHkgcmVnaXN0ZXIgd2l0aCBUTCBhdCB0aGUgbW9tZW50IHdoZW4gdGhleSBhcmUgZnVsbHkgc2V0dXAKICAgIGFuZCByZWFkeSB0byByZWNlaXZlIGluY29taW5nIGRhdGEgCiAgIAogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgCiAgICBwVExDYjogICAgICAgICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgICB1Y1NUQUlkOiAgICAgICAgICAgICAgICBzdGF0aW9uIGlkCiAgICB2b3NUZW1wQnVmZjogICAgICAgICAgICB0aGUgZGF0YSBwYWNrZXQKICAgIHVEUFVTaWc6ICAgICAgICAgICAgICAgIERQVSBzaWduYXR1cmUgb2YgdGhlIGluY29taW5nIHBhY2tldAogICAgYkJjYXN0OiAgICAgICAgICAgICAgICAgdHJ1ZSBpZiBwYWNrZXQgaGFkIHRoZSBNQy9CQyBiaXQgc2V0IAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCBvciBTVEEgSWQgaW52YWxpZCA7IGFjY2VzcwogICAgICAgICAgICAgICAgICAgICAgICAgIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgVk9TX1NUQVRVUwpXTEFOVExfQ2FjaGVTVEFGcmFtZQooCiAgV0xBTlRMX0NiVHlwZSogICAgcFRMQ2IsCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqICAgICAgICB2b3NUZW1wQnVmZiwKICB2X1UzMl90ICAgICAgICAgICB1RFBVU2lnLAogIHZfVThfdCAgICAgICAgICAgIGJCY2FzdCwKICB2X1U4X3QgICAgICAgICAgICB1Y0ZybVR5cGUKKQp7CiAgdl9VOF90ICAgIHVjVWNhc3RTaWc7CiAgdl9VOF90ICAgIHVjQmNhc3RTaWc7CiAgdl9CT09MX3QgIGJPbGRTVEFQa3Q7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgU2FuaXR5IGNoZWNrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8ICggTlVMTCA9PSB2b3NUZW1wQnVmZiApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBJbnZhbGlkIGlucHV0IHBvaW50ZXIgb24gV0xBTlRMX0NhY2hlU1RBRnJhbWUgVEwgJXAiCiAgICAgICAgICAgICAgICIgUGFja2V0ICVwIiwgcFRMQ2IsIHZvc1RlbXBCdWZmICkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ2FjaGVTVEFGcmFtZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpBdHRlbXB0aW5nIHRvIGNhY2hlIHBrdCBmb3IgU1RBICVkLCBCRCBEUFUgU2lnOiAlZCB3aXRoIHNpZyBVQzogJWQsIEJDOiAlZCIsIAogICAgICAgICAgICAgdWNTVEFJZCwgdURQVVNpZywKICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcsCiAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnKSk7CgogIGlmKFdMQU5UTF9JU19DVFJMX0ZSQU1FKHVjRnJtVHlwZSkpCiAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyBuZWVkIHRvIGNhY2hlIENUUkwgZnJhbWUuIERyb3BwaW5nIikpOwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOyAKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhlIHBhY2tldCB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gY2FjaGUgYmVsb25ncyB0byB0aGUgb2xkCiAgICByZWdpc3RlcmVkIHN0YXRpb24gKGlmIGFueSkgb3IgdGhlIG5ldyAocG90ZW50aWFsbHkpdXBjb21pbmcgc3RhdGlvbgogICAgCiAgICAtIElmIHRoZSBTVEEgd2l0aCB0aGlzIElkIHdhcyBuZXZlciByZWdpc3RlcmVkIHdpdGggVEwgLSB0aGUgc2lnbmF0dXJlCiAgICB3aWxsIGJlIGludmFsaWQ7CiAgICAtIElmIHRoZSBTVEEgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBUTCB3aWxsIGhhdmUgY2FjaGVkIHRoZSBmb3JtZXIKICAgIHNldCBvZiBEUFUgc2lnbmF0dXJlcwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggYkJjYXN0ICkKICB7CiAgICB1Y0JjYXN0U2lnID0gKHZfVThfdCl1RFBVU2lnOwogICAgYk9sZFNUQVBrdCA9ICgoIFdMQU5fVExfSU5WQUxJRF9CX1NJRyAhPSAKICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZyApICYmCiAgICAgICggdWNCY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICkpOwogIH0KICBlbHNlCiAgewogICAgdWNVY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKICAgIGJPbGRTVEFQa3QgPSAoKCBXTEFOX1RMX0lOVkFMSURfVV9TSUcgIT0gCiAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyApICYmCiAgICAgICAgKCB1Y1VjYXN0U2lnID09IHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcgKSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSWYgdGhlIHZhbHVlIG9mIHRoZSBEUFUgU0lHIG1hdGNoZXMgdGhlIG9sZCwgdGhpcyBwYWNrZXQgd2lsbCBub3QKICAgIGJlIGNhY2hlZCBhcyBpdCBiZWxvbmdlZCB0byB0aGUgZm9ybWVyIGFzc29jaWF0aW9uCiAgICBJbiBjYXNlIHRoZSBTSUcgZG9lcyBub3QgbWF0Y2ggLSB0aGlzIGlzIGEgcGFja2V0IGZvciBhIHBvdGVudGlhbGx5IG5ldwogICAgYXNzb2NpYXRlZCBzdGF0aW9uIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggYk9sZFNUQVBrdCB8fCBiQmNhc3QgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkRhdGEgcGFja2V0IG1hdGNoZXMgb2xkIHNpZyBmb3Igc2lnIERQVTogJWQgVUM6ICVkLCAiCiAgICAgICAgICAgICAgICJCQzogJWQgLSBkcm9wcGluZyIsIAogICAgICAgICAgICAgICB1RFBVU2lnLCAKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZywKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZykpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgfQogIGVsc2UKICB7CiAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgKQogICAgewogICAgICAvKnRoaXMgaXMgdGhlIGZpcnN0IGZyYW1lIHRoYXQgd2UgYXJlIGNhY2hpbmcgKi8KICAgICAgcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgPSB2b3NUZW1wQnVmZjsKCiAgICAgIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlSW5pdFRpbWUgPSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCk7CiAgICAgIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlRG9uZVRpbWUgPQogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlSW5pdFRpbWU7CiAgICAgIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSA9IDE7CgogICAgICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfQ0FDSEVfRlJBTUUsCiAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplKSk7CgogICAgfQogICAgZWxzZQogICAgewogICAgICAvKnRoaXMgaXMgYSBzdWJzZXF1ZW50IGZyYW1lIHRoYXQgd2UgYXJlIGNhY2hpbmc6IGNoYWluIHRvIHRoZSBlbmQgKi8KICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQocENsaWVudFNUQS0+dm9zRW5kQ2FjaGVkRnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLCBWT1NfVFJVRSk7CgogICAgICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZURvbmVUaW1lID0gdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOwogICAgICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUgKys7CgogICAgICBpZiAocENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplICUgV0xBTlRMX0NBQ0hFX1RSQUNFX1dBVEVSTUFSSyA9PSAwKQogICAgICB7CiAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIiVzOiBDYWNoZSBIaWdoIHdhdGVybWFyayBmb3Igc3RhaWQ6JWQgKCVkKSIsCiAgICAgICAgICAgICAgICAgIF9fZnVuY19fLHVjU1RBSWQsIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSk7CiAgICAgICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX0NBQ0hFX0ZSQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplKSk7CiAgICAgIH0KICAgIH0KICAgIHBDbGllbnRTVEEtPnZvc0VuZENhY2hlZEZyYW1lID0gdm9zVGVtcEJ1ZmY7CiAgfS8qZWxzZSBuZXcgcGFja2V0Ki8KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsgCn0vKldMQU5UTF9DYWNoZVNUQUZyYW1lKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgVEwgdG8gZmx1c2ggdGhlIHN0YXRpb24gY2FjaGUKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIAogIFBBUkFNRVRFUlMKCiAgICBJTgoKICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNhY2hlZCBidWZmZXIKICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkLAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCiAgTk9URQogICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlLWluaXRpYWxpemUgdm9zRGF0YUJ1ZmYgdG8gTlVMTC4gSXQncyBjYWxsZXIncyAKICAgIHJlc3BvbnNpYmlsaXR5IHRvIGRvIHNvLCBpZiByZXF1aXJlZCwgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBjYWxsLgogICAgQmVjYXVzZSBvZiB0aGlzIHJlc3RyaWN0aW9uLCB3ZSBkZWNpZGUgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIHRvIHN0YXRpYwogICAgc28gdGhhdCB1cHBlciBsYXllciBkb2Vzbid0IG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhpcyByZXN0cmljdGlvbi4gCiAgICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTCldMQU5UTF9GbHVzaENhY2hlZEZyYW1lcwooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmCikKewogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmV0dXJuIHRoZSBlbnRpcmUgY2hhaW4gdG8gdm9zIGlmIHRoZXJlIGFyZSBpbmRlZWQgY2FjaGUgZnJhbWVzIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCAhPSB2b3NEYXRhQnVmZiApCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7ICAKfS8qV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGVpdGhlciBmb3J3YXJkaW5nIGNhY2hlZCBkYXRhIHRvIHRoZSBzdGF0aW9uIGFmdGVyCiAgICB0aGUgc3RhdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkLCBvciBmbHVzaGluZyBjYWNoZWQgZGF0YSBpZiB0aGUgc3RhdGlvbiBoYXMgbm90IAogICAgYmVlbiByZWdpc3RlcmVkLiAKICAgICAKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHBUTENiOiAgICAgICAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHVjU1RBSWQ6ICAgICAgICAgICAgICAgIHN0YXRpb24gaWQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmUtaW5pdGlhbGl6ZSB2b3NEYXRhQnVmZiB0byBOVUxMLiBJdCdzIGNhbGxlcidzIAogICAgcmVzcG9uc2liaWxpdHkgdG8gZG8gc28sIGlmIHJlcXVpcmVkLCBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwuCiAgICBCZWNhdXNlIG9mIHRoaXMgcmVzdHJpY3Rpb24sIHdlIGRlY2lkZSB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdG8gc3RhdGljCiAgICBzbyB0aGF0IHVwcGVyIGxheWVyIGRvZXNuJ3QgbmVlZCB0byBiZSBhd2FyZSBvZiB0aGlzIHJlc3RyaWN0aW9uLiAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgVk9TX1NUQVRVUwpXTEFOVExfRm9yd2FyZFNUQUZyYW1lcwooCiAgdm9pZCogICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICAgICB1Y1VjYXN0U2lnLAogIHZfVThfdCAgICAgICAgICAgIHVjQmNhc3RTaWcKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAogICAgIFNhbml0eSBjaGVjayAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6IEludmFsaWQgaW5wdXQgcG9pbnRlciBvbiBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcyBUTCAlcCIsCiAgICAgICAgIHBUTENiICkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvL1dMQU5fVExfTE9DS19TVEFfQ0FDSEUocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0pOyAKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBDaGVjayBpZiBzdGF0aW9uIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIGluIHRoZSBtZWFuIHdoaWxlCiAgICAgaWYgbm90IHJlZ2lzdGVyZWQsIGZsdXNoIGNhY2hlZCBmcmFtZXMuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICJXTEFOIFRMOlN0YXRpb24gaGFzIGJlZW4gZGVsZXRlZCBmb3IgU1RBICVkIC0gZmx1c2hpbmcgY2FjaGUiLCB1Y1NUQUlkKSk7CiAgICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfRkxVU0hfQ0FDSEVEX0ZSQU1FUywKICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplKSk7CiAgICBXTEFOVExfRmx1c2hDYWNoZWRGcmFtZXMocENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUpOwogICAgZ290byBkb25lOyAKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGb3J3YXJkaW5nIGNhY2hlIGZyYW1lcyByZWNlaXZlZCB3aGlsZSB0aGUgc3RhdGlvbiB3YXMgaW4gdGhlIHByb2Nlc3MgICAKICAgIG9mIGJlaW5nIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgU1cgY29tcG9uZW50cyAgIAoKICAgIEFjY2VzcyB0byB0aGUgY2FjaGUgbXVzdCBiZSBsb2NrZWQ7IHNpbWlsYXJseSB1cGRhdGluZyB0aGUgc2lnbmF0dXJlIGFuZCAgIAogICAgdGhlIGV4aXN0ZW5jZSBmbGFnIG11c3QgYmUgc3luY2hyb25pemVkIGJlY2F1c2UgdGhlc2UgdmFsdWVzIGFyZSBjaGVja2VkICAgCiAgICBkdXJpbmcgY2FjaGVkICAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAiV0xBTiBUTDpQcmVwYXJpbmcgdG8gZndkIHBhY2tldHMgZm9yIFNUQSAlZCIsIHVjU1RBSWQpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSB0aGUgbmV3IHNpZ25hdHVyZSB2YWx1ZXMKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcgID0gdWNVY2FzdFNpZzsKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICA9IHVjQmNhc3RTaWc7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAiV0xBTiBUTDpGd2QtaW5nIHBhY2tldHMgZm9yIFNUQSAlZCBVQyAlZCBCQyAlZCIsCiAgICAgICB1Y1NUQUlkLCB1Y1VjYXN0U2lnLCB1Y0JjYXN0U2lnKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNhY2hlZCBkYXRhIHRvIGZvcndhcmQgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKICBpZiAoIE5VTEwgIT0gcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBGd2QtaW5nIENhY2hlZCBwYWNrZXRzIGZvciBzdGF0aW9uICVkIiwgdWNTVEFJZCApKTsKCiAgICBXTEFOVExfUnhDYWNoZWRGcmFtZXMoIHBUTENiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnZvc0JlZ0NhY2hlZEZyYW1lKTsKICB9CiAgZWxzZQogIHsKICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDogTk8gY2FjaGVkIHBhY2tldHMgZm9yIHN0YXRpb24gJWQiLCB1Y1NUQUlkICkpOwogIH0KCmRvbmU6CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKICAgQ2xlYXIgdGhlIHN0YXRpb24gY2FjaGUgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnZvc0JlZ0NhY2hlZEZyYW1lID0gTlVMTDsKICBwQ2xpZW50U1RBLT52b3NFbmRDYWNoZWRGcmFtZSA9IE5VTEw7CiAgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplID0gMDsKICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZUNsZWFyVGltZSA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBZnRlciBhbGwgdGhlIGluaXQgaXMgY29tcGxldGUgd2UgY2FuIG1hcmsgdGhlIGV4aXN0YW5jZSBmbGFnIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+ZW5hYmxlQ2FjaGluZyA9IDA7CgogIC8vV0xBTl9UTF9VTkxPQ0tfU1RBX0NBQ0hFKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdKTsgCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsgCgp9LypXTEFOVExfRm9yd2FyZFNUQUZyYW1lcyovCgoKI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfSXNJQVBQRnJhbWUKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGRldGVjdGluZyBpbmNvbWluZyBFU0UgSUFQUCBmcmFtZXMKCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgCiAgICBwdkJESGVhZGVyOiAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBCRCBoZWFkZXIKICAgIHZvc1RlbXBCdWZmOiAgICAgICAgICAgIHRoZSBkYXRhIHBhY2tldAoKICAgIElOL09VVAogICAgcEZpcnN0RGF0YVBrdEFycml2ZWQ6ICAgc3RhdGljIGZyb20gY2FsbGVyIGZ1bmN0aW9uOyB1c2VkIGZvciByc3NpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0YXRpb24KICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1RSVUU6ICAgSXQgaXMgYSBJQVBQIGZyYW1lCiAgICBWT1NfRkFMU0U6ICBJdCBpcyBOT1QgSUFQUCBmcmFtZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X0JPT0xfdApXTEFOVExfSXNJQVBQRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICAgIHB2QkRIZWFkZXIsCiAgdm9zX3BrdF90KiAgICAgICAgdm9zVGVtcEJ1ZmYKKQp7CiAgdl9VMTZfdCAgICAgICAgICAgICB1c01QRFVET2Zmc2V0OwogIHZfVThfdCAgICAgICAgICAgICAgdWNPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1NuYXBIZHJbV0xBTlRMX0xMQ19TTkFQX1NJWkVdOwogIHZfU0laRV90ICAgICAgICAgICAgdXNTbmFwSGRyU2l6ZSA9IFdMQU5UTF9MTENfU05BUF9TSVpFOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIE9VSSBmaWVsZCBpcyBwcmVzZW50LgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggVk9TX0ZBTFNFID09IFdEQV9JU19SWF9MTENfUFJFU0VOVChwdkJESGVhZGVyKSApCiAgewogICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6TExDIGhlYWRlciByZW1vdmVkLCBjYW5ub3QgZGV0ZXJtaW5lIEJULUFNUCB0eXBlIC0iCiAgICAgICAgICAgICAgICAgICJkcm9wcGluZyBwa3QiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHJldHVybiBWT1NfVFJVRTsKICB9CiAgdXNNUERVRE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKHB2QkRIZWFkZXIpOwogIHVjT2Zmc2V0ICAgICAgPSAodl9VOF90KXVzTVBEVURPZmZzZXQgKyBXTEFOVExfTExDX1NOQVBfT0ZGU0VUOwoKICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zVGVtcEJ1ZmYsIHVjT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpdWNTbmFwSGRyLCAmdXNTbmFwSGRyU2l6ZSk7CgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpKSAKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZXh0cmFjdCBTbmFwIEhkciBvZiBkYXRhICBwYWNrZXQgLSIKICAgICAgICAgICAgICAgICJkcm9wcGluZyBwa3QiKSk7CiAgICByZXR1cm4gVk9TX0ZBTFNFOwogIH0KCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhpcyBpcyBJQVBQIGZyYW1lIGJ5IG1hdGNoaW5nIEFpcm9uZXQgU25hcCBoZHIuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy8gQ29tcGFyZSByZXR1cm5zIDEgaWYgdmFsdWVzIGFyZSBzYW1lIGFuZCAwCiAgLy8gaWYgbm90IHRoZSBzYW1lLgogIGlmICgoIFdMQU5UTF9MTENfU05BUF9TSVpFICE9IHVzU25hcEhkclNpemUgKSB8fAogICAgICggMCA9PSB2b3NfbWVtX2NvbXBhcmUodWNTbmFwSGRyLCAodl9QVk9JRF90KVdMQU5UTF9BSVJPTkVUX1NOQVBfSEVBREVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0xMQ19TTkFQX1NJWkUgKSApKQogIHsKICAgIHJldHVybiBWT1NfRkFMU0U7CiAgfQoKICByZXR1cm4gVk9TX1RSVUU7Cgp9CiNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9FU0UKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1Byb2Nlc3NCQVBGcmFtZQoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBpbmNvbWluZyBCVC1BTVAgZnJhbWVzCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICBCb3RoZSB0aGUgQlQtQU1QIHN0YXRpb24gYW5kIHRoZSBCQVAgQ3RybCBwYXRoIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgCiAgICByZWdpc3RlcmVkIHdpdGggVEwuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgCiAgICBwdkJESGVhZGVyOiAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBCRCBoZWFkZXIKICAgIHZvc1RlbXBCdWZmOiAgICAgICAgICAgIHRoZSBkYXRhIHBhY2tldAogICAgcFRMQ2I6ICAgICAgICAgICAgICAgICAgVEwgY29udHJvbCBibG9jawogICAgdWNTVEFJZDogICAgICAgICAgICAgICAgc3RhdGlvbiBpZAoKICAgIElOL09VVAogICAgcEZpcnN0RGF0YVBrdEFycml2ZWQ6ICAgc3RhdGljIGZyb20gY2FsbGVyIGZ1bmN0aW9uOyB1c2VkIGZvciByc3NpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0YXRpb24KICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9CT09MX3QKV0xBTlRMX1Byb2Nlc3NCQVBGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgICAgcHZCREhlYWRlciwKICB2b3NfcGt0X3QqICAgICAgICB2b3NUZW1wQnVmZiwKICBXTEFOVExfQ2JUeXBlKiAgICBwVExDYiwKICB2X1U4X3QqICAgICAgICAgICBwRmlyc3REYXRhUGt0QXJyaXZlZCwKICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkCikKewogIHZfVTE2X3QgICAgICAgICAgICAgdXNNUERVRE9mZnNldDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjT2Zmc2V0OwogIHZfVThfdCAgICAgICAgICAgICAgdWNPVUlbV0xBTlRMX0xMQ19PVUlfU0laRV07CiAgdl9TSVpFX3QgICAgICAgICAgICB1c09VSVNpemUgPSBXTEFOVExfTExDX09VSV9TSVpFOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogIHZfVTE2X3QgICAgICAgICAgICAgdXNUeXBlOwogIHZfU0laRV90ICAgICAgICAgICAgdXNUeXBlTGVuID0gc2l6ZW9mKHVzVHlwZSk7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0OwogIHZfVThfdCAgICAgICAgICAgICAgdWNNUERVSExlbiA9IDA7CiAgdl9VMTZfdCAgICAgICAgICAgICB1c0FjdHVhbEhMZW4gPSAwOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgT1VJIGFuZCB0eXBlIGZyb20gTExDIGFuZCB2YWxpZGF0ZTsgaWYgbm9uLWRhdGEgc2VuZCB0byBCQVAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFZPU19GQUxTRSA9PSBXREFfSVNfUlhfTExDX1BSRVNFTlQocHZCREhlYWRlcikgKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgIldMQU4gVEw6TExDIGhlYWRlciByZW1vdmVkLCBjYW5ub3QgZGV0ZXJtaW5lIEJULUFNUCB0eXBlIC0iCiAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgcmV0dXJuIFZPU19UUlVFOyAKICB9CgogIHVzTVBEVURPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChwdkJESGVhZGVyKTsKICB1Y01QRFVIT2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX09GRlNFVChwdkJESGVhZGVyKTsKICB1Y01QRFVITGVuICAgID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX0xFTihwdkJESGVhZGVyKTsKICB1Y09mZnNldCAgICAgID0gKHZfVThfdCl1c01QRFVET2Zmc2V0ICsgV0xBTlRMX0xMQ19PVUlfT0ZGU0VUOwoKICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zVGVtcEJ1ZmYsIHVjT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpdWNPVUksICZ1c09VSVNpemUpOwoKI2lmIDAKICAvLyBDb21wYXJlIHJldHVybnMgMSBpZiB2YWx1ZXMgYXJlIHNhbWUgYW5kIDAKICAvLyBpZiBub3QgdGhlIHNhbWUuCiAgaWYgKCggV0xBTlRMX0xMQ19PVUlfU0laRSAhPSB1c09VSVNpemUgKSB8fAogICAgICggMCA9PSB2b3NfbWVtX2NvbXBhcmUodWNPVUksICh2X1BWT0lEX3QpV0xBTlRMX0JUX0FNUF9PVUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTExDX09VSV9TSVpFICkgKSkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICJMTEMgaGVhZGVyIHBvaW50cyB0byBkaWZmIE9VSSBpbiBCVC1BTVAgc3RhdGlvbiAtIgogICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgcmV0dXJuIFZPU19UUlVFOwogIH0KI2VuZGlmCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgTExDIE9VSSBhbmQgZW5zdXJlIHRoYXQgdGhpcyBpcyBpbmRlZWQgYSBCVC1BTVAgZnJhbWUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zVGVtcEJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjT2Zmc2V0ICsgV0xBTlRMX0xMQ19PVUlfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZ1c1R5cGUsICZ1c1R5cGVMZW4pOwoKICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKSB8fAogICAgICAoIHNpemVvZih1c1R5cGUpICE9IHVzVHlwZUxlbiApKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgIlVuYWJsZSB0byBleHRyYWN0IHR5cGUgb24gaW5jb21pbmcgQkFQIHBhY2tldCAtIgogICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgcmV0dXJuIFZPU19UUlVFOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIHRoaXMgaXMgQlQtQU1QIGRhdGEgb3IgY3RybCBwYWNrZXQoUlNOLCBMaW5rU3Zpc2lvbiwgQWN0aXZpdHlSKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHVzVHlwZSA9IHZvc19iZTE2X3RvX2NwdSh1c1R5cGUpOwoKICBpZiAoV0xBTlRMX0JBUF9JU19OT05fREFUQV9QS1RfVFlQRSh1c1R5cGUpKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICJXTEFOIFRMOk5vbi1kYXRhIHBhY2tldCByZWNlaXZlZCBvdmVyIEJULUFNUCBsaW5rOiAlZCwgPT4gQkFQIiwKICAgICAgICAgICAgICAgdXNUeXBlKSk7CgogICAgLypGbGF0dGVuIHBhY2tldCBhcyBCQVAgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHBlZWsqLwogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX3BrdF9mbGF0dGVuX3J4X3BrdCgmdm9zVGVtcEJ1ZmYpKQogICAgewogICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZmxhdHRlbiBCVC1BTVAgcGFja2V0IC0gZHJvcHBpbmciKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHJldHVybiBWT1NfVFJVRTsKICAgIH0KCiAgICAvKiBTZW5kIHBhY2tldCB0byBCQVAgY2xpZW50Ki8KICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19UcmltUnhQYWNrZXRJbmZvKCB2b3NUZW1wQnVmZiApICkKICAgIHsKICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgcmV0dXJuIFZPU19UUlVFOwogICAgfQoKICAgIGlmICggMCA9PSBXREFfR0VUX1JYX0ZUX0RPTkUocHZCREhlYWRlcikgKQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgIk5vbi1kYXRhIHBhY2tldCByZWNlaXZlZCBvdmVyIEJULUFNUCBsaW5rOiBTZW5kaW5nIGl0IGZvciAiCiAgICAgICAgICAiZnJhbWUgVHJhbnNsYXRpb24iKSk7CgogICAgICBpZiAodXNNUERVRE9mZnNldCA+IHVjTVBEVUhPZmZzZXQpCiAgICAgIHsKICAgICAgICB1c0FjdHVhbEhMZW4gPSB1c01QRFVET2Zmc2V0IC0gdWNNUERVSE9mZnNldDsKICAgICAgfQoKICAgICAgLyogc29mdHdhcmUgZnJhbWUgdHJhbnNsYXRpb24gZm9yIEJUQU1QIFdEUy4qLwogICAgICBXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIoIHZvc1RlbXBCdWZmLCAmdm9zU3RhdHVzLCB1c0FjdHVhbEhMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwgcFRMQ2IsdWNTVEFJZCwgVk9TX0ZBTFNFKTsKICAgICAgCiAgICB9CiAgICBpZiAocFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUngpCiAgICAgICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUngoIHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCxwVExDYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTlRMX0JBUEZyYW1lRW51bVR5cGUpdXNUeXBlICk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgVk9TX0FTU0VSVCgwKTsKICAgIH0KCiAgICByZXR1cm4gVk9TX1RSVUU7CiAgfQogIGVsc2UKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiV0xBTiBUTDogQkFQIERBVEEgcGFja2V0IHJlY2VpdmVkIG92ZXIgQlQtQU1QIGxpbms6ICVkLCA9PiBCQVAiLAogICAgICAgICAgICAgICB1c1R5cGUpKTsKICAgLyohISFGSVggTUUhISovCiAjaWYgMAogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIEZvciBkYXRhIHBhY2tldCBjb2xsZWN0IHBoeSBzdGF0cyBSU1NJIGFuZCBMaW5rIFF1YWxpdHkKICAgICBDYWxjdWxhdGUgdGhlIFJTU0kgYXZlcmFnZSBhbmQgc2F2ZSBpdC4gQ29udGludW91cyBhdmVyYWdlIGlzIGRvbmUuCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoICpwRmlyc3REYXRhUGt0QXJyaXZlZCA9PSAwKQogICAgewogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5yc3NpQXZnID0KICAgICAgICAgV0xBTkhBTF9HRVRfUlNTSV9BVkVSQUdFKCBwdkJESGVhZGVyICk7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMaW5rUXVhbGl0eUF2ZyA9IAogICAgICAgIFdMQU5IQUxfUlhfQkRfR0VUX1NOUiggcHZCREhlYWRlciApOwoKICAgICAgLy8gUmN2ZCAxc3QgcGt0LCBzdGFydCBhdmVyYWdlIGZyb20gbmV4dCB0aW1lCiAgICAgICpwRmlyc3REYXRhUGt0QXJyaXZlZCA9IDE7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnJzc2lBdmcgPQogICAgICAgICAgKFdMQU5IQUxfR0VUX1JTU0lfQVZFUkFHRSggcHZCREhlYWRlciApICsgCiAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucnNzaUF2ZykvMjsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUxpbmtRdWFsaXR5QXZnID0KICAgICAgICAgIChXTEFOSEFMX1JYX0JEX0dFVF9TTlIoIHB2QkRIZWFkZXIgKSArICAKICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51TGlua1F1YWxpdHlBdmcpLzI7CiAgICB9LypFbHNlLCBmaXJzdCBkYXRhIHBhY2tldCovCiAjZW5kaWYKICB9LypCVC1BTVAgZGF0YSBwYWNrZXQqLwoKICByZXR1cm4gVk9TX0ZBTFNFOyAKfS8qV0xBTlRMX1Byb2Nlc3NCQVBGcmFtZSovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUHJvY2Vzc0ZDRnJhbWUKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHByb2Nlc3NpbmcgaW5jb21pbmcgRmxvdyBDb250cm9sIGZyYW1lcy4gRW5hYmxlCiAgICBvciBkaXNhYmxlIExXTSBtb2RlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbi4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIEZXIHNlbmRzIHVwIHNwZWNpYWwgZmxvdyBjb250cm9sIGZyYW1lLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4ICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0CiAgICBwdkJESGVhZGVyOiAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBCRCBoZWFkZXIKICAgIHBUTENiOiAgICAgICAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHB2QkRIZWFkZXIgICAgICAgICAgICAgIHBvaW50ZXIgdG8gQkQgaGVhZGVyLgoKICAgIElOL09VVAogICAgcEZpcnN0RGF0YVBrdEFycml2ZWQ6ICAgc3RhdGljIGZyb20gY2FsbGVyIGZ1bmN0aW9uOyB1c2VkIGZvciByc3NpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0YXRpb24KICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IGZyYW1lIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwogICAgVGhlIGluZ3Jlc3MgYW5kIGVncmVzcyBvZiBlYWNoIHN0YXRpb24gd2lsbCBiZSB1cGRhdGVkLiBJZiBuZWVkZWQsIExXTSBtb2RlIHdpbGwKICAgIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgYmFzZWQgb24gdGhlIGZsb3cgY29udHJvbCBhbGdvcml0aG0uCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9CT09MX3QKV0xBTlRMX1Byb2Nlc3NGQ0ZyYW1lCigKICB2X1BWT0lEX3QgICAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgICBwdm9zRGF0YUJ1ZmYsCiAgdl9QVk9JRF90ICAgICAgICAgcHZCREhlYWRlcgopCnsKI2lmIDEgLy9lbmFibGUgcHJvY2Vzc2luZyBvZiBvbmx5IGZjU3RhVHhEaXNhYmxlZCBiaXRtYXAgZm9yIG5vdy4gdGhlIGVsc2UgcGFydCBpcyBvbGQgYmV0dGVyIHFvcyBjb2RlLgogICAgICAvLyBuZWVkIHRvIHJldmlzaXQgdGhlIG9sZCBjb2RlIGZvciBmdWxsIGltcGxlbWVudGF0aW9uLgogIHZfVThfdCAgICAgICAgICAgIHVjU1RBSWQ7CiAgdl9VMTZfdCAgICAgICAgICAgdWNTdGFWYWxpZEJpdG1hcDsKICB2X1UxNl90ICAgICAgICAgICB1Y1N0YVR4RGlzYWJsZWRCaXRtYXA7CiAgV0xBTlRMX0NiVHlwZSogICAgcFRMQ2IgPSBOVUxMOwogICNpZmRlZiBUTF9ERUJVR19GQwogIHZfVTMyX3QgICAgICAgICAgIHJ4VGltZVN0YW1wOwogIHZfVTMyX3QgICAgICAgICAgIGN1clRpY2s7CiAgI2VuZGlmCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N1c3BlbmREYXRhVHgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICB1Y1N0YVZhbGlkQml0bWFwID0gV0RBX0dFVF9SWF9GQ19WQUxJRF9TVEFfTUFTSyhwdkJESGVhZGVyKTsKICB1Y1N0YVR4RGlzYWJsZWRCaXRtYXAgPSBXREFfR0VUX1JYX0ZDX1NUQV9UWF9ESVNBQkxFRF9CSVRNQVAocHZCREhlYWRlcik7CiNpZmRlZiBUTF9ERUJVR19GQwogIHJ4VGltZVN0YW1wID0gV0RBX0dFVF9SWF9USU1FU1RBTVAocHZCREhlYWRlcik7CiAgLyogaGFyZCBjb2RlIG9mIE1UVV9HTE9CQUxfVElNRVJfQUREUiB0byBjYWxjdWxhdGUgdGhlIHRpbWUgYmV0d2VlbiBnZW5lcmF0ZWQgYW5kIHByb2Nlc3NlZCAqLwogIHdwYWxSZWFkUmVnaXN0ZXIoMHgwMzA4MTQwMCsweDFENCwgJmN1clRpY2spOwoKICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiJWxkICglbGQtJWxkKTogRGlzYWJsZWQgJXggVmFsaWQgJXgiLCBjdXJUaWNrID4gcnhUaW1lU3RhbXAgPyBjdXJUaWNrIC0gcnhUaW1lU3RhbXAgOiByeFRpbWVTdGFtcCAtICgweEZGRkZGRkZGIC0gY3VyVGljayksCiAgICBjdXJUaWNrLCByeFRpbWVTdGFtcCwgIHVjU3RhVHhEaXNhYmxlZEJpdG1hcCwgdWNTdGFWYWxpZEJpdG1hcCkpOwojZW5kaWYKICBmb3IodWNTVEFJZCA9IDA7IHVjU3RhVmFsaWRCaXRtYXAgIT0gMDsgdWNTdGFWYWxpZEJpdG1hcCA+Pj0xLCB1Y1N0YVR4RGlzYWJsZWRCaXRtYXAgPj49IDEsIHVjU1RBSWQgKyspCiAgewogICAgaWYgKCAoMCA9PSAodWNTdGFWYWxpZEJpdG1hcCAmIDB4MSkpIHx8IChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSAmJiAoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMpKSApCiAgICAgICAgY29udGludWU7CgogICAgaWYgKHVjU3RhVHhEaXNhYmxlZEJpdG1hcCAmIDB4MSkKICAgIHsKICAgICAgV0xBTlRMX1N1c3BlbmREYXRhVHgocHZvc0dDdHgsICZ1Y1NUQUlkLCBOVUxMKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgV0xBTlRMX1Jlc3VtZURhdGFUeChwdm9zR0N0eCwgJnVjU1RBSWQpOwogICAgfQogIH0KCiNlbHNlCiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgdHBIYWxGY1J4QmQgICAgICAgICBwdkZjUnhCZCA9IE5VTEw7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y0JpdENoZWNrID0gMHgxOwogIHZfVThfdCAgICAgICAgICAgICAgdWNTdGFWYWxpZCA9IDA7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1NUQUlkID0gMDsKCiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgIlJlY2VpdmVkIEZDIFJlc3BvbnNlIik7CiAgaWYgKCAoTlVMTCA9PSBwVExDYikgfHwgKE5VTEwgPT0gcHZvc0RhdGFCdWZmKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwb2ludGVyIGluICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCBwdm9zRGF0YUJ1ZmYsIDAsICh2X1BWT0lEX3QpJnB2RmNSeEJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0SGFsRmNSeEJkKSk7CgogIGlmICggKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpIHx8IChOVUxMID09IHB2RmNSeEJkKSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6d3JvbmcgRkMgUnggcGFja2V0IikpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KICAKICAvLyBuZWVkIHRvIHN3YXAgYnl0ZXMgaW4gdGhlIEZDIGNvbnRlbnRzLiAgCiAgV0xBTkhBTF9Td2FwRmNSeEJkKCZwdkZjUnhCZC0+ZmNTVEFUeFFMZW5bMF0pOwoKICAvL2xvZ2ljIHRvIGVuYWJsZS9kaXNhYmxlIExXTSBtb2RlIGZvciBlYWNoIHN0YXRpb24KICBmb3IoIHVjU3RhVmFsaWQgPSAodl9VOF90KXB2RmNSeEJkLT5mY1NUQVZhbGlkTWFzazsgdWNTdGFWYWxpZDsgdWNTdGFWYWxpZCA+Pj0gMSwgdWNCaXRDaGVjayA8PD0gMSwgdWNTVEFJZCArKykKICB7CiAgICBpZiAoICgwID09ICh1Y1N0YVZhbGlkICYgMHgxKSkgfHwgKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNFeGlzdHMpICkKICAgIHsKICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKCBwdkZjUnhCZC0+ZmNTVEFUaHJlc2hJbmRNYXNrICYgdWNCaXRDaGVjayApCiAgICB7CiAgICAgIC8vTFdNIGV2ZW50IGlzIHJlcG9ydGVkIGJ5IEZXLiBBYmxlIHRvIGZldGNoIG1vcmUgcGFja2V0CiAgICAgIGlmKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkICkKICAgICAgewogICAgICAgIC8vTm93IG1lbW9yeSB1c2FnZSBpcyBiZWxvdyBMV00uIFN0YXRpb24gY2FuIHNlbmQgbW9yZSBwYWNrZXRzLgogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtRXZlbnRSZXBvcnRlZCA9IFRSVUU7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGVyByZXBvcnQgTFdNIGV2ZW50IGJ1dCB0aGUgc3RhdGlvbiAlZCBpcyBub3QgaW4gTFdNIG1vZGUiLCB1Y1NUQUlkKSk7CiAgICAgIH0KICAgIH0KCiAgICAvL2NhbGN1bGF0ZSB1RWdyZXNzX2xlbmd0aC91SW5ncmVzc19sZW5ndGggb25seSBhZnRlciByZWNlaXZpbmcgZW5vdWdoIHBhY2tldHMKICAgIGlmIChXTEFOVExfTFdNX0lOR1JFU1NfU0FNUExFX1RIUkVTSE9MRCA8PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGgpCiAgICB7CiAgICAgIC8vY2hlY2sgbWVtb3J5IHVzYWdlIGluZm8gdG8gc2VlIHdoZXRoZXIgTFdNIG1vZGUgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoZSBzdGF0aW9uCiAgICAgIHZfVTMyX3QgdUVncmVzc19sZW5ndGggPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggKyAKICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5ibXVNZW1Db25zdW1lZCAtIHB2RmNSeEJkLT5mY1NUQVR4UUxlblt1Y1NUQUlkXTsKCiAgICAgIC8vaWYgKChmbG9hdCl1RWdyZXNzX2xlbmd0aC8oZmxvYXQpcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoIAogICAgICAvLyAgICAgIDw9IFdMQU5UTF9MV01fRUdSRVNTX0lOR1JFU1NfVEhSRVNIT0xEKQogICAgICBpZiAoIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggPiB1RWdyZXNzX2xlbmd0aCkgJiYKICAgICAgICAgICAoKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCAtIHVFZ3Jlc3NfbGVuZ3RoICkgPj0gCiAgICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggPj4gMikpCiAgICAgICAgICkKICAgICAgeyAgIAogICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkVuYWJsZSBMV00gbW9kZSBmb3Igc3RhdGlvbiAlZCIsIHVjU1RBSWQpKTsKICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCA9IFRSVUU7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgaWYoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQgKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RGlzYWJsZSBMV00gbW9kZSBmb3Igc3RhdGlvbiAlZCIsIHVjU1RBSWQpKTsKICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQgPSBGQUxTRTsKICAgICAgICB9CgogICAgICB9CgogICAgICAvL3JlbWVtYmVyIG1lbW9yeSB1c2FnZSBpbiBGVyBzdGFydGluZyBmcm9tIHRoaXMgcm91bmQKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYm11TWVtQ29uc3VtZWQgPSBwdkZjUnhCZC0+ZmNTVEFUeFFMZW5bdWNTVEFJZF07CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCA9IDA7CiAgICB9IC8vKFdMQU5UTF9MV01fSU5HUkVTU19TQU1QTEVfVEhSRVNIT0xEIDw9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCkKCiAgICBpZiggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCApCiAgICB7CiAgICAgIC8vYWx3YXlzIHVwZGF0ZSBjdXJyZW50IG1heGltdW0gYWxsb3dlZCBtZW1lb3J5IHVzYWdlCiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVCdWZmVGhyZXNob2xkTWF4ID0gIFdMQU5UTF9TVEFfQk1VX1RIUkVTSE9MRF9NQVggLQogICAgICAgIHB2RmNSeEJkLT5mY1NUQVR4UUxlblt1Y1NUQUlkXTsKICAgIH0KCiAgfQojZW5kaWYKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1J4RnJhbWVzCgogIERFU0NSSVBUSU9OCiAgICBDYWxsYmFjayByZWdpc3RlcmVkIGJ5IFRMIGFuZCBjYWxsZWQgYnkgQkFMIHdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQKICAgIG92ZXIgdGhlIGJ1cy4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIGZ1bmN0aW9uIFRMIHdpbGwgbWFrZSB0aGUgbmVjZXNzYXJ5CiAgICBkZWNpc2lvbiB3aXRoIHJlZ2FyZHMgdG8gdGhlIGZvcndhcmRpbmcgb3IgcXVldWluZyBvZiB0aGlzIHBhY2tldCBhbmQKICAgIHRoZSBsYXllciBpdCBuZWVkcyB0byBiZSBkZWxpdmVyZWQgdG8uCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICBJZiB0aGUgZnJhbWUgY2FycmllZCBpcyBhIGRhdGEgZnJhbWUgdGhlbiB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggaXQgaXMKICAgIGRlc3RpbmVkIHRvIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIFRMLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBCQUwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlciByZWNlaXZlZCwKICAgICAgICAgICAgICAgICAgICBpZiB0aGVyZSBpcyBtb3JlIHRoZW4gb25lIHBhY2tldCB0aGV5IHdpbGwgYmUgY2hhaW5lZAogICAgICAgICAgICAgICAgICAgIHVzaW5nIHZPU1MgYnVmZmVycy4KCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1J4RnJhbWVzCigKICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QgICAgICpwRnJhbWVEYXRhQnVmZgopCnsKICB2b3NfcGt0X3QqICAgICAgICAgIHZvc0RhdGFCdWZmID0gKHZvc19wa3RfdCopcEZyYW1lRGF0YUJ1ZmY7CiAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIFdMQU5UTF9TVEFGdW5jVHlwZSAgcGZuU1RBRnNtOwogIHZvc19wa3RfdCogICAgICAgICAgdm9zVGVtcEJ1ZmY7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1NUQUlkOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogIHZfVThfdCAgICAgICAgICAgICAgdWNGcm1UeXBlOwogIHZfUFZPSURfdCAgICAgICAgICAgcHZCREhlYWRlciA9IE5VTEw7CiAgV0xBTlRMX1NUQUV2ZW50VHlwZSB3U1RBRXZlbnQgID0gV0xBTlRMX1JYX0VWRU5UOwogIHZfVThfdCAgICAgICAgICAgICAgdWNUaWQgICAgICA9IDA7CiAgdl9CT09MX3QgICAgICAgICAgICBicm9hZGNhc3QgID0gVk9TX0ZBTFNFOwogIHZfQk9PTF90ICAgICAgICAgICAgc2VsZkJjYXN0TG9vcGJhY2sgPSBWT1NfRkFMU0U7CiAgc3RhdGljIHZfVThfdCAgICAgICBmaXJzdF9kYXRhX3BrdF9hcnJpdmVkOwogIHZfVTMyX3QgICAgICAgICAgICAgdURQVVNpZzsgCiAgdl9VMTZfdCAgICAgICAgICAgICB1c1BrdExlbjsKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTX0lOVEVSTkFMIAogIHZfVThfdCAgICAgICAgICAgICAgdWNNUERVSExlbiA9IDAgOwogIHZfVTE2X3QgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAwOwojZW5kaWYKICB2X0JPT0xfdCAgICAgICAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMgPSBWT1NfRkFMU0U7CiNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUwogIHZfUzdfdCAgICAgICAgICAgICAgY3VycmVudEF2Z1JTU0kgPSAwOwogIHZfVThfdCAgICAgICAgICAgICAgYWM7CgojZW5kaWYKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpUTCBSZWNlaXZlIEZyYW1lcyBjYWxsZWQiKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHZvc0RhdGFCdWZmICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1J4RnJhbWVzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgUG9wb2xhdXRlIHRpbWVzdGFtcCBhcyB0aGUgdGltZSB3aGVuIHBhY2tldCBhcnJpdmVzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgdm9zRGF0YUJ1ZmYtPnRpbWVzdGFtcCA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSB0aGUgaW5pdGlhbCBidWZmZXIgLSB0aGlzIGlzIHRoZSBmaXJzdCByZWNlaXZlZCBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwoKICB3aGlsZSAoIE5VTEwgIT0gdm9zVGVtcEJ1ZmYgKQogIHsKICAgIGJyb2FkY2FzdCA9IFZPU19GQUxTRTsKICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX0ZBTFNFOyAKCiAgICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8gKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBQZWVrIGF0IEJEIGhlYWRlciAtIGRvIG5vdCByZW1vdmUKICAgICAgISEhIE9wdGltaXplIG1lOiBvbmx5IHBhcnQgb2YgaGVhZGVyIGlzIG5lZWRlZDsgbm90IGVudGlyZSBvbmUKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdm9zU3RhdHVzID0gV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHZvc1RlbXBCdWZmLCAodl9QVk9JRF90KSZwdkJESGVhZGVyLCAxLypTd2FwIEJEKi8gKTsKCiAgICBpZiAoIE5VTEwgPT0gcHZCREhlYWRlciApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZXh0cmFjdCBCRCBoZWFkZXIiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIENoZWNrIGlmIEZDIGZyYW1lIHJlcG9ydGVkIGZyb20gRlcKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZihXREFfSVNfUlhfRkMocHZCREhlYWRlcikpCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6cmVjZWl2ZSBvbmUgRkMgZnJhbWUiKSk7CgogICAgICBXTEFOVExfUHJvY2Vzc0ZDRnJhbWUocHZvc0dDdHgsIHZvc1RlbXBCdWZmLCBwdkJESGVhZGVyKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLyogQU1TRFUgSFcgYnVnIGZpeAogICAgICogQWZ0ZXIgMm5kIEFNU0RVIHN1YmZyYW1lIEhXIGNvdWxkIG5vdCBoYW5kbGUgQkQgY29ycmVjdGx5CiAgICAgKiBIQUwgd29ya2Fyb3VuZCBpcyBuZWVkZWQgKi8KICAgIGlmKFdEQV9HRVRfUlhfQVNGKHB2QkRIZWFkZXIpKQogICAgewogICAgICBXREFfRFNfUnhBbXNkdUJkRml4KHB2b3NHQ3R4LCBwdkJESGVhZGVyKTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBFeHRyYWN0IGZyYW1lIGNvbnRyb2wgZmllbGQgZnJvbSA4MDIuMTEgaGVhZGVyIGlmIHByZXNlbnQgCiAgICAgIChmcmFtZSB0cmFuc2xhdGlvbiBub3QgZG9uZSkgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIHZvc1N0YXR1cyA9IFdEQV9EU19HZXRGcmFtZVR5cGVTdWJUeXBlKCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICBwdkJESGVhZGVyLCAmdWNGcm1UeXBlICk7CiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZXh0cmFjdCBGcmFtZSBDb250cm9sIEZpZWxkIikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICBjb250aW51ZTsKICAgIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMU19JTlRFUk5BTAogICAgaWYgKCBXTEFOVExfSVNfREFUQV9GUkFNRSh1Y0ZybVR5cGUpKQogICAgewogICAgICAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4ocHZCREhlYWRlcik7CiAgICAgICBXTEFOVExfR2V0RXRoZXJUeXBlXzIocHZCREhlYWRlciwgdm9zVGVtcEJ1ZmYsIHVjTVBEVUhMZW4sICZ1c0V0aGVyVHlwZSkgOwogICAgfQojZW5kaWYKICAgIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgodm9zVGVtcEJ1ZmYsICZ1c1BrdExlbik7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgbWFuYWdlbWVudCBhbmQgc2VuZCB0byBQRQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoIFdMQU5UTF9JU19NR01UX0ZSQU1FKHVjRnJtVHlwZSkgCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMU19JTlRFUk5BTAogICAgICAgIHx8IChXTEFOVExfSVNfVERMU19GUkFNRSh1c0V0aGVyVHlwZSkpIAojZW5kaWYKICAgICAgICkKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTZW5kaW5nIHBhY2tldCB0byBtYW5hZ2VtZW50IGNsaWVudCIpKTsKICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX3BrdF9mbGF0dGVuX3J4X3BrdCgmdm9zVGVtcEJ1ZmYpKQogICAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGZsYXR0ZW4gcGFja2V0IC0gZHJvcHBpbmciKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdWNTVEFJZCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9TVEFJRCggcHZCREhlYWRlciApOwogICAgICAvKiBSZWFkIFJTU0kgYW5kIHVwZGF0ZSAqLwogICAgICBpZighV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjU1RBSWQpKQogICAgICB7CiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgICAgICAgLyogUmVhZCBSU1NJIGFuZCB1cGRhdGUgKi8KICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfSFNIYW5kbGVSWEZyYW1lKHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01HTVRfRlJBTUVfVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX0ZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiNlbHNlCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRSU1NJKHB2b3NHQ3R4LCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKI2VuZGlmCiAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGFuZGxlIFJYIE1hbmFnZW1lbnQgRnJhbWUgZmFpbCB3aXRoaW4gSGFuZG9mZiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IG1vZHVsZSIpKTsKICAgICAgICAgIC8qIERvIE5vdCBEcm9wIHBhY2tldCBhdCBoZXJlCiAgICAgICAgICAgKiBSZXZpc2l0IHdoeSBITyBtb2R1bGUgcmV0dXJuIGZhaWwKICAgICAgICAgICAqICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAqICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICAqICAgY29udGludWU7CiAgICAgICAgICAgKi8KICAgICAgICB9CiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRTTlIocHZvc0dDdHgsIHB2QkRIZWFkZXIsIHVjU1RBSWQpOwoKICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiRmFpbGVkIHRvIFJlYWQgU05SIikpKTsKICAgICAgICB9CiNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUwogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKICAgICAgICBpZiAoIE5VTEwgIT0gcENsaWVudFNUQSkKICAgICAgICB7CiAgICAgICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLm1nbXRSeCsrOwogICAgICAgICAgICBpZiAoV0xBTlRMX0lTX01HTVRfQUNUSU9OX0ZSQU1FKHVjRnJtVHlwZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLm1nbXRBY3Rpb25SeCsrOwoKICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCiAgICAgIH0KCiAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUngoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZik7IAogICAgfQogICAgZWxzZSAvKiBEYXRhIEZyYW1lICovCiAgICB7CiAgICAgIHVjU1RBSWQgPSAodl9VOF90KVdEQV9HRVRfUlhfU1RBSUQoIHB2QkRIZWFkZXIgKTsKICAgICAgdWNUaWQgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoIHB2QkRIZWFkZXIgKTsKI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCiAgICAgIGFjID0gV0xBTlRMX1RJRF8yX0FDW3VjVGlkXTsKI2VuZGlmCgogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkRhdGEgcGFja2V0IHJlY2VpdmVkIGZvciBTVEEgJWQiLCB1Y1NUQUlkKSk7CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIFRoaXMgc2hvdWxkIGJlIGNvcnJlY3RlZCB3aGVuIG11bHRpcGUgc3RhIHN1cHBvcnQgaXMgYWRkZWQgISEhCiAgICAgICAgZm9yIG5vdyBiY2FzdCBmcmFtZXMgd2lsbCBiZSBzZW50IHRvIHRoZSBsYXN0IHJlZ2lzdGVyZWQgU1RBCiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBpZiAoIFdEQV9JU19SWF9CQ0FTVChwdkJESGVhZGVyKSkKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6VEwgcnggQmNhc3QgZnJhbWUgLSBzZW5kaW5nIHRvIGxhc3QgcmVnaXN0ZXJlZCBzdGF0aW9uIikpOwogICAgICAgIGJyb2FkY2FzdCA9IFZPU19UUlVFOwogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgSWYgQWRkcjEgaXMgYi9tY2FzdCwgYnV0IEFkZHIzIGlzIG91ciBvd24gc2VsZiBNQUMsIGl0IGlzIGEgYi9tY2FzdAogICAgICAgICAgcGt0IHdlIHNlbnQgIGxvb3BpbmcgYmFjayB0byB1cy4gVG8gYmUgZHJvcHBlZCBpZiB3ZSBhcmUgbm9uIEJUQU1QICAKICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogICAgICAgIGlmKCBXTEFOSEFMX1JYX0JEX0FERFIzX1NFTEZfSURYID09IAogICAgICAgICAgICAodl9VOF90KVdEQV9HRVRfUlhfQUREUjNfSURYKCBwdkJESGVhZGVyICkpIAogICAgICAgIHsKICAgICAgICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX1RSVUU7IAogICAgICAgIH0KICAgICAgfS8qaWYgYmNhc3QqLwoKICAgICAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQodWNTVEFJZCkgKQogICAgICB7CiAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTVEEgSUQgaW52YWxpZCAtIGRyb3BwaW5nIHBrdCIpKTsKICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgTm8gbmVlZCB0byBsb2NrIGNhY2hlIGFjY2VzcyBiZWNhdXNlIGNhY2hlIG1hbmlwdWxhdGlvbiBvbmx5IGhhcHBlbnMKICAgICAgICBpbiB0aGUgdHJhbnNwb3J0IHRocmVhZC90YXNrIGNvbnRleHQKICAgICAgICAtIFRoZXNlIGZyYW1lcyBhcmUgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBzdGF0aW9uIHVwb24gcmVnaXN0cmF0aW9uCiAgICAgICAgICB3aGljaCBoYXBwZW5zIGluIHRoZSBtYWluIHRocmVhZCBjb250ZXh0CiAgICAgICAgICBUaGUgY2FjaGluZyBoZXJlIGNhbiBoYXBwZW4gaW4gZWl0aGVyIFR4IG9yIFJ4IHRocmVhZCBkZXBlbmRpbmcKICAgICAgICAgIG9uIHRoZSBjdXJyZW50IFNTQyBzY2hlZHVsaW5nCiAgICAgICAgLSBhbHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGZyYW1lcyBpbiB0aGUgY2FjaGUgYXJlIGZ3ZC1lZCB0bwogICAgICAgICAgdGhlIHN0YXRpb24gYmVmb3JlIHRoZSBuZXcgaW5jb21pbmcgb25lcyAKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CiAgICAgIGlmIChOVUxMID09IHBDbGllbnRTVEEpCiAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6U1RBIG5vdCBhbGxvY2F0ZWQgbWVtb3J5LiBEcm9wcGluZyBwYWNrZXQiKSk7CiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICAgICAgaWYgKCggcENsaWVudFNUQS0+dWNFeGlzdHMgKSAmJgogICAgICAgICAgIChXTEFOX1NUQV9URExTID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAgICAgIChwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkKSkKICAgICAgICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcENsaWVudFNUQS0+dWNUeFN1c3BlbmRlZCwgMCApOwogICAgICBlbHNlIGlmICggIWJyb2FkY2FzdCAmJiAocENsaWVudFNUQS0+dWNFeGlzdHMgPT0gMCApICkKICAgICAgewogICAgICAgICAgdHBTaXJNYWNNZ210SGRyIHBNYWNIZWFkZXIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIoIHB2QkRIZWFkZXIgKTsKCiAgICAgICAgICAvKiBmcm9tIHRoZSBkaXJlY3QgcGVlciB3aGlsZSBpdCBpcyBub3QgcmVnaXN0ZXJlZCB0byBUTCB5ZXQgKi8KICAgICAgICAgIGlmICggKHBNYWNIZWFkZXItPmZjLmZyb21EUyA9PSAwKSAmJgogICAgICAgICAgICAgICAocE1hY0hlYWRlci0+ZmMudG9EUyA9PSAwKSApCiAgICAgICAgICB7CiAgICAgICAgICAgICAgdl9VOF90IHVjQWRkcjNTVEFJZDsKCiAgICAgICAgICAgICAgdWNBZGRyM1NUQUlkID0gV0RBX0dFVF9SWF9BRERSM19JRFgocHZCREhlYWRlcik7CgogICAgICAgICAgICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjQWRkcjNTVEFJZCkgKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTVEEgSUQgJWQgaW52YWxpZCAtIGRyb3BwaW5nIHBrdCIsIHVjQWRkcjNTVEFJZCkpOwogICAgICAgICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAoIShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdICYmIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPnVjRXhpc3RzICYmCiAgICAgICAgICAgICAgICAgIChXTEFOX1NUQV9JTkZSQSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdLT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgICAgICAgICAgICAgKFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdLT50bFN0YXRlKSkpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzdGFJZCAlZCBhZGRyM0lkICVkIHRsU3RhdGUgJWQuIFVua293biBSZWNlaXZlci9UcmFuc21pdHRlciBEcm9wcGluZyBwYWNrZXQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBZGRyM1NUQUlkLCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdLT50bFN0YXRlKSk7CiAgICAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzdGFJZCAlZCBkb2Vzbid0IGV4aXN0LCBidXQgbWFwcGVkIHRvIEFQIHN0YUlkICVkIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIHVjQWRkcjNTVEFJZCkpOwogICAgICAgICAgICAgICAgICB1Y1NUQUlkID0gdWNBZGRyM1NUQUlkOwogICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNBZGRyM1NUQUlkXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KI2VuZGlmCgogICAgICBpZiAoKCBwQ2xpZW50U1RBLT5lbmFibGVDYWNoaW5nID09IDEgKSAmJgogICAgICAgICAgICAvKkRvbnQgYnVmZmVyIEJyb2FkY2FzdC9NdWx0aWNhc3QgZnJhbWVzLiBJZiBBUCB0cmFuc21pdHMgYnVyc3RzIG9mIEJyb2FkY2FzdC9NdWx0aWNhc3QgZGF0YSBmcmFtZXMsIAogICAgICAgICAgICAgKiBsaWJyYSBidWZmZXJzIGFsbCBCcm9hZGNhc3QvTXVsdGljYXN0IHBhY2tldHMgYWZ0ZXIgYXV0aGVudGljYXRpb24gd2l0aCBBUCwgCiAgICAgICAgICAgICAqIFNvIGl0IHdpbGwgbGVhZCB0byBsb3cgcmVzb3VyY2UgY29uZGl0aW9uIGluIFJ4IERhdGEgUGF0aC4qLwogICAgICAgICAgKCBXREFfSVNfUlhfQkNBU1QocHZCREhlYWRlcikgPT0gMCApKQogICAgICB7CiAgICAgICAgaWYoIFdEQV9Jc1NlbGZTVEEocHZvc0dDdHgsdWNTVEFJZCkpCiAgICAgICAgewogICAgICAgICAgIC8vZHJvcCBwYWNrZXQgZm9yIFNlbGYgU1RBIGluZGV4CiAgICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICIlczogUGFja2V0IGRyb3BwZWQgZm9yIFNlbGYgU1RBIHdpdGggc3RhSWQgJWQgIiwgX19mdW5jX18sIHVjU1RBSWQgKSk7CgogICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdURQVVNpZyA9IFdEQV9HRVRfUlhfRFBVU0lHKCBwdkJESGVhZGVyICk7CiAgICAgICAgICAvL1N0YXRpb24gaGFzIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIHdpdGggVEwgLSBjYWNoZSB0aGUgZnJhbWUKICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAiJXM6IHN0YUlkICVkIGV4aXN0ICVkIHRsU3RhdGUgJWQgY2FjaGUgcnggZnJhbWUiLCBfX2Z1bmNfXywgdWNTVEFJZCwKICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51Y0V4aXN0cywgcENsaWVudFNUQS0+dGxTdGF0ZSkpOwogICAgICAgIFdMQU5UTF9DYWNoZVNUQUZyYW1lKCBwVExDYiwgdWNTVEFJZCwgdm9zVGVtcEJ1ZmYsIHVEUFVTaWcsIGJyb2FkY2FzdCwgdWNGcm1UeXBlKTsKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKICAgICAgaWYgKChwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0lzRXNlU3RhKXx8IGJyb2FkY2FzdCkKICAgICAgewogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIEZpbHRlciB0aGUgSUFQUCBmcmFtZXMgZm9yIEVTRSBjb25uZWN0aW9uOwogICAgICAgICAgaWYgZGF0YSBpdCB3aWxsIHJldHVybiBmYWxzZSBhbmQgaXQKICAgICAgICAgIHdpbGwgYmUgcm91dGVkIHRocm91Z2ggdGhlIHJlZ3VsYXIgZGF0YSBwYXRoCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGlmICggV0xBTlRMX0lzSUFQUEZyYW1lKHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYpKQogICAgICAgIHsKICAgICAgICAgICAgYkZvcndhcmRJQVBQd2l0aExMQyA9IFZPU19UUlVFOwogICAgICAgIH0KICAgICAgfQojZW5kaWYKCiNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0UpICYmICFkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQogICAgICBpZiAoKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNFc2VTdGEpfHwgYnJvYWRjYXN0KQogICAgICB7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgRmlsdGVyIHRoZSBJQVBQIGZyYW1lcyBmb3IgRVNFIGNvbm5lY3Rpb247CiAgICAgICAgICBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdCAKICAgICAgICAgIHdpbGwgYmUgcm91dGVkIHRocm91Z2ggdGhlIHJlZ3VsYXIgZGF0YSBwYXRoCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGlmICggV0xBTlRMX0lzSUFQUEZyYW1lKHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX3BrdF9mbGF0dGVuX3J4X3BrdCgmdm9zVGVtcEJ1ZmYpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGZsYXR0ZW4gcGFja2V0IC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFJlY2VpdmVkIEVTRSBJQVBQIEZyYW1lIikpOwoKICAgICAgICAgICAgICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCggcHZvc0dDdHgsIHZvc1RlbXBCdWZmKTsgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiNlbmRpZiAgLyogZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiAhZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkgKi8KCiAgICAgIGlmICggV0xBTl9TVEFfQlRfQU1QID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlICkKICAgICAgewogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIFByb2Nlc3MgdGhlIGN0cmwgQkFQIGZyYW1lOyBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdCAKICAgICAgICAgIHdpbGwgYmUgcm91dGVkIHRocm91Z2ggdGhlIHJlZ3VsYXIgZGF0YSBwYXRoCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGlmICggV0xBTlRMX1Byb2Nlc3NCQVBGcmFtZSggcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdF9kYXRhX3BrdF9hcnJpdmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpCiAgICAgICAgewogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfS8qaWYgQlQtQU1QIHN0YXRpb24qLwogICAgICBlbHNlIGlmKHNlbGZCY2FzdExvb3BiYWNrID09IFZPU19UUlVFKQogICAgICB7IAogICAgICAgIC8qIERyb3AgcGFja2V0ICovIAogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7IAogICAgICAgIGNvbnRpbnVlOyAKICAgICAgfSAKICAgICAgCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgRGF0YSBwYWNrZXQgcmVjZWl2ZWQsIHNlbmQgdG8gc3RhdGUgbWFjaGluZQogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICB3U1RBRXZlbnQgPSBXTEFOVExfUlhfRVZFTlQ7CgogICAgICBwZm5TVEFGc20gPSB0bFNUQUZzbVtwQ2xpZW50U1RBLT50bFN0YXRlXS4KICAgICAgICAgICAgICAgICAgICAgIHBmblNUQVRibFt3U1RBRXZlbnRdOwoKICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCiAgICAgIHsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgICAgICAvKiBSZWFkIFJTU0kgYW5kIHVwZGF0ZSAqLwogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9IU0hhbmRsZVJYRnJhbWUocHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfREFUQV9GUkFNRV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZik7CiAgICAgICAgYnJvYWRjYXN0ID0gVk9TX0ZBTFNFOwojZWxzZQogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkUlNTSShwdm9zR0N0eCwgcHZCREhlYWRlciwgdWNTVEFJZCk7CiNlbmRpZgogICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICJIYW5kbGUgUlggRGF0YSBGcmFtZSBmYWlsIHdpdGhpbiBIYW5kb2ZmIHN1cHBvcnQgbW9kdWxlIikpOwogICAgICAgICAgLyogRG8gTm90IERyb3AgcGFja2V0IGF0IGhlcmUgCiAgICAgICAgICAgKiBSZXZpc2l0IHdoeSBITyBtb2R1bGUgcmV0dXJuIGZhaWwKICAgICAgICAgICAqIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgKiB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgICogY29udGludWU7CiAgICAgICAgICAgKi8KICAgICAgICB9CiNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUwogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKICAgICAgICBpZiAoIE5VTEwgIT0gcENsaWVudFNUQSkKICAgICAgICB7CiAgICAgICAgICAgIHRwU2lyTWFjTWdtdEhkciBwTWFjSGVhZGVyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKCBwdkJESGVhZGVyICk7CiAgICAgICAgICAgIGlmKCAhV0RBX0lTX1JYX0JDQVNUKHB2QkRIZWFkZXIpICYmICggcE1hY0hlYWRlci0+ZGFbMF0gJiAweDEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzW2FjXS5yeE1jYXN0Kys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFdMQU5UTF9IU0dldERhdGFSU1NJKHB2b3NHQ3R4LCBwdkJESGVhZGVyLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICZjdXJyZW50QXZnUlNTSSk7CiAgICAgICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLnJzc2lEYXRhID0gY3VycmVudEF2Z1JTU0k7CgogICAgICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzW2FjXS5yeE1wZHUrKzsKICAgICAgICAgICAgaWYgKFdEQV9JU19SWF9BTl9BTVBEVSAocHZCREhlYWRlcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbYWNdLnJ4QW1wZHUrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCgojZW5kaWYKICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVhZFNOUihwdm9zR0N0eCwgcHZCREhlYWRlciwgdWNTVEFJZCk7CgogICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIkZhaWxlZCB0byBSZWFkIFNOUiIpKSk7CiAgICAgICAgfQoKICAgICAgICBwZm5TVEFGc20oIHB2b3NHQ3R4LCB1Y1NUQUlkLCAmdm9zVGVtcEJ1ZmYsIGJGb3J3YXJkSUFQUHdpdGhMTEMpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgIldMQU4gVEw6TlVMTCBzdGF0ZSBmdW5jdGlvbiwgU1RBOiVkLCBTdGF0ZTogJWQtIGRyb3BwaW5nIHBhY2tldCIsCiAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bFN0YXRlKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICB9LyogZWxzZSBkYXRhIGZyYW1lKi8KCiAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogIH0vKndoaWxlIGNoYWluKi8KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SeEZyYW1lcyAqLwoKI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NvbGxlY3RJbnRlcmZhY2VTdGF0cwoKICBERVNDUklQVElPTgogICAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IFRMIHRvIHNlbmQgdGhlIHN0YXRpdGljcwoKICBERVBFTkRFTkNJRVMKCgogIFBBUkFNRVRFUlMKCiAgICBJTgoKICAgIHVjU1RBSWQ6ICAgIHN0YXRpb24gZm9yIHdoaWNoIHRoZSBzdGF0aXN0aWNzIG5lZWQgdG8gY29sbGVjdGVkCgogICAgdm9zRGF0YUJ1ZmY6IGl0IHdpbGwgY29udGFpbiB0aGUgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZwogICAgICAgICAgICAgICAgc3RydWN0dXJlCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9Db2xsZWN0SW50ZXJmYWNlU3RhdHMKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfSW50ZXJmYWNlU3RhdHNUeXBlICAgICp2b3NEYXRhQnVmZgopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ29sbGVjdFN0YXRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ29sbGVjdFN0YXRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KICB2b3NfbWVtX2NvcHkodm9zRGF0YUJ1ZmYsICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+aW50ZXJmYWNlU3RhdHMsCiAgICAgICAgICBzaXplb2YoV0xBTlRMX0ludGVyZmFjZVN0YXRzVHlwZSkpOwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCiNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUnhDYWNoZWRGcmFtZXMKCiAgREVTQ1JJUFRJT04KICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBUTCB0byBmb3J3YXJkIHRoZSBjYWNoZWQgZnJhbWVzIHRvIGEgcGFydGljdWxhcgogICAgc3RhdGlvbjsgCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICBJZiB0aGUgZnJhbWUgY2FycmllZCBpcyBhIGRhdGEgZnJhbWUgdGhlbiB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggaXQgaXMKICAgIGRlc3RpbmVkIHRvIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIFRMLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHBUTENiOiAgIHBvaW50ZXIgdG8gVEwgaGFuZGxlIAogICAKICAgIHVjU1RBSWQ6ICAgIHN0YXRpb24gZm9yIHdoaWNoIHdlIG5lZWQgdG8gZm9yd2FyZCB0aGUgcGFja2V0cwoKICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNhY2hlZCBidWZmZXIKICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkLCBpZiB0aGVyZSBpcyBtb3JlIHRoZW4gb25lIHBhY2tldCB0aGV5IHdpbGwgYmUKICAgICAgICAgICAgICAgICAgIGNoYWluZWQgdXNpbmcgdk9TUyBidWZmZXJzLgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUnhDYWNoZWRGcmFtZXMKKAogIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKICB2X1U4X3QgICAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYKKQp7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIFdMQU5UTF9TVEFGdW5jVHlwZSAgcGZuU1RBRnNtOwogIHZvc19wa3RfdCogICAgICAgICAgdm9zVGVtcEJ1ZmY7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9QVk9JRF90ICAgICAgICAgICBwdkJESGVhZGVyID0gTlVMTDsKICBXTEFOVExfU1RBRXZlbnRUeXBlIHdTVEFFdmVudCAgPSBXTEFOVExfUlhfRVZFTlQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1RpZCAgICAgID0gMDsKICB2X0JPT0xfdCAgICAgICAgICAgIGJyb2FkY2FzdCAgPSBWT1NfRkFMU0U7CiAgdl9CT09MX3QgICAgICAgICAgICBiU2lnTWF0Y2ggID0gVk9TX0ZBTFNFOyAKICB2X0JPT0xfdCAgICAgICAgICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX0ZBTFNFOwogIHN0YXRpYyB2X1U4X3QgICAgICAgZmlyc3RfZGF0YV9wa3RfYXJyaXZlZDsKICB2X1UzMl90ICAgICAgICAgICAgIHVEUFVTaWc7IAogIHZfVThfdCAgICAgICAgICAgICAgdWNVY2FzdFNpZzsgCiAgdl9VOF90ICAgICAgICAgICAgICB1Y0JjYXN0U2lnOyAKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlRMIFJlY2VpdmUgQ2FjaGVkIEZyYW1lcyBjYWxsZWQiKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHZvc0RhdGFCdWZmICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1J4RnJhbWVzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9GT1JXQVJEX0NBQ0hFRF9GUkFNRVMsCiAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCAxPDwxNiB8IHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSkpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSB0aGUgaW5pdGlhbCBidWZmZXIgLSB0aGlzIGlzIHRoZSBmaXJzdCByZWNlaXZlZCBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwoKICB3aGlsZSAoIE5VTEwgIT0gdm9zVGVtcEJ1ZmYgKQogIHsKICAgIGJyb2FkY2FzdCA9IFZPU19GQUxTRTsKICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX0ZBTFNFOyAKCiAgICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8gKTsKCiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpTZW5kaW5nIG5ldyBjYWNoZWQgcGFja2V0IHRvIHN0YXRpb24gJWQiLCB1Y1NUQUlkKSk7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBQZWVrIGF0IEJEIGhlYWRlciAtIGRvIG5vdCByZW1vdmUKICAgICAgISEhIE9wdGltaXplIG1lOiBvbmx5IHBhcnQgb2YgaGVhZGVyIGlzIG5lZWRlZDsgbm90IGVudGlyZSBvbmUKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdm9zU3RhdHVzID0gV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHZvc1RlbXBCdWZmLCAodl9QVk9JRF90KSZwdkJESGVhZGVyLCAwICk7CgogICAgaWYgKCBOVUxMID09IHB2QkRIZWFkZXIgKQogICAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGV4dHJhY3QgQkQgaGVhZGVyIikpOwogICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgIHVEUFVTaWcgPSBXREFfR0VUX1JYX0RQVVNJRyggcHZCREhlYWRlciApOwoKICAgIC8qIEFNU0RVIEhXIGJ1ZyBmaXgKICAgICAqIEFmdGVyIDJuZCBBTVNEVSBzdWJmcmFtZSBIVyBjb3VsZCBub3QgaGFuZGxlIEJEIGNvcnJlY3RseQogICAgICogSEFMIHdvcmthcm91bmQgaXMgbmVlZGVkICovCiAgICBpZihXREFfR0VUX1JYX0FTRihwdkJESGVhZGVyKSkKICAgIHsKICAgICAgV0RBX0RTX1J4QW1zZHVCZEZpeCh2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlcik7CiAgICB9CgogICAgdWNUaWQgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoIHB2QkRIZWFkZXIgKTsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkRhdGEgcGFja2V0IGNhY2hlZCBmb3IgU1RBICVkIiwgdWNTVEFJZCk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkIHdoZW4gbXVsdGlwZSBzdGEgc3VwcG9ydCBpcyBhZGRlZCAhISEKICAgICAgZm9yIG5vdyBiY2FzdCBmcmFtZXMgd2lsbCBiZSBzZW50IHRvIHRoZSBsYXN0IHJlZ2lzdGVyZWQgU1RBCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggV0RBX0lTX1JYX0JDQVNUKHB2QkRIZWFkZXIpKQogICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpUTCByeCBCY2FzdCBmcmFtZSAiKSk7CiAgICAgIGJyb2FkY2FzdCA9IFZPU19UUlVFOwoKICAgICAgLyogSWYgQWRkcjEgaXMgYi9tY2FzdCwgYnV0IEFkZHIzIGlzIG91ciBvd24gc2VsZiBNQUMsIGl0IGlzIGEgYi9tY2FzdCAKICAgICAgICogcGt0IHdlIHNlbnQgbG9vcGluZyBiYWNrIHRvIHVzLiBUbyBiZSBkcm9wcGVkIGlmIHdlIGFyZSBub24gQlRBTVAgIAogICAgICAgKi8gCiAgICAgIGlmKCBXTEFOSEFMX1JYX0JEX0FERFIzX1NFTEZfSURYID09IAogICAgICAgICAgKHZfVThfdClXREFfR0VUX1JYX0FERFIzX0lEWCggcHZCREhlYWRlciApKSAKICAgICAgewogICAgICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX1RSVUU7IAogICAgICB9CiAgICB9LyppZiBiY2FzdCovCgogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDaGVjayBpZiB0aGUgcGFja2V0IHRoYXQgd2UgY2FjaGVkIG1hdGNoZXMgdGhlIERQVSBzaWduYXR1cmUgb2YgdGhlCiAgICAgIG5ld2x5IGFkZGVkIHN0YXRpb24gCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgaWYgKCBicm9hZGNhc3QgKQogICAgewogICAgICB1Y0JjYXN0U2lnID0gKHZfVThfdCl1RFBVU2lnOwogICAgICBiU2lnTWF0Y2ggPSAoKCBXTEFOX1RMX0lOVkFMSURfQl9TSUcgIT0gCiAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZyApICYmCiAgICAgICAgKCB1Y0JjYXN0U2lnID09IHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcgKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHVjVWNhc3RTaWcgPSAodl9VOF90KXVEUFVTaWc7CiAgICAgIGJTaWdNYXRjaCA9ICgoIFdMQU5fVExfSU5WQUxJRF9VX1NJRyAhPSAKICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcgKSAmJgogICAgICAgICAgKCB1Y1VjYXN0U2lnID09IHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcgKSk7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIElmIHRoZSBwYWNrZXQgZG9lc24ndCBtYXRjaCAtIGRyb3AgaXQgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggIWJTaWdNYXRjaCApCiAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwKICAgICAgICAiV0xBTiBUTDogQ2FjaGVkIHBhY2tldCBkb2VzIG5vdCBtYXRjaCBEUFUgU2lnIG9mIHRoZSBuZXcgU1RBIC0gZHJvcCAiCiAgICAgICAgIiBEUFUgU2lnICVkICBVQyAlZCBCQyAlZCBCICVkIiwKICAgICAgICB1RFBVU2lnLAogICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcsCiAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZywKICAgICAgICBicm9hZGNhc3QpKTsKCiAgICAgIC8qIERyb3AgcGFja2V0ICovIAogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOyAKICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsgCiAgICAgIGNvbnRpbnVlOyAKCiAgICB9LyppZiBzaWduYXR1cmUgbWlzbWF0Y2gqLwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIENoZWNrIGlmIEJULUFNUCBmcmFtZToKICAgICAgLSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgbmVlZGVkIGluIHRoaXMgY2FzZSB0byBzZXBhcmF0ZSBCVC1BTVAgZGF0ZQogICAgICAgIGZyb20gQlQtQU1QIEN0cmwgcGF0aCAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoIFdMQU5fU1RBX0JUX0FNUCA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSApCiAgICB7CiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBQcm9jZXNzIHRoZSBjdHJsIEJBUCBmcmFtZTsgaWYgZGF0YSBpdCB3aWxsIHJldHVybiBmYWxzZSBhbmQgaXQgCiAgICAgICAgd2lsbCBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgcmVndWxhciBkYXRhIHBhdGgKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBpZiAoIFdMQU5UTF9Qcm9jZXNzQkFQRnJhbWUoIHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RfZGF0YV9wa3RfYXJyaXZlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkKSkKICAgICAgewogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfS8qaWYgQlQtQU1QIHN0YXRpb24qLwogICAgICBlbHNlIGlmKHNlbGZCY2FzdExvb3BiYWNrID09IFZPU19UUlVFKQogICAgICB7IAogICAgICAgIC8qIERyb3AgcGFja2V0ICovIAogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7IAogICAgICAgIGNvbnRpbnVlOyAKICAgICAgfSAKICAgICAgCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgRGF0YSBwYWNrZXQgcmVjZWl2ZWQsIHNlbmQgdG8gc3RhdGUgbWFjaGluZQogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICB3U1RBRXZlbnQgPSBXTEFOVExfUlhfRVZFTlQ7CgogICAgICBwZm5TVEFGc20gPSB0bFNUQUZzbVtwQ2xpZW50U1RBLT50bFN0YXRlXS4KICAgICAgICAgICAgICAgICAgICAgIHBmblNUQVRibFt3U1RBRXZlbnRdOwoKICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCiAgICAgIHsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgICAgICAvKiBSZWFkIFJTU0kgYW5kIHVwZGF0ZSAqLwogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9IU0hhbmRsZVJYRnJhbWUodm9zX2dldF9nbG9iYWxfY29udGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmKTsKICAgICAgICBicm9hZGNhc3QgPSBWT1NfRkFMU0U7CiNlbHNlCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRSU1NJKHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCxwVExDYiksIHB2QkRIZWFkZXIsIHVjU1RBSWQpOwojZW5kaWYKICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJIYW5kbGUgUlggRGF0YSBGcmFtZSBmYWlsIHdpdGhpbiBIYW5kb2ZmIHN1cHBvcnQgbW9kdWxlIikpOwogICAgICAgICAgLyogRG8gTm90IERyb3AgcGFja2V0IGF0IGhlcmUgCiAgICAgICAgICAgKiBSZXZpc2l0IHdoeSBITyBtb2R1bGUgcmV0dXJuIGZhaWwKICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgKi8KICAgICAgICB9CiAgICAgICAgcGZuU1RBRnNtKCB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLCB1Y1NUQUlkLCAKICAgICAgICAgICAgICAgICAmdm9zVGVtcEJ1ZmYsIFZPU19GQUxTRSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpOVUxMIHN0YXRlIGZ1bmN0aW9uLCBTVEE6JWQsIFN0YXRlOiAlZC0gZHJvcHBpbmcgcGFja2V0IiwKICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIHBDbGllbnRTVEEtPnRsU3RhdGUpKTsKICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgfS8qd2hpbGUgY2hhaW4qLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1J4Q2FjaGVkRnJhbWVzICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1J4UHJvY2Vzc01zZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFZPU1Mgd2hlbiBhIG1lc3NhZ2Ugd2FzIHNlcmlhbGl6ZWQgZm9yIFRMIHRocm91Z2ggdGhlCiAgICByeCB0aHJlYWQvdGFzay4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgbWVzc2FnZTogICAgICAgIHR5cGUgYW5kIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIE90aGVyIHZhbHVlcyBjYW4gYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCBwbGVhc2UgY2hlY2sKICBjb3JyZXNwb25kaW5nIEFQSSBmb3IgbW9yZSBpbmZvLgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1J4UHJvY2Vzc01zZwooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKICB2b3NfbXNnX3QqICAgICAgIG1lc3NhZ2UKKQp7CiAgIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgIHZfVTMyX3QgICAgICAgICB1RGF0YTsKICAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQ7CiAgIHZfVThfdCAgICAgICAgICB1Y1VjYXN0U2lnOwogICB2X1U4X3QgICAgICAgICAgdWNCY2FzdFNpZzsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBtZXNzYWdlICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1J4UHJvY2Vzc01lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFByb2Nlc3MgbWVzc2FnZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIHJ4IGZsb3ciLCBtZXNzYWdlLT50eXBlKSk7CgogIHN3aXRjaCggbWVzc2FnZS0+dHlwZSApCiAgewoKICBjYXNlIFdMQU5UTF9SWF9GV0RfQ0FDSEVEOgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBUaGUgZGF0YSBzZW50IHdpdGggdGhlIG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgogICAgICAgfCAwMCB8IHVjQmNhc3RTaWduYXR1cmUgfCB1Y1VjYXN0U2lnbmF0dXJlIHwgdWNTVEFJRCB8CiAgICAgICBlYWNoIGZpZWxkIGFib3ZlIGlzIG9uZSBieXRlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdURhdGEgICAgICAgPSBtZXNzYWdlLT5ib2R5dmFsOwogICAgdWNTVEFJZCAgICAgPSAoIHVEYXRhICYgMHgwMDAwMDBGRik7CiAgICB1Y1VjYXN0U2lnICA9ICggdURhdGEgJiAweDAwMDBGRjAwKT4+ODsKICAgIHVjQmNhc3RTaWcgID0gKHZfVThfdCkoKCB1RGF0YSAmIDB4MDBGRjAwMDApPj4xNik7CiAgICB2b3NTdGF0dXMgICA9IFdMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzKCBwdm9zR0N0eCwgdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjVWNhc3RTaWcsIHVjQmNhc3RTaWcpOwogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAvKm5vIHByb2Nlc3NpbmcgZm9yIG5vdyovCiAgICBicmVhazsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1Jlc291cmNlQ0IKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSB0aGUgVEwgd2hlbiBpdCBoYXMgcGFja2V0cyBhdmFpbGFibGUgZm9yIHRyYW5zbWlzc2lvbi4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggQkFMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1Jlc291cmNlQ0IKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2X1UzMl90ICAgICAgICAgdUNvdW50CikKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwVExDYi0+dVJlc0NvdW50ID0gdUNvdW50OwoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVzdW1lIFR4IGlmIGVub3VnaCByZXMgYW5kIG5vdCBzdXNwZW5kZWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19NRiApICYmCiAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICJXTEFOIFRMOklzc3VpbmcgWG1pdCBzdGFydCByZXF1ZXN0IHRvIEJBTCBmb3IgYXZhaWwgcmVzIEFTWU5DIikpOwogICAgcmV0dXJuIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZXNvdXJjZUNCICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX0lzVHhYbWl0UGVuZGluZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IHRoZSBXREEgd2hlbiBpdCB3YW50cyB0byBrbm93IHdoZXRoZXIgV0RBX0RTX1RYX1NUQVJUX1hNSVQgbXNnCiAgICBpcyBwZW5kaW5nIGluIFRMIG1zZyBxdWV1ZSAKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggV0RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICAwOiAgIE5vIFdEQV9EU19UWF9TVEFSVF9YTUlUIG1zZyBwZW5kaW5nIAogICAgMTogICBNc2cgV0RBX0RTX1RYX1NUQVJUX1hNSVQgYWxyZWFkeSBwZW5kaW5nIGluIFRMIG1zZyBxdWV1ZSAKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9CT09MX3QKV0xBTlRMX0lzVHhYbWl0UGVuZGluZwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CikKewoKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBpbiBXTEFOVExfSXNUeFhtaXRQZW5kaW5nICIpKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIHJldHVybiBwVExDYi0+aXNUeFRyYW5taXRNc2dQZW5kaW5nOwoKfS8qV0xBTlRMX0lzVHhYbWl0UGVuZGluZyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX1NldFR4WG1pdFBlbmRpbmcKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSB0aGUgV0RBIHdoZW4gaXQgd2FudHMgdG8gaW5kaWNhdGUgdGhhdCBXREFfRFNfVFhfU1RBUlRfWE1JVCBtc2cKICAgIGlzIHBlbmRpbmcgaW4gVEwgbXNnIHF1ZXVlIAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBXREEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdl9WT0lEX3QKV0xBTlRMX1NldFR4WG1pdFBlbmRpbmcKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopCnsKCiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggaW4gV0xBTlRMX1NldFR4WG1pdFBlbmRpbmciKSk7CiAgICByZXR1cm47CiAgfQoKICBwVExDYi0+aXNUeFRyYW5taXRNc2dQZW5kaW5nID0gMTsKICByZXR1cm47Cgp9LypXTEFOVExfU2V0VHhYbWl0UGVuZGluZyAgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9DbGVhclR4WG1pdFBlbmRpbmcKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSB0aGUgV0RBIHdoZW4gaXQgd2FudHMgdG8gaW5kaWNhdGUgdGhhdCBubyBXREFfRFNfVFhfU1RBUlRfWE1JVCBtc2cKICAgIGlzIHBlbmRpbmcgaW4gVEwgbXNnIHF1ZXVlIAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBXREEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFICAgICBOb25lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2X1ZPSURfdApXTEFOVExfQ2xlYXJUeFhtaXRQZW5kaW5nCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgKKQp7CgogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IGluIFdMQU5UTF9DbGVhclR4WG1pdFBlbmRpbmcgIikpOwogICAgcmV0dXJuOwogIH0KCiAgcFRMQ2ItPmlzVHhUcmFubWl0TXNnUGVuZGluZyA9IDA7CiAgcmV0dXJuOwp9LypXTEFOVExfQ2xlYXJUeFhtaXRQZW5kaW5nICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfVHhUaHJlYWREZWJ1Z0hhbmRsZXIKCiAgREVTQ1JJUFRJT04KICAgIFByaW50aW5nIFRMIFNuYXBzaG90IGR1bXAsIHByb2Nlc3NlZCB1bmRlciBUeFRocmVhZCBjb250ZXh0LCBjdXJyZW50bHkKICAgIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgZ2xvYmFsIFRsQ2Igc3RydXR1cmUuIER1bXBzIGluZm9ybWF0aW9uIHJlbGF0ZWQKICAgIHRvIHBlciBhY3RpdmUgU1RBIGNvbm5lY3Rpb24gY3VycmVudGx5IGluIHVzZSBieSBUTC4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdl9WT0lEX3QKV0xBTlRMX1R4VGhyZWFkRGVidWdIYW5kbGVyCigKIHZfUFZPSURfdCAqcFZvc0NvbnRleHQKKQp7CiAgIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogICBpbnQgaSA9IDA7CiAgIHRXREFfQ2JDb250ZXh0ICpwV0RBID0gTlVMTDsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDogJXMgRW50ZXIgIiwgX19mdW5jX18pKTsKCiAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwVm9zQ29udGV4dCk7CiAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKil2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfV0RBLCBwVm9zQ29udGV4dCk7CgogICBpZiAoIE5VTEwgPT0gcFZvc0NvbnRleHQgfHwgTlVMTCA9PSBwVExDYiApCiAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIkdsb2JhbCBWb1MgQ29udGV4dCBvciBUTCBDb250ZXh0IGFyZSBOVUxMIikpOwogICAgICAgIHJldHVybjsKICAgfQoKICAgaWYgKE5VTEwgIT0gcFdEQSkKICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXREEgdVR4Rmxvd01hc2s6ICVkIiwgcFdEQS0+dVR4Rmxvd01hc2spKTsKICAgfQogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKipUTCBEVU1QIElORk9STUFUSU9OKioqKioqKioqKioqKioiKSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJ1RGVsYXllZFRyaWdnZXJGcm1JbnQ6JWRcdHVNaW5GcmFtZXNQcm9jVGhyZXM6JWQiLAogICAgICAgICAgcFRMQ2ItPnRsQ29uZmlnSW5mby51RGVsYXllZFRyaWdnZXJGcm1JbnQsCiAgICAgICAgICBwVExDYi0+dGxDb25maWdJbmZvLnVNaW5GcmFtZXNQcm9jVGhyZXMpKTsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIk1hbmFnZW1lbnQgRnJhbWUgQ2xpZW50IGV4aXN0czogJWQiLAogICAgICAgICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cykpOwogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJ1c1BlbmRpbmdUeENvbXBsZXRlQ291bnQ6ICVkXHR1Y1R4U3VzcGVuZGVkOiAlZCIsCiAgICAgICAgICBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50LAogICAgICAgICAgcFRMQ2ItPnVjVHhTdXNwZW5kZWQpKTsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgInVSZXNDb3VudDogJWQiLCBwVExDYi0+dVJlc0NvdW50KSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJ1Y1JlZ2lzdGVyZWRTdGFJZDogJWRcdHVjQ3VycmVudFNUQTogJWQiLAogICAgICAgICAgcFRMQ2ItPnVjUmVnaXN0ZXJlZFN0YUlkLCBwVExDYi0+dWNDdXJyZW50U1RBKSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJVcmdlbnRGcmFtZVByb2Nlc3Npbmc6ICVzXHR1RnJhbWVzUHJvY1RocmVzOiAlZCIsCiAgICAgICAgICAocFRMQ2ItPmJVcmdlbnQ/IlRydWUiOiJGYWxzZSIpLCBwVExDYi0+dUZyYW1lc1Byb2NUaHJlcykpOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiaXNUeFRyYW5taXRNc2dQZW5kaW5nOiAlZFx0IGlzQk1QUzogJXMiLAogICAgICAgICAgcFRMQ2ItPmlzVHhUcmFubWl0TXNnUGVuZGluZywgcFRMQ2ItPmlzQk1QUz8iVHJ1ZSI6IkZhbHNlIikpOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIlRETFMgUGVlciBDb3VudDogJWQiLCBwVExDYi0+dWNUZGxzUGVlckNvdW50KSk7CiNlbmRpZgoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiKysrKysrKysrKysrKysrKysrKytSZWdpc3RlcmQgQ2xpZW50IEluZm9ybWF0aW9uKysrKysrKysrKyIpKTsKCiAgIGZvciAoIGkgPTA7IGk8V0xBTl9NQVhfU1RBX0NPVU5UOyBpKysgKQogICB7CiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldOwogICAgICAgIGlmKCBOVUxMID09IHBDbGllbnRTVEEgfHwgMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjU1RBIEluZGV4OiAlZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIixpKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOX1NUQURlc2NUeXBlOiIpKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiU1RBSWQ6ICVkXHQgU1RBIE1BQyBBZGRyZXNzOiAlcE0iLCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1NUQUlkLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIlNUQSBUeXBlOiAlZFx0UHJvdGVjdGVkRnJhbWU6ICVkIiwKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSwgcENsaWVudFNUQS0+d1NUQURlc2MudWNQcm90ZWN0ZWRGcmFtZSkpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiUW9TOiAlZFx0UnhGcmFtZVRyYW5zOiAlZFx0VHhGcmFtZVRyYW5zOiAlZCIsCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCwgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uLAogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24pKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAidWNVY2FzdFNpZzogJWRcdHVjQmNhc3RTaWc6ICVkIiwgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZywKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnKSk7CgogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJDbGllbnRJbmRleDogJWRcdCBFeGlzdHM6ICVkIiwgaSwgcENsaWVudFNUQS0+dWNFeGlzdHMpKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiVEwgU3RhdGU6ICVkXHQgVEwgUHJpb3JpdHk6ICVkIiwgcENsaWVudFNUQS0+dGxTdGF0ZSwKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50bFByaSkpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJ1Y1R4U3VzcGVuZGVkOiAlZFx0dWNQa3RQZW5kaW5nOiAlZCIsIHBDbGllbnRTVEEtPnVjVHhTdXNwZW5kZWQsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgInVjRUFQT0xQa3RQZW5kaW5nOiAlZFx0dWNOb01vcmVEYXRhOiAlZCIsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWNFYXBvbFBrdFBlbmRpbmcsIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSkpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiZW5hYmxlQ2FjaGluZzogJWRcdCBmY1N0YVR4RGlzYWJsZWQ6ICVkIiwgcENsaWVudFNUQS0+ZW5hYmxlQ2FjaGluZywKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+ZmNTdGFUeERpc2FibGVkKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJ1Y0N1cnJlbnRBQzogJWRcdHVjU2VydmljZWRBQzogJWQiLCBwQ2xpZW50U1RBLT51Y0N1cnJlbnRBQywKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWNTZXJ2aWNlZEFDKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIlRJRDogJWRcdGF1dFR4Q291bnRbMF06ICVkXHRhdVJ4Q291bnRbMF06ICVkIiwwLCBwQ2xpZW50U1RBLT5hdVR4Q291bnRbMF0sCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+YXVSeENvdW50WzBdKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgImF1Y0FjTWFza1swXTogJWRcdGF1Y0FjTWFza1sxXTogJWRcdGF1Y0FjTWFza1syXTogJWRcdGF1Y0FjTWFza1szXTogJWRcdCIsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+YXVjQUNNYXNrWzBdLCBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbMV0sCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+YXVjQUNNYXNrWzJdLCBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbM10pKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgInVjQ3VycmVudFdlaWdodDogJWQiLCBwQ2xpZW50U1RBLT51Y0N1cnJlbnRXZWlnaHQpKTsKCiAgICAgICAgaWYoIFdMQU5fU1RBX1NPRlRBUCA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiVHJhZmZpY1N0YXRpc3RpY3MgZm9yIFNPRlRBUCBTdGF0aW9uOiIpKTsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJSVUY9JWRcdFJNRj0lZFx0UkJGPSVkIiwgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MucnhVQ0ZjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MucnhNQ0ZjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MucnhCQ0ZjbnQpKTsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJSVUI9JWRcdFJNQj0lZFx0UkJCPSVkIiwgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MucnhVQ0JjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MucnhNQ0JjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MucnhCQ0JjbnQpKTsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJUVUY9JWRcdFRNRj0lZFx0VEJGPSVkIiwgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0ZjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhNQ0ZjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhCQ0ZjbnQpKTsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJUVUI9JWRcdFRNQj0lZFx0VEJCPSVkIiwgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0JjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhNQ0JjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhCQ0JjbnQpKTsKICAgICAgICB9CiAgICB9CiAgIHJldHVybjsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX0ZhdGFsRXJyb3JIYW5kbGVyCgogIERFU0NSSVBUSU9OCiAgICBIYW5kbGUgRmF0YWwgZXJyb3JzIGRldGVjdGVkIG9uIHRoZSBUWCBwYXRoLgogICAgQ3VycmVudGx5IGlzc3VlcyBTU1IgdG8gcmVjb3ZlciBmcm9tIHRoZSBlcnJvci4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X1ZPSURfdApXTEFOVExfRmF0YWxFcnJvckhhbmRsZXIKKAogdl9QVk9JRF90ICpwVm9zQ29udGV4dAopCnsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDogJXMgRW50ZXIgIiwgX19mdW5jX18pKTsKCiAgIGlmICggTlVMTCA9PSBwVm9zQ29udGV4dCApCiAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBHbG9iYWwgVm9TIENvbnRleHQgb3IgVEwgQ29udGV4dCBhcmUgTlVMTCIsCiAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuOwogICB9CgogICAvKgogICAgKiBJc3N1ZSBTU1IuIHZvc193bGFuUmVzdGFydCBoYXMgdGlnaHQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0CiAgICAqIHdlIGRvIG5vdCBzZW5kIGFuIEZJUSBpZiBwcmV2aW91cyBGSVEgaXMgbm90IHByb2Nlc3NlZAogICAgKi8KICAgdm9zX3dsYW5SZXN0YXJ0KCk7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9UTERlYnVnTWVzc2FnZQoKICBERVNDUklQVElPTgogICAgUG9zdCBhIFRMIFNuYXBzaG90IHJlcXVlc3QsIHBvc3RzIG1lc3NhZ2UgaW4gVHhUaHJlYWQuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgZGlzcGxheVNuYXBzaG90IEJvb2xlYW4gc2hvd2luZyB3aGV0aGVyIHRvIGR1bXAgdGhlIHNuYXBzaG90IG9yIG5vdC4KCiAgUkVUVVJOIFZBTFVFICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdl9WT0lEX3QKV0xBTlRMX1RMRGVidWdNZXNzYWdlCigKIHZfQk9PTF90ICAgZGlzcGxheVNuYXBzaG90CikKewogICB2b3NfbXNnX3Qgdm9zTXNnOwogICBWT1NfU1RBVFVTIHN0YXR1czsKCiAgIGlmKGRpc3BsYXlTbmFwc2hvdCkKICAgewogICAgICAgIHZvc01zZy5yZXNlcnZlZCA9IDA7CiAgICAgICAgdm9zTXNnLmJvZHlwdHIgID0gTlVMTDsKICAgICAgICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfU05BUFNIT1Q7CgogICAgICAgIHN0YXR1cyA9IHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NT0RVTEVfSURfVEwsICZ2b3NNc2cpOwogICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIlRYIE1zZyBQb3N0aW5nIEZhaWxlZCB3aXRoIHN0YXR1czogJWQiLHN0YXR1cykpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICB9CiAgIHJldHVybjsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX0ZhdGFsRXJyb3IKCiAgREVTQ1JJUFRJT04KICAgIEZhdGFsIGVycm9yIHJlcG9ydGVkIGluIFRYIHBhdGgsIHBvc3QgYW4gZXZlbnQgdG8gVFggVGhyZWFkIGZvciBmdXJ0aGVyCiAgICBoYW5kbGluZwoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgVk9JRAoKICBSRVRVUk4gVkFMVUUgICAgICBOb25lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2X1ZPSURfdApXTEFOVExfRmF0YWxFcnJvcgooCiB2X1ZPSURfdAopCnsKICAgdm9zX21zZ190IHZvc01zZzsKICAgVk9TX1NUQVRVUyBzdGF0dXM7CgogICB2b3NNc2cucmVzZXJ2ZWQgPSAwOwogICB2b3NNc2cuYm9keXB0ciAgPSBOVUxMOwogICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfRkFUQUxfRVJST1I7CgogICBzdGF0dXMgPSB2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTU9EVUxFX0lEX1RMLCAmdm9zTXNnKTsKICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICIlczogVFggTXNnIFBvc3RpbmcgRmFpbGVkIHdpdGggc3RhdHVzOiAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLHN0YXR1cykpOwogICB9CiAgIHJldHVybjsKfQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVEwgU1RBVEUgTUFDSElORQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhDb25uCgogIERFU0NSSVBUSU9OCiAgICBUcmFuc21pdCBpbiBjb25uZWN0ZWQgc3RhdGUgLSBvbmx5IEVBUE9MIGFuZCBXQUkgcGFja2V0cyBhbGxvd2VkCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdHggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgT3RoZXIgcmV0dXJuIHZhbHVlcyBhcmUgcG9zc2libGUgY29taW5nIGZyb20gdGhlIGNhbGxlZCBmdW5jdGlvbnMuCiAgIFBsZWFzZSBjaGVjayBBUEkgZm9yIGFkZGl0aW9uYWwgaW5mby4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBVHhDb25uCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgIHZfVTE2X3QgICAgICAgICAgICAgIHVzUGt0TGVuOwogICBWT1NfU1RBVFVTICAgICAgICAgICB2b3NTdGF0dXM7CiAgIHZfTUFDQUREUl90ICAgICAgICAgIHZEZXN0TWFjQWRkcjsKICAgdm9zX3BrdF90KiAgICAgICAgICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICBXTEFOVExfQ2JUeXBlKiAgICAgICBwVExDYiAgICAgICA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAgV0xBTlRMX01ldGFJbmZvVHlwZSAgdGxNZXRhSW5mbzsKICAgdl9VOF90ICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjVGlkOwogICB2X1U4X3QgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjV0RTRW5hYmxlZCA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjQUMsIHVjQUNNYXNrLCBpOyAKICAgdl9VMzJfdCAgICAgICAgICAgICAgdHhGbGFnID0gSEFMX1RYX05PX0VOQ1JZUFRJT05fTUFTSzsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU1RBVHhDb25uIik7CiAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIERpc2FibGUgQUMgdGVtcG9yYXJ5IC0gaWYgc3VjY2Vzc2Z1bGwgcmV0cmlldmUgcmUtZW5hYmxlCiAgICAgIFRoZSBvcmRlciBpcyBqdXN0aWZpZWQgYmVjYXVzZSBvZiB0aGUgcG9zc2libGUgc2NlbmFyaW8KICAgICAgIC0gVEwgdHJ5ZXMgdG8gZmV0Y2ggcGFja2V0IGZvciBBQyBhbmQgaXQgcmV0dXJucyBOVUxMCiAgICAgICAtIFRMIGFuYWx5emVzIHRoZSBkYXRhIGl0IGhhcyByZWNlaXZlZCB0byBzZWUgaWYgdGhlcmUgYXJlCiAgICAgICBhbnkgbW9yZSBwa3RzIGF2YWlsYWJsZSBmb3IgQUMgLT4gaWYgbm90IFRMIHdpbGwgZGlzYWJsZSBBQwogICAgICAgLSBob3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2hpbGUgYW5hbHl6aW5nIHJlc3VsdHMgVEwgZ290CiAgICAgICBwcmVlbXB0ZWQgYnkgYSBwZW5kaW5nIGluZGljYXRpb24gd2hlcmUgdGhlIG1hc2sgd2FzIGFnYWluIHNldAogICAgICAgVEwgd2lsbCBub3QgY2hlY2sgYWdhaW4gYW5kIGFzIGEgcmVzdWx0IHdoZW4gaXQgcmVzdW1lcwogICAgICAgZXhlY3V0aW9uIGl0IHdpbGwgZGlzYWJsZSBBQwogICAgICAgVG8gcHJldmVudCB0aGlzIHRoZSBBQyB3aWxsIGJlIGRpc2FibGVkIGhlcmUgYW5kIGlmIHJldHJpZXZlCiAgICAgICBpcyBzdWNjZXNzZnVsbCBpdCB3aWxsIGJlIHJlLWVuYWJsZWQKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogIC8vTFRJOnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLgogIC8vTFRJOiAgIGF1Y0FDTWFza1twVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0N1cnJlbnRBQ10gPSAwOyAKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgISh2b3NfY29uY3VycmVudF9vcGVuX3Nlc3Npb25zX3J1bm5pbmcoKSkgJiYKICAgICAgIXBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiAgewojZWxzZQogIGlmICgoV0xBTl9TVEFfU09GVEFQICE9IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAhKHZvc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSkKICB7CiNlbmRpZgogICAgICB1Y0FDID0gcENsaWVudFNUQS0+dWNDdXJyZW50QUM7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBEaXNhYmxlIEFDIHRlbXBvcmFyeSAtIGlmIHN1Y2Nlc3NmdWxsIHJldHJpZXZlIHJlLWVuYWJsZQogICAgICBUaGUgb3JkZXIgaXMganVzdGlmaWVkIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmxlIHNjZW5hcmlvCiAgICAgICAtIFRMIHRyeWVzIHRvIGZldGNoIHBhY2tldCBmb3IgQUMgYW5kIGl0IHJldHVybnMgTlVMTAogICAgICAgLSBUTCBhbmFseXplcyB0aGUgZGF0YSBpdCBoYXMgcmVjZWl2ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZQogICAgICAgYW55IG1vcmUgcGt0cyBhdmFpbGFibGUgZm9yIEFDIC0+IGlmIG5vdCBUTCB3aWxsIGRpc2FibGUgQUMKICAgICAgIC0gaG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IHdoaWxlIGFuYWx5emluZyByZXN1bHRzIFRMIGdvdAogICAgICAgcHJlZW1wdGVkIGJ5IGEgcGVuZGluZyBpbmRpY2F0aW9uIHdoZXJlIHRoZSBtYXNrIHdhcyBhZ2FpbiBzZXQKICAgICAgIFRMIHdpbGwgbm90IGNoZWNrIGFnYWluIGFuZCBhcyBhIHJlc3VsdCB3aGVuIGl0IHJlc3VtZXMKICAgICAgIGV4ZWN1dGlvbiBpdCB3aWxsIGRpc2FibGUgQUMKICAgICAgIFRvIHByZXZlbnQgdGhpcyB0aGUgQUMgd2lsbCBiZSBkaXNhYmxlZCBoZXJlIGFuZCBpZiByZXRyaWV2ZQogICAgICAgaXMgc3VjY2Vzc2Z1bGwgaXQgd2lsbCBiZSByZS1lbmFibGVkCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1t1Y0FDXSA9IDA7CiAgfQogIGVsc2UKICB7CiAgICAgIC8vc29mdGFwIGNhc2UKICAgICAgdWNBQyA9IHBUTENiLT51Q3VyU2VydmVkQUM7CiAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1t1Y0FDXSA9IDA7CiAgfQoKICAgIC8qWW91IG1ha2UgYW4gaW5pdGlhbCBhc3N1bXB0aW9uIHRoYXQgSEREIGhhcyBubyBtb3JlIGRhdGEgYW5kIGlmIHRoZQogICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQKICAgICBmb3IgcGFja2V0cyBhbmQgc2V0dGluZyB0aGUgZmxhZ3MgdG8gZmFsc2UqLwogIC8vTFRJOiB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjUGt0UGVuZGluZywgMCk7CiAgLy9MVEk6IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTm9Nb3JlRGF0YSA9IDE7CiAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDApOwogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwQ2xpZW50U1RBLCB1Y0FDTWFzaywgaSk7CiAgICAvKllvdSBtYWtlIGFuIGluaXRpYWwgYXNzdW1wdGlvbiB0aGF0IEhERCBoYXMgbm8gbW9yZSBkYXRhIGFuZCBpZiB0aGUKICAgICAgICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgICAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQKICAgICAgICAgICBmb3IgcGFja2V0cyBhbmQgc2V0dGluZyB0aGUgZmxhZ3MgdG8gZmFsc2UqLwogIGlmICggMCA9PSB1Y0FDTWFzayApCiAgewogICAgICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAxOwogIH0KICBlbHNlCiAgewogICAgICB2b3NfYXRvbWljX3NldF9VOCggJnBDbGllbnRTVEEtPnVjUGt0UGVuZGluZywgMSk7CiAgfQoKCiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgIldMQU4gVEw6IFdMQU5UTF9TVEFUeENvbm4gZmV0Y2hpbmcgcGFja2V0IGZyb20gSEREIGZvciBBQzogJWQgQUMgTWFzazogJWQgUGt0IFBlbmRpbmc6ICVkIiwgCiAgICAgICAgICAgICB1Y0FDLCB1Y0FDTWFzaywgcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHR4IHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICB2b3NTdGF0dXMgPSBwQ2xpZW50U1RBLT5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zRGF0YUJ1ZmYsICZ0bE1ldGFJbmZvICk7CgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSB8fCAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKSkKICB7CiAgICBUTExPRzEoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6Tm8gbW9yZSBkYXRhIGF0IEhERCBzdGF0dXMgJWQiLCB2b3NTdGF0dXMpKTsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlc2V0IEFDIGZvciB0aGUgc2VydmljZWQgc3RhdGlvbiB0byB0aGUgaGlnaGVzdCBwcmlvcml0eSBBQwogICAgLT4gZHVlIHRvIG5vIG1vcmUgZGF0YSBhdCB0aGUgc3RhdGlvbgogICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgbWFkZSBpbiB0aGUgbWFpbiBUTCBsb29wCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwQ2xpZW50U1RBLT51Y0N1cnJlbnRBQyAgICAgPSBXTEFOVExfQUNfVk87CiAgICBwQ2xpZW50U1RBLT51Y0N1cnJlbnRXZWlnaHQgPSAwOwoKICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgIldMQU4gVEw6IFdMQU5UTF9TVEFUeENvbm4gbm8gbW9yZSBwYWNrZXRzIGluIEhERCBmb3IgQUM6ICVkIEFDIE1hc2s6ICVkIiwgCiAgICAgICAgICAgICAgIHVjQUMsIHVjQUNNYXNrKTsKCiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgLypUaGVyZSBhcmUgc3RpbGwgcGFja2V0cyBpbiBIREQgLSBzZXQgYmFjayB0aGUgcGVuZGluZyBwYWNrZXRzIGFuZCAKICAgdGhlIG5vIG1vcmUgZGF0YSBhc3N1bXB0aW9uKi8KICB2b3NfYXRvbWljX3NldF9VOCggJnBDbGllbnRTVEEtPnVjUGt0UGVuZGluZywgMSk7CiAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMDsKICBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbdWNBQ10gPSAxOwoKI2lmZGVmIFdMQU5fUEVSRiAKICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfQkFMLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KTApOwoKI2VuZGlmIC8qV0xBTl9QRVJGKi8KCgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElmIHRoZSBwYWNrZXQgaXMgbmVpdGhlciBhbiBFYXBvbCBwYWNrZXQgbm9yIGEgV0FJIHBhY2tldCB0aGVuIGRyb3AgaXQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgaWYgKCAwID09IHRsTWV0YUluZm8udWNJc0VhcG9sICYmIDAgPT0gdGxNZXRhSW5mby51Y0lzV2FpICkKICAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgIldMQU4gVEw6T25seSBFQVBPTCBvciBXQUkgcGFja2V0cyBhbGxvd2VkIGJlZm9yZSBhdXRoZW50aWNhdGlvbiIpKTsKCiAgICAgLyogRmFpbCB0eCBmb3IgcGFja2V0ICovCiAgICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19TVEFUVVNfRV9CQURNU0cpOwogICAgIHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogIH0KI2Vsc2UKICAgaWYgKCAwID09IHRsTWV0YUluZm8udWNJc0VhcG9sICkKICB7CiAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICJXTEFOIFRMOlJlY2VpdmVkIG5vbiBFQVBPTCBwYWNrZXQgYmVmb3JlIGF1dGhlbnRpY2F0aW9uIikpOwoKICAgIC8qIEZhaWwgdHggZm9yIHBhY2tldCAqLwogICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19TVEFUVVNfRV9CQURNU0cpOwogICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogIH0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBDaGVjayBUSUQKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1RpZCAgICAgPSB0bE1ldGFJbmZvLnVjVElEOwoKICAvKk1ha2Ugc3VyZSBUSUQgaXMgdmFsaWQqLwogIGlmICggV0xBTlRMX1RJRF9JTlZBTElEKHVjVGlkKSkgCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVElEIHNlbnQgaW4gbWV0YSBpbmZvICVkIC0gZGVmYXVsdGluZyB0byAwIChCRSkiLCAKICAgICAgICAgICAgIHVjVGlkKSk7CiAgICAgdWNUaWQgPSAwOyAKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpBdHRhY2hpbmcgQkQgaGVhZGVyIHRvIHBrdCBvbiBXTEFOVExfU1RBVHhDb25uIikpOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEgaWYgRnJhbWUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCBvciBpZiAKICAgIGZyYW1lIGlzIGEgV0FJIGZyYW1lLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggKCAxID09IHRsTWV0YUluZm8udWNJc1dhaSApIHx8CiAgICAgICAoIDAgPT0gdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgKSApCiNlbHNlCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEgaWYgRnJhbWUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoICggMCA9PSB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCApICYmCiAgICAgICggMCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24pICkKI2VuZGlmIC8vI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgewogICAgdm9zU3RhdHVzID0gIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGxNZXRhSW5mbywgJnVjV0RTRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRyYUhlYWRTcGFjZSk7CiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpFcnJvciB3aGVuIHRyYW5zbGF0aW5nIGhlYWRlciBXTEFOVExfU1RBVHhDb25uIikpOwoKICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KCiAgICB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCA9IDE7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENhbGwgSEFMIHRvIGZpbGwgQkQgaGVhZGVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHVjVHlwZVN1YnR5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1RZUEUgPDwgNCk7CgogIGlmICggcENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkICkKICB7CiAgICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSk7CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgLyogVEwgU3RhdGUgZG9lcyBub3QgdHJhbnNpdGlvbiB0byBBVVRIRU5USUNBVEVEIHRpbGwgR1RLIGlzIGluc3RhbGxlZCwgU28gaW4KICAgKiBjYXNlIG9mIFdQQSB3aGVyZSBHVEsgaGFuZHNoYWtlIGlzIGRvbmUgYWZ0ZXIgdGhlIDQgd2F5IGhhbmRzaGFrZSwgdGhlCiAgICogdW5pY2FzdCAyLzIgRUFQT0wgcGFja2V0IGZyb20gdGhlIFNUQS0+QVAgaGFzIHRvIGJlIGVuY3J5cHRlZCBldmVuIGJlZm9yZQogICAqIHRoZSBUTCBpcyBpbiBhdXRoZW50aWNhdGVkIHN0YXRlLiBTaW5jZSB0aGUgUFRLIGhhcyBiZWVuIGluc3RhbGxlZAogICAqIGFscmVhZHkgKGFmdGVyIHRoZSA0IHdheSBoYW5kc2hha2UpIHdlIG1ha2Ugc3VyZSB0aGF0IGFsbCB0cmFmZmljCiAgICogaXMgZW5jcnlwdGVkIGhlbmNlZm9ydGguKE5vdGU6IFRMIGlzIHN0aWxsIG5vdCBpbiBBVVRIRU5USUNBVEVEIHN0YXRlIHNvCiAgICogd2Ugd2lsbCBvbmx5IGFsbG93IEVBUE9MIGRhdGEgb3IgV0FJIGluIGNhc2Ugb2YgV0FQSSkKICAgKi8KICBpZiAodGxNZXRhSW5mby51Y0lzRWFwb2wgJiYgcENsaWVudFNUQS0+cHRrSW5zdGFsbGVkKQogIHsKICAgIHR4RmxhZyA9IDA7CiAgfQojZWxzZQogIGlmIChwQ2xpZW50U1RBLT5wdGtJbnN0YWxsZWQpCiAgewogICAgdHhGbGFnID0gMDsKICB9CiNlbmRpZgoKICB2b3NTdGF0dXMgPSAoVk9TX1NUQVRVUylXREFfRFNfQnVpbGRUeFBhY2tldEluZm8oIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiAsICZ2RGVzdE1hY0FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwsICZ1c1BrdExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQsIHVjV0RTRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1R5cGVTdWJ0eXBlLCAmcENsaWVudFNUQS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVjVGlkLCB0eEZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51c1RpbWVTdGFtcCwgdGxNZXRhSW5mby51Y0lzRWFwb2wgfHwgdGxNZXRhSW5mby51Y0lzV2FpLCB0bE1ldGFJbmZvLnVjVVAgKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmlsbCBCRCAlZCIsIHZvc1N0YXR1cykpOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVXBkYXRlIHR4IGNvdW50ZXIgZm9yIEJBIHNlc3Npb24gcXVlcnkgZm9yIHR4IHNpZGUKICAgICExIC0gc2hvdWxkIHRoaXMgYmUgZG9uZSBmb3IgRUFQT0wgZnJhbWVzPwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPmF1VHhDb3VudFt1Y1RpZF0rKzsKCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAodl9QVk9JRF90KXBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCApOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSBkYXRhIHRvIGlucHV0IHBvaW50ZXIgZm9yIFRMIGNvcmUKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICpwdm9zRGF0YUJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAvKnNlY3VyaXR5IGZyYW1lcyBjYW5ub3QgYmUgZGVsYXllZCovCiAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IFRSVUU7CgogIC8qIFRYIFN0YXRpc3RpY3MgKi8KICBpZiAoISh0bE1ldGFJbmZvLnVjQmNhc3QgfHwgdGxNZXRhSW5mby51Y01jYXN0KSkKICB7CiAgICAvKiBUaGlzIGlzIFRYIFVDIGZyYW1lICovCiAgICBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy50eFVDRmNudCsrOwogICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0JjbnQgKz0gdXNQa3RMZW47CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVR4Q29ubiAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhBdXRoCgogIERFU0NSSVBUSU9OCiAgICBUcmFuc21pdCBpbiBhdXRoZW50aWNhdGVkIHN0YXRlIC0gYWxsIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgIE90aGVyIHJldHVybiB2YWx1ZXMgYXJlIHBvc3NpYmxlIGNvbWluZyBmcm9tIHRoZSBjYWxsZWQgZnVuY3Rpb25zLgogICBQbGVhc2UgY2hlY2sgQVBJIGZvciBhZGRpdGlvbmFsIGluZm8uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVR4QXV0aAooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYsCiAgdl9CT09MX3QgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogICB2X1UxNl90ICAgICAgICAgICAgICAgdXNQa3RMZW47CiAgIFZPU19TVEFUVVMgICAgICAgICAgICB2b3NTdGF0dXM7CiAgIHZfTUFDQUREUl90ICAgICAgICAgICB2RGVzdE1hY0FkZHI7CiAgIHZvc19wa3RfdCogICAgICAgICAgICB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgICBwVExDYiAgICAgICA9IE5VTEw7CiAgIFdMQU5UTF9NZXRhSW5mb1R5cGUgICB0bE1ldGFJbmZvOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSA9IDA7CiAgIFdMQU5UTF9BQ0VudW1UeXBlICAgICB1Y0FDOwogICBXTEFOVExfQUNFbnVtVHlwZSAgICAgdWNOZXh0QUM7CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1RpZDsKICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU3dGcm1YdGwgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICAgZXh0cmFIZWFkU3BhY2UgPSAwOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSAqcFN0YUNsaWVudCA9IE5VTEw7CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1dEU0VuYWJsZWQgPSAwOwogICB2X1UzMl90ICAgICAgICAgICAgICAgdWNUeEZsYWcgICA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y0FDTWFzaywgaTsgCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHB2b3NEYXRhQnVmZiApKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9TVEFUeEF1dGggVEwgJXAgREIgJXAiLAogICAgICAgICAgICAgcFRMQ2IsIHB2b3NEYXRhQnVmZikpOwogICAgaWYgKE5VTEwgIT0gcHZvc0RhdGFCdWZmKQogICAgewogICAgICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgfQogICAgaWYoTlVMTCAhPSBwVExDYikKICAgIHsKICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgICAgICB9CiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjTm9Nb3JlRGF0YSA9IDE7CiAgICB9CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwU3RhQ2xpZW50ID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwU3RhQ2xpZW50ICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICB2b3NfbWVtX3plcm8oJnRsTWV0YUluZm8sIHNpemVvZih0bE1ldGFJbmZvKSk7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgKCF2b3NfY29uY3VycmVudF9vcGVuX3Nlc3Npb25zX3J1bm5pbmcoKSkgJiYKICAgICAgIXBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiAgewojZWxzZQogIGlmICgoV0xBTl9TVEFfU09GVEFQICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAoIXZvc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSkKICB7CiNlbmRpZgogIHVjQUMgPSBwU3RhQ2xpZW50LT51Y0N1cnJlbnRBQzsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIERpc2FibGUgQUMgdGVtcG9yYXJ5IC0gaWYgc3VjY2Vzc2Z1bGwgcmV0cmlldmUgcmUtZW5hYmxlCiAgICAgIFRoZSBvcmRlciBpcyBqdXN0aWZpZWQgYmVjYXVzZSBvZiB0aGUgcG9zc2libGUgc2NlbmFyaW8KICAgICAgIC0gVEwgdHJ5ZXMgdG8gZmV0Y2ggcGFja2V0IGZvciBBQyBhbmQgaXQgcmV0dXJucyBOVUxMCiAgICAgICAtIFRMIGFuYWx5emVzIHRoZSBkYXRhIGl0IGhhcyByZWNlaXZlZCB0byBzZWUgaWYgdGhlcmUgYXJlCiAgICAgICBhbnkgbW9yZSBwa3RzIGF2YWlsYWJsZSBmb3IgQUMgLT4gaWYgbm90IFRMIHdpbGwgZGlzYWJsZSBBQwogICAgICAgLSBob3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2hpbGUgYW5hbHl6aW5nIHJlc3VsdHMgVEwgZ290CiAgICAgICBwcmVlbXB0ZWQgYnkgYSBwZW5kaW5nIGluZGljYXRpb24gd2hlcmUgdGhlIG1hc2sgd2FzIGFnYWluIHNldAogICAgICAgVEwgd2lsbCBub3QgY2hlY2sgYWdhaW4gYW5kIGFzIGEgcmVzdWx0IHdoZW4gaXQgcmVzdW1lcwogICAgICAgZXhlY3V0aW9uIGl0IHdpbGwgZGlzYWJsZSBBQwogICAgICAgVG8gcHJldmVudCB0aGlzIHRoZSBBQyB3aWxsIGJlIGRpc2FibGVkIGhlcmUgYW5kIGlmIHJldHJpZXZlCiAgICAgICBpcyBzdWNjZXNzZnVsbCBpdCB3aWxsIGJlIHJlLWVuYWJsZWQKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbcFN0YUNsaWVudC0+dWNDdXJyZW50QUNdID0gMDsgCgogIC8vIGRvbid0IHJlc2V0IGl0LCBhcyBvdGhlciBBQyBxdWV1ZXMgaW4gSEREIG1heSBoYXZlIHBhY2tldHMKICAvL3Zvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKICB9CiAgZWxzZQogIHsKICAgIC8vc29mdGFwIGNhc2UKICAgIHVjQUMgPSBwVExDYi0+dUN1clNlcnZlZEFDOwogICAgcFN0YUNsaWVudC0+YXVjQUNNYXNrW3VjQUNdID0gMDsgCgogICAgLy92b3NfYXRvbWljX3NldF9VOCggJnBTdGFDbGllbnQtPnVjUGt0UGVuZGluZywgMCk7CiAgfQoKICBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyggcFN0YUNsaWVudCwgdWNBQ01hc2ssIGkpOyAKICAgIC8qWW91IG1ha2UgYW4gaW5pdGlhbCBhc3N1bXB0aW9uIHRoYXQgSEREIGhhcyBubyBtb3JlIGRhdGEgYW5kIGlmIHRoZSAKICAgICAgYXNzdW1wdGlvbiB3YXMgd3JvbmcgeW91IHJlc2V0IHRoZSBmbGFncyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZQogICAgIFRoaXMgd2lsbCBwcmV2ZW50IGZyb20gZXhwb3NpbmcgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGNoZWNraW5nIHdpdGggSEREIAogICAgIGZvciBwYWNrZXRzIGFuZCBzZXR0aW5nIHRoZSBmbGFncyB0byBmYWxzZSovCiAgaWYgKCAwID09IHVjQUNNYXNrICkKICB7CiAgICB2b3NfYXRvbWljX3NldF9VOCggJnBTdGFDbGllbnQtPnVjUGt0UGVuZGluZywgMCk7CiAgICBwU3RhQ2xpZW50LT51Y05vTW9yZURhdGEgPSAxOwogIH0KCiAgdm9zU3RhdHVzID0gcFN0YUNsaWVudC0+cGZuU1RBRmV0Y2hQa3QoIHB2b3NHQ3R4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNBQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b3NEYXRhQnVmZiwgJnRsTWV0YUluZm8gKTsKCgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSB8fCAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKSkKICB7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmV0Y2ggcGt0IGZyb20gSEREICVkIiwKICAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgUmVzZXQgQUMgZm9yIHRoZSBzZXJ2aWNlZCBzdGF0aW9uIHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IEFDCiAgICAgIC0+IGR1ZSB0byBubyBtb3JlIGRhdGEgYXQgdGhlIHN0YXRpb24KICAgICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgICBtYWRlIGluIHRoZSBtYWluIFRMIGxvb3AKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IFdMQU5UTF9BQ19WTzsKICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IDA7CgogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIFdMQU5UTF9TdGF0SGFuZGxlVFhGcmFtZShwdm9zR0N0eCwgdWNTVEFJZCwgdm9zRGF0YUJ1ZmYsIE5VTEwsICZ0bE1ldGFJbmZvKTsKCiAgLypUaGVyZSBhcmUgc3RpbGwgcGFja2V0cyBpbiBIREQgLSBzZXQgYmFjayB0aGUgcGVuZGluZyBwYWNrZXRzIGFuZCAKICAgdGhlIG5vIG1vcmUgZGF0YSBhc3N1bXB0aW9uKi8KICB2b3NfYXRvbWljX3NldF9VOCggJnBTdGFDbGllbnQtPnVjUGt0UGVuZGluZywgMSk7CiAgcFN0YUNsaWVudC0+dWNOb01vcmVEYXRhID0gMDsKCiAgaWYgKFdMQU5fU1RBX1NPRlRBUCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSkKICB7CiAgLy8gZG9uJ3QgbmVlZCB0byBzZXQgaXQsIGFzIHdlIGRvbid0IHJlc2V0IGl0IGluIHRoaXMgZnVuY3Rpb24uCiAgLy92b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjUGt0UGVuZGluZywgMSk7CiAgfQoKI2lmZGVmIFdMQU5fUEVSRiAKICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCiAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkwKTsKI2VuZGlmIC8qV0xBTl9QRVJGKi8KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgVElECiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICB1Y1RpZCAgICAgPSB0bE1ldGFJbmZvLnVjVElEOwoKICAvKk1ha2Ugc3VyZSBUSUQgaXMgdmFsaWQqLwogIGlmICggV0xBTlRMX1RJRF9JTlZBTElEKHVjVGlkKSkgCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVElEIHNlbnQgaW4gbWV0YSBpbmZvICVkIC0gZGVmYXVsdGluZyB0byAwIChCRSkiLCAKICAgICAgICAgICAgIHVjVGlkKSk7CiAgICAgdWNUaWQgPSAwOyAKICB9CgogIC8qU2F2ZSBmb3IgVUFQU0QgdGltZXIgY29uc2lkZXJhdGlvbiovCiAgcFN0YUNsaWVudC0+dWNTZXJ2aWNlZEFDID0gdWNBQzsgCgogIGlmICggdWNBQyA9PSBwU3RhQ2xpZW50LT51Y0N1cnJlbnRBQyApIAogIHsKICAgIHBTdGFDbGllbnQtPmF1Y0FDTWFza1twU3RhQ2xpZW50LT51Y0N1cnJlbnRBQ10gPSAxOwogICAgcFN0YUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0LS07CiAgfQogIGVsc2UKICB7CiAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRBQyAgICAgPSB1Y0FDOwogICAgcFN0YUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0ID0gcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y0FDXSAtIDE7CgogICAgcFN0YUNsaWVudC0+YXVjQUNNYXNrW3BTdGFDbGllbnQtPnVjQ3VycmVudEFDXSA9IDE7CgogIH0KCiAgaWYgKFdMQU5fU1RBX1NPRlRBUCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSkKICB7CiAgaWYgKCAwID09IHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCApIAogIHsKICAgIFdMQU5UTF9BQ0VudW1UeXBlIHRlbXBBQyA9IHVjQUM7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICBDaG9vc2UgbmV4dCBBQyAtICEhISBvcHRpbWl6ZSBtZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgd2hpbGUgKCAwICE9IHVjQUNNYXNrICkgCiAgICB7CiAgICAgIHVjTmV4dEFDID0gKFdMQU5UTF9BQ0VudW1UeXBlKSgoIHRlbXBBQyAtIDEgKSAmIFdMQU5UTF9NQVNLX0FDKTsgCiAgICAgIGlmICggMCAhPSBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbdWNOZXh0QUNdICkKICAgICAgewogICAgICAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRBQyAgICAgPSB1Y05leHRBQzsKICAgICAgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0ID0gcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y05leHRBQ107CgogICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBDaGFuZ2luZyBzZXJ2aWNlZCBBQyB0bzogJWQgd2l0aCBXZWlnaHQ6ICVkIiwKICAgICAgICAgICAgICAgICAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRBQyAsIAogICAgICAgICAgICAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCkpOwogICAgICAgICBicmVhazsKICAgICAgfQogICAgICB0ZW1wQUMgPSB1Y05leHRBQzsKICAgIH0KICB9CiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6QXR0YWNoaW5nIEJEIGhlYWRlciB0byBwa3Qgb24gV0xBTlRMX1NUQVR4QXV0aCIpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgPT0gdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgKQogIHsKICAgICAvKiBOZWVkcyBmcmFtZSB0cmFuc2xhdGlvbiAqLwogICAgIC8vIGlmIHRoZSBjbGllbnQgaGFzIG5vdCBlbmFibGVkIFNXLW9ubHkgZnJhbWUgdHJhbnNsYXRpb24KICAgICAvLyBhbmQgaWYgdGhlIGZyYW1lIGlzIGEgdW5pY2FzdCBmcmFtZQogICAgIC8vICAgKEhXIGZyYW1lIHRyYW5zbGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgYnJvYWRjYXN0IGRvbWFpbnMKICAgICAvLyAgICBzbyB3ZSB1c2UgU1cgZnJhbWUgdHJhbnNsYXRpb24gZm9yIGJyb2FkY2FzdC9tdWx0aWNhc3QgZnJhbWVzKQojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgICAvLyBhbmQgaWYgdGhlIGZyYW1lIGlzIG5vdCBhIFdBUEkgZnJhbWUKI2VuZGlmCiAgICAgLy8gdGhlbiB1c2UgSFdfYmFzZWQgZnJhbWUgdHJhbnNsYXRpb24KCiAgICAgaWYgKCAoIDAgPT0gcFN0YUNsaWVudC0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uICkgJiYKICAgICAgICAgICggMCA9PSB0bE1ldGFJbmZvLnVjQmNhc3QgKSAmJgogICAgICAgICAgKCAwID09IHRsTWV0YUluZm8udWNNY2FzdCApCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogICAgICAgICAgJiYgKCB0bE1ldGFJbmZvLnVjSXNXYWkgIT0gMSApCiNlbmRpZgogICAgICAgICkKICAgICB7CiNpZmRlZiBXTEFOX1BFUkYgCiAgICAgICAgdl9VMzJfdCB1RmFzdEZ3ZE9LID0gMDsKCiAgICAgICAgLyogSFcgYmFzZWQgdHJhbnNsYXRpb24uIFNlZSBpZiB0aGUgZnJhbWUgY291bGQgYmUgZmFzdCBmb3J3YXJkZWQgKi8KICAgICAgICBXREFfVExJX0Zhc3RId0Z3ZERhdGFGcmFtZSggcHZvc0dDdHgsIHZvc0RhdGFCdWZmICwgJnZvc1N0YXR1cywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVGYXN0RndkT0ssICZ0bE1ldGFJbmZvLCAmcFN0YUNsaWVudC0+d1NUQURlc2MpOwoKICAgICAgICBpZiggVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cyApCiAgICAgICAgewogICAgICAgICAgICBpZih1RmFzdEZ3ZE9LKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBQYWNrZXQgY291bGQgYmUgZmFzdCBmb3J3YXJkZWQgbm93ICovCiAgICAgICAgICAgICAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwU3RhQ2xpZW50LT5wZm5TVEFUeENvbXAgKTsKCiAgICAgICAgICAgICAgICAqcHZvc0RhdGFCdWZmID0gdm9zRGF0YUJ1ZmY7CgogICAgICAgICAgICAgICAgLyogVE9ETzogRG8gd2UgcmVhbGx5IG5lZWQgdG8gdXBkYXRlIFdMQU5UTF9IU0hhbmRsZVRYRnJhbWUoKSAKICAgICAgICAgICAgICAgICAgIHN0YXRzIGZvciBldmVyeSBwa3Q/ICovCiAgICAgICAgICAgICAgICBwU3RhQ2xpZW50LT5hdVR4Q291bnRbdGxNZXRhSW5mby51Y1RJRF0rKzsKICAgICAgICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvKiBjYW4ndCBiZSBmYXN0IGZvcndhcmRlZCwgZmFsbCB0aHJvdWdoIG5vcm1hbCAoc2xvdykgcGF0aC4gKi8KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKCiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmYXN0RndkIEJEICVkIiwgdm9zU3RhdHVzKSk7CiAgICAgICAgICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgICAgIH0KI2VuZGlmIC8qV0xBTl9QRVJGKi8KICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAvKiBTVyBiYXNlZCB0cmFuc2xhdGlvbiAqLwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgICAgICBnVWNJc1dhaSA9IHRsTWV0YUluZm8udWNJc1dhaSwKI2VuZGlmCgogICAgICAgdm9zU3RhdHVzID0gIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGxNZXRhSW5mbywgJnVjV0RTRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRyYUhlYWRTcGFjZSk7CiAgICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkVycm9yIHdoZW4gdHJhbnNsYXRpbmcgaGVhZGVyIFdMQU5UTF9TVEFUeEF1dGgiKSk7CiAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgICAgfQoKICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTCBzb2Z0d2FyZSB0cmFuc2xhdGlvbiBzdWNjZXNzIikpOwogICAgICAgdWNTd0ZybVh0bCA9IDE7CiAgICAgICB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCA9IDE7CiAgICB9CiAgfQojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICAgIC8qSW4gY2FzZSBvZiBURExTLCBpZiB0aGUgcGFja2V0IGlzIGRlc3RpbmVkIHRvIFRETFMgU1RBIHVjU1RBSWQgbWF5CiAgICAgIGNoYW5nZS4gc28gdXBkYXRlIHRoZSBwU3RhQ2xpZW50IGFjY29yZGluZ2x5ICovCiAgICBwU3RhQ2xpZW50ID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogICAgaWYgKCBOVUxMID09IHBTdGFDbGllbnQgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAicFN0YUNsaWVudCBpcyBOVUxMICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CiNlbmRpZgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2FsbCBIQUwgdG8gZmlsbCBCRCBoZWFkZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNUeXBlU3VidHlwZSB8PSAoV0xBTlRMXzgwMjExX0RBVEFfVFlQRSA8PCA0KTsKCiAgaWYgKCBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQgKSAKICB7CiAgICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSk7CiAgfQoKICB1Y1R4RmxhZyAgPSAoMCAhPSBwU3RhQ2xpZW50LT53VUFQU0RJbmZvW3VjQUNdLnVjU2V0KT8KICAgICAgICAgICAgICBIQUxfVFJJR0dFUl9FTkFCTEVEX0FDX01BU0s6MDsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIGlmICggcFN0YUNsaWVudC0+d1NUQURlc2MudWNJc1dhcGlTdGEgPT0gMSApCiAgewojaWZkZWYgTElCUkFfV0FQSV9TVVBQT1JUCiAgICB1Y1R4RmxhZyA9IHVjVHhGbGFnIHwgSEFMX1dBUElfU1RBX01BU0s7CiNlbmRpZiAvL0xJQlJBX1dBUElfU1VQUE9SVAogICAgaWYgKCB0bE1ldGFJbmZvLnVjSXNXYWkgPT0gMSApIAogICAgewogICAgICB1Y1R4RmxhZyA9IHVjVHhGbGFnIHwgSEFMX1RYX05PX0VOQ1JZUFRJT05fTUFTSzsKICAgIH0KICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoIHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlID09IFdMQU5fU1RBX1RETFMgKQogIHsKICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfVERMU19QRUVSX1NUQV9NQVNLOwogIH0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9URExTICovCiAgaWYoIHRsTWV0YUluZm8udWNJc0FycCApCiAgewogICAgLypTZW5kIEFSUCBhdCBsb3dlc3QgUGh5IHJhdGUgYW5kIHRocm91Z2ggV1E1ICovCiAgICB1Y1R4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEVfTUFTSzsKICB9CgogIHZvc1N0YXR1cyA9IChWT1NfU1RBVFVTKVdEQV9EU19CdWlsZFR4UGFja2V0SW5mbyggcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICB2b3NEYXRhQnVmZiAsICZ2RGVzdE1hY0FkZHIsCiAgICAgICAgICAgICAgICAgICAgIHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsLCAmdXNQa3RMZW4sCiAgICAgICAgICAgICAgICAgICAgIHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCwgdWNXRFNFbmFibGVkLCAKICAgICAgICAgICAgICAgICAgICAgZXh0cmFIZWFkU3BhY2UsCiAgICAgICAgICAgICAgICAgICAgIHVjVHlwZVN1YnR5cGUsICZwU3RhQ2xpZW50LT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgIHVjVGlkLCB1Y1R4RmxhZywgdGxNZXRhSW5mby51c1RpbWVTdGFtcCwgCiAgICAgICAgICAgICAgICAgICAgIHRsTWV0YUluZm8udWNJc0VhcG9sLCB0bE1ldGFJbmZvLnVjVVAgKTsKCiAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJGaWxsIFRYIEJEIEVycm9yIHN0YXR1cyAlZCIsIHZvc1N0YXR1cykpOwoKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICAvKiBUWCBTdGF0aXN0aWNzICovCiAgaWYgKCEodGxNZXRhSW5mby51Y0JjYXN0IHx8IHRsTWV0YUluZm8udWNNY2FzdCkpCiAgewogICAgLyogVGhpcyBpcyBUWCBVQyBmcmFtZSAqLwogICAgcFN0YUNsaWVudC0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0ZjbnQrKzsKICAgIHBTdGFDbGllbnQtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNCY250ICs9IHVzUGt0TGVuOwogIH0KCiNpZm5kZWYgRkVBVFVSRV9XTEFOX1RETFMKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBVcGRhdGUgdHggY291bnRlciBmb3IgQkEgc2Vzc2lvbiBxdWVyeSBmb3IgdHggc2lkZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBTdGFDbGllbnQtPmF1VHhDb3VudFt1Y1RpZF0rKzsKI2Vsc2UKICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+YXVUeENvdW50W3VjVGlkXSsrOwojZW5kaWYKCiAgLyogVGhpcyBjb2RlIGlzIHRvIHNlbmQgdHJhZmZpYyB3aXRoIGxvd2VyIHByaW9yaXR5IEFDIHdoZW4gd2UgZG9lcyBub3QgCiAgICAgZ2V0IGFkbWl0dGVkIHRvIHNlbmQgaXQuIFRvZGF5IEhBTCBkb2VzIG5vdCBkb3duZ3JhZGUgQUMgc28gdGhpcyBjb2RlIAogICAgIGRvZXMgbm90IGdldCBleGVjdXRlZC4oSW4gb3RoZXIgd29yZHMsIEhBTCBkb2VzbpJ0IGNoYW5nZSB0aWQuIFRoZSBpZiAKICAgICBzdGF0ZW1lbnQgaXMgYWx3YXlzIGZhbHNlLikKICAgICBOT1RFOiBJbiB0aGUgY2FzZSBvZiBMQSBkb3duZ3JhZGUgb2NjdXJzIGluIEhERCAodGhhdCB3YXMgdGhlIGNoYW5nZSAKICAgICBQaGFuaSBtYWRlIGR1cmluZyBXTU0tQUMgcGx1Z2Zlc3QpLiBJZiBXTSAmIEJNUCBhbHNvIHRvb2sgdGhpcyBhcHByb2FjaCwgCiAgICAgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIG5lZWQgZm9yIGFueSBBQyBkb3duZ3JhZGUgbG9naWMgaW4gVEwvV0RJLiAgICovCiNpZiAwCiAgaWYgKCggdWNUaWQgIT0gdGxNZXRhSW5mby51Y1RJRCApICYmCiAgICAgICggMCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQgKSAmJiAKICAgICAgKCAwICE9IHVjU3dGcm1YdGwgKSkKICB7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAhISBGSVggbWU6IE9uY2UgZG93bmdyYWRpbmcgaXMgY2xlYXIgcHV0IGluIHRoZSBwcm9wZXIgY2hhbmdlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdWNRQ09mZnNldCA9IFdMQU5IQUxfVFhfQkRfSEVBREVSX1NJWkUgKyBXTEFOVExfODAyXzExX0hFQURFUl9MRU47CgogICAgLy8hISFGaXggdGhpcyByZXBsYWNlIHBlZWsgd2l0aCBleHRyYWN0IAogICAgdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0RhdGFCdWZmLCB1Y1FDT2Zmc2V0LCh2X1BWT0lEX3QpJnB1Y1Fvc0N0cmwsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwdWNRb3NDdHJsKSk7CiAgICAqcHVjUW9zQ3RybCA9IHVjVGlkOyAvLz8gcHJvcGVyIGJ5dGUgb3JkZXIKICB9CiNlbmRpZgoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmlsbCBCRCAlZCIsIHZvc1N0YXR1cykpOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwU3RhQ2xpZW50LT5wZm5TVEFUeENvbXAgKTsKCiAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOwoKICAvKkJFICYgQksgY2FuIGJlIGRlbGF5ZWQsIFZPIGFuZCBWSSBub3QgZnJhbWVzIGNhbm5vdCBiZSBkZWxheWVkKi8KICBpZiAoIHBTdGFDbGllbnQtPnVjU2VydmljZWRBQyA+IFdMQU5UTF9BQ19CRSApIAogIHsKICAgIHBUTENiLT5iVXJnZW50PSBUUlVFOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFUeEF1dGggKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhEaXNjCgogIERFU0NSSVBUSU9OCiAgICBUcmFuc21pdCBpbiBkaXNjb25uZWN0ZWQgc3RhdGUgLSBubyBkYXRhIGFsbG93ZWQKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB0eCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVR4RGlzYwooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYsCiAgdl9CT09MX3QgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogICBXTEFOVExfQ2JUeXBlKiAgICAgICAgcFRMQ2IgICAgICAgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU1RBVHhBdXRoIikpOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVycm9yCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICJXTEFOIFRMOlBhY2tldCBzaG91bGQgbm90IGJlIHRyYW5zbWl0dGVkIGluIHN0YXRlIGRpc2Nvbm5lY3RlZCBpZ25vcmluZyIKICAgICAgICAgICAgIiByZXF1ZXN0IikpOwoKICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMTsKICAgCiAgIC8vU2hvdWxkIG5vdCBiZSBhbnl0aGluZyBwZW5kaW5nIGluIGRpc2Nvbm5lY3Qgc3RhdGUKICAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDApOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVR4RGlzYyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeENvbm4KCiAgREVTQ1JJUFRJT04KICAgIFJlY2VpdmUgaW4gY29ubmVjdGVkIHN0YXRlIC0gb25seSBFQVBPTAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4L3J4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUnhDb25uCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgICAgICBwVExDYiA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICBwQ2xpZW50U1RBID0gTlVMTDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gMDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzUGt0TGVuOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVMZW47CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNBY3R1YWxITGVuID0gMDsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgIHZvc1N0YXR1cyAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZjsKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgIGF1Y0JESGVhZGVyOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNUaWQ7CiAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSAgICB3UnhNZXRhSW5mbzsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfU1RBUnhDb25uIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwLypTd2FwIEJEKi8gKTsKCiAgaWYgKCBOVUxMID09IGF1Y0JESGVhZGVyICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgIFZPU19BU1NFUlQoIDAgKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKCiAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQoYXVjQkRIZWFkZXIpOwogIHVzTVBEVURPZmZzZXQgPSAodl9VMTZfdClXREFfR0VUX1JYX01QRFVfREFUQV9PRkZTRVQoYXVjQkRIZWFkZXIpOwogIHVzTVBEVUxlbiAgICAgPSAodl9VMTZfdClXREFfR0VUX1JYX01QRFVfTEVOKGF1Y0JESGVhZGVyKTsKICB1Y01QRFVITGVuICAgID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX0xFTihhdWNCREhlYWRlcik7CiAgdWNUaWQgICAgICAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoYXVjQkRIZWFkZXIpOwoKICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgJnVzUGt0TGVuKTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBwcm9jZXNzaW5nIGRhdGE6IEhPICVkIERPICVkIExlbiAlZCBITGVuICVkIiwKICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQsIHVzTVBEVURPZmZzZXQsIHVzTVBEVUxlbiwgdWNNUERVSExlbikpOwoKICAgIC8qSXQgd2lsbCBjdXQgb3V0IHRoZSA4MDIuMTEgaGVhZGVyIGlmIG5vdCB1c2VkKi8KICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfVHJpbVJ4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYgKSApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRFdGhlclR5cGUoYXVjQkRIZWFkZXIsdm9zRGF0YUJ1ZmYsdWNNUERVSExlbiwmdXNFdGhlclR5cGUpOwogIAogIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCiAgewojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgIC8qIElmIGZyYW1lIGlzIG5laXRoZXIgYW4gRUFQT0wgZnJhbWUgbm9yIGEgV0FJIGZyYW1lIHRoZW4gd2UgZHJvcCB0aGUgZnJhbWUqLwogICAgLyogVE9ETzogRG8gd2UgbmVlZCBhIGNoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gV0FQSSBtb2RlPyBJZiBub3QgaXMgaXQgcG9zc2libGUgKi8KICAgIC8qIHRoYXQgd2UgZ2V0IGFuIEVBUE9MIHBhY2tldCBpbiBXQVBJIG1vZGUgb3IgdmljZSB2ZXJzYT8gKi8KICAgIGlmICggV0xBTlRMX0xMQ184MDIxWF9UWVBFICAhPSB1c0V0aGVyVHlwZSAmJiBXTEFOVExfTExDX1dBSV9UWVBFICAhPSB1c0V0aGVyVHlwZSApCiAgICB7CiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6UlggRnJhbWUgbm90IEVBUE9MIG9yIFdBSSBFdGhlclR5cGUgJWQgLSBkcm9wcGluZyIsIHVzRXRoZXJUeXBlICk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICB9CiNlbHNlCiAgICBpZiAoIFdMQU5UTF9MTENfODAyMVhfVFlQRSAgIT0gdXNFdGhlclR5cGUgKQogICAgewogICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSWCBGcmFtZSBub3QgRUFQT0wgRXRoZXJUeXBlICVkIC0gZHJvcHBpbmciLCB1c0V0aGVyVHlwZSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwogICAgZWxzZSAvKiBGcmFtZSBpcyBhbiBFQVBPTCBmcmFtZSBvciBhIFdBSSBmcmFtZSovICAKICAgIHsKICAgICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLAogICAgICAgICAgICAgICAgICAgVFJBQ0VfQ09ERV9UTF9SWF9DT05OX0VBUE9MLCB1Y1NUQUlkLCB1c0V0aGVyVHlwZSApKTsKCiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6UlggRnJhbWUgIEVBUE9MIEV0aGVyVHlwZSAlZCAtIHByb2Nlc3NpbmciLCB1c0V0aGVyVHlwZSk7CgogICAgICBpZiAoKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikgKSAmJgogICAgICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uKSkKICAgICAgewogICAgICBpZiAodXNNUERVRE9mZnNldCA+IHVjTVBEVUhPZmZzZXQpCiAgICAgIHsKICAgICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgICAgIH0KCiAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsIHVzQWN0dWFsSExlbiwgCiAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYiwgdWNTVEFJZCwgYkZvcndhcmRJQVBQd2l0aExMQyk7CgogICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIAogICAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gdHJhbnNsYXRlIGZyb20gODAyLjExIHRvIDgwMi4zIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBJbmNyZW1lbnQgcmVjZWl2ZSBjb3VudGVyCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBpZiAoICFXTEFOVExfVElEX0lOVkFMSUQoIHVjVGlkKSApIAogICAgICB7CiAgICAgICAgcENsaWVudFNUQS0+YXVSeENvdW50W3VjVGlkXSsrOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCB0aWQgICVkIChTdGF0aW9uIElEICVkKSBvbiAlcyIsCiAgICAgICAgICAgICAgIHVjVGlkLCB1Y1NUQUlkLCBfX2Z1bmNfXykpOwogICAgICB9CgogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpTZW5kaW5nIEVBUG9MIGZyYW1lIHRvIHN0YXRpb24gJWQgQUMgJWQiLCB1Y1NUQUlkLCB1Y1RpZCkpOwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICEhIUFzc3VtaW5nIFRJRCA9IFVQIG1hcHBpbmcgCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICB3UnhNZXRhSW5mby51Y1VQID0gdWNUaWQ7CgogICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICJXTEFOIFRMICVzOlNlbmRpbmcgZGF0YSBjaGFpbiB0byBzdGF0aW9uIiwgX19mdW5jX18pKTsKICAgICAgaWYgKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogICAgICB7CiAgICAgICAgd1J4TWV0YUluZm8udWNEZXNTVEFJZCA9IFdMQU5fUlhfU0FQX1NFTEZfU1RBX0lEOwogICAgICAgIHBDbGllbnRTVEEtPnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICBwQ2xpZW50U1RBLT5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOwogICAgfS8qRUFQT0wgZnJhbWUgb3IgV0FJIGZyYW1lKi8KICB9Lyp2b3Mgc3RhdHVzIHN1Y2Nlc3MqLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVJ4Q29ubiAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9Gd2RQa3RUb0hERAoKICBERVNDUklQVElPTgogICAgRGV0ZXJtaW5lIHRoZSBEZXN0YXRpb24gU3RhdGlvbiBJRCBhbmQgcm91dGUgdGhlIEZyYW1lIHRvIFVwcGVyIExheWVyCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgcnggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUwpXTEFOVExfRndkUGt0VG9IREQKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICBwdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQKKQp7CiAgIHZfTUFDQUREUl90ICAgICAgICAgICAgICBEZXN0TWFjQWRkcmVzczsKICAgdl9NQUNBRERSX3QgICAgICAgICAgICAgICpwRGVzdE1hY0FkZHJlc3MgPSAmRGVzdE1hY0FkZHJlc3M7CiAgIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c01hY0FkZFNpemUgPSBWT1NfTUFDX0FERFJfU0laRTsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgIHBDbGllbnRTVEEgPSBOVUxMOwogICB2b3NfcGt0X3QqICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYgOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2X1UzMl90KiAgICAgICAgICAgICAgICAgU1RBTWV0YUluZm9QdHI7CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NOZXh0RGF0YUJ1ZmYgOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNEZXNTVEFJZDsKICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlICAgIHdSeE1ldGFJbmZvOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggTlVMTCA9PSBwdm9zRGF0YUJ1ZmYgKSB8fCAoIE5VTEwgPT0gKCB2b3NEYXRhQnVmZiA9IHB2b3NEYXRhQnVmZiApKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfRndkUGt0VG9IZGQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0Z3ZFBrdFRvSGRkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmKFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsInVjU1RBSWQgJWQgaXMgbm90IHZhbGlkIiwKICAgICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogICAvKiBUaGlzIHRoZSBjaGFuZ2UgcmVxdWlyZWQgZm9yIFNvZnRBcCB0byBoYW5kbGUgUmVvcmRlcmVkIEJ1ZmZlci4gU2luY2UgYSBTVEEKICAgICAgbWF5IGhhdmUgcGFja2V0cyBkZXN0aW5lZCB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbnMgd2UgaGF2ZSB0byBwcm9jZXNzIGVhY2ggcGFja2V0CiAgICAgIGF0IGEgdGltZSBhbmQgZGV0ZXJtaW5lIGl0cyBEZXN0aW5hdGlvbi4gU28gdGhlIFZvc2NoYWluIHByb3ZpZGVkIGJ5IFJlb3JkZXIgY29kZQogICAgICBpcyB1bmNoYWluIGFuZCBmb3J3YXJkZWQgdG8gVXBwZXIgTGF5ZXIgYWZ0ZXIgRGV0ZXJtaW5pbmcgdGhlIERlc3RpbmF0aW9uICovCgogICB2b3NEYXRhQnVmZiA9IHB2b3NEYXRhQnVmZjsKICAgd2hpbGUgKHZvc0RhdGFCdWZmICE9IE5VTEwpCiAgIHsKICAgICAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsICZ2b3NOZXh0RGF0YUJ1ZmYsIDEvKnRydWUqLyApOwogICAgICB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QgKikmU1RBTWV0YUluZm9QdHIgKTsKICAgICAgd1J4TWV0YUluZm8udWNVUCA9ICh2X1U4X3QpKCh1aW50cHRyX3QpU1RBTWV0YUluZm9QdHIgJiBXTEFOVExfQUNfTUFTSyk7CiAgICAgIHVjRGVzU1RBSWQgPSAodl9VOF90KSgoKHVpbnRwdHJfdClTVEFNZXRhSW5mb1B0cikgPj4gV0xBTlRMX1NUQUlEX09GRlNFVCk7CiAgICAgICAKICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc0RhdGFCdWZmLCAwLCAodl9WT0lEX3QgKilwRGVzdE1hY0FkZHJlc3MsICZ1c01hY0FkZFNpemUpOwogICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICB7CiAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiByZWN2IGNvcnJ1cHRlZCBkYXRhIHBhY2tldCIpKTsKICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgfQoKICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICAgICAic3RhdGlvbiBtYWMgIk1BQ19BRERSRVNTX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgTUFDX0FERFJfQVJSQVkocERlc3RNYWNBZGRyZXNzLT5ieXRlcykpKTsKCiAgICAgIGlmICh2b3NfaXNfbWFjYWRkcl9icm9hZGNhc3QoIHBEZXN0TWFjQWRkcmVzcyApIHx8IHZvc19pc19tYWNhZGRyX2dyb3VwKHBEZXN0TWFjQWRkcmVzcykpCiAgICAgIHsKICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIGlzIG1jL2JjIHN0YXRpb24KICAgICAgICAgIHVjRGVzU1RBSWQgPSBXTEFOX1JYX0JDTUNfU1RBX0lEOwogICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgIiVzOiBCQy9NQyBwYWNrZXQsIGlkICVkIiwgX19mdW5jX18sIFdMQU5fUlhfQkNNQ19TVEFfSUQpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgaWYgKHZvc19pc19tYWNhZGRyX2VxdWFsKHBEZXN0TWFjQWRkcmVzcywgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcykpCiAgICAgICAgIHsKICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gaXMgQVAgaXRzZWxmCiAgICAgICAgICAgIHVjRGVzU1RBSWQgPSBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRDsKICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgICIlczogcGFja2V0IHRvIEFQIGl0c2VsZiwgaWQgJWQiLCBfX2Z1bmNfXywgV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICgoIFdMQU5fTUFYX1NUQV9DT1VOVCA8PSB1Y0Rlc1NUQUlkICkgfHwgKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNEZXNTVEFJZF0gJiYgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNEZXNTVEFJZF0tPnVjRXhpc3RzID09IDApKQogICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIHN0YXRpb24gaXMgc29tZXRoaW5nIGVsc2UKICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgIiVzOiBnZXQgYW4gc3RhdGlvbiBpbmRleCBsYXJnZXIgdGhhbiBXTEFOX01BWF9TVEFfQ09VTlQgJWQiLCBfX2Z1bmNfXywgdWNEZXNTVEFJZCkpOwogICAgICAgICAgICB1Y0Rlc1NUQUlkID0gV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQ7CiAgICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAvL2xvb3BiYWNrIHVuaWNhc3Qgc3RhdGlvbiBjb21lcyBoZXJlCiAgICAgIH0KCiAgICAgIHdSeE1ldGFJbmZvLnVjVVAgPSAodl9VOF90KSgodWludHB0cl90KVNUQU1ldGFJbmZvUHRyICYgV0xBTlRMX0FDX01BU0spOwogICAgICB3UnhNZXRhSW5mby51Y0Rlc1NUQUlkID0gdWNEZXNTVEFJZDsKICAgICAKICAgICAgdm9zU3RhdHVzID0gcENsaWVudFNUQS0+cGZuU1RBUngoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiwgdWNEZXNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd1J4TWV0YUluZm8gKTsKICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IGZhaWxlZCB0byBzZW5kIHBrdCB0byBIREQiKSk7CiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwoKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgIH0KICAgICAgdm9zRGF0YUJ1ZmYgPSB2b3NOZXh0RGF0YUJ1ZmY7CiAgIH0KICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeEF1dGgKCiAgREVTQ1JJUFRJT04KICAgIFJlY2VpdmUgaW4gYXV0aGVudGljYXRlZCBzdGF0ZSAtIGFsbCBkYXRhIGFsbG93ZWQKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSByeCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVJ4QXV0aAooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYsCiAgdl9CT09MX3QgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogICBXTEFOVExfQ2JUeXBlKiAgICAgICAgICAgcFRMQ2IgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogICAgcENsaWVudFNUQSA9IE5VTEw7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y0FzZjsgLyogQU1TRFUgc3ViIGZyYW1lICovCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVET2Zmc2V0OwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVUxlbjsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW47CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0FjdHVhbEhMZW4gPSAwOyAgIAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNUaWQ7CiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAwOwojZW5kaWYKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzUGt0TGVuOwogICB2b3NfcGt0X3QqICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYgOwogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgYXVjQkRIZWFkZXI7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXM7CiAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSAgICB3UnhNZXRhSW5mbzsKICAgc3RhdGljIHZfVThfdCAgICAgICAgICAgIHVjUE1QRFVITGVuOwogICB2X1UzMl90KiAgICAgICAgICAgICAgICAgU1RBTWV0YUluZm9QdHI7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y0VzZj0wOyAvKiBmaXJzdCBzdWJmcmFtZSBvZiBBTVNEVSBmbGFnICovCiAgIHZfVTY0X3QgICAgICAgICAgICAgICAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlcj0wOyAvKmN1cnJlbnQgcmVwbGF5IGNvdW50ZXIqLwogICB2X1U2NF90ICAgICAgICAgICAgICAgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyPTA7IC8qcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIqLwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdWNVbmljYXN0QnJvYWRjYXN0VHlwZT0wOyAvKkl0IGRlbm90ZXMgd2hldGhlciByZWNlaXZlZCBmcmFtZSBpcyBVQyBvciBCQyovCiAgIHN0cnVjdCBfQkFSRnJtU3RydWN0ICAgICAqcEJhckZyYW1lID0gTlVMTDsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCBOVUxMID09IHB2b3NEYXRhQnVmZiApIHx8ICggTlVMTCA9PSAoIHZvc0RhdGFCdWZmID0gKnB2b3NEYXRhQnVmZiApKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfU1RBUnhBdXRoIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TVEFSeEF1dGgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBCRCBoZWFkZXIgYW5kIGNoZWNrIGlmIHZhbGlkCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHZvc0RhdGFCdWZmLCAodl9QVk9JRF90KSZhdWNCREhlYWRlciwgMCApOwoKICB1Y01QRFVIT2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX09GRlNFVChhdWNCREhlYWRlcik7CiAgdXNNUERVRE9mZnNldCA9ICh2X1UxNl90KVdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChhdWNCREhlYWRlcik7CiAgdXNNUERVTGVuICAgICA9ICh2X1UxNl90KVdEQV9HRVRfUlhfTVBEVV9MRU4oYXVjQkRIZWFkZXIpOwogIHVjTVBEVUhMZW4gICAgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfTEVOKGF1Y0JESGVhZGVyKTsKICB1Y1RpZCAgICAgICAgID0gKHZfVThfdClXREFfR0VUX1JYX1RJRChhdWNCREhlYWRlcik7CgogIC8qIEZpeCBmb3IgYSBoYXJkd2FyZSBidWcuIAogICAqIEgvVyBkb2VzIG5vdCB1cGRhdGUgdGhlIHRpZCBmaWVsZCBpbiBCRCBoZWFkZXIgZm9yIEJBUiBmcmFtZXMuCiAgICogRml4IGlzIHRvIHJlYWQgdGhlIHRpZCBmaWVsZCBmcm9tIE1BQyBoZWFkZXIgb2YgQkFSIGZyYW1lICovCiAgaWYoIChXREFfR0VUX1JYX1RZUEUoYXVjQkRIZWFkZXIpID09IFNJUl9NQUNfQ1RSTF9GUkFNRSkgJiYKICAgICAgKFdEQV9HRVRfUlhfU1VCVFlQRShhdWNCREhlYWRlcikgPT0gU0lSX01BQ19DVFJMX0JBUikpCiAgewogICAgICBwQmFyRnJhbWUgPSAoc3RydWN0IF9CQVJGcm1TdHJ1Y3QgKikoV0RBX0dFVF9SWF9NQUNfSEVBREVSKGF1Y0JESGVhZGVyKSk7CiAgICAgIHVjVGlkID0gcEJhckZyYW1lLT5iYXJDb250cm9sLm51bVRJRDsKICB9CgogIC8qSG9zdCBiYXNlZCByZXBsYXkgY2hlY2sgaXMgbmVlZGVkIGZvciB1bmljYXN0IGRhdGEgZnJhbWVzKi8KICB1Y1VuaWNhc3RCcm9hZGNhc3RUeXBlICA9ICh2X1UxNl90KVdEQV9JU19SWF9CQ0FTVChhdWNCREhlYWRlcik7CiAgaWYoMCAhPSB1Y01QRFVITGVuKQogIHsKICAgIHVjUE1QRFVITGVuID0gdWNNUERVSExlbjsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgcHJvY2Vzc2luZyBkYXRhOiBITyAlZCBETyAlZCBMZW4gJWQgSExlbiAlZCIKICAgICAgICAgICAgICIgVGlkICVkIEJEICVkIiwKICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQsIHVzTVBEVURPZmZzZXQsIHVzTVBEVUxlbiwgdWNNUERVSExlbiwgdWNUaWQsCiAgICAgICAgICAgICBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFKSk7CgogIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgoIHZvc0RhdGFCdWZmLCAmdXNQa3RMZW4pOwoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfVHJpbVJ4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYgKSApCiAgewogICAgaWYoKFdEQV9HRVRfUlhfQVNGKGF1Y0JESGVhZGVyKSAmJiAhV0RBX0dFVF9SWF9FU0YoYXVjQkRIZWFkZXIpKSkKICB7CiAgICAvKiBBTVNEVSBjYXNlLCB1Y01QRFVIT2Zmc2V0ID0gMAogICAgICogaXQgc2hvdWxkIGJlIGhhbmNkbGVkIHNlcGVyYXRseSAqLwogICAgaWYoKCB1c01QRFVET2Zmc2V0ID4gIHVjTVBEVUhPZmZzZXQgKSAmJgogICAgICAgKCB1c01QRFVMZW4gICAgID49IHVjTVBEVUhMZW4gKSAmJiAoIHVzUGt0TGVuID49IHVzTVBEVUxlbiApICYmCiAgICAgICAoICFXTEFOVExfVElEX0lOVkFMSUQodWNUaWQpICkpCiAgICB7CiAgICAgICAgdWNNUERVSE9mZnNldCA9IHVzTVBEVURPZmZzZXQgLSBXTEFOVExfTVBEVV9IRUFERVJfTEVOOyAKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBjb3JydXB0ZWQgLSBkcm9wcGluZyBwYWNrZXQiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBjb3JydXB0ZWQgLSBkcm9wcGluZyBwYWNrZXQiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgfQogIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIGlmICggcENsaWVudFNUQS0+d1NUQURlc2MudWNJc1dhcGlTdGEgKQogIHsKICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRFdGhlclR5cGUoYXVjQkRIZWFkZXIsIHZvc0RhdGFCdWZmLCB1Y01QRFVITGVuLCAmdXNFdGhlclR5cGUpOwogICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKICAgIHsKICAgICAgaWYgKCBXTEFOVExfTExDX1dBSV9UWVBFICA9PSB1c0V0aGVyVHlwZSApCiAgICAgIHsgICAgICAgIAogICAgICAgIGlmICggISggV0xBTkhBTF9SWF9JU19VTlBST1RFQ1RFRF9XUElfRlJBTUUoYXVjQkRIZWFkZXIpKSApCiAgICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpXQUkgZnJhbWUgd2FzIHJlY2VpdmVkIGVuY3J5cHRlZCAtIGRyb3BwaW5nIikpOwogICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgIC8qVGVtcG9yYXJ5IGZpeCBhZGRlZCB0byBmaXggd2FwaSByZWtleSBpc3N1ZSovCiAgICAgICAgICAvL3Zvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgICAvL3JldHVybiB2b3NTdGF0dXM7IC8vcmV0dXJuaW5nIHN1Y2Nlc3MKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgaWYgKCAgV0xBTkhBTF9SWF9JU19VTlBST1RFQ1RFRF9XUElfRlJBTUUoYXVjQkRIZWFkZXIpICkgCiAgICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpOb24tV0FJIGZyYW1lIHdhcyByZWNlaXZlZCB1bmVuY3J5cHRlZCAtIGRyb3BwaW5nIikpOwogICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7IAogICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsgLy9yZXR1cm5pbmcgc3VjY2VzcwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZSAvL2NvdWxkIG5vdCBleHRyYWN0IEV0aGVyVHlwZSAtIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkNvdWxkIG5vdCBleHRyYWN0IEV0aGVyVHlwZSIpKTsKICAgICAgLy9QYWNrZXQgaXMgYWxyZWFkeSBmcmVlZAogICAgICByZXR1cm4gdm9zU3RhdHVzOyAvL3JldHVybmluZyBmYWlsdXJlCiAgICB9CiAgfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJbmNyZW1lbnQgcmVjZWl2ZSBjb3VudGVyCiAgICAhISBub3Qgc3VyZSB0aGlzIGlzIHRoZSBiZXN0IHBsYWNlIHRvIGluY3JlYXNlIHRoaXMgLSBwa3QgbWlnaHQgYmUKICAgIGRyb3BwZWQgYmVsb3cgb3IgZGVsYXllZCBpbiBUTCdzIHF1ZXVlcwogICAgLSB3aWxsIGxlYXZlIGl0IGhlcmUgZm9yIG5vdwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggIVdMQU5UTF9USURfSU5WQUxJRCggdWNUaWQpICkgCiAgewogICAgcENsaWVudFNUQS0+YXVSeENvdW50W3VjVGlkXSsrOwogIH0KICBlbHNlCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgdGlkICAlZCAoU3RhdGlvbiBJRCAlZCkgb24gJXMiLAogICAgICAgICAgIHVjVGlkLCB1Y1NUQUlkLCBfX2Z1bmNfXykpOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIEFNU0RVIGFuZCBzZW5kIGZvciBwcm9jZXNzaW5nIGlmIHNvCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNBc2YgPSAodl9VOF90KVdEQV9HRVRfUlhfQVNGKGF1Y0JESGVhZGVyKTsKCiAgaWYgKCAwICE9IHVjQXNmICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpQYWNrZXQgaXMgQU1TRFUgc3ViIGZyYW1lIC0gc2VuZGluZyBmb3IgY29tcGxldGlvbiIpKTsKICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9BTVNEVVByb2Nlc3MoIHB2b3NHQ3R4LCAmdm9zRGF0YUJ1ZmYsIGF1Y0JESGVhZGVyLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwgdXNNUERVTGVuICk7CiAgICBpZihOVUxMID09IHZvc0RhdGFCdWZmKQogICAgewogICAgICAgLy9QYWNrZXQgaXMgYWxyZWFkeSBmcmVlZAogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIH0KICB9CiAgLyogQWZ0ZXIgQU1TRFUgaGVhZGVyIGhhbmRsZWQKICAgKiBBTVNEVSBmcmFtZSBqdXN0IHNhbWUgd2l0aCBub3JtYWwgZnJhbWVzICovCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgVHJhbnNsYXRpbmcgaGVhZGVyIGlmIG5lY2VzYXJ5CiAgICAgICAhISBGaXggbWU6IHJtdiBjb21tZW50cyBiZWxvdwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggMCA9PSBXREFfR0VUX1JYX0ZUX0RPTkUoYXVjQkRIZWFkZXIpICkgJiYKICAgICAgKCAwICE9IHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbikgJiYKICAgICAgKCBXTEFOVExfSVNfREFUQV9GUkFNRShXREFfR0VUX1JYX1RZUEVfU1VCVFlQRShhdWNCREhlYWRlcikpICkpCiAgewogICAgaWYoMCA9PSB1Y01QRFVITGVuKQogICAgewogICAgICB1Y01QRFVITGVuID0gdWNQTVBEVUhMZW47CiAgICB9CiAgICBpZiAodXNNUERVRE9mZnNldCA+IHVjTVBEVUhPZmZzZXQpCiAgICB7CiAgICAgIHVzQWN0dWFsSExlbiA9IHVzTVBEVURPZmZzZXQgLSB1Y01QRFVIT2Zmc2V0OwogICAgfQogICAgdm9zU3RhdHVzID0gV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyKCB2b3NEYXRhQnVmZiwgJnZvc1N0YXR1cywgdXNBY3R1YWxITGVuLCAKICAgICAgICAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwgcFRMQ2IsIHVjU1RBSWQsIGJGb3J3YXJkSUFQUHdpdGhMTEMpOwoKICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gdHJhbnNsYXRlIGZyb20gODAyLjExIHRvIDgwMi4zIC0gZHJvcHBpbmciKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgIH0KICAgIH0KICAgIC8qIFNvZnRhcCByZXF1aXJlcyBhZGRpdGlvbmFsIEluZm8gc3VjaCBhcyBEZXN0aW5hdGlvbiBTVEFJRCBhbmQgQWNjZXNzCiAgICAgICBDYXRlZ29yeS4gVm9zY2hhaW4gb3IgQnVmZmVyIHJldHVybmVkIGJ5IEJBIHdvdWxkIGJlIHVuY2hhaW4gYW5kIHRoaXMKICAgICAgIE1ldGEgRGF0YSB3b3VsZCBoZWxwIGluIHJvdXRpbmcgdGhlIHBhY2tldHMgdG8gYXBwcm9wcmlhdGUgRGVzdGluYXRpb24gKi8KICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICB7CiAgICAgICBTVEFNZXRhSW5mb1B0ciA9ICh2X1UzMl90ICopKHVpbnRwdHJfdCkodWNUaWQgfCAoV0RBX0dFVF9SWF9BRERSM19JRFgoYXVjQkRIZWFkZXIpIDw8IFdMQU5UTF9TVEFJRF9PRkZTRVQpKTsKICAgICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClTVEFNZXRhSW5mb1B0cik7CiAgICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayB0byBzZWUgaWYgcmUtb3JkZXJpbmcgc2Vzc2lvbiBpcyBpbiBwbGFjZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCAhPSBwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvW3VjVGlkXS51Y0V4aXN0cyApCiAgewogICAgV0xBTlRMX01TRFVSZW9yZGVyKCBwVExDYiwgJnZvc0RhdGFCdWZmLCBhdWNCREhlYWRlciwgdWNTVEFJZCwgdWNUaWQgKTsKICB9CgppZigwID09IHVjVW5pY2FzdEJyb2FkY2FzdFR5cGUKI2lmZGVmIEZFQVRVUkVfT05fQ0hJUF9SRU9SREVSSU5HCiAgICYmIChXTEFOSEFMX0lzT25DaGlwUmVvcmRlcmluZ0VuYWJsZWRGb3JUSUQocHZvc0dDdHgsIHVjU1RBSWQsIHVjVGlkKSAhPSBUUlVFKQojZW5kaWYKKQp7CiAgLyogcmVwbGF5IGNoZWNrIGNvZGUgOiBjaGVjayB3aGV0aGVyIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgb3Igbm90ICovCiAgaWYoVk9TX1RSVUUgPT0gcENsaWVudFNUQS0+dWNJc1JlcGxheUNoZWNrVmFsaWQpCiAgewogICAgICAvKiByZXBsYXkgY2hlY2sgaXMgbmVlZGVkIGZvciB0aGUgc3RhdGlvbiAqLwoKICAgICAgLyogY2hlY2sgd2hldGhlciBmcmFtZSBpcyBBTVNEVSBmcmFtZSAqLwogICAgICBpZiAoIDAgIT0gdWNBc2YgKQogICAgICB7CiAgICAgICAgICAvKiBTaW5jZSB2aXJnbyBjYW4ndCBzZW5kIEFNU0RVIGZyYW1lcyB0aGlzIGxlZyBvZiB0aGUgY29kZSAKICAgICAgICAgICAgIHdhcyBub3QgdGVzdGVkIHByb3Blcmx5LCBpdCBuZWVkcyB0byBiZSB0ZXN0ZWQgcHJvcGVybHkqLwogICAgICAgICAgLyogRnJhbWUgaXMgQU1TRFUgZnJhbWUuIEFzIHBlciA4MDIuMTFuIG9ubHkgZmlyc3QKICAgICAgICAgICAgIHN1YmZyYW1lIHdpbGwgaGF2ZSByZXBsYXkgY291bnRlciAqLwogICAgICAgICAgdWNFc2YgPSAgV0RBX0dFVF9SWF9FU0YoIGF1Y0JESGVhZGVyICk7CiAgICAgICAgICBpZiggMCAhPSB1Y0VzZiApCiAgICAgICAgICB7CiAgICAgICAgICAgICAgdl9CT09MX3Qgc3RhdHVzOwogICAgICAgICAgICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCiAgICAgICAgICAgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSBXREFfRFNfR2V0UmVwbGF5Q291bnRlcihhdWNCREhlYWRlcik7CiAKICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgY3VycmVudFJlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCBwcmV2aW91cyByZXBsYXkgY291bnRlciBmcm9tIFRMIGNvbnRyb2wgIGJsb2NrICovCiAgICAgICAgICAgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyID0gcENsaWVudFNUQS0+dWxsUmVwbGF5Q291bnRlclt1Y1RpZF07CgogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBBTVNEVSBwcmV2aW91c1JlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgIC8qIEl0IGlzIGZpcnN0IHN1YmZyYW1lIG9mIEFNU0RVIHRodXMgaXQKICAgICAgICAgICAgICAgICBjb25hdGFpbnMgcmVwbGF5IGNvdW50ZXIgcGVyZm9ybSB0aGUKICAgICAgICAgICAgICAgICByZXBsYXkgY2hlY2sgZm9yIHRoaXMgZmlyc3Qgc3ViZnJhbWUqLwogICAgICAgICAgICAgIHN0YXR1cyA9ICBXTEFOVExfSXNSZXBsYXlQYWNrZXQoIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLCB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIpOwogICAgICAgICAgICAgIGlmKFZPU19GQUxTRSA9PSBzdGF0dXMpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgLyogTm90IGEgcmVwbGF5IHBha2V0LCB1cGRhdGUgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgaW4gVEwgQ0IgKi8gICAgCiAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEFNU0RVIERyb3AgdGhlIHJlcGxheSBwYWNrZXQgd2l0aCBQTiA6IFsweCVsbFhdIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CiAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgdG90YWwgZHJvcHBlZCByZXBsYXkgcGFja2V0cyBvbiBTVEEgSUQgJVggaXMgWzB4JVhdIiwKICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgIHBDbGllbnRTVEEtPnVsVG90YWxSZXBsYXlQYWNrZXRzRGV0ZWN0ZWQpOwoKICAgICAgICAgICAgICAgICAgLyogRHJvcCB0aGUgcGFja2V0ICovCiAgICAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgIHZfQk9PTF90IHN0YXR1czsKCiAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgZnJvbSB0aGUgUlggQkQgKi8KICAgICAgICAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IFdEQV9EU19HZXRSZXBsYXlDb3VudGVyKGF1Y0JESGVhZGVyKTsKCiAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICJXTEFOIFRMOiBOb24tQU1TRFUgY3VycmVudFJlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgZnJvbSBUTCBjb250cm9sICBibG9jayAqLwogICAgICAgICAgIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlciA9IHBDbGllbnRTVEEtPnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdOwoKICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIHByZXZpb3VzUmVwbGF5Q291bnRlciBbMHglbGxYXSIsdWxscHJldmlvdXNSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgLyogSXQgaXMgbm90IEFNU0RVIGZyYW1lIHNvIHBlcmZvcm0gCiAgICAgICAgICAgICAgcmVhcGx5IGNoZWNrIGZvciBlYWNoIHBhY2tldCwgYXMKICAgICAgICAgICAgICBlYWNoIHBhY2tldCBjb250YWlucyB2YWxpZCByZXBsYXkgY291bnRlciovIAogICAgICAgICAgIHN0YXR1cyA9ICBXTEFOVExfSXNSZXBsYXlQYWNrZXQoIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLCB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIpOwogICAgICAgICAgIGlmKFZPU19GQUxTRSA9PSBzdGF0dXMpCiAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogTm90IGEgcmVwbGF5IHBha2V0LCB1cGRhdGUgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgaW4gVEwgQ0IgKi8gICAgCiAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIERyb3AgdGhlIHJlcGxheSBwYWNrZXQgd2l0aCBQTiA6IFsweCVsbFhdIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CiAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vbi1BTVNEVSB0b3RhbCBkcm9wcGVkIHJlcGxheSBwYWNrZXRzIG9uIFNUQSBJRCAlWCBpcyBbMHglWF0iLAogICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dWxUb3RhbFJlcGxheVBhY2tldHNEZXRlY3RlZCk7CgogICAgICAgICAgICAgICAvKiBSZXBhbHkgcGFja2V0LCBkcm9wIHRoZSBwYWNrZXQgKi8KICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgICAgICB9CiAgICAgIH0KICB9Cn0KLypJdCBpcyBhIGJyb2FkYXN0IHBhY2tldCBEUFUgaGFzIGFscmVhZHkgZG9uZSByZXBsYXkgY2hlY2sgZm9yIAogIGJyb2FkY2FzdCBwYWNrZXRzIG5vIG5lZWQgdG8gZG8gcmVwbGF5IGNoZWNrIG9mIHRoZXNlIHBhY2tldHMqLwoKICBpZiAoIE5VTEwgIT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICB7CiAgICAgIFdMQU5UTF9Gd2RQa3RUb0hERCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkICk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHdSeE1ldGFJbmZvLnVjVVAgPSB1Y1RpZDsKICAgICAgd1J4TWV0YUluZm8ucnNzaUF2ZyA9IHBDbGllbnRTVEEtPnJzc2lBdmc7CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgICBpZiAoV0xBTl9TVEFfVERMUyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICAgICAgewogICAgICAgICAgd1J4TWV0YUluZm8uaXNTdGFUZGxzID0gVFJVRTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgIHdSeE1ldGFJbmZvLmlzU3RhVGRscyA9IEZBTFNFOwogICAgICB9CiNlbmRpZgogICAgICBwQ2xpZW50U1RBLT5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOwogICAgfQogIH0vKiBpZiBub3QgTlVMTCAqLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVJ4QXV0aCAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBUnhEaXNjCgogIERFU0NSSVBUSU9OCiAgICBSZWNlaXZlIGluIGRpc2Nvbm5lY3RlZCBzdGF0ZSAtIG5vIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHJ4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUnhEaXNjCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCBOVUxMID09IHB2b3NEYXRhQnVmZiApIHx8ICggTlVMTCA9PSAgKnB2b3NEYXRhQnVmZiApKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeERpc2MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVycm9yIC0gZHJvcCBwYWNrZXQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpQYWNrZXQgc2hvdWxkIG5vdCBiZSByZWNlaXZlZCBpbiBzdGF0ZSBkaXNjb25uZWN0ZWQiCiAgICAgICAgICAgICAiIC0gZHJvcHBpbmciKSk7CiAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCpwdm9zRGF0YUJ1ZmYpOwogICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVJ4RGlzYyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBQcm9jZXNzaW5nIG1haW4gbG9vcHMgZm9yIE1BSU4gYW5kIFRYIHRocmVhZHMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX01jUHJvY2Vzc01zZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFZPU1Mgd2hlbiBhIG1lc3NhZ2Ugd2FzIHNlcmlhbGl6ZWQgZm9yIFRMIHRocm91Z2ggdGhlCiAgICBtYWluIHRocmVhZC90YXNrLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfTWNQcm9jZXNzTXNnCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgdEFkZEJBSW5kKiAgICAgIHB0QWRkQmFJbmQgPSBOVUxMOwogICB0RGVsQkFJbmQqICAgICAgcHREZWxCYUluZCA9IE5VTEw7CiAgIHRBZGRCQVJzcCogICAgICBwdEFkZEJhUnNwID0gTlVMTDsKICAgdm9zX21zZ190ICAgICAgIHZvc01lc3NhZ2U7CiAgIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXM7CiAgIHRwRmx1c2hBQ1JzcCBGbHVzaEFDUnNwUHRyOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IG1lc3NhZ2UgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUHJvY2Vzc01haW5NZXNzYWdlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9Qcm9jZXNzTWFpbk1lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIG1haW4gZmxvdyIsIG1lc3NhZ2UtPnR5cGUpKTsKCiAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKICB7CiAgY2FzZSBXREFfVExfRkxVU0hfQUNfUlNQOgogICAgLy8gRXh0cmFjdCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBtZXNzYWdlIGJvZHkKICAgIEZsdXNoQUNSc3BQdHIgPSAodHBGbHVzaEFDUnNwKShtZXNzYWdlLT5ib2R5cHRyKTsKICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2FsbCBiYWNrIGZ1bmN0aW9uIGlzIG5vdCBudWxsLgogICAgaWYgKCBOVUxMID09IHBUTENiLT50bEJBUENsaWVudC5wZm5GbHVzaE9wQ29tcGxldGVDYiApCiAgICB7CiAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBwZm5GbHVzaE9wQ29tcGxldGVDYiIpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJSZWNlaXZlZCBtZXNzYWdlOiAgRmx1c2ggY29tcGxldGUgcmVjZWl2ZWQgYnkgVEwiKSk7CgogICAgLy8gU2luY2Ugd2UgaGF2ZSB0aGUgcmVzcG9uc2UgYmFjayBmcm9tIEhBTCwganVzdCBjYWxsIHRoZSBCQVAgY2xpZW50CiAgICAvLyByZWdpc3RlcmVkIGNhbGwgYmFjayBmcm9tIFRMLiBUaGVyZSBpcyBvbmx5IDEgcG9zc2libGUKICAgIC8vIEJBUCBjbGllbnQuIFNvIGRpcmVjdGx5IHJlZmVyZW5jZSB0bEJBUENsaWVudAogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmbkZsdXNoT3BDb21wbGV0ZUNiKCBwdm9zR0N0eCwKICAgICAgICAgICAgRmx1c2hBQ1JzcFB0ci0+dWNTVEFJZCwKICAgICAgICAgICAgRmx1c2hBQ1JzcFB0ci0+dWNUaWQsIEZsdXNoQUNSc3BQdHItPnN0YXR1cyApOwoKICAgIC8vIEZyZWUgdGhlIFBBTCBtZW1vcnksIHdlIGFyZSBkb25lIHdpdGggaXQuCiAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIkZsdXNoIGNvbXBsZXRlIHJlY2VpdmVkIGJ5IFRMOiBGcmVlaW5nICVwIiwgRmx1c2hBQ1JzcFB0cikpOwogICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCAqKUZsdXNoQUNSc3BQdHIpOwogICAgYnJlYWs7CgogIGNhc2UgV0RBX0hERF9BRERCQV9SRVE6CiAgIHB0QWRkQmFJbmQgPSAodEFkZEJBSW5kKikobWVzc2FnZS0+Ym9keXB0cik7CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfQmFTZXNzaW9uQWRkKCBwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLmJhU2Vzc2lvbklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLlNUQUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLmJhVElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdClwdEFkZEJhSW5kLT5iYVNlc3Npb24uYmFCdWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEFkZEJhSW5kLT5iYVNlc3Npb24ud2luU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLlNTTik7CiAgICBwdEFkZEJhUnNwID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKCpwdEFkZEJhUnNwKSk7CgogICAgaWYgKCBOVUxMID09IHB0QWRkQmFSc3AgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogZmF0YWwgZmFpbHVyZSwgY2Fubm90IGFsbG9jYXRlIEJBIFJzcCBzdHJ1Y3R1cmUiKSk7CiAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CiAgICB9CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiBTZW5kaW5nIHN1Y2Nlc3MgaW5kaWNhdGlvbiB0byBIQUwgZm9yIEFERCBCQSIpKTsKICAgICAgLypTZW5kIHN1Y2Nlc3MqLwogICAgICBwdEFkZEJhUnNwLT5tZXNnVHlwZSAgICA9IFdEQV9IRERfQUREQkFfUlNQOwogICAgICB2b3NNZXNzYWdlLnR5cGUgICAgICAgICA9IFdEQV9IRERfQUREQkFfUlNQOwogICAgfQogICAgZWxzZQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBTZW5kaW5nIGZhaWx1cmUgaW5kaWNhdGlvbiB0byBIQUwgZm9yIEFERCBCQSIpKTsKCiAgICAgIC8qU2VuZCBmYWlsdXJlKi8KICAgICAgcHRBZGRCYVJzcC0+bWVzZ1R5cGUgICAgPSBXREFfQkFfRkFJTF9JTkQ7CiAgICAgIHZvc01lc3NhZ2UudHlwZSAgICAgICAgID0gV0RBX0JBX0ZBSUxfSU5EOwogICAgfQoKICAgIHB0QWRkQmFSc3AtPm1lc2dMZW4gICAgID0gc2l6ZW9mKHRBZGRCQVJzcCk7CiAgICBwdEFkZEJhUnNwLT5iYVNlc3Npb25JRCA9IHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5iYVNlc3Npb25JRDsKICAgICAgLyogVGhpcyBpcyBkZWZhdWx0LCByZXBseSB3aW4gc2l6ZSBoYXMgdG8gYmUgaGFuZGxlZCBCQSBtb2R1bGUsIEZJWCBUSElTICovCiAgICAgIHB0QWRkQmFSc3AtPnJlcGx5V2luU2l6ZSA9IFdMQU5UTF9NQVhfV0lOU0laRTsKICAgIHZvc01lc3NhZ2UuYm9keXB0ciA9IHB0QWRkQmFSc3A7CgogICAgdm9zX21xX3Bvc3RfbWVzc2FnZSggVk9TX01RX0lEX1dEQSwgJnZvc01lc3NhZ2UgKTsKICAgIFdMQU5UTF9NY0ZyZWVNc2cgKHB2b3NHQ3R4LCBtZXNzYWdlKTsKICBicmVhazsKICBjYXNlIFdEQV9ERUxFVEVCQV9JTkQ6CiAgICBwdERlbEJhSW5kID0gKHREZWxCQUluZCopKG1lc3NhZ2UtPmJvZHlwdHIpOwogICAgdm9zU3RhdHVzICA9IFdMQU5UTF9CYVNlc3Npb25EZWwocHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPnN0YUlkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHREZWxCYUluZC0+YmFUSUQpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIGRlbCBCQSBzZXNzaW9uIFNUQTolZCBUSUQ6JWQgU3RhdHVzIDolZCIsCiAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPnN0YUlkeCwKICAgICAgICAgICAgICAgcHREZWxCYUluZC0+YmFUSUQsCiAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgfQogICAgV0xBTlRMX01jRnJlZU1zZyAocHZvc0dDdHgsIG1lc3NhZ2UpOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIC8qbm8gcHJvY2Vzc2luZyBmb3Igbm93Ki8KICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9Qcm9jZXNzTWFpbk1lc3NhZ2UgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfTWNGcmVlTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB0byBmcmVlIGEgZ2l2ZW4gVEwgbWVzc2FnZSBvbiB0aGUgTWFpbiB0aHJlYWQgd2hlbiB0aGVyZQogICAgYXJlIG1lc3NhZ2VzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlIHdoZW4gdGhlIHdob2xlIHN5c3RlbSBpcyBiZWVuIHJlc2V0LgogICAgRm9yIG5vdywgVEwgZG9lcyBub3QgYWxsb2NhdGUgYW55IGJvZHkgc28gdGhpcyBmdW5jdGlvbiBzaG91dCB0cmFuc2xhdGUKICAgIGludG8gYSBOT09QCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9NY0ZyZWVNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IG1lc3NhZ2UgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfTWNGcmVlTXNnIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9NY0ZyZWVNc2ciKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIG1haW4gZnJlZSIsIG1lc3NhZ2UtPnR5cGUpKTsKCiAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKICB7CiAgY2FzZSBXREFfSEREX0FEREJBX1JFUToKICBjYXNlIFdEQV9ERUxFVEVCQV9JTkQ6CiAgICAvKnZvcyBmcmVlIGJvZHkgcG9pbnRlciovCiAgICB2b3NfbWVtX2ZyZWUobWVzc2FnZS0+Ym9keXB0cik7CiAgICBtZXNzYWdlLT5ib2R5cHRyID0gTlVMTDsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICAvKm5vIHByb2Nlc3NpbmcgZm9yIG5vdyovCiAgICBicmVhazsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9NY0ZyZWVNc2cqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9UeFByb2Nlc3NNc2cKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBWT1NTIHdoZW4gYSBtZXNzYWdlIHdhcyBzZXJpYWxpemVkIGZvciBUTCB0aHJvdWdoIHRoZQogICAgdHggdGhyZWFkL3Rhc2suCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBPdGhlciB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbCwgcGxlYXNlIGNoZWNrCiAgY29ycmVzcG9uZGluZyBBUEkgZm9yIG1vcmUgaW5mby4KICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeFByb2Nlc3NNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0KTsKICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IG1lc3NhZ2UgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUHJvY2Vzc1R4TWVzc2FnZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUHJvY2VzcyBtZXNzYWdlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlY2VpdmVkIG1lc3NhZ2U6ICVkIHRocm91Z2ggdHggZmxvdyIsIG1lc3NhZ2UtPnR5cGUpKTsKCiAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKICB7CiAgY2FzZSBXTEFOVExfVFhfU0lHX1NVU1BFTkQ6CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfU3VzcGVuZENCKCBwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5UTF9TdXNwZW5kQ0JUeXBlKW1lc3NhZ2UtPmJvZHlwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnJlc2VydmVkKTsKICAgIGJyZWFrOwogIGNhc2UgV0xBTlRMX1RYX1JFU19ORUVERUQ6CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfR2V0VHhSZXNvdXJjZXNDQiggcHZvc0dDdHggKTsKICAgICBicmVhazsKCiAgY2FzZSBXREFfRFNfVFhfU1RBUlRfWE1JVDoKICAgICAgV0xBTlRMX0NsZWFyVHhYbWl0UGVuZGluZyhwdm9zR0N0eCk7CiAgICAgIHZvc1N0YXR1cyA9IFdEQV9EU19UeEZyYW1lcyggcHZvc0dDdHggKTsKICAgICAgYnJlYWs7CgogIGNhc2UgV0RBX0RTX0ZJTklTSF9VTEE6CiAgICBjYWxsYmFja0NvbnRleHQgPSBtZXNzYWdlLT5ib2R5cHRyOwogICAgY2FsbGJhY2tSb3V0aW5lID0gbWVzc2FnZS0+Y2FsbGJhY2s7CiAgICBpZiAoIE5VTEwgIT0gY2FsbGJhY2tSb3V0aW5lICkKICAgIHsKICAgICAgY2FsbGJhY2tSb3V0aW5lKGNhbGxiYWNrQ29udGV4dCk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBXTEFOVExfVFhfU05BUFNIT1Q6CiAgICAvKkR1bXBpbmcgVEwgU3RhdGUgYW5kIHRoZW4gY29udGludWluZyB0byBwcmludAogICAgICB0aGUgRFhFIER1bXAqLwogICAgV0xBTlRMX1R4VGhyZWFkRGVidWdIYW5kbGVyKHB2b3NHQ3R4KTsKICAgIFdEQV9UcmFuc3BvcnRDaGFubmVsRGVidWcoTlVMTCwgVk9TX1RSVUUsIFZPU19GQUxTRSk7CiAgICBicmVhazsKCiAgY2FzZSBXTEFOVExfVFhfRkFUQUxfRVJST1I6CiAgICBXTEFOVExfRmF0YWxFcnJvckhhbmRsZXIocHZvc0dDdHgpOwogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAvKm5vIHByb2Nlc3NpbmcgZm9yIG5vdyovCiAgICBicmVhazsKICB9CgogIHJldHVybiB2b3NTdGF0dXM7Cn0vKiBXTEFOVExfVHhQcm9jZXNzTXNnICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX01jRnJlZU1zZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFZPU1MgdG8gZnJlZSBhIGdpdmVuIFRMIG1lc3NhZ2Ugb24gdGhlIE1haW4gdGhyZWFkIHdoZW4gdGhlcmUKICAgIGFyZSBtZXNzYWdlcyBwZW5kaW5nIGluIHRoZSBxdWV1ZSB3aGVuIHRoZSB3aG9sZSBzeXN0ZW0gaXMgYmVlbiByZXNldC4KICAgIEZvciBub3csIFRMIGRvZXMgbm90IGFsbG9jYXRlIGFueSBib2R5IHNvIHRoaXMgZnVuY3Rpb24gc2hvdXQgdHJhbnNsYXRlCiAgICBpbnRvIGEgTk9PUAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhGcmVlTXNnCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQopCnsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLypOb3RoaW5nIHRvIGRvIGZvciBub3chISEqLwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9UeEZyZWVNc2cqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVHhGQ0ZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIHRvIHNlbmQgRkMgZnJhbWUuIEVuYWJsZQogICAgb3IgZGlzYWJsZSBMV00gbW9kZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24uCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICBGVyBzZW5kcyB1cCBzcGVjaWFsIGZsb3cgY29udHJvbCBmcmFtZS4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwb2ludGVycyBhcmUgTlVMTC4KICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTb21ldGhpbmcgaXMgd3JvbmcuCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kLgoKICBTSURFIEVGRkVDVFMKICAgIE5ld2x5IGZvcm1lZCBGQyBmcmFtZSBpcyBnZW5lcmF0ZWQgYW5kIHdhaXRzIHRvIGJlIHRyYW5zbWl0dGVkLiBQcmV2aW91c2x5IHVuc2VudCBmcmFtZSB3aWxsCiAgICBiZSByZWxlYXNlZC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeEZDRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopCnsKI2lmIDAKICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICB0cEhhbEZjVHhCZCAgICAgICAgIHB2RmNUeEJkID0gTlVMTDsKICB2b3NfcGt0X3QgKiAgICAgICAgIHBQYWNrZXQgPSBOVUxMOwogIHZfVThfdCAgICAgICAgICAgICAgdWNTVEFJZCA9IDA7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y0JpdENoZWNrID0gMTsKCiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6IFNlbmQgRkMgZnJhbWUgJXMiLCBfX2Z1bmNfXyk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB2b3NHQ3R4ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwoKICBpZiAoTlVMTCA9PSBwVExDYikKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwb2ludGVyIGluICVzIFxuIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQogIAogIC8vR2V0IG9uZSB2b3NzIHBhY2tldAogIHZvc1N0YXR1cyA9IHZvc19wa3RfZ2V0X3BhY2tldCggJnBQYWNrZXQsIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCwgc2l6ZW9mKHRIYWxGY1R4QmQpLCAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX0ZBTFNFLCBOVUxMLCBOVUxMICk7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHZvc1N0YXR1cyA9IHZvc19wa3RfcmVzZXJ2ZV9oZWFkKCBwUGFja2V0LCAodm9pZCAqKSZwdkZjVHhCZCwgc2l6ZW9mKHRIYWxGY1R4QmQpKTsKCiAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiJXM6IGZhaWxlZCB0byByZXNlcnZlIEZDIFRYIEJEICVkXG4iLF9fZnVuY19fLCBzaXplb2YodEhhbEZjVHhCZCkpKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8vR2VuZXJhdGUgbW9zdCByZWNlbnQgdGxGQ0luZm8uIE1vc3QgZmllbGRzIGFyZSBjb3JyZWN0LgogIHBUTENiLT50bEZDSW5mby5mY1NUQVRocmVzaEVuYWJsZWRNYXNrID0gMDsKICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUeE1vcmVEYXRhTWFzayA9IDA7CiAgZm9yKCB1Y1NUQUlkID0gMCwgdWNCaXRDaGVjayA9IDEgOyB1Y1NUQUlkIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyB1Y0JpdENoZWNrIDw8PSAxLCB1Y1NUQUlkICsrKQogIHsKICAgIGlmICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjRXhpc3RzKQogICAgewogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNQa3RQZW5kaW5nKQogICAgewogICAgICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUeE1vcmVEYXRhTWFzayB8PSB1Y0JpdENoZWNrOwogICAgfQoKICAgIGlmICggKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQpICYmCiAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5ibXVNZW1Db25zdW1lZCA+IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMd21UaHJlc2hvbGQpKQogICAgewogICAgICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUaHJlc2hFbmFibGVkTWFzayB8PSB1Y0JpdENoZWNrOwoKICAgICAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVGhyZXNoW3VjU1RBSWRdID0gKHRBTklfVTgpcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUx3bVRocmVzaG9sZDsKCiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtRXZlbnRSZXBvcnRlZCA9IEZBTFNFOwogICAgfQoKICB9CiAgCiAgLy9yZXF1ZXN0IGltbWVkaWF0ZSBmZWVkYmFjawogIHBUTENiLT50bEZDSW5mby5mY0NvbmZpZyB8PSAweDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAvL2ZpbGwgaW4gQkQgdG8gc2VudAogIHZvc1N0YXR1cyA9IFdMQU5IQUxfRmlsbEZjVHhCZChwdm9zR0N0eCwgJnBUTENiLT50bEZDSW5mbywgKHZvaWQgKilwdkZjVHhCZCk7CgogIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIiVzOiBGaWxsIEZDIFRYIEJEIHVuc3VjY2Vzc2Z1bFxuIiwgX19mdW5jX18pKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmIChOVUxMICE9IHBUTENiLT52b3NUeEZDQnVmKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIiVzOiBQcmV2aW91cyBGQyBUWCBCRCBub3Qgc2VudFxuIiwgX19mdW5jX18pKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dm9zVHhGQ0J1Zik7CiAgfQoKICBwVExDYi0+dm9zVHhGQ0J1ZiA9IHBQYWNrZXQ7CgogIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHBQYWNrZXQsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClXTEFOVExfVHhDb21wRGVmYXVsdENiKTsKICB2b3NTdGF0dXMgPSBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6IHNlbmQgRkMgZnJhbWUgbGVhdmUgJXMiLCBfX2Z1bmNfXykpOwojZW5kaWYKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRUeFJlc291cmNlc0NCCgogIERFU0NSSVBUSU9OCiAgICBQcm9jZXNzaW5nIGZ1bmN0aW9uIGZvciBSZXNvdXJjZSBuZWVkZWQgc2lnbmFsLiBBIHJlcXVlc3Qgd2lsbCBiZSBpc3N1ZWQKICAgIHRvIEJBTCB0byBnZXQgbW9yZSB0eCByZXNvdXJjZXMuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIE90aGVyIHZhbHVlcyBjYW4gYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCBwbGVhc2UgY2hlY2sKICBjb3JyZXNwb25kaW5nIEFQSSBmb3IgbW9yZSBpbmZvLgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiICAgICAgPSBOVUxMOwogIHZfVTMyX3QgICAgICAgICB1UmVzQ291bnQgID0gV0RBX1RMSV9NSU5fUkVTX0RBVEE7CiAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgdl9VOF90ICAgICAgICAgIHVjTWdtdCAgICAgPSAwOwogIHZfVThfdCAgICAgICAgICB1Y0JBUCAgICAgID0gMDsKICB2X1U4X3QgICAgICAgICAgdWNEYXRhICAgICA9IDA7CiNpZmRlZiBXTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTgogIHRCc3NTeXN0ZW1Sb2xlIHN5c3RlbVJvbGU7CiAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKI2VuZGlmCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIgogICAgICAgICAgICAgICAiIFdMQU5UTF9Qcm9jZXNzVHhNZXNzYWdlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBHZXQgdHggcmVzb3VyY2VzIGZyb20gQkFMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zU3RhdHVzID0gV0RBX0RTX0dldFR4UmVzb3VyY2VzKCBwdm9zR0N0eCwgJnVSZXNDb3VudCApOwoKICBpZiAoIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKSAmJiAoVk9TX1NUQVRVU19FX1JFU09VUkNFUyAhPSB2b3NTdGF0dXMpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6VEwgZmFpbGVkIHRvIGdldCByZXNvdXJjZXMgZnJvbSBCQUwsIEVycjogJWQiLAogICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICAvKiBDdXJyZW50bHkgb25seSBMaW51eCBCQUwgcmV0dXJucyB0aGUgRV9SRVNPVVJDRVMgZXJyb3IgY29kZSB3aGVuIGl0IGlzIHJ1bm5pbmcgCiAgICAgb3V0IG9mIEJEL1BEVXMuIFRvIG1ha2UgdXNlIG9mIHRoaXMgaW50ZXJydXB0IGZvciB0aHJvdWdocHV0IGVuaGFuY2VtZW50LCBzaW1pbGFyCiAgICAgY2hhbmdlcyBzaG91bGQgYmUgZG9uZSBpbiBCQUwgY29kZSBvZiBBTVNTIGFuZCBXTSAqLwogIGlmIChWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTID09IHZvc1N0YXR1cykKICB7CiNpZmRlZiBWT0xBTlNfUEVSRgogICAgIFdMQU5IQUxfRW5hYmxlSWRsZUJkUGR1SW50ZXJydXB0KHB2b3NHQ3R4LCAodEFOSV9VOCliZFBkdUludGVycnVwdEdldFRocmVzaG9sZCk7CiAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDogRW5hYmxpbmcgSWRsZSBCRC9QRFUgaW50ZXJydXB0LCBDdXJyZW50IHJlc291cmNlcyA9ICVkIiwgdVJlc0NvdW50KTsKI2Vsc2UKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKI2VuZGlmCiAgfQoKICBwVExDYi0+dVJlc0NvdW50ID0gdVJlc0NvdW50OwogIAoKI2lmZGVmIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCiAgLyogRklYTUU6IGRpc2FibGVkIHNpbmNlIGNyZWF0aW5nIGlzc3VlcyBpbiBwb3dlci1zYXZlLCBuZWVkcyB0byBiZSBhZGRyZXNzZWQgKi8gCiAgcFRMQ2ItPnNlbmRGQ0ZyYW1lICsrOwogIHBNYWMgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9XREEsIHB2b3NHQ3R4KTsKICBzeXN0ZW1Sb2xlID0gd2RhR2V0R2xvYmFsU3lzdGVtUm9sZShwTWFjKTsKICBpZiAoZVNZU1RFTV9BUF9ST0xFID09IHN5c3RlbVJvbGUpCiAgewogICAgIGlmIChwVExDYi0+c2VuZEZDRnJhbWUgJSAxNiA9PSAwKQogICAgIHsKICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICJUcmFuc21pdCBGQyIpKTsKICAgICAgICAgV0xBTlRMX1R4RkNGcmFtZSAocHZvc0dDdHgpOwogICAgIH0gCiAgfQojZW5kaWYgLy9XTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTiAKCiAgdWNEYXRhID0gKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfREFUQSApOwogIHVjQkFQICA9ICggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX0JBUCApICYmCiAgICAgICAgICAgKCBOVUxMICE9IHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKTsKICB1Y01nbXQgPSAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19NRiApICYmCiAgICAgICAgICAgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICk7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDogRXZhbCBSZXN1bWUgdHggUmVzOiAlZCBEQVRBOiAlZCBCQVA6ICVkIE1HTVQ6ICVkIiwKICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQsIHVjRGF0YSwgdWNCQVAsIHVjTWdtdCkpOwoKICBpZiAoKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkgJiYKICAgICAgKCggMCAhPSB1Y0RhdGEgKSB8fCAoIDAgIT0gdWNNZ210ICkgfHwgKCAwICE9IHVjQkFQICkgKSApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiSXNzdWluZyBYbWl0IHN0YXJ0IHJlcXVlc3QgdG8gQkFMIGZvciBhdmFpbCByZXMgU1lOQyIpKTsKICAgIHZvc1N0YXR1cyA9V0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CiAgfQogIHJldHVybiB2b3NTdGF0dXM7Cn0vKldMQU5UTF9HZXRUeFJlc291cmNlc0NCKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgVXRpbGl0eSBmdW5jdGlvbnMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyCgogIERFU0NSSVBUSU9OCiAgICBJbmxpbmUgZnVuY3Rpb24gZm9yIHRyYW5zbGF0aW5nIGFuZCA4MDIuMTEgaGVhZGVyIGludG8gYW4gODAyLjMgaGVhZGVyLgoKICBERVBFTkRFTkNJRVMKCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgICBwVExDYjogICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgIElOL09VVCAKICAgIHVjU3RhSWQ6ICAgICAgICAgIHN0YXRpb24gSUQuIEluY2FzZSBvZiBURExTLCB0aGlzIHJldHVybnMgYWN0dWFsIFRETFMKICAgICAgICAgICAgICAgICAgICAgIHN0YXRpb24gSUQgdXNlZAoKICAgSU4vT1VUCiAgICB2b3NEYXRhQnVmZjogICAgICB2b3MgZGF0YSBidWZmZXIsIHdpbGwgY29udGFpbiB0aGUgbmV3IGhlYWRlciBvbiBvdXRwdXQKCiAgIE9VVAogICAgcHZvc1N0YXR1czogICAgICAgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KCiAgUkVUVVJOIFZBTFVFCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgT3RoZXIgZXJyb3IgY29kZXMgbWlnaHQgYmUgcmV0dXJuZWQgZnJvbSB0aGUgdm9zIGFwaSB1c2VkIGluIHRoZSBmdW5jdGlvbgogICAgcGxlYXNlIGNoZWNrIHRob3NlIHJldHVybiB2YWx1ZXMuCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyCigKICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYsCiAgVk9TX1NUQVRVUyogICAgIHB2b3NTdGF0dXMsCiAgV0xBTlRMX0NiVHlwZSogIHBUTENiLAogIHZfVThfdCAgICAgICAgICAqcHVjU3RhSWQsCiAgV0xBTlRMX01ldGFJbmZvVHlwZSAqdGxNZXRhSW5mbywKICB2X1U4X3QgICAgICAgICAgKnVjV0RTRW5hYmxlZCwKICB2X1U4X3QgICAgICAgICAgKmV4dHJhSGVhZFNwYWNlCikKewogIFdMQU5UTF84MDIzSGVhZGVyVHlwZSAgdzgwMjNIZWFkZXI7CiAgV0xBTlRMXzgwMjExSGVhZGVyVHlwZSAqcHc4MDIxMUhlYWRlcjsgLy8gQWxsb2NhdGUgYW4gYWxpZ25lZCBCRCBhbmQgdGhlbiBmaWxsIGl0LiAKICBWT1NfU1RBVFVTICAgICAgICAgICAgIHZvc1N0YXR1czsKICB2X1U4X3QgICAgICAgICAgICAgICAgIE1hbmRhdG9yeXVjSGVhZGVyU2l6ZSA9IFdMQU44MDIxMV9NQU5EQVRPUllfSEVBREVSX1NJWkU7CiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y0hlYWRlclNpemUgPSAwOwogIHZfVk9JRF90ICAgICAgICAgICAgICAgKnBwdkJESGVhZGVyID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogIHBDbGllbnRTVEEgPSBOVUxMOwogIHZfVThfdCAgICAgICAgICAgICAgICAgdWNRb1NPZmZzZXQgPSBXTEFOODAyMTFfTUFOREFUT1JZX0hFQURFUl9TSVpFOwogIHZfVThfdCAgICAgICAgICAgICAgICAgdWNTdGFJZDsKI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECiAgdl9CT09MX3QgICAgICAgICAgICAgICBiSUFQUFR4d2l0aExMQyA9IFZPU19GQUxTRTsKICB2X1NJWkVfdCAgICAgICAgICAgICAgIHdJQVBQU25hcFNpemUgPSBXTEFOVExfTExDX0hFQURFUl9MRU47CiAgdl9VOF90ICAgICAgICAgICAgICAgICB3SUFQUFNuYXBbV0xBTlRMX0xMQ19IRUFERVJfTEVOXSA9IHswfTsKI2VuZGlmCiAgKnVjV0RTRW5hYmxlZCA9IDA7IC8vIGRlZmF1bHQgV0RTIG9mZi4KICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgJnc4MDIzSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih3ODAyM0hlYWRlcikpOwoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6IFBhY2tldCBwb3AgaGVhZGVyIGZhaWxzIG9uIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgaWYoIE5VTEwgPT0gcHVjU3RhSWQgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6IEludmFsaWQgcG9pbnRlciBmb3IgU3RhSWQiKSk7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CiAgdWNTdGFJZCA9ICpwdWNTdGFJZDsKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCgogIGlmICggV0xBTl9TVEFfSU5GUkEgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0tPndTVEFEZXNjLndTVEFUeXBlCiAgICAgICYmIHBUTENiLT51Y1RkbHNQZWVyQ291bnQgKQogIHsKICAgIHZfVThfdCB1Y0luZGV4ID0gMDsKICAgIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfU1RBX0NPVU5UIDsgdWNJbmRleCsrKQogICAgewogICAgICBpZiAoIHVjSW5kZXggIT0gdWNTdGFJZCAmJiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSAmJiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XS0+dWNFeGlzdHMgJiYKICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XS0+dGxTdGF0ZSA9PSBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQpICYmCiAgICAgICAgICAoIXBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLT51Y1R4U3VzcGVuZGVkKSAmJgogICAgICAgICAgdm9zX21lbV9jb21wYXJlKCAodm9pZCopcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0tPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzLAogICAgICAgICAgICAodm9pZCopdzgwMjNIZWFkZXIudkRBLCA2KSApCiAgICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgIldMQU4gVEw6IEdvdCBhIFRETFMgc3RhdGlvbi4gVXNpbmcgdGhhdCBpbmRleCIpKTsKICAgICAgICB1Y1N0YUlkID0gdWNJbmRleDsKICAgICAgICAqcHVjU3RhSWQgPSB1Y1N0YUlkOwogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXTsKICAgICAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KI2VuZGlmCgojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKaWYgKCgwID09IHc4MDIzSGVhZGVyLnVzTGVuVHlwZSkgJiYgKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNFc2VTdGEpKQp7CiAgICB2b3NfcGt0X2V4dHJhY3RfZGF0YSh2b3NEYXRhQnVmZiwwLCZ3SUFQUFNuYXBbMF0sJndJQVBQU25hcFNpemUpOwogICAgaWYgKHZvc19tZW1fY29tcGFyZSh3SUFQUFNuYXAsV0xBTlRMX0FJUk9ORVRfU05BUF9IRUFERVIsV0xBTlRMX0xMQ19IRUFERVJfTEVOKSkKICAgIHsKICAgICAgICAvKlRoZSBTTkFQIGFuZCB0aGUgcHJvdG9jb2wgdHlwZSBhcmUgYWxyZWFkeSBpbiB0aGUgZGF0YSBidWZmZXIuCiAgICAgICAgIFRoZXkgYXJlIGZpbGxlZCBieSB0aGUgYXBwbGljYXRpb24gKHdwYV9zdXBwbGljYW50KS4gU28sIFNraXAgQWRkaW5nIExMQyBiZWxvdy4qLwogICAgICAgICBiSUFQUFR4d2l0aExMQyA9IFZPU19UUlVFOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJJQVBQVHh3aXRoTExDID0gVk9TX0ZBTFNFOwogICAgfQp9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLwoKICBpZiAoKDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNBZGRSbXZMTEMpCiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAogICAgICAmJiAoIWJJQVBQVHh3aXRoTExDKQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KICAgICApCiAgewogICAgLyogUHVzaCB0aGUgbGVuZ3RoICovCiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3B1c2hfaGVhZCh2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAmdzgwMjNIZWFkZXIudXNMZW5UeXBlLCBzaXplb2YodzgwMjNIZWFkZXIudXNMZW5UeXBlKSk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFBhY2tldCBwdXNoIGV0aGVyIHR5cGUgZmFpbHMgb24iCiAgICAgICAgICAgICAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOwogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KCiNpZmRlZiBCVEFNUF9URVNUCiAgICAvLyBUaGUgU1RBIHNpZGUgd2lsbCBleGVjdXRlIHRoaXMsIGEgaGFjayB0byB0ZXN0IEJUQU1QIGJ5IHVzaW5nIHRoZQogICAgLy8gaW5mcmEgc2V0dXAuIE9uIHJlYWwgQlRBTVAgdGhpcyB3aWxsIGNvbWUgZnJvbSBCQVAgaXRzZWxmLgogICAgewogICAgc3RhdGljIHZfVThfdCBXTEFOVExfQlRfQU1QX0xMQ19IRUFERVJbXSA9ICB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgxOSwgMHg1OCB9OwogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsIFdMQU5UTF9CVF9BTVBfTExDX0hFQURFUiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0xBTlRMX0JUX0FNUF9MTENfSEVBREVSKSk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogUGFja2V0IHB1c2ggTExDIGhlYWRlciBmYWlscyBvbiIKICAgICAgICAgICAgICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQogICAgfQojZWxzZQogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsIFdMQU5UTF9MTENfSEVBREVSLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXTEFOVExfTExDX0hFQURFUikpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFBhY2tldCBwdXNoIExMQyBoZWFkZXIgZmFpbHMgb24iCiAgICAgICAgICAgICAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOwogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KI2VuZGlmCiAgfS8qSWYgYWRkIExMQyBpcyBlbmFibGVkKi8KICBlbHNlCiAgewojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKICAgICAgYklBUFBUeHdpdGhMTEMgPSBWT1NfRkFMU0U7IC8qUmVzZXQgdGhlIEZsYWcgaGVyZSB0byBzdGFydCBhZnJlc2ggd2l0aCB0aGUgbmV4dCBUWCBwa3QqLwojZW5kaWYgLyogRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFNUQSBDbGllbnQgcmVnaXN0ZXJlZCB0byBub3QgcmVtb3ZlIExMQyIKICAgICAgICAgICAgICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CiAgfQoKI2lmZGVmIEJUQU1QX1RFU1QKICBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSA9IFdMQU5fU1RBX0JUX0FNUDsKI2VuZGlmCgogIC8vIEZpbmQgdGhlIHNwYWNlIHJlcXVpcmVkIGZvciB0aGUgODAyLjExIGhlYWRlciBmb3JtYXQKICAvLyBiYXNlZCBvbiB0aGUgZnJhbWUgY29udHJvbCBmaWVsZHMuCiAgdWNIZWFkZXJTaXplID0gTWFuZGF0b3J5dWNIZWFkZXJTaXplOwogIGlmIChwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQpCiAgeyAgCiAgICB1Y0hlYWRlclNpemUgKz0gc2l6ZW9mKHB3ODAyMTFIZWFkZXItPnVzUW9zQ3RybCk7CiAgfQogIGlmIChwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSA9PSBXTEFOX1NUQV9CVF9BTVApCiAgeyAgCiAgICB1Y0hlYWRlclNpemUgKz0gc2l6ZW9mKHB3ODAyMTFIZWFkZXItPm9wdHZBNCk7CiAgICB1Y1FvU09mZnNldCArPSBzaXplb2YocHc4MDIxMUhlYWRlci0+b3B0dkE0KTsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIDogSGVhZGVyIHNpemUgPSAlZCAiLCB1Y0hlYWRlclNpemUpKTsKCiAgdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHZvc0RhdGFCdWZmLCAmcHB2QkRIZWFkZXIsIHVjSGVhZGVyU2l6ZSApOwogIGlmICggTlVMTCA9PSBwcHZCREhlYWRlciApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Vk9TUyBwYWNrZXQgY29ycnVwdGVkICIpKTsKICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgcmV0dXJuICpwdm9zU3RhdHVzOwogIH0KCgogIC8vIE9LIG5vdyB3ZSBoYXZlIHRoZSBzcGFjZS4gRmlsbCB0aGUgODAyMTEgaGVhZGVyCiAgLyogRmlsbCBBMiAqLwogIHB3ODAyMTFIZWFkZXIgPSAoV0xBTlRMXzgwMjExSGVhZGVyVHlwZSAqKShwcHZCREhlYWRlcik7CiAgLy8gb25seSBjbGVhciB0aGUgcmVxdWlyZWQgc3BhY2UuCiAgdm9zX21lbV9zZXQoIHB3ODAyMTFIZWFkZXIsIHVjSGVhZGVyU2l6ZSwgMCApOwogIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEyLCB3ODAyM0hlYWRlci52U0EsICBWT1NfTUFDX0FERFJfU0laRSk7CgoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCggV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEID09IHBDbGllbnRTVEEtPnRsU3RhdGUgfHwKICAgICAgICBwQ2xpZW50U1RBLT5wdGtJbnN0YWxsZWQgKSAmJiBnVWNJc1dhaSAhPSAxKQojZWxzZQogIGlmICggV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEID09IHBDbGllbnRTVEEtPnRsU3RhdGUgfHwKICAgICAgIHBDbGllbnRTVEEtPnB0a0luc3RhbGxlZCApCiNlbmRpZgogIHsKICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLndlcCA9CiAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNQcm90ZWN0ZWRGcmFtZTsKICB9CgogIHB3ODAyMTFIZWFkZXItPnVzRHVyYXRpb25JZCA9IDA7CiAgcHc4MDIxMUhlYWRlci0+dXNTZXFDdHJsICAgID0gMDsKCiAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudHlwZSAgICAgPSBXTEFOVExfODAyMTFfREFUQV9UWVBFOwoKCgogIGlmKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCkKICB7CiAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnN1YlR5cGUgID0gV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEU7CgogICAgICAqKCh2X1UxNl90ICopKCh2X1U4X3QgKilwcHZCREhlYWRlciArIHVjUW9TT2Zmc2V0KSkgPSB0bE1ldGFJbmZvLT51Y1VQOwoKICB9CiAgZWxzZQogIHsKICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuc3ViVHlwZSAgPSAwOwoKICAvLyBOTyBOTyBOTyAtIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCB0byB3cml0ZSB0aGUgUU9TIGN0cmwgIAogIC8vIGZpZWxkLCBpdCB3aWxsIG92ZXJ3cml0ZSB0aGUgZmlyc3QgMiBieXRlcyBvZiB0aGUgZGF0YSBwYWNrZXQoTExDIGhlYWRlcikKICAvLyBwdzgwMjExSGVhZGVyLT51c1Fvc0N0cmwgICAgICAgICA9IDA7CiAgfQoKCiAgc3dpdGNoKCBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSApCiAgewogICAgIGNhc2UgV0xBTl9TVEFfSUJTUzoKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMDsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMDsKCiAgICAgICAgLyoKICAgICAgICAgKiBJZiB0aGUgZnJhbWUgaXMgYSBtdWx0aWNhc3QgZnJhbWUsIHRoZW4sIHRoZSBBZGRyZXNzMQogICAgICAgICAqIHNob3VsZCBiZSB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBmaWxsZWQgaW4gdGhlIHBhY2tldC4gV2hpY2ggaXMKICAgICAgICAgKiB0aGUgbXVsdGljYXN0IGFkZHJlc3MuIE90aGVyd2lzZSwgc2V0IGl0IHRvIEJTU0lECiAgICAgICAgICovCiAgICAgICAgaWYgKDAgPT0gdGxNZXRhSW5mby0+dWNCY2FzdCAmJiAxID09IHRsTWV0YUluZm8tPnVjTWNhc3QpCiAgICAgICAgewogICAgICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9NQUNBRERSX3QqKSZ3ODAyM0hlYWRlci52REEpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMSwKICAgICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOwogICAgICAgIH0KICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMywKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudkJTU0lEZm9ySUJTUyAsCiAgICAgICAgICAgICAgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIGJyZWFrOwoKICAgICBjYXNlIFdMQU5fU1RBX0JUX0FNUDoKICAgICAgICAqdWNXRFNFbmFibGVkID0gMTsgLy8gV0RTIG9uLgogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAxOwogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAxOwogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMSwKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEyLAogICAgICAgICAgICAgIHc4MDIzSGVhZGVyLnZTQSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMywKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOwogICAgICAgIC8qIGZpbGwgdGhlIG9wdGlvbmFsIEE0IGhlYWRlciAqLwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+b3B0dkE0LAogICAgICAgICAgICAgIHc4MDIzSGVhZGVyLnZTQSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIkJUQU1QIENBU0UgTk9XIC0tLS0tLS0tLXN0YWlkPSVkIiwKICAgICAgICAgICAgICAgICB1Y1N0YUlkKSk7CiAgICAgICAgYnJlYWs7CgogICAgIGNhc2UgV0xBTl9TVEFfU09GVEFQOgogICAgICAgICp1Y1dEU0VuYWJsZWQgPSAwOyAvLyBXRFMgb2ZmLgogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAwOwogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAxOwogICAgICAgIC8qQ29weSB0aGUgREEgdG8gQTEqLwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkExLCB3ODAyM0hlYWRlci52REEgLCBWT1NfTUFDX0FERFJfU0laRSk7ICAgCiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkEyLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MpOwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEzLAogICAgICAgICAgICAgIHc4MDIzSGVhZGVyLnZTQSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgInN3IDgwMiB0byA4MDIxMSBzb2Z0YXAgY2FzZSAgLS0tLS0tLS0tc3RhaWQ9JWQiLAogICAgICAgICAgICAgICAgIHVjU3RhSWQpKTsKICAgICAgICBicmVhazsKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgICAgY2FzZSBXTEFOX1NUQV9URExTOgogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAwOwogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAwOwogICAgICAgIC8qRml4IG1lKi8KICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMywKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudkJTU0lEZm9ySUJTUyAsCiAgICAgICAgICAgICAgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAoIlRMOlRETFMgQ0FTRSBOT1cgLS0tLS0tLS0tc3RhaWQ9JWQiKSwgdWNTdGFJZCk7CiAgICAgICAgYnJlYWs7CiNlbmRpZgogICAgIGNhc2UgV0xBTl9TVEFfSU5GUkE6CiAgICAgZGVmYXVsdDoKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMTsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMDsKICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMywgdzgwMjNIZWFkZXIudkRBICwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIlJFR1VMQVIgSU5GUkEgTElOSyBDQVNFLS0tLS0tLS0tc3RhaWQ9JWQiLAogICAgICAgICAgICAgICAgIHVjU3RhSWQpKTsKICAgICAgICBicmVhazsKICB9CiAgLy8gT0sgbm93IHdlIGhhdmUgdGhlIHNwYWNlLiBGaWxsIHRoZSA4MDIxMSBoZWFkZXIKICAvKiBGaWxsIEEyICovCiAgcHc4MDIxMUhlYWRlciA9IChXTEFOVExfODAyMTFIZWFkZXJUeXBlICopKHBwdkJESGVhZGVyKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LypXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgQkVHSU4gTE9HIEZVTkNUSU9OICAgICEhISBSZW1vdmUgbWUgb3IgY2xlYW4gbWUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwojaWYgMCAvL2RlZiBXTEFOVExfREVCVUcKCiNkZWZpbmUgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUgICAgMTYKI2RlZmluZSBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURSAgICA0CgpzdGF0aWMgdl9WT0lEX3QgV0xBTlRMX0RlYnVnRnJhbWUKKAogICB2X1BWT0lEX3QgICBkYXRhUG9pbnRlciwKICAgdl9VMzJfdCAgICAgZGF0YVNpemUKKQp7CiAgIHZfVThfdCAgIGxpbmVCdWZmZXJbV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkVdOwogICB2X1UzMl90ICBudW1MaW5lczsKICAgdl9VMzJfdCAgbnVtQnl0ZXM7CiAgIHZfVTMyX3QgIGlkeDsKICAgdl9VOF90ICAgKmxpbmVQb2ludGVyOwoKICAgbnVtTGluZXMgPSBkYXRhU2l6ZSAvIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FOwogICBudW1CeXRlcyA9IGRhdGFTaXplICUgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkU7CiAgIGxpbmVQb2ludGVyID0gKHZfVThfdCAqKWRhdGFQb2ludGVyOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTiBUTDpGcmFtZSBEZWJ1ZyBGcmFtZSBTaXplICVkLCBQb2ludGVyIDB4JXAiLCBkYXRhU2l6ZSwgZGF0YVBvaW50ZXIpKTsKICAgZm9yKGlkeCA9IDA7IGlkeCA8IG51bUxpbmVzOyBpZHgrKykKICAgewogICAgICBtZW1zZXQobGluZUJ1ZmZlciwgMCwgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUpOwogICAgICBtZW1jcHkobGluZUJ1ZmZlciwgbGluZVBvaW50ZXIsIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FKTsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6MHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMngiLAogICAgICAgICAgICAgICAgIGxpbmVCdWZmZXJbMF0sIGxpbmVCdWZmZXJbMV0sIGxpbmVCdWZmZXJbMl0sIGxpbmVCdWZmZXJbM10sIGxpbmVCdWZmZXJbNF0sIGxpbmVCdWZmZXJbNV0sIGxpbmVCdWZmZXJbNl0sIGxpbmVCdWZmZXJbN10sCiAgICAgICAgICAgICAgICAgbGluZUJ1ZmZlcls4XSwgbGluZUJ1ZmZlcls5XSwgbGluZUJ1ZmZlclsxMF0sIGxpbmVCdWZmZXJbMTFdLCBsaW5lQnVmZmVyWzEyXSwgbGluZUJ1ZmZlclsxM10sIGxpbmVCdWZmZXJbMTRdLCBsaW5lQnVmZmVyWzE1XSkpOwogICAgICBsaW5lUG9pbnRlciArPSBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORTsKICAgfQoKICAgaWYoMCA9PSBudW1CeXRlcykKICAgICAgcmV0dXJuOwoKICAgbWVtc2V0KGxpbmVCdWZmZXIsIDAsIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FKTsKICAgbWVtY3B5KGxpbmVCdWZmZXIsIGxpbmVQb2ludGVyLCBudW1CeXRlcyk7CiAgIGZvcihpZHggPSAwOyBpZHggPCBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSAvIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFOyBpZHgrKykKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU0FMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOIFRMOjB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IiwKICAgICAgICAgICAgICAgIGxpbmVCdWZmZXJbaWR4ICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEVdLCBsaW5lQnVmZmVyWzEgKyBpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0sCiAgICAgICAgICAgICAgICBsaW5lQnVmZmVyWzIgKyBpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0sIGxpbmVCdWZmZXJbMyArIGlkeCAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFXSkpOwogICAgICBpZigoKGlkeCArIDEpICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEUpID49IG51bUJ5dGVzKQogICAgICAgICBicmVhazsKICAgfQoKICAgcmV0dXJuOwp9CiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBFTkQgTE9HIEZVTkNUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIKCiAgREVTQ1JJUFRJT04KICAgIElubGluZSBmdW5jdGlvbiBmb3IgdHJhbnNsYXRpbmcgYW5kIDgwMi4xMSBoZWFkZXIgaW50byBhbiA4MDIuMyBoZWFkZXIuCgogIERFUEVOREVOQ0lFUwoKCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgIHBUTENiOiAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHVjU3RhSWQ6ICAgICAgICAgIHN0YXRpb24gSUQKICAgIHVjSGVhZGVyTGVuOiAgICAgIExlbmd0aCBvZiB0aGUgaGVhZGVyIGZyb20gQkQKICAgIHVjQWN0dWFsSExlbjogICAgIExlbmd0aCBvZiBoZWFkZXIgaW5jbHVkaW5nIHBhZGRpbmcgb3IgYW55IG90aGVyIHRyYWlsZXJzCgogICBJTi9PVVQKICAgIHZvc0RhdGFCdWZmOiAgICAgIHZvcyBkYXRhIGJ1ZmZlciwgd2lsbCBjb250YWluIHRoZSBuZXcgaGVhZGVyIG9uIG91dHB1dAoKICAgT1VUCiAgICBwdm9zU3RhdHVzOiAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgoKICAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlcgooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAogIFZPU19TVEFUVVMqICAgICBwdm9zU3RhdHVzLAogIHZfVTE2X3QgICAgICAgICB1c0FjdHVhbEhMZW4sCiAgdl9VOF90ICAgICAgICAgIHVjSGVhZGVyTGVuLAogIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKICB2X1U4X3QgICAgICAgICAgdWNTVEFJZCwKICB2X0JPT0xfdCAgICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICBXTEFOVExfODAyM0hlYWRlclR5cGUgIHc4MDIzSGVhZGVyOwogIFdMQU5UTF84MDIxMUhlYWRlclR5cGUgdzgwMjExSGVhZGVyOwogIHZfVThfdCAgICAgICAgICAgICAgICAgYXVjTExDSGVhZGVyW1dMQU5UTF9MTENfSEVBREVSX0xFTl07CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9VMTZfdCAgICAgICAgICAgICAgICB1c0RhdGFTdGFydE9mZnNldCA9IDA7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIGlmICggc2l6ZW9mKHc4MDIxMUhlYWRlcikgPCB1Y0hlYWRlckxlbiApCiAgewogICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAiV2FybmluZyAhOiBDaGVjayB0aGUgaGVhZGVyIHNpemUgZm9yIHRoZSBSeCBmcmFtZSBzdHJ1Y3R1cmU9JWQgcmVjZWl2ZWQ9JWRuIiwKICAgICAgIHNpemVvZih3ODAyMTFIZWFkZXIpLCB1Y0hlYWRlckxlbikpOwogICAgIHVjSGVhZGVyTGVuID0gc2l6ZW9mKHc4MDIxMUhlYWRlcik7CiAgfQoKICAvLyBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIGhlYWRlcnMgb2YgYWxsIHNpemVzLCAzIGFkZHJlc3MsIDMgYWRkciBRT1MsCiAgLy8gV0RTIG5vbi1RT1MgYW5kIFdEUyBRb1MgZXRjLiBXZSBoYXZlIHNwYWNlIGZvciBhbGwgaW4gdGhlIDgwMi4xMSBoZWFkZXIgc3RydWN0dXJlLgogIHZvc1N0YXR1cyA9IHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCAmdzgwMjExSGVhZGVyLCB1Y0hlYWRlckxlbik7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gcG9wIDgwMjExIGhlYWRlciBmcm9tIHBhY2tldCAlZCIsCiAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKCiAgICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIHN3aXRjaCAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC5mcm9tRFMgKQogIHsKICBjYXNlIDA6CiAgICBpZiAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC50b0RTICkKICAgIHsKICAgICAgLy9Tb2Z0QVAgQVAgbW9kZQogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMywgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMiwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAiV0xBTiBUTCBTb2Z0QVA6IDgwMiAzIERBICUwOHggU0EgJTA4eCIsCiAgICAgICAgICAgICAgICAgIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjNIZWFkZXIudlNBKSk7CiAgICB9CiAgICBlbHNlIAogICAgewogICAgICAvKiBJQlNTICovCiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEyLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICB9CiAgICBicmVhazsKICBjYXNlIDE6CiAgICBpZiAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC50b0RTICkKICAgIHsKICAgICAgLyogQlQtQU1QIGNhc2UgKi8KICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTEsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTIsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgIH0KICAgIGVsc2UKICAgIHsgLyogSW5mcmEgKi8KICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTEsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTMsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgIH0KICAgIGJyZWFrOwogIH0KCiAgaWYoIHVzQWN0dWFsSExlbiA+IHVjSGVhZGVyTGVuICkKICB7CiAgICAgdXNEYXRhU3RhcnRPZmZzZXQgPSB1c0FjdHVhbEhMZW4gLSB1Y0hlYWRlckxlbjsKICB9CgogIGlmICggMCA8IHVzRGF0YVN0YXJ0T2Zmc2V0ICkKICB7CiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3RyaW1faGVhZCggdm9zRGF0YUJ1ZmYsIHVzRGF0YVN0YXJ0T2Zmc2V0ICk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHRyaW0gaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1NUQURlc2MudWNBZGRSbXZMTEMKI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECiAgICAmJiAoIWJGb3J3YXJkSUFQUHdpdGhMTEMpCiNlbmRpZiAvKiAgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQgKi8KICAgICApCiAgewogICAgLy8gRXh0cmFjdCB0aGUgTExDIGhlYWRlcgogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wb3BfaGVhZCggdm9zRGF0YUJ1ZmYsIGF1Y0xMQ0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9MTENfSEVBREVSX0xFTik7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHBvcCBMTEMgaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CgogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KCiAgICAvL0V4dHJhY3QgdGhlIGxlbmd0aAogICAgdm9zX21lbV9jb3B5KCZ3ODAyM0hlYWRlci51c0xlblR5cGUsCiAgICAgICZhdWNMTENIZWFkZXJbV0xBTlRMX0xMQ19IRUFERVJfTEVOIC0gc2l6ZW9mKHc4MDIzSGVhZGVyLnVzTGVuVHlwZSldLAogICAgICBzaXplb2YodzgwMjNIZWFkZXIudXNMZW5UeXBlKSApOwogIH0KICBlbHNlCiAgewogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ODAyM0hlYWRlci51c0xlblR5cGUpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gZ2V0IHBhY2tldCBsZW5ndGggJWQiLAogICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKCiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6IEJUQU1QIGxlbiAoZXRoZXJ0eXBlKSBmbGQgPSAlZCIsCiAgICAgICAgdzgwMjNIZWFkZXIudXNMZW5UeXBlKSk7CiAgICB3ODAyM0hlYWRlci51c0xlblR5cGUgPSB2b3NfY3B1X3RvX2JlMTYodzgwMjNIZWFkZXIudXNMZW5UeXBlKTsKICB9CgogIHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCAmdzgwMjNIZWFkZXIsIHNpemVvZih3ODAyM0hlYWRlcikpOwoKI2lmZGVmIEJUQU1QX1RFU1QKICB7CiAgLy8gQVAgc2lkZSB3aWxsIGV4ZWN1dGUgdGhpcy4KICB2X1U4X3QgKnRlbXBfdzgwMjNIZWFkZXIgPSBOVUxMOwogIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgMCwKICAgICZ0ZW1wX3c4MDIzSGVhZGVyLCBzaXplb2YodzgwMjNIZWFkZXIpICk7CiAgfQojZW5kaWYKI2lmIDAgLypUTF9ERUJVRyovCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NEYXRhQnVmZiwgJnVzTGVuKTsKICB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgYXVjRGF0YSwgdXNMZW4pOwoKICBXTEFOVExfRGVidWdGcmFtZShhdWNEYXRhLCB1c0xlbik7CgogIHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCBhdWNEYXRhLCB1c0xlbik7CgojZW5kaWYKCiAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMKCiAgREVTQ1JJUFRJT04KICAgIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB3aGV0aGVyIHJlY2VpdmVkIGZyYW1lIGlzIGJyb2FkY2FzdCwgbXVsdGljYXN0CiAgICBvciB1bmljYXN0LgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcFRMQ2I6ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFRMJ3MgY29udHJvbCBibG9jawogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgIHBvaW50ZXIgdG8gdGhlIHZvcyBidWZmZXIKCiAgIElOL09VVAogICAgcHVjQmNNY1VjOiAgICAgICBwb2ludGVyIHRvIGJ1ZmZlciwgd2lsbCBjb250YWluIGZyYW1lIHR5cGUgb24gcmV0dXJuCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfQkFETVNHOiAgZmFpbGVkIHRvIGV4dHJhY3QgaW5mbyBmcm9tIGRhdGEgYnVmZmVyCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgc3VjY2VzcwoKICBTSURFIEVGRkVDVFMKICAgIE5vbmUuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjCigKICBXTEFOVExfQ2JUeXBlICpwVExDYiwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90ICAgICAqdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAqcHVjQmNNY1VjCikKewogICBWT1NfU1RBVFVTICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgdl9QVk9JRF90ICAgICBhdWNCREhlYWRlcjsKICAgdl9QVk9JRF90ICAgICBwdlBlZWtEYXRhOwogICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgU2FuaXR5IGNoZWNrCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICBpZiAoKE5VTEwgPT0gcFRMQ2IpIHx8IAogICAgICAgKE5VTEwgPT0gdm9zRGF0YUJ1ZmYpIHx8IAogICAgICAgKE5VTEwgPT0gcHVjQmNNY1VjKSkKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIGluIFdMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIikpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogICB9CgogICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgIH0KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgRXh0cmFjdCBCRCBoZWFkZXIgYW5kIGNoZWNrIGlmIHZhbGlkCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICB2b3NTdGF0dXMgPSBXREFfRFNfUGVla1J4UGFja2V0SW5mbyh2b3NEYXRhQnVmZiwgKHZfUFZPSURfdCkmYXVjQkRIZWFkZXIsIDAvKlN3YXAgQkQqLyApOwoKICAgaWYgKE5VTEwgPT0gYXVjQkRIZWFkZXIpCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIENhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9CQURNU0c7CiAgIH0KCiAgIGlmICgoMCA9PSBXREFfR0VUX1JYX0ZUX0RPTkUoYXVjQkRIZWFkZXIpKSAmJgogICAgICAgKDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbikpCiAgIHsKICAgICAgLyogSXRzIGFuIDgwMi4xMSBmcmFtZSwgZXh0cmFjdCBNQUMgYWRkcmVzcyAxICovCiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIC0gODAyLjExIGZyYW1lLCBwZWVraW5nIEFkZHIxIikpOwogICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSh2b3NEYXRhQnVmZiwgV0xBTlRMX01BQ19BRERSX0FMSUdOKDEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgVk9TX01BQ19BRERSX1NJWkUpOwogICB9CiAgIGVsc2UKICAgewogICAgICAvKiBJdHMgYW4gODAyLjMgZnJhbWUsIGV4dHJhY3QgRGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KICAgICAgVExMT0cyKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMgLSA4MDIuMyBmcmFtZSwgcGVla2luZyBEQSIpKTsKICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEodm9zRGF0YUJ1ZmYsIFdMQU5UTF9NQUNfQUREUl9BTElHTigwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgVk9TX01BQ19BRERSX1NJWkUpOwogICB9CgogICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIEZhaWxlZCB0byBwZWVrIE1BQyBhZGRyZXNzIikpOwogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICB9CgogICBpZiAoKCh0QU5JX1U4ICopcHZQZWVrRGF0YSlbMF0gPT0gMHhmZikKICAgewogICAgICAqcHVjQmNNY1VjID0gV0xBTlRMX0ZSQU1FX1RZUEVfQkNBU1Q7CiAgIH0KICAgZWxzZQogICB7CiAgICAgIGlmICgoKCh0QU5JX1U4ICopcHZQZWVrRGF0YSlbMF0gJiAweDAxKSA9PSAweDAxKQogICAgICAgICAqcHVjQmNNY1VjID0gV0xBTlRMX0ZSQU1FX1RZUEVfTUNBU1Q7CiAgICAgIGVsc2UKICAgICAgICAgKnB1Y0JjTWNVYyA9IFdMQU5UTF9GUkFNRV9UWVBFX1VDQVNUOwogICB9CgogICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIEFkZHIxQnl0ZTEgaXM6ICV4IiwgCiAgICAgICAgICAoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgojaWYgMAojaWZkZWYgV0xBTl9QRVJGIAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0Zhc3RId0Z3ZERhdGFGcmFtZQoKICBERVNDUklQVElPTiAKICAgIEZhc3QgcGF0aCBmdW5jdGlvbiB0byBxdWlja2x5IGZvcndhcmQgYSBkYXRhIGZyYW1lIGlmIEhBTCBkZXRlcm1pbmVzIEJEIAogICAgc2lnbmF0dXJlIGNvbXB1dGVkIGhlcmUgbWF0Y2hlcyB0aGUgc2lnbmF0dXJlIGluc2lkZSBjdXJyZW50IFZPU1MgcGFja2V0LiAKICAgIElmIHRoZXJlIGlzIGEgbWF0Y2gsIEhBTCBhbmQgVEwgZmlsbHMgaW4gdGhlIHN3YXBwZWQgcGFja2V0IGxlbmd0aCBpbnRvIAogICAgQkQgaGVhZGVyIGFuZCBEeEUgaGVhZGVyLCByZXNwZWN0aXZlbHkuIE90aGVyd2lzZSwgcGFja2V0IGdvZXMgYmFjayB0byAKICAgIG5vcm1hbCAoc2xvdykgcGF0aCBhbmQgYSBuZXcgQkQgc2lnbmF0dXJlIHdvdWxkIGJlIHRhZ2dlZCBpbnRvIEJEIGluIHRoaXMKICAgIFZPU1MgcGFja2V0IGxhdGVyIGJ5IHRoZSBXTEFOSEFMX0ZpbGxUeEJkKCkgZnVuY3Rpb24uCgogIERFUEVOREVOQ0lFUyAKICAgICAKICBQQVJBTUVURVJTIAoKICAgSU4KICAgICAgICBwdm9zR0N0eCAgICBWT1MgY29udGV4dAogICAgICAgIHZvc0RhdGFCdWZmIFB0ciB0byBWT1NTIHBhY2tldAogICAgICAgIHBNZXRhSW5mbyAgIEZvciBnZXR0aW5nIGZyYW1lJ3MgVElECiAgICAgICAgcFN0YUluZm8gICAgRm9yIGNoZWNraW5nIFNUQSB0eXBlCiAgICAKICAgT1VUCiAgICAgICAgcHZvc1N0YXR1cyAgcmV0dXJuZWQgc3RhdHVzCiAgICAgICAgcHVGYXN0RndkT0sgRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGZyYW1lIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkCiAgIAogIFJFVFVSTiBWQUxVRQogICAgTm8gcmV0dXJuLiAgIAoKICBTSURFIEVGRkVDVFMgCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgdm9pZApXTEFOVExfRmFzdEh3RndkRGF0YUZyYW1lCiggCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgIHZvc0RhdGFCdWZmLAogIFZPU19TVEFUVVMqICAgcHZvc1N0YXR1cywKICB2X1UzMl90KiAgICAgICBwdUZhc3RGd2RPSywKICBXTEFOVExfTWV0YUluZm9UeXBlKiAgcE1ldGFJbmZvLAogIFdMQU5fU1RBRGVzY1R5cGUqICBwU3RhSW5mbwogCikKewogICAgdl9QVk9JRF90ICAgcHZQZWVrRGF0YTsKICAgIHZfVThfdCAgICAgIHVjRHhFQkRXTEFOSGVhZGVyTGVuID0gV0xBTlRMX0JEX0hFQURFUl9MRU4oMCkgKyBzaXplb2YoV0xBTkJBTF9zRFhFSGVhZGVyVHlwZSk7IAogICAgdl9VOF90ICAgICAgdWNJc1VuaWNhc3Q7CiAgICBXTEFOQkFMX3NEWEVIZWFkZXJUeXBlICAqcER4RUhlYWRlcjsKICAgIHZfUFZPSURfdCAgIHB2QkRIZWFkZXI7CiAgICB2X1BWT0lEX3QgICBwdWNCdWZmUHRyOwogICAgdl9VMTZfdCAgICAgIHVzUGt0TGVuOwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBwYWNrZXQgbGVuZ3RoCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsICZ1c1BrdExlbik7CgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IE1BQyBhZGRyZXNzCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAqcHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTigwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2UGVla0RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTUFDX0FERFJfU0laRSApOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9ICpwdm9zU3RhdHVzICkgCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGV4dHJhY3QgTUFDIEFkZHIgJWQiLCAKICAgICAgICAgICAgICAgICAgKnB2b3NTdGF0dXMpKTsKICAgICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgICAgcmV0dXJuOwogICAgfQoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVzZXJ2ZSBoZWFkIHJvb20gZm9yIER4RSBoZWFkZXIsIEJELCBhbmQgV0xBTiBoZWFkZXIKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsICZwdWNCdWZmUHRyLCAKICAgICAgICAgICAgICAgICAgICAgICAgdWNEeEVCRFdMQU5IZWFkZXJMZW4gKTsKICAgIGlmICggTlVMTCA9PSBwdWNCdWZmUHRyICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Tm8gZW5vdWdoIHNwYWNlIGluIFZPU1MgcGFja2V0ICVwIGZvciBEeEUvQkQvV0xBTiBoZWFkZXIiLCB2b3NEYXRhQnVmZikpOwogICAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcER4RUhlYWRlciA9IChXTEFOQkFMX3NEWEVIZWFkZXJUeXBlICAqKXB1Y0J1ZmZQdHI7CiAgICBwdkJESGVhZGVyID0gKHZfUFZPSURfdCkgJnBEeEVIZWFkZXJbMV07CgogICAgLyogVU1BIFR4IGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkLiAKICAgICAqIFVNQSB3b3VsZCBoZWxwIGNvbnZlcnQgZnJhbWVzIHRvIDgwMi4xMSwgZmlsbCBwYXJ0aWFsIEJEIGZpZWxkcyBhbmQgCiAgICAgKiBjb25zdHJ1Y3QgTExDIGhlYWRlci4gVG8gZnVydGhlciBhY2NlbGVyYXRlIHRoaXMga2luZCBvZiBmcmFtZXMsCiAgICAgKiBIQUwgd291bGQgYXR0ZW1wdCB0byByZXVzZSB0aGUgQkQgZGVzY3JpcHRvciBpZiB0aGUgQkQgc2lnbmF0dXJlIAogICAgICogbWF0Y2hlcyB0byB0aGUgc2F2ZWQgQkQgZGVzY3JpcHRvci4KICAgICAqLwogICAgIGlmKHBTdGFJbmZvLT53U1RBVHlwZSA9PSBXTEFOX1NUQV9JQlNTKQogICAgICAgIHVjSXNVbmljYXN0ID0gISgoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSAmIDB4MDEpOwogICAgIGVsc2UKICAgICAgICB1Y0lzVW5pY2FzdCA9IDE7CiAKICAgICAqcHVGYXN0RndkT0sgPSAodl9VMzJfdCkgV0xBTkhBTF9UeEJkRmFzdEZ3ZChwdm9zR0N0eCwgcHZQZWVrRGF0YSwgcE1ldGFJbmZvLT51Y1RJRCwgdWNJc1VuaWNhc3QsIHB2QkRIZWFkZXIsIHVzUGt0TGVuICk7CiAgICAKICAgICAgLyogQ2FuJ3QgYmUgZmFzdCBmb3J3YXJkZWQuIFRyaW0gdGhlIFZPUyBoZWFkIGJhY2sgdG8gb3JpZ2luYWwgbG9jYXRpb24uICovCiAgICAgIGlmKCEgKnB1RmFzdEZ3ZE9LKXsKICAgICAgICAgIHZvc19wa3RfdHJpbV9oZWFkKHZvc0RhdGFCdWZmLCB1Y0R4RUJEV0xBTkhlYWRlckxlbik7CiAgICAgIH1lbHNlewogICAgICAgIC8qIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkLiBOb3cgbm90aWZ5IEJBTCBEeEUgaGVhZGVyIGZpbGxpbmcgY291bGQgYmUgY29tcGxldGVseSBza2lwcGVkCiAgICAgICAgICovCiAgICAgICAgdl9VMzJfdCB1UGFja2V0U2l6ZSA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKDApICsgdXNQa3RMZW47CiAgICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCiAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1UGFja2V0U2l6ZSk7CiAgICAgICAgcER4RUhlYWRlci0+c2l6ZSAgPSBTV0FQX0VORElBTl9VSU5UMzIodVBhY2tldFNpemUpOwogICAgICB9CiAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgIHJldHVybjsKfQojZW5kaWYgLypXTEFOX1BFUkYqLwojZW5kaWYKCiNpZiAwCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgRlVOQ1RJT04gICAgV0xBTlRMX1ByZXBhcmVCREhlYWRlcgoKICBERVNDUklQVElPTgogICAgSW5saW5lIGZ1bmN0aW9uIGZvciBwcmVwYXJpbmcgQkQgaGVhZGVyIGJlZm9yZSBIQUwgcHJvY2Vzc2luZy4KCiAgREVQRU5ERU5DSUVTCiAgICBKdXN0IG5vdGlmeSBIQUwgdGhhdCBzdXNwZW5kIGluIFRMIGlzIGNvbXBsZXRlLgoKICBQQVJBTUVURVJTCgogICBJTgogICAgdm9zRGF0YUJ1ZmY6ICAgICAgdm9zIGRhdGEgYnVmZmVyCiAgICB1Y0Rpc2FibGVGcm1YdGw6ICBpcyBmcmFtZSB4dGwgZGlzYWJsZWQKCiAgIE9VVAogICAgcHB2QkRIZWFkZXI6ICAgICAgaXQgd2lsbCBjb250YWluIHRoZSBCRCBoZWFkZXIKICAgIHB2RGVzdE1hY0FkZGRyOiAgIGl0IHdpbGwgY29udGFpbiB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKICAgIHB2b3NTdGF0dXM6ICAgICAgIHN0YXR1cyBvZiB0aGUgY29tYmluZWQgcHJvY2Vzc2luZwogICAgcHVzUGt0TGVuOiAgICAgICAgcGFja2V0IGxlbi4KCiAgUkVUVVJOIFZBTFVFCiAgICBObyByZXR1cm4uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQKV0xBTlRMX1ByZXBhcmVCREhlYWRlcgooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAogIHZfUFZPSURfdCogICAgICBwcHZCREhlYWRlciwKICB2X01BQ0FERFJfdCogICAgcHZEZXN0TWFjQWRkZHIsCiAgdl9VOF90ICAgICAgICAgIHVjRGlzYWJsZUZybVh0bCwKICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKICB2X1UxNl90KiAgICAgICAgcHVzUGt0TGVuLAogIHZfVThfdCAgICAgICAgICB1Y1Fvc0VuYWJsZWQsCiAgdl9VOF90ICAgICAgICAgIHVjV0RTRW5hYmxlZCwKICB2X1U4X3QgICAgICAgICAgZXh0cmFIZWFkU3BhY2UKKQp7CiAgdl9VOF90ICAgICAgdWNIZWFkZXJPZmZzZXQ7CiAgdl9VOF90ICAgICAgdWNIZWFkZXJMZW47CiAgdl9VOF90ICAgICAgdWNCREhlYWRlckxlbiA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKHVjRGlzYWJsZUZybVh0bCk7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgR2V0IGhlYWRlciBwb2ludGVyIGZyb20gVk9TUwogICAgISEhIG1ha2Ugc3VyZSByZXNlcnZlIGhlYWQgemVyb3Mgb3V0IHRoZSBtZW1vcnkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsIHB1c1BrdExlbik7CgogIGlmICggV0xBTlRMX01BQ19IRUFERVJfTEVOKHVjRGlzYWJsZUZybVh0bCkgPiAqcHVzUGt0TGVuICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBMZW5ndGggb2YgdGhlIHBhY2tldCBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQgbmV0d29yayIKICAgICAgICAgICAgICAgIiBoZWFkZXIgJWQiLCAqcHVzUGt0TGVuICkpOwoKICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgcmV0dXJuOwogIH0KCiAgdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHZvc0RhdGFCdWZmLCBwcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgdWNCREhlYWRlckxlbiApOwogIGlmICggTlVMTCA9PSAqcHB2QkRIZWFkZXIgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOlZPU1MgcGFja2V0IGNvcnJ1cHRlZCBvbiBBdHRhY2ggQkQgaGVhZGVyIikpOwogICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICByZXR1cm47CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IE1BQyBhZGRyZXNzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB7CiAgIHZfU0laRV90IHVzTWFjQWRkclNpemUgPSBWT1NfTUFDX0FERFJfU0laRTsKICAgKnB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0JESGVhZGVyTGVuICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTih1Y0Rpc2FibGVGcm1YdGwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwdkRlc3RNYWNBZGRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c01hY0FkZHJTaXplICk7CiAgfQogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9ICpwdm9zU3RhdHVzICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBNQUMgQWRkciAlZCIsCiAgICAgICAgICAgICAgICAqcHZvc1N0YXR1cykpOwogIH0KICBlbHNlCiAgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBGaWxsIE1QRFUgaW5mbyBmaWVsZHM6CiAgICAgICAgICAtIE1QRFUgZGF0YSBzdGFydCBvZmZzZXQKICAgICAgICAgIC0gTVBEVSBoZWFkZXIgc3RhcnQgb2Zmc2V0CiAgICAgICAgICAtIE1QRFUgaGVhZGVyIGxlbmd0aAogICAgICAgICAgLSBNUERVIGxlbmd0aCAtIHRoaXMgaXMgYSAxNmIgZmllbGQgLSBuZWVkcyBzd2FwcGluZwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdWNIZWFkZXJPZmZzZXQgPSB1Y0JESGVhZGVyTGVuOwogICAgdWNIZWFkZXJMZW4gICAgPSBXTEFOVExfTUFDX0hFQURFUl9MRU4odWNEaXNhYmxlRnJtWHRsKTsKCiAgICBpZiAoIDAgIT0gdWNEaXNhYmxlRnJtWHRsICkKICAgIHsKICAgICAgaWYgKCAwICE9IHVjUW9zRW5hYmxlZCApCiAgICAgIHsKICAgICAgICB1Y0hlYWRlckxlbiArPSBXTEFOVExfODAyXzExX0hFQURFUl9RT1NfQ1RMOwogICAgICB9CgogICAgICAvLyBTaW1pbGFyIHRvIFFvcyB3ZSBuZWVkIHNvbWV0aGluZyBmb3IgV0RTIGZvcm1hdCAhCiAgICAgIGlmICggdWNXRFNFbmFibGVkICE9IDAgKQogICAgICB7CiAgICAgICAgLy8gSWYgd2UgaGF2ZSBmcmFtZSB0cmFuc2xhdGlvbiBlbmFibGVkCiAgICAgICAgdWNIZWFkZXJMZW4gICAgKz0gV0xBTlRMXzgwMl8xMV9IRUFERVJfQUREUjRfTEVOOwogICAgICB9CiAgICAgIGlmICggZXh0cmFIZWFkU3BhY2UgIT0gMCApCiAgICAgIHsKICAgICAgICAvLyBEZWNyZWFzZSB0aGUgcGFja2V0IGxlbmd0aCB3aXRoIHRoZSBleHRyYSBwYWRkaW5nIGFmdGVyIHRoZSBoZWFkZXIKICAgICAgICAqcHVzUGt0TGVuID0gKnB1c1BrdExlbiAtIGV4dHJhSGVhZFNwYWNlOwogICAgICB9CiAgICB9CgogICAgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9IRUFERVJfTEVOKCAqcHB2QkRIZWFkZXIsIHVjSGVhZGVyTGVuKTsKICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfSEVBREVSX09GRlNFVCggKnBwdkJESGVhZGVyLCB1Y0hlYWRlck9mZnNldCk7CiAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0RBVEFfT0ZGU0VUKCAqcHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjSGVhZGVyT2Zmc2V0ICsgdWNIZWFkZXJMZW4gKyBleHRyYUhlYWRTcGFjZSk7CiAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0xFTiggKnBwdkJESGVhZGVyLCAqcHVzUGt0TGVuKTsKCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6IFZBTFVFUyBBUkUgSExlbj0leCBIb2ZmPSV4IGRvZmY9JXggbGVuPSV4IGV4PSVkIiwKICAgICAgICAgICAgICAgIHVjSGVhZGVyTGVuLCB1Y0hlYWRlck9mZnNldCwgCiAgICAgICAgICAgICAgICAodWNIZWFkZXJPZmZzZXQgKyB1Y0hlYWRlckxlbiArIGV4dHJhSGVhZFNwYWNlKSwgCiAgICAgICAgICAgICAgICAqcHVzUGt0TGVuLCBleHRyYUhlYWRTcGFjZSkpOwogIH0vKiBpZiBwZWVrIE1BQyBzdWNjZXNzKi8KCn0vKiBXTEFOVExfUHJlcGFyZUJESGVhZGVyICovCiNlbmRpZgoKLy9USElTIElTIEEgSEFDSyBBTkQgTkVFRFMgVE8gQkUgRklYRUQgRk9SIENPTkNVUlJFTkNZCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOX1RMR2V0TmV4dFR4SWRzCgogIERFU0NSSVBUSU9OCiAgICBHZXRzIHRoZSBuZXh0IHN0YXRpb24gYW5kIG5leHQgQUMgaW4gdGhlIGxpc3QgdGhhdCBzaG91bGQgYmUgc2VydmVkIGJ5IHRoZSBUTC4KCiAgICBNdWx0aXBsZSBTdGF0aW9uIFNjaGVkdWxpbmcgYW5kIFRMIHF1ZXVlIG1hbmFnZW1lbnQuIAoKICAgIDQgSEREIEJDL01DIGRhdGEgcGFja2V0IHF1ZXVlIHN0YXR1cyBpcyBzcGVjaWZpZWQgYXMgU3RhdGlvbiAwJ3Mgc3RhdHVzLiBXZWlnaHRzIHVzZWQKICAgIGluIFdGUSBhbGdvcml0aCBhcmUgaW5pdGlhbGl6ZWQgaW4gV0xBTlRMX09QRU4gYW5kIGNvbnRhaW5lZCBpbiB0bENvbmZpZ0luZm8gZmllbGQuCiAgICBFYWNoIHN0YXRpb24gaGFzIGZpZWxkcyBvZiB1Y1BrdFBlbmRpbmcgYW5kIEFDIG1hc2sgdG8gdGVsbCB3aGV0aGVyIGEgQUMgaGFzIHRyYWZmaWMKICAgIG9yIG5vdC4KICAgICAgCiAgICBTdGF0aW9ucyBhcmUgc2VydmVkIGluIGEgcm91bmQtcm9iaW4gZmFzaGlvbiBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgdG8gbG93ZXN0IHByaW9yaXR5LgogICAgVGhlIG51bWJlciBvZiByb3VuZC1yb2JpbiB0aW1lcyBvZiBlYWNoIHByaW9pcnR5IGVxdWFscyB0byB0aGUgV0ZRIHdlaWdodHMgYW5kIGRpZmZlcmV0aWF0ZXMKICAgIHRoZSB0cmFmZmljIG9mIGRpZmZlcmVudCBwcmlvaXJ0eS4gQXMgc3VjaCwgc3RhdGlvbnMgY2FuIG5vdCBwcm92aWRlIGxvdyBwcmlvcml0eSBwYWNrZXRzIGlmCiAgICBoaWdoIHByaW9yaXR5IHBhY2tldHMgYXJlIGFsbCBzZXJ2ZWQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICBPVVQKICAgcHVjU1RBSWQ6ICAgIFN0YXRpb24gSUQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QKCiAgU0lERSBFRkZFQ1RTCiAgIAogICBUTCBjb250ZXh0IGNvbnRhaW5zIGN1cnJlbnRseSBzZXJ2ZWQgc3RhdGlvbiBJRCBpbiB1Y0N1cnJlbnRTVEEgZmllbGQsIGN1cnJlbnRseSBzZXJ2ZWQgQUMKICAgaW4gdUN1clNlcnZlZEFDIGZpZWxkLCBhbmQgdW5zZXJ2ZWQgd2VpZ2h0cyBvZiBjdXJyZW50IEFDIGluIHVDdXJMZWZ0V2VpZ2h0LgogICBXaGVuIGV4aXN0aW5nIGZyb20gdGhlIGZ1bmN0aW9uLCB0aGVzZSB0aHJlZSBmaWVsZHMgYXJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOX1RMQVBHZXROZXh0VHhJZHMKKAogIHZfUFZPSURfdCAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgcHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiOwogIHZfVThfdCAgICAgICAgICB1Y0FDRmlsdGVyID0gMTsKICB2X1U4X3QgICAgICAgICAgdWNOZXh0U1RBIDsgCiAgdl9CT09MX3QgICAgICAgIGlzU2VydmVkID0gVFJVRTsgIC8vY3VycmVudCByb3VuZCBoYXMgZmluZCBhIHBhY2tldCBvciBub3QKICB2X1U4X3QgICAgICAgICAgdWNBQ0xvb3BOdW0gPSBXTEFOVExfQUNfVk8gKyAxOyAvL251bWJlciBvZiBsb29wIHRvIGdvCiAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzazsgLy8gVFggRmxvd01hc2sgZnJvbSBXREEKICB1aW50OCAgICAgICAgICAgdWNBQ01hc2s7IAogIHVpbnQ4ICAgICAgICAgICBpID0gMDsgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy9FTlRFUigpOwoKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOX1RMQVBHZXROZXh0VHhJZHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX0dldFR4Rmxvd01hc2soIHB2b3NHQ3R4LCAmdUZsb3dNYXNrICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6RmFpbGVkIHRvIHJldHJpZXZlIEZsb3cgY29udHJvbCBtYXNrIGZyb20gV0RBIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHVjTmV4dFNUQSA9IHBUTENiLT51Y0N1cnJlbnRTVEE7CgogICsrdWNOZXh0U1RBOwoKICBpZiAoIFdMQU5fTUFYX1NUQV9DT1VOVCA8PSB1Y05leHRTVEEgKQogIHsKICAgIC8vb25lIHJvdW5kIGlzIGRvbmUuCiAgICB1Y05leHRTVEEgPSAwOwogICAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodC0tOwogICAgaXNTZXJ2ZWQgPSBGQUxTRTsKICAgIGlmICggMCA9PSBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ICkKICAgIHsKICAgICAgLy9jdXJyZW50IHByaW9pcnR5IGlzIGRvbmUKICAgICAgaWYgKCBXTEFOVExfQUNfQksgPT0gKFdMQU5UTF9BQ0VudW1UeXBlKXBUTENiLT51Q3VyU2VydmVkQUMgKQogICAgICB7CiAgICAgICAgLy9lbmQgb2YgY3VycmVudCBWTywgVkksIEJFLCBCSyBsb29wLiBSZXNldCBwcmlvcml0eS4KICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDID0gV0xBTlRMX0FDX1ZPOwogICAgICB9CiAgICAgIGVsc2UgCiAgICAgIHsKICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDIC0tOwogICAgICB9CgogICAgICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID0gIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbcFRMQ2ItPnVDdXJTZXJ2ZWRBQ107CiAKICAgIH0gLy8gKDAgPT0gcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCkKICB9IC8vKCBXTEFOX01BWF9TVEFfQ09VTlQgPT0gdWNOZXh0U1RBICkKCiAgLy9kZWNpZGUgaG93IG1hbnkgbG9vcHMgdG8gZ28uIGlmIGN1cnJlbnQgbG9vcCBpcyBwYXJ0aWFsLCBkbyBvbmUgZXh0cmEgdG8gbWFrZSBzdXJlCiAgLy93ZSBjb3ZlciBldmVyeSBzdGF0aW9uCiAgaWYgKCgxID09IHBUTENiLT51Y0N1ckxlZnRXZWlnaHQpICYmICh1Y05leHRTVEEgIT0gMCkpCiAgewogICAgdWNBQ0xvb3BOdW0gKys7IC8vIG5vdyBpcyA1IGxvb3BzCiAgfQoKICAvKiBTdGFydCB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkuIHVjTmV4dFNUQSwgcFRMQ2ItPnVDdXJTZXJ2ZWRBQywgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodAogICAgIGFsbCBoYXZlIHByZXZpb3VzIHZhbHVlcy4qLwogIGZvciAoOyB1Y0FDTG9vcE51bSA+IDA7ICB1Y0FDTG9vcE51bS0tKQogIHsKCiAgICB1Y0FDRmlsdGVyID0gMSA8PCBwVExDYi0+dUN1clNlcnZlZEFDOwoKICAgIC8vIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQga2VlcHMgcHJldmlvdXMgcmVzdWx0cy4KICAgIGZvciAoOyAocFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA+IDApICYmICh1Rmxvd01hc2sgJiB1Y0FDRmlsdGVyKTsgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodC0tICkKICAgIHsKCiAgICAgIGZvciAoIDsgdWNOZXh0U1RBIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyB1Y05leHRTVEEgKysgKQogICAgICB7CiAgICAgICAgaWYoTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdKQogICAgICAgIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLCB1Y0FDTWFzaywgaSk7CgogICAgICAgIGlmICggKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNFeGlzdHMpIHx8CiAgICAgICAgICAgICAoKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNQa3RQZW5kaW5nKSAmJiAhKHVjQUNNYXNrKSkgfHwKICAgICAgICAgICAgICgwID09ICh1Y0FDTWFzayAmIHVjQUNGaWx0ZXIpKSApCgogICAgICAgIHsKICAgICAgICAgIC8vY3VycmVudCBzdGF0aW9uIGRvZXMgbm90IGV4aXN0IG9yIGhhdmUgYW55IHBhY2tldCB0byBzZXJ2ZS4KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT50bFN0YXRlKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIiVzIFN0YSAlZCBub3QgaW4gYXV0aCBzdGF0ZSBzbyBza2lwcGluZyBpdC4iLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCB1Y05leHRTVEEpKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy9nbyB0byBuZXh0IHN0YXRpb24gaWYgY3VycmVudCBzdGF0aW9uIGNhbid0IHNlbmQgZHVlIHRvIGZsb3cgY29udHJvbAogICAgICAgIC8vU3RhdGlvbiBpcyBhbGxvd2VkIHRvIHNlbmQgd2hlbiBpdCBpcyBub3QgaW4gTFdNIG1vZGUuIFdoZW4gc3RhdGlvbiBpcyBpbiBMV00gbW9kZSwKICAgICAgICAvL3N0YXRpb24gaXMgYWxsb3dlZCB0byBzZW5kIG9ubHkgYWZ0ZXIgRlcgcmVwb3J0cyBGVyBtZW1vcnkgaXMgYmVsb3cgdGhyZXNob2xkIGFuZCBvbi1mbHkKICAgICAgICAvL3BhY2tldHMgYXJlIGxlc3MgdGhlbiBhbGxvd2VkIHZhbHVlCiAgICAgICAgaWYgKCAoVFJVRSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y0x3bU1vZGVFbmFibGVkKSAmJgogICAgICAgICAgICAgKChGQUxTRSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y0x3bUV2ZW50UmVwb3J0ZWQpIHx8CiAgICAgICAgICAgICAgICAgKDAgPCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51QnVmZlRocmVzaG9sZE1heCkpCiAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCgogICAgICAgIC8vIEZpbmQgYSBzdGF0aW9uLiBXZWlnaHQgaXMgdXBkYXRlZCBhbHJlYWR5LgogICAgICAgICpwdWNTVEFJZCA9IHVjTmV4dFNUQTsKICAgICAgICBwVExDYi0+dWNDdXJyZW50U1RBID0gdWNOZXh0U1RBOwogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDID0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQzsKICAKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAiIFRMIHNlcnZlIG9uZSBzdGF0aW9uIEFDOiAlZCAgVzogJWQgU3RhSWQ6ICVkIiwKICAgICAgICAgICAgICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMsIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQsIHBUTENiLT51Y0N1cnJlbnRTVEEgKSk7CiAgICAgIAogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgIH0gLy9TVEEgbG9vcAoKICAgICAgdWNOZXh0U1RBID0gMDsKICAgICAgaWYgKCBGQUxTRSA9PSBpc1NlcnZlZCApCiAgICAgIHsKICAgICAgICAvL2N1cnJlbnQgbG9vcCBmaW5kcyBubyBwYWNrZXQubm8gbmVlZCB0byByZXBlYXQgZm9yIHRoZSBzYW1lIHByaW9yaXR5CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgLy9jdXJyZW50IGxvb3AgaXMgcGFydGlhbCBsb29wLiBnbyBmb3Igb25lIG1vcmUgbG9vcC4KICAgICAgaXNTZXJ2ZWQgPSBGQUxTRTsKCiAgICB9IC8vV2VpZ2h0IGxvb3AKCiAgICBpZiAoV0xBTlRMX0FDX0JLID09IHBUTENiLT51Q3VyU2VydmVkQUMpCiAgICB7CiAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfVk87CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMtLTsKICAgIH0KICAgIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgPSAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1twVExDYi0+dUN1clNlcnZlZEFDXTsKCiAgfS8vIEFDIGxvb3AKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICIgVEwgY2FuJ3QgZmluZCBvbmUgc3RhdGlvbiB0byBzZXJ2ZSIgKSk7CgogIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfQks7CiAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA9IDE7CiAgLy9pbnZhbGlkIG51bWJlciB3aWxsIGJlIGNhcHR1cmVkIGJ5IGNhbGxlcgogIHBUTENiLT51Y0N1cnJlbnRTVEEgPSBXTEFOX01BWF9TVEFfQ09VTlQ7IAoKICAqcHVjU1RBSWQgPSBwVExDYi0+dWNDdXJyZW50U1RBOwogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTl9UTEdldE5leHRUeElkcwoKICBERVNDUklQVElPTgogICAgR2V0cyB0aGUgbmV4dCBzdGF0aW9uIGFuZCBuZXh0IEFDIGluIHRoZSBsaXN0CgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICBPVVQKICAgcHVjU1RBSWQ6ICAgIFN0YXRpb24gSUQKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTl9UTEdldE5leHRUeElkcwooCiAgdl9QVk9JRF90ICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICBwdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2I7CiAgdl9VOF90ICAgICAgICAgIHVjTmV4dEFDOwogIHZfVThfdCAgICAgICAgICB1Y05leHRTVEE7IAogIHZfVThfdCAgICAgICAgICB1Y0NvdW50OyAKICB2X1U4X3QgICAgICAgICAgdUZsb3dNYXNrOyAvLyBUWCBGbG93TWFzayBmcm9tIFdEQQogIHZfVThfdCAgICAgICAgICB1Y0FDTWFzayA9IDA7CiAgdl9VOF90ICAgICAgICAgIGkgPSAwOyAKCiAgdEJzc1N5c3RlbVJvbGUgc3lzdGVtUm9sZTsgLy9SRyBIQUNLIHRvIGJlIHJlbW92ZWQKICB0cEFuaVNpckdsb2JhbCBwTWFjOwoKICBwTWFjID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcE1hYyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBNYWMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHN5c3RlbVJvbGUgPSB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOX1RMR2V0TmV4dFR4SWRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKGVTWVNURU1fQVBfUk9MRSA9PSBzeXN0ZW1Sb2xlKSB8fAogICAgICAodm9zX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKCkpIHx8IHBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiNlbHNlCiAgaWYgKChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkgfHwKICAgICAgKHZvc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSkKI2VuZGlmCiAgewogICAgcmV0dXJuIFdMQU5fVExBUEdldE5leHRUeElkcyhwdm9zR0N0eCxwdWNTVEFJZCk7CiAgfQoKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX0dldFR4Rmxvd01hc2soIHB2b3NHQ3R4LCAmdUZsb3dNYXNrICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6RmFpbGVkIHRvIHJldHJpZXZlIEZsb3cgY29udHJvbCBtYXNrIGZyb20gV0RBIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qU1RBIGlkIC0gbm8gcHJpb3JpdHkgeWV0IGltcGxlbWVudGVkICovCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hvb3NlIHRoZSBuZXh0IFNUQSBmb3IgdHggLSBmb3Igbm93IGdvIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbgogICAgdGhyb3VnaCBhbGwgdGhlIHN0YXRpb25zIHRoYXQgaGF2ZSBwZW5kaW5nIHBhY2tldHMgICAgIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHVjTmV4dFNUQSA9IHBUTENiLT51Y0N1cnJlbnRTVEE7CiAgCiAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IFdMQU5fTUFYX1NUQV9DT1VOVDsgCiAgZm9yICggdWNDb3VudCA9IDA7IAogICAgICAgIHVjQ291bnQgPCBXTEFOX01BWF9TVEFfQ09VTlQ7CiAgICAgICAgdWNDb3VudCsrICkKICB7CiAgICB1Y05leHRTVEEgPSAoICh1Y05leHRTVEErMSkgPj0gV0xBTl9NQVhfU1RBX0NPVU5UICk/MDoodWNOZXh0U1RBKzEpOwogICAgaWYoTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdKQogICAgewogICAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKCggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNFeGlzdHMgKSAmJgogICAgICAgICggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNQa3RQZW5kaW5nICkpCiAgICB7CiAgICAgIGlmIChXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dGxTdGF0ZSkKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJTVEEgSUQ6ICVkIG9uIFdMQU5fVExHZXROZXh0VHhJZHMiLCAqcHVjU1RBSWQpKTsKICAgICAgICBwVExDYi0+dWNDdXJyZW50U1RBID0gdWNOZXh0U1RBOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICIlcyBTdGEgJWQgaXMgbm90IGluIGF1dGggc3RhdGUsIHNraXBwaW5nIHRoaXMgc3RhLiIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCB1Y05leHRTVEEpKTsKICAgICAgfQogICAgfQogIH0KCiAgKnB1Y1NUQUlkID0gcFRMQ2ItPnVjQ3VycmVudFNUQTsKCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoICpwdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiV0xBTiBUTDpObyBzdGF0aW9uIHJlZ2lzdGVyZWQgd2l0aCBUTCBhdCB0aGlzIHBvaW50IikpOwoKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CgogIH0KCiAgLypDb252ZXJ0IHRoZSBhcnJheSB0byBhIG1hc2sgZm9yIGVhc2llciBvcGVyYXRpb24qLwogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLCB1Y0FDTWFzaywgaSk7CiAgCiAgaWYgKCAwID09IHVjQUNNYXNrICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOiBNYXNrIDAgIgogICAgICAiU1RBIElEOiAlZCBvbiBXTEFOX1RMR2V0TmV4dFR4SWRzIiwgKnB1Y1NUQUlkKSk7CgogICAgIC8qc2V0dGluZyBTVEEgaWQgdG8gaW52YWxpZCBpZiBtYXNrIGlzIDAqLwogICAgICpwdWNTVEFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKCiAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFDIGlzIHVwZGF0ZWQgd2hlbmV2ZXIgYSBwYWNrZXQgaXMgZmV0Y2hlZCBmcm9tIEhERCAtPiB0aGUgY3VycmVudAogICAgd2VpZ2h0IG9mIHN1Y2ggYW4gQUMgY2Fubm90IGJlIDAgLT4gaW4gdGhpcyBjYXNlIFRMIGlzIGV4cGVjdGVkIHRvCiAgICBleGl0IHRoaXMgZnVuY3Rpb24gYXQgdGhpcyBwb2ludCBkdXJpbmcgdGhlIG1haW4gVHggbG9vcAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgPCBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQgICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogTWFpbnRhaW5pbmcgc2VydmljZWQgQUMgdG86ICVkIGZvciBXZWlnaHQ6ICVkIiwKICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMgLAogICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgQ2hvb3NlIGhpZ2hlc3QgcHJpb3JpdHkgQUMgLSAhISEgb3B0aW1pemUgbWUKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNOZXh0QUMgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQzsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiTmV4dCBBQzogJWQiLCB1Y05leHRBQykpOwoKICB3aGlsZSAoIDAgIT0gdWNBQ01hc2sgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiIEFDIE1hc2s6ICVkIE5leHQ6ICVkIFJlcyA6ICVkIiwKICAgICAgICAgICAgICAgdWNBQ01hc2ssICggMSA8PCB1Y05leHRBQyApLCAoIHVjQUNNYXNrICYgKCAxIDw8IHVjTmV4dEFDICkpKSk7CgogICAgaWYgKCAwICE9ICggdWNBQ01hc2sgJiAoIDEgPDwgdWNOZXh0QUMgKSAmIHVGbG93TWFzayApKQogICAgewogICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMgICAgID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTlRMX0FDRW51bVR5cGUpdWNOZXh0QUM7CiAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQgPQogICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNOZXh0QUNdOwoKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogU3dpdGNoaW5nIHNlcnZpY2VkIEFDIHRvOiAlZCB3aXRoIFdlaWdodDogJWQiLAogICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQyAsCiAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudFdlaWdodCkpOwogICAgICAgYnJlYWs7CiAgICB9CgogICAgdWNOZXh0QUMgPSAoIHVjTmV4dEFDIC0gMSApICYgV0xBTlRMX01BU0tfQUM7CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIk5leHQgQUMgJWQiLCB1Y05leHRBQykpOwoKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiIEMgQUM6ICVkIEMgVzogJWQiLAogICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMsCiAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5fVExHZXROZXh0VHhJZHMgKi8KCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBERUZBVUxUIEhBTkRMRVJTOiBSZWdpc3RlcmVkIGF0IGluaXRpYWxpemF0aW9uIHdpdGggVEwKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IKCiAgREVTQ1JJUFRJT04KICAgIERlZmF1bHQgTWdtdCBGcm0gcnggY2FsbGJhY2s6IGFzc2VydHMgYWxsIHRoZSB0aW1lLiBJZiB0aGlzIGZ1bmN0aW9uIGdldHMKICAgIGNhbGxlZCAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCByeCBjYiBwb2ludGVyIGZvciBNZ210IEZybS4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgIE5vdCB1c2VkLgoKICBSRVRVUk4gVkFMVUUKCiAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiBBbHdheXMgRkFJTFVSRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IKKAogIHZfUFZPSURfdCAgcHZvc0dDdHgsCiAgdl9QVk9JRF90ICB2b3NCdWZmCikKewogIGlmICggTlVMTCAhPSB2b3NCdWZmICkKICB7CiAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAiV0xBTiBUTDpGYXRhbCBmYWlsdXJlOiBObyByZWdpc3RlcmVkIE1nbXQgRnJtIGNsaWVudCBvbiBwa3QgUlgiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCh2b3NfcGt0X3QgKil2b3NCdWZmKTsKICB9CgogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyByZWdpc3RlcmVkIE1nbXQgRnJtIGNsaWVudCBvbiBwa3QgUlguIExvYWQvVW5sb2FkIGluIHByb2dyZXNzLCBJZ25vcmUiKSk7CgogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKfS8qV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgV0xBTlRMX0JBUFJ4RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IEJBUCByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIEJBUC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgIE5vdCB1c2VkLgoKICBSRVRVUk4gVkFMVUUKCiAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiBBbHdheXMgRkFJTFVSRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9CQVBSeERlZmF1bHRDYgooCiAgdl9QVk9JRF90ICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgIHZvc0RhdGFCdWZmLAogIFdMQU5UTF9CQVBGcmFtZUVudW1UeXBlIGZyYW1lVHlwZQopCnsKICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAiV0xBTiBUTDpGYXRhbCBmYWlsdXJlOiBObyByZWdpc3RlcmVkIEJBUCBjbGllbnQgb24gQkFQIHBrdCBSWCIpKTsKI2lmbmRlZiBCVEFNUF9URVNUCiAgVk9TX0FTU0VSVCgwKTsKI2VuZGlmCiAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IFNUQSByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIHN0YXRpb24uCiAgICAoTWVtIGNvcnJ1cHRpb24gbW9zdCBsaWtlbHksIGl0IHNob3VsZCBuZXZlciBoYXBwZW4pCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgICBOb3QgdXNlZC4KCiAgUkVUVVJOIFZBTFVFCgogICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVJ4RGVmYXVsdENiCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSogIHBSeE1ldGFJbmZvCikKewogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICJXTEFOIFRMOiBObyByZWdpc3RlcmVkIFNUQSBjbGllbnQgcnggY2IgZm9yIFNUQUlEOiAlZCBkcm9wcGluZyBwa3QiLAogICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFGZXRjaFBrdERlZmF1bHRDYgoKICBERVNDUklQVElPTgogICAgRGVmYXVsdCBmZXRjaCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIGZldGNoIGNiIHBvaW50ZXIgZm9yIHN0YXRpb24uCiAgICAoTWVtIGNvcnJ1cHRpb24gbW9zdCBsaWtlbHksIGl0IHNob3VsZCBuZXZlciBoYXBwZW4pCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgICBOb3QgdXNlZC4KCiAgUkVUVVJOIFZBTFVFCgogICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgICAgICAgICAgcHVjU1RBSWQsCiAgV0xBTlRMX0FDRW51bVR5cGUgICAgICB1Y0FDLAogIHZvc19wa3RfdCoqICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCiAgV0xBTlRMX01ldGFJbmZvVHlwZSogICB0bE1ldGFJbmZvCikKewogIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICJXTEFOIFRMOkZhdGFsIGZhaWx1cmU6IE5vIHJlZ2lzdGVyZWQgU1RBIGNsaWVudCBvbiBkYXRhIHBrdCBSWCIpKTsKICBWT1NfQVNTRVJUKDApOwogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKfS8qV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9UeENvbXBEZWZhdWx0Q2IKCiAgREVTQ1JJUFRJT04KICAgIERlZmF1bHQgdHggY29tcGxldGUgaGFuZGxlci4gSXQgd2lsbCByZWxlYXNlIHRoZSBjb21wbGV0ZWQgcGt0IHRvCiAgICBwcmV2ZW50IG1lbW9yeSBsZWFrcy4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0bwogICAgICAgICAgICAgICAgICAgIFRML0hBTC9QRS9CQVAvSEREIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tCiAgICAgICAgICAgICAgICAgICAgaXRzIGNvbnRleHQKICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIFZPU1MgZGF0YSBidWZmZXIgdGhhdCB3YXMgdHJhbnNtaXR0ZWQKICAgIHdUeFNUQXR1czogICAgICBzdGF0dXMgb2YgdGhlIHRyYW5zbWlzc2lvbgoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbjsgcGxlYXNlCiAgICBjaGVjayB2b3NfcGt0X3JldHVybl9wYWNrZXQgZm9yIHBvc3NpYmxlIGVycm9yIGNvZGVzLgoKICAgIFBsZWFzZSBjaGVjayAgdm9zX3BrdF9yZXR1cm5fcGFja2V0IEFQSSBmb3IgcG9zc2libGUgcmV0dXJuIHZhbHVlcy4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeENvbXBEZWZhdWx0Q2IKKAogdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiB2b3NfcGt0X3QqICAgICB2b3NEYXRhQnVmZiwKIFZPU19TVEFUVVMgICAgIHdUeFNUQXR1cwopCnsKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAiV0xBTiBUTDpUWENvbXAgbm90IHJlZ2lzdGVyZWQsIHJlbGVhc2luZyBwa3QgdG8gcHJldmVudCBtZW0gbGVhayIpKTsKICByZXR1cm4gdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKfS8qV0xBTlRMX1R4Q29tcERlZmF1bHRDYiovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBDbGVhbnVwIGZ1bmN0aW9ucwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFuQ0IKCiAgREVTQ1JJUFRJT04KICAgIENsZWFucyBUTCBjb250cm9sIGJsb2NrCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHBUTENiOiAgICAgICBwb2ludGVyIHRvIFRMJ3MgY29udHJvbCBibG9jawogICAgdWNFbXB0eTogICAgIHNldCBpZiBUTCBoYXMgdG8gY2xlYW4gdXAgdGhlIHF1ZXVlcyBhbmQgcmVsZWFzZSBwZWRuaW5nIHBrdHMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbGVhbkNCCigKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgdWNFbXB0eQopCnsKICB2X1U4X3QgdWNJbmRleDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0NsZWFuQ0IiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyogbnVtYmVyIG9mIHBhY2tldHMgc2VudCB0byBCQUwgd2FpdGluZyBmb3IgdHggY29tcGxldGUgY29uZmlybWF0aW9uICovCiAgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCA9IDA7CgogIC8qIGdsb2JhbCBzdXNwZW5kIGZsYWcgKi8KICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMSk7CgogIC8qIHJlc291cmNlIGZsYWcgKi8KICBwVExDYi0+dVJlc0NvdW50ID0gMDsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xpZW50IHN0YXRpb25zCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfU1RBX0NPVU5UIDsgdWNJbmRleCsrKQogIHsKICAgIGlmKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0pCiAgICB7CiAgICAgICAgV0xBTlRMX0NsZWFuU1RBKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSwgdWNFbXB0eSk7CiAgICB9CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1hbmFnZW1lbnQgRnJhbWUgY2xpZW50CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgPSAwOwoKICBpZiAoICggMCAhPSB1Y0VtcHR5KSAmJgogICAgICAgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkpCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKICB9CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICA9IE5VTEw7CgogIC8qIHNldCB0byBhIGRlZmF1bHQgY2IgaW4gb3JkZXIgdG8gcHJldmVudCBjb25zdGFudCBjaGVja2luZyBmb3IgTlVMTCAqLwogIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUnggPSBXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEJUIEFNUCBjbGllbnQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzID0gMDsKCiAgaWYgKCggMCAhPSB1Y0VtcHR5KSAmJgogICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApKQogIHsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKICB9CiAgCiAgaWYgKCggMCAhPSB1Y0VtcHR5KSAmJgogICAgICAoIE5VTEwgIT0gcFRMQ2ItPnZvc0R1bW15QnVmICkpCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT52b3NEdW1teUJ1Zik7CiAgfQoKICBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICA9IE5VTEw7CgogIHBUTENiLT52b3NEdW1teUJ1ZiA9IE5VTEw7CiAgcFRMQ2ItPnZvc1RlbXBCdWYgID0gTlVMTDsKICBwVExDYi0+dWNDYWNoZWRTVEFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKCiAgLyogc2V0IHRvIGEgZGVmYXVsdCBjYiBpbiBvcmRlciB0byBwcmV2ZW50IGNvbnN0YW50IGNoZWNraW5nIGZvciBOVUxMICovCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUnggPSBXTEFOVExfQkFQUnhEZWZhdWx0Q2I7CgogIHBUTENiLT51Y1JlZ2lzdGVyZWRTdGFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKCn0vKiBXTEFOVExfQ2xlYW5DQiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9DbGVhblNUQQoKICBERVNDUklQVElPTgogICAgQ2xlYW5zIGEgc3RhdGlvbiBjb250cm9sIGJsb2NrLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjRW1wdHk6ICAgICAgICBpZiBzZXQgdGhlIHF1ZXVlcyBhbmQgcGVuZGluZyBwa3RzIHdpbGwgYmUgZW1wdHllZAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbGVhblNUQQooCiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICBwdGxTVEFDbGllbnQsCiAgdl9VOF90ICAgICAgICAgICAgIHVjRW1wdHkKKQp7CiAgdl9VOF90ICB1Y0luZGV4OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHRsU1RBQ2xpZW50ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0NsZWFuU1RBIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGVhciBzdGF0aW9uIGZyb20gVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6IENsZWFyaW5nIFNUQSBDbGllbnQgSUQ6ICVkLCBFbXB0eSBmbGFnOiAlZCIsCiAgICAgICAgICAgICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU1RBSWQsIHVjRW1wdHkgKSk7CgogIHB0bFNUQUNsaWVudC0+cGZuU1RBUnggICAgICAgICAgPSBXTEFOVExfU1RBUnhEZWZhdWx0Q2I7CiAgcHRsU1RBQ2xpZW50LT5wZm5TVEFUeENvbXAgICAgICA9IFdMQU5UTF9UeENvbXBEZWZhdWx0Q2I7CiAgcHRsU1RBQ2xpZW50LT5wZm5TVEFGZXRjaFBrdCAgICA9IFdMQU5UTF9TVEFGZXRjaFBrdERlZmF1bHRDYjsKCiAgcHRsU1RBQ2xpZW50LT50bFN0YXRlICAgICAgICAgICA9IFdMQU5UTF9TVEFfSU5JVDsKICBwdGxTVEFDbGllbnQtPnRsUHJpICAgICAgICAgICAgID0gV0xBTlRMX1NUQV9QUklfTk9STUFMOwoKICB2b3NfemVyb19tYWNhZGRyKCAmcHRsU1RBQ2xpZW50LT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyApOwogIHZvc196ZXJvX21hY2FkZHIoICZwdGxTVEFDbGllbnQtPndTVEFEZXNjLnZCU1NJRGZvcklCU1MgKTsKICB2b3NfemVyb19tYWNhZGRyKCAmcHRsU1RBQ2xpZW50LT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MgKTsKCiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1NUQUlkICA9IDA7CiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSA9IFdMQU5fU1RBX01BWDsKCiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQgICAgID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjQWRkUm12TExDICAgICAgPSAwOwogIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbiA9IDA7CiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1Byb3RlY3RlZEZyYW1lID0gMDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBTVNEVSBpbmZvcm1hdGlvbiBmb3IgdGhlIFNUQQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoICggMCAhPSB1Y0VtcHR5ICkgJiYKICAgICAgICggTlVMTCAhPSBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW5Sb290ICkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAiV0xBTiBUTDpOb24gTlVMTCB2b3NBTVNEVUNoYWluUm9vdCBvbiBXTEFOVExfQ2xlYW5TVEEsICIKICAgICAgICAgICAgICAgInN1c3BlY3RpbmcgYSBtZW1vcnkgY29ycnVwdGlvbiIpKTsKCiAgfQoKICBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW4gICAgID0gTlVMTDsKICBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW5Sb290ID0gTlVMTDsKCiAgdm9zX21lbV96ZXJvKCAodl9QVk9JRF90KXB0bFNUQUNsaWVudC0+YXVjTVBEVUhlYWRlciwKICAgICAgICAgICAgICAgICBXTEFOVExfTVBEVV9IRUFERVJfTEVOKTsKICBwdGxTVEFDbGllbnQtPnVjTVBEVUhlYWRlckxlbiAgICA9IDA7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVvcmRlcmluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIFNUQQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1RJRCA7IHVjSW5kZXgrKykKICB7CiAgICBpZigwID09IHB0bFNUQUNsaWVudC0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XS51Y0V4aXN0cykKICAgIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZihOVUxMICE9IHB0bFNUQUNsaWVudC0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XS5yZW9yZGVyQnVmZmVyKQogICAgewogICAgICBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlci0+aXNBdmFpbGFibGUgPSBWT1NfVFJVRTsKICAgICAgbWVtc2V0KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlci0+YXJyYXlCdWZmZXJbMF0sIDAsIFdMQU5UTF9NQVhfV0lOU0laRSAqIHNpemVvZih2X1BWT0lEX3QpKTsKICAgIH0KICAgIHZvc190aW1lcl9kZXN0cm95KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0uYWdpbmdUaW1lcik7CiAgICBtZW1zZXQoJnB0bFNUQUNsaWVudC0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XSwgMCwgc2l6ZW9mKFdMQU5UTF9CQVJlb3JkZXJUeXBlKSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBRT1MgaW5mb3JtYXRpb24gZm9yIHRoZSBTVEEKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICBwdGxTVEFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IFdMQU5UTF9BQ19WTzsKICAgcHRsU1RBQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgPSAwOwogICBwdGxTVEFDbGllbnQtPnVjU2VydmljZWRBQyAgICA9IFdMQU5UTF9BQ19CSzsKCiAgIHZvc19tZW1femVybyggcHRsU1RBQ2xpZW50LT5hdWNBQ01hc2ssIHNpemVvZihwdGxTVEFDbGllbnQtPmF1Y0FDTWFzaykpOwogICB2b3NfbWVtX3plcm8oICZwdGxTVEFDbGllbnQtPndVQVBTREluZm8sIHNpemVvZihwdGxTVEFDbGllbnQtPndVQVBTREluZm8pKTsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0YXRzIGluZm8KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgdm9zX21lbV96ZXJvKCBwdGxTVEFDbGllbnQtPmF1UnhDb3VudCwKICAgICAgICAgICAgICAgICBzaXplb2YocHRsU1RBQ2xpZW50LT5hdVJ4Q291bnRbMF0pKiBXTEFOX01BWF9USUQpOwogICB2b3NfbWVtX3plcm8oIHB0bFNUQUNsaWVudC0+YXVUeENvdW50LAogICAgICAgICAgICAgICAgIHNpemVvZihwdGxTVEFDbGllbnQtPmF1VHhDb3VudFswXSkqIFdMQU5fTUFYX1RJRCk7CiAgIHB0bFNUQUNsaWVudC0+cnNzaUF2ZyA9IDA7CgogICAvKlR4IG5vdCBzdXNwZW5kZWQgYW5kIHN0YXRpb24gZnVsbHkgcmVnaXN0ZXJlZCovCiAgIHZvc19hdG9taWNfc2V0X1U4KCAmcHRsU1RBQ2xpZW50LT51Y1R4U3VzcGVuZGVkLCAwKTsKICAgdm9zX2F0b21pY19zZXRfVTgoICZwdGxTVEFDbGllbnQtPnVjTm9Nb3JlRGF0YSwgMSk7CgogIGlmICggMCA9PSB1Y0VtcHR5ICkKICB7CiAgICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjVWNhc3RTaWcgICAgICAgPSBXTEFOX1RMX0lOVkFMSURfVV9TSUc7CiAgICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjQmNhc3RTaWcgICAgICAgPSBXTEFOX1RMX0lOVkFMSURfQl9TSUc7CiAgfQoKICBwdGxTVEFDbGllbnQtPnVjRXhpc3RzICAgICAgID0gMDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RhdGlzdGljcyBpbmZvIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIG1lbXNldCgmcHRsU1RBQ2xpZW50LT50cmFmZmljU3RhdGlzdGljcywKICAgICAgICAgMCwKICAgICAgICAgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwoKICAvKmZpeCBtZSEhOiBhZGQgbmV3IHZhbHVlcyBmcm9tIHRoZSBUTCBDYiBmb3IgY2xlYW51cCAqLwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfQ2xlYW5TVEEgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMKCiAgREVTQ1JJUFRJT04KICAgQ2FsbGVkIGJ5IEhERCB0byBlbmFibGUgVUFQU0QuIFRMIGluIHR1cm4gY2FsbHMgV0RBIEFQSSB0byBlbmFibGUgdGhlCiAgIGxvZ2ljIGluIEZXL1NMTSB0byBzdGFydCBzZW5kaW5nIHRyaWdnZXIgZnJhbWVzLiBQcmV2aW91c2x5IFRMIGhhZCB0aGUKICAgdHJpZ2dlciBmcmFtZSBsb2dpYyB3aGljaCBsYXRlciBtb3ZlZCBkb3duIHRvIEZXLiBIZW5jZQogICBIREQgLT4gVEwgLT4gV0RBIC0+IEZXIGNhbGwgZmxvdy4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gSWQKICAgIHVjQUM6ICAgICAgICAgICBBQyBmb3Igd2hpY2ggVS1BUFNEIGlzIGJlaW5nIGVuYWJsZWQKICAgIHVjVGlkOiAgICAgICAgICBUSUQgZm9yIHdoaWNoIFUtQVBTRCBpcyBzZXR1cAogICAgdWNVUDogICAgICAgICAgIHVzZWQgdG8gcGxhY2UgaW4gdGhlIHRyaWdnZXIgZnJhbWUgZ2VuZXJhdGlvbgogICAgdWNTZXJ2aWNlSW50OiAgIHNlcnZpY2UgaW50ZXJ2YWwgdXNlZCBieSBUTCB0byBzZW5kIHRyaWdnZXIgZnJhbWVzCiAgICB1Y1N1c3BlbmRJbnQ6ICAgc3VzcGVuZCBpbnRlcnZhbCB1c2VkIGJ5IFRMIHRvIGRldGVybWluZSB0aGF0IGFuCiAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGlkbGUgYW5kIHNob3VsZCBzdGFydCBzZW5kaW5nIHRyaWdnIGZybXMgbGVzcyBvZnRlbgogICAgd1RTRGlyOiAgICAgICAgIGRpcmVjdGlvbiBvZiBUU3BlYwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9FbmFibGVVQVBTREZvckFDCigKICB2X1BWT0lEX3QgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX0FDRW51bVR5cGUgIHVjQUMsCiAgdl9VOF90ICAgICAgICAgICAgIHVjVGlkLAogIHZfVThfdCAgICAgICAgICAgICB1Y1VQLAogIHZfVTMyX3QgICAgICAgICAgICB1U2VydmljZUludCwKICB2X1UzMl90ICAgICAgICAgICAgdVN1c3BlbmRJbnQsCiAgV0xBTlRMX1RTRGlyVHlwZSAgIHdUU0RpcgopCnsKCiAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiAgICAgID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1cyAgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIHRVYXBzZEluZm8gICAgICAgICAgaGFsVUFQU0RJbmZvOyAKIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKQogICAgICB8fCAgIFdMQU5UTF9BQ19JTlZBTElEKHVjQUMpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBpbnB1dCBwYXJhbXMgb24gV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMiCiAgICAgICAgICAgICAgICIgVEw6ICVwICBTVEE6ICVkICBBQzogJWQiLAogICAgICAgICAgICAgICBwVExDYiwgdWNTVEFJZCwgdWNBQykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLypTZXQgdGhpcyBmbGFnIGluIG9yZGVyIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBpcyBhIHRyaWdnZXIgZW5hYmxlZCBBQyovCiAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndVQVBTREluZm9bdWNBQ10udWNTZXQgPSAxOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgaWYocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLndTVEFUeXBlICE9IFdMQU5fU1RBX1RETFMpCiNlbmRpZgogIHsKICAgIGlmKCAwID09IHVTZXJ2aWNlSW50ICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnB1dCBwYXJhbXMgb24gV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMiCiAgICAgICAgICAgICAgICIgU0k6ICVkIiwgdVNlcnZpY2VJbnQgKSk7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RW5hYmxpbmcgVS1BUFNEIGluIEZXIGZvciBTVEE6ICVkIEFDOiAlZCBTSTogJWQgU1BJOiAlZCAiCiAgICAgICAgICAgICAgICJESTogJWQiLAogICAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FDLCB1U2VydmljZUludCwgdVN1c3BlbmRJbnQsCiAgICAgICAgICAgICAgIHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50KSk7CgogICAgLypTYXZlIGFsbCBpbmZvIGZvciBIQUwqLwogICAgaGFsVUFQU0RJbmZvLnN0YWlkeCAgICAgICAgID0gdWNTVEFJZDsKICAgIGhhbFVBUFNESW5mby5hYyAgICAgICAgICAgICA9IHVjQUM7CiAgICBoYWxVQVBTREluZm8udXAgICAgICAgICAgICAgPSB1Y1VQOwogICAgaGFsVUFQU0RJbmZvLnNydkludGVydmFsICAgID0gdVNlcnZpY2VJbnQ7CiAgICBoYWxVQVBTREluZm8uc3VzSW50ZXJ2YWwgICAgPSB1U3VzcGVuZEludDsKICAgIGhhbFVBUFNESW5mby5kZWxheUludGVydmFsICA9IHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50OwoKICAgIC8qTm90aWZ5IEhBTCovCiAgICB2b3NTdGF0dXMgPSBXREFfRW5hYmxlVWFwc2RBY1BhcmFtcyhwdm9zR0N0eCwgdWNTVEFJZCwgJmhhbFVBUFNESW5mbyk7CiAgfQogIHJldHVybiB2b3NTdGF0dXM7Cgp9LypXTEFOVExfRW5hYmxlVUFQU0RGb3JBQyovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQwoKICBERVNDUklQVElPTgogICBDYWxsZWQgYnkgSEREIHRvIGRpc2FibGUgVUFQU0QuIFRMIGluIHR1cm4gY2FsbHMgV0RBIEFQSSB0byBkaXNhYmxlIHRoZQogICBsb2dpYyBpbiBGVy9TTE0gdG8gc3RvcCBzZW5kaW5nIHRyaWdnZXIgZnJhbWVzLiBQcmV2aW91c2x5IFRMIGhhZCB0aGUKICAgdHJpZ2dlciBmcmFtZSBsb2dpYyB3aGljaCBsYXRlciBtb3ZlZCBkb3duIHRvIEZXLiBIZW5jZQogICBIREQgLT4gVEwgLT4gV0RBIC0+IEZXIGNhbGwgZmxvdy4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gSWQKICAgIHVjQUM6ICAgICAgICAgQUMgZm9yIHdoaWNoIFUtQVBTRCBpcyBiZWluZyBlbmFibGVkCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQwooCiAgdl9QVk9JRF90ICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9BQ0VudW1UeXBlICB1Y0FDCikKewogIFdMQU5UTF9DYlR5cGUqIHBUTENiOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKQogICAgICB8fCAgIFdMQU5UTF9BQ19JTlZBTElEKHVjQUMpICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQyIKICAgICAgICAgICAgICAgIiBUTDogJXAgIFNUQTogJWQgIEFDOiAlZCIsIHBUTENiLCB1Y1NUQUlkLCB1Y0FDICkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLypSZXNldCB0aGlzIGZsYWcgYXMgdGhpcyBpcyBubyBsb25nZXIgYSB0cmlnZ2VyIGVuYWJsZWQgQUMqLwogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53VUFQU0RJbmZvW3VjQUNdLnVjU2V0ID0gMTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkRpc2FibGluZyBVLUFQU0QgaW4gRlcgZm9yIFNUQTogJWQgQUM6ICVkICIsCiAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FDKSk7CgogIC8qTm90aWZ5IEhBTCovCiAgV0RBX0Rpc2FibGVVYXBzZEFjUGFyYW1zKHB2b3NHQ3R4LCB1Y1NUQUlkLCB1Y0FDKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQyAqLwoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICBXTEFOVExfUmVnUlNTSUluZGljYXRpb25DQgoKICBERVNDUklQVElPTiAgUmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHRvIGdldCBub3RpZmljYXRpb24gaWYgUlNTSSBjcm9zcwogICAgICAgICAgICAgICB0aHJlc2hvbGQuCiAgICAgICAgICAgICAgIENsaWVudCBzaG91bGQgcmVnaXN0ZXIgdGhyZXNob2xkLCBkaXJlY3Rpb24sIGFuZCBub3RpZmljYXRpb24KICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgoKICBERVBFTkRFTkNJRVMgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICBpbiByc3NpVmFsdWUgLSBSU1NJIHRocmVzaG9sZCB2YWx1ZQogICAgICAgICAgICAgICBpbiB0cmlnZ2VyRXZlbnQgLSBDcm9zcyBkaXJlY3Rpb24gc2hvdWxkIGJlIG5vdGlmaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQLCBET1dOLCBhbmQgQ1JPU1MKICAgICAgICAgICAgICAgaW4gY3Jvc3NDQkZ1bmN0aW9uIC0gTm90aWZpY2F0aW9uIENCIEZ1bmN0aW9uCiAgICAgICAgICAgICAgIGluIHVzckN0eHQgLSB1c2VyIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1JlZ1JTU0lJbmRpY2F0aW9uQ0IKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICB2X1M3X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgIFdMQU5UTF9SU1NJQ3Jvc3NUaHJlc2hvbGRDQlR5cGUgY3Jvc3NDQkZ1bmN0aW9uLAogICBWT1NfTU9EVUxFX0lEICAgICAgICAgICAgICAgICAgIG1vZHVsZUlELAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQKKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNSZWdSU1NJSW5kaWNhdGlvbkNCKHBBZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NDQkZ1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQpOwoKICAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCCgogIERFU0NSSVBUSU9OICBSZW1vdmUgc3BlY2lmaWMgdGhyZXNob2xkIGZyb20gbGlzdAoKICBERVBFTkRFTkNJRVMgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICBpbiByc3NpVmFsdWUgLSBSU1NJIHRocmVzaG9sZCB2YWx1ZQogICAgICAgICAgICAgICBpbiB0cmlnZ2VyRXZlbnQgLSBDcm9zcyBkaXJlY3Rpb24gc2hvdWxkIGJlIG5vdGlmaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQLCBET1dOLCBhbmQgQ1JPU1MKICAgCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0RlcmVnUlNTSUluZGljYXRpb25DQgooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHZfUzdfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaVZhbHVlLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCwKICAgV0xBTlRMX1JTU0lDcm9zc1RocmVzaG9sZENCVHlwZSBjcm9zc0NCRnVuY3Rpb24sCiAgIFZPU19NT0RVTEVfSUQgICAgICAgICAgICAgICAgICAgbW9kdWxlSUQKKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNEZXJlZ1JTU0lJbmRpY2F0aW9uQ0IocEFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9zc0NCRnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVJRCk7CiAgIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgV0xBTlRMX1NldEFscGhhCgogIERFU0NSSVBUSU9OICBBTFBMQSBpcyB3ZWlnaHQgdmFsdWUgdG8gY2FsY3VsYXRlIEFWRyBSU1NJCiAgICAgICAgICAgICAgIGF2Z1JTU0kgPSAoQUxQSEEgKiBoaXN0b3J5UlNTSSkgKyAoKDEwIC0gQUxQSEEpICogbmV3UlNTSSkKICAgICAgICAgICAgICAgYXZnUlNTSSBoYXMgKEFMUEhBICogMTApJSBvZiBoaXN0b3J5IFJTU0kgd2VpZ2h0IGFuZAogICAgICAgICAgICAgICAoMTAgLSBBTFBIQSklIG9mIG5ld1JTU0kgd2VpZ2h0CiAgICAgICAgICAgICAgIFRoaXMgcG9ydGlvbiBpcyBkeW5hbWljYWxseSBjb25maWd1cmFibGUuCiAgICAgICAgICAgICAgIERlZmF1bHQgaXMgPwoKICBERVBFTkRFTkNJRVMgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICBpbiB2YWx1ZUFscGFoIC0gQUxQSEEKICAgCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1NldEFscGhhCigKICAgdl9QVk9JRF90IHBBZGFwdGVyLAogICB2X1U4X3QgICAgdmFsdWVBbHBoYQopCnsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgIHN0YXR1cyA9IFdMQU5UTF9IU1NldEFscGhhKHBBZGFwdGVyLCB2YWx1ZUFscGhhKTsKICAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgRlVOQ1RJT04KCiAgIERFU0NSSVBUSU9OIAogICAgCiAgIFBBUkFNRVRFUlMgCgogICBSRVRVUk4gVkFMVUUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9CTVBTUlNTSVJlZ2lvbkNoYW5nZWROb3RpZmljYXRpb24KKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHRwU2lyUlNTSU5vdGlmaWNhdGlvbiBwUlNTSU5vdGlmaWNhdGlvbgopCnsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgIHN0YXR1cyA9IFdMQU5UTF9IU0JNUFNSU1NJUmVnaW9uQ2hhbmdlZE5vdGlmaWNhdGlvbihwQWRhcHRlciwgcFJTU0lOb3RpZmljYXRpb24pOwogICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgIFdMQU5UTF9SZWdHZXRUcmFmZmljU3RhdHVzCgogIERFU0NSSVBUSU9OICBSZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRyYWZmaWMgc3RhdHVzIG1vbml0b3JpbmcKICAgICAgICAgICAgICAgRHVyaW5nIG1lYXN1cmUgcGVyaW9kIGNvdW50IGRhdGEgZnJhbWVzLgogICAgICAgICAgICAgICBJZiBmcmFtZSBjb3VudCBpcyBsYXJnZXIgdGhlbiBJRExFIHRocmVzaG9sZCBzZXQgYXMgdHJhZmZpYyBPTgogICAgICAgICAgICAgICBvciBPRkYuCiAgICAgICAgICAgICAgIEFuZCB0cmFmZmljIHN0YXR1cyBpcyBjaGFuZ2VkIHNlbmQgcmVwb3J0IHRvIGNsaWVudCB3aXRoCiAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24KCiAgREVQRU5ERU5DSUVTIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgaW4gaWRsZVRocmVzaG9sZCAtIFRyYWZmaWMgb24gb3Igb2ZmIHRocmVzaG9sZAogICAgICAgICAgICAgICBpbiBtZWFzdXJlUGVyaW9kIC0gVHJhZmZpYyBzdGF0ZSBjaGVjayBwZXJpb2QKICAgICAgICAgICAgICAgaW4gdHJmZmljU3RhdHVzQ0IgLSB0cmFmZmljIHN0YXR1cyBjaGFuZ2VkIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCIGZ1bmN0aW9uCiAgICAgICAgICAgICAgIGluIHVzckN0eHQgLSB1c2VyIGNvbnRleHQKICAgCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1JlZ0dldFRyYWZmaWNTdGF0dXMKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkbGVUaHJlc2hvbGQsCiAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVBlcmlvZCwKICAgV0xBTlRMX1RyYWZmaWNTdGF0dXNDaGFuZ2VkQ0JUeXBlICB0cmZmaWNTdGF0dXNDQiwKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0CikKewogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwoKICAgc3RhdHVzID0gV0xBTlRMX0hTUmVnR2V0VHJhZmZpY1N0YXR1cyhwQWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlVGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVQZXJpb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJmZmljU3RhdHVzQ0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dCk7CiAgIHJldHVybiBzdGF0dXM7Cn0KI2VuZGlmCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRTdGF0aXN0aWNzCgogIERFU0NSSVBUSU9OICAgR2V0IHRyYWZmaWMgc3RhdGlzdGljcyBmb3IgaWRlbnRpZmllZCBzdGF0aW9uIAoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKICAgICAgICAgICAgICAgIG91dCBzdGF0QnVmZmVyIC0gdHJhZmZpYyBzdGF0aXN0aWNzIGJ1ZmZlcgogICAKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTICBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9HZXRTdGF0aXN0aWNzCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAgKnN0YXRCdWZmZXIsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgIFNUQWlkCikKewogIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgICBwQ2xpZW50U1RBID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZigwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYoTlVMTCA9PSBzdGF0QnVmZmVyKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBUTCBzdGF0aXN0aWNzIGJ1ZmZlciBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHN0YXRpc3RpY3MgPSAmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3M7CiAgdm9zX21lbV9jb3B5KHN0YXRCdWZmZXIsIHN0YXRpc3RpY3MsIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCiAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX1Jlc2V0U3RhdGlzdGljcwoKICBERVNDUklQVElPTiAgIFJlc2V0IHN0YXRpc3RpY3Mgc3RydWN0dXJlIGZvciBpZGVudGlmaWVkIHN0YXRpb24gSUQKICAgICAgICAgICAgICAgIFJlc2V0IG1lYW5zIHNldCB2YWx1ZXMgYXMgMAoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKICAgCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVzZXRTdGF0aXN0aWNzCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgIFNUQWlkCikKewogIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgICBwQ2xpZW50U1RBID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKE5VTEwgPT0gcFRMQ2IpIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW1NUQWlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmKDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDogJWQgU1RBIElEIGRvZXMgbm90IGV4aXN0IiwgU1RBaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBzdGF0aXN0aWNzID0gJnBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzOwogIHZvc19tZW1femVybygodl9WT0lEX3QgKilzdGF0aXN0aWNzLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgogIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRTcGVjU3RhdGlzdGljCgogIERFU0NSSVBUSU9OICAgR2V0IHNwZWNpZmljIGZpZWxkIHdpdGhpbiBzdGF0aXN0aWNzIHN0cnVjdHVyZSBmb3IKICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgc3RhdGlvbiBJRCAKCiAgREVQRU5ERU5DSUVTICBOT05FCgogIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKICAgICAgICAgICAgICAgIGluIFNUQWlkICAgIC0gU3RhdGlvbiBJRAogICAgICAgICAgICAgICAgb3V0IGJ1ZmZlciAgLSBTdGF0aXN0aWMgdmFsdWUKICAgCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfR2V0U3BlY1N0YXRpc3RpYwooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFUSUNfVFlQRSAgc3RhdFR5cGUsCiAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgIFNUQWlkCikKewogIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgICBwQ2xpZW50U1RBID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKE5VTEwgPT0gcFRMQ2IpIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYoMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOiAlZCBTVEEgSUQgZG9lcyBub3QgZXhpc3QiLCBTVEFpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmKE5VTEwgPT0gYnVmZmVyKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBUTCBzdGF0aXN0aWMgYnVmZmVyIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgc3RhdGlzdGljcyA9ICZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljczsKICBzd2l0Y2goc3RhdFR5cGUpCiAgewogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eFVDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eE1DRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eEJDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eFVDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eE1DQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eEJDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeFVDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeE1DRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeFVDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeE1DQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UX0NSQ19PSzoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4QmNudENSQ29rOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfUkFURToKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4UmF0ZTsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgKmJ1ZmZlciA9IDA7CiAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgICAgYnJlYWs7CiAgfQoKCiAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX1Jlc2V0U3BlY1N0YXRpc3RpYwoKICBERVNDUklQVElPTiAgIFJlc2V0IHNwZWNpZmljIGZpZWxkIHdpdGhpbiBzdGF0aXN0aWNzIHN0cnVjdHVyZSBmb3IKICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgc3RhdGlvbiBJRAogICAgICAgICAgICAgICAgUmVzZXQgbWVhbnMgc2V0IGFzIDAKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CiAgICAgICAgICAgICAgICBpbiBTVEFpZCAgICAtIFN0YXRpb24gSUQKCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVzZXRTcGVjU3RhdGlzdGljCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgV0xBTlRMX1RSQU5TRkVSX1NUQVRJQ19UWVBFICBzdGF0VHlwZSwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICBTVEFpZAopCnsKICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICAgcENsaWVudFNUQSA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHBUTENiKSAKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZigwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgc3RhdGlzdGljcyA9ICZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljczsKICBzd2l0Y2goc3RhdFR5cGUpCiAgewogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4VUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4TUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4QkNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4VUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4TUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4QkNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4VUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4TUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QkNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4VUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4TUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QkNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UX0NSQ19PSzoKICAgICAgc3RhdGlzdGljcy0+cnhCY250Q1JDb2sgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfUkFURToKICAgICAgc3RhdGlzdGljcy0+cnhSYXRlID0gMDsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgICBicmVhazsKICB9CgogIHJldHVybiBzdGF0dXM7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICBGVU5DVElPTgoKICAgREVTQ1JJUFRJT04gICBSZWFkIFJTU0kgdmFsdWUgb3V0IG9mIGEgUlggQkQKICAgIAogICBQQVJBTUVURVJTOiAgQ2FsbGVyIG11c3QgdmFsaWRhdGUgYWxsIHBhcmFtZXRlcnMgCgogICBSRVRVUk4gVkFMVUUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZWFkUlNTSQooCiAgIHZfUFZPSURfdCAgICAgICAgcEFkYXB0ZXIsCiAgIHZfUFZPSURfdCAgICAgICAgcEJESGVhZGVyLAogICB2X1U4X3QgICAgICAgICAgIFNUQWlkCikKewogICBXTEFOVExfQ2JUeXBlICAgKnRsQ3R4dCA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogICB2X1M3X3QgICAgICAgICAgIGN1cnJlbnRSU1NJLCBjdXJyZW50UlNTSTAsIGN1cnJlbnRSU1NJMTsKCgogICBpZihOVUxMID09IHRsQ3R4dCkKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIEludmFsaWQgVEwgaGFuZGxlIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICAgfQoKICAgaWYgKCBOVUxMID09IHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0gKQogICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgIH0KCiAgIGN1cnJlbnRSU1NJMCA9IFdMQU5UTF9HRVRSU1NJMChwQkRIZWFkZXIpOwogICBjdXJyZW50UlNTSTEgPSBXTEFOVExfR0VUUlNTSTEocEJESGVhZGVyKTsKICAgY3VycmVudFJTU0kgID0gKGN1cnJlbnRSU1NJMCA+IGN1cnJlbnRSU1NJMSkgPyBjdXJyZW50UlNTSTAgOiBjdXJyZW50UlNTSTE7CgogICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5yc3NpQXZnID0gY3VycmVudFJTU0k7CgogICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICBGVU5DVElPTgoKICAgREVTQ1JJUFRJT04gICBSZWFkIFNOUiB2YWx1ZSBvdXQgb2YgYSBSWCBCRAoKICAgUEFSQU1FVEVSUzogIENhbGxlciBtdXN0IHZhbGlkYXRlIGFsbCBwYXJhbWV0ZXJzCgogICBSRVRVUk4gVkFMVUUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZWFkU05SCigKICAgdl9QVk9JRF90ICAgICAgICBwQWRhcHRlciwKICAgdl9QVk9JRF90ICAgICAgICBwQkRIZWFkZXIsCiAgIHZfVThfdCAgICAgICAgICAgU1RBaWQKKQp7CiAgIFdMQU5UTF9DYlR5cGUgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgIHZfUzdfdCAgICAgICAgICAgY3VycmVudFNOUjsKCgogICBpZiAoTlVMTCA9PSB0bEN0eHQpCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgIiVzIEludmFsaWQgVEwgaGFuZGxlIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICAgfQoKICAgaWYgKE5VTEwgPT0gdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXSkKICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICB9CgogICBjdXJyZW50U05SID0gV0xBTlRMX0dFVFNOUihwQkRIZWFkZXIpOwoKICAgLyogU05SIHJlcG9ydGVkIGluIHRoZSBCdWZmZXIgRGVzY3JpcHRvciBpcyBzY2FsZWQgdXAgYnkgMihTTlIqMiksCiAgICAqIEdldCB0aGUgY29ycmVjdCBTTlIgdmFsdWUKICAgICovCiAgIGN1cnJlbnRTTlIgPSBjdXJyZW50U05SID4+IDE7CgogICAvKiBTTlIgcmVwb3J0ZWQgYnkgSFcgY2Fubm90IGJlIG1vcmUgdGhhbiAzNWRCIGR1ZSB0byBIVyBsaW1pdGF0aW9ucyAqLwogICBjdXJyZW50U05SID0gKFdMQU5UTF9NQVhfSFdfU05SID4gY3VycmVudFNOUiA/IGN1cnJlbnRTTlIgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQVhfSFdfU05SKTsKCiAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICIlczogc25yc3VtOiAlZCBzbnJpZHg6ICVkIHByZXZzbnJhdmc6ICVkIiwKICAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0sCiAgICAgICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4LAogICAgICAgICAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnByZXZTbnJBdmcpKTsKCiAgIC8qIFRoZSBTTlIgcmV0dXJuZWQgZm9yIGFsbCBwdXJwb3NlcyBpcyB0aGUgYXZlcmFnZSBTTlIgb3ZlcgogICAgKiBXTEFOVExfTUFYX1NOUl9EQVRBX1NNQVBMRVMuV2hlbiBkYXRhIHNhbXBsZXMKICAgICogPiBXTEFOVExfTUFYX1NOUl9EQVRBX1NBTVBMRVMgYXJlIG9idGFpbmVkLAogICAgKiBzdG9yZSB0aGUgYXZlcmFnZSBvZiB0aGUgc2FtcGxlcyBpbiBwcmV2U25yQXZnCiAgICAqIGFuZCBzdGFydCBhIG5ldyBhdmVyYWdpbmcgd2luZG93LiBUaGUgcHJldlNuckF2ZyBpcyB1c2VkIHdoZW4KICAgICogZW5vdWdoIGRhdGEgc2FtcGxlcyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIGFwcGxpY2F0aW9ucwogICAgKiBhY3R1YWxseSBxdWVyeSBmb3IgU05SLgogICAgKgogICAgKiBTRUU6IFdMQU5UTF9HZXRTbnIoKQogICAgKi8KICAgaWYgKHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnNucklkeCA+PSBXTEFOVExfTUFYX1NOUl9EQVRBX1NBTVBMRVMpCiAgIHsKICAgICAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnByZXZTbnJBdmcgPQogICAgICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0gLwogICAgICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJJZHg7CiAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0gPSAwOwogICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4ID0gMDsKICAgfQogICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0gKz0gY3VycmVudFNOUjsKICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4ICs9IDE7CgogICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKgogREVTQ1JJUFRJT04gCiAgICBUTCByZXR1cm5zIHRoZSB3ZWlnaHQgY3VycmVudGx5IG1haW50YWluZWQgaW4gVEwuCiBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKCiBPVVQKICAgIHBBQ1dlaWdodHM6ICAgICBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBmb3IgZmlsbGluZyBpbiB3ZWlnaHRzCgogUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCiovClZPU19TVEFUVVMgIApXTEFOVExfR2V0QUNXZWlnaHRzIAooIAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICAgICAgICAgcEFDV2VpZ2h0cwopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgdl9VOF90ICAgICAgICAgIHVjSW5kZXg7IAogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBBQ1dlaWdodHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0QUNXZWlnaHRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldEFDV2VpZ2h0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwQUNXZWlnaHRzW3VjSW5kZXhdID0gcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y0luZGV4XTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgoKLyoKIERFU0NSSVBUSU9OIAogICAgQ2hhbmdlIHRoZSB3ZWlnaHQgY3VycmVudGx5IG1haW50YWluZWQgYnkgVEwuCiBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKICAgIHBBQ1dlaWdodHM6ICAgICBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBjb250YWluIHRoZSB3ZWlnaHRzIHRvIHVzZQoKCiBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKKi8KVk9TX1NUQVRVUyAgCldMQU5UTF9TZXRBQ1dlaWdodHMgCiggCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgICAgICAgICBwQUNXZWlnaHRzCikKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcEFDV2VpZ2h0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRBQ1dlaWdodHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0QUNXZWlnaHRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOVExfTUFYX0FDIDsgdWNJbmRleCsrKQogIHsKICAgIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNJbmRleF0gPSBwQUNXZWlnaHRzW3VjSW5kZXhdOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgIEZVTkNUSU9OCgogICBERVNDUklQVElPTiAKICAgIAogICBQQVJBTUVURVJTIAoKICAgUkVUVVJOIFZBTFVFCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZCBXTEFOVExfUG93ZXJTdGF0ZUNoYW5nZWRDQgooCiAgIHZfUFZPSURfdCBwQWRhcHRlciwKICAgdFBtY1N0YXRlIG5ld1N0YXRlCikKewogICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgICAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKCiAgIGlmIChOVUxMID09IHRsQ3R4dCkKICAgewogICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFRMIENvbnRyb2wgQmxvY2siLCBfX2Z1bmNfXyApOwogICAgIHJldHVybjsKICAgfQoKICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIlBvd2VyIHN0YXRlIGNoYW5nZWQsIG5ldyBzdGF0ZSBpcyAlZCIsIG5ld1N0YXRlICk7CiAgIHN3aXRjaChuZXdTdGF0ZSkKICAgewogICAgICBjYXNlIEZVTExfUE9XRVI6CiAgICAgICAgIHRsQ3R4dC0+aXNCTVBTID0gVk9TX0ZBTFNFOwogICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQk1QUzoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgICAgICAgV0xBTlRMX1NldEZXUlNTSVRocmVzaG9sZHMocEFkYXB0ZXIpOwojZW5kaWYKCiAgICAgICAgIHRsQ3R4dC0+aXNCTVBTID0gVk9TX1RSVUU7CiAgICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBJTVBTOgogICAgICBjYXNlIExPV19QT1dFUjoKICAgICAgY2FzZSBSRVFVRVNUX0JNUFM6CiAgICAgIGNhc2UgUkVRVUVTVF9GVUxMX1BPV0VSOgogICAgICBjYXNlIFJFUVVFU1RfSU1QUzoKICAgICAgY2FzZSBTVE9QUEVEOgogICAgICBjYXNlIFJFUVVFU1RfU1RBUlRfVUFQU0Q6CiAgICAgIGNhc2UgUkVRVUVTVF9TVE9QX1VBUFNEOgogICAgICBjYXNlIFVBUFNEOgogICAgICBjYXNlIFJFUVVFU1RfU1RBTkRCWToKICAgICAgY2FzZSBTVEFOREJZOgogICAgICBjYXNlIFJFUVVFU1RfRU5URVJfV09XTDoKICAgICAgY2FzZSBSRVFVRVNUX0VYSVRfV09XTDoKICAgICAgY2FzZSBXT1dMOgogICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIk5vdCBoYW5kbGUgdGhpcyBldmVudHMgJWQiLCBuZXdTdGF0ZSApKTsKICAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJOb3QgYSB2YWxpZCBldmVudCAlZCIsIG5ld1N0YXRlICkpOwogICAgICAgICBicmVhazsKICAgfQoKICAgcmV0dXJuOwp9Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRFdGhlclR5cGUKCiAgREVTQ1JJUFRJT04gICBFeHRyYWN0IEV0aGVyIHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgQkQKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIGF1Y0JESGVhZGVyIC0gQkQgaGVhZGVyCiAgICAgICAgICAgICAgICBpbiB2b3NEYXRhQnVmZiAtIGRhdGEgYnVmZmVyCiAgICAgICAgICAgICAgICBpbiB1Y01QRFVITGVuICAtIE1QRFUgaGVhZGVyIGxlbmd0aAogICAgICAgICAgICAgICAgb3V0IHBVc0V0aGVyVHlwZSAtIHBvaW50ZXIgdG8gRXRoZXJ0eXBlCgogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVU19TVUNDRVNTIDogaWYgdGhlIEV0aGVyVHlwZSBpcyBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkCiAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0ZBSUxVUkUgOiBpZiB0aGUgRXRoZXJUeXBlIGV4dHJhY3Rpb24gZmFpbGVkIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldCB3YXMgZHJvcHBlZAoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTIFdMQU5UTF9HZXRFdGhlclR5cGUKKAogICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogICB2b3NfcGt0X3QgICAgICAgICAgICAqIHZvc0RhdGFCdWZmLAogICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgIHZfVTE2X3QgICAgICAgICAgICAgICogcFVzRXRoZXJUeXBlCikKewogIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAqcFVzRXRoZXJUeXBlOwogIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c0xMQ1NpemUgPSBzaXplb2YodXNFdGhlclR5cGUpOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBMTEMgaXMgcHJlc2VudCAtIGlmIG5vdCwgVEwgaXMgdW5hYmxlIHRvIGRldGVybWluZSB0eXBlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBWT1NfRkFMU0UgPT0gV0RBX0lTX1JYX0xMQ19QUkVTRU5UKCBhdWNCREhlYWRlciApICkKICB7CiAgICB1Y09mZnNldCA9IFdMQU5UTF84MDJfM19IRUFERVJfTEVOIC0gc2l6ZW9mKHVzRXRoZXJUeXBlKTsgCiAgfQogIGVsc2UKICB7CiAgICB1Y09mZnNldCA9IHVjTVBEVUhMZW4gKyBXTEFOVExfTExDX1BST1RPX1RZUEVfT0ZGU0VUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgTExDIHR5cGUgCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsIHVjT2Zmc2V0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmdXNFdGhlclR5cGUsICZ1c0xMQ1NpemUpOyAKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8IAogICAgICAoIHNpemVvZih1c0V0aGVyVHlwZSkgIT0gdXNMTENTaXplICkpCiAgICAgIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3IgZXh0cmFjdGluZyBFdGhlciB0eXBlIGZyb20gZGF0YSBwYWNrZXQiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KICBlbHNlCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXRoZXIgdHlwZSByZXRyaWV2ZWQgYmVmb3JlIGVuZGlhbmVzcyBjb252OiAlZCIsIAogICAgICAgICAgICAgICB1c0V0aGVyVHlwZSkpOwoKICAgIHVzRXRoZXJUeXBlID0gdm9zX2JlMTZfdG9fY3B1KHVzRXRoZXJUeXBlKTsKICAgICpwVXNFdGhlclR5cGUgPSB1c0V0aGVyVHlwZTsKCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZDogJWQiLCB1c0V0aGVyVHlwZSkpOwogIH0KICAKICByZXR1cm4gdm9zU3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0U29mdEFQU3RhdGlzdGljcwoKICBERVNDUklQVElPTiAgIENvbGxlY3QgdGhlIGN1bXVsYXRpdmUgc3RhdGlzdGljcyBmb3IgYWxsIFNvZnRhcCBzdGF0aW9ucwoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcHZvc0dDdHggIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0CiAgICAgICAgICAgICAgICAgICBiUmVzZXQgICAgLSBJZiBzZXQgVEwgc3RhdGlzdGljcyB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgcmVhZGluZwogICAgICAgICAgICAgICAgb3V0IHN0YXRzU3VtIC0gcG9pbnRlciB0byBjb2xsZWN0ZWQgc3RhdGlzdGljcwoKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVNfU1VDQ0VTUyA6IGlmIHRoZSBTdGF0aXN0aWNzIGFyZSBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkCgogIFNJREUgRUZGRUNUUyAgTk9ORQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0dldFNvZnRBUFN0YXRpc3RpY3Modl9QVk9JRF90IHBBZGFwdGVyLCBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRzU3VtLCB2X0JPT0xfdCBiUmVzZXQpCnsKICAgIHZfVThfdCBpID0gMDsKICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIFdMQU5UTF9DYlR5cGUgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogICAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFIHN0YXRCdWZmZXJUZW1wOwogICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKSZzdGF0QnVmZmVyVGVtcCwgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwogICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXN0YXRzU3VtLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgoKICAgIGlmICggTlVMTCA9PSBwVExDYiApCiAgICB7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfSAKCiAgICAvLyBTdW0gdXAgYWxsIHRoZSBzdGF0aXN0aWNzIGZvciBzdGF0aW9ucyBvZiBTb2Z0IEFQIGZyb20gVEwKICAgIGZvciAoaSA9IDA7IGkgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKykKICAgIHsKICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0pCiAgICAgICAgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT53U1RBRGVzYy53U1RBVHlwZSA9PSBXTEFOX1NUQV9TT0ZUQVApCiAgICAgICAgewogICAgICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRTdGF0aXN0aWNzKHBBZGFwdGVyLCAmc3RhdEJ1ZmZlclRlbXAsIGkpOy8vIENhbiBpbmNsdWRlIHN0YUlkIDEgYmVjYXVzZSBzdGF0aXN0aWNzIG5vdCBjb2xsZWN0ZWQgZm9yIGl0CgogICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwoKICAgICAgICAgICAgLy8gQWRkIHRvIHRoZSBjb3VudGVycwogICAgICAgICAgIHN0YXRzU3VtLT50eFVDRmNudCArPSBzdGF0QnVmZmVyVGVtcC50eFVDRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhNQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhNQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4QkNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4QkNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT50eFVDQmNudCArPSBzdGF0QnVmZmVyVGVtcC50eFVDQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhNQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhNQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4QkNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4QkNCY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeFVDRmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeFVDRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhNQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhNQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4QkNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4QkNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeFVDQmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeFVDQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhNQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhNQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4QkNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4QkNCY250OwoKICAgICAgICAgICBpZiAoYlJlc2V0KQogICAgICAgICAgIHsKICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVzZXRTdGF0aXN0aWNzKHBBZGFwdGVyLCBpKTsKICAgICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsgICAgICAgICAgICAgICAKICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHZvc1N0YXR1czsKfQojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFNfSU5URVJOQUwKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldEV0aGVyVHlwZV8yCgogIERFU0NSSVBUSU9OICAgRXh0cmFjdCBFdGhlciB0eXBlIGluZm9ybWF0aW9uIGZyb20gdGhlIEJECgogIERFUEVOREVOQ0lFUyAgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgICBpbiBhdWNCREhlYWRlciAtIEJEIGhlYWRlcgogICAgICAgICAgICAgICAgaW4gdm9zRGF0YUJ1ZmYgLSBkYXRhIGJ1ZmZlcgogICAgICAgICAgICAgICAgaW4gdWNNUERVSExlbiAgLSBNUERVIGhlYWRlciBsZW5ndGgKICAgICAgICAgICAgICAgIG91dCBwVXNFdGhlclR5cGUgLSBwb2ludGVyIHRvIEV0aGVydHlwZQoKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVNfU1VDQ0VTUyA6IGlmIHRoZSBFdGhlclR5cGUgaXMgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZAogICAgICAgICAgICAgICAgVk9TX1NUQVRVU19GQUlMVVJFIDogaWYgdGhlIEV0aGVyVHlwZSBleHRyYWN0aW9uIGZhaWxlZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWNrZXQgd2FzIGRyb3BwZWQKCiAgU0lERSBFRkZFQ1RTICBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgVk9TX1NUQVRVUyBXTEFOVExfR2V0RXRoZXJUeXBlXzIKKAogICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogICB2b3NfcGt0X3QgICAgICAgICAgICAqIHZvc0RhdGFCdWZmLAogICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgIHZfVTE2X3QgICAgICAgICAgICAgICogcFVzRXRoZXJUeXBlCikKewogIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAqcFVzRXRoZXJUeXBlOwogIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c0xMQ1NpemUgPSBzaXplb2YodXNFdGhlclR5cGUpOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIC8vdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTExDSGVhZGVyOwogIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0IDsgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIExMQyBpcyBwcmVzZW50IC0gaWYgbm90LCBUTCBpcyB1bmFibGUgdG8gZGV0ZXJtaW5lIHR5cGUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvL3VjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdMQU5IQUxfUlhfQkRfR0VUX01QRFVfSF9PRkZTRVQoYXVjQkRIZWFkZXIpIDsKICAvL3VjTExDSGVhZGVyICAgPSAodl9VOF90KVdMQU5IQUxfUlhfQkRfR0VUX0xMQyhhdWNCREhlYWRlcik7CiAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQoYXVjQkRIZWFkZXIpOwoKICBpZiAoIFZPU19UUlVFID09IFdEQV9JU19SWF9MTENfUFJFU0VOVChhdWNCREhlYWRlcikgKQogIHsKICAgIHVjT2Zmc2V0ID0gdWNNUERVSE9mZnNldCArIFdMQU5UTF84MDJfM19IRUFERVJfTEVOIC0gc2l6ZW9mKHVzRXRoZXJUeXBlKTsgCiAgfQogIGVsc2UKICB7CiAgICB1Y09mZnNldCA9IFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUgKyB1Y01QRFVITGVuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTlRMX0xMQ19QUk9UT19UWVBFX09GRlNFVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IExMQyB0eXBlIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc0RhdGFCdWZmLCB1Y09mZnNldCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnVzRXRoZXJUeXBlLCAmdXNMTENTaXplKTsgCgogIC8qIFRPRE86IERvIGl0IGluIGJldHRlciB3YXkgKi8KICBpZih2b3NfYmUxNl90b19jcHUodXNFdGhlclR5cGUpID09IDB4ODkwZCkKICB7CiAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCiAgICAgICAgICAgICAgICAgICAgICAoIlRETFMgZnJhbWUgbGxjICV4IiksIHZvc19iZTE2X3RvX2NwdSh1c0V0aGVyVHlwZSkpIDsKICB9CiAgICAgIAogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZCBiZWZvcmUgZW5kaWFuZXNzIGNvbnY6ICVkIiwgCiAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlKTsKCiAgICB1c0V0aGVyVHlwZSA9IHZvc19iZTE2X3RvX2NwdSh1c0V0aGVyVHlwZSk7CiAgICAqcFVzRXRoZXJUeXBlID0gdXNFdGhlclR5cGU7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZDogJWQiLCB1c0V0aGVyVHlwZSk7CiAgCiAgcmV0dXJuIHZvc1N0YXR1czsKfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0lzUmVwbGF5UGFja2V0CiAgICAgCiAgREVTQ1JJUFRJT04gICBUaGlzIGZ1bmN0aW9uIGRvZXMgcmVwbGF5IGNoZWNrIGZvciB2YWxpZCBzdGF0aW9ucwogCiAgREVQRU5ERU5DSUVTICBWYWxpZGl0eSBvZiByZXBsYXkgY2hlY2sgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZnVuY3Rpb24gCiAgICAgICAgICAgICAgICBpcyBjYWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAKICBQQVJBTUVURVJTICAgIGN1cnJlbnRSZXBsYXlDb3VudGVyICAgIGN1cnJlbnQgcmVwbGF5IGNvdW50ZXIgdGFrZW4gZnJvbSBSWCBCRCAKICAgICAgICAgICAgICAgIHByZXZpb3VzUmVwbGF5Q291bnRlciAgIHByZXZpb3VzIHJlcGxheSBjb3VudGVyIHRha2VuIGZyb20gVEwgQ0IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUkVUUlVOICAgICAgICBWT1NfVFJVRSAgICBwYWNrZXQgaXMgYSByZXBsYXkgcGFja2V0CiAgICAgICAgICAgICAgICBWT1NfRkFMU0UgICBwYWNrZXQgaXMgbm90IGEgcmVwbGF5IHBhY2tldAoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9CT09MX3QKV0xBTlRMX0lzUmVwbGF5UGFja2V0CigKICB2X1U2NF90ICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLAogIHZfVTY0X3QgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyCikKewogICAvKiBEbyB0aGUgcmVwbGF5IGNoZWNrIGJ5IGNvbXBhcmluZyBwcmV2aW91cyByZWNlaXZlZCByZXBsYXkgY291bnRlciB3aXRoCiAgICAgIGN1cnJlbnQgcmVjZWl2ZWQgcmVwbGF5IGNvdW50ZXIqLwogICAgaWYodWxscHJldmlvdXNSZXBsYXlDb3VudGVyIDwgdWxsY3VycmVudFJlcGxheUNvdW50ZXIpCiAgICB7CiAgICAgICAgLyogVmFsaWQgcGFja2V0IG5vdCByZXBsYXkgKi8KICAgICAgICByZXR1cm4gVk9TX0ZBTFNFOwogICAgfQogICAgZWxzZQogICAgewoKICAgICAgICAvKiBDdXJyZW50IHBhY2tldCBudW1iZXIgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHByZXZpdW9zIHJlY2VpdmVkIAogICAgICAgICAgIHBhY2tldCBubywgdGhpcyBtZWFucyBjdXJyZW50IHBhY2tldCBpcyByZXBsYXkgcGFja2V0ICovCiAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6IFJlcGxheSBwYWNrZXQgZm91bmQgd2l0aCByZXBsYXkgY291bnRlciA6WzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKICAgICAgICAgICAKICAgICAgICByZXR1cm4gVk9TX1RSVUU7CiAgICB9Cn0KCiNpZiAwCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFJlcGxheUNvdW50ZXJGcm9tUnhCRAogICAgIAogIERFU0NSSVBUSU9OICAgVGhpcyBmdW5jdGlvbiBleHRyYWN0cyA0OC1iaXQgcmVwbGF5IHBhY2tldCBudW1iZXIgZnJvbSBSWCBCRCAKIAogIERFUEVOREVOQ0lFUyAgVmFsaWRpdHkgb2YgcmVwbGF5IGNoZWNrIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGZ1bmN0aW9uIAogICAgICAgICAgICAgICAgaXMgY2FsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUEFSQU1FVEVSUyAgICBwdWNSeEhlYWRlciBwb2ludGVyIHRvIFJYIEJEIGhlYWRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBSRVRSVU4gICAgICAgIHZfVTY0X3QgICAgUGFja2V0IG51bWJlciBleHRhcmN0ZWQgZnJvbSBSWCBCRAoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9VNjRfdApXTEFOVExfR2V0UmVwbGF5Q291bnRlckZyb21SeEJECigKICAgdl9VOF90ICpwdWNSeEJESGVhZGVyCikKewovKiA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgaXMgY3JlYXRlZCBhcyBmb2xsb3dzCiAgIGZyb20gUlggQkQgNiBieXRlIFBNSSBjb21tYW5kOgogICBBZGRyIDogQUVTL1RLSVAKICAgMHgzOCA6IHBuMy90c2MzCiAgIDB4MzkgOiBwbjIvdHNjMgogICAweDNhIDogcG4xL3RzYzEKICAgMHgzYiA6IHBuMC90c2MwCgogICAweDNjIDogcG41L3RzYzUKICAgMHgzZCA6IHBuNC90c2M0ICovCgojaWZkZWYgQU5JX0JJR19CWVRFX0VORElBTgogICAgdl9VNjRfdCB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IDA7CiAgICAvKiBHZXR0aW5nIDQ4LWJpdCByZXBsYXkgY291bnRlciBmcm9tIHRoZSBSWCBCRCAqLwogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSBXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjBUTzIzKHB1Y1J4QkRIZWFkZXIpOyAKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIDw8PSAxNjsKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIHw9ICgoIFdMQU5IQUxfUlhfQkRfR0VUX1BNSUNNRF8yNFRPMjUocHVjUnhCREhlYWRlcikgJiAweEZGRkYwMDAwKSA+PiAxNik7CiAgICByZXR1cm4gdWxsY3VycmVudFJlcGxheUNvdW50ZXI7CiNlbHNlCiAgICB2X1U2NF90IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gMDsKICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IChXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjRUTzI1KHB1Y1J4QkRIZWFkZXIpICYgMHgwMDAwRkZGRik7IAogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPDw9IDMyOyAKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIHw9IFdMQU5IQUxfUlhfQkRfR0VUX1BNSUNNRF8yMFRPMjMocHVjUnhCREhlYWRlcik7IAogICAgcmV0dXJuIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwojZW5kaWYKfQojZW5kaWYKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX1Bvc3RSZXNOZWVkZWQKICAgICAKICBERVNDUklQVElPTiAgIFRoaXMgZnVuY3Rpb24gcG9zdHMgbWVzc2FnZSB0byBUTCB0byByZXNlcnZlIEJEL1BEVSBtZW1vcnkKIAogIERFUEVOREVOQ0lFUyAgTm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgIAogIFBBUkFNRVRFUlMgICAgcHZvc0dDdHgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUkVUVVJOICAgICAgICBOb25lCgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdm9pZCBXTEFOVExfUG9zdFJlc05lZWRlZCh2X1BWT0lEX3QgcHZvc0dDdHgpCnsKICB2b3NfbXNnX3QgICAgICAgICAgICB2b3NNc2c7CgogIHZvc01zZy5yZXNlcnZlZCA9IDA7CiAgdm9zTXNnLmJvZHlwdHIgID0gTlVMTDsKICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfUkVTX05FRURFRDsKICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6IEJEL1BEVSBhdmFpbGFibGUgaW50ZXJydXB0IHJlY2VpdmVkLCBQb3N0aW5nIG1lc3NhZ2UgdG8gVEwiKTsKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NUV9JRF9UTCwgJnZvc01zZykpKQogIHsKICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiICVzIGZhaWxzIHRvIHBvc3QgbWVzc2FnZSIsIF9fZnVuY19fKTsKICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgIFdMQU5UTF9VcGRhdGVSc3NpQm1wcwoKICBERVNDUklQVElPTiAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIFRMJ3MgUlNTSSAoaW4gQk1QUyBtb2RlKQoKICBERVBFTkRFTkNJRVMgICBOb25lCgogIFBBUkFNRVRFUlMKCiAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0ICAgICAgICAgIFZPUyBHbG9iYWwgY29udGV4dAogICAgc3RhSWQgICAgICAgICAgICBTdGF0aW9uIElEICAgICAgICAgICBTdGF0aW9uIElECiAgICByc3NpICAgICAgICAgICAgIFJTU0kgKEJNUFMgbW9kZSkgICAgIFJTU0kgaW4gQk1QUyBtb2RlCgogIFJFVFVSTiAgICAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTICAgbm9uZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2b2lkIFdMQU5UTF9VcGRhdGVSc3NpQm1wcyh2X1BWT0lEX3QgcHZvc0dDdHgsIHZfVThfdCBzdGFJZCwgdl9TN190IHJzc2kpCnsKICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwoKICBpZiAoTlVMTCAhPSBwVExDYiAmJiBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXSkKICB7CiAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0tPnJzc2lBdmdCbXBzID0gcnNzaTsKICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgIFdMQU5UTF9VcGRhdGVTbnJCbXBzCgogIERFU0NSSVBUSU9OICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgVEwncyBTTlIgKGluIEJNUFMgbW9kZSkKCiAgREVQRU5ERU5DSUVTICAgTm9uZQoKICBQQVJBTUVURVJTCgogICAgcHZvc0dDdHggICAgICAgICBWT1MgY29udGV4dCAgICAgICAgICBWT1MgR2xvYmFsIGNvbnRleHQKICAgIHN0YUlkICAgICAgICAgICAgU3RhdGlvbiBJRCAgICAgICAgICAgU3RhdGlvbiBJRAogICAgc25yICAgICAgICAgICAgIFNOUiAoQk1QUyBtb2RlKSAgICAgU05SIGluIEJNUFMgbW9kZQoKICBSRVRVUk4gICAgICAgICBOb25lCgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdm9pZCBXTEFOVExfVXBkYXRlU25yQm1wcyh2X1BWT0lEX3QgcHZvc0dDdHgsIHZfVThfdCBzdGFJZCwgdl9TN190IHNucikKewogIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CgogIGlmIChOVUxMICE9IHBUTENiICYmIE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhSWRdKQogIHsKICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXS0+c25yQXZnQm1wcyA9IHNucjsKICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgIFdMQU5UTF9VcGRhdGVMaW5rQ2FwYWNpdHkKCiAgREVTQ1JJUFRJT04gICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBTVEEncyBMaW5rIENhcGFjaXR5IGluIFRMCgogIERFUEVOREVOQ0lFUyAgIE5vbmUKCiAgUEFSQU1FVEVSUwoKICAgIHB2b3NHQ3R4ICAgICAgICAgVk9TIGNvbnRleHQgICAgICAgICAgVk9TIEdsb2JhbCBjb250ZXh0CiAgICBzdGFJZCAgICAgICAgICAgIFN0YXRpb24gSUQgICAgICAgICAgIFN0YXRpb24gSUQKICAgIGxpbmtDYXBhY2l0eSAgICAgbGlua0NhcGFjaXR5ICAgICAgICAgTGluayBDYXBhY2l0eQoKICBSRVRVUk4gICAgICAgICBOb25lCgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdm9pZCBXTEFOVExfVXBkYXRlTGlua0NhcGFjaXR5KHZfUFZPSURfdCBwdm9zR0N0eCwgdl9VOF90IHN0YUlkLCB2X1UzMl90IGxpbmtDYXBhY2l0eSkKewogICAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKCiAgICBpZiAoTlVMTCAhPSBwVExDYiAmJiBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXSkKICAgIHsKICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0tPmxpbmtDYXBhY2l0eSA9IGxpbmtDYXBhY2l0eTsKICAgIH0KfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRTVEFMaW5rQ2FwYWNpdHkKCiAgREVTQ1JJUFRJT04KCiAgICBSZXR1cm5zIExpbmsgQ2FwYWNpdHkgb2YgYSBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIGl0cyBzdGF0ZSBjYW4gYmUgcmV0cmlldmVkLgoKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uCgogICAgT1VUCiAgICBwbGlua0NhcGFjaXR5OiAgdGhlIGN1cnJlbnQgbGluayBjYXBhY2l0eSB0aGUgY29ubmVjdGlvbiB0bwogICAgICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBzdGF0aW9uCgoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldFNUQUxpbmtDYXBhY2l0eQooCiAgICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICAgIHZfVTMyX3QgICAgICAgICAgICAgICAqcGxpbmtDYXBhY2l0eQopCnsKICAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBTYW5pdHkgY2hlY2sKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKCBOVUxMID09IHBsaW5rQ2FwYWNpdHkgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIiKSkpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICB9CgogICAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQiKSkpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgIGlmICggTlVMTCA9PSBwVExDYiApCiAgICB7CiAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IikpKTsKICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCIpKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQoKICAgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIikpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBHZXQgU1RBIHN0YXRlCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICpwbGlua0NhcGFjaXR5ID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPmxpbmtDYXBhY2l0eTsKCiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFNUQUxpbmtDYXBhY2l0eSAqLwo=