LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiAqCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCiAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCiAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAogKiBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAogKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgogKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwovKgogKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiAqCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCiAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCiAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAogKiBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAogKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgogKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgogICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIFQgTCAuIEMKCiAgT1ZFUlZJRVc6CgogIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gVHJhbnNwb3J0IExheWVyLgoKICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIE9OTFkgYnkgb3RoZXIKICBXTEFOIG1vZHVsZXMgdGhhdCBwcm9wZXJseSByZWdpc3RlciB3aXRoIHRoZSBUcmFuc3BvcnQgTGF5ZXIgaW5pdGlhbGx5LgoKICBERVBFTkRFTkNJRVM6CgogIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgoKCiAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCgoKICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgoKCiAgICRIZWFkZXIkJERhdGVUaW1lJCRBdXRob3IkCgoKICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMjAxMC0wNy0xMyAgICBjX3NoaW5kZSBGaXhlZCBhbiBpc3N1ZSB3aGVyZSBXQVBJIHJla2V5aW5nIHdhcyBmYWlsaW5nIGJlY2F1c2UgCiAgICAgICAgICAgICAgICAgICAgICBXQUkgZnJhbWUgc2VudCBvdXQgZHVyaW5nIHJla2V5aW5nIGhhZCB0aGUgcHJvdGVjdGVkIGJpdAogICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIDEuCjIwMTAtMDUtMDYgICAgcm5haXIgICBDaGFuZ2VkIG5hbWUgb2YgdmFyaWFibGUgZnJvbSB1c0xsY1R5cGUgdG8gdXNFdGhlclR5cGUKICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgZnVuY3Rpb24gbmFtZSBmcm9tIEdldExMQ1R5cGUgdG8gR2V0RXRoZXJUeXBlCiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCA4MDIuMyB0byA4MDIuMTEgZnJhbWUgdHJhbnNsYXRpb24gaXNzdWUgd2hlcmUgdHdvIAogICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIExMQyBoZWFkZXIgd2FzIGdldHRpbmcgb3ZlcndyaXR0ZW4gaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICBub24tUW9zIHBhdGgKMjAxMC0wNS0wNiAgICBybmFpciAgIFJ4QXV0aCBwYXRoIGZpeCBmb3IgbW9kaWZ5aW5nIHRoZSBoZWFkZXIgYmVmb3JlIGV0aGVyCiAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHJldHJlaXZlZCAoRGV0ZWN0ZWQgd2hpbGUgdGVzdGluZyByZWtleWluZwogICAgICAgICAgICAgICAgICAgICAgaW4gV0FQSSBWb2xhbnMpCjIwMTAtMDItMTkgICAgYmFkICAgICBGaXhlZCA4MDIuMTEgdG8gODAyLjMgZnQgaXNzdWVzIHdpdGggV0FQSQoyMDEwLTAyLTE5ICAgIHJuYWlyICAgV0FQSTogSWYgZnJhbWUgaXMgYSBXQUkgZnJhbWUgaW4gVHhDb25uIGFuZCBUeEF1dGgsIFRMIAogICAgICAgICAgICAgICAgICAgICAgZG9lcyBmcmFtZSB0cmFuc2xhdGlvbi4gCjIwMTAtMDItMDEgICAgcm5haXIgICBXQVBJOiBGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgdmFsdWUgb2YgdWNJc1dhcGlTdGEgd2FzIG5vdCAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHNldCBpbiB0aGUgVEwgY29udHJvbCBibG9jayBpbiB0aGUgUmVnaXN0ZXJTVEEgZnVuYy4gCjIwMTAtMDEtMDggICAgbHRpICAgICBBZGRlZCBUTCBEYXRhIENhY2hpbmcgCjIwMDktMTEtMDQgICAgcm5haXIgICBXQVBJOiBNb3ZpbmcgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdG8gYSBzZXBlcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIFdMQU5UTF9HZXRMTENUeXBlCjIwMDktMTAtMTUgICAgcm5haXIgICBXQVBJOiBGZWF0dXJpemluZyBXQVBJIGNvZGUKMjAwOS0xMC0wOSAgICBybmFpciAgIFdBUEk6IE1vZGlmaWNhdGlvbnMgdG8gYXV0aGVudGljYXRlZCBzdGF0ZSBoYW5kbGluZyBvZiBSeCBkYXRhCjIwMDktMTAtMDYgICAgcm5haXIgICBBZGRpbmcgc3VwcG9ydCBmb3IgV0FQSSAKMjAwOS0wOS0yMiAgICBsdGkgICAgIEFkZCBkZXJlZ2lzdHJhdGlvbiBBUEkgZm9yIG1hbmFnZW1lbnQgY2xpZW50CjIwMDktMDctMTYgICAgcm5haXIgICBUZW1wb3JhcnkgZml4IHRvIGxldCBUTCBmZXRjaCBwYWNrZXRzIHdoZW4gbXVsdGlwbGUgCiAgICAgICAgICAgICAgICAgICAgICBwZWVycyBleGlzdCBpbiBhbiBJQlNTCjIwMDktMDYtMTAgICAgbHRpICAgICBGaXggZm9yIGNoZWNraW5nIFRJRCB2YWx1ZSBvZiBtZXRhIGluZm8gb24gVFggLSBwcmV2ZW50CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgb3ZlcndyaXRlIAogICAgICAgICAgICAgICAgICAgICAgRml4IGZvciBwcm9wZXJseSBjaGVja2luZyB0aGUgc3RhIGlkIGZvciByZXN1bWluZyB0cmlnZ2VyCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBnZW5lcmF0aW9uCjIwMDktMDUtMTQgICAgbHRpICAgICBGaXggZm9yIHNlbmRpbmcgb3V0IHRyaWdnZXIgZnJhbWVzCjIwMDktMDUtMTUgICAgbHRpICAgICBBZGRyMyBmaWx0ZXJpbmcgCjIwMDktMDQtMTMgICAgbHRpICAgICBBc3NlcnQgaWYgcGFja2V0IGxhcmdlciB0aGVuIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgIERyb3AgcGFja2V0IHRoYXQgZmFpbHMgZmxhdHRlbgoyMDA5LTA0LTAyICAgIGx0aSAgICAgUGVyZm9ybWFuY2UgZml4ZXMgZm9yIFRMIAoyMDA5LTAyLTE5ICAgIGx0aSAgICAgQWRkZWQgZml4IGZvciBMTEMgbWFuYWdlbWVudCBvbiBSeCBDb25uZWN0IAoyMDA5LTAxLTE2ICAgIGx0aSAgICAgUmVwbGFjZWQgcGVlayBkYXRhIHdpdGggZXh0cmFjdCBkYXRhIGZvciBub24gQkQgb3BlcnRpb25zCiAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0ZWQgZnJhbWUgY29udHJvbCBpbiBUbCBhbmQgcGFzcyB0byBIQUwgZm9yIGZyYW1lIAogICAgICAgICAgICAgICAgICAgICAgdHlwZSBldmFsdWF0aW9uCjIwMDktMDItMDIgICAgc2NoICAgICBBZGQgaGFuZG9mZiBzdXBwb3J0CjIwMDgtMTItMDkgICAgbHRpICAgICBGaXhlcyBmb3IgQU1TUyBjb21waWxhdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgYXNzZXJ0IG9uIHJlY2VpdmUgd2hlbiB0aGVyZSBpcyBubyBzdGF0aW9uCjIwMDgtMTItMDIgICAgbHRpICAgICBGaXggZm8gdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uIAoyMDA4LTEwLTMxICAgIGx0aSAgICAgRml4IGZvIFRMIHR4IHN1c3BlbmQKMjAwOC0xMC0wMSAgICBsdGkgICAgIE1lcmdlZCBpbiBmaXhlcyBmcm9tIHJlb3JkZXJpbmcKICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkIHBhcnQgb2YgVUFQU0QgZnVuY3Rpb25hbGl0eSBpbiBUTAogICAgICAgICAgICAgICAgICAgICAgKHdpbGwgYmUgcmUtZW5hYmxlZCBvbmNlIFVBUFNEIGlzIHRlc3RlZCkKICAgICAgICAgICAgICAgICAgICAgIEZpeCBmb3IgVUFQU0QgbXVsdGlwbGUgZW5hYmxlCjIwMDgtMDgtMTAgICAgbHRpICAgICBGaXhlcyBmb2xsb3dpbmcgVUFQU0QgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgaW5maW5pdGUgbG9vcCBvbiBtYXNrIGNvbXB1dGF0aW9uIHdoZW4gU1RBIG5vIHJlZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgRml4ZXMgYWZ0ZXIgUU9TIHVuaXQgdGVzdGluZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgQWRkZWQgUU9TIHN1cHBvcnQKMjAwOC0wNy0yMyAgICBsdGkgICAgIEZpeCBmb3Igdm9zIHBhY2tldCBkcmFpbmluZwoyMDA4LTA3LTE3ICAgIGx0aSAgICAgRml4IGZvciBkYXRhIHR5cGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZyYW1lIHRyYW5zbGF0aW9uIGNvZGUgaW4gVEwKICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJldHVybmluZyBmYWlsdXJlIHRvIFBFIGluIGNhc2UgcHJldmlvdXMgZnJhbWUgaXMKICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIHBlbmRpbmc7IGZhaWwgcHJldmlvdXMgYW5kIGNhY2hlIG5ldyBvbmUgZm9yIHR4CiAgICAgICAgICAgICAgICAgICAgICBHZXQgZnJhbWVzIHJldHVybmluZyBib29sZWFuIHRydWUgaWYgbW9yZSBmcmFtZXMgYXJlIHBlbmRpbmcKMjAwOC0wNy0wMyAgICBsdGkgICAgIEZpeGVzIGZvbGxvd2luZyBwcmUtaW50ZWdyYXRpb24gdGVzdGluZwoyMDA4LTA2LTI2ICAgIGx0aSAgICAgRml4ZXMgZm9sbG93aW5nIHVuaXQgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgYWxsb2MgYW5kIGZyZWUgZm9yIFRMIGNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIGF0b21pYyBzZXQgdTggaW5zdGVhZCBvZiB1MzIKMjAwOC0wNS0xNiAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEluY2x1ZGUgRmlsZXMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaV9iYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsX2hvc3VwcG9ydC5oIgojaW5jbHVkZSAidGxEZWJ1Zy5oIgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKLypJbmNsdWRlZCB0byBhY2Nlc3MgV0RJX1J4QmRUeXBlICovCiNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfYmQuaCIKI2VuZGlmCi8qRW5hYmxlcyBkZWJ1Z2dpbmcgYmVoYXZpb3IgaW4gVEwqLwojZGVmaW5lIFRMX0RFQlVHCi8qRW5hYmxlcyBkZWJ1Z2dpbmcgRkMgY29udHJvbCBmcmFtZSBpbiBUTCovCi8vI2RlZmluZSBUTF9ERUJVR19GQwovLyNkZWZpbmUgV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KCi8vI2RlZmluZSBCVEFNUF9URVNUCiNpZmRlZiBUTF9ERUJVR19GQwojaW5jbHVkZSA8d2xhbl9xY3RfcGFsX3N0YXR1cy5oPgojaW5jbHVkZSA8d2xhbl9xY3RfcGFsX2RldmljZS5oPiAvLyB3cGFsUmVhZFJlZ2lzdGVyCiNlbmRpZgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKkxMQyBoZWFkZXIgdmFsdWUqLwpzdGF0aWMgdl9VOF90IFdMQU5UTF9MTENfSEVBREVSW10gPSAgezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCi8qQWlyb25ldCBTTkFQIGhlYWRlciB2YWx1ZSovCnN0YXRpYyB2X1U4X3QgV0xBTlRMX0FJUk9ORVRfU05BUF9IRUFERVJbXSA9ICB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMCB9OwojZW5kaWYgLy9GRUFUVVJFX1dMQU5fQ0NYCgovKkJULUFNUCBwYWNrZXQgTExDIE9VSSB2YWx1ZSovCmNvbnN0IHZfVThfdCBXTEFOVExfQlRfQU1QX09VSVtdID0gIHsweDAwLCAweDE5LCAweDU4IH07CgoKI2lmZGVmIFZPTEFOU19QRVJGCiNkZWZpbmUgV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfRU5BQkxFX1RIUkVTSE9MRCAgMTIwCiNkZWZpbmUgV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfR0VUX1RIUkVTSE9MRCAgMTIwCgovKiBUTCBCRC9QRFUgdGhyZXNob2xkIHRvIGVuYWJsZSBpbnRlcnJ1cHQgKi8KaW50IGJkUGR1SW50ZXJydXB0RW5hYmxlVGhyZXNob2xkID0gV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfRU5BQkxFX1RIUkVTSE9MRDsKaW50IGJkUGR1SW50ZXJydXB0R2V0VGhyZXNob2xkID0gV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfR0VUX1RIUkVTSE9MRDsKI2VuZGlmIC8qIFZPTEFOU19QRVJGICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogfCAgIFR5cGUoMmIpICAgfCAgICAgU3ViLXR5cGUoNGIpICAgfAogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZSBXTEFOVExfSVNfREFUQV9GUkFNRShfdHlwZV9zdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfREFUQV9GUkFNRV9UWVBFID09ICggKF90eXBlX3N1YikgJiAweDMwICkpCgojZGVmaW5lIFdMQU5UTF9JU19RT1NfREFUQV9GUkFNRShfdHlwZV9zdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICgoIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkgJiYgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4RiApKSkgCgojZGVmaW5lIFdMQU5UTF9JU19NR01UX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF9NR01UX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkKCiNkZWZpbmUgV0xBTlRMX0lTX0NUUkxfRlJBTUUoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX0NUUkxfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiNkZWZpbmUgV0xBTlRMX0lTX1RETFNfRlJBTUUoX2V0aF90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX0xMQ19URExTX1RZUEUgPT0gKCBfZXRoX3R5cGUpKQojZW5kaWYKCi8qTUFYIEFsbG93ZWQgbGVuIHByb2Nlc3NlZCBieSBUTCAtIE1BeCBNVFUgKyA4MDIuMyBoZWFkZXIgKyBCRCtEWEUrWFRMKi8KI2RlZmluZSBXTEFOVExfTUFYX0FMTE9XRURfTEVOICAgICgxNTE0ICsgMTAwKQoKI2RlZmluZSBXTEFOVExfTUFTS19BQyAgMHgwMwoKLy9zb21lIGZsb3dfY29udHJvbCBkZWZpbmUKLy9MV00gbW9kZSB3aWxsIGJlIGVuYWJsZWQgZm9yIHRoaXMgc3RhdGlvbiBpZiB0aGUgZWdyZXNzL2luZ3Jlc3MgZmFsbHMgYmVsb3cgdGhpcyByYXRpbwojZGVmaW5lIFdMQU5UTF9MV01fRUdSRVNTX0lOR1JFU1NfVEhSRVNIT0xEICgwLjc1KQoKLy9HZXQgZW5vdWdoIHNhbXBsZSB0byBkbyB0aGUgTFdNIHJlbGF0ZWQgY2FsY3VsYXRpb24KI2RlZmluZSBXTEFOVExfTFdNX0lOR1JFU1NfU0FNUExFX1RIUkVTSE9MRCAoNjQpCgovL01heGltYWwgb24tZmx5IHBhY2tldCBwZXIgc3RhdGlvbiBpbiBMV00gbW9kZQojZGVmaW5lIFdMQU5UTF9TVEFfQk1VX1RIUkVTSE9MRF9NQVggKDI1NikKCiNkZWZpbmUgV0xBTlRMX0FDX01BU0sgKDB4NykKI2RlZmluZSBXTEFOVExfU1RBSURfT0ZGU0VUICgweDYpCgovKiBVSU5UMzIgdHlwZSBlbmRpYW4gc3dhcCAqLwojZGVmaW5lIFNXQVBfRU5ESUFOX1VJTlQzMihhKSAgICAgICAgICAoKGEpID0gKChhKSA+PiAweDE4ICkgfCgoKGEpICYgMHhGRjAwMDApID4+IDB4MDgpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGEpICYgMHhGRjAwKSA8PCAweDA4KSAgfCAoKChhKSAmIDB4RkYpIDw8IDB4MTgpKQoKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFRJRCB0byBBQyBtYXBwaW5nIGluIFRMCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmNvbnN0IHZfVThfdCAgV0xBTlRMX1RJRF8yX0FDW1dMQU5fTUFYX1RJRF0gPSB7ICAgV0xBTlRMX0FDX0JFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ19CSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQUNfQkssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDX0JFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ19WSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQUNfVkksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDX1ZPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ19WTyB9OwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFR5cGUgRGVjbGFyYXRpb25zCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojZGVmaW5lIFRMX0xJVFRMRV9CSVRfRU5ESUFOCgp0eXBlZGVmIHN0cnVjdAp7CgojaWZuZGVmIFRMX0xJVFRMRV9CSVRfRU5ESUFOCgogICB2X1U4X3Qgc3ViVHlwZSA6NDsKICAgdl9VOF90IHR5cGUgOjI7CiAgIHZfVThfdCBwcm90VmVyIDoyOwoKICAgdl9VOF90IG9yZGVyIDoxOwogICB2X1U4X3Qgd2VwIDoxOwogICB2X1U4X3QgbW9yZURhdGEgOjE7CiAgIHZfVThfdCBwb3dlck1nbXQgOjE7CiAgIHZfVThfdCByZXRyeSA6MTsKICAgdl9VOF90IG1vcmVGcmFnIDoxOwogICB2X1U4X3QgZnJvbURTIDoxOwogICB2X1U4X3QgdG9EUyA6MTsKCiNlbHNlCgogICB2X1U4X3QgcHJvdFZlciA6MjsKICAgdl9VOF90IHR5cGUgOjI7CiAgIHZfVThfdCBzdWJUeXBlIDo0OwoKICAgdl9VOF90IHRvRFMgOjE7CiAgIHZfVThfdCBmcm9tRFMgOjE7CiAgIHZfVThfdCBtb3JlRnJhZyA6MTsKICAgdl9VOF90IHJldHJ5IDoxOwogICB2X1U4X3QgcG93ZXJNZ210IDoxOwogICB2X1U4X3QgbW9yZURhdGEgOjE7CiAgIHZfVThfdCB3ZXAgOjE7CiAgIHZfVThfdCBvcmRlciA6MTsKCiNlbmRpZgoKfSBXTEFOVExfTUFDRkNUeXBlOwoKLyogODAyLjExIGhlYWRlciAqLwp0eXBlZGVmIHN0cnVjdAp7CiAvKiBGcmFtZSBjb250cm9sIGZpZWxkICovCiBXTEFOVExfTUFDRkNUeXBlICB3RnJtQ3RybDsKCiAvKiBEdXJhdGlvbiBJRCAqLwogdl9VMTZfdCAgdXNEdXJhdGlvbklkOwoKIC8qIEFkZHJlc3MgMSBmaWVsZCAgKi8KIHZfVThfdCAgIHZBMVtWT1NfTUFDX0FERFJfU0laRV07CgogLyogQWRkcmVzcyAyIGZpZWxkICovCiB2X1U4X3QgICB2QTJbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIEFkZHJlc3MgMyBmaWVsZCAqLwogdl9VOF90ICAgdkEzW1ZPU19NQUNfQUREUl9TSVpFXTsKCiAvKiBTZXF1ZW5jZSBjb250cm9sIGZpZWxkICovCiB2X1UxNl90ICB1c1NlcUN0cmw7CgogLy8gRmluZCB0aGUgc2l6ZSBvZiB0aGUgbWFuZGF0b3J5IGhlYWRlciBzaXplLgojZGVmaW5lIFdMQU44MDIxMV9NQU5EQVRPUllfSEVBREVSX1NJWkUgXAogICAgKHNpemVvZihXTEFOVExfTUFDRkNUeXBlKSArIHNpemVvZih2X1UxNl90KSArIFwKICAgICgzICogKHNpemVvZih2X1U4X3QpICogVk9TX01BQ19BRERSX1NJWkUpKSAgKyBcCiAgICBzaXplb2Yodl9VMTZfdCkpCgogLyogT3B0aW9uYWwgQTQgYWRkcmVzcyAqLwogdl9VOF90ICAgb3B0dkE0W1ZPU19NQUNfQUREUl9TSVpFXTsKCiAvKiBPcHRpb25hbCBRT1MgY29udHJvbCBmaWVsZCAqLwogdl9VMTZfdCAgdXNRb3NDdHJsOwp9V0xBTlRMXzgwMjExSGVhZGVyVHlwZTsKCi8qIDgwMi4zIGhlYWRlciAqLwp0eXBlZGVmIHN0cnVjdAp7CiAvKiBEZXN0aW5hdGlvbiBhZGRyZXNzIGZpZWxkICovCiB2X1U4X3QgICB2REFbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIFNvdXJjZSBhZGRyZXNzIGZpZWxkICovCiB2X1U4X3QgICB2U0FbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIExlbmd0aCBmaWVsZCAqLwogdl9VMTZfdCAgdXNMZW5UeXBlOwp9V0xBTlRMXzgwMjNIZWFkZXJUeXBlOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEdsb2JhbCBEYXRhIERlZmluaXRpb25zCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojZGVmaW5lIFdMQU5fVExfSU5WQUxJRF9VX1NJRyAyNTUKI2RlZmluZSBXTEFOX1RMX0lOVkFMSURfQl9TSUcgMjU1CiNkZWZpbmUgRU5URVIoKSBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiRW50ZXI6JXMiLCBfX2Z1bmNfXykKCgojZGVmaW5lIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBfcFNUQSwgX3VjQUNNYXNrLCBpICkgXAogIGRvXAogIHtcCiAgICBfdWNBQ01hc2sgPSAwOyBcCiAgICBmb3IgKCBpID0gMDsgaSA8IFdMQU5UTF9NQVhfQUM7IGkrKyApIFwKICAgIHsgXAogICAgICBpZiAoIDAgIT0gKF9wU1RBKS0+YXVjQUNNYXNrW2ldICkgXAogICAgICB7IFwKICAgICAgICBfdWNBQ01hc2sgfD0gKCAxIDw8IGkgKTsgXAogICAgICB9IFwKICAgIH0gXAogIH0gd2hpbGUgKDApOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBTdGF0aWMgRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEZWZpbml0aW9ucwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnN0YXRpYyBWT1NfU1RBVFVTIApXTEFOVExfR2V0RXRoZXJUeXBlCigKICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogIHZvc19wa3RfdCAgICAgICAgICAgICogdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLAogIHZfVTE2X3QgICAgICAgICAgICAgICogdXNFdGhlclR5cGUKKTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMU19JTlRFUk5BTAovKiBGSVhNRV9NVVNUOiBkdXJpbmcgVERMUyBpbnRlZ3JhdGlvbiB0byBtYWluL2xhdGVzdCwgV0xBTlRMX0dldEV0aGVyVHlwZSgpIGNvbmZsaWN0cy4KQnV0IHRoZXJlIGlzIGRpZmZlcmVuY2UuIGV4aXN0aW5nIFdMQU5UTF9HZXRFdGhlclR5cGUoKSBleHBlY3RzIHZvc0RhdGFCdWZmLT5vZmZzZXQgcG9pbnRzIHRvIE1QRFUgSGVhZGVyLAp3aGVyZWFzZSBURExTIGV4cGVjdCB2b3NEYXRhQnVmZi0+b2Zmc2V0IHNob3VsZCBzdGlsbCBwb2ludHMgdG8gUnhCZC4gClNvIGZhciwgZGF0YSBmcm1hZSBzdHJpcHBlZCBSeEJEIGFuZCBwYXNzZWQgdG8gZGF0YSBmcmFtZSBoYW5kbGVyLgooUnhCZCBzaG91bGQgbm90IGJlIHN0cmlwcGVkIGluIGNhc2UgVERMUywgYmVjYXVzZSBpdCB3aWxsIGJlIGV2ZW50dWFsbHkgcm91dGVkIHRvIG1nbXQgcGFja2V0IApoYW5kbGVyLCB3aGVyZSBSWCBCRCBzaG91bGQgYmUgcHJlc2VydmVkKQpUbyBhdm9pZCBicmVha2luZyBleGlzdGluZyBmdW5jdGlvbmFsaXR5LCBmb3Igbm93LCBJIHRlbXBvcmFyaWx5IHJlbmFtZSB0bwpXTEFOVExfR2V0RXRoZXJUeXBlXzIoKS4gRXZlbnR1YWxseSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSByZW1vdmVkIGFuZCBtZXJnZWQgdG8gV0xBTlRMX0dldEV0aGVyVHlwZSgpCiovCnN0YXRpYyBWT1NfU1RBVFVTIApXTEFOVExfR2V0RXRoZXJUeXBlXzIKKAogIHZfVThfdCAgICAgICAgICAgICAgICogYXVjQkRIZWFkZXIsCiAgdm9zX3BrdF90ICAgICAgICAgICAgKiB2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgdl9VMTZfdCAgICAgICAgICAgICAgKiB1c0V0aGVyVHlwZQopOwojZW5kaWYKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEFkZGluZyBhIGdsb2JhbCB2YXJpYWJsZSB0byBiZSB1c2VkIHdoZW4gZG9pbmcgZnJhbWUgdHJhbnNsYXRpb24gaW4gVHhBdXRoCiAqIHN0YXRlIHNvIGFzIHRvIG5vdCBzZXQgdGhlIHByb3RlY3RlZCBiaXQgdG8gMSBpbiB0aGUgY2FzZSBvZiBXQUkgZnJhbWVzCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdl9VOF90IGdVY0lzV2FpOwojZW5kaWYKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBFeHRlcm5hbGl6ZWQgRnVuY3Rpb24gRGVmaW5pdGlvbnMKKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgICAgIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5CgogIERFU0NSSVBUSU9OCiAgSXQgZnJlZXMgdXAgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gYWxsIHRoZSBTVEEgY2xpZW50cyBpbiBUTENCIGJsb2NrCiAgQ2FuIGJlIGNhbGxlZCBpbnNpZGUgQ2xvc2UsIFN0b3Agb3Igd2hlbiBzb21lIEZBVUxUIG9jY3VycwoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICBJTgogIHBDbGllbnRTVEE6ICAgIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjbGllbnQgcG9pbnRlciBhcnJheQoKICBSRVRVUk4gVkFMVUUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZCBXTEFOVExfRnJlZUNsaWVudE1lbW9yeQooV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEFbV0xBTl9NQVhfU1RBX0NPVU5UXSkKewogICAgdl9VMzJfdCBpID0gMDsKICAgIGZvcihpID0wOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICB7CiAgICAgICAgaWYoIE5VTEwgIT0gcENsaWVudFNUQVtpXSApCiAgICAgICAgewogICAgICAgICAgIHZvc19tZW1fZnJlZShwQ2xpZW50U1RBW2ldKTsKICAgICAgICB9CiAgICAgICAgcENsaWVudFNUQVtpXSA9IE5VTEw7CiAgICB9CiAgICByZXR1cm47Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX09wZW4KCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIREQgYXQgZHJpdmVyIGluaXRpYWxpemF0aW9uLiBUTCB3aWxsIGluaXRpYWxpemUgYWxsIGl0cwogICAgaW50ZXJuYWwgcmVzb3VyY2VzIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjYWxsIHRvIHN0YXJ0IHRvIHJlZ2lzdGVyCiAgICB3aXRoIHRoZSBvdGhlciBtb2R1bGVzLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHBUTENvbmZpZzogICAgICBUTCBDb25maWd1cmF0aW9uCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX09wZW4KKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9Db25maWdJbmZvVHlwZSogIHBUTENvbmZpZwopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOyAKICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCiAgdEhhbEhhbmRsZSAgICAgIHNtZUNvbnRleHQ7CiAgdl9VMzJfdCBpID0gMDsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICBWT1NfU1RBVFVTICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwojZW5kaWYKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICB2b3NfYWxsb2NfY29udGV4dCggcHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIAogICAgICAgICAgICAgICAgICAgICh2b2lkKikmcFRMQ2IsIHNpemVvZihXTEFOVExfQ2JUeXBlKSk7CgogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8ICggTlVMTCA9PSBwVExDb25maWcgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAiV0xBTiBUTDogSW52YWxpZCBpbnB1dCBwb2ludGVyIG9uIFdMQU5UTF9PcGVuIFRMICVwIENvbmZpZyAlcCIsIHBUTENiLCBwVExDb25maWcgKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyogU2V0IHRoZSBkZWZhdWx0IGxvZyBsZXZlbCB0byBWT1NfVFJBQ0VfTEVWRUxfRVJST1IgKi8KICB2b3NfdHJhY2Vfc2V0TGV2ZWwoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SKTsKCiAgc21lQ29udGV4dCA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgcHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBzbWVDb250ZXh0ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgc21lQ29udGV4dCIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyogWmVybyBvdXQgdGhlIG1lbW9yeSBzbyB3ZSBhcmUgT0ssIHdoZW4gQ2xlYW5DQiBpcyBjYWxsZWQuKi8KICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopcFRMQ2IsIHNpemVvZihXTEFOVExfQ2JUeXBlKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGVhbiB1cCBUTCBjb250cm9sIGJsb2NrLCBpbml0aWFsaXplIGFsbCB2YWx1ZXMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX09wZW4iKSk7CgogIGZvciAoIGkgPTA7IGk8V0xBTl9NQVhfU1RBX0NPVU5UOyBpKysgKQogIHsKICAgICAgaWYgKCBpIDwgV0xBTl9OT04zMl9TVEFfQ09VTlQgKQogICAgICB7CiAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSA9IHZvc19tZW1fbWFsbG9jKHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkpOwogICAgICAgICAgLyogQWxsb2NhdGluZyBtZW1vcnkgZm9yIExFR0FDWSBTVEEgQ09VTlQgc28gYXMgdG8gYXZvaWQgcmVncmVzc2lvbiBpc3N1ZXMuICAqLwogICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0gKQogICAgICAgICB7CiAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6IFN0YUNsaWVudCBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKICAgICAgICAgICAgIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5KHBUTENiLT5hdGxTVEFDbGllbnRzKTsKICAgICAgICAgICAgIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICAgICAgIH0KICAgICAgICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSwgc2l6ZW9mKFdMQU5UTF9TVEFDbGllbnRUeXBlKSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSA9IE5VTEw7CiAgICAgIH0KICB9CgogIHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCA9IHZvc19tZW1fbWFsbG9jKHNpemVvZihXTEFOVExfUkVPUkRFUl9CVUZGRVJfVCkgKiBXTEFOVExfTUFYX0JBX1NFU1NJT04pOwogIGlmIChOVUxMID09IHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6IFJlb3JkZXIgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKSk7CiAgICBXTEFOVExfRnJlZUNsaWVudE1lbW9yeShwVExDYi0+YXRsU1RBQ2xpZW50cyk7CiAgICB2b3NfZnJlZV9jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCBwVExDYik7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCwgc2l6ZW9mKFdMQU5UTF9SRU9SREVSX0JVRkZFUl9UKSAqIFdMQU5UTF9NQVhfQkFfU0VTU0lPTik7CgogIFdMQU5UTF9DbGVhbkNCKHBUTENiLCAwIC8qZG8gbm90IGVtcHR5Ki8pOwoKICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5UTF9NQVhfQUMgOyB1Y0luZGV4KyspCiAgewogICAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y0luZGV4XSA9IHBUTENvbmZpZy0+dWNBY1dlaWdodHNbdWNJbmRleF07CiAgfQoKICAvLyBzY2hlZHVsaW5nIGluaXQgdG8gYmUgdGhlIGxhc3Qgb25lIG9mIHByZXZpb3VzIHJvdW5kCiAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQyA9IFdMQU5UTF9BQ19CSzsKICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID0gMTsKICBwVExDYi0+dWNDdXJyZW50U1RBID0gV0xBTl9NQVhfU1RBX0NPVU5ULTE7CgojaWYgMAogIC8vZmxvdyBjb250cm9sIGZpZWxkIGluaXQKICB2b3NfbWVtX3plcm8oJnBUTENiLT50bEZDSW5mbywgc2l6ZW9mKHRGY1R4UGFyYW1zX3R5cGUpKTsKICAvL2JpdCAwOiBzZXQgKEJkL3BkdSBjb3VudCkgYml0IDE6IHNldCAocmVxdWVzdCBzdGF0aW9uIFBTIGNoYW5nZSBub3RpZmljYXRpb24pCiAgcFRMQ2ItPnRsRkNJbmZvLmZjQ29uZmlnID0gMHgxOwojZW5kaWYKCiAgcFRMQ2ItPnZvc1R4RkNCdWYgPSBOVUxMOwogIHBUTENiLT50bENvbmZpZ0luZm8udU1pbkZyYW1lc1Byb2NUaHJlcyA9CiAgICAgICAgICAgICAgICBwVExDb25maWctPnVNaW5GcmFtZXNQcm9jVGhyZXM7CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBwVExDYi0+dWNUZGxzUGVlckNvdW50ID0gMDsKI2VuZGlmCgogIHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50ID0KICAgICAgICAgICAgICAgIHBUTENvbmZpZy0+dURlbGF5ZWRUcmlnZ2VyRnJtSW50OwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWxsb2NhdGUgaW50ZXJuYWwgcmVzb3VyY2VzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX3BrdF9nZXRfcGFja2V0KCZwVExDYi0+dm9zRHVtbXlCdWYsIFZPU19QS1RfVFlQRV9SWF9SQVcsIDEsIDEsCiAgICAgICAgICAgICAgICAgICAgIDEvKnRydWUqLyxOVUxMLCBOVUxMKTsKCiAgV0xBTlRMX0luaXRCQVJlb3JkZXJCdWZmZXIocHZvc0dDdHgpOwojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAvKiBJbml0aWFsaXplIEhhbmRvZmYgc3VwcG9ydCBtb2R1ZQogICAgKiBSU1NJIG1lYXN1cmUgYW5kIFRyYWZmaWMgc3RhdGUgbW9uaXRvcmluZyAqLwogIHN0YXR1cyA9IFdMQU5UTF9IU0luaXQocHZvc0dDdHgpOwogIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiSGFuZG9mZiBzdXBwb3J0IG1vZHVsZSBpbml0IGZhaWwiKSk7CiAgICBXTEFOVExfRnJlZUNsaWVudE1lbW9yeShwVExDYi0+YXRsU1RBQ2xpZW50cyk7CiAgICB2b3NfbWVtX2ZyZWUocFRMQ2ItPnJlb3JkZXJCdWZmZXJQb29sKTsKICAgIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKICAgIHJldHVybiBzdGF0dXM7CiAgfQojZW5kaWYKCiAgcFRMQ2ItPmlzQk1QUyA9IFZPU19GQUxTRTsKICBwbWNSZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kKCBzbWVDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9Qb3dlclN0YXRlQ2hhbmdlZENCLCBwdm9zR0N0eCApOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX09wZW4gKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1N0YXJ0CgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgc3RhcnQgcHJvY2VkdXJlLiBUTCB3aWxsIHVzZSB0aGlzCiAgICBjYWxsIHRvIHJlZ2lzdGVyIHdpdGggQkFMIGFzIGEgdHJhbnNwb3J0IGxheWVyIGVudGl0eS4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgT3RoZXIgY29kZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgQkFMIGZhaWx1cmU7IHNlZSBCQUwgQVBJCiAgICBmb3IgbW9yZSBpbmZvCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1N0YXJ0CigKICB2X1BWT0lEX3QgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgICAgICA9IE5VTEw7CiAgdl9VMzJfdCAgICAgICAgICAgICB1UmVzQ291bnQgPSBXREFfVExJX01JTl9SRVNfREFUQTsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU3RhcnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlZ2lzdGVyIHdpdGggV0RBIGFzIHRyYW5zcG9ydCBsYXllciBjbGllbnQKICAgIFJlcXVlc3QgcmVzb3VyY2VzIGZvciB0eCBmcm9tIGJ1cwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU4gVEw6V0xBTlRMX1N0YXJ0IikpOwoKICB2b3NTdGF0dXMgPSBXREFfRFNfUmVnaXN0ZXIoIHB2b3NHQ3R4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfVHhDb21wLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUnhGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0dldEZyYW1lcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX1Jlc291cmNlQ0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0RBX1RMSV9NSU5fUkVTX0RBVEEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHB2b3NHQ3R4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAmdVJlc0NvdW50ICk7IAoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCiAgICAgICAgICAgICAgICJXTEFOIFRMOlRMIGZhaWxlZCB0byByZWdpc3RlciB3aXRoIEJBTC9XREEsIEVycjogJWQiLAogICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICAvKiBFbmFibGUgdHJhbnNtaXNzaW9uICovCiAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMCk7CgogIHBUTENiLT51UmVzQ291bnQgPSB1UmVzQ291bnQ7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU3RhcnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1N0b3AKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIREQgdG8gc3RvcCBvcGVyYXRpb24gaW4gVEwsIGJlZm9yZSBjbG9zZS4gVEwgd2lsbCBzdXNwZW5kIGFsbAogICAgZnJhbWUgdHJhbnNmZXIgb3BlcmF0aW9uIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjbG9zZSByZXF1ZXN0IHRvIGNsZWFuIHVwCiAgICBpdHMgcmVzb3VyY2VzLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU3RvcAooCiAgdl9QVk9JRF90ICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHZfVThfdCAgICAgIHVjSW5kZXg7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEVOVEVSKCk7CiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdG9wIFRMIGFuZCBlbXB0eSBTdGF0aW9uIGxpc3QKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX1N0b3AiKSk7CgogIC8qIERpc2FibGUgdHJhbnNtaXNzaW9uICovCiAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMSk7CgogIGlmICggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmID0gTlVMTDsKICB9CgogIGlmICggTlVMTCAhPSBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZik7CiAgICBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmID0gTlVMTDsKICB9CgojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXTEFOVExfSFNTdG9wKHB2b3NHQ3R4KSkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgIkhhbmRvZmYgU3VwcG9ydCBtb2R1bGUgc3RvcCBmYWlsIikpOwogIH0KI2VuZGlmCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYW4gY2xpZW50IHN0YXRpb25zCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfU1RBX0NPVU5UOyB1Y0luZGV4KyspCiAgewogICAgaWYgKCBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdICkKICAgIHsKICAgICAgICBXTEFOVExfQ2xlYW5TVEEocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0sIDEgLyplbXB0eSBhbGwgcXVldWVzKi8pOwogICAgfQogIH0KCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU3RvcCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xvc2UKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIREQgZHVyaW5nIGdlbmVyYWwgZHJpdmVyIGNsb3NlIHByb2NlZHVyZS4gVEwgd2lsbCBjbGVhbiB1cAogICAgYWxsIHRoZSBpbnRlcm5hbCByZXNvdXJjZXMuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbG9zZQooCiAgdl9QVk9JRF90ICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHRIYWxIYW5kbGUgc21lQ29udGV4dDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRGVyZWdpc3RlciBmcm9tIFBNQwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHNtZUNvbnRleHQgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9TTUUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gc21lQ29udGV4dCApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHNtZUNvbnRleHQiLCBfX2Z1bmNfXykpOwogICAgLy8gY29udGludWUgc28gdGhhdCB3ZSBjYW4gY2xlYW51cCBhcyBtdWNoIGFzIHBvc3NpYmxlCiAgfQogIGVsc2UKICB7CiAgICBwbWNEZXJlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQoIHNtZUNvbnRleHQsIFdMQU5UTF9Qb3dlclN0YXRlQ2hhbmdlZENCICk7CiAgfQoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0xBTlRMX0hTRGVJbml0KHB2b3NHQ3R4KSkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgIkhhbmRvZmYgU3VwcG9ydCBtb2R1bGUgRGVJbml0IGZhaWwiKSk7CiAgfQojZW5kaWYKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFudXAgVEwgY29udHJvbCBibG9jay4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6IFdMQU5UTF9DbG9zZSIpKTsKICBXTEFOVExfQ2xlYW5DQihwVExDYiwgMSAvKiBlbXB0eSBxdWV1ZXMvbGlzdHMvcGt0cyBpZiBhbnkqLyk7CgogIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5KHBUTENiLT5hdGxTVEFDbGllbnRzKTsKCiAgdm9zX21lbV9mcmVlKHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGcmVlIFRMIGNvbnRleHQgZnJvbSBWT1NTIGdsb2JhbAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0Nsb3NlICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggSERECiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsCgogIERFU0NSSVBUSU9OCiAgICAgRnVuY3Rpb24gdG8gZGlzYWJsZS9lbmFibGUgZnJhbWUgdHJhbnNsYXRpb24gZm9yIGFsbCBhc3NvY2lhdGlvbiBzdGF0aW9ucy4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgSU4KICAgIHB2b3NHQ3R4OiBWT1MgY29udGV4dCAKICAgIEVuYWJsZUZyYW1lWGxhdGlvbiBUUlVFIG1lYW5zIGVuYWJsZSBTVyB0cmFuc2xhdGlvbiBmb3IgYWxsIHN0YXRpb25zLgogICAgLgoKICBSRVRVUk4gVkFMVUUKCiAgIHZvaWQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZApXTEFOVExfQ29uZmlndXJlU3dGcmFtZVRYWGxhdGlvbkZvckFsbAooCiAgdl9QVk9JRF90IHB2b3NHQ3R4LCAKICB2X0JPT0xfdCBlbmFibGVGcmFtZVhsYXRpb24KKQp7CiAgdl9VOF90IHVjSW5kZXg7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uICIKICAgICAgICAgICAiV0xBTlRMX0NvbmZpZ3VyZVN3RnJhbWVUWFhsYXRpb25Gb3JBbGwiKSk7CiAgICByZXR1cm47CiAgfQoKICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAiV0xBTlRMX0NvbmZpZ3VyZVN3RnJhbWVUWFhsYXRpb25Gb3JBbGw6IENvbmZpZ3VyZSBTVyBmcmFtZVhsYXRpb24gJWQiLCAKICAgICAgZW5hYmxlRnJhbWVYbGF0aW9uKSk7CgogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfVElEOyB1Y0luZGV4KyspIAogIHsKICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XTsKICAgIGlmICggTlVMTCAhPSBwQ2xpZW50U1RBICYmIDAgIT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogICAgewojaWZkZWYgV0xBTl9TT0ZUQVBfVlNUQV9GRUFUVVJFCiAgICAgIC8vIGlmIHRoaXMgc3RhdGlvbiB3YXMgbm90IGFsbG9jYXRlZCByZXNvdXJjZXMgdG8gcGVyZm9ybSBIVy1iYXNlZAogICAgICAvLyBUWCBmcmFtZSB0cmFuc2xhdGlvbiB0aGVuIGZvcmNlIFNXLWJhc2VkIFRYIGZyYW1lIHRyYW5zbGF0aW9uCiAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIGZyYW1lIHRyYW5zbGF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQKICAgICAgaWYgKCFXREFfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUocHZvc0dDdHgsIHVjSW5kZXgpKQogICAgICB7CiAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gMTsKICAgICAgfQogICAgICBlbHNlCiNlbmRpZgogICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IGVuYWJsZUZyYW1lWGxhdGlvbjsKICAgIH0KICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TdGFydEZvcndhcmRpbmcKCiAgREVTQ1JJUFRJT04KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXNrIHNlcmlhbGl6YXRpb24gdGhyb3VnaCBUWCB0aHJlYWQgb2YgdGhlICAgCiAgICBjYWNoZWQgZnJhbWUgZm9yd2FyZGluZyAoaWYgc3RhdGF0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIG1lYW4gd2hpbGUpIAogICAgb3IgZmx1c2hpbmcgKGlmIHN0YXRpb24gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlIHRpbWUpCgogICAgSW4gY2FzZSBvZiBmb3J3YXJkaW5nLCB1cHBlciBsYXllciBpcyBvbmx5IHJlcXVpcmVkIHRvIGNhbGwgV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50KCkKICAgIGFuZCBkb2Vzbid0IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkuIFRMIHdpbGwgaGFuZGxlIHRoaXMgaW5zaWRlIAogICAgV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50KCkuIAogICAgCiAgICBJbiBjYXNlIG9mIGZsdXNoaW5nLCB1cHBlciBsYXllciBpcyByZXF1aXJlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZXhwbGljaXRseQogICAgCiAgREVQRU5ERU5DSUVTCgogICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogICAKICBQQVJBTUVURVJTCgogICB1Y1NUQUlkOiAgIHN0YXRpb24gaWQgCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCiAgICBQbGVhc2UgY2hlY2sgcmV0dXJuIHZhbHVlcyBvZiB2b3NfdHhfbXFfc2VyaWFsaXplLgoKICBTSURFIEVGRkVDVFMKICAgIElmIFRMIHdhcyBhc2tlZCB0byBwZXJmb3JtIFdMQU5UTF9DYWNoZVNUQUZyYW1lKCkgaW4gV0xBTlRMX1J4RnJhbWVzKCksIAogICAgZWl0aGVyIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCgpIG9yIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgCiAgICB3aXRoaW4gcmVhc29uYWJsZSB0aW1lLiBPdGhlcndpc2UsIFRMIHdpbGwga2VlcCBjYWNoZWQgdm9zIGJ1ZmZlciB1bnRpbAogICAgb25lIG9mIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbmQgbWF5IGVuZCB1cCB3aXRoIHN5c3RlbSBidWZmZXIgZXhoYXN1dGlvbi4gCgogICAgSXQncyBhbiB1cHBlciBsYXllcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBjYXNlIG9mCiAgICBmbHVzaGluZwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTIApXTEFOVExfU3RhcnRGb3J3YXJkaW5nCigKICB2X1U4X3QgdWNTVEFJZCwKICB2X1U4X3QgdWNVY2FzdFNpZywgCiAgdl9VOF90IHVjQmNhc3RTaWcgCikKewogIHZvc19tc2dfdCAgICAgIHNNZXNzYWdlOwogIHZfVTMyX3QgICAgICAgIHVEYXRhOyAgICAgICAgICAgICAKIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCgogIC8qIFNpZ25hbCB0aGUgT1MgdG8gc2VyaWFsaXplIG91ciBldmVudCAqLwogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAiU2VyaWFsaXppbmcgVEwgU3RhcnQgRm9yd2FyZGluZyBDYWNoZWQgZm9yIGNvbnRyb2wgU1RBICVkIiwgCiAgICAgICAgICAgICAgdWNTVEFJZCApOwoKICB2b3NfbWVtX3plcm8oICZzTWVzc2FnZSwgc2l6ZW9mKHZvc19tc2dfdCkgKTsKCiAgdURhdGEgPSB1Y1NUQUlkIHwgKHVjVWNhc3RTaWcgPDwgOCApIHwgKHVjQmNhc3RTaWcgPDwgMTYpOyAKICBzTWVzc2FnZS5ib2R5cHRyID0gKHZfUFZPSURfdCl1RGF0YTsKICBzTWVzc2FnZS50eXBlICAgID0gV0xBTlRMX1RYX0ZXRF9DQUNIRUQ7CgogIHJldHVybiB2b3NfdHhfbXFfc2VyaWFsaXplKFZPU19NUV9JRF9UTCwgJnNNZXNzYWdlKTsKCn0gLyogV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZygpICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQXNzb2NGYWlsZWQKCiAgREVTQ1JJUFRJT04KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgUEUgdG8gbm90aWZ5IFRMIHRoYXQgY2FjaGUgbmVlZHMgdG8gZmx1c2hlZCcgCiAgICB3aGVuIGFzc29jaWF0aW9uIGlzIG5vdCBzdWNjZXNzZnVsbHkgY29tcGxldGVkIAoKICAgIEludGVybmFsbHksIFRMIHBvc3QgYSBtZXNzYWdlIHRvIFRYX1RocmVhZCB0byBzZXJpYWxpemUgdGhlIHJlcXVlc3QgdG8gCiAgICBrZWVwIGxvY2stZnJlZSBtZWNoYW5pc20uCgogICAKICBERVBFTkRFTkNJRVMKCiAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgIAogIFBBUkFNRVRFUlMKCiAgIHVjU1RBSWQ6ICAgc3RhdGlvbiBpZCAKCiAgUkVUVVJOIFZBTFVFCgogICBub25lCiAgIAogIFNJREUgRUZGRUNUUwogICBUaGVyZSBtYXkgYmUgcmFjZSBjb25kaXRpb24gdGhhdCBQRSBjYWxsIHRoaXMgQVBJIGFuZCBzZW5kIGFub3RoZXIgYXNzb2NpYXRpb24KICAgcmVxdWVzdCBpbW1lZGlhdGVseSB3aXRoIHNhbWUgc3RhSWQgYmVmb3JlIFRYX3RocmVhZCBjYW4gcHJvY2VzcyB0aGUgbWVzc2FnZS4KCiAgIFRvIGF2b2lkIHRoaXMsIHdlIG1pZ2h0IG5lZWQgUEUgdG8gd2FpdCBmb3IgVFhfdGhyZWFkIHByb2Nlc3MgdGhlIG1lc3NhZ2UsCiAgIGJ1dCB0aGlzIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuIAogICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQgV0xBTlRMX0Fzc29jRmFpbGVkKHZfVThfdCBzdGFJZCkKewogIC8vIGZsdXNoaW5nIGZyYW1lcyBhbmQgZm9yd2FyZGluZyBmcmFtZXMgdXNlcyB0aGUgc2FtZSBtZXNzYWdlCiAgLy8gdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgbWVzc2FnZSBpcyBwcm9jZXNzZWQKICAvLyBpZiB0aGUgU1RBIGV4aXN0LCB0aGUgZnJhbWVzIHdpbGwgYmUgZm9yd2FyZGVkCiAgLy8gYW5kIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZSBmcmFtZXMgd2lsbCBiZSBmbHVzaGVkCiAgLy8gaW4gdGhpcyBjYXNlIHdlIGtub3cgaXQgd29uJ3QgZXhpc3Qgc28gdGhlIERQVSBpbmRleCBzaWduYXR1cmUgdmFsdWVzIGRvbid0IG1hdHRlcgogIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZyhzdGFJZCwwLDApKSkKICB7CiAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIiAlcyBmYWlscyB0byBzdGFydCBmb3J3YXJkaW5nIiwgX19mdW5jX18pOwogIH0KfQogIAogIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICBXTEFOVExfRmluaXNoX1VMQQoKICBERVNDUklQVElPTgogICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBIREQgdG8gbm90aWZ5IFRMIHRvIGZpbmlzaCBVcHBlciBsYXllciBhdXRoZW50aWNhdGlvbgogICAgIGluY2FzZSB0aGUgbGFzdCBFQVBPTCBwYWNrZXQgaXMgcGVuZGluZyBpbiB0aGUgVEwgcXVldWUuIAogICAgIFRvIGF2b2lkIHRoZSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHNtZSBzZXQga2V5IGFuZCB0aGUgbGFzdCBFQVBPTCBwYWNrZXQgCiAgICAgdGhlIEhERCBtb2R1bGUgY2FsbHMgdGhpcyBmdW5jdGlvbiBqdXN0IGJlZm9yZSBjYWxsaW5nIHRoZSBzbWVfUm9hbVNldEtleS4KCiAgREVQRU5ERU5DSUVTCgogICAgIFRMIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgogIAogIFBBUkFNRVRFUlMKCiAgIGNhbGxiYWNrUm91dGluZTogICBIREQgQ2FsbGJhY2sgZnVuY3Rpb24uCiAgIGNhbGxiYWNrQ29udGV4dCA6IEhERCB1c2VyZGF0YSBjb250ZXh0LgogIAogICBSRVRVUk4gVkFMVUUKCiAgIFZPU19TVEFUVVNfU1VDQ0VTUy9WT1NfU1RBVFVTX0ZBSUxVUkUKICAgCiAgU0lERSBFRkZFQ1RTCiAgIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KClZPU19TVEFUVVMgV0xBTlRMX0ZpbmlzaF9VTEEoIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja0NvbnRleHQpCnsKICAgcmV0dXJuIFdEQV9EU19GaW5pc2hVTEEoIGNhbGxiYWNrUm91dGluZSwgY2FsbGJhY2tDb250ZXh0KTsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudAoKICBERVNDUklQVElPTgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBIREQgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIGRhdGEgc2VydmljZXMKICAgIHdpdGggVEwuIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgZm9yIGVhY2ggbmV3IHN0YXRpb24gdGhhdCBpdCBhZGRzLAogICAgdGh1cyBoYXZpbmcgdGhlIGZsZXhpYmlsaXR5IG9mIHJlZ2lzdGVyaW5nIGRpZmZlcmVudCBjYWxsYmFjayBmb3IgZWFjaAogICAgU1RBIGl0IHNlcnZpY2VzLgoKICBERVBFTkRFTkNJRVMKCiAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgICBSZXN0cmljdGlvbjoKICAgICAgTWFpbiB0aHJlYWQgd2lsbCBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGF0IFR4IGFuZCBSeCB0aHJlYWRzIHRodXMKICAgICAgZ3VhcmFudGVlaW5nIHRoYXQgYSBzdGF0aW9uIHdpbGwgYmUgYWRkZWQgYmVmb3JlIGFueSBkYXRhIGNhbiBiZQogICAgICByZWNlaXZlZCBmb3IgaXQuIChUaGlzIGVuYWJsZXMgVEwgdG8gYmUgbG9jayBmcmVlKQoKICBQQVJBTUVURVJTCgogICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHBmblN0QVJ4OiAgICAgICAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBwYWNrZXQgaGFuZGxlciBmcm9tIEhERAogICBwZm5TVEFUeENvbXA6ICAgIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IGNvbXBsZXRlIGNvbmZpcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgZnJvbSBIREQKICAgcGZuU1RBRmV0Y2hQa3Q6ICBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBwYWNrZXQgcmV0cmlldmFsIHJvdXRpbmUgaW4gSERECiAgIHdTVEFEZXNjVHlwZTogICAgU1RBIERlc2NyaXB0b3IsIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgbmV3IGFkZGVkIFNUQQoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZWdpc3RlclNUQUNsaWVudAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfU1RBUnhDQlR5cGUgICAgICAgIHBmblNUQVJ4LAogIFdMQU5UTF9UeENvbXBDQlR5cGUgICAgICAgcGZuU1RBVHhDb21wLAogIFdMQU5UTF9TVEFGZXRjaFBrdENCVHlwZSAgcGZuU1RBRmV0Y2hQa3QsCiAgV0xBTl9TVEFEZXNjVHlwZSogICAgICAgICBwd1NUQURlc2NUeXBlLAogIHZfUzdfdCAgICAgICAgICAgICAgICAgICAgcnNzaQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICB2X1U4X3QgICAgdWNUaWQgPSAwOy8qTG9jYWwgdmFyaWFibGUgdG8gY2xlYXIgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXJzIG9mIFNUQSBvbiBhbGwgVElEcyovCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBFTlRFUigpOwogIGlmICgoIE5VTEwgPT0gcHdTVEFEZXNjVHlwZSApIHx8ICggTlVMTCA9PSBwZm5TVEFSeCApIHx8CiAgICAgICggTlVMTCA9PSBwZm5TVEFGZXRjaFBrdCApKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8vQ29kZSBmb3IgY2hlY2tpbmcgYW5kIGFsbG9jYXRpbmcgbWVtb3J5IGZvciBuZXcgU1RBCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdICl7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKFdMQU5UTF9TVEFDbGllbnRUeXBlKSk7CiAgICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSApewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6IFNUQSBDbGllbnQgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGluIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgICAgfQogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgIldMQU4gVEw6IFNUQSBDbGllbnQgbWVtb3J5IGFsbG9jYXRpb24gaW4gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkpOwogIH0KCiAgLy9Bc3NpZ25pbmcgdGhlIHBvaW50ZXIgdG8gbG9jYWwgdmFyaWFibGUgZm9yIGVhc3kgYWNjZXNzIGluIGZ1dHVyZQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXTsKICBpZiAoIDAgIT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIHBDbGllbnRTVEEtPnVjRXhpc3RzKys7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZWdpc3RlciBzdGF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQiLCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkICkpOwoKICBwQ2xpZW50U1RBLT5wZm5TVEFSeCAgICAgICA9IHBmblNUQVJ4OwogIHBDbGllbnRTVEEtPnBmblNUQUZldGNoUGt0ID0gcGZuU1RBRmV0Y2hQa3Q7CgogIC8qIE9ubHkgcmVnaXN0ZXIgaWYgZGlmZmVyZW50IGZyb20gTlVMTCAtIFRMIGRlZmF1bHQgVHggQ29tcCBDYiB3aWxsCiAgICByZWxlYXNlIHRoZSB2b3MgcGFja2V0ICovCiAgaWYgKCBOVUxMICE9IHBmblNUQVR4Q29tcCApCiAgewogICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wICAgPSBwZm5TVEFUeENvbXA7CiAgfQoKICBwQ2xpZW50U1RBLT50bFN0YXRlICA9IFdMQU5UTF9TVEFfSU5JVDsKICBwQ2xpZW50U1RBLT50bFByaSAgICA9IFdMQU5UTF9TVEFfUFJJX05PUk1BTDsKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1NUQUlkICA9IHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQ7CiAgcENsaWVudFNUQS0+cHRrSW5zdGFsbGVkID0gMDsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIHdpdGggVUMgJWQgYW5kIEJDICVkIiwgCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKICAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1VjYXN0U2lnLCBwd1NUQURlc2NUeXBlLT51Y0JjYXN0U2lnKSk7CgogIHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlID0gcHdTVEFEZXNjVHlwZS0+d1NUQVR5cGU7CgogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCA9IHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZDsKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNBZGRSbXZMTEMgPSBwd1NUQURlc2NUeXBlLT51Y0FkZFJtdkxMQzsKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNQcm90ZWN0ZWRGcmFtZSA9IHB3U1RBRGVzY1R5cGUtPnVjUHJvdGVjdGVkRnJhbWU7CgojaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNDY3hTdGEgPSBwd1NUQURlc2NUeXBlLT51Y0lzQ2N4U3RhOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQgUW9TICVkIEFkZCBMTEMgJWQgUHJvdEZyYW1lICVkIENjeFN0YSAlZCIsIAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCwgCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1Fvc0VuYWJsZWQsCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y0FkZFJtdkxMQywKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjUHJvdGVjdGVkRnJhbWUsCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y0lzQ2N4U3RhKSk7CiNlbHNlCgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBTVEEgQ2xpZW50IElEOiAlZCBRb1MgJWQgQWRkIExMQyAlZCBQcm90RnJhbWUgJWQiLCAKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQsIAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNRb3NFbmFibGVkLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNBZGRSbXZMTEMsCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1Byb3RlY3RlZEZyYW1lKSk7CgojZW5kaWYgLy9GRUFUVVJFX1dMQU5fQ0NYCiNpZmRlZiBXTEFOX1NPRlRBUF9WU1RBX0ZFQVRVUkUKICAvLyBpZiB0aGlzIHN0YXRpb24gd2FzIG5vdCBhbGxvY2F0ZWQgcmVzb3VyY2VzIHRvIHBlcmZvcm0gSFctYmFzZWQKICAvLyBUWCBmcmFtZSB0cmFuc2xhdGlvbiB0aGVuIGZvcmNlIFNXLWJhc2VkIFRYIGZyYW1lIHRyYW5zbGF0aW9uCiAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgZnJhbWUgdHJhbnNsYXRpb24gc3VwcGxpZWQgYnkgdGhlIGNsaWVudAoKICBpZiAoIVdEQV9Jc0h3RnJhbWVUeFRyYW5zbGF0aW9uQ2FwYWJsZShwdm9zR0N0eCwgcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCkKICAgICAgfHwgKCBXTEFOX1NUQV9CVF9BTVAgPT0gcHdTVEFEZXNjVHlwZS0+d1NUQVR5cGUpKQogIHsKICAgICAgcHdTVEFEZXNjVHlwZS0+dWNTd0ZyYW1lVFhYbGF0aW9uID0gMTsKICB9CiNlbmRpZgoKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gPSBwd1NUQURlc2NUeXBlLT51Y1N3RnJhbWVUWFhsYXRpb247CiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uID0gcHdTVEFEZXNjVHlwZS0+dWNTd0ZyYW1lUlhYbGF0aW9uOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNJc1dhcGlTdGEgPSBwd1NUQURlc2NUeXBlLT51Y0lzV2FwaVN0YTsKI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCgogIHZvc19jb3B5X21hY2FkZHIoICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcywgJnB3U1RBRGVzY1R5cGUtPnZTVEFNQUNBZGRyZXNzKTsKCiAgdm9zX2NvcHlfbWFjYWRkciggJnBDbGllbnRTVEEtPndTVEFEZXNjLnZCU1NJRGZvcklCU1MsICZwd1NUQURlc2NUeXBlLT52QlNTSURmb3JJQlNTKTsKCiAgdm9zX2NvcHlfbWFjYWRkciggJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywgJnB3U1RBRGVzY1R5cGUtPnZTZWxmTUFDQWRkcmVzcyk7CgogIC8qIEluIHZvbGFucyByZWxlYXNlIEwgcmVwbGF5IGNoZWNrIGlzIGRvbmUgYXQgVEwgKi8KICBwQ2xpZW50U1RBLT51Y0lzUmVwbGF5Q2hlY2tWYWxpZCA9IHB3U1RBRGVzY1R5cGUtPnVjSXNSZXBsYXlDaGVja1ZhbGlkOwogIHBDbGllbnRTVEEtPnVsVG90YWxSZXBsYXlQYWNrZXRzRGV0ZWN0ZWQgPSAgMDsKLypDbGVhciByZXBsYXkgY291bnRlcnMgb2YgdGhlIFNUQSBvbiBhbGwgVElEcyovCiAgZm9yKHVjVGlkID0gMDsgdWNUaWQgPCBXTEFOVExfTUFYX1RJRCA7IHVjVGlkKyspCiAgewogICAgcENsaWVudFNUQS0+dWxsUmVwbGF5Q291bnRlclt1Y1RpZF0gPSAgMDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgU2V0IHRoZSBBQyBmb3IgdGhlIHJlZ2lzdGVyZWQgc3RhdGlvbiB0byB0aGUgaGlnaGVzdCBwcmlvcml0eSBBQwogICAgICBFdmVuIGlmIHRoaXMgQUMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3RhdGlvbiwgY29ycmVjdGlvbiB3aWxsIGJlCiAgICAgIG1hZGUgaW4gdGhlIG1haW4gVEwgbG9vcCBhZnRlciB0aGUgc3VwcG9ydGVkIG1hc2sgaXMgcHJvcGVybHkKICAgICAgdXBkYXRlZCBpbiB0aGUgcGVuZGluZyBwYWNrZXRzIGNhbGwKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT51Y0N1cnJlbnRBQyAgICAgPSBXTEFOVExfQUNfVk87CiAgcENsaWVudFNUQS0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKICBwQ2xpZW50U1RBLT51Y1NlcnZpY2VkQUMgICAgPSBXTEFOVExfQUNfQks7CiAgcENsaWVudFNUQS0+dWNFYXBvbFBrdFBlbmRpbmcgPSAwOwoKICB2b3NfbWVtX3plcm8oIHBDbGllbnRTVEEtPmF1Y0FDTWFzaywgc2l6ZW9mKHBDbGllbnRTVEEtPmF1Y0FDTWFzaykpOwoKICB2b3NfbWVtX3plcm8oICZwQ2xpZW50U1RBLT53VUFQU0RJbmZvLCBzaXplb2YocENsaWVudFNUQS0+d1VBUFNESW5mbykpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZW9yZGVyaW5nIGluZm8gYW5kIEFNU0RVIGRlLWFnZ3JlZ2F0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvLAogICAgIHNpemVvZihwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvWzBdKSoKICAgICBXTEFOX01BWF9USUQpOwoKICB2b3NfbWVtX3plcm8oIHBDbGllbnRTVEEtPmF1Y01QRFVIZWFkZXIsCiAgICAgICAgICAgICAgICBXTEFOVExfTVBEVV9IRUFERVJfTEVOKTsKCiAgcENsaWVudFNUQS0+dWNNUERVSGVhZGVyTGVuICAgPSAwOwogIHBDbGllbnRTVEEtPnZvc0FNU0RVQ2hhaW4gICAgID0gTlVMTDsKICBwQ2xpZW50U1RBLT52b3NBTVNEVUNoYWluUm9vdCA9IE5VTEw7CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGF0cyBpbmZvCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdVJ4Q291bnQsCiAgICAgIHNpemVvZihwQ2xpZW50U1RBLT5hdVJ4Q291bnRbMF0pKgogICAgICBXTEFOX01BWF9USUQpOwoKICB2b3NfbWVtX3plcm8oIHBDbGllbnRTVEEtPmF1VHhDb3VudCwKICAgICAgc2l6ZW9mKHBDbGllbnRTVEEtPmF1UnhDb3VudFswXSkqCiAgICAgIFdMQU5fTUFYX1RJRCk7CiAgLyogSW5pdGlhbCBSU1NJIGlzIGFsd2F5cyByZXBvcnRlZCBhcyB6ZXJvIGJlY2F1c2UgVEwgZG9lc250IGhhdmUgZW5vdWdoCiAgICAgZGF0YSB0byBjYWxjdWxhdGUgUlNTSS4gU28gdG8gYXZvaWQgcmVwb3J0aW5nIHplcm8sIHdlIGFyZSBpbml0aWFsaXppbmcKICAgICBSU1NJIHdpdGggUlNTSSBzYXZlZCBpbiBCc3NEZXNjcmlwdGlvbiBkdXJpbmcgc2Nhbm5pbmcuICovCiAgcENsaWVudFNUQS0+cnNzaUF2ZyA9IHJzc2k7CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmKFdMQU5fU1RBX1RETFMgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgewogICAgLyogSWYgY2xpZW50IGlzIFRETFMsIHVzZSBURExTIHNwZWNpZmljIGFscGhhICovCiAgICBwQ2xpZW50U1RBLT5yc3NpQWxwaGEgPSBXTEFOVExfSE9fVERMU19BTFBIQTsKICB9CiAgZWxzZQogIHsKICAgIHBDbGllbnRTVEEtPnJzc2lBbHBoYSA9IFdMQU5UTF9IT19ERUZBVUxUX0FMUEhBOwogIH0KI2Vsc2UKICAgIHBDbGllbnRTVEEtPnJzc2lBbHBoYSA9IFdMQU5UTF9IT19ERUZBVUxUX0FMUEhBOwojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KCiAgLypUeCBub3Qgc3VzcGVuZGVkIGFuZCBzdGF0aW9uIGZ1bGx5IHJlZ2lzdGVyZWQqLwogIHZvc19hdG9taWNfc2V0X1U4KAogICAgICAgICZwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkLCAwKTsKCiAgLyogVXNlZCB1bnRpbCBtdWx0aXBsZSBzdGF0aW9uIHN1cHBvcnQgd2lsbCBiZSBhZGRlZCovCiAgcFRMQ2ItPnVjUmVnaXN0ZXJlZFN0YUlkID0gcHdTVEFEZXNjVHlwZS0+dWNTVEFJZDsKCiAgLyogU2F2ZSB0aGUgQkFQIHN0YXRpb24gSUQgZm9yIGZ1dHVyZSB1c2FnZSAqLwogIGlmICggV0xBTl9TVEFfQlRfQU1QID09IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlICkKICB7CiAgICBwVExDYi0+dGxCQVBDbGllbnQudWNCQVBTVEFJZCA9IHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RhdGlzdGljcyBpbmZvIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIG1lbXNldCgmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MsCiAgICAgICAgIDAsIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGFydCB3aXRoIHRoZSBzdGF0ZSBzdWdnZXN0ZWQgYnkgY2xpZW50IGNhbGxlcgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnRsU3RhdGUgPSBwd1NUQURlc2NUeXBlLT51Y0luaXRTdGF0ZTsKICBwQ2xpZW50U1RBLT51Y1J4QmxvY2tlZCA9IDE7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWZ0ZXIgYWxsIHRoZSBpbml0IGlzIGNvbXBsZXRlIHdlIGNhbiBtYXJrIHRoZSBleGlzdGFuY2UgZmxhZyAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnVjRXhpc3RzKys7CgogIC8vZmxvdyBjb250cm9sIGZpZWxkcyBpbml0CiAgcENsaWVudFNUQS0+dWNMd21Nb2RlRW5hYmxlZCA9IEZBTFNFOwogIHBDbGllbnRTVEEtPnVjTHdtRXZlbnRSZXBvcnRlZCA9IEZBTFNFOwogIHBDbGllbnRTVEEtPmJtdU1lbUNvbnN1bWVkID0gMDsKICBwQ2xpZW50U1RBLT51SW5ncmVzc19sZW5ndGggPSAwOwogIHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID0gV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWDsKCiAgcENsaWVudFNUQS0+dUx3bVRocmVzaG9sZCA9IFdMQU5UTF9TVEFfQk1VX1RIUkVTSE9MRF9NQVggLyAzOwoKICAvL0BAQCBIRERTT0ZUQVAgZG9lcyBub3QgcXVldWUgdW5yZWdpc3RlcmVkIHBhY2tldCBmb3Igbm93CiAgaWYgKCBXTEFOX1NUQV9TT0ZUQVAgIT0gcHdTVEFEZXNjVHlwZS0+d1NUQVR5cGUgKQogIHsgCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBGb3J3YXJkIHJlY2VpdmVkIGZyYW1lcyB3aGlsZSBTVEEgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZCAKICAgIC0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhXTEFOVExfU3RhcnRGb3J3YXJkaW5nKCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNVY2FzdFNpZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjQmNhc3RTaWcpKSkKICAgIHsKICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIiAlcyBmYWlscyB0byBzdGFydCBmb3J3YXJkaW5nIiwgX19mdW5jX18pOwogICAgfQojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICAgIGlmKCBXTEFOX1NUQV9URExTID09IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlICkKICAgICAgICBwVExDYi0+dWNUZGxzUGVlckNvdW50Kys7CiNlbmRpZgogIH0KICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xlYXJTVEFDbGllbnQKCiAgREVTQ1JJUFRJT04KCiAgICBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIHdoZW4gaXQgbm8gbG9uZ2VyIG5lZWRzIGRhdGEgc2VydmljZXMgZm9yIHRoZQogICAgcGFydGljdWxhciBzdGF0aW9uLgoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNsZWFyIHJlZ2lzdHJhdGlvbiBpcwogICAgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSB0byBiZSBjbGVhcmVkCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0NsZWFyU1RBQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7IAogIHZfVThfdCAgdWNJbmRleDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgRU5URVIoKTsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NsZWFyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2xlYXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9DbGVhclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyogRGVsZXRlIEJBIHNlc3Npb25zIG9uIGFsbCBUSUQncyAqLwogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfVElEIDsgdWNJbmRleCsrKSAKICB7CiAgICAgV0xBTlRMX0JhU2Vzc2lvbkRlbCAocHZvc0dDdHgsIHVjU1RBSWQsIHVjSW5kZXgpOwogIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIC8qIGRlY3JlbWVudCB1Y1RkbHNQZWVyQ291bnQgb25seSBpZiBpdCBpcyBub24temVybyAqLyAgCiAgaWYoV0xBTl9TVEFfVERMUyA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1NUQURlc2Mud1NUQVR5cGUKICAgICAgJiYgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCkKICAgICAgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudC0tOwojZW5kaWYKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFyIHN0YXRpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6Q2xlYXJpbmcgU1RBIENsaWVudCBJRDogJWQiLCB1Y1NUQUlkICkpOwogIFdMQU5UTF9DbGVhblNUQShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSwgMSAvKmVtcHR5IHBhY2tldHMqLyk7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpDbGVhcmluZyBTVEEgUmVzZXQgSGlzdG9yeSBSU1NJIGFuZCBSZWdpb24gbnVtYmVyIikpOwogIHBUTENiLT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGUuaGlzdG9yeVJTU0kgPSAwOwogIHBUTENiLT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGUucmVnaW9uTnVtYmVyID0gMDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9DbGVhclNUQUNsaWVudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NoYW5nZVNUQVN0YXRlCgogIERFU0NSSVBUSU9OCgogICAgSEREIHdpbGwgbWFrZSB0aGlzIG5vdGlmaWNhdGlvbiB3aGVuZXZlciBhIGNoYW5nZSBvY2N1cnMgaW4gdGhlCiAgICBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjaGFuZ2Ugc3RhdGUgY2FuIGJlCiAgICBjYWxsZWQuCgogICAgUkVTVFJJQ1RJT046IEEgc3RhdGlvbiBpcyBiZWluZyBub3RpZmllZCBhcyBhdXRoZW50aWNhdGVkIGJlZm9yZSB0aGUKICAgICAgICAgICAgICAgICBrZXlzIGFyZSBpbnN0YWxsZWQgaW4gSFcuIFRoaXMgd2F5IGlmIGEgZnJhbWUgaXMgcmVjZWl2ZWQKICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGtleXMgYXJlIGluc3RhbGxlZCBEUFUgd2lsbCBkcm9wIHRoYXQgZnJhbWUuCgogICAgTWFpbiB0aHJlYWQgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGF0IFR4IGFuZCBSeCB0aHJlYWRzIHRodXMgZ3VhcmFudGVlaW5nCiAgICB0aGUgZm9sbG93aW5nOgogICAgICAgIC0gYSBzdGF0aW9uIHdpbGwgYmUgaW4gYXNzb2Mgc3RhdGUgaW4gVEwgYmVmb3JlIFRMIHJlY2VpdmVzIGFueSBkYXRhCiAgICAgICAgICBmb3IgaXQKCiAgUEFSQU1FVEVSUwoKICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdGhhdCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbgogICB0bFNUQVN0YXRlOiAgICAgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gc3RhdGlvbgoKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DaGFuZ2VTVEFTdGF0ZQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9TVEFTdGF0ZVR5cGUgICB0bFNUQVN0YXRlCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIHRsU1RBU3RhdGUgPj0gV0xBTlRMX1NUQV9NQVhfU1RBVEUgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGFuZ2UgU1RBIHN0YXRlCiAgICBObyBuZWVkIHRvIGxvY2sgdGhpcyBvcGVyYXRpb24sIHNlZSByZXN0cmljdGlvbnMgYWJvdmUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6Q2hhbmdpbmcgc3RhdGUgZm9yIFNUQSBDbGllbnQgSUQ6ICVkIGZyb20gJWQgdG8gJWQiLAogICAgICAgICAgICAgdWNTVEFJZCwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnRsU3RhdGUsIHRsU1RBU3RhdGUpKTsKCiAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnRsU3RhdGUgPSB0bFNUQVN0YXRlOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0NoYW5nZVNUQVN0YXRlICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU1RBUHRrSW5zdGFsbGVkCgogIERFU0NSSVBUSU9OCgogICAgSEREIHdpbGwgbWFrZSB0aGlzIG5vdGlmaWNhdGlvbiB3aGVuZXZlciBQVEsgaXMgaW5zdGFsbGVkIGZvciB0aGUgU1RBCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2hhbmdlIHN0YXRlIGNhbiBiZQogICAgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSBmb3Igd2hpY2ggUGFpcndpc2Uga2V5IGlzCiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUHRrSW5zdGFsbGVkCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICBGTCgiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIpKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIEZMKCJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQiKSkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgRkwoIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCIpKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5wdGtJbnN0YWxsZWQgPSAxOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVB0a0luc3RhbGxlZCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFNUQVN0YXRlCgogIERFU0NSSVBUSU9OCgogICAgUmV0dXJucyBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIGl0cyBzdGF0ZSBjYW4gYmUgcmV0cmlldmVkLgoKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uCgogICAgT1VUCiAgICBwdGxTVEFTdGF0ZTogICAgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIHN0YXRpb24KCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0U1RBU3RhdGUKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfU1RBU3RhdGVUeXBlICAgKnB0bFNUQVN0YXRlCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHRsU1RBU3RhdGUgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0U1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0U1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldFNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfR2V0U1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBHZXQgU1RBIHN0YXRlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgKnB0bFNUQVN0YXRlID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnRsU3RhdGU7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0U1RBU3RhdGUgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9VcGRhdGVTVEFCc3NJZGZvcklCU1MKCiAgREVTQ1JJUFRJT04KICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgdG8gdXBkYXRlIHRoZSBCU1NJRCBmb3IgdGhpcyBTdGF0aW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBIREQgU2hvdWxkIHJlZ2lzdGVyZWQgdGhlIHN0YUlEIHdpdGggVEwgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgUG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIElOCiAgICB1Y1NUQUlkICAgICAgIFRoZSBTdGF0aW9uIElEIGZvciBCc3NpZCB0byBiZSB1cGRhdGVkCiAgICBJTgogICAgcEJzc2lkICAgICAgICAgIEJTU0lEIHRvIGJlIHVwZGF0ZWQKCiAgUkVUVVJOIFZBTFVFCiAgICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgU0lERSBFRkZFQ1RTCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKClZPU19TVEFUVVMKV0xBTlRMX1VwZGF0ZVNUQUJzc0lkZm9ySUJTUwooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgICAgICAgICpwQnNzaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4ICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVXBkYXRlIHRoZSBJQlNTIEJTU0lECiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX21lbV9jb3B5KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLnZCU1NJRGZvcklCU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzaWQsIHNpemVvZih2X01BQ0FERFJfdCkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU1RBUGt0UGVuZGluZwoKICBERVNDUklQVElPTgoKICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgd2hlbiBhIHBhY2tldCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbiBpbiBpdHMKICAgIHF1ZXVlcy4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBwYWNrZXQgcGVuZGluZwogICAgbm90aWZpY2F0aW9uIGNhbiBiZSBzZW50LgoKICAgIFJFU1RSSUNUSU9OOiBUTCB3aWxsIG5vdCBjb3VudCBwYWNrZXRzIGZvciBwZW5kaW5nIG5vdGlmaWNhdGlvbi4KICAgICAgICAgICAgICAgICBIREQgaXMgZXhwZWN0ZWQgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9uIG9ubHkgd2hlbgogICAgICAgICAgICAgICAgIG5vbi1lbXB0eSBldmVudCBnZXRzIHRyaWdnZXJlZC4gV29yc3QgY2FzZSBzY2VuYXJpbwogICAgICAgICAgICAgICAgIGlzIHRoYXQgVEwgbWlnaHQgZW5kIHVwIG1ha2luZyBhIGNhbGwgd2hlbiBIZGRzCiAgICAgICAgICAgICAgICAgcXVldWVzIGFyZSBhY3R1YWxseSBlbXB0eS4KCiAgUEFSQU1FVEVSUwoKICAgIHB2b3NHQ3R4OiAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdGhhdCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbgoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVBrdFBlbmRpbmcKKAogIHZfUFZPSURfdCAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX0FDRW51bVR5cGUgICAgdWNBYwopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICB2b3NfbXNnX3QgICAgICB2b3NNc2c7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICJXTEFOIFRMOlBhY2tldCBwZW5kaW5nIGluZGljYXRpb24gZm9yIFNUQTogJWQgQUM6ICVkIiwgdWNTVEFJZCwgdWNBYyk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfU1RBUGt0UGVuZGluZyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TVEFQa3RQZW5kaW5nIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfU1RBUGt0UGVuZGluZyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRlbXBvcmFyeSBmaXggdG8gZW5hYmxlIFRMIHRvIGZldGNoIHBhY2tldHMgd2hlbiBtdWx0aXBsZSBwZWVycyBqb2luCiAgICBhbiBJQlNTLiBUbyBmaXggQ1IxNzczMDEuIE5lZWRzIHRvIGdvIGF3YXkgd2hlbiB0aGUgYWN0dWFsIGZpeCBvZgogICAgZ29pbmcgdGhyb3VnaCBhbGwgU1RBJ3MgaW4gcm91bmQgcm9iaW4gZmFzaGlvbiBnZXRzIG1lcmdlZCBpbiBmcm9tCiAgICBCVCBBTVAgYnJhbmNoLgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiLT51Y1JlZ2lzdGVyZWRTdGFJZCA9IHVjU1RBSWQ7CgogIGlmKCBXTEFOVExfU1RBX0NPTk5FQ1RFRCA9PSBwQ2xpZW50U1RBLT50bFN0YXRlICkKICB7IC8qIEVBUE9MX0hJX1BSSU9SSVRZIDogbmVlZCB0byBmaW5kIG91dCB3aGV0aGVyIEVBUE9MIGlzIHBlbmRpbmcgYmVmb3JlCiAgICAgICBXTEFOVExfRmV0Y2hQYWNrZXQoKS9XTEFOVExfVHhDb25uKCkgaXMgY2FsbGVkLgogICAgICAgY2hhbmdlIFNUQV9BVVRIRU5USUNBVEVEICE9IHRsU3RhdGUgdG8gQ09OTkVDVEVEID09IHRsU3RhdGUKICAgICAgIHRvIG1ha2Ugc3VyZSBUTCBpcyBpbmRlZWQgd2FpdGluZyBmb3IgRUFQT0wuCiAgICAgICBKdXN0IGluIHRoZSBjYXNlIHdoZW4gU1RBIGdvdCBkaXNjb25uZWN0ZWQgc2hvcnRseSBhZnRlciBjb25uZWN0ZWN0aW9uICovCiAgICBwQ2xpZW50U1RBLT51Y0VhcG9sUGt0UGVuZGluZyA9IDE7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiV0xBTiBUTDpQYWNrZXQgcGVuZGluZyBpbmRpY2F0aW9uIGZvciBTVEE6ICVkIEFDOiAlZCBTdGF0ZTogJWQiLCAKICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBYywgcENsaWVudFNUQS0+dGxTdGF0ZSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFbmFibGUgdGhpcyBBQyBpbiB0aGUgQUMgbWFzayBpbiBvcmRlciBmb3IgVEwgdG8gc3RhcnQgc2VydmljaW5nIGl0CiAgICBTZXQgcGFja2V0IHBlbmRpbmcgZmxhZyAKICAgIFRvIGF2b2lkIHJhY2UgY29uZGl0aW9uLCBzZXJpYWxpemUgdGhlIHVwZGF0aW9uIG9mIEFDIGFuZCBBQyBtYXNrIAogICAgdGhyb3VnaCBXTEFOVExfVFhfU1RBSURfQUNfSU5EIG1lc3NhZ2UuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZkZWYgRkVUVVJFX1dMQU5fVERMUwogICAgaWYgKChXTEFOX1NUQV9TT0ZUQVAgIT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICAgISh2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpICYmCiAgICAgICAgIXBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiAgICB7CiNlbHNlCiAgICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgICAhKHZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkpCiAgICB7CiNlbmRpZgoKICAgICAgcENsaWVudFNUQS0+YXVjQUNNYXNrW3VjQWNdID0gMTsKCiAgICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nLCAxKTsKCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgQ2hlY2sgaWYgdGhlcmUgYXJlIGVub3VnaCByZXNvdXJjZXMgZm9yIHRyYW5zbWlzc2lvbiBhbmQgdHggaXMgbm90CiAgICAgICAgc3VzcGVuZGVkLgogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfREFUQSApICYmCiAgICAgICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSkKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIklzc3VpbmcgWG1pdCBzdGFydCByZXF1ZXN0IHRvIEJBTCIpKTsKICAgICAgICAgICBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgTm8gZXJyb3IgY29kZSBpcyBzZW50IGJlY2F1c2UgVEwgd2lsbCByZXN1bWUgdHggYXV0b25vbW91c2x5IGlmCiAgICAgICAgICByZXNvdXJjZXMgYmVjb21lIGF2YWlsYWJsZSBvciB0eCBnZXRzIHJlc3VtZWQKICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBidXQgY29uZGl0aW9uIG5vdCBtZXQuIFJlczogJWQsU3VzcGVuZDogJWQiLAogICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQsIHBUTENiLT51Y1R4U3VzcGVuZGVkICk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgdm9zTXNnLnJlc2VydmVkID0gMDsKICAgICAgdm9zTXNnLmJvZHl2YWwgID0gMDsKICAgICAgdm9zTXNnLmJvZHl2YWwgPSAodWNBYyB8ICh1Y1NUQUlkIDw8IFdMQU5UTF9TVEFJRF9PRkZTRVQpKTsKICAgICAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX1NUQUlEX0FDX0lORDsKICAgICAgcmV0dXJuIHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NUV9JRF9UTCwgJnZvc01zZyk7CiAgICB9CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFQa3RQZW5kaW5nICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TZXRTVEFQcmlvcml0eQoKICBERVNDUklQVElPTgoKICAgIFRMIGV4cG9zZXMgdGhpcyBBUEkgdG8gYWxsb3cgdXBwZXIgbGF5ZXJzIGEgcm91Z2ggY29udHJvbCBvdmVyIHRoZQogICAgcHJpb3JpdHkgb2YgdHJhbnNtaXNzaW9uIGZvciBhIGdpdmVuIHN0YXRpb24gd2hlbiBzdXBwb3J0aW5nIG11bHRpcGxlCiAgICBjb25uZWN0aW9ucy4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjaGFuZ2UgaW4gcHJpb3JpdHkgY2FuIGJlCiAgICBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRoYXQgaGFzIHRvIGNoYW5nZSBwcmlvcml0eQoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NldFNUQVByaW9yaXR5CigKICB2X1BWT0lEX3QgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9TVEFQcmlvcml0eVR5cGUgICB0bFNUQVByaQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfU2V0U1RBUHJpb3JpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NldFNUQVByaW9yaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfU2V0U1RBUHJpb3JpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZS1hbmFsaXplIGlmIGxvY2sgaXMgbmVlZGVkIHdoZW4gYWRkaW5nIG11bHRpcGxlIHN0YXRpb25zCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkNoYW5naW5nIHN0YXRlIGZvciBTVEEgUHJpIElEOiAlZCBmcm9tICVkIHRvICVkIiwKICAgICAgICAgICAgIHVjU1RBSWQsIHBDbGllbnRTVEEtPnRsUHJpLCB0bFNUQVByaSkpOwogIHBDbGllbnRTVEEtPnRsUHJpID0gdGxTVEFQcmk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU2V0U1RBUHJpb3JpdHkgKi8KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggQkFQCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBTTUUgdG8gcmVnaXN0ZXIgaXRzZWxmIGFzIGNsaWVudCBmb3Igbm9uLWRhdGEgQlQtQU1QIHBhY2tldHMuCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgcGZuVGxCQVBSeEZybTogIHBvaW50ZXIgdG8gdGhlIHJlY2VpdmUgcHJvY2Vzc2luZyByb3V0aW5lIGZvciBub24tZGF0YQogICAgICAgICAgICAgICAgICAgIEJULUFNUCBwYWNrZXRzCiAgICBwZm5GbHVzaE9wQ29tcGxldGVDYjoKICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjYWxsIGJhY2sgZnVuY3Rpb24sIGZvciB0aGUgRmx1c2ggb3BlcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbi4KCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IEJBTCBjbGllbnQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9CQVBSeENCVHlwZSAgICAgcGZuVGxCQVBSeEZybSwKICBXTEFOVExfRmx1c2hPcENvbXBDQlR5cGUgIHBmbkZsdXNoT3BDb21wbGV0ZUNiCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcGZuVGxCQVBSeEZybSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggTlVMTCA9PSBwZm5GbHVzaE9wQ29tcGxldGVDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiSW52YWxpZCBGbHVzaCBDb21wbGV0ZSBDYiBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1ha2Ugc3VyZSB0aGlzIGlzIHRoZSBmaXJzdCByZWdpc3RyYXRpb24gYXR0ZW1wdAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCAhPSBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMgKQogIHsKICAgIHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cysrOwogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkJBUCBjbGllbnQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlZ2lzdGVyIHN0YXRpb24gd2l0aCBUTAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBCQVAgQ2xpZW50IiApKTsKCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzKys7CgogIGlmICggTlVMTCAhPSBwZm5UbEJBUFJ4RnJtICkgCiAgewogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUnggICAgICAgICAgICAgPSBwZm5UbEJBUFJ4RnJtOwogIH0KCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmbkZsdXNoT3BDb21wbGV0ZUNiICAgPSBwZm5GbHVzaE9wQ29tcGxldGVDYjsKCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiAgICAgPSBOVUxMOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50ICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVHhCQVBGcm0KCiAgREVTQ1JJUFRJT04KICAgIEJBUCBjYWxscyB0aGlzIHdoZW4gaXQgd2FudHMgdG8gc2VuZCBhIGZyYW1lIHRvIHRoZSBtb2R1bGUKCiAgREVQRU5ERU5DSUVTCiAgICBCQVAgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgICBSRVNUUklDVElPTjogQkFQIENBTk5PVCBwdXNoIGFueSBwYWNrZXRzIHRvIFRMIHVudGlsIGl0IGRpZCBub3QgcmVjZWl2ZQogICAgICAgICAgICAgICAgIGEgdHggY29tcGxldGUgZnJvbSB0aGUgcHJldmlvdXMgcGFja2V0LCB0aGF0IG1lYW5zIEJBUAogICAgICAgICAgICAgICAgIHNlbmRzIG9uZSBwYWNrZXQsIHdhaXQgZm9yIHR4IGNvbXBsZXRlIGFuZCB0aGVuCiAgICAgICAgICAgICAgICAgc2VuZHMgYW5vdGhlciBvbmUKCiAgICAgICAgICAgICAgICAgSWYgQkFQIHNlbmRzIGFub3RoZXIgcGFja2V0IGJlZm9yZSBUTCBtYW5hZ2VzIHRvIHByb2Nlc3MgdGhlCiAgICAgICAgICAgICAgICAgcHJldmlvdXNseSBzZW50IHBhY2tldCBjYWxsIHdpbGwgZW5kIGluIGZhaWx1cmUKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgQkFQJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHZPU1MgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHBhY2tldCB0byBiZQogICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVkCiAgICBwTWV0YUluZm86ICAgICAgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFja2V0CiAgICBwZm5UbEJBUFR4Q29tcDogcG9pbnRlciB0byBhIHRyYW5zbWl0IGNvbXBsZXRlIHJvdXRpbmUgZm9yIG5vdGlmeWluZwogICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBvdmVyIHRoZSBidXMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBCQUwgY2xpZW50IHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfRV9CVVNZOiAgIFRoZSBwcmV2aW91cyBCVC1BTVAgcGFja2V0IHdhcyBub3QgeWV0IHRyYW5zbWl0dGVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgICBPdGhlciBmYWlsdXJlIG1lc3NhZ2VzIG1heSBiZSByZXR1cm5lZCBmcm9tIHRoZSBCRCBoZWFkZXIgaGFuZGxpbmcKICAgIHJvdXRpbmVzLCBwbGVhc2UgY2hlY2sgYXByb3ByaWF0ZSBBUEkgZm9yIG1vcmUgaW5mby4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhCQVBGcm0KKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgICAgICAgICAgIHZvc0RhdGFCdWZmLAogIFdMQU5UTF9NZXRhSW5mb1R5cGUqICAgIHBNZXRhSW5mbywKICBXTEFOVExfVHhDb21wQ0JUeXBlICAgICBwZm5UbEJBUFR4Q29tcAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgICAgICA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgdl9NQUNBRERSX3QgICAgIHZEZXN0TWFjQWRkcjsKICB2X1UxNl90ICAgICAgICAgdXNQa3RMZW47CiAgdl9VOF90ICAgICAgICAgIHVjU3RhSWQgPSAwOwogIHZfVThfdCAgICAgICAgICBleHRyYUhlYWRTcGFjZSA9IDA7CiAgdl9VOF90ICAgICAgICAgIHVjV0RTRW5hYmxlZCA9IDA7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9UeEJBUEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRW5zdXJlIHRoYXQgQkFQIGNsaWVudCB3YXMgcmVnaXN0ZXJlZCBwcmV2aW91c2x5CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggMCA9PSBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMgKSB8fAogICAgICAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRChwVExDYi0+dGxCQVBDbGllbnQudWNCQVBTVEFJZCkgKSkKICB7CiAgICBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMrKzsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6QkFQIGNsaWVudCBub3QgcmVnaXN0ZXIgb24gV0xBTlRMX1R4QkFQRnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBDaGVjayBpZiBhbnkgQlQtQU1QIEZybSBpcyBwZW5kaW5nCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkJULUFNUCBGcmFtZSBhbHJlYWR5IHBlbmRpbmcgdHggaW4gVEwgb24gV0xBTlRMX1R4QkFQRnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9CVVNZOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgYnVmZmVyIGFuZCBub3RpZnkgQkFMOyBubyBsb2NrIGlzIG5lZWRlZCBpZiB0aGUgYWJvdmUgcmVzdHJpY3Rpb24KICAgIGlzIG1ldAogICAgU2F2ZSB0aGUgdHggY29tcGxldGUgZm5jdCBwb2ludGVyIGFzIHRsIHNwZWNpZmljIGRhdGEgaW4gdGhlIHZvcyBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1N0YUlkID0gcFRMQ2ItPnRsQkFQQ2xpZW50LnVjQkFQU1RBSWQ7CiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdICkKICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQogIGlmICgoIDAgPT0gcE1ldGFJbmZvLT51Y0Rpc2FibGVGcm1YdGwgKSAmJiAKICAgICAgKCAwICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gKSkKICB7CiAgICB2b3NTdGF0dXMgPSAgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKCB2b3NEYXRhQnVmZiwgJnZvc1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLCAmdWNTdGFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXRhSW5mby0+dWNVUCwgJnVjV0RTRW5hYmxlZCwgJmV4dHJhSGVhZFNwYWNlKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpFcnJvciB3aGVuIHRyYW5zbGF0aW5nIGhlYWRlciBXTEFOVExfVHhCQVBGcm0iKSk7CgogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKICAgIHBNZXRhSW5mby0+dWNEaXNhYmxlRnJtWHRsID0gMTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2FsbCBIQUwgdG8gZmlsbCBCRCBoZWFkZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogIC8qIEFkZGluZyBUeXBlLCBTdWJUeXBlIHdoaWNoIHdhcyBtaXNzaW5nIGZvciBFQVBPTCBmcm9tIEJBUCAqLwogIHBNZXRhSW5mby0+dWNUeXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwogIHBNZXRhSW5mby0+dWNUeXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSk7CgogIHZvc1N0YXR1cyA9IFdEQV9EU19CdWlsZFR4UGFja2V0SW5mbyggcHZvc0dDdHgsIHZvc0RhdGFCdWZmICwgCiAgICAgICAgICAgICAgICAgICAgJnZEZXN0TWFjQWRkciwgcE1ldGFJbmZvLT51Y0Rpc2FibGVGcm1YdGwsIAogICAgICAgICAgICAgICAgICAgICZ1c1BrdExlbiwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0tPndTVEFEZXNjLnVjUW9zRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICB1Y1dEU0VuYWJsZWQsIGV4dHJhSGVhZFNwYWNlLCBwTWV0YUluZm8tPnVjVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgIHBNZXRhSW5mby0+dWNUSUQsIDAgLyogTm8gQUNLICovLCBwTWV0YUluZm8tPnVzVGltZVN0YW1wLAogICAgICAgICAgICAgICAgICAgIHBNZXRhSW5mby0+dWNJc0VhcG9sIHx8IHBNZXRhSW5mby0+dWNJc1dhaSwgcE1ldGFJbmZvLT51Y1VQICk7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYnVpbGRpbmcgVFggaGVhZGVyICVkIiwgdm9zU3RhdHVzKSk7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgaWYgKCBOVUxMICE9IHBmblRsQkFQVHhDb21wICkKICB7CiAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBmblRsQkFQVHhDb21wKTsKICB9CiAgZWxzZQogIHsKICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpV0xBTlRMX1R4Q29tcERlZmF1bHRDYik7CgogIH0KCiAgdm9zX2F0b21pY19zZXRfVTMyKCAodl9VMzJfdCopJnBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdCl2b3NEYXRhQnVmZik7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aHJlIGFyZSBlbm91Z2ggcmVzb3VyY2VzIGZvciB0cmFuc21pc3Npb24gYW5kIHR4IGlzIG5vdAogICAgc3VzcGVuZGVkLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19CQVAgKSAmJgogICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSkKICB7CiAgICBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICB9CiAgZWxzZQogIHsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIE5vIGVycm9yIGNvZGUgaXMgc2VudCBiZWNhdXNlIFRMIHdpbGwgcmVzdW1lIHR4IGF1dG9ub21vdXNseSBpZgogICAgICByZXNvdXJjZXMgYmVjb21lIGF2YWlsYWJsZSBvciB0eCBnZXRzIHJlc3VtZWQKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBmcm9tIEJBUCBidXQgY29uZGl0aW9uIG5vdCBtZXQuUmVzOiAlZCwiCiAgICAgICAgICAgICAgICAgIlN1c3BlbmQ6ICVkIiwgcFRMQ2ItPnVSZXNDb3VudCwgcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1R4QkFQRnJtICovCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJTlRFUkFDVElPTiBXSVRIIFNNRQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFJzc2kKCiAgREVTQ1JJUFRJT04KICAgIFRMIHdpbGwgZXh0cmFjdCB0aGUgUlNTSSBpbmZvcm1hdGlvbiBmcm9tIGV2ZXJ5IGRhdGEgcGFja2V0IGZyb20gdGhlCiAgICBvbmdvaW5nIHRyYWZmaWMgYW5kIHdpbGwgc3RvcmUgaXQuIEl0IHdpbGwgcHJvdmlkZSB0aGUgcmVzdWx0IHRvIFNNRQogICAgdXBvbiByZXF1ZXN0LgoKICBERVBFTkRFTkNJRVMKCiAgICBXQVJOSU5HOiB0aGUgcmVhZCBhbmQgd3JpdGUgb2YgdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBwcm90ZWN0ZWQKICAgICAgICAgICAgIGJ5IGxvY2tzLCB0aGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGFmdGVyIGEgcmVhZAogICAgICAgICAgICAgbWlnaHQgbm90IGFsd2F5cyBiZSBjb25zaXN0ZW50LgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQoKICAgIE9VVAogICAgcHVSc3NpOiAgICAgICAgIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBSU1NJCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFNUQSB3YXMgbm90IHlldCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0UnNzaQooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgIHVjU1RBSWQsCiAgdl9TN190KiAgICAgICAgICBwUnNzaQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwUnNzaSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0UnNzaSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ29weSB3aWxsIG5vdCBiZSBsb2NrZWQ7IHBsZWFzZSByZWFkIHJlc3RyaWN0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYocFRMQ2ItPmlzQk1QUykKICB7CiAgICAqcFJzc2kgPSBwQ2xpZW50U1RBLT5yc3NpQXZnQm1wczsKICAgIC8qIENoZWNrIElmIFJTU0kgaXMgemVybyBiZWNhdXNlIHdlIGFyZSByZWFkaW5nIHJzc0F2Z0JtcHMgdXBkYXRlZCBieSBIQUwgaW4gCiAgICBwcmV2aW91cyBHZXRTdGF0c1JlcXVlc3QuIEl0IG1heSBiZSB1cGRhdGVkIGFzIHplcm8gYnkgSGFsIGJlY2F1c2UgRW50ZXJCbXBzIAogICAgbWlnaHQgbm90IGhhdmUgaGFwcGVuZCBieSB0aGF0IHRpbWUuIEhlbmNlIHJlYWRpbmcgdGhlIG1vc3QgcmVjZW50IFJzc2kgCiAgICBjYWxjbHVhdGVkIGJ5IFRMKi8KICAgIGlmKDAgPT0gKnBSc3NpKQogICAgewogICAgICAqcFJzc2kgPSBwQ2xpZW50U1RBLT5yc3NpQXZnOwogICAgfQogIH0KICBlbHNlCiAgewogICAgKnBSc3NpID0gcENsaWVudFNUQS0+cnNzaUF2ZzsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0dldFJzc2kgZm9yIFNUQTogJWQgUlNTSTogJWQlcyIsCiAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgKnBSc3NpLAogICAgICAgICAgICAgICAgICAgIHBUTENiLT5pc0JNUFMgPyAiIGluIEJNUFMiIDogIiIpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRSc3NpICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRMaW5rUXVhbGl0eQoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBleHRyYWN0IHRoZSBTTlIgaW5mb3JtYXRpb24gZnJvbSBldmVyeSBkYXRhIHBhY2tldCBmcm9tIHRoZQogICAgb25nb2luZyB0cmFmZmljIGFuZCB3aWxsIHN0b3JlIGl0LiBJdCB3aWxsIHByb3ZpZGUgdGhlIHJlc3VsdCB0byBTTUUKICAgIHVwb24gcmVxdWVzdC4KCiAgREVQRU5ERU5DSUVTCgogICAgV0FSTklORzogdGhlIHJlYWQgYW5kIHdyaXRlIG9mIHRoaXMgdmFsdWUgd2lsbCBub3QgYmUgcHJvdGVjdGVkCiAgICAgICAgICAgICBieSBsb2NrcywgdGhlcmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBvYnRhaW5lZCBhZnRlciBhIHJlYWQKICAgICAgICAgICAgIG1pZ2h0IG5vdCBhbHdheXMgYmUgY29uc2lzdGVudC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0ZWQgdmFsdWUKCiAgICBPVVQKICAgIHB1TGlua1F1YWxpdHk6ICAgICAgICAgdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIFNOUgoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTVEEgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldExpbmtRdWFsaXR5CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgdl9VMzJfdCogICAgICAgICAgICAgIHB1TGlua1F1YWxpdHkKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHVMaW5rUXVhbGl0eSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldExpbmtRdWFsaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENvcHkgd2lsbCBub3QgYmUgbG9ja2VkOyBwbGVhc2UgcmVhZCByZXN0cmljdGlvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICpwdUxpbmtRdWFsaXR5ID0gcENsaWVudFNUQS0+dUxpbmtRdWFsaXR5QXZnOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTlRMX0dldExpbmtRdWFsaXR5IGZvciBTVEE6ICVkIExpbmtRdWFsaXR5OiAlZCIsIHVjU1RBSWQsICpwdUxpbmtRdWFsaXR5KSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0TGlua1F1YWxpdHkgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZsdXNoU3RhVElECgogIERFU0NSSVBUSU9OCiAgICBUTCBwcm92aWRlcyB0aGlzIEFQSSBhcyBhbiBpbnRlcmZhY2UgdG8gU01FIChCQVApIGxheWVyLiBUTCBpbnR1cm4gcG9zdHMgYQogICAgbWVzc2FnZSB0byBIQUwuIFRoaXMgQVBJIGlzIGNhbGxlZCBieSB0aGUgU01FIGlub3JkZXIgdG8gcGVyZm9ybSBhIGZsdXNoCiAgICBvcGVyYXRpb24uCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQogICAgdWNUaWQ6ICAgICAgICAgIFRzcGVjIElEIGZvciB0aGUgbmV3IEJBIHNlc3Npb24KCiAgICBPVVQKICAgIFRoZSByZXNwb25zZSBmb3IgdGhpcyBwb3N0IGlzIHJlY2VpdmVkIGluIHRoZSBtYWluIHRocmVhZCwgdmlhIGEgcmVzcG9uc2UKICAgIG1lc3NhZ2UgZnJvbSBIQUwgdG8gVEwuCgogIFJFVFVSTiBWQUxVRQogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRmx1c2hTdGFUSUQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNUaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB0cEZsdXNoQUNSZXEgRmx1c2hBQ1JlcVB0ciA9IE5VTEw7CiAgdm9zX21zZ190IHZvc01lc3NhZ2U7CgoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0ZsdXNoU3RhVElEIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9GbHVzaFN0YVRJRCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiU3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfRmx1c2hTdGFUSUQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgV2UgbmVlZCB0byBwb3N0IGEgbWVzc2FnZSB3aXRoIHRoZSBTVEEsIFRJRCB2YWx1ZSB0byBIQUwuIEhBTCBwZXJmb3JtcyB0aGUgZmx1c2gKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEZsdXNoQUNSZXFQdHIgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodEZsdXNoQUNSZXEpKTsKCiAgaWYgKCBOVUxMID09IEZsdXNoQUNSZXFQdHIgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDogZmF0YWwgZmFpbHVyZSwgY2Fubm90IGFsbG9jYXRlIEZsdXNoIFJlcSBzdHJ1Y3R1cmUiKSk7CiAgICBWT1NfQVNTRVJUKDApOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKICB9CgogIC8vIFN0YXJ0IGNvbnN0cnVjdGluZyB0aGUgbWVzc2FnZSBmb3IgSEFMCiAgRmx1c2hBQ1JlcVB0ci0+bWVzZ1R5cGUgICAgPSBTSVJfVExfSEFMX0ZMVVNIX0FDX1JFUTsKICBGbHVzaEFDUmVxUHRyLT5tZXNnTGVuICAgICA9IHNpemVvZih0Rmx1c2hBQ1JlcSk7CiAgRmx1c2hBQ1JlcVB0ci0+bWVzZ0xlbiAgICAgPSBzaXplb2YodEZsdXNoQUNSZXEpOwogIEZsdXNoQUNSZXFQdHItPnVjU1RBSWQgPSB1Y1NUQUlkOwogIEZsdXNoQUNSZXFQdHItPnVjVGlkID0gdWNUaWQ7CgogIHZvc01lc3NhZ2UudHlwZSAgICAgICAgICAgID0gV0RBX1RMX0ZMVVNIX0FDX1JFUTsKICB2b3NNZXNzYWdlLmJvZHlwdHIgPSAodm9pZCAqKUZsdXNoQUNSZXFQdHI7CgogIHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01RX0lEX1dEQSwgJnZvc01lc3NhZ2UpOwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggUEUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZWdpc3Rlck1nbXRGcm1DbGllbnQKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBQRSB0byByZWdpc3RlciBhcyBhIGNsaWVudCBmb3IgbWFuYWdlbWVudCBmcmFtZXMgZGVsaXZlcnkuCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgVEwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgcGZuVGxNZ210RnJtUng6ICAgICBwb2ludGVyIHRvIHRoZSByZWNlaXZlIHByb2Nlc3Npbmcgcm91dGluZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlbWVudCBmcmFtZXMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBNZ210IEZyYW1lIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfTWdtdEZybVJ4Q0JUeXBlICBwZm5UbE1nbXRGcm1SeAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBmblRsTWdtdEZybVJ4ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNYWtlIHN1cmUgdGhpcyBpcyB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uIGF0dGVtcHQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyApCiAgewogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cysrOwogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgZnJhbWUgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZWdpc3RlciBzdGF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBNYW5hZ2VtZW50IEZyYW1lIENsaWVudCIgKSk7CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMrKzsKCiAgaWYgKCBOVUxMICE9IHBmblRsTWdtdEZybVJ4ICkKICB7CiAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4ID0gcGZuVGxNZ210RnJtUng7CiAgfQoKICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiA9IE5VTEw7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9EZVJlZ2lzdGVyTWdtdEZybUNsaWVudAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFBFIHRvIGRlcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzIGRlbGl2ZXJ5LgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgQVBJIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IE1nbXQgRnJhbWUgY2xpZW50IHdhcyBuZXZlciByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRGVSZWdpc3Rlck1nbXRGcm1DbGllbnQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNYWtlIHN1cmUgdGhpcyBpcyB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uIGF0dGVtcHQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgPT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgZnJhbWUgY2xpZW50IHdhcyBuZXZlciByZWdpc3RlcmVkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYXIgcmVnaXN0cmF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpEZXJlZ2lzdGVyaW5nIE1hbmFnZW1lbnQgRnJhbWUgQ2xpZW50IiApKTsKCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCA9IFdMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2I7CiAgaWYgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgY2FjaGUgYnVmZmVyIG5vdCBlbXB0eSBvbiBkZXJlZ2lzdGVyaW5nIgogICAgICAgICAgICAgICAiIC0gZHJvcHBpbmcgcGFja2V0IiApKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZik7CgogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgPSBOVUxMOyAKICB9CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgPSAwOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVHhNZ210RnJtCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgUEUgd2hlbiBpdCB3YW50IHRvIHNlbmQgb3V0IGEgbWFuYWdlbWVudCBmcmFtZS4KICAgIEhBTCB3aWxsIGFsc28gdXNlIHRoaXMgQVBJIGZvciB0aGUgZmV3IGZyYW1lcyBpdCBzZW5kcyBvdXQsIHRoZXkgYXJlIG5vdAogICAgbWFuYWdlbWVudCBmcmFtZXMgaG93ZXZlcmUgaXQgaXMgYWNjZXB0ZWQgdGhhdCBhbiBleGNlcHRpb24gd2lsbCBiZQogICAgYWxsb3dlZCBPTkxZIGZvciB0aGUgdXNhZ2Ugb2YgSEFMLgogICAgR2VuZXJpYyBkYXRhIGZyYW1lcyBTSE9VTEQgTk9UIHRyYXZlbCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4KCiAgICBSRVNUUklDVElPTjogSWYgUEUgc2VuZHMgYW5vdGhlciBwYWNrZXQgYmVmb3JlIFRMIG1hbmFnZXMgdG8gcHJvY2VzcyB0aGUKICAgICAgICAgICAgICAgICBwcmV2aW91c2x5IHNlbnQgcGFja2V0IGNhbGwgd2lsbCBlbmQgaW4gZmFpbHVyZQoKICAgICAgICAgICAgICAgICBGcmFtZXMgY29tbWluZyB0aHJvdWdoIGhlcmUgbXVzdCBiZSA4MDIuMTEgZnJhbWVzLCBmcmFtZQogICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uIGluIFVNQSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDthIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHZvc0ZybUJ1ZjogICAgICBwb2ludGVyIHRvIGEgdk9TUyBidWZmZXIgY29udGFpbmluZyB0aGUgbWFuYWdlbWVudAogICAgICAgICAgICAgICAgICAgIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkCiAgICB1c0ZybUxlbjogICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQ7IGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgdk9TUyBidWZmZXIKICAgIHdGcm1UeXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgZnJhbWUgYmVpbmcgdHJhbnNtaXR0ZWQKICAgIHRpZDogICAgICAgICAgICB0aWQgdXNlZCB0byB0cmFuc21pdCB0aGlzIGZyYW1lCiAgICBwZm5Db21wVHhGdW5jOiAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgY29tcGxldGUgcm91dGluZQogICAgcHZCREhlYWRlcjogICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlciwgaWYgTlVMTCBpdCBtZWFucyBpdCB3YXMgbm90CiAgICAgICAgICAgICAgICAgICAgeWV0IGNvbnN0cnVjdGVkIGFuZCBpdCBsaWVzIHdpdGhpbiBUTCdzIHJlc3BvbnNpYmlsaXR5CiAgICAgICAgICAgICAgICAgICAgdG8gZG8gc287IGlmIG5vdCBOVUxMIGl0IGlzIGV4cGVjdGVkIHRoYXQgaXQgd2FzCiAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBwYWNrZWQgaW5zaWRlIHRoZSB2b3MgcGFja2V0CiAgICB1Y0Fja1Jlc3BvbnNlOiAgZmxhZyBub3RpZnlpbmcgaXQgYW4gaW50ZXJydXB0IGlzIG5lZWRlZCBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgYWNrbm93bGVkZ2VtZW50IHJlY2VpdmVkIHdoZW4gdGhlIGZyYW1lIGlzIHNlbnQgb3V0CiAgICAgICAgICAgICAgICAgICAgdGhlIGFpciBhbmQgOyB0aGUgaW50ZXJydXB0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IEhBTCwKICAgICAgICAgICAgICAgICAgICBvbmx5IG9uZSBzdWNoIGZyYW1lIGNhbiBiZSBwZW5kaW5nIGluIHRoZSBzeXN0ZW0gYXQKICAgICAgICAgICAgICAgICAgICBvbmUgdGltZS4KCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogTWdtdCBGcmFtZSBjbGllbnQgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19FX0JVU1k6ICAgVGhlIHByZXZpb3VzIE1nbXQgcGFja2V0IHdhcyBub3QgeWV0IHRyYW5zbWl0dGVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgICBPdGhlciBmYWlsdXJlIG1lc3NhZ2VzIG1heSBiZSByZXR1cm5lZCBmcm9tIHRoZSBCRCBoZWFkZXIgaGFuZGxpbmcKICAgIHJvdXRpbmVzLCBwbGVhc2UgY2hlY2sgYXByb3ByaWF0ZSBBUEkgZm9yIG1vcmUgaW5mby4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhNZ210RnJtCigKICB2X1BWT0lEX3QgICAgICAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgICAgICB2b3NGcm1CdWYsCiAgdl9VMTZfdCAgICAgICAgICAgICAgdXNGcm1MZW4sCiAgdl9VOF90ICAgICAgICAgICAgICAgd0ZybVR5cGUsCiAgdl9VOF90ICAgICAgICAgICAgICAgdWNUaWQsCiAgV0xBTlRMX1R4Q29tcENCVHlwZSAgcGZuQ29tcFR4RnVuYywKICB2X1BWT0lEX3QgICAgICAgICAgICBwdkJESGVhZGVyLAogIHZfVThfdCAgICAgICAgICAgICAgIHVjQWNrUmVzcG9uc2UKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB2X01BQ0FERFJfdCAgICAgdkRlc3RNYWNBZGRyOwogIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgdl9VMTZfdCAgICAgICAgIHVzUGt0TGVuOwogIHZfVTMyX3QgICAgICAgICB1c1RpbWVTdGFtcCA9IDA7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gdm9zRnJtQnVmICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1R4TWdtdEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfVHhNZ210RnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFbnN1cmUgdGhhdCBtYW5hZ2VtZW50IGZyYW1lIGNsaWVudCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwID09IHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgKQogIHsKICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMrKzsKICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgRnJhbWUgY2xpZW50IG5vdCByZWdpc3RlciBvbiBXTEFOVExfVHhNZ210RnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIGFueSBNZ210IEZybSBpcyBwZW5kaW5nCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy92b3NUZW1wQnVmZiA9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmOwogIGlmICggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApCiAgewoKICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IEZyYW1lIGFscmVhZHkgcGVuZGluZyB0eCBpbiBUTDogZmFpbGluZyBvbGQgb25lIikpOwoKCiAgICAvKkZhaWxpbmcgdGhlIHR4IGZvciB0aGUgcHJldmlvdXMgcGFja2V0IGVucXVlZCBieSBQRSovCiAgICAvL3Zvc19hdG9taWNfc2V0X1UzMiggKHZfVTMyX3QqKSZwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgIC8vICAgICAgICAgICAgICAgICAgICAodl9VMzJfdClOVUxMKTsKCiAgICAvL3Zvc19wa3RfZ2V0X3VzZXJfZGF0YV9wdHIoIHZvc1RlbXBCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcGZuVHhDb21wKTsKCiAgICAvKml0IHNob3VsZCBuZXZlciBiZSBOVUxMIC0gZGVmYXVsdCBoYW5kbGVyIHNob3VsZCBiZSByZWdpc3RlcmVkIGlmIG5vbmUqLwogICAgLy9pZiAoIE5VTEwgPT0gcGZuVHhDb21wICkKICAgIC8vewogICAgLy8gIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgLy8gICAgICAgICAgICAiTlVMTCBwb2ludGVyIHRvIFR4IENvbXBsZXRlIG9uIFdMQU5UTF9UeE1nbXRGcm0iKTsKICAgIC8vICBWT1NfQVNTRVJUKDApOwogICAgLy8gIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICAvL30KCiAgICAvL3BmblR4Q29tcCggcHZvc0dDdHgsIHZvc1RlbXBCdWZmLCBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTICk7CiAgICAvL3JldHVybiBWT1NfU1RBVFVTX0VfQlVTWTsKCgogICAgLy9wZm5Db21wVHhGdW5jKCBwdm9zR0N0eCwgdm9zRnJtQnVmLCBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBCRCBoZWFkZXIgd2FzIGJ1aWxkLCBpZiBub3QgY29uc3RydWN0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB2QkRIZWFkZXIgKQogIHsKICAgICB2X01BQ0FERFJfdCogICAgIHB2QWRkcjJNYWNBZGRyOwogICAgIHZfVThfdCAgIHVRb3NIZHIgPSBWT1NfRkFMU0U7CgogICAgIC8qIEdldCBhZGRyZXNzIDIgb2YgTWFuZ2VtZW50IEZyYW1lIHRvIGdpdmUgdG8gV0xBTkhBTF9GaWxsVHhCZCAqLwogICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NGcm1CdWYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUFDX0FERFJfQUxJR04oMSkgKyBWT1NfTUFDX0FERFJfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZBZGRyMk1hY0FkZHIsIFZPU19NQUNfQUREUl9TSVpFKTsKCiAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgICB7CiAgICAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBnZXQgYWRkcjIgJWQiLCB2b3NTdGF0dXMpKTsKICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgfQoKICAgIC8qIENDWCBJQVBQL1RETFMgRnJhbWUgd2hpY2ggYXJlIGRhdGEgZnJhbWVzIGJ1dCB0ZWNobmljYWxseSB1c2VkCiAgICAgKiBmb3IgbWFuYWdlbWVudCBmdW5jdGlvbmFsaXR5IGNvbWVzIHRocm91Z2ggcm91dGUuCiAgICAgKi8KICAgIGlmIChXTEFOVExfSVNfUU9TX0RBVEFfRlJBTUUod0ZybVR5cGUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgewogICAgICAgIHVRb3NIZHIgPSBWT1NfVFJVRTsKICAgIH0KICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDYWxsIFdEQSB0byBidWlsZCBUWCBoZWFkZXIKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHZvc1N0YXR1cyA9IFdEQV9EU19CdWlsZFR4UGFja2V0SW5mbyggcHZvc0dDdHgsIHZvc0ZybUJ1ZiAsICZ2RGVzdE1hY0FkZHIsIAogICAgICAgICAgICAgICAgICAgMSAvKiBhbHdheXMgODAyLjExIGZyYW1lcyovLCAmdXNQa3RMZW4sIHVRb3NIZHIgLypxb3Mgbm90IGVuYWJsZWQgISEhKi8sIAogICAgICAgICAgICAgICAgICAgMCAvKiBXRFMgb2ZmICovLCAwLCB3RnJtVHlwZSwgcHZBZGRyMk1hY0FkZHIsIHVjVGlkLCAKICAgICAgICAgICAgICAgICAgIHVjQWNrUmVzcG9uc2UsIHVzVGltZVN0YW1wLCAwLCAwICk7CgoKICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKICAgIHsKICAgICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYnVpbGQgVFggaGVhZGVyICVkIiwgdm9zU3RhdHVzKSk7CiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiAgIH0vKiBpZiBCRCBoZWFkZXIgbm90IHByZXNlbnQgKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgYnVmZmVyIGFuZCBub3RpZnkgQkFMOyBubyBsb2NrIGlzIG5lZWRlZCBpZiB0aGUgYWJvdmUgcmVzdHJpY3Rpb24KICAgIGlzIG1ldAogICAgU2F2ZSB0aGUgdHggY29tcGxldGUgZm5jdCBwb2ludGVyIGFzIHRsIHNwZWNpZmljIGRhdGEgaW4gdGhlIHZvcyBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgIT0gcGZuQ29tcFR4RnVuYyApCiAgewogICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRnJtQnVmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpcGZuQ29tcFR4RnVuYyk7CiAgfQogIGVsc2UKICB7CiAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NGcm1CdWYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClXTEFOVExfVHhDb21wRGVmYXVsdENiKTsKCiAgfQoKICB2b3NfYXRvbWljX3NldF9VMzIoICh2X1UzMl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdCl2b3NGcm1CdWYpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhyZSBhcmUgZW5vdWdoIHJlc291cmNlcyBmb3IgdHJhbnNtaXNzaW9uIGFuZCB0eCBpcyBub3QKICAgIHN1c3BlbmRlZC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19NRiApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDpJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwgZm9yIE1HTVQiKSk7CiAgICB2b3NTdGF0dXMgPSBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCiAgICB7CiAgICAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAgIldMQU4gVEw6V0RBX0RTX1N0YXJ0WG1pdCBmYWlscy4gdm9zU3RhdHVzICVkIiwgdm9zU3RhdHVzKSk7CiAgICAgICB2b3NfYXRvbWljX3NldF9VMzIoICh2X1UzMl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsMCk7IAogICAgfQogICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIAogIH0KICBlbHNlCiAgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgTm8gZXJyb3IgY29kZSBpcyBzZW50IGJlY2F1c2UgVEwgd2lsbCByZXN1bWUgdHggYXV0b25vbW91c2x5IGlmCiAgICAgIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlIG9yIHR4IGdldHMgcmVzdW1lZAogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBmb3IgTWdtdCBGcm0gYnV0IGNvbmRpdGlvbiBub3QgbWV0LiBSZXM6ICVkIiwKICAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCkpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9UeE1nbXRGcm0gKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSU5URVJBQ1RJT04gV0lUSCBIQUwKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZXNldE5vdGlmaWNhdGlvbgoKICBERVNDUklQVElPTgogICAgSEFMIG5vdGlmaWVzIFRMIHdoZW4gdGhlIG1vZHVsZSBpcyBiZWluZyByZXNldC4KICAgIEN1cnJlbnRseSBub3QgdXNlZC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZXNldE5vdGlmaWNhdGlvbgooCiAgdl9QVk9JRF90ICAgcHZvc0dDdHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUmVzZXROb3RpZmljYXRpb24iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgV0xBTlRMX0NsZWFuQ0IocFRMQ2IsIDEgLyplbXB0eSBhbGwgcXVldWVzIGFuZCBwZW5kaW5nIHBhY2tldHMqLyk7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZXNldE5vdGlmaWNhdGlvbiAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU3VzcGVuZERhdGFUeAoKICBERVNDUklQVElPTgogICAgSEFMIGNhbGxzIHRoaXMgQVBJIHdoZW4gaXQgd2lzaGVzIHRvIHN1c3BlbmQgdHJhbnNtaXNzaW9uIGZvciBhCiAgICBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIG11c3QgYmUgZmlyc3QgcmVnaXN0ZXJlZCB3aXRoCiAgICBUTCBieSBIREQuCgogICAgUkVTVFJJQ1RJT046ICBJbiBjYXNlIG9mIGEgc3VzcGVuZCwgdGhlIGZsYWcgd3JpdGUgYW5kIHJlYWQgd2lsbCBub3QgYmUKICAgICAgICAgICAgICAgICAgbG9ja2VkOiB3b3JzdCBjYXNlIHNjZW5hcmlvIG9uZSBtb3JlIHBhY2tldCBjYW4gZ2V0CiAgICAgICAgICAgICAgICAgIHRocm91Z2ggYmVmb3JlIHRoZSBmbGFnIGdldHMgdXBkYXRlZCAod2UgY2FuIG1ha2UgdGhpcwogICAgICAgICAgICAgICAgICB3cml0ZSBhdG9taWMgYXMgd2VsbCB0byBndWFyYW50ZWUgY29uc2lzdGVuY3kpCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwdWNTVEFJZDogICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZTsKICAgICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIE5VTEwgYXNzdW1lcyBzdXNwZW5kIG9uIGFsbCBhY3RpdmUgc3RhdGlvbgogICAgcGZuU3VzcGVuZFR4Q0I6IHBvaW50ZXIgdG8gdGhlIHN1c3BlbmQgcmVzdWx0IG5vdGlmaWNhdGlvbiBpbiBjYXNlIHRoZQogICAgICAgICAgICAgICAgICAgIGNhbGwgaXMgYXN5bmNocm9ub3VzCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTCldMQU5UTF9TdXNwZW5kRGF0YVR4CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgICAgICAgICAgcHVjU1RBSWQsCiAgV0xBTlRMX1N1c3BlbmRDQlR5cGUgICBwZm5TdXNwZW5kVHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB2b3NfbXNnX3QgICAgICAgdm9zTXNnOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TdXNwZW5kRGF0YVR4IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayB0aGUgdHlwZSBvZiByZXF1ZXN0OiBnZW5lcmljIHN1c3BlbmQsIG9yIHBlciBzdGF0aW9uIHN1c3BlbmQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoTlVMTCA9PSBwdWNTVEFJZCkKICB7CiAgICAvKiBHZW5lcmFsIFN1c3BlbmQgUmVxdWVzdCByZWNlaXZlZCAqLwogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDpHZW5lcmFsIHN1c3BlbmQgcmVxdWVzdGVkIikpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMSk7CiAgICB2b3NNc2cucmVzZXJ2ZWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggKnB1Y1NUQUlkICkgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgJWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9TdXNwZW5kRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdICYmICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjRXhpc3RzICkpCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gJWQgd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1N1c3BlbmREYXRhVHgiLCAqcHVjU1RBSWQpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgIldMQU4gVEw6U3VzcGVuZCByZXF1ZXN0IGZvciBzdGF0aW9uOiAlZCIsICpwdWNTVEFJZCkpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y1R4U3VzcGVuZGVkLCAxKTsKICAgIHZvc01zZy5yZXNlcnZlZCA9ICpwdWNTVEFJZDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTZXJpYWxpemUgcmVxdWVzdCB0aHJvdWdoIFRYIHRocmVhZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc01zZy50eXBlICAgICA9IFdMQU5UTF9UWF9TSUdfU1VTUEVORDsKICB2b3NNc2cuYm9keXB0ciAgICAgPSAodl9QVk9JRF90KXBmblN1c3BlbmRUeDsKCiAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTVFfSURfVEwsICZ2b3NNc2cpKSkKICB7CiAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIiAlcyBmYWlscyB0byBwb3N0IG1lc3NhZ2UiLCBfX2Z1bmNfXyk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1N1c3BlbmREYXRhVHggKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1Jlc3VtZURhdGFUeAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IEhBTCB0byByZXN1bWUgZGF0YSB0cmFuc21pc3Npb24gZm9yIGEgZ2l2ZW4gU1RBLgoKICAgIFdBUk5JTkc6IElmIGEgc3RhdGlvbiB3YXMgaW5kaXZpZHVhbGx5IHN1c3BlbmRlZCBhIGdsb2JhbCByZXN1bWUgd2lsbAogICAgICAgICAgICAgbm90IHJlc3VtZSB0aGF0IHN0YXRpb24KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwdWNTVEFJZDogICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiB3aGljaCBpcyBiZWluZyByZXN1bWVkOyBOVUxMCiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlcyBpbnRvIGdsb2JhbCByZXN1bWUKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUwpXTEFOVExfUmVzdW1lRGF0YVR4CigKICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICBwdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZXN1bWVEYXRhVHgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIHRvIHNlZSB0aGUgdHlwZSBvZiByZXN1bWUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHVjU1RBSWQgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6R2VuZXJhbCByZXN1bWUgcmVxdWVzdGVkIikpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMCk7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggKnB1Y1NUQUlkICkpCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkICVkIHJlcXVlc3RlZCBvbiBXTEFOVExfUmVzdW1lRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdICYmICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjRXhpc3RzICkpCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gJWQgd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1Jlc3VtZURhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICAgIH0KCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAiV0xBTiBUTDpSZXN1bWUgcmVxdWVzdCBmb3Igc3RhdGlvbjogJWQiLCAqcHVjU1RBSWQpKTsKICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNUeFN1c3BlbmRlZCwgMCk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVzdW1pbmcgdHJhbnNtaXNzaW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX01GICkgJiYKICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6UmVzdW1pbmcgdHJhbnNtaXNzaW9uIikpOwogICAgcmV0dXJuIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZXN1bWVEYXRhVHggKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU3VzcGVuZENCCgogIERFU0NSSVBUSU9OCiAgICBDYWxsYmFjayBmdW5jdGlvbiBmb3Igc2VyaWFsaXppbmcgU3VzcGVuZCBzaWduYWwgdGhyb3VnaCBUeCB0aHJlYWQKCiAgREVQRU5ERU5DSUVTCiAgICBKdXN0IG5vdGlmeSBIQUwgdGhhdCBzdXNwZW5kIGluIFRMIGlzIGNvbXBsZXRlLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICBwVXNlckRhdGE6ICAgICAgdXNlciBkYXRhIHNlbnQgd2l0aCB0aGUgY2FsbGJhY2sKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1N1c3BlbmRDQgooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9TdXNwZW5kQ0JUeXBlICBwZm5TdXNwZW5kQ0IsCiAgdl9VMTZfdCAgICAgICAgICAgICAgIHVzUmVzZXJ2ZWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiICAgPSBOVUxMOwogIHZfVThfdCAgICAgICAgICB1Y1NUQUlkID0gKHZfVThfdCl1c1Jlc2VydmVkOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBmblN1c3BlbmRDQiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyBDYWxsIGJhY2sgcHJvY2Vzc2luZyByZXF1ZXN0ZWQgV0xBTlRMX1N1c3BlbmRDQiIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N1c3BlbmRDQiIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBwZm5TdXNwZW5kQ0IocHZvc0dDdHgsIE5VTEwsIFZPU19TVEFUVVNfU1VDQ0VTUyk7CiAgfQogIGVsc2UKICB7CiAgICBwZm5TdXNwZW5kQ0IocHZvc0dDdHgsICZ1Y1NUQUlkLCBWT1NfU1RBVFVTX1NVQ0NFU1MpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1N1c3BlbmRDQiovCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDTElFTlQgSU5ERVBFTkRFTlQgSU5URVJGQUNFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0VHhQa3RDb3VudAoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBwcm92aWRlIHRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcGFja2V0cyBjb3VudGVkIHBlcgogICAgU1RBIHBlciBUSUQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24KICAgIHVjVGlkOiAgICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSB0c3BlYwoKICAgIE9VVAogICAgcHVUeFBrdENvdW50OiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0eCBwYWNrZXQgZm9yIHRoaXMgU1RBIGFuZCBUSUQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0VHhQa3RDb3VudAooCiAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICB1Y1RpZCwKICB2X1UzMl90KiAgICAgICBwdVR4UGt0Q291bnQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdVR4UGt0Q291bnQgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApIHx8IFdMQU5UTF9USURfSU5WQUxJRCggdWNUaWQpICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkICVkL3RpZCAlZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldFR4UGt0Q291bnQiLAogICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGlmIHN0YXRpb24gZXhpc3RzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFR4UGt0Q291bnQgJWQiLAogICAgIHVjU1RBSWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJldHVybiBkYXRhCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy9WT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwKICAgIC8vICAgICAgICAgIldMQU4gVEw6UmVxdWVzdGVkIHR4IHBhY2tldCBjb3VudCBmb3IgU1RBOiAlZCwgVElEOiAlZCIsIAogICAgICAvLyAgICAgICAgIHVjU1RBSWQsIHVjVGlkKTsKCiAgKnB1VHhQa3RDb3VudCA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5hdVR4Q291bnRbdWNUaWRdOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFR4UGt0Q291bnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFJ4UGt0Q291bnQKCiAgREVTQ1JJUFRJT04KICAgIFRMIHdpbGwgcHJvdmlkZSB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgY291bnRlZCBwZXIKICAgIFNUQSBwZXIgVElELgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uCiAgICB1Y1RpZDogICAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgdHNwZWMKCiAgIE9VVAogICAgcHVUeFBrdENvdW50OiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyByeCBwYWNrZXQgZm9yIHRoaXMgU1RBIGFuZCBUSUQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0UnhQa3RDb3VudAooCiAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICB1Y1RpZCwKICB2X1UzMl90KiAgICAgICBwdVJ4UGt0Q291bnQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHVSeFBrdENvdW50ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSB8fCBXTEFOVExfVElEX0lOVkFMSUQoIHVjVGlkKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkICVkL3RpZCAlZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiLAogICAgICAgICAgICAgdWNTVEFJZCwgdWNUaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXR1cm4gZGF0YQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwKICAgICAgICAgICAgIldMQU4gVEw6UmVxdWVzdGVkIHJ4IHBhY2tldCBjb3VudCBmb3IgU1RBOiAlZCwgVElEOiAlZCIsCiAgICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOwoKICAqcHVSeFBrdENvdW50ID0gcENsaWVudFNUQS0+YXVSeENvdW50W3VjVGlkXTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRSeFBrdENvdW50ICovCgpWT1NfU1RBVFVTCldMQU5UTF9UeEZDRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopOwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgIFRMIElOVEVSTkFMIEFQSSBERUZJTklUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0RnJhbWVzCgogIERFU0NSSVBUSU9OCgogICAgQkFMIGNhbGxzIHRoaXMgZnVuY3Rpb24gYXQgdGhlIHJlcXVlc3Qgb2YgdGhlIGxvd2VyIGJ1cyBpbnRlcmZhY2UuCiAgICBXaGVuIHRoaXMgcmVxdWVzdCBpcyBiZWluZyByZWNlaXZlZCBUTCB3aWxsIHJldHJpZXZlIHBhY2tldHMgZnJvbSBIREQKICAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgcHJpb3JpdHkgcnVsZXMgYW5kIHRoZSBjb3VudCBzdXBwbGllZCBieSBCQUwuCgogIERFUEVOREVOQ0lFUwoKICAgIEhERCBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGF0IGxlYXN0IG9uZSBTVEEgYmVmb3JlIHRoaXMgZnVuY3Rpb24KICAgIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1U2l6ZTogICAgICAgICAgbWF4aW11bSBzaXplIGFjY2VwdGVkIGJ5IHRoZSBsb3dlciBsYXllcgogICAgdUZsb3dNYXNrICAgICAgIFRYIGZsb3cgY29udHJvbCBtYXNrIGZvciBQcmltYS4gRWFjaCBiaXQgaXMgZGVmaW5lZCBhcyAKICAgICAgICAgICAgICAgICAgICBXREFfVFhGbG93RW51bVR5cGUKCiAgICBPVVQKICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlciBzdXBwbGllZAogICAgICAgICAgICAgICAgICAgIGJ5IFRMLCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhY2tldCBzdXBwbGllZCwgVEwKICAgICAgICAgICAgICAgICAgICB3aWxsIGNoYWluIHRoZW0gdGhyb3VnaCB2T1NTIGJ1ZmZlcnMKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICAxIG9yIG1vcmU6IG51bWJlciBvZiByZXF1aXJlZCByZXNvdXJjZXMgaWYgdGhlcmUgYXJlIHN0aWxsIGZyYW1lcyB0byBmZXRjaAogICAgMCA6IGVycm9yIG9yIEhERCBxdWV1ZXMgYXJlIGRyYWluZWQKCiAgU0lERSBFRkZFQ1RTCgogIE5PVEUKICAgIAogICAgRmVhdHVyaXplZCB1Rmxvd01hc2suIElmIHdlIHdhbnQgdG8gcmVtb3ZlIGZlYXR1cml6YXRpb24sIHdlIG5lZWQgdG8gY2hhbmdlCiAgICBCQUwgb24gVm9sYW5zLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfVTMyX3QKV0xBTlRMX0dldEZyYW1lcwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCAgICAgKipwcEZyYW1lRGF0YUJ1ZmYsCiAgdl9VMzJfdCAgICAgICAgIHVTaXplLAogIHZfVThfdCAgICAgICAgICB1Rmxvd01hc2ssCiAgdl9CT09MX3QqICAgICAgIHBiVXJnZW50CikKewogICB2b3NfcGt0X3QqKiAgICAgICAgIHB2b3NEYXRhQnVmZiA9ICh2b3NfcGt0X3QqKilwcEZyYW1lRGF0YUJ1ZmY7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgIHZfVTMyX3QgICAgICAgICAgICAgdVJlbWFpbmluZyA9IHVTaXplOwogICB2b3NfcGt0X3QqICAgICAgICAgIHZvc1Jvb3Q7CiAgIHZvc19wa3RfdCogICAgICAgICAgdm9zVGVtcEJ1ZjsKICAgV0xBTlRMX1NUQUZ1bmNUeXBlICBwZm5TVEFGc207CiAgIHZfVTE2X3QgICAgICAgICAgICAgdXNQa3RMZW47CiAgIHZfVTMyX3QgICAgICAgICAgICAgdVJlc0xlbjsKICAgdl9VOF90ICAgICAgICAgICAgICB1Y1NUQUlkOwogICB2X1U4X3QgICAgICAgICAgICAgIHVjQUM7CiAgIHZvc19wa3RfdCogICAgICAgICAgdm9zRGF0YUJ1ZmY7CiAgIHZfVTMyX3QgICAgICAgICAgICAgdVRvdGFsUGt0TGVuOwogICB2X1UzMl90ICAgICAgICAgICAgIGk9MDsKICAgdl9VMzJfdCAgICAgICAgICAgICBqPTA7CiAgIHZfVTMyX3QgICAgICAgICAgICAgdWNSZXN1bHQgPSAwOwogICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICAgV0xBTlRMX1NUQUV2ZW50VHlwZSAgIHdTVEFFdmVudDsKICAgdEJzc1N5c3RlbVJvbGUgICAgICAgc3lzdGVtUm9sZTsKICAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHB2b3NEYXRhQnVmZiApKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIHVjUmVzdWx0OwogIH0KCiAgcE1hYyA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1BFLCBwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBNYWMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwTWFjIiwgX19mdW5jX18pKTsKICAgIHJldHVybiB1Y1Jlc3VsdDsKICB9CgogIHZvc0RhdGFCdWZmID0gcFRMQ2ItPnZvc0R1bW15QnVmOyAvKiBKdXN0IHRvIGF2b2lkIGNoZWNraW5nIGZvciBOVUxMIGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBpdGVyYXRpb24gKi8KCiAgcFRMQ2ItPnVSZXNDb3VudCA9IHVTaXplOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIHRoZSByb290IGFzIHdlIHdpbGwgd2FsayB0aGlzIGNoYWluIGFzIHdlIGZpbGwgaXQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1Jvb3QgPSB2b3NEYXRhQnVmZjsKIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRoZXJlIGlzIHN0aWxsIGRhdGEgLSB1bnRpbCBGU00gZnVuY3Rpb24gc2F5cyBvdGhlcndpc2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiLT5iVXJnZW50ICAgICAgPSBGQUxTRTsKCiAgd2hpbGUgKCggcFRMQ2ItPnRsQ29uZmlnSW5mby51TWluRnJhbWVzUHJvY1RocmVzIDwgcFRMQ2ItPnVSZXNDb3VudCApICYmCiAgICAgICAgICggMCA8IHVSZW1haW5pbmcgKSkKICB7CiAgICBzeXN0ZW1Sb2xlID0gd2RhR2V0R2xvYmFsU3lzdGVtUm9sZShwTWFjKTsKI2lmZGVmIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCi8qIEZJWE1FOiBUaGUgY29kZSBoYXMgYmVlbiBkaXNhYmxlZCBzaW5jZSBpdCBpcyBjcmVhdGluZyBpc3N1ZXMgaW4gcG93ZXIgc2F2ZSAqLwogICAgaWYgKGVTWVNURU1fQVBfUk9MRSA9PSBzeXN0ZW1Sb2xlKQogICAgewogICAgICAgaWYgKHBUTENiLT5kb25lX29uY2UgPT0gMCAmJiBOVUxMID09IHBUTENiLT52b3NUeEZDQnVmKQogICAgICAgewogICAgICAgICAgV0xBTlRMX1R4RkNGcmFtZSAocHZvc0dDdHgpOwogICAgICAgICAgcFRMQ2ItPmRvbmVfb25jZSArKzsKICAgICAgIH0KICAgIH0gCiAgICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnZvc1R4RkNCdWYgKQogICAgewogICAgICAgLy90aGVyZSBpcyBmbG93IGNvbnRyb2wgcGFja2V0IHdhaXRpbmcgdG8gYmUgc2VudAogICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggcFRMQ2ItPnZvc1R4RkNCdWYsIHVzUGt0TGVuLCB1UmVzTGVuLCB1VG90YWxQa3RMZW4pOwogICAgCiAgICAgICBpZiAoICggcFRMQ2ItPnVSZXNDb3VudCA+IHVSZXNMZW4gKSAmJgogICAgICAgICAgICAoIHVSZW1haW5pbmcgPiB1VG90YWxQa3RMZW4gKSAmJgogICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0ZDICkgKSApCiAgICAgICB7CiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgRkMgZnJhbWUgZmlyc3Qgb24gR2V0RnJhbWUiKSk7CgogICAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLCBwVExDYi0+dm9zVHhGQ0J1ZiwgMSAvKnRydWUqLyApOwoKICAgICAgICAgIHZvc19hdG9taWNfc2V0X1UzMiggKHZfVTMyX3QqKSZwVExDYi0+dm9zVHhGQ0J1ZiwgKHZfVTMyX3QpTlVMTCk7CgogICAgICAgICAgLypGQyBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogICAgICAgICAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IFRSVUU7CgogICAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgICAgdVJlbWFpbmluZyAgICAgICAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICAgIHBUTENiLT51UmVzQ291bnQgLT0gdVJlc0xlbjsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgIldMQU4gVEw6c2VuZCBmYyBvdXQgb2Ygc291cmNlICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgIHVjUmVzdWx0ID0gKCBwVExDYi0+dVJlc0NvdW50ID4gdVJlc0xlbiApP1ZPU19UUlVFOlZPU19GQUxTRTsKICAgICAgICAgIGJyZWFrOyAvKiBPdXQgb2YgcmVzb3VyY2VzIG9yIHJlYWNoZWQgbWF4IGxlbiAqLwogICAgICAgfQogICB9CiAgIGVsc2UgCiNlbmRpZiAvL1dMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCgogICAgaWYgKCggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApICYmCiAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19NR01UICkgKSApCiAgICB7CiAgICAgIFdEQV9UTElfUFJPQ0VTU19GUkFNRV9MRU4oIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVzUGt0TGVuLCB1UmVzTGVuLCB1VG90YWxQa3RMZW4pOwoKICAgICAgVk9TX0FTU0VSVCh1c1BrdExlbiA8PSBXTEFOVExfTUFYX0FMTE9XRURfTEVOKTsKCiAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID4gdVJlc0xlbiApICYmCiAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkgJiYKICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX01HTVQgKSApICkKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBtYW5hZ2VtZW50IGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qdHJ1ZSovICk7CgogICAgICAgIHZvc19hdG9taWNfc2V0X1UzMiggKHZfVTMyX3QqKSZwVExDYi0+dGxNZ210RnJtQ2xpZW50LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zUGVuZGluZ0RhdGFCdWZmLCAodl9VMzJfdClOVUxMKTsKCiAgICAgICAgLyptYW5hZ2VtZW50IGZyYW1lcyBjYW5ub3QgYmUgZGVsYXllZCovCiAgICAgICAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IFRSVUU7CgogICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KICAgICAgICB1UmVtYWluaW5nICAgICAgICAtPSAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICBwVExDYi0+dVJlc0NvdW50IC09IHVSZXNMZW47CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdWNSZXN1bHQgPSAoIHBUTENiLT51UmVzQ291bnQgPiB1UmVzTGVuICk/Vk9TX1RSVUU6Vk9TX0ZBTFNFOwogICAgICAgIGJyZWFrOyAvKiBPdXQgb2YgcmVzb3VyY2VzIG9yIHJlYWNoZWQgbWF4IGxlbiAqLwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgoIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKSAmJgogICAgICAgICAgICAgKCBXREFfVExJX01JTl9SRVNfQkFQIDw9IHBUTENiLT51UmVzQ291bnQgKSAmJgogICAgICAgICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkgICAgICAgICAgKQogICAgewogICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVzUGt0TGVuLCB1UmVzTGVuLCB1VG90YWxQa3RMZW4pOwoKICAgICAgVk9TX0FTU0VSVCh1c1BrdExlbiA8PSBXTEFOVExfTUFYX0FMTE9XRURfTEVOKTsKCiAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID4gKHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfTUYgKSApICYmCiAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkpCiAgICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgQlQtQU1QIGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyp0cnVlKi8gKTsKCiAgICAgICAgLypCQVAgZnJhbWVzIGNhbm5vdCBiZSBkZWxheWVkKi8KICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgdm9zX2F0b21pY19zZXRfVTMyKCAodl9VMzJfdCopJnBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdClOVUxMKTsKCiAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgIHVSZW1haW5pbmcgICAgICAgIC09ICAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICBwVExDYi0+dVJlc0NvdW50ICAtPSB1UmVzTGVuOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHVjUmVzdWx0ID0gdVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19NRjsKICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KICAgICAgfQogICAgfQogICAgLyogbm90ZTogdGhpcyBmZWF0dXJlIGltcGxlbWVudGVkIG9ubHkgYWZ0ZXIgV0xBTl9JTkdFVFJBVEVEX1NPQyAqLwogICAgLyogc2VhcmNoICdFQVBPTF9ISV9QUklPUklUWScgd2lsbCBzaG93IEVBUE9MIEhJX1BSSU9SSVRZIGNoYW5nZSBpbiBUTCBhbmQgV0RJCiAgICAgICBieSBkZWZhdWx0LCBFQVBPTCB3aWxsIGJlIHRyZWF0ZWQgYXMgaGlnaGVyIHByaW9yaXR5LCB3aGljaCBtZWFucwogICAgICAgdXNlIG1nbXRfcG9vbCBhbmQgRFhFX1RYX0hJIHByb3JpdHkgY2hhbm5lbC4KICAgICAgIHRoaXMgaXMgaW50cm9kdWNlZCB0byBhZGRyZXNzIEVBUE9MIGZhaWx1cmUgdW5kZXIgaGlnaCBiYWNrZ3JvdW5kIHRyYWZmaWMKICAgICAgIHdpdGggbXVsdGktY2hhbm5lbCBjb25jdXJyZW50IG1vZGUuIEJ1dCB0aGlzIGNoYW5nZSB3b3JrcyBpbiBTQ0Mgb3Igc3RhbmRhbG9uZSwgdG9vLgogICAgICAgc2VlIENSIzM4NzAwOSBhbmQgV0NOU09TLTgKICAgICAqLwogICAgZWxzZSBpZiAoKCBXREFfVExJX01JTl9SRVNfTUYgPD0gcFRMQ2ItPnVSZXNDb3VudCApJiYKICAgICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICYmCiAgICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX01HTVQgKSApCiAgICAgICAgICAgICkKICAgIHsKICAgICAgICB2b3NUZW1wQnVmID0gTlVMTDsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBDaGVjayB0byBzZWUgaWYgdGhlcmUgd2FzIGFueSBFQVBPTCBwYWNrZXQgaXMgcGVuZGluZwogICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGZvciAoIGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICAgICAgewogICAgICAgICAgIGlmICgoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSkgJiYKICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y0V4aXN0cykgJiYKICAgICAgICAgICAgICAgKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjVHhTdXNwZW5kZWQpICYmCiAgICAgICAgICAgICAgIChXTEFOVExfU1RBX0NPTk5FQ1RFRCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dGxTdGF0ZSkgJiYKICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y1BrdFBlbmRpbmcpCiAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA+PSBXTEFOX01BWF9TVEFfQ09VTlQpCiAgICAgICAgewogICAgICAgICAgIC8qIE5vIE1vcmUgdG8gU2VydmUgRXhpdCBHZXQgRnJhbWVzICovCiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIFNlcnZlIEVBUE9MIGZyYW1lIHdpdGggSElfRkxPV19NQVNLICovCiAgICAgICAgdWNTVEFJZCA9IGk7CgogICAgICAgIGZvciAoaiA9IFdMQU5UTF9NQVhfQUMgOyBqID4gMDsgai0tKQogICAgICAgIHsKICAgICAgICAgIGlmICgwICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5hdWNBQ01hc2tbai0xXSkKICAgICAgICAgIHsKICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjQ3VycmVudEFDID0gai0xOwogICAgICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDID0gai0xOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICAgICAgICB3U1RBRXZlbnQgPSBXTEFOVExfVFhfRVZFTlQ7CgogICAgICAgIHBmblNUQUZzbSA9IHRsU1RBRnNtW3BDbGllbnRTVEEtPnRsU3RhdGVdLgogICAgICAgICAgICAgICAgICAgICAgICBwZm5TVEFUYmxbd1NUQUV2ZW50XTsKCiAgICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCiAgICAgICAgewogICAgICAgICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMDsKICAgICAgICAgIHZvc1N0YXR1cyAgPSBwZm5TVEFGc20oIHB2b3NHQ3R4LCB1Y1NUQUlkLCAmdm9zVGVtcEJ1Zik7CgogICAgICAgICAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApICYmCiAgICAgICAgICAgICAgKCBOVUxMICE9IHZvc1RlbXBCdWYgKSkKICAgICAgICAgIHsKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wKCBwdm9zR0N0eCwgdm9zVGVtcEJ1Ziwgdm9zU3RhdHVzICk7CiAgICAgICAgICAgICAgIHZvc1RlbXBCdWYgPSBOVUxMOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0vKiBzdGF0dXMgc3VjY2VzcyovCiAgICAgICAgfQoKICAgICAgICBpZiAoTlVMTCAhPSB2b3NUZW1wQnVmKQogICAgICAgIHsKICAgICAgICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggdm9zVGVtcEJ1ZiwgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CgogICAgICAgICAgICBWT1NfQVNTRVJUKCB1c1BrdExlbiA8PSBXTEFOVExfTUFYX0FMTE9XRURfTEVOKTsKCiAgICAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlJlc291cmNlcyBuZWVkZWQgYnkgZnJhbWU6ICVkIiwgdVJlc0xlbikpOwoKICAgICAgICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPj0gKHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfTUYgKSApICYmCiAgICAgICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApCiAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIGRhdGEgZnJhbWUgb24gR2V0RnJhbWUiKSk7CgogICAgICAgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwgdm9zVGVtcEJ1ZiwgMSAvKnRydWUqLyApOwoKICAgICAgICAgICAgICAvKkVBUE9MIGZyYW1lIGNhbm5vdCBiZSBkZWxheWVkKi8KICAgICAgICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiA9ICBOVUxMOwoKICAgICAgICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgICAgICAgdVJlbWFpbmluZyAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQgIC09IHVSZXNMZW47CgogICAgICAgICAgICAgIC8vZm93IGNvbnRyb2wgdXBkYXRlCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dUluZ3Jlc3NfbGVuZ3RoICs9IHVSZXNMZW47CiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggPSAocENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggPj0gdVJlc0xlbikgPwogICAgICAgICAgICAgICAgKHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4IC0gdVJlc0xlbikgOiAwOwogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjRWFwb2xQa3RQZW5kaW5nID0gMDsKICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpHZXRGcmFtZXMgU1RBOiAlZCBFQVBPTFBrdFBlbmRpbmcgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dWNFYXBvbFBrdFBlbmRpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7ICAvLyBubyBFQVBPTCBmcmFtZXMgZXhpdCBHZXQgZnJhbWVzCiAgICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkdldEZyYW1lcyBTVEE6ICVkLCBubyBFQVBPTCBmcmFtZSwgY29udGludWUuIiwKICAgICAgICAgICAgICAgICAgIHVjU1RBSWQpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgIH0KCiAgICBlbHNlIGlmICgoIFdEQV9UTElfTUlOX1JFU19EQVRBIDw9IHBUTENiLT51UmVzQ291bnQgKSAmJgogICAgICAgICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkgJiYKICAgICAgICAgICAgICgoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX0JLICkgKSB8fAogICAgICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfQkUgKSApIHx8CiAgICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19WSSApICkgfHwKICAgICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX1ZPICkgKSkgKQogICAgewogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIENoZWNrIHRvIHNlZSBpZiB0aGVyZSB3YXMgYW55IHBhY2tldCBsZWZ0IGJlaGluZCBwcmV2aW91c2x5IGR1ZSB0bwogICAgICAgIHNpemUgY29uc3RyYWludHMKICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHZvc1RlbXBCdWYgPSBOVUxMOwoKICAgICAgaWYgKCBOVUxMICE9IHBUTENiLT52b3NUZW1wQnVmICkgCiAgICAgIHsKICAgICAgICB2b3NUZW1wQnVmICAgICAgICAgID0gcFRMQ2ItPnZvc1RlbXBCdWY7CiAgICAgICAgcFRMQ2ItPnZvc1RlbXBCdWYgICA9IE5VTEw7CiAgICAgICAgdWNTVEFJZCAgICAgICAgICAgICA9IHBUTENiLT51Y0NhY2hlZFNUQUlkOyAKICAgICAgICB1Y0FDICAgICAgICAgICAgICAgID0gcFRMQ2ItPnVjQ2FjaGVkQUM7CgogICAgICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNOb01vcmVEYXRhID0gMDsKICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBjYWNoZWQgZGF0YSBmcmFtZSBvbiBHZXRGcmFtZSIpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBXTEFOX1RMR2V0TmV4dFR4SWRzKCBwdm9zR0N0eCwgJnVjU1RBSWQpOwogICAgICAgIGlmICh1Y1NUQUlkID49IFdMQU5fTUFYX1NUQV9DT1VOVCkKICAgICAgICB7CiAgICAgICAgIC8qIFBhY2tldHMgc3RhcnQgY29taW5nIGluIGV2ZW4gYWZ0ZXIgaW5zbW9kIFdpdGhvdXQgKgogICAgICAgICAgICBzdGFydGluZyBIb3N0YXBkIG9yIEludGVyZmFjZSBiZWluZyB1cCAgICAgICAgICAgICoKICAgICAgICAgICAgRHVyaW5nIHdoaWNoIGNhc2VzIFNUQUlEIGlzIGludmFsZWQgYW5kIGhlbmNlIAogICAgICAgICAgICB0aGUgY2hlY2suIEhhbE1zZ19TY25hQ29tcGxldGUgVHJpZ2dlcnMgKi8KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvKiB1Y0N1cnJlbnRBQyBzaG91bGQgaGF2ZSBjb3JyZWN0IEFDIHRvIGJlIHNlcnZlZCBieSBjYWxsaW5nCiAgICAgICAgICAgV0xBTl9UTEdldE5leHRUeElkcyAqLwogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKICAgICAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICB1Y0FDID0gcENsaWVudFNUQS0+dWNDdXJyZW50QUM7CgogICAgICAgIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDE7CiAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6ICVzIGdldCBvbmUgZGF0YSBmcmFtZSwgc3RhdGlvbiBJRCAlZCAiLCBfX2Z1bmNfXywgdWNTVEFJZCkpOwogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIENoZWNrIHRvIHNlZSB0aGF0IFNUQSBpcyB2YWxpZCBhbmQgdHggaXMgbm90IHN1c3BlbmRlZAogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBpZiAoICggISBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApICYmCiAgICAgICAgICAgKCAwID09IHBDbGllbnRTVEEtPnVjVHhTdXNwZW5kZWQgKSAmJgogICAgICAgICAgICggMCA9PSBwQ2xpZW50U1RBLT5mY1N0YVR4RGlzYWJsZWQpICkKICAgICAgICB7CiAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogJXMgc3RhIGlkIHZhbGlkIGFuZCBub3Qgc3VzcGVuZGVkICIsX19mdW5jX18pKTsKICAgICAgICAgIHdTVEFFdmVudCA9IFdMQU5UTF9UWF9FVkVOVDsKCiAgICAgICAgICBwZm5TVEFGc20gPSB0bFNUQUZzbVtwQ2xpZW50U1RBLT50bFN0YXRlXS4KICAgICAgICAgICAgICAgICAgICAgICAgcGZuU1RBVGJsW3dTVEFFdmVudF07CgogICAgICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCiAgICAgICAgICB7CiAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDA7CiAgICAgICAgICAgIHZvc1N0YXR1cyAgPSBwZm5TVEFGc20oIHB2b3NHQ3R4LCB1Y1NUQUlkLCAmdm9zVGVtcEJ1Zik7CgogICAgICAgICAgICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgJiYKICAgICAgICAgICAgICAgICggTlVMTCAhPSB2b3NUZW1wQnVmICkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT5wZm5TVEFUeENvbXAoIHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyApOwogICAgICAgICAgICAgICAgIHZvc1RlbXBCdWYgPSBOVUxMOwogICAgICAgICAgICB9Lyogc3RhdHVzIHN1Y2Nlc3MqLwogICAgICAgICAgfS8qTlVMTCBmdW5jdGlvbiBzdGF0ZSovCiAgICAgICAgfS8qIHZhbGlkIFNUQSBpZCBhbmQgISBzdXNwZW5kZWQqLwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgaWYgKCAhIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkgCiAgICAgICAgICAgewogICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDpOb3QgZmV0Y2hpbmcgZnJhbWUgYmVjYXVzZSBzdXNwZW5kZWQgZm9yIHN0YSBJRCAlZCIsIAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpOwogICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0vKiBkYXRhICovCgogICAgICBpZiAoIE5VTEwgIT0gdm9zVGVtcEJ1ZiApCiAgICAgIHsKICAgICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCB2b3NUZW1wQnVmLCB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKCiAgICAgICAgVk9TX0FTU0VSVCggdXNQa3RMZW4gPD0gV0xBTlRMX01BWF9BTExPV0VEX0xFTik7CgogICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6UmVzb3VyY2VzIG5lZWRlZCBieSBmcmFtZTogJWQiLCB1UmVzTGVuKSk7CgogICAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID49ICh1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX0JBUCApICkgJiYKICAgICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApICYmCiAgICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCB1Y0FDICkgKSApCiAgICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBkYXRhIGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwgdm9zVGVtcEJ1ZiwgMSAvKnRydWUqLyApOwogICAgICAgICAgdm9zVGVtcEJ1ZiA9ICBOVUxMOwoKICAgICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KICAgICAgICAgIHVSZW1haW5pbmcgICAgICAgIC09ICh1c1BrdExlbiArIFdEQV9EWEVfSEVBREVSX1NJWkUpOwoKICAgICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAgLT0gdVJlc0xlbjsKCiAgICAgICAgICAvL2ZvdyBjb250cm9sIHVwZGF0ZQogICAgICAgICAgcENsaWVudFNUQS0+dUluZ3Jlc3NfbGVuZ3RoICs9IHVSZXNMZW47CiAgICAgICAgICBwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCA9IChwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCA+PSB1UmVzTGVuKSA/CiAgICAgICAgICAgIChwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCAtIHVSZXNMZW4pIDogMDsKCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAvKiBTdG9yZSB0aGlzIGZvciBsYXRlciB0eCAtIGFscmVhZHkgZmV0Y2hlZCBmcm9tIEhERCAqLwogICAgICAgICAgcFRMQ2ItPnZvc1RlbXBCdWYgPSB2b3NUZW1wQnVmOwogICAgICAgICAgcFRMQ2ItPnVjQ2FjaGVkU1RBSWQgPSB1Y1NUQUlkOwogICAgICAgICAgcFRMQ2ItPnVjQ2FjaGVkQUMgICAgPSB1Y0FDOwogICAgICAgICAgdWNSZXN1bHQgPSB1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX0JBUDsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJtaW4gJWQgcmVzIHJlcXVpcmVkIGJ5IFRMLiIsIHVjUmVzdWx0ICkpOwogICAgICAgICAgYnJlYWs7IC8qIE91dCBvZiByZXNvdXJjZXMgb3IgcmVhY2hlZCBtYXggbGVuICovCiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldICYmIChwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNFeGlzdHMpICYmCiAgICAgICAgICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNQa3RQZW5kaW5nKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIGlzIHN0YXRpb24gdG8gYmUgU2VydmVkICovCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKGkgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKQogICAgICAgICAgIHsKICAgICAgICAgICAgICAvKiBObyBNb3JlIHRvIFNlcnZlIEV4aXQgR2V0IEZyYW1lcyAqLwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgIC8qIE1vcmUgdG8gYmUgU2VydmVkICovCiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgfQogICAgICAgIH0gCiAgICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJldHVybmluZyBmcm9tIEdldEZyYW1lOiByZXNvdXJjZXMgPSAlZCBzdXNwZW5kZWQgPSAlZCIsCiAgICAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCwgcFRMQ2ItPnVjVHhTdXNwZW5kZWQpKTsKICAgICAgLyogVEwgaXMgc3RhcnZpbmcgZXZlbiB3aGVuIERYRSBpcyBub3QgaW4gbG93IHJlc291cmNlIGNvbmRpdGlvbiAKICAgICAgICAgUmV0dXJuIG1pbiByZXNvdXJjZSBudW1iZXIgcmVxdWlyZWQgYW5kIExldCBEWEUgZGVjZWlkZSB3aGF0IHRvIGRvICovCiAgICAgIGlmKCggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICYmIAogICAgICAgICAoKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19CSyApICkgfHwgCiAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX0JFICkgKSB8fAogICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19WSSApICkgfHwgCiAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX1ZPICkgKSkpCiAgICAgIHsKICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICJXTEFOIFRMOlJldHVybmluZyBmcm9tIEdldEZyYW1lOiByZXNvdXJjZXMgPSAlZCIsCiAgICAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCkpOwogICAgICAgICB1Y1Jlc3VsdCA9IFdEQV9UTElfTUlOX1JFU19EQVRBOwogICAgICB9CiAgICAgICBicmVhazsgLypvdXQgb2YgbWluIGRhdGEgcmVzb3VyY2VzKi8KICAgIH0KCiAgICBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50Kys7CiAgICAvKiBNb3ZlIGRhdGEgYnVmZmVyIHVwIG9uZSBwYWNrZXQgKi8KICAgIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc0RhdGFCdWZmLCAmdm9zRGF0YUJ1ZmYsIDAvKmZhbHNlKi8gKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUGFja2V0IGNoYWluIHN0YXJ0cyBhdCByb290ICsgMQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NSb290LCAmdm9zRGF0YUJ1ZmYsIDEvKnRydWUqLyApOwoKICAqcHZvc0RhdGFCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgVk9TX0FTU0VSVCggcGJVcmdlbnQgKTsKICAqcGJVcmdlbnQgICAgID0gcFRMQ2ItPmJVcmdlbnQ7CiAgcmV0dXJuIHVjUmVzdWx0Owp9LyogV0xBTlRMX0dldEZyYW1lcyAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4Q29tcAoKICBERVNDUklQVElPTgogICAgSXQgaXMgYmVpbmcgY2FsbGVkIGJ5IEJBTCB1cG9uIGFzeW5jaHJvbm91cyBub3RpZmljYXRpb24gb2YgdGhlIHBhY2tldAogICAgb3IgcGFja2V0cyAgYmVpbmcgc2VudCBvdmVyIHRoZSBidXMuCgogIERFUEVOREVOQ0lFUwogICAgVHggY29tcGxldGUgY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGEgcHJldmlvdXMgdHJhbnNtaXQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBidWZmZXIgZm9yIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCByZXBvcnQgaXMgYmVpbmcgbWFkZSwgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZQogICAgICAgICAgICAgICAgICAgIHBhY2tldCB0aGV5IHdpbGwgYmUgY2hhaW5lZCB1c2luZyB2T1NTIGJ1ZmZlcnMuCiAgICB3VHhTdGF0dXM6ICAgICAgdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0LCBzZWUgYWJvdmUgY2hhcHRlcgogICAgICAgICAgICAgICAgICAgIG9uIEhERCBpbnRlcmFjdGlvbiBmb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeENvbXAKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QgICAgICAqcEZyYW1lRGF0YUJ1ZmYsCiAgVk9TX1NUQVRVUyAgICAgIHdUeFN0YXR1cwopCnsKICB2b3NfcGt0X3QqICAgICAgICAgICB2b3NEYXRhQnVmZiA9ICh2b3NfcGt0X3QqKXBGcmFtZURhdGFCdWZmOwogIFdMQU5UTF9DYlR5cGUqICAgICAgIHBUTENiICAgICA9IE5VTEw7CiAgV0xBTlRMX1R4Q29tcENCVHlwZSAgcGZuVHhDb21wID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgdm9zX3BrdF90KiAgICAgICAgICAgdm9zVGVtcFR4ID0gTlVMTDsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXh0cmFuZW91cyBOVUxMIGRhdGEgcG9pbnRlciBvbiBXTEFOVExfVHhDb21wIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1R4Q29tcCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICB3aGlsZSAoKDAgPCBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50KSAmJgogICAgICAgICAoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMgKSAmJgogICAgICAgICAoIE5VTEwgIT0gIHZvc0RhdGFCdWZmKSkKICB7CiAgICB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCAgdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcGZuVHhDb21wKTsKCiAgICAvKml0IHNob3VsZCBuZXZlciBiZSBOVUxMIC0gZGVmYXVsdCBoYW5kbGVyIHNob3VsZCBiZSByZWdpc3RlcmVkIGlmIG5vbmUqLwogICAgaWYgKCBOVUxMID09IHBmblR4Q29tcCApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOk5VTEwgcG9pbnRlciB0byBUeCBDb21wbGV0ZSBvbiBXTEFOVExfVHhDb21wIikpOwogICAgICBWT1NfQVNTRVJUKDApOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbGxpbmcgVHggY29tcGxldGUgZm9yIHBrdCAlcCBpbiBmdW5jdGlvbiAlcCIsCiAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmLCBwZm5UeENvbXApKTsKCiAgICB2b3NUZW1wVHggPSB2b3NEYXRhQnVmZjsKICAgIHZvc1N0YXR1cyA9IHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8pOwoKICAgIHBmblR4Q29tcCggcHZvc0dDdHgsIHZvc1RlbXBUeCwgd1R4U3RhdHVzICk7CgogICAgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudC0tOwogIH0KCiAKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDogY3VycmVudCBUTCB2YWx1ZXMgYXJlOiByZXNvdXJjZXMgPSAlZCAiCiAgICAgICAgICAgICJwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50ID0gJWQiLAogICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQsIHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9UeENvbXAgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NhY2hlU1RBRnJhbWUKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGZvciBjYWNoaW5nIGluY29taW5nIGRhdGEgZnJhbWVzIHRoYXQgZG8gCiAgICBub3QgaGF2ZSBhIHJlZ2lzdGVyZWQgc3RhdGlvbiB5ZXQuIAoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgSW4gb3JkZXIgdG8gYmVuZWZpdCBmcm9tIHRoc2kgY2FjaGluZywgdGhlIGNvbXBvbmVudHMgbXVzdCBlbnN1cmUgdGhhdAogICAgdGhleSB3aWxsIG9ubHkgcmVnaXN0ZXIgd2l0aCBUTCBhdCB0aGUgbW9tZW50IHdoZW4gdGhleSBhcmUgZnVsbHkgc2V0dXAKICAgIGFuZCByZWFkeSB0byByZWNlaXZlIGluY29taW5nIGRhdGEgCiAgIAogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgCiAgICBwVExDYjogICAgICAgICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgICB1Y1NUQUlkOiAgICAgICAgICAgICAgICBzdGF0aW9uIGlkCiAgICB2b3NUZW1wQnVmZjogICAgICAgICAgICB0aGUgZGF0YSBwYWNrZXQKICAgIHVEUFVTaWc6ICAgICAgICAgICAgICAgIERQVSBzaWduYXR1cmUgb2YgdGhlIGluY29taW5nIHBhY2tldAogICAgYkJjYXN0OiAgICAgICAgICAgICAgICAgdHJ1ZSBpZiBwYWNrZXQgaGFkIHRoZSBNQy9CQyBiaXQgc2V0IAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCBvciBTVEEgSWQgaW52YWxpZCA7IGFjY2VzcwogICAgICAgICAgICAgICAgICAgICAgICAgIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgVk9TX1NUQVRVUwpXTEFOVExfQ2FjaGVTVEFGcmFtZQooCiAgV0xBTlRMX0NiVHlwZSogICAgcFRMQ2IsCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqICAgICAgICB2b3NUZW1wQnVmZiwKICB2X1UzMl90ICAgICAgICAgICB1RFBVU2lnLAogIHZfVThfdCAgICAgICAgICAgIGJCY2FzdCwKICB2X1U4X3QgICAgICAgICAgICB1Y0ZybVR5cGUKKQp7CiAgdl9VOF90ICAgIHVjVWNhc3RTaWc7CiAgdl9VOF90ICAgIHVjQmNhc3RTaWc7CiAgdl9CT09MX3QgIGJPbGRTVEFQa3Q7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgU2FuaXR5IGNoZWNrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8ICggTlVMTCA9PSB2b3NUZW1wQnVmZiApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBJbnZhbGlkIGlucHV0IHBvaW50ZXIgb24gV0xBTlRMX0NhY2hlU1RBRnJhbWUgVEwgJXAiCiAgICAgICAgICAgICAgICIgUGFja2V0ICVwIiwgcFRMQ2IsIHZvc1RlbXBCdWZmICkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ2FjaGVTVEFGcmFtZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpBdHRlbXB0aW5nIHRvIGNhY2hlIHBrdCBmb3IgU1RBICVkLCBCRCBEUFUgU2lnOiAlZCB3aXRoIHNpZyBVQzogJWQsIEJDOiAlZCIsIAogICAgICAgICAgICAgdWNTVEFJZCwgdURQVVNpZywKICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcsCiAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnKSk7CgogIGlmKFdMQU5UTF9JU19DVFJMX0ZSQU1FKHVjRnJtVHlwZSkpCiAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyBuZWVkIHRvIGNhY2hlIENUUkwgZnJhbWUuIERyb3BwaW5nIikpOwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOyAKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhlIHBhY2tldCB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gY2FjaGUgYmVsb25ncyB0byB0aGUgb2xkCiAgICByZWdpc3RlcmVkIHN0YXRpb24gKGlmIGFueSkgb3IgdGhlIG5ldyAocG90ZW50aWFsbHkpdXBjb21pbmcgc3RhdGlvbgogICAgCiAgICAtIElmIHRoZSBTVEEgd2l0aCB0aGlzIElkIHdhcyBuZXZlciByZWdpc3RlcmVkIHdpdGggVEwgLSB0aGUgc2lnbmF0dXJlCiAgICB3aWxsIGJlIGludmFsaWQ7CiAgICAtIElmIHRoZSBTVEEgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBUTCB3aWxsIGhhdmUgY2FjaGVkIHRoZSBmb3JtZXIKICAgIHNldCBvZiBEUFUgc2lnbmF0dXJlcwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggYkJjYXN0ICkKICB7CiAgICB1Y0JjYXN0U2lnID0gKHZfVThfdCl1RFBVU2lnOwogICAgYk9sZFNUQVBrdCA9ICgoIFdMQU5fVExfSU5WQUxJRF9CX1NJRyAhPSAKICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZyApICYmCiAgICAgICggdWNCY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICkpOwogIH0KICBlbHNlCiAgewogICAgdWNVY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKICAgIGJPbGRTVEFQa3QgPSAoKCBXTEFOX1RMX0lOVkFMSURfVV9TSUcgIT0gCiAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyApICYmCiAgICAgICAgKCB1Y1VjYXN0U2lnID09IHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcgKSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSWYgdGhlIHZhbHVlIG9mIHRoZSBEUFUgU0lHIG1hdGNoZXMgdGhlIG9sZCwgdGhpcyBwYWNrZXQgd2lsbCBub3QKICAgIGJlIGNhY2hlZCBhcyBpdCBiZWxvbmdlZCB0byB0aGUgZm9ybWVyIGFzc29jaWF0aW9uCiAgICBJbiBjYXNlIHRoZSBTSUcgZG9lcyBub3QgbWF0Y2ggLSB0aGlzIGlzIGEgcGFja2V0IGZvciBhIHBvdGVudGlhbGx5IG5ldwogICAgYXNzb2NpYXRlZCBzdGF0aW9uIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggYk9sZFNUQVBrdCB8fCBiQmNhc3QgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkRhdGEgcGFja2V0IG1hdGNoZXMgb2xkIHNpZyBmb3Igc2lnIERQVTogJWQgVUM6ICVkLCAiCiAgICAgICAgICAgICAgICJCQzogJWQgLSBkcm9wcGluZyIsIAogICAgICAgICAgICAgICB1RFBVU2lnLCAKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZywKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZykpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgfQogIGVsc2UKICB7CiAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgKQogICAgewogICAgICAvKnRoaXMgaXMgdGhlIGZpcnN0IGZyYW1lIHRoYXQgd2UgYXJlIGNhY2hpbmcgKi8KICAgICAgcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgPSB2b3NUZW1wQnVmZjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLyp0aGlzIGlzIGEgc3Vic2VxdWVudCBmcmFtZSB0aGF0IHdlIGFyZSBjYWNoaW5nOiBjaGFpbiB0byB0aGUgZW5kICovCiAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KHBDbGllbnRTVEEtPnZvc0VuZENhY2hlZEZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZiwgVk9TX1RSVUUpOwogICAgfQogICAgcENsaWVudFNUQS0+dm9zRW5kQ2FjaGVkRnJhbWUgPSB2b3NUZW1wQnVmZjsKICB9LyplbHNlIG5ldyBwYWNrZXQqLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOyAKfS8qV0xBTlRMX0NhY2hlU1RBRnJhbWUqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfRmx1c2hDYWNoZWRGcmFtZXMKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBUTCB0byBmbHVzaCB0aGUgc3RhdGlvbiBjYWNoZQoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgCiAgUEFSQU1FVEVSUwoKICAgIElOCgogICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2FjaGVkIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQsCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKICBOT1RFCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmUtaW5pdGlhbGl6ZSB2b3NEYXRhQnVmZiB0byBOVUxMLiBJdCdzIGNhbGxlcidzIAogICAgcmVzcG9uc2liaWxpdHkgdG8gZG8gc28sIGlmIHJlcXVpcmVkLCBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwuCiAgICBCZWNhdXNlIG9mIHRoaXMgcmVzdHJpY3Rpb24sIHdlIGRlY2lkZSB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdG8gc3RhdGljCiAgICBzbyB0aGF0IHVwcGVyIGxheWVyIGRvZXNuJ3QgbmVlZCB0byBiZSBhd2FyZSBvZiB0aGlzIHJlc3RyaWN0aW9uLiAKICAgIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kc3RhdGljIFZPU19TVEFUVVMKV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzCigKICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYKKQp7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXR1cm4gdGhlIGVudGlyZSBjaGFpbiB0byB2b3MgaWYgdGhlcmUgYXJlIGluZGVlZCBjYWNoZSBmcmFtZXMgCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMICE9IHZvc0RhdGFCdWZmICkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsgIAp9LypXTEFOVExfRmx1c2hDYWNoZWRGcmFtZXMqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcwoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZWl0aGVyIGZvcndhcmRpbmcgY2FjaGVkIGRhdGEgdG8gdGhlIHN0YXRpb24gYWZ0ZXIKICAgIHRoZSBzdGF0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQsIG9yIGZsdXNoaW5nIGNhY2hlZCBkYXRhIGlmIHRoZSBzdGF0aW9uIGhhcyBub3QgCiAgICBiZWVuIHJlZ2lzdGVyZWQuIAogICAgIAoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAKICBQQVJBTUVURVJTCgogICAgSU4KICAgIAogICAgcFRMQ2I6ICAgICAgICAgICAgICAgICAgVEwgY29udHJvbCBibG9jawogICAgdWNTVEFJZDogICAgICAgICAgICAgICAgc3RhdGlvbiBpZAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKICAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZS1pbml0aWFsaXplIHZvc0RhdGFCdWZmIHRvIE5VTEwuIEl0J3MgY2FsbGVyJ3MgCiAgICByZXNwb25zaWJpbGl0eSB0byBkbyBzbywgaWYgcmVxdWlyZWQsIGFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbC4KICAgIEJlY2F1c2Ugb2YgdGhpcyByZXN0cmljdGlvbiwgd2UgZGVjaWRlIHRvIG1ha2UgdGhpcyBmdW5jdGlvbiB0byBzdGF0aWMKICAgIHNvIHRoYXQgdXBwZXIgbGF5ZXIgZG9lc24ndCBuZWVkIHRvIGJlIGF3YXJlIG9mIHRoaXMgcmVzdHJpY3Rpb24uIAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTCldMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzCigKICB2b2lkKiAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgICAgIHVjVWNhc3RTaWcsCiAgdl9VOF90ICAgICAgICAgICAgdWNCY2FzdFNpZwopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgU2FuaXR5IGNoZWNrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDogSW52YWxpZCBpbnB1dCBwb2ludGVyIG9uIFdMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzIFRMICVwIiwKICAgICAgICAgcFRMQ2IgKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8vV0xBTl9UTF9MT0NLX1NUQV9DQUNIRShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSk7IAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIENoZWNrIGlmIHN0YXRpb24gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIG1lYW4gd2hpbGUKICAgICBpZiBub3QgcmVnaXN0ZXJlZCwgZmx1c2ggY2FjaGVkIGZyYW1lcy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgIldMQU4gVEw6U3RhdGlvbiBoYXMgYmVlbiBkZWxldGVkIGZvciBTVEEgJWQgLSBmbHVzaGluZyBjYWNoZSIsIHVjU1RBSWQpKTsKICAgIFdMQU5UTF9GbHVzaENhY2hlZEZyYW1lcyhwQ2xpZW50U1RBLT52b3NCZWdDYWNoZWRGcmFtZSk7CiAgICBnb3RvIGRvbmU7IAogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZvcndhcmRpbmcgY2FjaGUgZnJhbWVzIHJlY2VpdmVkIHdoaWxlIHRoZSBzdGF0aW9uIHdhcyBpbiB0aGUgcHJvY2VzcyAgIAogICAgb2YgYmVpbmcgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZXN0IG9mIHRoZSBTVyBjb21wb25lbnRzICAgCgogICAgQWNjZXNzIHRvIHRoZSBjYWNoZSBtdXN0IGJlIGxvY2tlZDsgc2ltaWxhcmx5IHVwZGF0aW5nIHRoZSBzaWduYXR1cmUgYW5kICAgCiAgICB0aGUgZXhpc3RlbmNlIGZsYWcgbXVzdCBiZSBzeW5jaHJvbml6ZWQgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgYXJlIGNoZWNrZWQgICAKICAgIGR1cmluZyBjYWNoZWQgIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICJXTEFOIFRMOlByZXBhcmluZyB0byBmd2QgcGFja2V0cyBmb3IgU1RBICVkIiwgdWNTVEFJZCkpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIHRoZSBuZXcgc2lnbmF0dXJlIHZhbHVlcwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyAgPSB1Y1VjYXN0U2lnOwogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcgID0gdWNCY2FzdFNpZzsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICJXTEFOIFRMOkZ3ZC1pbmcgcGFja2V0cyBmb3IgU1RBICVkIFVDICVkIEJDICVkIiwKICAgICAgIHVjU1RBSWQsIHVjVWNhc3RTaWcsIHVjQmNhc3RTaWcpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKICAgICBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgY2FjaGVkIGRhdGEgdG8gZm9yd2FyZCAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogIGlmICggTlVMTCAhPSBwQ2xpZW50U1RBLT52b3NCZWdDYWNoZWRGcmFtZSApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6IEZ3ZC1pbmcgQ2FjaGVkIHBhY2tldHMgZm9yIHN0YXRpb24gJWQiLCB1Y1NUQUlkICkpOwoKICAgIFdMQU5UTF9SeENhY2hlZEZyYW1lcyggcFRMQ2IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUpOwogIH0KICBlbHNlCiAgewogICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBOTyBjYWNoZWQgcGFja2V0cyBmb3Igc3RhdGlvbiAlZCIsIHVjU1RBSWQgKSk7CiAgfQoKZG9uZToKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAogICBDbGVhciB0aGUgc3RhdGlvbiBjYWNoZSAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgPSBOVUxMOwogIHBDbGllbnRTVEEtPnZvc0VuZENhY2hlZEZyYW1lID0gTlVMTDsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBZnRlciBhbGwgdGhlIGluaXQgaXMgY29tcGxldGUgd2UgY2FuIG1hcmsgdGhlIGV4aXN0YW5jZSBmbGFnIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+dWNSeEJsb2NrZWQgPSAwOwoKICAvL1dMQU5fVExfVU5MT0NLX1NUQV9DQUNIRShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSk7IAogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7IAoKfS8qV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMqLwoKCiNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0lzSUFQUEZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBkZXRlY3RpbmcgaW5jb21pbmcgQ0NYIElBUFAgZnJhbWVzCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIAogICAgcHZCREhlYWRlcjogICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCiAgICB2b3NUZW1wQnVmZjogICAgICAgICAgICB0aGUgZGF0YSBwYWNrZXQKCiAgICBJTi9PVVQKICAgIHBGaXJzdERhdGFQa3RBcnJpdmVkOiAgIHN0YXRpYyBmcm9tIGNhbGxlciBmdW5jdGlvbjsgdXNlZCBmb3IgcnNzaSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGF0aW9uCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19UUlVFOiAgIEl0IGlzIGEgSUFQUCBmcmFtZQogICAgVk9TX0ZBTFNFOiAgSXQgaXMgTk9UIElBUFAgZnJhbWUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9CT09MX3QKV0xBTlRMX0lzSUFQUEZyYW1lCigKICB2X1BWT0lEX3QgICAgICAgICBwdkJESGVhZGVyLAogIHZvc19wa3RfdCogICAgICAgIHZvc1RlbXBCdWZmCikKewogIHZfVTE2X3QgICAgICAgICAgICAgdXNNUERVRE9mZnNldDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjT2Zmc2V0OwogIHZfVThfdCAgICAgICAgICAgICAgdWNTbmFwSGRyW1dMQU5UTF9MTENfU05BUF9TSVpFXTsKICB2X1NJWkVfdCAgICAgICAgICAgIHVzU25hcEhkclNpemUgPSBXTEFOVExfTExDX1NOQVBfU0laRTsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBPVUkgZmllbGQgaXMgcHJlc2VudC4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFZPU19GQUxTRSA9PSBXREFfSVNfUlhfTExDX1BSRVNFTlQocHZCREhlYWRlcikgKQogIHsKICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkxMQyBoZWFkZXIgcmVtb3ZlZCwgY2Fubm90IGRldGVybWluZSBCVC1BTVAgdHlwZSAtIgogICAgICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICByZXR1cm4gVk9TX1RSVUU7CiAgfQogIHVzTVBEVURPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChwdkJESGVhZGVyKTsKICB1Y09mZnNldCAgICAgID0gKHZfVThfdCl1c01QRFVET2Zmc2V0ICsgV0xBTlRMX0xMQ19TTkFQX09GRlNFVDsKCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc1RlbXBCdWZmLCB1Y09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXVjU25hcEhkciwgJnVzU25hcEhkclNpemUpOwoKICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKSkgCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGV4dHJhY3QgU25hcCBIZHIgb2YgZGF0YSAgcGFja2V0IC0iCiAgICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgcmV0dXJuIFZPU19GQUxTRTsKICB9CgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIHRoaXMgaXMgSUFQUCBmcmFtZSBieSBtYXRjaGluZyBBaXJvbmV0IFNuYXAgaGRyLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIC8vIENvbXBhcmUgcmV0dXJucyAxIGlmIHZhbHVlcyBhcmUgc2FtZSBhbmQgMAogIC8vIGlmIG5vdCB0aGUgc2FtZS4KICBpZiAoKCBXTEFOVExfTExDX1NOQVBfU0laRSAhPSB1c1NuYXBIZHJTaXplICkgfHwKICAgICAoIDAgPT0gdm9zX21lbV9jb21wYXJlKHVjU25hcEhkciwgKHZfUFZPSURfdClXTEFOVExfQUlST05FVF9TTkFQX0hFQURFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9MTENfU05BUF9TSVpFICkgKSkKICB7CiAgICByZXR1cm4gVk9TX0ZBTFNFOwogIH0KCiAgcmV0dXJuIFZPU19UUlVFOwoKfQojZW5kaWYgLy9GRUFUVVJFX1dMQU5fQ0NYCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Qcm9jZXNzQkFQRnJhbWUKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHByb2Nlc3NpbmcgaW5jb21pbmcgQlQtQU1QIGZyYW1lcwoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgQm90aGUgdGhlIEJULUFNUCBzdGF0aW9uIGFuZCB0aGUgQkFQIEN0cmwgcGF0aCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IAogICAgcmVnaXN0ZXJlZCB3aXRoIFRMLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIAogICAgcHZCREhlYWRlcjogICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCiAgICB2b3NUZW1wQnVmZjogICAgICAgICAgICB0aGUgZGF0YSBwYWNrZXQKICAgIHBUTENiOiAgICAgICAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHVjU1RBSWQ6ICAgICAgICAgICAgICAgIHN0YXRpb24gaWQKCiAgICBJTi9PVVQKICAgIHBGaXJzdERhdGFQa3RBcnJpdmVkOiAgIHN0YXRpYyBmcm9tIGNhbGxlciBmdW5jdGlvbjsgdXNlZCBmb3IgcnNzaSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGF0aW9uCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Qcm9jZXNzQkFQRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICAgIHB2QkRIZWFkZXIsCiAgdm9zX3BrdF90KiAgICAgICAgdm9zVGVtcEJ1ZmYsCiAgV0xBTlRMX0NiVHlwZSogICAgcFRMQ2IsCiAgdl9VOF90KiAgICAgICAgICAgcEZpcnN0RGF0YVBrdEFycml2ZWQsCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZAopCnsKICB2X1UxNl90ICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjT1VJW1dMQU5UTF9MTENfT1VJX1NJWkVdOwogIHZfU0laRV90ICAgICAgICAgICAgdXNPVUlTaXplID0gV0xBTlRMX0xMQ19PVUlfU0laRTsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICB2X1UxNl90ICAgICAgICAgICAgIHVzVHlwZTsKICB2X1NJWkVfdCAgICAgICAgICAgIHVzVHlwZUxlbiA9IHNpemVvZih1c1R5cGUpOwogIHZfVThfdCAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjTVBEVUhMZW4gPSAwOwogIHZfVTE2X3QgICAgICAgICAgICAgdXNBY3R1YWxITGVuID0gMDsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IE9VSSBhbmQgdHlwZSBmcm9tIExMQyBhbmQgdmFsaWRhdGU7IGlmIG5vbi1kYXRhIHNlbmQgdG8gQkFQCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBWT1NfRkFMU0UgPT0gV0RBX0lTX1JYX0xMQ19QUkVTRU5UKHB2QkRIZWFkZXIpICkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICJXTEFOIFRMOkxMQyBoZWFkZXIgcmVtb3ZlZCwgY2Fubm90IGRldGVybWluZSBCVC1BTVAgdHlwZSAtIgogICAgICAgICAgICAgICJkcm9wcGluZyBwa3QiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgIHJldHVybiBWT1NfVFJVRTsgCiAgfQoKICB1c01QRFVET2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfREFUQV9PRkZTRVQocHZCREhlYWRlcik7CiAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQocHZCREhlYWRlcik7CiAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4ocHZCREhlYWRlcik7CiAgdWNPZmZzZXQgICAgICA9ICh2X1U4X3QpdXNNUERVRE9mZnNldCArIFdMQU5UTF9MTENfT1VJX09GRlNFVDsKCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc1RlbXBCdWZmLCB1Y09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXVjT1VJLCAmdXNPVUlTaXplKTsKCiNpZiAwCiAgLy8gQ29tcGFyZSByZXR1cm5zIDEgaWYgdmFsdWVzIGFyZSBzYW1lIGFuZCAwCiAgLy8gaWYgbm90IHRoZSBzYW1lLgogIGlmICgoIFdMQU5UTF9MTENfT1VJX1NJWkUgIT0gdXNPVUlTaXplICkgfHwKICAgICAoIDAgPT0gdm9zX21lbV9jb21wYXJlKHVjT1VJLCAodl9QVk9JRF90KVdMQU5UTF9CVF9BTVBfT1VJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0xMQ19PVUlfU0laRSApICkpCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAiTExDIGhlYWRlciBwb2ludHMgdG8gZGlmZiBPVUkgaW4gQlQtQU1QIHN0YXRpb24gLSIKICAgICAgICAgICAgICAgICJkcm9wcGluZyBwa3QiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgIHJldHVybiBWT1NfVFJVRTsKICB9CiNlbmRpZgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IExMQyBPVUkgYW5kIGVuc3VyZSB0aGF0IHRoaXMgaXMgaW5kZWVkIGEgQlQtQU1QIGZyYW1lCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc1RlbXBCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y09mZnNldCArIFdMQU5UTF9MTENfT1VJX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmdXNUeXBlLCAmdXNUeXBlTGVuKTsKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgfHwKICAgICAgKCBzaXplb2YodXNUeXBlKSAhPSB1c1R5cGVMZW4gKSkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZXh0cmFjdCB0eXBlIG9uIGluY29taW5nIEJBUCBwYWNrZXQgLSIKICAgICAgICAgICAgICAgICJkcm9wcGluZyBwa3QiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgIHJldHVybiBWT1NfVFJVRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aGlzIGlzIEJULUFNUCBkYXRhIG9yIGN0cmwgcGFja2V0KFJTTiwgTGlua1N2aXNpb24sIEFjdGl2aXR5UikKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1c1R5cGUgPSB2b3NfYmUxNl90b19jcHUodXNUeXBlKTsKCiAgaWYgKFdMQU5UTF9CQVBfSVNfTk9OX0RBVEFfUEtUX1RZUEUodXNUeXBlKSkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiV0xBTiBUTDpOb24tZGF0YSBwYWNrZXQgcmVjZWl2ZWQgb3ZlciBCVC1BTVAgbGluazogJWQsID0+IEJBUCIsCiAgICAgICAgICAgICAgIHVzVHlwZSkpOwoKICAgIC8qRmxhdHRlbiBwYWNrZXQgYXMgQkFQIGV4cGVjdHMgdG8gYmUgYWJsZSB0byBwZWVrKi8KICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19wa3RfZmxhdHRlbl9yeF9wa3QoJnZvc1RlbXBCdWZmKSkKICAgIHsKICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGZsYXR0ZW4gQlQtQU1QIHBhY2tldCAtIGRyb3BwaW5nIikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICByZXR1cm4gVk9TX1RSVUU7CiAgICB9CgogICAgLyogU2VuZCBwYWNrZXQgdG8gQkFQIGNsaWVudCovCgogICAgVk9TX0FTU0VSVChwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCAhPSBOVUxMKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfVHJpbVJ4UGFja2V0SW5mbyggdm9zVGVtcEJ1ZmYgKSApCiAgICB7CiAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBjb3JydXB0ZWQgLSBkcm9wcGluZyBwYWNrZXQiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHJldHVybiBWT1NfVFJVRTsKICAgIH0KCiAgICBpZiAoIDAgPT0gV0RBX0dFVF9SWF9GVF9ET05FKHB2QkRIZWFkZXIpICkKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICJOb24tZGF0YSBwYWNrZXQgcmVjZWl2ZWQgb3ZlciBCVC1BTVAgbGluazogU2VuZGluZyBpdCBmb3IgIgogICAgICAgICAgImZyYW1lIFRyYW5zbGF0aW9uIikpOwoKICAgICAgaWYgKHVzTVBEVURPZmZzZXQgPiB1Y01QRFVIT2Zmc2V0KQogICAgICB7CiAgICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgICAgIH0KCiAgICAgIC8qIHNvZnR3YXJlIGZyYW1lIHRyYW5zbGF0aW9uIGZvciBCVEFNUCBXRFMuKi8KICAgICAgV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyKCB2b3NUZW1wQnVmZiwgJnZvc1N0YXR1cywgdXNBY3R1YWxITGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sIHBUTENiLHVjU1RBSWQgKTsKICAgICAgCiAgICB9CiAgICBpZiAocFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUngpCiAgICAgICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUngoIHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCxwVExDYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTlRMX0JBUEZyYW1lRW51bVR5cGUpdXNUeXBlICk7CgogICAgcmV0dXJuIFZPU19UUlVFOwogIH0KICBlbHNlCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgIldMQU4gVEw6IEJBUCBEQVRBIHBhY2tldCByZWNlaXZlZCBvdmVyIEJULUFNUCBsaW5rOiAlZCwgPT4gQkFQIiwKICAgICAgICAgICAgICAgdXNUeXBlKSk7CiAgIC8qISEhRklYIE1FISEqLwogI2lmIDAKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBGb3IgZGF0YSBwYWNrZXQgY29sbGVjdCBwaHkgc3RhdHMgUlNTSSBhbmQgTGluayBRdWFsaXR5CiAgICAgQ2FsY3VsYXRlIHRoZSBSU1NJIGF2ZXJhZ2UgYW5kIHNhdmUgaXQuIENvbnRpbnVvdXMgYXZlcmFnZSBpcyBkb25lLgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKCAqcEZpcnN0RGF0YVBrdEFycml2ZWQgPT0gMCkKICAgIHsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucnNzaUF2ZyA9CiAgICAgICAgIFdMQU5IQUxfR0VUX1JTU0lfQVZFUkFHRSggcHZCREhlYWRlciApOwogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51TGlua1F1YWxpdHlBdmcgPSAKICAgICAgICBXTEFOSEFMX1JYX0JEX0dFVF9TTlIoIHB2QkRIZWFkZXIgKTsKCiAgICAgIC8vIFJjdmQgMXN0IHBrdCwgc3RhcnQgYXZlcmFnZSBmcm9tIG5leHQgdGltZQogICAgICAqcEZpcnN0RGF0YVBrdEFycml2ZWQgPSAxOwogICAgfQogICAgZWxzZQogICAgewogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5yc3NpQXZnID0KICAgICAgICAgIChXTEFOSEFMX0dFVF9SU1NJX0FWRVJBR0UoIHB2QkRIZWFkZXIgKSArIAogICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnJzc2lBdmcpLzI7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMaW5rUXVhbGl0eUF2ZyA9CiAgICAgICAgICAoV0xBTkhBTF9SWF9CRF9HRVRfU05SKCBwdkJESGVhZGVyICkgKyAgCiAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUxpbmtRdWFsaXR5QXZnKS8yOwogICAgfS8qRWxzZSwgZmlyc3QgZGF0YSBwYWNrZXQqLwogI2VuZGlmCiAgfS8qQlQtQU1QIGRhdGEgcGFja2V0Ki8KCiAgcmV0dXJuIFZPU19GQUxTRTsgCn0vKldMQU5UTF9Qcm9jZXNzQkFQRnJhbWUqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1Byb2Nlc3NGQ0ZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIGluY29taW5nIEZsb3cgQ29udHJvbCBmcmFtZXMuIEVuYWJsZQogICAgb3IgZGlzYWJsZSBMV00gbW9kZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24uCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICBGVyBzZW5kcyB1cCBzcGVjaWFsIGZsb3cgY29udHJvbCBmcmFtZS4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eCAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dAogICAgcHZCREhlYWRlcjogICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCiAgICBwVExDYjogICAgICAgICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgICBwdkJESGVhZGVyICAgICAgICAgICAgICBwb2ludGVyIHRvIEJEIGhlYWRlci4KCiAgICBJTi9PVVQKICAgIHBGaXJzdERhdGFQa3RBcnJpdmVkOiAgIHN0YXRpYyBmcm9tIGNhbGxlciBmdW5jdGlvbjsgdXNlZCBmb3IgcnNzaSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGF0aW9uCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBmcmFtZSBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKICAgIFRoZSBpbmdyZXNzIGFuZCBlZ3Jlc3Mgb2YgZWFjaCBzdGF0aW9uIHdpbGwgYmUgdXBkYXRlZC4gSWYgbmVlZGVkLCBMV00gbW9kZSB3aWxsCiAgICBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGJhc2VkIG9uIHRoZSBmbG93IGNvbnRyb2wgYWxnb3JpdGhtLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Qcm9jZXNzRkNGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90KiAgICAgICAgcHZvc0RhdGFCdWZmLAogIHZfUFZPSURfdCAgICAgICAgIHB2QkRIZWFkZXIKKQp7CiNpZiAxIC8vZW5hYmxlIHByb2Nlc3Npbmcgb2Ygb25seSBmY1N0YVR4RGlzYWJsZWQgYml0bWFwIGZvciBub3cuIHRoZSBlbHNlIHBhcnQgaXMgb2xkIGJldHRlciBxb3MgY29kZS4KICAgICAgLy8gbmVlZCB0byByZXZpc2l0IHRoZSBvbGQgY29kZSBmb3IgZnVsbCBpbXBsZW1lbnRhdGlvbi4KICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkOwogIHZfVTE2X3QgICAgICAgICAgIHVjU3RhVmFsaWRCaXRtYXA7CiAgdl9VMTZfdCAgICAgICAgICAgdWNTdGFUeERpc2FibGVkQml0bWFwOwogIFdMQU5UTF9DYlR5cGUqICAgIHBUTENiID0gTlVMTDsKICAjaWZkZWYgVExfREVCVUdfRkMKICB2X1UzMl90ICAgICAgICAgICByeFRpbWVTdGFtcDsKICB2X1UzMl90ICAgICAgICAgICBjdXJUaWNrOwogICNlbmRpZgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TdXNwZW5kRGF0YVR4IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgdWNTdGFWYWxpZEJpdG1hcCA9IFdEQV9HRVRfUlhfRkNfVkFMSURfU1RBX01BU0socHZCREhlYWRlcik7CiAgdWNTdGFUeERpc2FibGVkQml0bWFwID0gV0RBX0dFVF9SWF9GQ19TVEFfVFhfRElTQUJMRURfQklUTUFQKHB2QkRIZWFkZXIpOwojaWZkZWYgVExfREVCVUdfRkMKICByeFRpbWVTdGFtcCA9IFdEQV9HRVRfUlhfVElNRVNUQU1QKHB2QkRIZWFkZXIpOwogIC8qIGhhcmQgY29kZSBvZiBNVFVfR0xPQkFMX1RJTUVSX0FERFIgdG8gY2FsY3VsYXRlIHRoZSB0aW1lIGJldHdlZW4gZ2VuZXJhdGVkIGFuZCBwcm9jZXNzZWQgKi8KICB3cGFsUmVhZFJlZ2lzdGVyKDB4MDMwODE0MDArMHgxRDQsICZjdXJUaWNrKTsKCiAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIiVsZCAoJWxkLSVsZCk6IERpc2FibGVkICV4IFZhbGlkICV4XG4iLCBjdXJUaWNrID4gcnhUaW1lU3RhbXAgPyBjdXJUaWNrIC0gcnhUaW1lU3RhbXAgOiByeFRpbWVTdGFtcCAtICgweEZGRkZGRkZGIC0gY3VyVGljayksCiAgICBjdXJUaWNrLCByeFRpbWVTdGFtcCwgIHVjU3RhVHhEaXNhYmxlZEJpdG1hcCwgdWNTdGFWYWxpZEJpdG1hcCkpOwojZW5kaWYKICBmb3IodWNTVEFJZCA9IDA7IHVjU3RhVmFsaWRCaXRtYXAgIT0gMDsgdWNTdGFWYWxpZEJpdG1hcCA+Pj0xLCB1Y1N0YVR4RGlzYWJsZWRCaXRtYXAgPj49IDEsIHVjU1RBSWQgKyspCiAgewogICAgaWYgKCAoMCA9PSAodWNTdGFWYWxpZEJpdG1hcCAmIDB4MSkpIHx8IChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSAmJiAoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMpKSApCiAgICAgICAgY29udGludWU7CgogICAgaWYgKHVjU3RhVHhEaXNhYmxlZEJpdG1hcCAmIDB4MSkKICAgIHsKICAgICAgV0xBTlRMX1N1c3BlbmREYXRhVHgocHZvc0dDdHgsICZ1Y1NUQUlkLCBOVUxMKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgV0xBTlRMX1Jlc3VtZURhdGFUeChwdm9zR0N0eCwgJnVjU1RBSWQpOwogICAgfQogIH0KCiNlbHNlCiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgdHBIYWxGY1J4QmQgICAgICAgICBwdkZjUnhCZCA9IE5VTEw7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y0JpdENoZWNrID0gMHgxOwogIHZfVThfdCAgICAgICAgICAgICAgdWNTdGFWYWxpZCA9IDA7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1NUQUlkID0gMDsKCiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgIlJlY2VpdmVkIEZDIFJlc3BvbnNlIik7CiAgaWYgKCAoTlVMTCA9PSBwVExDYikgfHwgKE5VTEwgPT0gcHZvc0RhdGFCdWZmKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwb2ludGVyIGluICVzIFxuIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCBwdm9zRGF0YUJ1ZmYsIDAsICh2X1BWT0lEX3QpJnB2RmNSeEJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0SGFsRmNSeEJkKSk7CgogIGlmICggKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpIHx8IChOVUxMID09IHB2RmNSeEJkKSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6d3JvbmcgRkMgUnggcGFja2V0IikpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KICAKICAvLyBuZWVkIHRvIHN3YXAgYnl0ZXMgaW4gdGhlIEZDIGNvbnRlbnRzLiAgCiAgV0xBTkhBTF9Td2FwRmNSeEJkKCZwdkZjUnhCZC0+ZmNTVEFUeFFMZW5bMF0pOwoKICAvL2xvZ2ljIHRvIGVuYWJsZS9kaXNhYmxlIExXTSBtb2RlIGZvciBlYWNoIHN0YXRpb24KICBmb3IoIHVjU3RhVmFsaWQgPSAodl9VOF90KXB2RmNSeEJkLT5mY1NUQVZhbGlkTWFzazsgdWNTdGFWYWxpZDsgdWNTdGFWYWxpZCA+Pj0gMSwgdWNCaXRDaGVjayA8PD0gMSwgdWNTVEFJZCArKykKICB7CiAgICBpZiAoICgwID09ICh1Y1N0YVZhbGlkICYgMHgxKSkgfHwgKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNFeGlzdHMpICkKICAgIHsKICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKCBwdkZjUnhCZC0+ZmNTVEFUaHJlc2hJbmRNYXNrICYgdWNCaXRDaGVjayApCiAgICB7CiAgICAgIC8vTFdNIGV2ZW50IGlzIHJlcG9ydGVkIGJ5IEZXLiBBYmxlIHRvIGZldGNoIG1vcmUgcGFja2V0CiAgICAgIGlmKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkICkKICAgICAgewogICAgICAgIC8vTm93IG1lbW9yeSB1c2FnZSBpcyBiZWxvdyBMV00uIFN0YXRpb24gY2FuIHNlbmQgbW9yZSBwYWNrZXRzLgogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtRXZlbnRSZXBvcnRlZCA9IFRSVUU7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGVyByZXBvcnQgTFdNIGV2ZW50IGJ1dCB0aGUgc3RhdGlvbiAlZCBpcyBub3QgaW4gTFdNIG1vZGUgXG4iLCB1Y1NUQUlkKSk7CiAgICAgIH0KICAgIH0KCiAgICAvL2NhbGN1bGF0ZSB1RWdyZXNzX2xlbmd0aC91SW5ncmVzc19sZW5ndGggb25seSBhZnRlciByZWNlaXZpbmcgZW5vdWdoIHBhY2tldHMKICAgIGlmIChXTEFOVExfTFdNX0lOR1JFU1NfU0FNUExFX1RIUkVTSE9MRCA8PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGgpCiAgICB7CiAgICAgIC8vY2hlY2sgbWVtb3J5IHVzYWdlIGluZm8gdG8gc2VlIHdoZXRoZXIgTFdNIG1vZGUgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoZSBzdGF0aW9uCiAgICAgIHZfVTMyX3QgdUVncmVzc19sZW5ndGggPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggKyAKICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5ibXVNZW1Db25zdW1lZCAtIHB2RmNSeEJkLT5mY1NUQVR4UUxlblt1Y1NUQUlkXTsKCiAgICAgIC8vaWYgKChmbG9hdCl1RWdyZXNzX2xlbmd0aC8oZmxvYXQpcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoIAogICAgICAvLyAgICAgIDw9IFdMQU5UTF9MV01fRUdSRVNTX0lOR1JFU1NfVEhSRVNIT0xEKQogICAgICBpZiAoIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggPiB1RWdyZXNzX2xlbmd0aCkgJiYKICAgICAgICAgICAoKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCAtIHVFZ3Jlc3NfbGVuZ3RoICkgPj0gCiAgICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggPj4gMikpCiAgICAgICAgICkKICAgICAgeyAgIAogICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkVuYWJsZSBMV00gbW9kZSBmb3Igc3RhdGlvbiAlZFxuIiwgdWNTVEFJZCkpOwogICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkID0gVFJVRTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCApCiAgICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpEaXNhYmxlIExXTSBtb2RlIGZvciBzdGF0aW9uICVkXG4iLCB1Y1NUQUlkKSk7CiAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkID0gRkFMU0U7CiAgICAgICAgfQoKICAgICAgfQoKICAgICAgLy9yZW1lbWJlciBtZW1vcnkgdXNhZ2UgaW4gRlcgc3RhcnRpbmcgZnJvbSB0aGlzIHJvdW5kCiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkID0gcHZGY1J4QmQtPmZjU1RBVHhRTGVuW3VjU1RBSWRdOwogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggPSAwOwogICAgfSAvLyhXTEFOVExfTFdNX0lOR1JFU1NfU0FNUExFX1RIUkVTSE9MRCA8PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGgpCgogICAgaWYoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQgKQogICAgewogICAgICAvL2Fsd2F5cyB1cGRhdGUgY3VycmVudCBtYXhpbXVtIGFsbG93ZWQgbWVtZW9yeSB1c2FnZQogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51QnVmZlRocmVzaG9sZE1heCA9ICBXTEFOVExfU1RBX0JNVV9USFJFU0hPTERfTUFYIC0KICAgICAgICBwdkZjUnhCZC0+ZmNTVEFUeFFMZW5bdWNTVEFJZF07CiAgICB9CgogIH0KI2VuZGlmCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SeEZyYW1lcwoKICBERVNDUklQVElPTgogICAgQ2FsbGJhY2sgcmVnaXN0ZXJlZCBieSBUTCBhbmQgY2FsbGVkIGJ5IEJBTCB3aGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkCiAgICBvdmVyIHRoZSBidXMuIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBmdW5jdGlvbiBUTCB3aWxsIG1ha2UgdGhlIG5lY2Vzc2FyeQogICAgZGVjaXNpb24gd2l0aCByZWdhcmRzIHRvIHRoZSBmb3J3YXJkaW5nIG9yIHF1ZXVpbmcgb2YgdGhpcyBwYWNrZXQgYW5kCiAgICB0aGUgbGF5ZXIgaXQgbmVlZHMgdG8gYmUgZGVsaXZlcmVkIHRvLgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgSWYgdGhlIGZyYW1lIGNhcnJpZWQgaXMgYSBkYXRhIGZyYW1lIHRoZW4gdGhlIHN0YXRpb24gZm9yIHdoaWNoIGl0IGlzCiAgICBkZXN0aW5lZCB0byBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBUTC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBidWZmZXIgcmVjZWl2ZWQsCiAgICAgICAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZSBwYWNrZXQgdGhleSB3aWxsIGJlIGNoYWluZWQKICAgICAgICAgICAgICAgICAgICB1c2luZyB2T1NTIGJ1ZmZlcnMuCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SeEZyYW1lcwooCiAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90ICAgICAqcEZyYW1lRGF0YUJ1ZmYKKQp7CiAgdm9zX3BrdF90KiAgICAgICAgICB2b3NEYXRhQnVmZiA9ICh2b3NfcGt0X3QqKXBGcmFtZURhdGFCdWZmOwogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICBXTEFOVExfU1RBRnVuY1R5cGUgIHBmblNUQUZzbTsKICB2b3NfcGt0X3QqICAgICAgICAgIHZvc1RlbXBCdWZmOwogIHZfVThfdCAgICAgICAgICAgICAgdWNTVEFJZDsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICB2X1U4X3QgICAgICAgICAgICAgIHVjRnJtVHlwZTsKICB2X1BWT0lEX3QgICAgICAgICAgIHB2QkRIZWFkZXIgPSBOVUxMOwogIFdMQU5UTF9TVEFFdmVudFR5cGUgd1NUQUV2ZW50ICA9IFdMQU5UTF9SWF9FVkVOVDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjVGlkICAgICAgPSAwOwogIHZfQk9PTF90ICAgICAgICAgICAgYnJvYWRjYXN0ICA9IFZPU19GQUxTRTsKICB2X0JPT0xfdCAgICAgICAgICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX0ZBTFNFOwogIHN0YXRpYyB2X1U4X3QgICAgICAgZmlyc3RfZGF0YV9wa3RfYXJyaXZlZDsKICB2X1UzMl90ICAgICAgICAgICAgIHVEUFVTaWc7IAogIHZfVTE2X3QgICAgICAgICAgICAgdXNQa3RMZW47CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMU19JTlRFUk5BTCAKICB2X1U4X3QgICAgICAgICAgICAgIHVjTVBEVUhMZW4gPSAwIDsKICB2X1UxNl90ICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gMDsKI2VuZGlmCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpUTCBSZWNlaXZlIEZyYW1lcyBjYWxsZWQiKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHZvc0RhdGFCdWZmICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1J4RnJhbWVzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSB0aGUgaW5pdGlhbCBidWZmZXIgLSB0aGlzIGlzIHRoZSBmaXJzdCByZWNlaXZlZCBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwoKICB3aGlsZSAoIE5VTEwgIT0gdm9zVGVtcEJ1ZmYgKQogIHsKICAgIGJyb2FkY2FzdCA9IFZPU19GQUxTRTsKICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX0ZBTFNFOyAKCiAgICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8gKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBQZWVrIGF0IEJEIGhlYWRlciAtIGRvIG5vdCByZW1vdmUKICAgICAgISEhIE9wdGltaXplIG1lOiBvbmx5IHBhcnQgb2YgaGVhZGVyIGlzIG5lZWRlZDsgbm90IGVudGlyZSBvbmUKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdm9zU3RhdHVzID0gV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHZvc1RlbXBCdWZmLCAodl9QVk9JRF90KSZwdkJESGVhZGVyLCAxLypTd2FwIEJEKi8gKTsKCiAgICBpZiAoIE5VTEwgPT0gcHZCREhlYWRlciApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZXh0cmFjdCBCRCBoZWFkZXIiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIENoZWNrIGlmIEZDIGZyYW1lIHJlcG9ydGVkIGZyb20gRlcKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZihXREFfSVNfUlhfRkMocHZCREhlYWRlcikpCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6cmVjZWl2ZSBvbmUgRkMgZnJhbWUiKSk7CgogICAgICBXTEFOVExfUHJvY2Vzc0ZDRnJhbWUocHZvc0dDdHgsIHZvc1RlbXBCdWZmLCBwdkJESGVhZGVyKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLyogQU1TRFUgSFcgYnVnIGZpeAogICAgICogQWZ0ZXIgMm5kIEFNU0RVIHN1YmZyYW1lIEhXIGNvdWxkIG5vdCBoYW5kbGUgQkQgY29ycmVjdGx5CiAgICAgKiBIQUwgd29ya2Fyb3VuZCBpcyBuZWVkZWQgKi8KICAgIGlmKFdEQV9HRVRfUlhfQVNGKHB2QkRIZWFkZXIpKQogICAgewogICAgICBXREFfRFNfUnhBbXNkdUJkRml4KHB2b3NHQ3R4LCBwdkJESGVhZGVyKTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBFeHRyYWN0IGZyYW1lIGNvbnRyb2wgZmllbGQgZnJvbSA4MDIuMTEgaGVhZGVyIGlmIHByZXNlbnQgCiAgICAgIChmcmFtZSB0cmFuc2xhdGlvbiBub3QgZG9uZSkgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIHZvc1N0YXR1cyA9IFdEQV9EU19HZXRGcmFtZVR5cGVTdWJUeXBlKCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICBwdkJESGVhZGVyLCAmdWNGcm1UeXBlICk7CiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZXh0cmFjdCBGcmFtZSBDb250cm9sIEZpZWxkIikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICBjb250aW51ZTsKICAgIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMU19JTlRFUk5BTAogICAgaWYgKCBXTEFOVExfSVNfREFUQV9GUkFNRSh1Y0ZybVR5cGUpKQogICAgewogICAgICAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4ocHZCREhlYWRlcik7CiAgICAgICBXTEFOVExfR2V0RXRoZXJUeXBlXzIocHZCREhlYWRlciwgdm9zVGVtcEJ1ZmYsIHVjTVBEVUhMZW4sICZ1c0V0aGVyVHlwZSkgOwogICAgfQojZW5kaWYKICAgIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgodm9zVGVtcEJ1ZmYsICZ1c1BrdExlbik7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgbWFuYWdlbWVudCBhbmQgc2VuZCB0byBQRQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoIFdMQU5UTF9JU19NR01UX0ZSQU1FKHVjRnJtVHlwZSkgCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMU19JTlRFUk5BTAogICAgICAgIHx8IChXTEFOVExfSVNfVERMU19GUkFNRSh1c0V0aGVyVHlwZSkpIAojZW5kaWYKICAgICAgICkKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTZW5kaW5nIHBhY2tldCB0byBtYW5hZ2VtZW50IGNsaWVudCIpKTsKICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX3BrdF9mbGF0dGVuX3J4X3BrdCgmdm9zVGVtcEJ1ZmYpKQogICAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGZsYXR0ZW4gcGFja2V0IC0gZHJvcHBpbmciKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdWNTVEFJZCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9TVEFJRCggcHZCREhlYWRlciApOwogICAgICAvKiBSZWFkIFJTU0kgYW5kIHVwZGF0ZSAqLwogICAgICBpZighV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjU1RBSWQpKQogICAgICB7CiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgICAgICAgLyogUmVhZCBSU1NJIGFuZCB1cGRhdGUgKi8KICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfSFNIYW5kbGVSWEZyYW1lKHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01HTVRfRlJBTUVfVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX0ZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiNlbHNlCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRSU1NJKHB2b3NHQ3R4LCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKI2VuZGlmCiAgICAgIH0KCiAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgewogICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAiSGFuZGxlIFJYIE1hbmFnZW1lbnQgRnJhbWUgZmFpbCB3aXRoaW4gSGFuZG9mZiBzdXBwb3J0IG1vZHVsZSIpKTsKICAgICAgICAvKiBEbyBOb3QgRHJvcCBwYWNrZXQgYXQgaGVyZSAKICAgICAgICAgKiBSZXZpc2l0IHdoeSBITyBtb2R1bGUgcmV0dXJuIGZhaWwKICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgICAgICovCiAgICAgIH0KICAgICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCggcHZvc0dDdHgsIHZvc1RlbXBCdWZmKTsgCiAgICB9CiAgICBlbHNlIC8qIERhdGEgRnJhbWUgKi8KICAgIHsKICAgICAgdWNTVEFJZCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9TVEFJRCggcHZCREhlYWRlciApOwogICAgICB1Y1RpZCAgID0gKHZfVThfdClXREFfR0VUX1JYX1RJRCggcHZCREhlYWRlciApOwoKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpEYXRhIHBhY2tldCByZWNlaXZlZCBmb3IgU1RBICVkIiwgdWNTVEFJZCkpOwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBUaGlzIHNob3VsZCBiZSBjb3JyZWN0ZWQgd2hlbiBtdWx0aXBlIHN0YSBzdXBwb3J0IGlzIGFkZGVkICEhIQogICAgICAgIGZvciBub3cgYmNhc3QgZnJhbWVzIHdpbGwgYmUgc2VudCB0byB0aGUgbGFzdCByZWdpc3RlcmVkIFNUQQogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgaWYgKCBXREFfSVNfUlhfQkNBU1QocHZCREhlYWRlcikpCiAgICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICJXTEFOIFRMOlRMIHJ4IEJjYXN0IGZyYW1lIC0gc2VuZGluZyB0byBsYXN0IHJlZ2lzdGVyZWQgc3RhdGlvbiIpKTsKICAgICAgICBicm9hZGNhc3QgPSBWT1NfVFJVRTsKICAgICAgICAKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIElmIEFkZHIxIGlzIGIvbWNhc3QsIGJ1dCBBZGRyMyBpcyBvdXIgb3duIHNlbGYgTUFDLCBpdCBpcyBhIGIvbWNhc3QKICAgICAgICAgIHBrdCB3ZSBzZW50ICBsb29waW5nIGJhY2sgdG8gdXMuIFRvIGJlIGRyb3BwZWQgaWYgd2UgYXJlIG5vbiBCVEFNUCAgCiAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKICAgICAgICBpZiggV0xBTkhBTF9SWF9CRF9BRERSM19TRUxGX0lEWCA9PSAKICAgICAgICAgICAgKHZfVThfdClXREFfR0VUX1JYX0FERFIzX0lEWCggcHZCREhlYWRlciApKSAKICAgICAgICB7CiAgICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19UUlVFOyAKICAgICAgICB9CiAgICAgIH0vKmlmIGJjYXN0Ki8KCiAgICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjU1RBSWQpICkKICAgICAgewogICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6U1RBIElEIGludmFsaWQgLSBkcm9wcGluZyBwa3QiKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIE5vIG5lZWQgdG8gbG9jayBjYWNoZSBhY2Nlc3MgYmVjYXVzZSBjYWNoZSBtYW5pcHVsYXRpb24gb25seSBoYXBwZW5zCiAgICAgICAgaW4gdGhlIHRyYW5zcG9ydCB0aHJlYWQvdGFzayBjb250ZXh0CiAgICAgICAgLSBUaGVzZSBmcmFtZXMgYXJlIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgc3RhdGlvbiB1cG9uIHJlZ2lzdHJhdGlvbgogICAgICAgICAgd2hpY2ggaGFwcGVucyBpbiB0aGUgbWFpbiB0aHJlYWQgY29udGV4dAogICAgICAgICAgVGhlIGNhY2hpbmcgaGVyZSBjYW4gaGFwcGVuIGluIGVpdGhlciBUeCBvciBSeCB0aHJlYWQgZGVwZW5kaW5nCiAgICAgICAgICBvbiB0aGUgY3VycmVudCBTU0Mgc2NoZWR1bGluZwogICAgICAgIC0gYWxzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBmcmFtZXMgaW4gdGhlIGNhY2hlIGFyZSBmd2QtZWQgdG8KICAgICAgICAgIHRoZSBzdGF0aW9uIGJlZm9yZSB0aGUgbmV3IGluY29taW5nIG9uZXMgCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwogICAgICBpZiAoTlVMTCA9PSBwQ2xpZW50U1RBKQogICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlNUQSBub3QgYWxsb2NhdGVkIG1lbW9yeS4gRHJvcHBpbmcgcGFja2V0IikpOwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgICAgIGlmICgoIHBDbGllbnRTVEEtPnVjRXhpc3RzICkgJiYKICAgICAgICAgICAoV0xBTl9TVEFfVERMUyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgICAgICAocENsaWVudFNUQS0+dWNUeFN1c3BlbmRlZCkpCiAgICAgICAgICB2b3NfYXRvbWljX3NldF9VOCggJnBDbGllbnRTVEEtPnVjVHhTdXNwZW5kZWQsIDAgKTsKICAgICAgZWxzZSBpZiAoICFicm9hZGNhc3QgJiYgKHBDbGllbnRTVEEtPnVjRXhpc3RzID09IDAgKSApCiAgICAgIHsKICAgICAgICAgIHRwU2lyTWFjTWdtdEhkciBwTWFjSGVhZGVyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKCBwdkJESGVhZGVyICk7CgogICAgICAgICAgLyogZnJvbSB0aGUgZGlyZWN0IHBlZXIgd2hpbGUgaXQgaXMgbm90IHJlZ2lzdGVyZWQgdG8gVEwgeWV0ICovCiAgICAgICAgICBpZiAoIChwTWFjSGVhZGVyLT5mYy5mcm9tRFMgPT0gMCkgJiYKICAgICAgICAgICAgICAgKHBNYWNIZWFkZXItPmZjLnRvRFMgPT0gMCkgKQogICAgICAgICAgewogICAgICAgICAgICAgIHZfVThfdCB1Y0FkZHIzU1RBSWQ7CgogICAgICAgICAgICAgIHVjQWRkcjNTVEFJZCA9IFdEQV9HRVRfUlhfQUREUjNfSURYKHB2QkRIZWFkZXIpOwoKICAgICAgICAgICAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y0FkZHIzU1RBSWQpICkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6U1RBIElEICVkIGludmFsaWQgLSBkcm9wcGluZyBwa3QiLCB1Y0FkZHIzU1RBSWQpKTsKICAgICAgICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKCEocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNBZGRyM1NUQUlkXSAmJiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdLT51Y0V4aXN0cyAmJgogICAgICAgICAgICAgICAgICAoV0xBTl9TVEFfSU5GUkEgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNBZGRyM1NUQUlkXS0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICAgICAgICAgICAgIChXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNBZGRyM1NUQUlkXS0+dGxTdGF0ZSkpKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogc3RhSWQgJWQgYWRkcjNJZCAlZCB0bFN0YXRlICVkLiBVbmtvd24gUmVjZWl2ZXIvVHJhbnNtaXR0ZXIgRHJvcHBpbmcgcGFja2V0XG4iLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBZGRyM1NUQUlkLCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdLT50bFN0YXRlKSk7CiAgICAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzdGFJZCAlZCBkb2Vzbid0IGV4aXN0LCBidXQgbWFwcGVkIHRvIEFQIHN0YUlkICVkIFxuIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIHVjQWRkcjNTVEFJZCkpOwogICAgICAgICAgICAgICAgICB1Y1NUQUlkID0gdWNBZGRyM1NUQUlkOwogICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNBZGRyM1NUQUlkXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KI2VuZGlmCgogICAgICBpZiAoKCggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApIHx8CiAgICAgICAgICAoICgwICE9IHBDbGllbnRTVEEtPnVjUnhCbG9ja2VkKQogICAgICAgICAgICAvLy9AQEA6IHhnOiBubyBjaGVja2luZyBpbiBTT0ZUQVAgZm9yIG5vdywgd2lsbCByZXZpc2l0IGxhdGVyCiAgICAgICAgICAgICYmIChXTEFOX1NUQV9TT0ZUQVAgIT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICAgICAgICApIHx8CiAgICAgICAgICAoIFdMQU5UTF9TVEFfRElTQ09OTkVDVEVEID09IHBDbGllbnRTVEEtPnRsU3RhdGUpKSAmJgogICAgICAgICAgICAvKkRvbnQgYnVmZmVyIEJyb2FkY2FzdC9NdWx0aWNhc3QgZnJhbWVzLiBJZiBBUCB0cmFuc21pdHMgYnVyc3RzIG9mIEJyb2FkY2FzdC9NdWx0aWNhc3QgZGF0YSBmcmFtZXMsIAogICAgICAgICAgICAgKiBsaWJyYSBidWZmZXJzIGFsbCBCcm9hZGNhc3QvTXVsdGljYXN0IHBhY2tldHMgYWZ0ZXIgYXV0aGVudGljYXRpb24gd2l0aCBBUCwgCiAgICAgICAgICAgICAqIFNvIGl0IHdpbGwgbGVhZCB0byBsb3cgcmVzb3VyY2UgY29uZGl0aW9uIGluIFJ4IERhdGEgUGF0aC4qLwogICAgICAgICAgKChXREFfSVNfUlhfQkNBU1QocHZCREhlYWRlcikgPT0gMCkpKQogICAgICB7CiAgICAgICAgdURQVVNpZyA9IFdEQV9HRVRfUlhfRFBVU0lHKCBwdkJESGVhZGVyICk7CiAgICAgICAgICAvL1N0YXRpb24gaGFzIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIHdpdGggVEwgLSBjYWNoZSB0aGUgZnJhbWUKICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAiJXM6IHN0YUlkICVkIGV4aXN0ICVkIHRsU3RhdGUgJWQgY2FjaGUgcnggZnJhbWUgXG4iLCBfX2Z1bmNfXywgdWNTVEFJZCwKICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51Y0V4aXN0cywgcENsaWVudFNUQS0+dGxTdGF0ZSkpOwogICAgICAgIFdMQU5UTF9DYWNoZVNUQUZyYW1lKCBwVExDYiwgdWNTVEFJZCwgdm9zVGVtcEJ1ZmYsIHVEUFVTaWcsIGJyb2FkY2FzdCwgdWNGcm1UeXBlKTsKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAogICAgICBpZiAoKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNDY3hTdGEpfHwgYnJvYWRjYXN0KQogICAgICB7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgRmlsdGVyIHRoZSBJQVBQIGZyYW1lcyBmb3IgQ0NYIGNvbm5lY3Rpb247IAogICAgICAgICAgaWYgZGF0YSBpdCB3aWxsIHJldHVybiBmYWxzZSBhbmQgaXQgCiAgICAgICAgICB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIGRhdGEgcGF0aAogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBpZiAoIFdMQU5UTF9Jc0lBUFBGcmFtZShwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19wa3RfZmxhdHRlbl9yeF9wa3QoJnZvc1RlbXBCdWZmKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBmbGF0dGVuIHBhY2tldCAtIGRyb3BwaW5nIikpOwogICAgICAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBSZWNlaXZlZCBDQ1ggSUFQUCBGcmFtZSIpKTsKCiAgICAgICAgICAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUngoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZik7IAogICAgICAgICAgICB9CiAgICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQojZW5kaWYKCiAgICAgIGlmICggV0xBTl9TVEFfQlRfQU1QID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlICkKICAgICAgewogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIFByb2Nlc3MgdGhlIGN0cmwgQkFQIGZyYW1lOyBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdCAKICAgICAgICAgIHdpbGwgYmUgcm91dGVkIHRocm91Z2ggdGhlIHJlZ3VsYXIgZGF0YSBwYXRoCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGlmICggV0xBTlRMX1Byb2Nlc3NCQVBGcmFtZSggcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdF9kYXRhX3BrdF9hcnJpdmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpCiAgICAgICAgewogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfS8qaWYgQlQtQU1QIHN0YXRpb24qLwogICAgICBlbHNlIGlmKHNlbGZCY2FzdExvb3BiYWNrID09IFZPU19UUlVFKQogICAgICB7IAogICAgICAgIC8qIERyb3AgcGFja2V0ICovIAogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7IAogICAgICAgIGNvbnRpbnVlOyAKICAgICAgfSAKICAgICAgCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgRGF0YSBwYWNrZXQgcmVjZWl2ZWQsIHNlbmQgdG8gc3RhdGUgbWFjaGluZQogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICB3U1RBRXZlbnQgPSBXTEFOVExfUlhfRVZFTlQ7CgogICAgICBwZm5TVEFGc20gPSB0bFNUQUZzbVtwQ2xpZW50U1RBLT50bFN0YXRlXS4KICAgICAgICAgICAgICAgICAgICAgIHBmblNUQVRibFt3U1RBRXZlbnRdOwoKICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCiAgICAgIHsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgICAgICAvKiBSZWFkIFJTU0kgYW5kIHVwZGF0ZSAqLwogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9IU0hhbmRsZVJYRnJhbWUocHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfREFUQV9GUkFNRV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZik7CiAgICAgICAgYnJvYWRjYXN0ID0gVk9TX0ZBTFNFOwojZWxzZQogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkUlNTSShwdm9zR0N0eCwgcHZCREhlYWRlciwgdWNTVEFJZCk7CiNlbmRpZiAvKkZFQVRVUkVfV0xBTl9HRU42X1JPQU1JTkcqLwogICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgIkhhbmRsZSBSWCBEYXRhIEZyYW1lIGZhaWwgd2l0aGluIEhhbmRvZmYgc3VwcG9ydCBtb2R1bGUiKSk7CiAgICAgICAgICAvKiBEbyBOb3QgRHJvcCBwYWNrZXQgYXQgaGVyZSAKICAgICAgICAgICAqIFJldmlzaXQgd2h5IEhPIG1vZHVsZSByZXR1cm4gZmFpbAogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICBwZm5TVEFGc20oIHB2b3NHQ3R4LCB1Y1NUQUlkLCAmdm9zVGVtcEJ1ZmYpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgIldMQU4gVEw6TlVMTCBzdGF0ZSBmdW5jdGlvbiwgU1RBOiVkLCBTdGF0ZTogJWQtIGRyb3BwaW5nIHBhY2tldCIsCiAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bFN0YXRlKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICB9LyogZWxzZSBkYXRhIGZyYW1lKi8KCiAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogIH0vKndoaWxlIGNoYWluKi8KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SeEZyYW1lcyAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1J4Q2FjaGVkRnJhbWVzCgogIERFU0NSSVBUSU9OCiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgVEwgdG8gZm9yd2FyZCB0aGUgY2FjaGVkIGZyYW1lcyB0byBhIHBhcnRpY3VsYXIKICAgIHN0YXRpb247IAoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgSWYgdGhlIGZyYW1lIGNhcnJpZWQgaXMgYSBkYXRhIGZyYW1lIHRoZW4gdGhlIHN0YXRpb24gZm9yIHdoaWNoIGl0IGlzCiAgICBkZXN0aW5lZCB0byBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBUTC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwVExDYjogICBwb2ludGVyIHRvIFRMIGhhbmRsZSAKICAgCiAgICB1Y1NUQUlkOiAgICBzdGF0aW9uIGZvciB3aGljaCB3ZSBuZWVkIHRvIGZvcndhcmQgdGhlIHBhY2tldHMKCiAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjYWNoZWQgYnVmZmVyCiAgICAgICAgICAgICAgICAgICByZWNlaXZlZCwgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZSBwYWNrZXQgdGhleSB3aWxsIGJlCiAgICAgICAgICAgICAgICAgICBjaGFpbmVkIHVzaW5nIHZPU1MgYnVmZmVycy4KCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1J4Q2FjaGVkRnJhbWVzCigKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmCikKewogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICBXTEFOVExfU1RBRnVuY1R5cGUgIHBmblNUQUZzbTsKICB2b3NfcGt0X3QqICAgICAgICAgIHZvc1RlbXBCdWZmOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogIHZfUFZPSURfdCAgICAgICAgICAgcHZCREhlYWRlciA9IE5VTEw7CiAgV0xBTlRMX1NUQUV2ZW50VHlwZSB3U1RBRXZlbnQgID0gV0xBTlRMX1JYX0VWRU5UOwogIHZfVThfdCAgICAgICAgICAgICAgdWNUaWQgICAgICA9IDA7CiAgdl9CT09MX3QgICAgICAgICAgICBicm9hZGNhc3QgID0gVk9TX0ZBTFNFOwogIHZfQk9PTF90ICAgICAgICAgICAgYlNpZ01hdGNoICA9IFZPU19GQUxTRTsgCiAgdl9CT09MX3QgICAgICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsKICBzdGF0aWMgdl9VOF90ICAgICAgIGZpcnN0X2RhdGFfcGt0X2Fycml2ZWQ7CiAgdl9VMzJfdCAgICAgICAgICAgICB1RFBVU2lnOyAKICB2X1U4X3QgICAgICAgICAgICAgIHVjVWNhc3RTaWc7IAogIHZfVThfdCAgICAgICAgICAgICAgdWNCY2FzdFNpZzsgCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpUTCBSZWNlaXZlIENhY2hlZCBGcmFtZXMgY2FsbGVkIikpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSB2b3NEYXRhQnVmZiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9SeEZyYW1lcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSB0aGUgaW5pdGlhbCBidWZmZXIgLSB0aGlzIGlzIHRoZSBmaXJzdCByZWNlaXZlZCBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwoKICB3aGlsZSAoIE5VTEwgIT0gdm9zVGVtcEJ1ZmYgKQogIHsKICAgIGJyb2FkY2FzdCA9IFZPU19GQUxTRTsKICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX0ZBTFNFOyAKCiAgICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8gKTsKCiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpTZW5kaW5nIG5ldyBjYWNoZWQgcGFja2V0IHRvIHN0YXRpb24gJWQiLCB1Y1NUQUlkKSk7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBQZWVrIGF0IEJEIGhlYWRlciAtIGRvIG5vdCByZW1vdmUKICAgICAgISEhIE9wdGltaXplIG1lOiBvbmx5IHBhcnQgb2YgaGVhZGVyIGlzIG5lZWRlZDsgbm90IGVudGlyZSBvbmUKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdm9zU3RhdHVzID0gV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHZvc1RlbXBCdWZmLCAodl9QVk9JRF90KSZwdkJESGVhZGVyLCAwICk7CgogICAgaWYgKCBOVUxMID09IHB2QkRIZWFkZXIgKQogICAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGV4dHJhY3QgQkQgaGVhZGVyIikpOwogICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgIHVEUFVTaWcgPSBXREFfR0VUX1JYX0RQVVNJRyggcHZCREhlYWRlciApOwoKICAgIC8qIEFNU0RVIEhXIGJ1ZyBmaXgKICAgICAqIEFmdGVyIDJuZCBBTVNEVSBzdWJmcmFtZSBIVyBjb3VsZCBub3QgaGFuZGxlIEJEIGNvcnJlY3RseQogICAgICogSEFMIHdvcmthcm91bmQgaXMgbmVlZGVkICovCiAgICBpZihXREFfR0VUX1JYX0FTRihwdkJESGVhZGVyKSkKICAgIHsKICAgICAgV0RBX0RTX1J4QW1zZHVCZEZpeCh2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlcik7CiAgICB9CgogICAgdWNUaWQgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoIHB2QkRIZWFkZXIgKTsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkRhdGEgcGFja2V0IGNhY2hlZCBmb3IgU1RBICVkIiwgdWNTVEFJZCk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkIHdoZW4gbXVsdGlwZSBzdGEgc3VwcG9ydCBpcyBhZGRlZCAhISEKICAgICAgZm9yIG5vdyBiY2FzdCBmcmFtZXMgd2lsbCBiZSBzZW50IHRvIHRoZSBsYXN0IHJlZ2lzdGVyZWQgU1RBCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggV0RBX0lTX1JYX0JDQVNUKHB2QkRIZWFkZXIpKQogICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpUTCByeCBCY2FzdCBmcmFtZSAiKSk7CiAgICAgIGJyb2FkY2FzdCA9IFZPU19UUlVFOwoKICAgICAgLyogSWYgQWRkcjEgaXMgYi9tY2FzdCwgYnV0IEFkZHIzIGlzIG91ciBvd24gc2VsZiBNQUMsIGl0IGlzIGEgYi9tY2FzdCAKICAgICAgICogcGt0IHdlIHNlbnQgbG9vcGluZyBiYWNrIHRvIHVzLiBUbyBiZSBkcm9wcGVkIGlmIHdlIGFyZSBub24gQlRBTVAgIAogICAgICAgKi8gCiAgICAgIGlmKCBXTEFOSEFMX1JYX0JEX0FERFIzX1NFTEZfSURYID09IAogICAgICAgICAgKHZfVThfdClXREFfR0VUX1JYX0FERFIzX0lEWCggcHZCREhlYWRlciApKSAKICAgICAgewogICAgICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX1RSVUU7IAogICAgICB9CiAgICB9LyppZiBiY2FzdCovCgogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDaGVjayBpZiB0aGUgcGFja2V0IHRoYXQgd2UgY2FjaGVkIG1hdGNoZXMgdGhlIERQVSBzaWduYXR1cmUgb2YgdGhlCiAgICAgIG5ld2x5IGFkZGVkIHN0YXRpb24gCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCgogICAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQoKICAgIGlmICggYnJvYWRjYXN0ICkKICAgIHsKICAgICAgdWNCY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKICAgICAgYlNpZ01hdGNoID0gKCggV0xBTl9UTF9JTlZBTElEX0JfU0lHICE9IAogICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcgKSAmJgogICAgICAgICggdWNCY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICB1Y1VjYXN0U2lnID0gKHZfVThfdCl1RFBVU2lnOwogICAgICBiU2lnTWF0Y2ggPSAoKCBXTEFOX1RMX0lOVkFMSURfVV9TSUcgIT0gCiAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnICkgJiYKICAgICAgICAgICggdWNVY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnICkpOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBJZiB0aGUgcGFja2V0IGRvZXNuJ3QgbWF0Y2ggLSBkcm9wIGl0IAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoICFiU2lnTWF0Y2ggKQogICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6IENhY2hlZCBwYWNrZXQgZG9lcyBub3QgbWF0Y2ggRFBVIFNpZyBvZiB0aGUgbmV3IFNUQSAtIGRyb3AgIgogICAgICAgICIgRFBVIFNpZyAlZCAgVUMgJWQgQkMgJWQgQiAlZCIsCiAgICAgICAgdURQVVNpZywKICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnLAogICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcsCiAgICAgICAgYnJvYWRjYXN0KSk7CgogICAgICAvKiBEcm9wIHBhY2tldCAqLyAKICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7IAogICAgICBjb250aW51ZTsgCgogICAgfS8qaWYgc2lnbmF0dXJlIG1pc21hdGNoKi8KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDaGVjayBpZiBCVC1BTVAgZnJhbWU6CiAgICAgIC0gYWRkaXRpb25hbCBwcm9jZXNzaW5nIG5lZWRlZCBpbiB0aGlzIGNhc2UgdG8gc2VwYXJhdGUgQlQtQU1QIGRhdGUKICAgICAgICBmcm9tIEJULUFNUCBDdHJsIHBhdGggCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKCBXTEFOX1NUQV9CVF9BTVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogICAgewogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgUHJvY2VzcyB0aGUgY3RybCBCQVAgZnJhbWU7IGlmIGRhdGEgaXQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIGl0IAogICAgICAgIHdpbGwgYmUgcm91dGVkIHRocm91Z2ggdGhlIHJlZ3VsYXIgZGF0YSBwYXRoCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgaWYgKCBXTEFOVExfUHJvY2Vzc0JBUEZyYW1lKCBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X2RhdGFfcGt0X2Fycml2ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpCiAgICAgIHsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0vKmlmIEJULUFNUCBzdGF0aW9uKi8KICAgICAgZWxzZSBpZihzZWxmQmNhc3RMb29wYmFjayA9PSBWT1NfVFJVRSkKICAgICAgeyAKICAgICAgICAvKiBEcm9wIHBhY2tldCAqLyAKICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOyAKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOyAKICAgICAgICBjb250aW51ZTsgCiAgICAgIH0gCiAgICAgIAogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIERhdGEgcGFja2V0IHJlY2VpdmVkLCBzZW5kIHRvIHN0YXRlIG1hY2hpbmUKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgd1NUQUV2ZW50ID0gV0xBTlRMX1JYX0VWRU5UOwoKICAgICAgcGZuU1RBRnNtID0gdGxTVEFGc21bcENsaWVudFNUQS0+dGxTdGF0ZV0uCiAgICAgICAgICAgICAgICAgICAgICBwZm5TVEFUYmxbd1NUQUV2ZW50XTsKCiAgICAgIGlmICggTlVMTCAhPSBwZm5TVEFGc20gKQogICAgICB7CiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgICAgICAgLyogUmVhZCBSU1NJIGFuZCB1cGRhdGUgKi8KICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfSFNIYW5kbGVSWEZyYW1lKHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01PRFVMRV9JRF9UTCxwVExDYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfREFUQV9GUkFNRV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZik7CiAgICAgICAgYnJvYWRjYXN0ID0gVk9TX0ZBTFNFOwojZWxzZQogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkUlNTSSh2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKI2VuZGlmIC8qRkVBVFVSRV9XTEFOX0dFTjZfUk9BTUlORyovCiAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiSGFuZGxlIFJYIERhdGEgRnJhbWUgZmFpbCB3aXRoaW4gSGFuZG9mZiBzdXBwb3J0IG1vZHVsZSIpKTsKICAgICAgICAgIC8qIERvIE5vdCBEcm9wIHBhY2tldCBhdCBoZXJlIAogICAgICAgICAgICogUmV2aXNpdCB3aHkgSE8gbW9kdWxlIHJldHVybiBmYWlsCiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICovCiAgICAgICAgfQogICAgICAgIHBmblNUQUZzbSggdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwgdWNTVEFJZCwgCiAgICAgICAgICAgICAgICAgJnZvc1RlbXBCdWZmKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOk5VTEwgc3RhdGUgZnVuY3Rpb24sIFNUQTolZCwgU3RhdGU6ICVkLSBkcm9wcGluZyBwYWNrZXQiLAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxTdGF0ZSkpOwogICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICB9Lyp3aGlsZSBjaGFpbiovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUnhDYWNoZWRGcmFtZXMgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfUmVzb3VyY2VDQgoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IHRoZSBUTCB3aGVuIGl0IGhhcyBwYWNrZXRzIGF2YWlsYWJsZSBmb3IgdHJhbnNtaXNzaW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBCQUwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUmVzb3VyY2VDQgooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAogIHZfVTMyX3QgICAgICAgICB1Q291bnQKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBUTENiLT51UmVzQ291bnQgPSB1Q291bnQ7CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXN1bWUgVHggaWYgZW5vdWdoIHJlcyBhbmQgbm90IHN1c3BlbmRlZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX01GICkgJiYKICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgIldMQU4gVEw6SXNzdWluZyBYbWl0IHN0YXJ0IHJlcXVlc3QgdG8gQkFMIGZvciBhdmFpbCByZXMgQVNZTkMiKSk7CiAgICByZXR1cm4gV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1Jlc291cmNlQ0IgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfSXNUeFhtaXRQZW5kaW5nCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgdGhlIFdEQSB3aGVuIGl0IHdhbnRzIHRvIGtub3cgd2hldGhlciBXREFfRFNfVFhfU1RBUlRfWE1JVCBtc2cKICAgIGlzIHBlbmRpbmcgaW4gVEwgbXNnIHF1ZXVlIAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBXREEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIDA6ICAgTm8gV0RBX0RTX1RYX1NUQVJUX1hNSVQgbXNnIHBlbmRpbmcgCiAgICAxOiAgIE1zZyBXREFfRFNfVFhfU1RBUlRfWE1JVCBhbHJlYWR5IHBlbmRpbmcgaW4gVEwgbXNnIHF1ZXVlIAoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X0JPT0xfdApXTEFOVExfSXNUeFhtaXRQZW5kaW5nCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgKKQp7CgogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IGluIFdMQU5UTF9Jc1R4WG1pdFBlbmRpbmcgIikpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgcmV0dXJuIHBUTENiLT5pc1R4VHJhbm1pdE1zZ1BlbmRpbmc7Cgp9LypXTEFOVExfSXNUeFhtaXRQZW5kaW5nICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfU2V0VHhYbWl0UGVuZGluZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IHRoZSBXREEgd2hlbiBpdCB3YW50cyB0byBpbmRpY2F0ZSB0aGF0IFdEQV9EU19UWF9TVEFSVF9YTUlUIG1zZwogICAgaXMgcGVuZGluZyBpbiBUTCBtc2cgcXVldWUgCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFdEQSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBXREEncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUgICAgICBOb25lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2X1ZPSURfdApXTEFOVExfU2V0VHhYbWl0UGVuZGluZwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CikKewoKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBpbiBXTEFOVExfU2V0VHhYbWl0UGVuZGluZyIpKTsKICAgIHJldHVybjsKICB9CgogIHBUTENiLT5pc1R4VHJhbm1pdE1zZ1BlbmRpbmcgPSAxOwogIHJldHVybjsKCn0vKldMQU5UTF9TZXRUeFhtaXRQZW5kaW5nICAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX0NsZWFyVHhYbWl0UGVuZGluZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IHRoZSBXREEgd2hlbiBpdCB3YW50cyB0byBpbmRpY2F0ZSB0aGF0IG5vIFdEQV9EU19UWF9TVEFSVF9YTUlUIG1zZwogICAgaXMgcGVuZGluZyBpbiBUTCBtc2cgcXVldWUgCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFdEQSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBXREEncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZfVk9JRF90CldMQU5UTF9DbGVhclR4WG1pdFBlbmRpbmcKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopCnsKCiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggaW4gV0xBTlRMX0NsZWFyVHhYbWl0UGVuZGluZyAiKSk7CiAgICByZXR1cm47CiAgfQoKICBwVExDYi0+aXNUeFRyYW5taXRNc2dQZW5kaW5nID0gMDsKICByZXR1cm47Cn0vKldMQU5UTF9DbGVhclR4WG1pdFBlbmRpbmcgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVEwgU1RBVEUgTUFDSElORQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhDb25uCgogIERFU0NSSVBUSU9OCiAgICBUcmFuc21pdCBpbiBjb25uZWN0ZWQgc3RhdGUgLSBvbmx5IEVBUE9MIGFuZCBXQUkgcGFja2V0cyBhbGxvd2VkCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdHggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgT3RoZXIgcmV0dXJuIHZhbHVlcyBhcmUgcG9zc2libGUgY29taW5nIGZyb20gdGhlIGNhbGxlZCBmdW5jdGlvbnMuCiAgIFBsZWFzZSBjaGVjayBBUEkgZm9yIGFkZGl0aW9uYWwgaW5mby4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBVHhDb25uCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZgopCnsKICAgdl9VMTZfdCAgICAgICAgICAgICAgdXNQa3RMZW47CiAgIFZPU19TVEFUVVMgICAgICAgICAgIHZvc1N0YXR1czsKICAgdl9NQUNBRERSX3QgICAgICAgICAgdkRlc3RNYWNBZGRyOwogICB2b3NfcGt0X3QqICAgICAgICAgICB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgIHBUTENiICAgICAgID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogICBXTEFOVExfTWV0YUluZm9UeXBlICB0bE1ldGFJbmZvOwogICB2X1U4X3QgICAgICAgICAgICAgICB1Y1R5cGVTdWJ0eXBlID0gMDsKICAgdl9VOF90ICAgICAgICAgICAgICAgdWNUaWQ7CiAgIHZfVThfdCAgICAgICAgICAgICAgIGV4dHJhSGVhZFNwYWNlID0gMDsKICAgdl9VOF90ICAgICAgICAgICAgICAgdWNXRFNFbmFibGVkID0gMDsKICAgdl9VOF90ICAgICAgICAgICAgICAgdWNBQywgdWNBQ01hc2ssIGk7IAogICB2X1U4X3QgICAgICAgICAgICAgICB0eEZsYWcgPSBIQUxfVFhfTk9fRU5DUllQVElPTl9NQVNLOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TVEFUeENvbm4iKTsKICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRGlzYWJsZSBBQyB0ZW1wb3JhcnkgLSBpZiBzdWNjZXNzZnVsbCByZXRyaWV2ZSByZS1lbmFibGUKICAgICAgVGhlIG9yZGVyIGlzIGp1c3RpZmllZCBiZWNhdXNlIG9mIHRoZSBwb3NzaWJsZSBzY2VuYXJpbwogICAgICAgLSBUTCB0cnllcyB0byBmZXRjaCBwYWNrZXQgZm9yIEFDIGFuZCBpdCByZXR1cm5zIE5VTEwKICAgICAgIC0gVEwgYW5hbHl6ZXMgdGhlIGRhdGEgaXQgaGFzIHJlY2VpdmVkIHRvIHNlZSBpZiB0aGVyZSBhcmUKICAgICAgIGFueSBtb3JlIHBrdHMgYXZhaWxhYmxlIGZvciBBQyAtPiBpZiBub3QgVEwgd2lsbCBkaXNhYmxlIEFDCiAgICAgICAtIGhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCB3aGlsZSBhbmFseXppbmcgcmVzdWx0cyBUTCBnb3QKICAgICAgIHByZWVtcHRlZCBieSBhIHBlbmRpbmcgaW5kaWNhdGlvbiB3aGVyZSB0aGUgbWFzayB3YXMgYWdhaW4gc2V0CiAgICAgICBUTCB3aWxsIG5vdCBjaGVjayBhZ2FpbiBhbmQgYXMgYSByZXN1bHQgd2hlbiBpdCByZXN1bWVzCiAgICAgICBleGVjdXRpb24gaXQgd2lsbCBkaXNhYmxlIEFDCiAgICAgICBUbyBwcmV2ZW50IHRoaXMgdGhlIEFDIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSBhbmQgaWYgcmV0cmlldmUKICAgICAgIGlzIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgYmUgcmUtZW5hYmxlZAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgLy9MVEk6cFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uCiAgLy9MVEk6ICAgYXVjQUNNYXNrW3BUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjQ3VycmVudEFDXSA9IDA7IAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRmV0Y2ggcGFja2V0IGZyb20gSERECiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmICgoV0xBTl9TVEFfU09GVEFQICE9IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAoIXZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkgJiYKICAgICAgIXBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiAgewojZWxzZQogIGlmICgoV0xBTl9TVEFfU09GVEFQICE9IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAoIXZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkpCiAgewojZW5kaWYKICAgICAgdWNBQyA9IHBDbGllbnRTVEEtPnVjQ3VycmVudEFDOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRGlzYWJsZSBBQyB0ZW1wb3JhcnkgLSBpZiBzdWNjZXNzZnVsbCByZXRyaWV2ZSByZS1lbmFibGUKICAgICAgVGhlIG9yZGVyIGlzIGp1c3RpZmllZCBiZWNhdXNlIG9mIHRoZSBwb3NzaWJsZSBzY2VuYXJpbwogICAgICAgLSBUTCB0cnllcyB0byBmZXRjaCBwYWNrZXQgZm9yIEFDIGFuZCBpdCByZXR1cm5zIE5VTEwKICAgICAgIC0gVEwgYW5hbHl6ZXMgdGhlIGRhdGEgaXQgaGFzIHJlY2VpdmVkIHRvIHNlZSBpZiB0aGVyZSBhcmUKICAgICAgIGFueSBtb3JlIHBrdHMgYXZhaWxhYmxlIGZvciBBQyAtPiBpZiBub3QgVEwgd2lsbCBkaXNhYmxlIEFDCiAgICAgICAtIGhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCB3aGlsZSBhbmFseXppbmcgcmVzdWx0cyBUTCBnb3QKICAgICAgIHByZWVtcHRlZCBieSBhIHBlbmRpbmcgaW5kaWNhdGlvbiB3aGVyZSB0aGUgbWFzayB3YXMgYWdhaW4gc2V0CiAgICAgICBUTCB3aWxsIG5vdCBjaGVjayBhZ2FpbiBhbmQgYXMgYSByZXN1bHQgd2hlbiBpdCByZXN1bWVzCiAgICAgICBleGVjdXRpb24gaXQgd2lsbCBkaXNhYmxlIEFDCiAgICAgICBUbyBwcmV2ZW50IHRoaXMgdGhlIEFDIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSBhbmQgaWYgcmV0cmlldmUKICAgICAgIGlzIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgYmUgcmUtZW5hYmxlZAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbdWNBQ10gPSAwOwogIH0KICBlbHNlCiAgewogICAgICAvL3NvZnRhcCBjYXNlCiAgICAgIHVjQUMgPSBwVExDYi0+dUN1clNlcnZlZEFDOwogICAgICBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbdWNBQ10gPSAwOwogIH0KCiAgICAvKllvdSBtYWtlIGFuIGluaXRpYWwgYXNzdW1wdGlvbiB0aGF0IEhERCBoYXMgbm8gbW9yZSBkYXRhIGFuZCBpZiB0aGUKICAgICAgYXNzdW1wdGlvbiB3YXMgd3JvbmcgeW91IHJlc2V0IHRoZSBmbGFncyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZQogICAgIFRoaXMgd2lsbCBwcmV2ZW50IGZyb20gZXhwb3NpbmcgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGNoZWNraW5nIHdpdGggSERECiAgICAgZm9yIHBhY2tldHMgYW5kIHNldHRpbmcgdGhlIGZsYWdzIHRvIGZhbHNlKi8KICAvL0xUSTogdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcsIDApOwogIC8vTFRJOiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y05vTW9yZURhdGEgPSAxOwogIHZvc19hdG9taWNfc2V0X1U4KCAmcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nLCAwKTsKICBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyggcENsaWVudFNUQSwgdWNBQ01hc2ssIGkpOwogICAgLypZb3UgbWFrZSBhbiBpbml0aWFsIGFzc3VtcHRpb24gdGhhdCBIREQgaGFzIG5vIG1vcmUgZGF0YSBhbmQgaWYgdGhlCiAgICAgICAgICAgYXNzdW1wdGlvbiB3YXMgd3JvbmcgeW91IHJlc2V0IHRoZSBmbGFncyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZQogICAgICAgICAgIFRoaXMgd2lsbCBwcmV2ZW50IGZyb20gZXhwb3NpbmcgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGNoZWNraW5nIHdpdGggSERECiAgICAgICAgICAgZm9yIHBhY2tldHMgYW5kIHNldHRpbmcgdGhlIGZsYWdzIHRvIGZhbHNlKi8KICBpZiAoIDAgPT0gdWNBQ01hc2sgKQogIHsKICAgICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMTsKICB9CiAgZWxzZQogIHsKICAgICAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDEpOwogIH0KCgogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICJXTEFOIFRMOiBXTEFOVExfU1RBVHhDb25uIGZldGNoaW5nIHBhY2tldCBmcm9tIEhERCBmb3IgQUM6ICVkIEFDIE1hc2s6ICVkIFBrdCBQZW5kaW5nOiAlZCIsIAogICAgICAgICAgICAgdWNBQywgdWNBQ01hc2ssIHBDbGllbnRTVEEtPnVjUGt0UGVuZGluZyk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGZXRjaCB0eCBwYWNrZXQgZnJvbSBIREQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLy9MVEkKI2lmIDAgCiAgaWYgKFdMQU5fU1RBX1NPRlRBUCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS53U1RBRGVzYy53U1RBVHlwZSAmJiAKICAgICAoIXZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkpCiAgewogICAgLy8gZG9uJ3Qgc2V0IDAuIAogICAgLy92b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjUGt0UGVuZGluZywgMCk7CiAgICB2b3NTdGF0dXMgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjQ3VycmVudEFDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAmdGxNZXRhSW5mbyApOwogIH0KICBlbHNlCiAgewogICAgLy9zb2Z0YXAgY2FzZQogICAgV0xBTlRMX0FDRW51bVR5cGUgdWNBQyA9IHBUTENiLT51Q3VyU2VydmVkQUM7CiAgICB2b3NTdGF0dXMgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0FDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zRGF0YUJ1ZmYsICZ0bE1ldGFJbmZvICk7CiAgfQojZW5kaWYKCiAgdm9zU3RhdHVzID0gcENsaWVudFNUQS0+cGZuU1RBRmV0Y2hQa3QoIHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0FDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAmdGxNZXRhSW5mbyApOwoKICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgfHwgKCBOVUxMID09IHZvc0RhdGFCdWZmICkpCiAgewogICAgVExMT0cxKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOk5vIG1vcmUgZGF0YSBhdCBIREQgc3RhdHVzICVkIiwgdm9zU3RhdHVzKSk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXNldCBBQyBmb3IgdGhlIHNlcnZpY2VkIHN0YXRpb24gdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgQUMKICAgIC0+IGR1ZSB0byBubyBtb3JlIGRhdGEgYXQgdGhlIHN0YXRpb24KICAgIEV2ZW4gaWYgdGhpcyBBQyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzdGF0aW9uLCBjb3JyZWN0aW9uIHdpbGwgYmUKICAgIG1hZGUgaW4gdGhlIG1haW4gVEwgbG9vcAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgcENsaWVudFNUQS0+dWNDdXJyZW50QUMgICAgID0gV0xBTlRMX0FDX1ZPOwogICAgcENsaWVudFNUQS0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJXTEFOIFRMOiBXTEFOVExfU1RBVHhDb25uIG5vIG1vcmUgcGFja2V0cyBpbiBIREQgZm9yIEFDOiAlZCBBQyBNYXNrOiAlZCIsIAogICAgICAgICAgICAgICB1Y0FDLCB1Y0FDTWFzayk7CgogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qVGhlcmUgYXJlIHN0aWxsIHBhY2tldHMgaW4gSEREIC0gc2V0IGJhY2sgdGhlIHBlbmRpbmcgcGFja2V0cyBhbmQgCiAgIHRoZSBubyBtb3JlIGRhdGEgYXNzdW1wdGlvbiovCiAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDEpOwogIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDA7CiAgcENsaWVudFNUQS0+YXVjQUNNYXNrW3VjQUNdID0gMTsKCiNpZmRlZiBXTEFOX1BFUkYgCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkwKTsKCiNlbmRpZiAvKldMQU5fUEVSRiovCgoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJZiB0aGUgcGFja2V0IGlzIG5laXRoZXIgYW4gRWFwb2wgcGFja2V0IG5vciBhIFdBSSBwYWNrZXQgdGhlbiBkcm9wIGl0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjSXNFYXBvbCAmJiAwID09IHRsTWV0YUluZm8udWNJc1dhaSApCiAgIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICJXTEFOIFRMOk9ubHkgRUFQT0wgb3IgV0FJIHBhY2tldHMgYWxsb3dlZCBiZWZvcmUgYXV0aGVudGljYXRpb24iKSk7CgogICAgIC8qIEZhaWwgdHggZm9yIHBhY2tldCAqLwogICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0VfQkFETVNHKTsKICAgICB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiNlbHNlCiAgIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjSXNFYXBvbCApCiAgewogICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBub24gRUFQT0wgcGFja2V0IGJlZm9yZSBhdXRoZW50aWNhdGlvbiIpKTsKCiAgICAvKiBGYWlsIHR4IGZvciBwYWNrZXQgKi8KICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0VfQkFETVNHKTsKICAgIHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQ2hlY2sgVElECiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNUaWQgICAgID0gdGxNZXRhSW5mby51Y1RJRDsKCiAgLypNYWtlIHN1cmUgVElEIGlzIHZhbGlkKi8KICBpZiAoIFdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkpIAogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVElEIHNlbnQgaW4gbWV0YSBpbmZvICVkIC0gZGVmYXVsdGluZyB0byAwIChCRSkiLCAKICAgICAgICAgICAgIHVjVGlkKSk7CiAgICAgdWNUaWQgPSAwOyAKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpBdHRhY2hpbmcgQkQgaGVhZGVyIHRvIHBrdCBvbiBXTEFOVExfU1RBVHhDb25uIikpOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEgaWYgRnJhbWUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCBvciBpZiAKICAgIGZyYW1lIGlzIGEgV0FJIGZyYW1lLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggKCAxID09IHRsTWV0YUluZm8udWNJc1dhaSApIHx8CiAgICAgICAoIDAgPT0gdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgKSApCiNlbHNlCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEgaWYgRnJhbWUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoICggMCA9PSB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCApICYmCiAgICAgICggMCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24pICkKI2VuZGlmIC8vI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgewogICAgdm9zU3RhdHVzID0gIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bE1ldGFJbmZvLnVjVVAsICZ1Y1dEU0VuYWJsZWQsICZleHRyYUhlYWRTcGFjZSk7CiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpFcnJvciB3aGVuIHRyYW5zbGF0aW5nIGhlYWRlciBXTEFOVExfU1RBVHhDb25uIikpOwoKICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KCiAgICB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCA9IDE7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENhbGwgSEFMIHRvIGZpbGwgQkQgaGVhZGVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHVjVHlwZVN1YnR5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1RZUEUgPDwgNCk7CgogIGlmICggcENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkICkKICB7CiAgICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSk7CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgLyogVEwgU3RhdGUgZG9lcyBub3QgdHJhbnNpdGlvbiB0byBBVVRIRU5USUNBVEVEIHRpbGwgR1RLIGlzIGluc3RhbGxlZCwgU28gaW4KICAgKiBjYXNlIG9mIFdQQSB3aGVyZSBHVEsgaGFuZHNoYWtlIGlzIGRvbmUgYWZ0ZXIgdGhlIDQgd2F5IGhhbmRzaGFrZSwgdGhlCiAgICogdW5pY2FzdCAyLzIgRUFQT0wgcGFja2V0IGZyb20gdGhlIFNUQS0+QVAgaGFzIHRvIGJlIGVuY3J5cHRlZCBldmVuIGJlZm9yZQogICAqIHRoZSBUTCBpcyBpbiBhdXRoZW50aWNhdGVkIHN0YXRlLiBTaW5jZSB0aGUgUFRLIGhhcyBiZWVuIGluc3RhbGxlZAogICAqIGFscmVhZHkgKGFmdGVyIHRoZSA0IHdheSBoYW5kc2hha2UpIHdlIG1ha2Ugc3VyZSB0aGF0IGFsbCB0cmFmZmljCiAgICogaXMgZW5jcnlwdGVkIGhlbmNlZm9ydGguKE5vdGU6IFRMIGlzIHN0aWxsIG5vdCBpbiBBVVRIRU5USUNBVEVEIHN0YXRlIHNvCiAgICogd2Ugd2lsbCBvbmx5IGFsbG93IEVBUE9MIGRhdGEgb3IgV0FJIGluIGNhc2Ugb2YgV0FQSSkKICAgKi8KICBpZiAodGxNZXRhSW5mby51Y0lzRWFwb2wgJiYgcENsaWVudFNUQS0+cHRrSW5zdGFsbGVkKQogIHsKICAgIHR4RmxhZyA9IDA7CiAgfQojZWxzZQogIGlmIChwQ2xpZW50U1RBLT5wdGtJbnN0YWxsZWQpCiAgewogICAgdHhGbGFnID0gMDsKICB9CiNlbmRpZgoKICB2b3NTdGF0dXMgPSAoVk9TX1NUQVRVUylXREFfRFNfQnVpbGRUeFBhY2tldEluZm8oIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiAsICZ2RGVzdE1hY0FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwsICZ1c1BrdExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQsIHVjV0RTRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1R5cGVTdWJ0eXBlLCAmcENsaWVudFNUQS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVjVGlkLCB0eEZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51c1RpbWVTdGFtcCwgdGxNZXRhSW5mby51Y0lzRWFwb2wgfHwgdGxNZXRhSW5mby51Y0lzV2FpLCB0bE1ldGFJbmZvLnVjVVAgKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmlsbCBCRCAlZCIsIHZvc1N0YXR1cykpOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVXBkYXRlIHR4IGNvdW50ZXIgZm9yIEJBIHNlc3Npb24gcXVlcnkgZm9yIHR4IHNpZGUKICAgICExIC0gc2hvdWxkIHRoaXMgYmUgZG9uZSBmb3IgRUFQT0wgZnJhbWVzPwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPmF1VHhDb3VudFt1Y1RpZF0rKzsKCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAodl9QVk9JRF90KXBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCApOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSBkYXRhIHRvIGlucHV0IHBvaW50ZXIgZm9yIFRMIGNvcmUKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICpwdm9zRGF0YUJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAvKnNlY3VyaXR5IGZyYW1lcyBjYW5ub3QgYmUgZGVsYXllZCovCiAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IFRSVUU7CgogIC8qIFRYIFN0YXRpc3RpY3MgKi8KICBpZiAoISh0bE1ldGFJbmZvLnVjQmNhc3QgfHwgdGxNZXRhSW5mby51Y01jYXN0KSkKICB7CiAgICAvKiBUaGlzIGlzIFRYIFVDIGZyYW1lICovCiAgICBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy50eFVDRmNudCsrOwogICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0JjbnQgKz0gdXNQa3RMZW47CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVR4Q29ubiAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhBdXRoCgogIERFU0NSSVBUSU9OCiAgICBUcmFuc21pdCBpbiBhdXRoZW50aWNhdGVkIHN0YXRlIC0gYWxsIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgIE90aGVyIHJldHVybiB2YWx1ZXMgYXJlIHBvc3NpYmxlIGNvbWluZyBmcm9tIHRoZSBjYWxsZWQgZnVuY3Rpb25zLgogICBQbGVhc2UgY2hlY2sgQVBJIGZvciBhZGRpdGlvbmFsIGluZm8uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVR4QXV0aAooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYKKQp7CiAgIHZfVTE2X3QgICAgICAgICAgICAgICB1c1BrdExlbjsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgIHZvc1N0YXR1czsKICAgdl9NQUNBRERSX3QgICAgICAgICAgIHZEZXN0TWFjQWRkcjsKICAgdm9zX3BrdF90KiAgICAgICAgICAgIHZvc0RhdGFCdWZmID0gTlVMTDsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgIHBUTENiICAgICAgID0gTlVMTDsKICAgV0xBTlRMX01ldGFJbmZvVHlwZSAgIHRsTWV0YUluZm87CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1R5cGVTdWJ0eXBlID0gMDsKICAgV0xBTlRMX0FDRW51bVR5cGUgICAgIHVjQUM7CiAgIFdMQU5UTF9BQ0VudW1UeXBlICAgICB1Y05leHRBQzsKICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjVGlkOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTd0ZybVh0bCA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSA9IDA7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlICpwU3RhQ2xpZW50ID0gTlVMTDsKICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjV0RTRW5hYmxlZCA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1R4RmxhZyAgID0gMDsgCiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y0FDTWFzaywgaTsgCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHB2b3NEYXRhQnVmZiApKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9TVEFUeEF1dGggVEwgJXggREIgJXAiLAogICAgICAgICAgICAgcFRMQ2IsIHB2b3NEYXRhQnVmZikpOwogICAgaWYgKE5VTEwgIT0gcHZvc0RhdGFCdWZmKQogICAgewogICAgICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgfQogICAgaWYoTlVMTCAhPSBwVExDYikKICAgIHsKICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgICAgICB9CiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjTm9Nb3JlRGF0YSA9IDE7CiAgICB9CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwU3RhQ2xpZW50ID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwU3RhQ2xpZW50ICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICB2b3NfbWVtX3plcm8oJnRsTWV0YUluZm8sIHNpemVvZih0bE1ldGFJbmZvKSk7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgKCF2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpICYmCiAgICAgICFwVExDYi0+dWNUZGxzUGVlckNvdW50KQogIHsKI2Vsc2UKICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgKCF2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpKQogIHsKI2VuZGlmCiAgdWNBQyA9IHBTdGFDbGllbnQtPnVjQ3VycmVudEFDOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRGlzYWJsZSBBQyB0ZW1wb3JhcnkgLSBpZiBzdWNjZXNzZnVsbCByZXRyaWV2ZSByZS1lbmFibGUKICAgICAgVGhlIG9yZGVyIGlzIGp1c3RpZmllZCBiZWNhdXNlIG9mIHRoZSBwb3NzaWJsZSBzY2VuYXJpbwogICAgICAgLSBUTCB0cnllcyB0byBmZXRjaCBwYWNrZXQgZm9yIEFDIGFuZCBpdCByZXR1cm5zIE5VTEwKICAgICAgIC0gVEwgYW5hbHl6ZXMgdGhlIGRhdGEgaXQgaGFzIHJlY2VpdmVkIHRvIHNlZSBpZiB0aGVyZSBhcmUKICAgICAgIGFueSBtb3JlIHBrdHMgYXZhaWxhYmxlIGZvciBBQyAtPiBpZiBub3QgVEwgd2lsbCBkaXNhYmxlIEFDCiAgICAgICAtIGhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCB3aGlsZSBhbmFseXppbmcgcmVzdWx0cyBUTCBnb3QKICAgICAgIHByZWVtcHRlZCBieSBhIHBlbmRpbmcgaW5kaWNhdGlvbiB3aGVyZSB0aGUgbWFzayB3YXMgYWdhaW4gc2V0CiAgICAgICBUTCB3aWxsIG5vdCBjaGVjayBhZ2FpbiBhbmQgYXMgYSByZXN1bHQgd2hlbiBpdCByZXN1bWVzCiAgICAgICBleGVjdXRpb24gaXQgd2lsbCBkaXNhYmxlIEFDCiAgICAgICBUbyBwcmV2ZW50IHRoaXMgdGhlIEFDIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSBhbmQgaWYgcmV0cmlldmUKICAgICAgIGlzIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgYmUgcmUtZW5hYmxlZAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBTdGFDbGllbnQtPmF1Y0FDTWFza1twU3RhQ2xpZW50LT51Y0N1cnJlbnRBQ10gPSAwOyAKCiAgLy8gZG9uJ3QgcmVzZXQgaXQsIGFzIG90aGVyIEFDIHF1ZXVlcyBpbiBIREQgbWF5IGhhdmUgcGFja2V0cwogIC8vdm9zX2F0b21pY19zZXRfVTgoICZwU3RhQ2xpZW50LT51Y1BrdFBlbmRpbmcsIDApOwogIH0KICBlbHNlCiAgewogICAgLy9zb2Z0YXAgY2FzZQogICAgdWNBQyA9IHBUTENiLT51Q3VyU2VydmVkQUM7CiAgICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbdWNBQ10gPSAwOyAKCiAgICAvL3Zvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKICB9CgogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwU3RhQ2xpZW50LCB1Y0FDTWFzaywgaSk7IAogICAgLypZb3UgbWFrZSBhbiBpbml0aWFsIGFzc3VtcHRpb24gdGhhdCBIREQgaGFzIG5vIG1vcmUgZGF0YSBhbmQgaWYgdGhlIAogICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQgCiAgICAgZm9yIHBhY2tldHMgYW5kIHNldHRpbmcgdGhlIGZsYWdzIHRvIGZhbHNlKi8KICBpZiAoIDAgPT0gdWNBQ01hc2sgKQogIHsKICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKICAgIHBTdGFDbGllbnQtPnVjTm9Nb3JlRGF0YSA9IDE7CiAgfQoKICB2b3NTdGF0dXMgPSBwU3RhQ2xpZW50LT5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0FDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAmdGxNZXRhSW5mbyApOwoKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8ICggTlVMTCA9PSB2b3NEYXRhQnVmZiApKQogIHsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmZXRjaCBwa3QgZnJvbSBIREQgJWQiLAogICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKTsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBSZXNldCBBQyBmb3IgdGhlIHNlcnZpY2VkIHN0YXRpb24gdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgQUMKICAgICAgLT4gZHVlIHRvIG5vIG1vcmUgZGF0YSBhdCB0aGUgc3RhdGlvbgogICAgICBFdmVuIGlmIHRoaXMgQUMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3RhdGlvbiwgY29ycmVjdGlvbiB3aWxsIGJlCiAgICAgIG1hZGUgaW4gdGhlIG1haW4gVEwgbG9vcAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgICAgID0gV0xBTlRMX0FDX1ZPOwogICAgcFN0YUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKCiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgV0xBTlRMX1N0YXRIYW5kbGVUWEZyYW1lKHB2b3NHQ3R4LCB1Y1NUQUlkLCB2b3NEYXRhQnVmZiwgTlVMTCwgJnRsTWV0YUluZm8pOwoKICAvKlRoZXJlIGFyZSBzdGlsbCBwYWNrZXRzIGluIEhERCAtIHNldCBiYWNrIHRoZSBwZW5kaW5nIHBhY2tldHMgYW5kIAogICB0aGUgbm8gbW9yZSBkYXRhIGFzc3VtcHRpb24qLwogIHZvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAxKTsKICBwU3RhQ2xpZW50LT51Y05vTW9yZURhdGEgPSAwOwoKICBpZiAoV0xBTl9TVEFfU09GVEFQICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlKQogIHsKICAvLyBkb24ndCBuZWVkIHRvIHNldCBpdCwgYXMgd2UgZG9uJ3QgcmVzZXQgaXQgaW4gdGhpcyBmdW5jdGlvbi4KICAvL3Zvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNQa3RQZW5kaW5nLCAxKTsKICB9CgojaWZkZWYgV0xBTl9QRVJGIAogICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfQkFMLCAKICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KTApOwojZW5kaWYgLypXTEFOX1BFUkYqLwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBUSUQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIHVjVGlkICAgICA9IHRsTWV0YUluZm8udWNUSUQ7CgogIC8qTWFrZSBzdXJlIFRJRCBpcyB2YWxpZCovCiAgaWYgKCBXTEFOVExfVElEX0lOVkFMSUQodWNUaWQpKSAKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRJRCBzZW50IGluIG1ldGEgaW5mbyAlZCAtIGRlZmF1bHRpbmcgdG8gMCAoQkUpIiwgCiAgICAgICAgICAgICB1Y1RpZCkpOwogICAgIHVjVGlkID0gMDsgCiAgfQoKICAvKlNhdmUgZm9yIFVBUFNEIHRpbWVyIGNvbnNpZGVyYXRpb24qLwogIHBTdGFDbGllbnQtPnVjU2VydmljZWRBQyA9IHVjQUM7IAoKICBpZiAoIHVjQUMgPT0gcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgKSAKICB7CiAgICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbcFN0YUNsaWVudC0+dWNDdXJyZW50QUNdID0gMTsKICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodC0tOwogIH0KICBlbHNlCiAgewogICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgICAgID0gdWNBQzsKICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNBQ10gLSAxOwoKICAgIHBTdGFDbGllbnQtPmF1Y0FDTWFza1twU3RhQ2xpZW50LT51Y0N1cnJlbnRBQ10gPSAxOwoKICB9CgogIGlmIChXTEFOX1NUQV9TT0ZUQVAgIT0gcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUpCiAgewogIGlmICggMCA9PSBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgKSAKICB7CiAgICBXTEFOVExfQUNFbnVtVHlwZSB0ZW1wQUMgPSB1Y0FDOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgQ2hvb3NlIG5leHQgQUMgLSAhISEgb3B0aW1pemUgbWUKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHdoaWxlICggMCAhPSB1Y0FDTWFzayApIAogICAgewogICAgICB1Y05leHRBQyA9IChXTEFOVExfQUNFbnVtVHlwZSkoKCB0ZW1wQUMgLSAxICkgJiBXTEFOVExfTUFTS19BQyk7IAogICAgICBpZiAoIDAgIT0gcFN0YUNsaWVudC0+YXVjQUNNYXNrW3VjTmV4dEFDXSApCiAgICAgIHsKICAgICAgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgICAgID0gdWNOZXh0QUM7CiAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNOZXh0QUNdOwoKICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQ2hhbmdpbmcgc2VydmljZWQgQUMgdG86ICVkIHdpdGggV2VpZ2h0OiAlZCIsCiAgICAgICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgLCAKICAgICAgICAgICAgICAgICAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQpKTsKICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGVtcEFDID0gdWNOZXh0QUM7CiAgICB9CiAgfQogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkF0dGFjaGluZyBCRCBoZWFkZXIgdG8gcGt0IG9uIFdMQU5UTF9TVEFUeEF1dGgiKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwID09IHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsICkKICB7CiAgICAgLyogTmVlZHMgZnJhbWUgdHJhbnNsYXRpb24gKi8KICAgICAvLyBpZiB0aGUgY2xpZW50IGhhcyBub3QgZW5hYmxlZCBTVy1vbmx5IGZyYW1lIHRyYW5zbGF0aW9uCiAgICAgLy8gYW5kIGlmIHRoZSBmcmFtZSBpcyBhIHVuaWNhc3QgZnJhbWUKICAgICAvLyAgIChIVyBmcmFtZSB0cmFuc2xhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGJyb2FkY2FzdCBkb21haW5zCiAgICAgLy8gICAgc28gd2UgdXNlIFNXIGZyYW1lIHRyYW5zbGF0aW9uIGZvciBicm9hZGNhc3QvbXVsdGljYXN0IGZyYW1lcykKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgICAgLy8gYW5kIGlmIHRoZSBmcmFtZSBpcyBub3QgYSBXQVBJIGZyYW1lCiNlbmRpZgogICAgIC8vIHRoZW4gdXNlIEhXX2Jhc2VkIGZyYW1lIHRyYW5zbGF0aW9uCgogICAgIGlmICggKCAwID09IHBTdGFDbGllbnQtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiApICYmCiAgICAgICAgICAoIDAgPT0gdGxNZXRhSW5mby51Y0JjYXN0ICkgJiYKICAgICAgICAgICggMCA9PSB0bE1ldGFJbmZvLnVjTWNhc3QgKQojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgICAgICAgICYmICggdGxNZXRhSW5mby51Y0lzV2FpICE9IDEgKQojZW5kaWYKICAgICAgICApCiAgICAgewojaWZkZWYgV0xBTl9QRVJGIAogICAgICAgIHZfVTMyX3QgdUZhc3RGd2RPSyA9IDA7CgogICAgICAgIC8qIEhXIGJhc2VkIHRyYW5zbGF0aW9uLiBTZWUgaWYgdGhlIGZyYW1lIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkICovCiAgICAgICAgV0RBX1RMSV9GYXN0SHdGd2REYXRhRnJhbWUoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiAsICZ2b3NTdGF0dXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1RmFzdEZ3ZE9LLCAmdGxNZXRhSW5mbywgJnBTdGFDbGllbnQtPndTVEFEZXNjKTsKCiAgICAgICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMgKQogICAgICAgIHsKICAgICAgICAgICAgaWYodUZhc3RGd2RPSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogUGFja2V0IGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkIG5vdyAqLwogICAgICAgICAgICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpcFN0YUNsaWVudC0+cGZuU1RBVHhDb21wICk7CgogICAgICAgICAgICAgICAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOwoKICAgICAgICAgICAgICAgIC8qIFRPRE86IERvIHdlIHJlYWxseSBuZWVkIHRvIHVwZGF0ZSBXTEFOVExfSFNIYW5kbGVUWEZyYW1lKCkgCiAgICAgICAgICAgICAgICAgICBzdGF0cyBmb3IgZXZlcnkgcGt0PyAqLwogICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+YXVUeENvdW50W3RsTWV0YUluZm8udWNUSURdKys7CiAgICAgICAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogY2FuJ3QgYmUgZmFzdCBmb3J3YXJkZWQsIGZhbGwgdGhyb3VnaCBub3JtYWwgKHNsb3cpIHBhdGguICovCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CgogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmFzdEZ3ZCBCRCAlZCIsIHZvc1N0YXR1cykpOwogICAgICAgICAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgICB9CiNlbmRpZiAvKldMQU5fUEVSRiovCiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgLyogU1cgYmFzZWQgdHJhbnNsYXRpb24gKi8KCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogICAgICAgZ1VjSXNXYWkgPSB0bE1ldGFJbmZvLnVjSXNXYWksCiNlbmRpZgoKICAgICAgIHZvc1N0YXR1cyA9ICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsICZ1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y1VQLCAmdWNXRFNFbmFibGVkLCAmZXh0cmFIZWFkU3BhY2UpOwogICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpFcnJvciB3aGVuIHRyYW5zbGF0aW5nIGhlYWRlciBXTEFOVExfU1RBVHhBdXRoIikpOwogICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgIH0KCiAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEwgc29mdHdhcmUgdHJhbnNsYXRpb24gc3VjY2VzcyBcbiIpKTsKICAgICAgIHVjU3dGcm1YdGwgPSAxOwogICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgPSAxOwogICAgfQogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDYWxsIEhBTCB0byBmaWxsIEJEIGhlYWRlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwoKICBpZiAoIHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApIAogIHsKICAgIHVjVHlwZVN1YnR5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFKTsKICB9CgogIHVjVHhGbGFnICA9ICgwICE9IHBTdGFDbGllbnQtPndVQVBTREluZm9bdWNBQ10udWNTZXQpPwogICAgICAgICAgICAgIEhBTF9UUklHR0VSX0VOQUJMRURfQUNfTUFTSzowOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y0lzV2FwaVN0YSA9PSAxICkKICB7CiNpZmRlZiBMSUJSQV9XQVBJX1NVUFBPUlQKICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfV0FQSV9TVEFfTUFTSzsKI2VuZGlmIC8vTElCUkFfV0FQSV9TVVBQT1JUCiAgICBpZiAoIHRsTWV0YUluZm8udWNJc1dhaSA9PSAxICkgCiAgICB7CiAgICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfVFhfTk9fRU5DUllQVElPTl9NQVNLOwogICAgfQogIH0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmICggcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUgPT0gV0xBTl9TVEFfVERMUyApCiAgewogICAgdWNUeEZsYWcgPSB1Y1R4RmxhZyB8IEhBTF9URExTX1BFRVJfU1RBX01BU0s7CiAgfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KCiAgdm9zU3RhdHVzID0gKFZPU19TVEFUVVMpV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgCiAgICAgICAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmICwgJnZEZXN0TWFjQWRkciwKICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwsICZ1c1BrdExlbiwKICAgICAgICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+d1NUQURlc2MudWNRb3NFbmFibGVkLCB1Y1dEU0VuYWJsZWQsIAogICAgICAgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSwgJnBTdGFDbGllbnQtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgdWNUaWQsIHVjVHhGbGFnLCB0bE1ldGFJbmZvLnVzVGltZVN0YW1wLCAKICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0lzRWFwb2wsIHRsTWV0YUluZm8udWNVUCApOwoKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIkZpbGwgVFggQkQgRXJyb3Igc3RhdHVzICVkIiwgdm9zU3RhdHVzKSk7CgogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qIFRYIFN0YXRpc3RpY3MgKi8KICBpZiAoISh0bE1ldGFJbmZvLnVjQmNhc3QgfHwgdGxNZXRhSW5mby51Y01jYXN0KSkKICB7CiAgICAvKiBUaGlzIGlzIFRYIFVDIGZyYW1lICovCiAgICBwU3RhQ2xpZW50LT50cmFmZmljU3RhdGlzdGljcy50eFVDRmNudCsrOwogICAgcFN0YUNsaWVudC0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0JjbnQgKz0gdXNQa3RMZW47CiAgfQoKI2lmbmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFVwZGF0ZSB0eCBjb3VudGVyIGZvciBCQSBzZXNzaW9uIHF1ZXJ5IGZvciB0eCBzaWRlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFN0YUNsaWVudC0+YXVUeENvdW50W3VjVGlkXSsrOwojZWxzZQogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5hdVR4Q291bnRbdWNUaWRdKys7CiNlbmRpZgoKICAvKiBUaGlzIGNvZGUgaXMgdG8gc2VuZCB0cmFmZmljIHdpdGggbG93ZXIgcHJpb3JpdHkgQUMgd2hlbiB3ZSBkb2VzIG5vdCAKICAgICBnZXQgYWRtaXR0ZWQgdG8gc2VuZCBpdC4gVG9kYXkgSEFMIGRvZXMgbm90IGRvd25ncmFkZSBBQyBzbyB0aGlzIGNvZGUgCiAgICAgZG9lcyBub3QgZ2V0IGV4ZWN1dGVkLihJbiBvdGhlciB3b3JkcywgSEFMIGRvZXNuknQgY2hhbmdlIHRpZC4gVGhlIGlmIAogICAgIHN0YXRlbWVudCBpcyBhbHdheXMgZmFsc2UuKQogICAgIE5PVEU6IEluIHRoZSBjYXNlIG9mIExBIGRvd25ncmFkZSBvY2N1cnMgaW4gSEREICh0aGF0IHdhcyB0aGUgY2hhbmdlIAogICAgIFBoYW5pIG1hZGUgZHVyaW5nIFdNTS1BQyBwbHVnZmVzdCkuIElmIFdNICYgQk1QIGFsc28gdG9vayB0aGlzIGFwcHJvYWNoLCAKICAgICB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gbmVlZCBmb3IgYW55IEFDIGRvd25ncmFkZSBsb2dpYyBpbiBUTC9XREkuICAgKi8KI2lmIDAKICBpZiAoKCB1Y1RpZCAhPSB0bE1ldGFJbmZvLnVjVElEICkgJiYKICAgICAgKCAwICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApICYmIAogICAgICAoIDAgIT0gdWNTd0ZybVh0bCApKQogIHsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICEhIEZJWCBtZTogT25jZSBkb3duZ3JhZGluZyBpcyBjbGVhciBwdXQgaW4gdGhlIHByb3BlciBjaGFuZ2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB1Y1FDT2Zmc2V0ID0gV0xBTkhBTF9UWF9CRF9IRUFERVJfU0laRSArIFdMQU5UTF84MDJfMTFfSEVBREVSX0xFTjsKCiAgICAvLyEhIUZpeCB0aGlzIHJlcGxhY2UgcGVlayB3aXRoIGV4dHJhY3QgCiAgICB2b3NfcGt0X3BlZWtfZGF0YSggdm9zRGF0YUJ1ZmYsIHVjUUNPZmZzZXQsKHZfUFZPSURfdCkmcHVjUW9zQ3RybCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnB1Y1Fvc0N0cmwpKTsKICAgICpwdWNRb3NDdHJsID0gdWNUaWQ7IC8vPyBwcm9wZXIgYnl0ZSBvcmRlcgogIH0KI2VuZGlmCgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmaWxsIEJEICVkIiwgdm9zU3RhdHVzKSk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBTdGFDbGllbnQtPnBmblNUQVR4Q29tcCApOwoKICAqcHZvc0RhdGFCdWZmID0gdm9zRGF0YUJ1ZmY7CgogIC8qQkUgJiBCSyBjYW4gYmUgZGVsYXllZCwgVk8gYW5kIFZJIG5vdCBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogIGlmICggcFN0YUNsaWVudC0+dWNTZXJ2aWNlZEFDID4gV0xBTlRMX0FDX0JFICkgCiAgewogICAgcFRMQ2ItPmJVcmdlbnQ9IFRSVUU7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVR4QXV0aCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFUeERpc2MKCiAgREVTQ1JJUFRJT04KICAgIFRyYW5zbWl0IGluIGRpc2Nvbm5lY3RlZCBzdGF0ZSAtIG5vIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBVHhEaXNjCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZgopCnsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgIHBUTENiICAgICAgID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVR4QXV0aCIpKTsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFcnJvcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAiV0xBTiBUTDpQYWNrZXQgc2hvdWxkIG5vdCBiZSB0cmFuc21pdHRlZCBpbiBzdGF0ZSBkaXNjb25uZWN0ZWQgaWdub3JpbmciCiAgICAgICAgICAgICIgcmVxdWVzdCIpKTsKCiAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDE7CiAgIAogICAvL1Nob3VsZCBub3QgYmUgYW55dGhpbmcgcGVuZGluZyBpbiBkaXNjb25uZWN0IHN0YXRlCiAgIHZvc19hdG9taWNfc2V0X1U4KCAmcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nLCAwKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFUeERpc2MgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBUnhDb25uCgogIERFU0NSSVBUSU9OCiAgICBSZWNlaXZlIGluIGNvbm5lY3RlZCBzdGF0ZSAtIG9ubHkgRUFQT0wKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB0eC9yeCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVJ4Q29ubgooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgICAgICBwVExDYiA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICBwQ2xpZW50U1RBID0gTlVMTDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gMDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzUGt0TGVuOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVMZW47CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNBY3R1YWxITGVuID0gMDsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgIHZvc1N0YXR1cyAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZjsKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgIGF1Y0JESGVhZGVyOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNUaWQ7CiAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSAgICB3UnhNZXRhSW5mbzsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfU1RBUnhDb25uIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwLypTd2FwIEJEKi8gKTsKCiAgaWYgKCBOVUxMID09IGF1Y0JESGVhZGVyICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgIFZPU19BU1NFUlQoIDAgKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKCiAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQoYXVjQkRIZWFkZXIpOwogIHVzTVBEVURPZmZzZXQgPSAodl9VMTZfdClXREFfR0VUX1JYX01QRFVfREFUQV9PRkZTRVQoYXVjQkRIZWFkZXIpOwogIHVzTVBEVUxlbiAgICAgPSAodl9VMTZfdClXREFfR0VUX1JYX01QRFVfTEVOKGF1Y0JESGVhZGVyKTsKICB1Y01QRFVITGVuICAgID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX0xFTihhdWNCREhlYWRlcik7CiAgdWNUaWQgICAgICAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoYXVjQkRIZWFkZXIpOwoKICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgJnVzUGt0TGVuKTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBwcm9jZXNzaW5nIGRhdGE6IEhPICVkIERPICVkIExlbiAlZCBITGVuICVkIiwKICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQsIHVzTVBEVURPZmZzZXQsIHVzTVBEVUxlbiwgdWNNUERVSExlbikpOwoKICAgIC8qSXQgd2lsbCBjdXQgb3V0IHRoZSA4MDIuMTEgaGVhZGVyIGlmIG5vdCB1c2VkKi8KICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfVHJpbVJ4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYgKSApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRFdGhlclR5cGUoYXVjQkRIZWFkZXIsdm9zRGF0YUJ1ZmYsdWNNUERVSExlbiwmdXNFdGhlclR5cGUpOwogIAogIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCiAgewojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgIC8qIElmIGZyYW1lIGlzIG5laXRoZXIgYW4gRUFQT0wgZnJhbWUgbm9yIGEgV0FJIGZyYW1lIHRoZW4gd2UgZHJvcCB0aGUgZnJhbWUqLwogICAgLyogVE9ETzogRG8gd2UgbmVlZCBhIGNoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gV0FQSSBtb2RlPyBJZiBub3QgaXMgaXQgcG9zc2libGUgKi8KICAgIC8qIHRoYXQgd2UgZ2V0IGFuIEVBUE9MIHBhY2tldCBpbiBXQVBJIG1vZGUgb3IgdmljZSB2ZXJzYT8gKi8KICAgIGlmICggV0xBTlRMX0xMQ184MDIxWF9UWVBFICAhPSB1c0V0aGVyVHlwZSAmJiBXTEFOVExfTExDX1dBSV9UWVBFICAhPSB1c0V0aGVyVHlwZSApCiAgICB7CiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6UlggRnJhbWUgbm90IEVBUE9MIG9yIFdBSSBFdGhlclR5cGUgJWQgLSBkcm9wcGluZyIsIHVzRXRoZXJUeXBlICk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICB9CiNlbHNlCiAgICBpZiAoIFdMQU5UTF9MTENfODAyMVhfVFlQRSAgIT0gdXNFdGhlclR5cGUgKQogICAgewogICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSWCBGcmFtZSBub3QgRUFQT0wgRXRoZXJUeXBlICVkIC0gZHJvcHBpbmciLCB1c0V0aGVyVHlwZSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwogICAgZWxzZSAvKiBGcmFtZSBpcyBhbiBFQVBPTCBmcmFtZSBvciBhIFdBSSBmcmFtZSovICAKICAgIHsKCiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6UlggRnJhbWUgIEVBUE9MIEV0aGVyVHlwZSAlZCAtIHByb2Nlc3NpbmciLCB1c0V0aGVyVHlwZSk7CgogICAgICBpZiAoKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikgKSAmJgogICAgICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uKSkKICAgICAgewogICAgICBpZiAodXNNUERVRE9mZnNldCA+IHVjTVBEVUhPZmZzZXQpCiAgICAgIHsKICAgICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgICAgIH0KCiAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsIHVzQWN0dWFsSExlbiwgCiAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYiwgdWNTVEFJZCk7CgogICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIAogICAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHRvIHRyYW5zbGF0ZSBmcm9tIDgwMi4xMSB0byA4MDIuMyAtIGRyb3BwaW5nIikpOwogICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgICAgIH0KICAgICAgfQogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgSW5jcmVtZW50IHJlY2VpdmUgY291bnRlcgogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgaWYgKCAhV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkgKSAKICAgICAgewogICAgICAgIHBDbGllbnRTVEEtPmF1UnhDb3VudFt1Y1RpZF0rKzsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgdGlkICAlZCAoU3RhdGlvbiBJRCAlZCkgb24gJXMiLAogICAgICAgICAgICAgICB1Y1RpZCwgdWNTVEFJZCwgX19mdW5jX18pKTsKICAgICAgfQoKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6U2VuZGluZyBFQVBvTCBmcmFtZSB0byBzdGF0aW9uICVkIEFDICVkIiwgdWNTVEFJZCwgdWNUaWQpKTsKCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAhISFBc3N1bWluZyBUSUQgPSBVUCBtYXBwaW5nIAogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgd1J4TWV0YUluZm8udWNVUCA9IHVjVGlkOwoKICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAiV0xBTiBUTCAlczpTZW5kaW5nIGRhdGEgY2hhaW4gdG8gc3RhdGlvbiBcbiIsIF9fZnVuY19fKSk7CiAgICAgIGlmICggV0xBTl9TVEFfU09GVEFQID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlICkKICAgICAgewogICAgICAgIHdSeE1ldGFJbmZvLnVjRGVzU1RBSWQgPSBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRDsKICAgICAgICBwQ2xpZW50U1RBLT5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgcENsaWVudFNUQS0+cGZuU1RBUngoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiwgdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd1J4TWV0YUluZm8gKTsKICAgIH0vKkVBUE9MIGZyYW1lIG9yIFdBSSBmcmFtZSovCiAgfS8qdm9zIHN0YXR1cyBzdWNjZXNzKi8KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFSeENvbm4gKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfRndkUGt0VG9IREQKCiAgREVTQ1JJUFRJT04KICAgIERldGVybWluZSB0aGUgRGVzdGF0aW9uIFN0YXRpb24gSUQgYW5kIHJvdXRlIHRoZSBGcmFtZSB0byBVcHBlciBMYXllcgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHJ4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KClZPU19TVEFUVVMKV0xBTlRMX0Z3ZFBrdFRvSERECigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90KiAgICAgcHZvc0RhdGFCdWZmLAogIHZfVThfdCAgICAgICAgICB1Y1NUQUlkCikKewogICB2X01BQ0FERFJfdCAgICAgICAgICAgICAgRGVzdE1hY0FkZHJlc3M7CiAgIHZfTUFDQUREUl90ICAgICAgICAgICAgICAqcERlc3RNYWNBZGRyZXNzID0gJkRlc3RNYWNBZGRyZXNzOwogICB2X1NJWkVfdCAgICAgICAgICAgICAgICAgdXNNYWNBZGRTaXplID0gVk9TX01BQ19BRERSX1NJWkU7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgICAgICBwVExDYiA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICBwQ2xpZW50U1RBID0gTlVMTDsKICAgdm9zX3BrdF90KiAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmIDsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgIFNUQU1ldGFJbmZvOwogICB2b3NfcGt0X3QqICAgICAgICAgICAgICAgdm9zTmV4dERhdGFCdWZmIDsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjRGVzU1RBSWQ7CiAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSAgICB3UnhNZXRhSW5mbzsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSBwdm9zRGF0YUJ1ZmYgKSkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0Z3ZFBrdFRvSGRkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9Gd2RQa3RUb0hkZCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZihXTEFOVExfU1RBX0lEX0lOVkFMSUQodWNTVEFJZCkpCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJ1Y1NUQUlkICVkIGlzIG5vdCB2YWxpZCIsCiAgICAgICAgICAgICAgICAgdWNTVEFJZCkpOwogICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICAgLyogVGhpcyB0aGUgY2hhbmdlIHJlcXVpcmVkIGZvciBTb2Z0QXAgdG8gaGFuZGxlIFJlb3JkZXJlZCBCdWZmZXIuIFNpbmNlIGEgU1RBCiAgICAgIG1heSBoYXZlIHBhY2tldHMgZGVzdGluZWQgdG8gbXVsdGlwbGUgZGVzdGluYXRpb25zIHdlIGhhdmUgdG8gcHJvY2VzcyBlYWNoIHBhY2tldAogICAgICBhdCBhIHRpbWUgYW5kIGRldGVybWluZSBpdHMgRGVzdGluYXRpb24uIFNvIHRoZSBWb3NjaGFpbiBwcm92aWRlZCBieSBSZW9yZGVyIGNvZGUKICAgICAgaXMgdW5jaGFpbiBhbmQgZm9yd2FyZGVkIHRvIFVwcGVyIExheWVyIGFmdGVyIERldGVybWluaW5nIHRoZSBEZXN0aW5hdGlvbiAqLwoKICAgdm9zRGF0YUJ1ZmYgPSBwdm9zRGF0YUJ1ZmY7CiAgIHdoaWxlICh2b3NEYXRhQnVmZiAhPSBOVUxMKQogICB7CiAgICAgIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc0RhdGFCdWZmLCAmdm9zTmV4dERhdGFCdWZmLCAxLyp0cnVlKi8gKTsKICAgICAgdm9zX3BrdF9nZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90ICopJlNUQU1ldGFJbmZvICk7CiAgICAgIHdSeE1ldGFJbmZvLnVjVVAgPSAodl9VOF90KShTVEFNZXRhSW5mbyAmIFdMQU5UTF9BQ19NQVNLKTsKICAgICAgdWNEZXNTVEFJZCA9ICh2X1U4X3QpKChTVEFNZXRhSW5mbykgPj4gV0xBTlRMX1NUQUlEX09GRlNFVCk7IAogICAgICAgCiAgICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NEYXRhQnVmZiwgMCwgKHZfVk9JRF90ICopcERlc3RNYWNBZGRyZXNzLCAmdXNNYWNBZGRTaXplKTsKICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgICAgewogICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogcmVjdiBjb3JydXB0ZWQgZGF0YSBwYWNrZXRcbiIpKTsKICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgfQoKICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCJzdGF0aW9uIG1hYyAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgcERlc3RNYWNBZGRyZXNzLT5ieXRlc1swXSwgcERlc3RNYWNBZGRyZXNzLT5ieXRlc1sxXSwgcERlc3RNYWNBZGRyZXNzLT5ieXRlc1syXSwKICAgICAgICAgICAgICAgICAgICAgICBwRGVzdE1hY0FkZHJlc3MtPmJ5dGVzWzNdLCBwRGVzdE1hY0FkZHJlc3MtPmJ5dGVzWzRdLCBwRGVzdE1hY0FkZHJlc3MtPmJ5dGVzWzVdKSk7CgogICAgICBpZiAodm9zX2lzX21hY2FkZHJfYnJvYWRjYXN0KCBwRGVzdE1hY0FkZHJlc3MgKSB8fCB2b3NfaXNfbWFjYWRkcl9ncm91cChwRGVzdE1hY0FkZHJlc3MpKQogICAgICB7CiAgICAgICAgICAvLyBkZXN0aW5hdGlvbiBpcyBtYy9iYyBzdGF0aW9uCiAgICAgICAgICB1Y0Rlc1NUQUlkID0gV0xBTl9SWF9CQ01DX1NUQV9JRDsKICAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICIlczogQkMvTUMgcGFja2V0LCBpZCAlZFxuIiwgX19mdW5jX18sIFdMQU5fUlhfQkNNQ19TVEFfSUQpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgaWYgKHZvc19pc19tYWNhZGRyX2VxdWFsKHBEZXN0TWFjQWRkcmVzcywgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcykpCiAgICAgICAgIHsKICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gaXMgQVAgaXRzZWxmCiAgICAgICAgICAgIHVjRGVzU1RBSWQgPSBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRDsKICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgICIlczogcGFja2V0IHRvIEFQIGl0c2VsZiwgaWQgJWRcbiIsIF9fZnVuY19fLCBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRCkpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKCggV0xBTl9NQVhfU1RBX0NPVU5UIDw9IHVjRGVzU1RBSWQgKSB8fCAoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0Rlc1NUQUlkXSAmJiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0Rlc1NUQUlkXS0+dWNFeGlzdHMgPT0gMCkpCiAgICAgICAgIHsKICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gc3RhdGlvbiBpcyBzb21ldGhpbmcgZWxzZQogICAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAiJXM6IGdldCBhbiBzdGF0aW9uIGluZGV4IGxhcmdlciB0aGFuIFdMQU5fTUFYX1NUQV9DT1VOVCAlZFxuIiwgX19mdW5jX18sIHVjRGVzU1RBSWQpKTsKICAgICAgICAgICAgdWNEZXNTVEFJZCA9IFdMQU5fUlhfU0FQX1NFTEZfU1RBX0lEOwogICAgICAgICB9CgogICAgICAgICAKICAgICAgICAgLy9sb29wYmFjayB1bmljYXN0IHN0YXRpb24gY29tZXMgaGVyZQogICAgICB9CgogICAgICB3UnhNZXRhSW5mby51Y1VQID0gKHZfVThfdCkoU1RBTWV0YUluZm8gJiBXTEFOVExfQUNfTUFTSyk7CiAgICAgIHdSeE1ldGFJbmZvLnVjRGVzU1RBSWQgPSB1Y0Rlc1NUQUlkOwogICAgIAogICB2b3NTdGF0dXMgPSBwQ2xpZW50U1RBLT5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y0Rlc1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOwogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiBmYWlsZWQgdG8gc2VuZCBwa3QgdG8gSEREIFxuIikpOwogICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgfQogICAgICB2b3NEYXRhQnVmZiA9IHZvc05leHREYXRhQnVmZjsKICAgfQogICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4QXV0aAoKICBERVNDUklQVElPTgogICAgUmVjZWl2ZSBpbiBhdXRoZW50aWNhdGVkIHN0YXRlIC0gYWxsIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHJ4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUnhBdXRoCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZgopCnsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgIHBDbGllbnRTVEEgPSBOVUxMOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNBc2Y7IC8qIEFNU0RVIHN1YiBmcmFtZSAqLwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNNUERVRE9mZnNldDsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQ7CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVMZW47CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNBY3R1YWxITGVuID0gMDsgICAKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjVGlkOwojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gMDsKI2VuZGlmCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c1BrdExlbjsKICAgdm9zX3BrdF90KiAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmIDsKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgIGF1Y0JESGVhZGVyOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzOwogICBXTEFOVExfUnhNZXRhSW5mb1R5cGUgICAgd1J4TWV0YUluZm87CiAgIHN0YXRpYyB2X1U4X3QgICAgICAgICAgICB1Y1BNUERVSExlbjsKICAgdl9VMzJfdCogICAgICAgICAgICAgICAgICBTVEFNZXRhSW5mb1B0cjsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjRXNmPTA7IC8qIGZpcnN0IHN1YmZyYW1lIG9mIEFNU0RVIGZsYWcgKi8KICAgdl9VNjRfdCAgICAgICAgICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyPTA7IC8qY3VycmVudCByZXBsYXkgY291bnRlciovCiAgIHZfVTY0X3QgICAgICAgICAgICAgICAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXI9MDsgLypwcmV2aW91cyByZXBsYXkgY291bnRlciovCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1Y1VuaWNhc3RCcm9hZGNhc3RUeXBlPTA7IC8qSXQgZGVub3RlcyB3aGV0aGVyIHJlY2VpdmVkIGZyYW1lIGlzIFVDIG9yIEJDKi8KICAgc3RydWN0IF9CQVJGcm1TdHJ1Y3QgICAgICpwQmFyRnJhbWUgPSBOVUxMOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeEF1dGgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVJ4QXV0aCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwICk7CgogIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICB1c01QRFVET2Zmc2V0ID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICB1c01QRFVMZW4gICAgID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0xFTihhdWNCREhlYWRlcik7CiAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4oYXVjQkRIZWFkZXIpOwogIHVjVGlkICAgICAgICAgPSAodl9VOF90KVdEQV9HRVRfUlhfVElEKGF1Y0JESGVhZGVyKTsKCiAgLyogRml4IGZvciBhIGhhcmR3YXJlIGJ1Zy4gCiAgICogSC9XIGRvZXMgbm90IHVwZGF0ZSB0aGUgdGlkIGZpZWxkIGluIEJEIGhlYWRlciBmb3IgQkFSIGZyYW1lcy4KICAgKiBGaXggaXMgdG8gcmVhZCB0aGUgdGlkIGZpZWxkIGZyb20gTUFDIGhlYWRlciBvZiBCQVIgZnJhbWUgKi8KICBpZiggKFdEQV9HRVRfUlhfVFlQRShhdWNCREhlYWRlcikgPT0gU0lSX01BQ19DVFJMX0ZSQU1FKSAmJgogICAgICAoV0RBX0dFVF9SWF9TVUJUWVBFKGF1Y0JESGVhZGVyKSA9PSBTSVJfTUFDX0NUUkxfQkFSKSkKICB7CiAgICAgIHBCYXJGcmFtZSA9IChzdHJ1Y3QgX0JBUkZybVN0cnVjdCAqKShXREFfR0VUX1JYX01BQ19IRUFERVIoYXVjQkRIZWFkZXIpKTsKICAgICAgdWNUaWQgPSBwQmFyRnJhbWUtPmJhckNvbnRyb2wubnVtVElEOwogIH0KCiAgLypIb3N0IGJhc2VkIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgZm9yIHVuaWNhc3QgZGF0YSBmcmFtZXMqLwogIHVjVW5pY2FzdEJyb2FkY2FzdFR5cGUgID0gKHZfVTE2X3QpV0RBX0lTX1JYX0JDQVNUKGF1Y0JESGVhZGVyKTsKICBpZigwICE9IHVjTVBEVUhMZW4pCiAgewogICAgdWNQTVBEVUhMZW4gPSB1Y01QRFVITGVuOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBwcm9jZXNzaW5nIGRhdGE6IEhPICVkIERPICVkIExlbiAlZCBITGVuICVkIgogICAgICAgICAgICAgIiBUaWQgJWQgQkQgJWQiLAogICAgICAgICAgICAgdWNNUERVSE9mZnNldCwgdXNNUERVRE9mZnNldCwgdXNNUERVTGVuLCB1Y01QRFVITGVuLCB1Y1RpZCwKICAgICAgICAgICAgIFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUpKTsKCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsICZ1c1BrdExlbik7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19UcmltUnhQYWNrZXRJbmZvKCB2b3NEYXRhQnVmZiApICkKICB7CiAgICBpZigoV0RBX0dFVF9SWF9BU0YoYXVjQkRIZWFkZXIpICYmICFXREFfR0VUX1JYX0VTRihhdWNCREhlYWRlcikpKQogIHsKICAgIC8qIEFNU0RVIGNhc2UsIHVjTVBEVUhPZmZzZXQgPSAwCiAgICAgKiBpdCBzaG91bGQgYmUgaGFuY2RsZWQgc2VwZXJhdGx5ICovCiAgICBpZigoIHVzTVBEVURPZmZzZXQgPiAgdWNNUERVSE9mZnNldCApICYmCiAgICAgICAoIHVzTVBEVUxlbiAgICAgPj0gdWNNUERVSExlbiApICYmICggdXNQa3RMZW4gPj0gdXNNUERVTGVuICkgJiYKICAgICAgICggIVdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkgKSkKICAgIHsKICAgICAgICB1Y01QRFVIT2Zmc2V0ID0gdXNNUERVRE9mZnNldCAtIFdMQU5UTF9NUERVX0hFQURFUl9MRU47IAogICAgfQogICAgZWxzZQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0lzV2FwaVN0YSApCiAgewogICAgdm9zU3RhdHVzID0gV0xBTlRMX0dldEV0aGVyVHlwZShhdWNCREhlYWRlciwgdm9zRGF0YUJ1ZmYsIHVjTVBEVUhMZW4sICZ1c0V0aGVyVHlwZSk7CiAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQogICAgewogICAgICBpZiAoIFdMQU5UTF9MTENfV0FJX1RZUEUgID09IHVzRXRoZXJUeXBlICkKICAgICAgeyAgICAgICAgCiAgICAgICAgaWYgKCAhKCBXTEFOSEFMX1JYX0lTX1VOUFJPVEVDVEVEX1dQSV9GUkFNRShhdWNCREhlYWRlcikpICkKICAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOldBSSBmcmFtZSB3YXMgcmVjZWl2ZWQgZW5jcnlwdGVkIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgLypUZW1wb3JhcnkgZml4IGFkZGVkIHRvIGZpeCB3YXBpIHJla2V5IGlzc3VlKi8KICAgICAgICAgIC8vdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgIC8vcmV0dXJuIHZvc1N0YXR1czsgLy9yZXR1cm5pbmcgc3VjY2VzcwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiAoICBXTEFOSEFMX1JYX0lTX1VOUFJPVEVDVEVEX1dQSV9GUkFNRShhdWNCREhlYWRlcikgKSAKICAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOk5vbi1XQUkgZnJhbWUgd2FzIHJlY2VpdmVkIHVuZW5jcnlwdGVkIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsgCiAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOyAvL3JldHVybmluZyBzdWNjZXNzCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlIC8vY291bGQgbm90IGV4dHJhY3QgRXRoZXJUeXBlIC0gdGhpcyBzaG91bGQgbm90IGhhcHBlbgogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q291bGQgbm90IGV4dHJhY3QgRXRoZXJUeXBlIikpOwogICAgICAvL1BhY2tldCBpcyBhbHJlYWR5IGZyZWVkCiAgICAgIHJldHVybiB2b3NTdGF0dXM7IC8vcmV0dXJuaW5nIGZhaWx1cmUKICAgIH0KICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEluY3JlbWVudCByZWNlaXZlIGNvdW50ZXIKICAgICEhIG5vdCBzdXJlIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UgdG8gaW5jcmVhc2UgdGhpcyAtIHBrdCBtaWdodCBiZQogICAgZHJvcHBlZCBiZWxvdyBvciBkZWxheWVkIGluIFRMJ3MgcXVldWVzCiAgICAtIHdpbGwgbGVhdmUgaXQgaGVyZSBmb3Igbm93CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAhV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkgKSAKICB7CiAgICBwQ2xpZW50U1RBLT5hdVJ4Q291bnRbdWNUaWRdKys7CiAgfQogIGVsc2UKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCB0aWQgICVkIChTdGF0aW9uIElEICVkKSBvbiAlcyIsCiAgICAgICAgICAgdWNUaWQsIHVjU1RBSWQsIF9fZnVuY19fKSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgQU1TRFUgYW5kIHNlbmQgZm9yIHByb2Nlc3NpbmcgaWYgc28KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y0FzZiA9ICh2X1U4X3QpV0RBX0dFVF9SWF9BU0YoYXVjQkRIZWFkZXIpOwoKICBpZiAoIDAgIT0gdWNBc2YgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOlBhY2tldCBpcyBBTVNEVSBzdWIgZnJhbWUgLSBzZW5kaW5nIGZvciBjb21wbGV0aW9uIikpOwogICAgdm9zU3RhdHVzID0gV0xBTlRMX0FNU0RVUHJvY2VzcyggcHZvc0dDdHgsICZ2b3NEYXRhQnVmZiwgYXVjQkRIZWFkZXIsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCB1c01QRFVMZW4gKTsKICAgIGlmKE5VTEwgPT0gdm9zRGF0YUJ1ZmYpCiAgICB7CiAgICAgICAvL1BhY2tldCBpcyBhbHJlYWR5IGZyZWVkCiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgfQogIH0KICAvKiBBZnRlciBBTVNEVSBoZWFkZXIgaGFuZGxlZAogICAqIEFNU0RVIGZyYW1lIGp1c3Qgc2FtZSB3aXRoIG5vcm1hbCBmcmFtZXMgKi8KICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBUcmFuc2xhdGluZyBoZWFkZXIgaWYgbmVjZXNhcnkKICAgICAgICEhIEZpeCBtZTogcm12IGNvbW1lbnRzIGJlbG93CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikgKSAmJgogICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uKSAmJgogICAgICAoIFdMQU5UTF9JU19EQVRBX0ZSQU1FKFdEQV9HRVRfUlhfVFlQRV9TVUJUWVBFKGF1Y0JESGVhZGVyKSkgKSkKICB7CiAgICBpZigwID09IHVjTVBEVUhMZW4pCiAgICB7CiAgICAgIHVjTVBEVUhMZW4gPSB1Y1BNUERVSExlbjsKICAgIH0KICAgIGlmICh1c01QRFVET2Zmc2V0ID4gdWNNUERVSE9mZnNldCkKICAgIHsKICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgICB9CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLCB1c0FjdHVhbEhMZW4sIAogICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYiwgdWNTVEFJZCk7CgogICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gdHJhbnNsYXRlIGZyb20gODAyLjExIHRvIDgwMi4zIC0gZHJvcHBpbmciKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgIH0KICAgIH0KICAgIC8qIFNvZnRhcCByZXF1aXJlcyBhZGRpdGlvbmFsIEluZm8gc3VjaCBhcyBEZXN0aW5hdGlvbiBTVEFJRCBhbmQgQWNjZXNzCiAgICAgICBDYXRlZ29yeS4gVm9zY2hhaW4gb3IgQnVmZmVyIHJldHVybmVkIGJ5IEJBIHdvdWxkIGJlIHVuY2hhaW4gYW5kIHRoaXMKICAgICAgIE1ldGEgRGF0YSB3b3VsZCBoZWxwIGluIHJvdXRpbmcgdGhlIHBhY2tldHMgdG8gYXBwcm9wcmlhdGUgRGVzdGluYXRpb24gKi8KICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICB7CiAgICAgICBTVEFNZXRhSW5mb1B0ciA9ICh2X1UzMl90ICopKHVjVGlkIHwgKFdEQV9HRVRfUlhfQUREUjNfSURYKGF1Y0JESGVhZGVyKSA8PCBXTEFOVExfU1RBSURfT0ZGU0VUKSk7CiAgICAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpU1RBTWV0YUluZm9QdHIpOwogICAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgdG8gc2VlIGlmIHJlLW9yZGVyaW5nIHNlc3Npb24gaXMgaW4gcGxhY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgIT0gcENsaWVudFNUQS0+YXRsQkFSZW9yZGVySW5mb1t1Y1RpZF0udWNFeGlzdHMgKQogIHsKICAgIFdMQU5UTF9NU0RVUmVvcmRlciggcFRMQ2IsICZ2b3NEYXRhQnVmZiwgYXVjQkRIZWFkZXIsIHVjU1RBSWQsIHVjVGlkICk7CiAgfQoKaWYoMCA9PSB1Y1VuaWNhc3RCcm9hZGNhc3RUeXBlCiNpZmRlZiBGRUFUVVJFX09OX0NISVBfUkVPUkRFUklORwogICAmJiAoV0xBTkhBTF9Jc09uQ2hpcFJlb3JkZXJpbmdFbmFibGVkRm9yVElEKHB2b3NHQ3R4LCB1Y1NUQUlkLCB1Y1RpZCkgIT0gVFJVRSkKI2VuZGlmCikKewogIC8qIHJlcGxheSBjaGVjayBjb2RlIDogY2hlY2sgd2hldGhlciByZXBsYXkgY2hlY2sgaXMgbmVlZGVkIG9yIG5vdCAqLwogIGlmKFZPU19UUlVFID09IHBDbGllbnRTVEEtPnVjSXNSZXBsYXlDaGVja1ZhbGlkKQogIHsKICAgICAgLyogcmVwbGF5IGNoZWNrIGlzIG5lZWRlZCBmb3IgdGhlIHN0YXRpb24gKi8KCiAgICAgIC8qIGNoZWNrIHdoZXRoZXIgZnJhbWUgaXMgQU1TRFUgZnJhbWUgKi8KICAgICAgaWYgKCAwICE9IHVjQXNmICkKICAgICAgewogICAgICAgICAgLyogU2luY2UgdmlyZ28gY2FuJ3Qgc2VuZCBBTVNEVSBmcmFtZXMgdGhpcyBsZWcgb2YgdGhlIGNvZGUgCiAgICAgICAgICAgICB3YXMgbm90IHRlc3RlZCBwcm9wZXJseSwgaXQgbmVlZHMgdG8gYmUgdGVzdGVkIHByb3Blcmx5Ki8KICAgICAgICAgIC8qIEZyYW1lIGlzIEFNU0RVIGZyYW1lLiBBcyBwZXIgODAyLjExbiBvbmx5IGZpcnN0CiAgICAgICAgICAgICBzdWJmcmFtZSB3aWxsIGhhdmUgcmVwbGF5IGNvdW50ZXIgKi8KICAgICAgICAgIHVjRXNmID0gIFdEQV9HRVRfUlhfRVNGKCBhdWNCREhlYWRlciApOwogICAgICAgICAgaWYoIDAgIT0gdWNFc2YgKQogICAgICAgICAgewogICAgICAgICAgICAgIHZfQk9PTF90IHN0YXR1czsKICAgICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCByZXBsYXkgY291bnRlciBmcm9tIHRoZSBSWCBCRCAqLwogICAgICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gV0RBX0RTX0dldFJlcGxheUNvdW50ZXIoYXVjQkRIZWFkZXIpOwogCiAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6IEFNU0RVIGN1cnJlbnRSZXBsYXlDb3VudGVyIFsweCVsbFhdXG4iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCBwcmV2aW91cyByZXBsYXkgY291bnRlciBmcm9tIFRMIGNvbnRyb2wgIGJsb2NrICovCiAgICAgICAgICAgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyID0gcENsaWVudFNUQS0+dWxsUmVwbGF5Q291bnRlclt1Y1RpZF07CgogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBBTVNEVSBwcmV2aW91c1JlcGxheUNvdW50ZXIgWzB4JWxsWF1cbiIsdWxscHJldmlvdXNSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgICAgLyogSXQgaXMgZmlyc3Qgc3ViZnJhbWUgb2YgQU1TRFUgdGh1cyBpdAogICAgICAgICAgICAgICAgIGNvbmF0YWlucyByZXBsYXkgY291bnRlciBwZXJmb3JtIHRoZQogICAgICAgICAgICAgICAgIHJlcGxheSBjaGVjayBmb3IgdGhpcyBmaXJzdCBzdWJmcmFtZSovCiAgICAgICAgICAgICAgc3RhdHVzID0gIFdMQU5UTF9Jc1JlcGxheVBhY2tldCggdWxsY3VycmVudFJlcGxheUNvdW50ZXIsIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CiAgICAgICAgICAgICAgaWYoVk9TX0ZBTFNFID09IHN0YXR1cykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAvKiBOb3QgYSByZXBsYXkgcGFrZXQsIHVwZGF0ZSBwcmV2aW91cyByZXBsYXkgY291bnRlciBpbiBUTCBDQiAqLyAgICAKICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdID0gdWxsY3VycmVudFJlcGxheUNvdW50ZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgRHJvcCB0aGUgcmVwbGF5IHBhY2tldCB3aXRoIFBOIDogWzB4JWxsWF1cbiIsdWxsY3VycmVudFJlcGxheUNvdW50ZXIpOwoKICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWxUb3RhbFJlcGxheVBhY2tldHNEZXRlY3RlZCsrOwogICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEFNU0RVIHRvdGFsIGRyb3BwZWQgcmVwbGF5IHBhY2tldHMgb24gU1RBIElEICAlWCBpcyBbMHglbFhdXG4iLAogICAgICAgICAgICAgICAgICB1Y1NUQUlkLCAgcENsaWVudFNUQS0+dWxUb3RhbFJlcGxheVBhY2tldHNEZXRlY3RlZCk7CgogICAgICAgICAgICAgICAgICAvKiBEcm9wIHRoZSBwYWNrZXQgKi8KICAgICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICAgdl9CT09MX3Qgc3RhdHVzOwoKICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCByZXBsYXkgY291bnRlciBmcm9tIHRoZSBSWCBCRCAqLwogICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gV0RBX0RTX0dldFJlcGxheUNvdW50ZXIoYXVjQkRIZWFkZXIpOwoKICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgIldMQU4gVEw6IE5vbi1BTVNEVSBjdXJyZW50UmVwbGF5Q291bnRlciBbMHglbGxYXVxuIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CgogICAgICAgICAgIC8qIEdldHRpbmcgNDgtYml0IHByZXZpb3VzIHJlcGxheSBjb3VudGVyIGZyb20gVEwgY29udHJvbCAgYmxvY2sgKi8KICAgICAgICAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIgPSBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXTsKCiAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vbi1BTVNEVSBwcmV2aW91c1JlcGxheUNvdW50ZXIgWzB4JWxsWF1cbiIsdWxscHJldmlvdXNSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgLyogSXQgaXMgbm90IEFNU0RVIGZyYW1lIHNvIHBlcmZvcm0gCiAgICAgICAgICAgICAgcmVhcGx5IGNoZWNrIGZvciBlYWNoIHBhY2tldCwgYXMKICAgICAgICAgICAgICBlYWNoIHBhY2tldCBjb250YWlucyB2YWxpZCByZXBsYXkgY291bnRlciovIAogICAgICAgICAgIHN0YXR1cyA9ICBXTEFOVExfSXNSZXBsYXlQYWNrZXQoIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLCB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIpOwogICAgICAgICAgIGlmKFZPU19GQUxTRSA9PSBzdGF0dXMpCiAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogTm90IGEgcmVwbGF5IHBha2V0LCB1cGRhdGUgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgaW4gVEwgQ0IgKi8gICAgCiAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIERyb3AgdGhlIHJlcGxheSBwYWNrZXQgd2l0aCBQTiA6IFsweCVsbFhdXG4iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVsVG90YWxSZXBsYXlQYWNrZXRzRGV0ZWN0ZWQrKzsKICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIHRvdGFsIGRyb3BwZWQgcmVwbGF5IHBhY2tldHMgb24gU1RBIElEICVYIGlzIFsweCVsWF1cbiIsCiAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKTsKCiAgICAgICAgICAgICAgIC8qIFJlcGFseSBwYWNrZXQsIGRyb3AgdGhlIHBhY2tldCAqLwogICAgICAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgICAgICAgIH0KICAgICAgfQogIH0KfQovKkl0IGlzIGEgYnJvYWRhc3QgcGFja2V0IERQVSBoYXMgYWxyZWFkeSBkb25lIHJlcGxheSBjaGVjayBmb3IgCiAgYnJvYWRjYXN0IHBhY2tldHMgbm8gbmVlZCB0byBkbyByZXBsYXkgY2hlY2sgb2YgdGhlc2UgcGFja2V0cyovCgogIGlmICggTlVMTCAhPSB2b3NEYXRhQnVmZiApCiAgewogICAgaWYoIFdMQU5fU1RBX1NPRlRBUCA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICAgIHsKICAgICAgV0xBTlRMX0Z3ZFBrdFRvSEREKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQgKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgd1J4TWV0YUluZm8udWNVUCA9IHVjVGlkOwogICAgICB3UnhNZXRhSW5mby5yc3NpQXZnID0gcENsaWVudFNUQS0+cnNzaUF2ZzsKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgICAgIGlmIChXTEFOX1NUQV9URExTID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKQogICAgICB7CiAgICAgICAgICB3UnhNZXRhSW5mby5pc1N0YVRkbHMgPSBUUlVFOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgd1J4TWV0YUluZm8uaXNTdGFUZGxzID0gRkFMU0U7CiAgICAgIH0KI2VuZGlmCiAgICAgIHBDbGllbnRTVEEtPnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CiAgICB9CiAgfS8qIGlmIG5vdCBOVUxMICovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBUnhBdXRoICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeERpc2MKCiAgREVTQ1JJUFRJT04KICAgIFJlY2VpdmUgaW4gZGlzY29ubmVjdGVkIHN0YXRlIC0gbm8gZGF0YSBhbGxvd2VkCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgcnggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFSeERpc2MKKAogIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmCikKewogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggTlVMTCA9PSBwdm9zRGF0YUJ1ZmYgKSB8fCAoIE5VTEwgPT0gICpwdm9zRGF0YUJ1ZmYgKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfU1RBUnhEaXNjIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFcnJvciAtIGRyb3AgcGFja2V0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6UGFja2V0IHNob3VsZCBub3QgYmUgcmVjZWl2ZWQgaW4gc3RhdGUgZGlzY29ubmVjdGVkIgogICAgICAgICAgICAgIiAtIGRyb3BwaW5nIikpOwogIHZvc19wa3RfcmV0dXJuX3BhY2tldCgqcHZvc0RhdGFCdWZmKTsKICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFSeERpc2MgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUHJvY2Vzc2luZyBtYWluIGxvb3BzIGZvciBNQUlOIGFuZCBUWCB0aHJlYWRzCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9NY1Byb2Nlc3NNc2cKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBWT1NTIHdoZW4gYSBtZXNzYWdlIHdhcyBzZXJpYWxpemVkIGZvciBUTCB0aHJvdWdoIHRoZQogICAgbWFpbiB0aHJlYWQvdGFzay4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgbWVzc2FnZTogICAgICAgIHR5cGUgYW5kIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX01jUHJvY2Vzc01zZwooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKICB2b3NfbXNnX3QqICAgICAgIG1lc3NhZ2UKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgIHRBZGRCQUluZCogICAgICBwdEFkZEJhSW5kID0gTlVMTDsKICAgdERlbEJBSW5kKiAgICAgIHB0RGVsQmFJbmQgPSBOVUxMOwogICB0QWRkQkFSc3AqICAgICAgcHRBZGRCYVJzcCA9IE5VTEw7CiAgIHZvc19tc2dfdCAgICAgICB2b3NNZXNzYWdlOwogICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzOwogICB0cEZsdXNoQUNSc3AgRmx1c2hBQ1JzcFB0cjsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBtZXNzYWdlICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1Byb2Nlc3NNYWluTWVzc2FnZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUHJvY2Vzc01haW5NZXNzYWdlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6UmVjZWl2ZWQgbWVzc2FnZTogJWQgdGhyb3VnaCBtYWluIGZsb3ciLCBtZXNzYWdlLT50eXBlKSk7CgogIHN3aXRjaCggbWVzc2FnZS0+dHlwZSApCiAgewogIGNhc2UgV0RBX1RMX0ZMVVNIX0FDX1JTUDoKICAgIC8vIEV4dHJhY3QgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBib2R5CiAgICBGbHVzaEFDUnNwUHRyID0gKHRwRmx1c2hBQ1JzcCkobWVzc2FnZS0+Ym9keXB0cik7CiAgICAvLyBNYWtlIHN1cmUgdGhlIGNhbGwgYmFjayBmdW5jdGlvbiBpcyBub3QgbnVsbC4KICAgIGlmICggTlVMTCA9PSBwVExDYi0+dGxCQVBDbGllbnQucGZuRmx1c2hPcENvbXBsZXRlQ2IgKQogICAgewogICAgICBWT1NfQVNTRVJUKDApOwogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgcGZuRmx1c2hPcENvbXBsZXRlQ2IiKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiUmVjZWl2ZWQgbWVzc2FnZTogIEZsdXNoIGNvbXBsZXRlIHJlY2VpdmVkIGJ5IFRMIikpOwoKICAgIC8vIFNpbmNlIHdlIGhhdmUgdGhlIHJlc3BvbnNlIGJhY2sgZnJvbSBIQUwsIGp1c3QgY2FsbCB0aGUgQkFQIGNsaWVudAogICAgLy8gcmVnaXN0ZXJlZCBjYWxsIGJhY2sgZnJvbSBUTC4gVGhlcmUgaXMgb25seSAxIHBvc3NpYmxlCiAgICAvLyBCQVAgY2xpZW50LiBTbyBkaXJlY3RseSByZWZlcmVuY2UgdGxCQVBDbGllbnQKICAgIHBUTENiLT50bEJBUENsaWVudC5wZm5GbHVzaE9wQ29tcGxldGVDYiggcHZvc0dDdHgsCiAgICAgICAgICAgIEZsdXNoQUNSc3BQdHItPnVjU1RBSWQsCiAgICAgICAgICAgIEZsdXNoQUNSc3BQdHItPnVjVGlkLCBGbHVzaEFDUnNwUHRyLT5zdGF0dXMgKTsKCiAgICAvLyBGcmVlIHRoZSBQQUwgbWVtb3J5LCB3ZSBhcmUgZG9uZSB3aXRoIGl0LgogICAgVExMT0cyKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICJGbHVzaCBjb21wbGV0ZSByZWNlaXZlZCBieSBUTDogRnJlZWluZyAlcCIsIEZsdXNoQUNSc3BQdHIpKTsKICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QgKilGbHVzaEFDUnNwUHRyKTsKICAgIGJyZWFrOwoKICBjYXNlIFdEQV9IRERfQUREQkFfUkVROgogICBwdEFkZEJhSW5kID0gKHRBZGRCQUluZCopKG1lc3NhZ2UtPmJvZHlwdHIpOwogICAgdm9zU3RhdHVzID0gV0xBTlRMX0JhU2Vzc2lvbkFkZCggcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5iYVNlc3Npb25JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5TVEFJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5iYVRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVTMyX3QpcHRBZGRCYUluZC0+YmFTZXNzaW9uLmJhQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLndpblNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5TU04pOwogICAgcHRBZGRCYVJzcCA9IHZvc19tZW1fbWFsbG9jKHNpemVvZigqcHRBZGRCYVJzcCkpOwoKICAgIGlmICggTlVMTCA9PSBwdEFkZEJhUnNwICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IGZhdGFsIGZhaWx1cmUsIGNhbm5vdCBhbGxvY2F0ZSBCQSBSc3Agc3RydWN0dXJlIikpOwogICAgICBWT1NfQVNTRVJUKDApOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOwogICAgfQoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogU2VuZGluZyBzdWNjZXNzIGluZGljYXRpb24gdG8gSEFMIGZvciBBREQgQkEiKSk7CiAgICAgIC8qU2VuZCBzdWNjZXNzKi8KICAgICAgcHRBZGRCYVJzcC0+bWVzZ1R5cGUgICAgPSBXREFfSEREX0FEREJBX1JTUDsKICAgICAgdm9zTWVzc2FnZS50eXBlICAgICAgICAgPSBXREFfSEREX0FEREJBX1JTUDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogU2VuZGluZyBmYWlsdXJlIGluZGljYXRpb24gdG8gSEFMIGZvciBBREQgQkEiKSk7CgogICAgICAvKlNlbmQgZmFpbHVyZSovCiAgICAgIHB0QWRkQmFSc3AtPm1lc2dUeXBlICAgID0gV0RBX0JBX0ZBSUxfSU5EOwogICAgICB2b3NNZXNzYWdlLnR5cGUgICAgICAgICA9IFdEQV9CQV9GQUlMX0lORDsKICAgIH0KCiAgICBwdEFkZEJhUnNwLT5tZXNnTGVuICAgICA9IHNpemVvZih0QWRkQkFSc3ApOwogICAgcHRBZGRCYVJzcC0+YmFTZXNzaW9uSUQgPSBwdEFkZEJhSW5kLT5iYVNlc3Npb24uYmFTZXNzaW9uSUQ7CiAgICAgIC8qIFRoaXMgaXMgZGVmYXVsdCwgcmVwbHkgd2luIHNpemUgaGFzIHRvIGJlIGhhbmRsZWQgQkEgbW9kdWxlLCBGSVggVEhJUyAqLwogICAgICBwdEFkZEJhUnNwLT5yZXBseVdpblNpemUgPSBXTEFOVExfTUFYX1dJTlNJWkU7CiAgICB2b3NNZXNzYWdlLmJvZHlwdHIgPSBwdEFkZEJhUnNwOwoKICAgIHZvc19tcV9wb3N0X21lc3NhZ2UoIFZPU19NUV9JRF9XREEsICZ2b3NNZXNzYWdlICk7CiAgICBXTEFOVExfTWNGcmVlTXNnIChwdm9zR0N0eCwgbWVzc2FnZSk7CiAgYnJlYWs7CiAgY2FzZSBXREFfREVMRVRFQkFfSU5EOgogICAgcHREZWxCYUluZCA9ICh0RGVsQkFJbmQqKShtZXNzYWdlLT5ib2R5cHRyKTsKICAgIHZvc1N0YXR1cyAgPSBXTEFOVExfQmFTZXNzaW9uRGVsKHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdERlbEJhSW5kLT5zdGFJZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPmJhVElEKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byBkZWwgQkEgc2Vzc2lvbiBTVEE6JWQgVElEOiVkIFN0YXR1cyA6JWQiLAogICAgICAgICAgICAgICBwdERlbEJhSW5kLT5zdGFJZHgsCiAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPmJhVElELAogICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKICAgIH0KICAgIFdMQU5UTF9NY0ZyZWVNc2cgKHB2b3NHQ3R4LCBtZXNzYWdlKTsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICAvKm5vIHByb2Nlc3NpbmcgZm9yIG5vdyovCiAgICBicmVhazsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUHJvY2Vzc01haW5NZXNzYWdlICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX01jRnJlZU1zZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFZPU1MgdG8gZnJlZSBhIGdpdmVuIFRMIG1lc3NhZ2Ugb24gdGhlIE1haW4gdGhyZWFkIHdoZW4gdGhlcmUKICAgIGFyZSBtZXNzYWdlcyBwZW5kaW5nIGluIHRoZSBxdWV1ZSB3aGVuIHRoZSB3aG9sZSBzeXN0ZW0gaXMgYmVlbiByZXNldC4KICAgIEZvciBub3csIFRMIGRvZXMgbm90IGFsbG9jYXRlIGFueSBib2R5IHNvIHRoaXMgZnVuY3Rpb24gc2hvdXQgdHJhbnNsYXRlCiAgICBpbnRvIGEgTk9PUAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfTWNGcmVlTXNnCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBtZXNzYWdlICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX01jRnJlZU1zZyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfTWNGcmVlTXNnIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6UmVjZWl2ZWQgbWVzc2FnZTogJWQgdGhyb3VnaCBtYWluIGZyZWUiLCBtZXNzYWdlLT50eXBlKSk7CgogIHN3aXRjaCggbWVzc2FnZS0+dHlwZSApCiAgewogIGNhc2UgV0RBX0hERF9BRERCQV9SRVE6CiAgY2FzZSBXREFfREVMRVRFQkFfSU5EOgogICAgLyp2b3MgZnJlZSBib2R5IHBvaW50ZXIqLwogICAgdm9zX21lbV9mcmVlKG1lc3NhZ2UtPmJvZHlwdHIpOwogICAgbWVzc2FnZS0+Ym9keXB0ciA9IE5VTEw7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgLypubyBwcm9jZXNzaW5nIGZvciBub3cqLwogICAgYnJlYWs7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LypXTEFOVExfTWNGcmVlTXNnKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfVHhQcm9jZXNzTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB3aGVuIGEgbWVzc2FnZSB3YXMgc2VyaWFsaXplZCBmb3IgVEwgdGhyb3VnaCB0aGUKICAgIHR4IHRocmVhZC90YXNrLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgT3RoZXIgdmFsdWVzIGNhbiBiZSByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIHBsZWFzZSBjaGVjawogIGNvcnJlc3BvbmRpbmcgQVBJIGZvciBtb3JlIGluZm8uCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhQcm9jZXNzTXNnCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQopCnsKICAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgdl9VMzJfdCAgICAgICAgIHVEYXRhOwogICB2X1U4X3QgICAgICAgICAgdWNTVEFJZDsgCiAgIHZfVThfdCAgICAgICAgICB1Y1VjYXN0U2lnOwogICB2X1U4X3QgICAgICAgICAgdWNCY2FzdFNpZzsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogICBXTEFOVExfQUNFbnVtVHlwZSAgICAgdWNBQzsKICAgdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCk7CiAgIHZvaWQgKmNhbGxiYWNrQ29udGV4dDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBtZXNzYWdlICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1Byb2Nlc3NUeE1lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFByb2Nlc3MgbWVzc2FnZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIHR4IGZsb3ciLCBtZXNzYWdlLT50eXBlKSk7CgogIHN3aXRjaCggbWVzc2FnZS0+dHlwZSApCiAgewogIGNhc2UgV0xBTlRMX1RYX1NJR19TVVNQRU5EOgogICAgdm9zU3RhdHVzID0gV0xBTlRMX1N1c3BlbmRDQiggcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfU3VzcGVuZENCVHlwZSltZXNzYWdlLT5ib2R5cHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5yZXNlcnZlZCk7CiAgICBicmVhazsKICBjYXNlIFdMQU5UTF9UWF9SRVNfTkVFREVEOgogICAgdm9zU3RhdHVzID0gV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IoIHB2b3NHQ3R4ICk7CiAgICAgYnJlYWs7CiAgCiAgY2FzZSBXTEFOVExfVFhfRldEX0NBQ0hFRDoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgVGhlIGRhdGEgc2VudCB3aXRoIHRoZSBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTogCiAgICAgICB8IDAwIHwgdWNCY2FzdFNpZ25hdHVyZSB8IHVjVWNhc3RTaWduYXR1cmUgfCB1Y1NUQUlEIHwKICAgICAgIGVhY2ggZmllbGQgYWJvdmUgaXMgb25lIGJ5dGUKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB1RGF0YSAgICAgICA9ICh2X1UzMl90KW1lc3NhZ2UtPmJvZHlwdHI7IAogICAgdWNTVEFJZCAgICAgPSAoIHVEYXRhICYgMHgwMDAwMDBGRik7IAogICAgdWNVY2FzdFNpZyAgPSAoIHVEYXRhICYgMHgwMDAwRkYwMCk+Pjg7IAogICAgdWNCY2FzdFNpZyAgPSAodl9VOF90KSgoIHVEYXRhICYgMHgwMEZGMDAwMCk+PjE2KTsgCiAgICB2b3NTdGF0dXMgICA9IFdMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzKCBwdm9zR0N0eCwgdWNTVEFJZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1VjYXN0U2lnLCB1Y0JjYXN0U2lnKTsKICAgIGJyZWFrOwogIGNhc2UgV0xBTlRMX1RYX1NUQUlEX0FDX0lORDoKICAgICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgICAgaWYgKCBOVUxMID09IHBUTENiICkKICAgICAgewogICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVBrdFBlbmRpbmciKSk7CiAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICAgIH0KCiAgICAgIHVjQUMgPSBtZXNzYWdlLT5ib2R5dmFsICYgIFdMQU5UTF9BQ19NQVNLOwogICAgICB1Y1NUQUlkID0gKHZfVThfdCkobWVzc2FnZS0+Ym9keXZhbCA+PiBXTEFOVExfU1RBSURfT0ZGU0VUKTsgIAogICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogICAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgICAgfQoKICAgICAgcENsaWVudFNUQS0+YXVjQUNNYXNrW3VjQUNdID0gMTsKCiAgICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nLCAxKTsKICAgICAgdm9zU3RhdHVzID0gV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CiAgICAgIGJyZWFrOwoKICBjYXNlIFdEQV9EU19UWF9TVEFSVF9YTUlUOgoKICAgIFdMQU5UTF9DbGVhclR4WG1pdFBlbmRpbmcocHZvc0dDdHgpOwogICAgdm9zU3RhdHVzID0gV0RBX0RTX1R4RnJhbWVzKCBwdm9zR0N0eCApOwoKICAgICAgYnJlYWs7CgogIGNhc2UgV0RBX0RTX0ZJTklTSF9VTEE6CiAgICBjYWxsYmFja0NvbnRleHQgPSAodm9pZCAqKW1lc3NhZ2UtPmJvZHl2YWw7CiAgICBjYWxsYmFja1JvdXRpbmUgPSBtZXNzYWdlLT5ib2R5cHRyOwogICAgY2FsbGJhY2tSb3V0aW5lKGNhbGxiYWNrQ29udGV4dCk7CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIC8qbm8gcHJvY2Vzc2luZyBmb3Igbm93Ki8KICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIHZvc1N0YXR1czsKfS8qIFdMQU5UTF9UeFByb2Nlc3NNc2cgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfTWNGcmVlTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB0byBmcmVlIGEgZ2l2ZW4gVEwgbWVzc2FnZSBvbiB0aGUgTWFpbiB0aHJlYWQgd2hlbiB0aGVyZQogICAgYXJlIG1lc3NhZ2VzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlIHdoZW4gdGhlIHdob2xlIHN5c3RlbSBpcyBiZWVuIHJlc2V0LgogICAgRm9yIG5vdywgVEwgZG9lcyBub3QgYWxsb2NhdGUgYW55IGJvZHkgc28gdGhpcyBmdW5jdGlvbiBzaG91dCB0cmFuc2xhdGUKICAgIGludG8gYSBOT09QCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeEZyZWVNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKk5vdGhpbmcgdG8gZG8gZm9yIG5vdyEhISovCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1R4RnJlZU1zZyovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9UeEZDRnJhbWUKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gdG8gc2VuZCBGQyBmcmFtZS4gRW5hYmxlCiAgICBvciBkaXNhYmxlIExXTSBtb2RlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbi4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIEZXIHNlbmRzIHVwIHNwZWNpYWwgZmxvdyBjb250cm9sIGZyYW1lLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBvaW50ZXJzIGFyZSBOVUxMLgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFNvbWV0aGluZyBpcyB3cm9uZy4KICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QuCgogIFNJREUgRUZGRUNUUwogICAgTmV3bHkgZm9ybWVkIEZDIGZyYW1lIGlzIGdlbmVyYXRlZCBhbmQgd2FpdHMgdG8gYmUgdHJhbnNtaXR0ZWQuIFByZXZpb3VzbHkgdW5zZW50IGZyYW1lIHdpbGwKICAgIGJlIHJlbGVhc2VkLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4RkNGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CikKewojaWYgMAogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogIHRwSGFsRmNUeEJkICAgICAgICAgcHZGY1R4QmQgPSBOVUxMOwogIHZvc19wa3RfdCAqICAgICAgICAgcFBhY2tldCA9IE5VTEw7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1NUQUlkID0gMDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjQml0Q2hlY2sgPSAxOwoKICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogU2VuZCBGQyBmcmFtZSAlcyIsIF9fZnVuY19fKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHZvc0dDdHggKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CgogIGlmIChOVUxMID09IHBUTENiKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBvaW50ZXIgaW4gJXMgXG4iLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CiAgCiAgLy9HZXQgb25lIHZvc3MgcGFja2V0CiAgdm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0KCAmcFBhY2tldCwgVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01ULCBzaXplb2YodEhhbEZjVHhCZCksIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsIE5VTEwsIE5VTEwgKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHBQYWNrZXQsICh2b2lkICopJnB2RmNUeEJkLCBzaXplb2YodEhhbEZjVHhCZCkpOwoKICBpZiggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICIlczogZmFpbGVkIHRvIHJlc2VydmUgRkMgVFggQkQgJWRcbiIsX19mdW5jX18sIHNpemVvZih0SGFsRmNUeEJkKSkpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwUGFja2V0ICk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLy9HZW5lcmF0ZSBtb3N0IHJlY2VudCB0bEZDSW5mby4gTW9zdCBmaWVsZHMgYXJlIGNvcnJlY3QuCiAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVGhyZXNoRW5hYmxlZE1hc2sgPSAwOwogIHBUTENiLT50bEZDSW5mby5mY1NUQVR4TW9yZURhdGFNYXNrID0gMDsKICBmb3IoIHVjU1RBSWQgPSAwLCB1Y0JpdENoZWNrID0gMSA7IHVjU1RBSWQgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IHVjQml0Q2hlY2sgPDw9IDEsIHVjU1RBSWQgKyspCiAgewogICAgaWYgKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNFeGlzdHMpCiAgICB7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcpCiAgICB7CiAgICAgIHBUTENiLT50bEZDSW5mby5mY1NUQVR4TW9yZURhdGFNYXNrIHw9IHVjQml0Q2hlY2s7CiAgICB9CgogICAgaWYgKCAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCkgJiYKICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkID4gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUx3bVRocmVzaG9sZCkpCiAgICB7CiAgICAgIHBUTENiLT50bEZDSW5mby5mY1NUQVRocmVzaEVuYWJsZWRNYXNrIHw9IHVjQml0Q2hlY2s7CgogICAgICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUaHJlc2hbdWNTVEFJZF0gPSAodEFOSV9VOClwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51THdtVGhyZXNob2xkOwoKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21FdmVudFJlcG9ydGVkID0gRkFMU0U7CiAgICB9CgogIH0KICAKICAvL3JlcXVlc3QgaW1tZWRpYXRlIGZlZWRiYWNrCiAgcFRMQ2ItPnRsRkNJbmZvLmZjQ29uZmlnIHw9IDB4NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogIC8vZmlsbCBpbiBCRCB0byBzZW50CiAgdm9zU3RhdHVzID0gV0xBTkhBTF9GaWxsRmNUeEJkKHB2b3NHQ3R4LCAmcFRMQ2ItPnRsRkNJbmZvLCAodm9pZCAqKXB2RmNUeEJkKTsKCiAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiJXM6IEZpbGwgRkMgVFggQkQgdW5zdWNjZXNzZnVsXG4iLCBfX2Z1bmNfXykpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwUGFja2V0ICk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKE5VTEwgIT0gcFRMQ2ItPnZvc1R4RkNCdWYpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiJXM6IFByZXZpb3VzIEZDIFRYIEJEIG5vdCBzZW50XG4iLCBfX2Z1bmNfXykpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT52b3NUeEZDQnVmKTsKICB9CgogIHBUTENiLT52b3NUeEZDQnVmID0gcFBhY2tldDsKCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggcFBhY2tldCwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KVdMQU5UTF9UeENvbXBEZWZhdWx0Q2IpOwogIHZvc1N0YXR1cyA9IFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDogc2VuZCBGQyBmcmFtZSBsZWF2ZSAlcyIsIF9fZnVuY19fKSk7CiNlbmRpZgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IKCiAgREVTQ1JJUFRJT04KICAgIFByb2Nlc3NpbmcgZnVuY3Rpb24gZm9yIFJlc291cmNlIG5lZWRlZCBzaWduYWwuIEEgcmVxdWVzdCB3aWxsIGJlIGlzc3VlZAogICAgdG8gQkFMIHRvIGdldCBtb3JlIHR4IHJlc291cmNlcy4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgT3RoZXIgdmFsdWVzIGNhbiBiZSByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIHBsZWFzZSBjaGVjawogIGNvcnJlc3BvbmRpbmcgQVBJIGZvciBtb3JlIGluZm8uCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0VHhSZXNvdXJjZXNDQgooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgICAgICA9IE5VTEw7CiAgdl9VMzJfdCAgICAgICAgIHVSZXNDb3VudCAgPSBXREFfVExJX01JTl9SRVNfREFUQTsKICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB2X1U4X3QgICAgICAgICAgdWNNZ210ICAgICA9IDA7CiAgdl9VOF90ICAgICAgICAgIHVjQkFQICAgICAgPSAwOwogIHZfVThfdCAgICAgICAgICB1Y0RhdGEgICAgID0gMDsKI2lmZGVmIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCiAgdEJzc1N5c3RlbVJvbGUgc3lzdGVtUm9sZTsKICB0cEFuaVNpckdsb2JhbCBwTWFjOwojZW5kaWYKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24iCiAgICAgICAgICAgICAgICIgV0xBTlRMX1Byb2Nlc3NUeE1lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEdldCB0eCByZXNvdXJjZXMgZnJvbSBCQUwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSBXREFfRFNfR2V0VHhSZXNvdXJjZXMoIHB2b3NHQ3R4LCAmdVJlc0NvdW50ICk7CgogIGlmICggKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpICYmIChWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTICE9IHZvc1N0YXR1cykpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpUTCBmYWlsZWQgdG8gZ2V0IHJlc291cmNlcyBmcm9tIEJBTCwgRXJyOiAlZCIsCiAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qIEN1cnJlbnRseSBvbmx5IExpbnV4IEJBTCByZXR1cm5zIHRoZSBFX1JFU09VUkNFUyBlcnJvciBjb2RlIHdoZW4gaXQgaXMgcnVubmluZyAKICAgICBvdXQgb2YgQkQvUERVcy4gVG8gbWFrZSB1c2Ugb2YgdGhpcyBpbnRlcnJ1cHQgZm9yIHRocm91Z2hwdXQgZW5oYW5jZW1lbnQsIHNpbWlsYXIKICAgICBjaGFuZ2VzIHNob3VsZCBiZSBkb25lIGluIEJBTCBjb2RlIG9mIEFNU1MgYW5kIFdNICovCiAgaWYgKFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgPT0gdm9zU3RhdHVzKQogIHsKI2lmZGVmIFZPTEFOU19QRVJGCiAgICAgV0xBTkhBTF9FbmFibGVJZGxlQmRQZHVJbnRlcnJ1cHQocHZvc0dDdHgsICh0QU5JX1U4KWJkUGR1SW50ZXJydXB0R2V0VGhyZXNob2xkKTsKICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBFbmFibGluZyBJZGxlIEJEL1BEVSBpbnRlcnJ1cHQsIEN1cnJlbnQgcmVzb3VyY2VzID0gJWQiLCB1UmVzQ291bnQpOwojZWxzZQogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwojZW5kaWYKICB9CgogIHBUTENiLT51UmVzQ291bnQgPSB1UmVzQ291bnQ7CiAgCgojaWZkZWYgV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KICAvKiBGSVhNRTogZGlzYWJsZWQgc2luY2UgY3JlYXRpbmcgaXNzdWVzIGluIHBvd2VyLXNhdmUsIG5lZWRzIHRvIGJlIGFkZHJlc3NlZCAqLyAKICBwVExDYi0+c2VuZEZDRnJhbWUgKys7CiAgcE1hYyA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1dEQSwgcHZvc0dDdHgpOwogIHN5c3RlbVJvbGUgPSB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpOwogIGlmIChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkKICB7CiAgICAgaWYgKHBUTENiLT5zZW5kRkNGcmFtZSAlIDE2ID09IDApCiAgICAgewogICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIlRyYW5zbWl0IEZDIikpOwogICAgICAgICBXTEFOVExfVHhGQ0ZyYW1lIChwdm9zR0N0eCk7CiAgICAgfSAKICB9CiNlbmRpZiAvL1dMQU5fU09GVEFQX0ZMT1dDVFJMX0VOIAoKICB1Y0RhdGEgPSAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19EQVRBICk7CiAgdWNCQVAgID0gKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfQkFQICkgJiYKICAgICAgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApOwogIHVjTWdtdCA9ICggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX01GICkgJiYKICAgICAgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOiBFdmFsIFJlc3VtZSB0eCBSZXM6ICVkIERBVEE6ICVkIEJBUDogJWQgTUdNVDogJWQiLAogICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCwgdWNEYXRhLCB1Y0JBUCwgdWNNZ210KSk7CgogIGlmICgoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSAmJgogICAgICAoKCAwICE9IHVjRGF0YSApIHx8ICggMCAhPSB1Y01nbXQgKSB8fCAoIDAgIT0gdWNCQVAgKSApICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwgZm9yIGF2YWlsIHJlcyBTWU5DIikpOwogICAgdm9zU3RhdHVzID1XREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICB9CiAgcmV0dXJuIHZvc1N0YXR1czsKfS8qV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBVdGlsaXR5IGZ1bmN0aW9ucwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIKCiAgREVTQ1JJUFRJT04KICAgIElubGluZSBmdW5jdGlvbiBmb3IgdHJhbnNsYXRpbmcgYW5kIDgwMi4xMSBoZWFkZXIgaW50byBhbiA4MDIuMyBoZWFkZXIuCgogIERFUEVOREVOQ0lFUwoKCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgIHBUTENiOiAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgSU4vT1VUIAogICAgdWNTdGFJZDogICAgICAgICAgc3RhdGlvbiBJRC4gSW5jYXNlIG9mIFRETFMsIHRoaXMgcmV0dXJucyBhY3R1YWwgVERMUwogICAgICAgICAgICAgICAgICAgICAgc3RhdGlvbiBJRCB1c2VkCgogICBJTi9PVVQKICAgIHZvc0RhdGFCdWZmOiAgICAgIHZvcyBkYXRhIGJ1ZmZlciwgd2lsbCBjb250YWluIHRoZSBuZXcgaGVhZGVyIG9uIG91dHB1dAoKICAgT1VUCiAgICBwdm9zU3RhdHVzOiAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgoKICBSRVRVUk4gVkFMVUUKCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgICBPdGhlciBlcnJvciBjb2RlcyBtaWdodCBiZSByZXR1cm5lZCBmcm9tIHRoZSB2b3MgYXBpIHVzZWQgaW4gdGhlIGZ1bmN0aW9uCiAgICBwbGVhc2UgY2hlY2sgdGhvc2UgcmV0dXJuIHZhbHVlcy4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIKKAogIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZiwKICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgICAgICpwdWNTdGFJZCwKICB2X1U4X3QgICAgICAgICAgdWNVUCwKICB2X1U4X3QgICAgICAgICAgKnVjV0RTRW5hYmxlZCwKICB2X1U4X3QgICAgICAgICAgKmV4dHJhSGVhZFNwYWNlCikKewogIFdMQU5UTF84MDIzSGVhZGVyVHlwZSAgdzgwMjNIZWFkZXI7CiAgV0xBTlRMXzgwMjExSGVhZGVyVHlwZSAqcHc4MDIxMUhlYWRlcjsgLy8gQWxsb2NhdGUgYW4gYWxpZ25lZCBCRCBhbmQgdGhlbiBmaWxsIGl0LiAKICBWT1NfU1RBVFVTICAgICAgICAgICAgIHZvc1N0YXR1czsKICB2X1U4X3QgICAgICAgICAgICAgICAgIE1hbmRhdG9yeXVjSGVhZGVyU2l6ZSA9IFdMQU44MDIxMV9NQU5EQVRPUllfSEVBREVSX1NJWkU7CiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y0hlYWRlclNpemUgPSAwOwogIHZfVk9JRF90ICAgICAgICAgICAgICAgKnBwdkJESGVhZGVyID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogIHBDbGllbnRTVEEgPSBOVUxMOwogIHZfVThfdCAgICAgICAgICAgICAgICAgdWNRb1NPZmZzZXQgPSBXTEFOODAyMTFfTUFOREFUT1JZX0hFQURFUl9TSVpFOwogIHZfVThfdCAgICAgICAgICAgICAgICAgdWNTdGFJZDsKCiAgKnVjV0RTRW5hYmxlZCA9IDA7IC8vIGRlZmF1bHQgV0RTIG9mZi4KICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgJnc4MDIzSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih3ODAyM0hlYWRlcikpOwoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6IFBhY2tldCBwb3AgaGVhZGVyIGZhaWxzIG9uIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgaWYoIE5VTEwgPT0gcHVjU3RhSWQgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6IEludmFsaWQgcG9pbnRlciBmb3IgU3RhSWQiKSk7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CiAgdWNTdGFJZCA9ICpwdWNTdGFJZDsKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCgogIGlmICggV0xBTl9TVEFfSU5GUkEgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0tPndTVEFEZXNjLndTVEFUeXBlCiAgICAgICYmIHBUTENiLT51Y1RkbHNQZWVyQ291bnQgKQogIHsKICAgIHZfVThfdCB1Y0luZGV4ID0gMDsKICAgIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfU1RBX0NPVU5UIDsgdWNJbmRleCsrKQogICAgewogICAgICBpZiAoIHVjSW5kZXggIT0gdWNTdGFJZCAmJiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSAmJiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XS0+dWNFeGlzdHMgJiYKICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XS0+dGxTdGF0ZSA9PSBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQpICYmCiAgICAgICAgICAoIXBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLT51Y1R4U3VzcGVuZGVkKSAmJgogICAgICAgICAgdm9zX21lbV9jb21wYXJlKCAodm9pZCopcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0tPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzLAogICAgICAgICAgICAodm9pZCopdzgwMjNIZWFkZXIudkRBLCA2KSApCiAgICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgIldMQU4gVEw6IEdvdCBhIFRETFMgc3RhdGlvbi4gVXNpbmcgdGhhdCBpbmRleCIpKTsKICAgICAgICB1Y1N0YUlkID0gdWNJbmRleDsKICAgICAgICAqcHVjU3RhSWQgPSB1Y1N0YUlkOwogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXTsKICAgICAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KI2VuZGlmCgoKICBpZiAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNBZGRSbXZMTEMgKQogIHsKICAgIC8qIFB1c2ggdGhlIGxlbmd0aCAqLwogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgJnc4MDIzSGVhZGVyLnVzTGVuVHlwZSwgc2l6ZW9mKHc4MDIzSGVhZGVyLnVzTGVuVHlwZSkpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBQYWNrZXQgcHVzaCBldGhlciB0eXBlIGZhaWxzIG9uIgogICAgICAgICAgICAgICAgICAiIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CgojaWZkZWYgQlRBTVBfVEVTVAogICAgLy8gVGhlIFNUQSBzaWRlIHdpbGwgZXhlY3V0ZSB0aGlzLCBhIGhhY2sgdG8gdGVzdCBCVEFNUCBieSB1c2luZyB0aGUKICAgIC8vIGluZnJhIHNldHVwLiBPbiByZWFsIEJUQU1QIHRoaXMgd2lsbCBjb21lIGZyb20gQkFQIGl0c2VsZi4KICAgIHsKICAgIHN0YXRpYyB2X1U4X3QgV0xBTlRMX0JUX0FNUF9MTENfSEVBREVSW10gPSAgezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4MTksIDB4NTggfTsKICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCBXTEFOVExfQlRfQU1QX0xMQ19IRUFERVIsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdMQU5UTF9CVF9BTVBfTExDX0hFQURFUikpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFBhY2tldCBwdXNoIExMQyBoZWFkZXIgZmFpbHMgb24iCiAgICAgICAgICAgICAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOwogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KICAgIH0KI2Vsc2UKICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCBXTEFOVExfTExDX0hFQURFUiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0xBTlRMX0xMQ19IRUFERVIpKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBQYWNrZXQgcHVzaCBMTEMgaGVhZGVyIGZhaWxzIG9uIgogICAgICAgICAgICAgICAgICAiIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiNlbmRpZgogIH0vKklmIGFkZCBMTEMgaXMgZW5hYmxlZCovCiAgZWxzZQogIHsKICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFNUQSBDbGllbnQgcmVnaXN0ZXJlZCB0byBub3QgcmVtb3ZlIExMQyIKICAgICAgICAgICAgICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CiAgfQoKI2lmZGVmIEJUQU1QX1RFU1QKICBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSA9IFdMQU5fU1RBX0JUX0FNUDsKI2VuZGlmCgogIC8vIEZpbmQgdGhlIHNwYWNlIHJlcXVpcmVkIGZvciB0aGUgODAyLjExIGhlYWRlciBmb3JtYXQKICAvLyBiYXNlZCBvbiB0aGUgZnJhbWUgY29udHJvbCBmaWVsZHMuCiAgdWNIZWFkZXJTaXplID0gTWFuZGF0b3J5dWNIZWFkZXJTaXplOwogIGlmIChwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQpCiAgeyAgCiAgICB1Y0hlYWRlclNpemUgKz0gc2l6ZW9mKHB3ODAyMTFIZWFkZXItPnVzUW9zQ3RybCk7CiAgfQogIGlmIChwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSA9PSBXTEFOX1NUQV9CVF9BTVApCiAgeyAgCiAgICB1Y0hlYWRlclNpemUgKz0gc2l6ZW9mKHB3ODAyMTFIZWFkZXItPm9wdHZBNCk7CiAgICB1Y1FvU09mZnNldCArPSBzaXplb2YocHc4MDIxMUhlYWRlci0+b3B0dkE0KTsKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIDogSGVhZGVyIHNpemUgPSAlZCAiLCB1Y0hlYWRlclNpemUpKTsKCiAgdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHZvc0RhdGFCdWZmLCAmcHB2QkRIZWFkZXIsIHVjSGVhZGVyU2l6ZSApOwogIGlmICggTlVMTCA9PSBwcHZCREhlYWRlciApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Vk9TUyBwYWNrZXQgY29ycnVwdGVkICIpKTsKICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgcmV0dXJuICpwdm9zU3RhdHVzOwogIH0KCgogIC8vIE9LIG5vdyB3ZSBoYXZlIHRoZSBzcGFjZS4gRmlsbCB0aGUgODAyMTEgaGVhZGVyCiAgLyogRmlsbCBBMiAqLwogIHB3ODAyMTFIZWFkZXIgPSAoV0xBTlRMXzgwMjExSGVhZGVyVHlwZSAqKShwcHZCREhlYWRlcik7CiAgLy8gb25seSBjbGVhciB0aGUgcmVxdWlyZWQgc3BhY2UuCiAgdm9zX21lbV9zZXQoIHB3ODAyMTFIZWFkZXIsIHVjSGVhZGVyU2l6ZSwgMCApOwogIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEyLCB3ODAyM0hlYWRlci52U0EsICBWT1NfTUFDX0FERFJfU0laRSk7CgoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCggV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEID09IHBDbGllbnRTVEEtPnRsU3RhdGUgfHwKICAgICAgICBwQ2xpZW50U1RBLT5wdGtJbnN0YWxsZWQgKSAmJiBnVWNJc1dhaSAhPSAxKQojZWxzZQogIGlmICggV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEID09IHBDbGllbnRTVEEtPnRsU3RhdGUgfHwKICAgICAgIHBDbGllbnRTVEEtPnB0a0luc3RhbGxlZCApCiNlbmRpZgogIHsKICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLndlcCA9CiAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNQcm90ZWN0ZWRGcmFtZTsKICB9CgogIHB3ODAyMTFIZWFkZXItPnVzRHVyYXRpb25JZCA9IDA7CiAgcHc4MDIxMUhlYWRlci0+dXNTZXFDdHJsICAgID0gMDsKCiAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudHlwZSAgICAgPSBXTEFOVExfODAyMTFfREFUQV9UWVBFOwoKCgogIGlmKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCkKICB7CiAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnN1YlR5cGUgID0gV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEU7CgogICAgICAqKCh2X1UxNl90ICopKCh2X1U4X3QgKilwcHZCREhlYWRlciArIHVjUW9TT2Zmc2V0KSkgPSB1Y1VQOwoKICB9CiAgZWxzZQogIHsKICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuc3ViVHlwZSAgPSAwOwoKICAvLyBOTyBOTyBOTyAtIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCB0byB3cml0ZSB0aGUgUU9TIGN0cmwgIAogIC8vIGZpZWxkLCBpdCB3aWxsIG92ZXJ3cml0ZSB0aGUgZmlyc3QgMiBieXRlcyBvZiB0aGUgZGF0YSBwYWNrZXQoTExDIGhlYWRlcikKICAvLyBwdzgwMjExSGVhZGVyLT51c1Fvc0N0cmwgICAgICAgICA9IDA7CiAgfQoKCiAgc3dpdGNoKCBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSApCiAgewogICAgICBjYXNlIFdMQU5fU1RBX0lCU1M6CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudG9EUyAgICAgICAgICA9IDA7CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuZnJvbURTICAgICAgICA9IDA7CiAgICAgICAgLypGaXggbWUqLwogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMSwKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEzLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52QlNTSURmb3JJQlNTICwKICAgICAgICAgICAgICBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIFdMQU5fU1RBX0JUX0FNUDoKICAgICAgICAqdWNXRFNFbmFibGVkID0gMTsgLy8gV0RTIG9uLgogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAxOwogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAxOwogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMSwKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEyLAogICAgICAgICAgICAgICAgdzgwMjNIZWFkZXIudlNBLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkEzLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyk7CiAgICAgICAgLyogZmlsbCB0aGUgb3B0aW9uYWwgQTQgaGVhZGVyICovCiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT5vcHR2QTQsCiAgICAgICAgICAgICAgICB3ODAyM0hlYWRlci52U0EsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiQlRBTVAgQ0FTRSBOT1cgLS0tLS0tLS0tc3RhaWQ9JWRcbiIsCiAgICAgICAgICAgIHVjU3RhSWQpKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgV0xBTl9TVEFfU09GVEFQOgogICAgICAgICp1Y1dEU0VuYWJsZWQgPSAwOyAvLyBXRFMgb2ZmLgogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAwOwogICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAxOwogICAgICAgIC8qQ29weSB0aGUgREEgdG8gQTEqLwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkExLCB3ODAyM0hlYWRlci52REEgLCBWT1NfTUFDX0FERFJfU0laRSk7ICAgCiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkEyLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MpOwogICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEzLAogICAgICAgICAgICAgICAgdzgwMjNIZWFkZXIudlNBLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgInN3IDgwMiB0byA4MDIxMSBzb2Z0YXAgY2FzZSAgLS0tLS0tLS0tc3RhaWQ9JWRcbiIsCiAgICAgICAgICAgIHVjU3RhSWQpKTsKICAgICAgICBicmVhazsKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgICAgIGNhc2UgV0xBTl9TVEFfVERMUzoKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMDsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMDsKICAgICAgICAvKkZpeCBtZSovCiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkExLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyk7CiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTMsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZCU1NJRGZvcklCU1MgLAogICAgICAgICAgICAgIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICgiVEw6VERMUyBDQVNFIE5PVyAtLS0tLS0tLS1zdGFpZD0lZFxuIiksIHVjU3RhSWQpOwogICAgICAgIGJyZWFrOwojZW5kaWYKICAgICAgY2FzZSBXTEFOX1NUQV9JTkZSQToKICAgICAgZGVmYXVsdDoKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMTsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMDsKICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMywgdzgwMjNIZWFkZXIudkRBICwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJSRUdVTEFSIElORlJBIExJTksgQ0FTRS0tLS0tLS0tLXN0YWlkPSVkXG4iLAogICAgICAgICAgICB1Y1N0YUlkKSk7CiAgICAgICAgYnJlYWs7CiAgfQogIC8vIE9LIG5vdyB3ZSBoYXZlIHRoZSBzcGFjZS4gRmlsbCB0aGUgODAyMTEgaGVhZGVyCiAgLyogRmlsbCBBMiAqLwogIHB3ODAyMTFIZWFkZXIgPSAoV0xBTlRMXzgwMjExSGVhZGVyVHlwZSAqKShwcHZCREhlYWRlcik7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIEJFR0lOIExPRyBGVU5DVElPTiAgICAhISEgUmVtb3ZlIG1lIG9yIGNsZWFuIG1lCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KI2lmIDAgLy9kZWYgV0xBTlRMX0RFQlVHCgojZGVmaW5lIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FICAgIDE2CiNkZWZpbmUgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEUgICAgNAoKc3RhdGljIHZfVk9JRF90IFdMQU5UTF9EZWJ1Z0ZyYW1lCigKICAgdl9QVk9JRF90ICAgZGF0YVBvaW50ZXIsCiAgIHZfVTMyX3QgICAgIGRhdGFTaXplCikKewogICB2X1U4X3QgICBsaW5lQnVmZmVyW1dMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FXTsKICAgdl9VMzJfdCAgbnVtTGluZXM7CiAgIHZfVTMyX3QgIG51bUJ5dGVzOwogICB2X1UzMl90ICBpZHg7CiAgIHZfVThfdCAgICpsaW5lUG9pbnRlcjsKCiAgIG51bUxpbmVzID0gZGF0YVNpemUgLyBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORTsKICAgbnVtQnl0ZXMgPSBkYXRhU2l6ZSAlIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FOwogICBsaW5lUG9pbnRlciA9ICh2X1U4X3QgKilkYXRhUG9pbnRlcjsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQUwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6RnJhbWUgRGVidWcgRnJhbWUgU2l6ZSAlZCwgUG9pbnRlciAweCVwIiwgZGF0YVNpemUsIGRhdGFQb2ludGVyKSk7CiAgIGZvcihpZHggPSAwOyBpZHggPCBudW1MaW5lczsgaWR4KyspCiAgIHsKICAgICAgbWVtc2V0KGxpbmVCdWZmZXIsIDAsIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FKTsKICAgICAgbWVtY3B5KGxpbmVCdWZmZXIsIGxpbmVQb2ludGVyLCBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSk7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQUwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOjB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IiwKICAgICAgICAgICAgICAgICBsaW5lQnVmZmVyWzBdLCBsaW5lQnVmZmVyWzFdLCBsaW5lQnVmZmVyWzJdLCBsaW5lQnVmZmVyWzNdLCBsaW5lQnVmZmVyWzRdLCBsaW5lQnVmZmVyWzVdLCBsaW5lQnVmZmVyWzZdLCBsaW5lQnVmZmVyWzddLAogICAgICAgICAgICAgICAgIGxpbmVCdWZmZXJbOF0sIGxpbmVCdWZmZXJbOV0sIGxpbmVCdWZmZXJbMTBdLCBsaW5lQnVmZmVyWzExXSwgbGluZUJ1ZmZlclsxMl0sIGxpbmVCdWZmZXJbMTNdLCBsaW5lQnVmZmVyWzE0XSwgbGluZUJ1ZmZlclsxNV0pKTsKICAgICAgbGluZVBvaW50ZXIgKz0gV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkU7CiAgIH0KCiAgIGlmKDAgPT0gbnVtQnl0ZXMpCiAgICAgIHJldHVybjsKCiAgIG1lbXNldChsaW5lQnVmZmVyLCAwLCBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSk7CiAgIG1lbWNweShsaW5lQnVmZmVyLCBsaW5lUG9pbnRlciwgbnVtQnl0ZXMpOwogICBmb3IoaWR4ID0gMDsgaWR4IDwgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUgLyBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURTsgaWR4KyspCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTiBUTDoweCUyeCAweCUyeCAweCUyeCAweCUyeCIsCiAgICAgICAgICAgICAgICBsaW5lQnVmZmVyW2lkeCAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFXSwgbGluZUJ1ZmZlclsxICsgaWR4ICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEVdLAogICAgICAgICAgICAgICAgbGluZUJ1ZmZlclsyICsgaWR4ICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEVdLCBsaW5lQnVmZmVyWzMgKyBpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0pKTsKICAgICAgaWYoKChpZHggKyAxKSAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFKSA+PSBudW1CeXRlcykKICAgICAgICAgYnJlYWs7CiAgIH0KCiAgIHJldHVybjsKfQojZW5kaWYKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgRU5EIExPRyBGVU5DVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyCgogIERFU0NSSVBUSU9OCiAgICBJbmxpbmUgZnVuY3Rpb24gZm9yIHRyYW5zbGF0aW5nIGFuZCA4MDIuMTEgaGVhZGVyIGludG8gYW4gODAyLjMgaGVhZGVyLgoKICBERVBFTkRFTkNJRVMKCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgICBwVExDYjogICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgICB1Y1N0YUlkOiAgICAgICAgICBzdGF0aW9uIElECiAgICB1Y0hlYWRlckxlbjogICAgICBMZW5ndGggb2YgdGhlIGhlYWRlciBmcm9tIEJECiAgICB1Y0FjdHVhbEhMZW46ICAgICBMZW5ndGggb2YgaGVhZGVyIGluY2x1ZGluZyBwYWRkaW5nIG9yIGFueSBvdGhlciB0cmFpbGVycwoKICAgSU4vT1VUCiAgICB2b3NEYXRhQnVmZjogICAgICB2b3MgZGF0YSBidWZmZXIsIHdpbGwgY29udGFpbiB0aGUgbmV3IGhlYWRlciBvbiBvdXRwdXQKCiAgIE9VVAogICAgcHZvc1N0YXR1czogICAgICAgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KCiAgIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIKKAogIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZiwKICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKICB2X1UxNl90ICAgICAgICAgdXNBY3R1YWxITGVuLAogIHZfVThfdCAgICAgICAgICB1Y0hlYWRlckxlbiwKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQKKQp7CiAgV0xBTlRMXzgwMjNIZWFkZXJUeXBlICB3ODAyM0hlYWRlcjsKICBXTEFOVExfODAyMTFIZWFkZXJUeXBlIHc4MDIxMUhlYWRlcjsKICB2X1U4X3QgICAgICAgICAgICAgICAgIGF1Y0xMQ0hlYWRlcltXTEFOVExfTExDX0hFQURFUl9MRU5dOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgdm9zU3RhdHVzOwogIHZfVTE2X3QgICAgICAgICAgICAgICAgdXNEYXRhU3RhcnRPZmZzZXQgPSAwOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICBpZiAoIHNpemVvZih3ODAyMTFIZWFkZXIpIDwgdWNIZWFkZXJMZW4gKQogIHsKICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgIldhcm5pbmcgITogQ2hlY2sgdGhlIGhlYWRlciBzaXplIGZvciB0aGUgUnggZnJhbWUgc3RydWN0dXJlPSVkIHJlY2VpdmVkPSVkbiIsCiAgICAgICBzaXplb2YodzgwMjExSGVhZGVyKSwgdWNIZWFkZXJMZW4pKTsKICAgICB1Y0hlYWRlckxlbiA9IHNpemVvZih3ODAyMTFIZWFkZXIpOwogIH0KCiAgLy8gVGhpcyB3aWxsIHRha2UgY2FyZSBvZiBoZWFkZXJzIG9mIGFsbCBzaXplcywgMyBhZGRyZXNzLCAzIGFkZHIgUU9TLAogIC8vIFdEUyBub24tUU9TIGFuZCBXRFMgUW9TIGV0Yy4gV2UgaGF2ZSBzcGFjZSBmb3IgYWxsIGluIHRoZSA4MDIuMTEgaGVhZGVyIHN0cnVjdHVyZS4KICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgJnc4MDIxMUhlYWRlciwgdWNIZWFkZXJMZW4pOwoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHBvcCA4MDIxMSBoZWFkZXIgZnJvbSBwYWNrZXQgJWQiLAogICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CgogICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICBzd2l0Y2ggKCB3ODAyMTFIZWFkZXIud0ZybUN0cmwuZnJvbURTICkKICB7CiAgY2FzZSAwOgogICAgaWYgKCB3ODAyMTFIZWFkZXIud0ZybUN0cmwudG9EUyApCiAgICB7CiAgICAgIC8vU29mdEFQIEFQIG1vZGUKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTMsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTIsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgIldMQU4gVEwgU29mdEFQOiA4MDIgMyBEQSAlMDh4IFNBICUwOHggXG4iLAogICAgICAgICAgICAgICAgICB3ODAyM0hlYWRlci52REEsIHc4MDIzSGVhZGVyLnZTQSkpOwogICAgfQogICAgZWxzZSAKICAgIHsKICAgICAgLyogSUJTUyAqLwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMiwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgfQogICAgYnJlYWs7CiAgY2FzZSAxOgogICAgaWYgKCB3ODAyMTFIZWFkZXIud0ZybUN0cmwudG9EUyApCiAgICB7CiAgICAgIC8qIEJULUFNUCBjYXNlICovCiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEyLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICB9CiAgICBlbHNlCiAgICB7IC8qIEluZnJhICovCiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEzLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICB9CiAgICBicmVhazsKICB9CgogIGlmKCB1c0FjdHVhbEhMZW4gPiB1Y0hlYWRlckxlbiApCiAgewogICAgIHVzRGF0YVN0YXJ0T2Zmc2V0ID0gdXNBY3R1YWxITGVuIC0gdWNIZWFkZXJMZW47CiAgfQoKICBpZiAoIDAgPCB1c0RhdGFTdGFydE9mZnNldCApCiAgewogICAgdm9zU3RhdHVzID0gdm9zX3BrdF90cmltX2hlYWQoIHZvc0RhdGFCdWZmLCB1c0RhdGFTdGFydE9mZnNldCApOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byB0cmltIGhlYWRlciBmcm9tIHBhY2tldCAlZCIsCiAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLnVjQWRkUm12TExDICkKICB7CiAgICAvLyBFeHRyYWN0IHRoZSBMTEMgaGVhZGVyCiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgYXVjTExDSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0xMQ19IRUFERVJfTEVOKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHBvcCBMTEMgaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CgogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KCiAgICAvL0V4dHJhY3QgdGhlIGxlbmd0aAogICAgdm9zX21lbV9jb3B5KCZ3ODAyM0hlYWRlci51c0xlblR5cGUsCiAgICAgICZhdWNMTENIZWFkZXJbV0xBTlRMX0xMQ19IRUFERVJfTEVOIC0gc2l6ZW9mKHc4MDIzSGVhZGVyLnVzTGVuVHlwZSldLAogICAgICBzaXplb2YodzgwMjNIZWFkZXIudXNMZW5UeXBlKSApOwogIH0KICBlbHNlCiAgewogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ODAyM0hlYWRlci51c0xlblR5cGUpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gZ2V0IHBhY2tldCBsZW5ndGggJWQiLAogICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKCiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6IEJUQU1QIGxlbiAoZXRoZXJ0eXBlKSBmbGQgPSAlZCIsCiAgICAgICAgdzgwMjNIZWFkZXIudXNMZW5UeXBlKSk7CiAgICB3ODAyM0hlYWRlci51c0xlblR5cGUgPSB2b3NfY3B1X3RvX2JlMTYodzgwMjNIZWFkZXIudXNMZW5UeXBlKTsKICB9CgogIHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCAmdzgwMjNIZWFkZXIsIHNpemVvZih3ODAyM0hlYWRlcikpOwoKI2lmZGVmIEJUQU1QX1RFU1QKICB7CiAgLy8gQVAgc2lkZSB3aWxsIGV4ZWN1dGUgdGhpcy4KICB2X1U4X3QgKnRlbXBfdzgwMjNIZWFkZXIgPSBOVUxMOwogIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgMCwKICAgICZ0ZW1wX3c4MDIzSGVhZGVyLCBzaXplb2YodzgwMjNIZWFkZXIpICk7CiAgfQojZW5kaWYKI2lmIDAgLypUTF9ERUJVRyovCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NEYXRhQnVmZiwgJnVzTGVuKTsKICB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgYXVjRGF0YSwgdXNMZW4pOwoKICBXTEFOVExfRGVidWdGcmFtZShhdWNEYXRhLCB1c0xlbik7CgogIHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCBhdWNEYXRhLCB1c0xlbik7CgojZW5kaWYKCiAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMKCiAgREVTQ1JJUFRJT04KICAgIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB3aGV0aGVyIHJlY2VpdmVkIGZyYW1lIGlzIGJyb2FkY2FzdCwgbXVsdGljYXN0CiAgICBvciB1bmljYXN0LgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcFRMQ2I6ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFRMJ3MgY29udHJvbCBibG9jawogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgIHBvaW50ZXIgdG8gdGhlIHZvcyBidWZmZXIKCiAgIElOL09VVAogICAgcHVjQmNNY1VjOiAgICAgICBwb2ludGVyIHRvIGJ1ZmZlciwgd2lsbCBjb250YWluIGZyYW1lIHR5cGUgb24gcmV0dXJuCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfQkFETVNHOiAgZmFpbGVkIHRvIGV4dHJhY3QgaW5mbyBmcm9tIGRhdGEgYnVmZmVyCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgc3VjY2VzcwoKICBTSURFIEVGRkVDVFMKICAgIE5vbmUuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjCigKICBXTEFOVExfQ2JUeXBlICpwVExDYiwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90ICAgICAqdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAqcHVjQmNNY1VjCikKewogICBWT1NfU1RBVFVTICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgdl9QVk9JRF90ICAgICBhdWNCREhlYWRlcjsKICAgdl9QVk9JRF90ICAgICBwdlBlZWtEYXRhOwogICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgU2FuaXR5IGNoZWNrCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICBpZiAoKE5VTEwgPT0gcFRMQ2IpIHx8IAogICAgICAgKE5VTEwgPT0gdm9zRGF0YUJ1ZmYpIHx8IAogICAgICAgKE5VTEwgPT0gcHVjQmNNY1VjKSkKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIGluIFdMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIikpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogICB9CgogICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgIH0KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgRXh0cmFjdCBCRCBoZWFkZXIgYW5kIGNoZWNrIGlmIHZhbGlkCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICB2b3NTdGF0dXMgPSBXREFfRFNfUGVla1J4UGFja2V0SW5mbyh2b3NEYXRhQnVmZiwgKHZfUFZPSURfdCkmYXVjQkRIZWFkZXIsIDAvKlN3YXAgQkQqLyApOwoKICAgaWYgKE5VTEwgPT0gYXVjQkRIZWFkZXIpCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIENhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9CQURNU0c7CiAgIH0KCiAgIGlmICgoMCA9PSBXREFfR0VUX1JYX0ZUX0RPTkUoYXVjQkRIZWFkZXIpKSAmJgogICAgICAgKDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbikpCiAgIHsKICAgICAgLyogSXRzIGFuIDgwMi4xMSBmcmFtZSwgZXh0cmFjdCBNQUMgYWRkcmVzcyAxICovCiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIC0gODAyLjExIGZyYW1lLCBwZWVraW5nIEFkZHIxIikpOwogICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSh2b3NEYXRhQnVmZiwgV0xBTlRMX01BQ19BRERSX0FMSUdOKDEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgVk9TX01BQ19BRERSX1NJWkUpOwogICB9CiAgIGVsc2UKICAgewogICAgICAvKiBJdHMgYW4gODAyLjMgZnJhbWUsIGV4dHJhY3QgRGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KICAgICAgVExMT0cyKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMgLSA4MDIuMyBmcmFtZSwgcGVla2luZyBEQSIpKTsKICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEodm9zRGF0YUJ1ZmYsIFdMQU5UTF9NQUNfQUREUl9BTElHTigwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgVk9TX01BQ19BRERSX1NJWkUpOwogICB9CgogICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIEZhaWxlZCB0byBwZWVrIE1BQyBhZGRyZXNzIikpOwogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICB9CgogICBpZiAoKCh0QU5JX1U4ICopcHZQZWVrRGF0YSlbMF0gPT0gMHhmZikKICAgewogICAgICAqcHVjQmNNY1VjID0gV0xBTlRMX0ZSQU1FX1RZUEVfQkNBU1Q7CiAgIH0KICAgZWxzZQogICB7CiAgICAgIGlmICgoKCh0QU5JX1U4ICopcHZQZWVrRGF0YSlbMF0gJiAweDAxKSA9PSAweDAxKQogICAgICAgICAqcHVjQmNNY1VjID0gV0xBTlRMX0ZSQU1FX1RZUEVfTUNBU1Q7CiAgICAgIGVsc2UKICAgICAgICAgKnB1Y0JjTWNVYyA9IFdMQU5UTF9GUkFNRV9UWVBFX1VDQVNUOwogICB9CgogICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIEFkZHIxQnl0ZTEgaXM6ICV4IiwgCiAgICAgICAgICAoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgojaWYgMAojaWZkZWYgV0xBTl9QRVJGIAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0Zhc3RId0Z3ZERhdGFGcmFtZQoKICBERVNDUklQVElPTiAKICAgIEZhc3QgcGF0aCBmdW5jdGlvbiB0byBxdWlja2x5IGZvcndhcmQgYSBkYXRhIGZyYW1lIGlmIEhBTCBkZXRlcm1pbmVzIEJEIAogICAgc2lnbmF0dXJlIGNvbXB1dGVkIGhlcmUgbWF0Y2hlcyB0aGUgc2lnbmF0dXJlIGluc2lkZSBjdXJyZW50IFZPU1MgcGFja2V0LiAKICAgIElmIHRoZXJlIGlzIGEgbWF0Y2gsIEhBTCBhbmQgVEwgZmlsbHMgaW4gdGhlIHN3YXBwZWQgcGFja2V0IGxlbmd0aCBpbnRvIAogICAgQkQgaGVhZGVyIGFuZCBEeEUgaGVhZGVyLCByZXNwZWN0aXZlbHkuIE90aGVyd2lzZSwgcGFja2V0IGdvZXMgYmFjayB0byAKICAgIG5vcm1hbCAoc2xvdykgcGF0aCBhbmQgYSBuZXcgQkQgc2lnbmF0dXJlIHdvdWxkIGJlIHRhZ2dlZCBpbnRvIEJEIGluIHRoaXMKICAgIFZPU1MgcGFja2V0IGxhdGVyIGJ5IHRoZSBXTEFOSEFMX0ZpbGxUeEJkKCkgZnVuY3Rpb24uCgogIERFUEVOREVOQ0lFUyAKICAgICAKICBQQVJBTUVURVJTIAoKICAgSU4KICAgICAgICBwdm9zR0N0eCAgICBWT1MgY29udGV4dAogICAgICAgIHZvc0RhdGFCdWZmIFB0ciB0byBWT1NTIHBhY2tldAogICAgICAgIHBNZXRhSW5mbyAgIEZvciBnZXR0aW5nIGZyYW1lJ3MgVElECiAgICAgICAgcFN0YUluZm8gICAgRm9yIGNoZWNraW5nIFNUQSB0eXBlCiAgICAKICAgT1VUCiAgICAgICAgcHZvc1N0YXR1cyAgcmV0dXJuZWQgc3RhdHVzCiAgICAgICAgcHVGYXN0RndkT0sgRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGZyYW1lIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkCiAgIAogIFJFVFVSTiBWQUxVRQogICAgTm8gcmV0dXJuLiAgIAoKICBTSURFIEVGRkVDVFMgCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgdm9pZApXTEFOVExfRmFzdEh3RndkRGF0YUZyYW1lCiggCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgIHZvc0RhdGFCdWZmLAogIFZPU19TVEFUVVMqICAgcHZvc1N0YXR1cywKICB2X1UzMl90KiAgICAgICBwdUZhc3RGd2RPSywKICBXTEFOVExfTWV0YUluZm9UeXBlKiAgcE1ldGFJbmZvLAogIFdMQU5fU1RBRGVzY1R5cGUqICBwU3RhSW5mbwogCikKewogICAgdl9QVk9JRF90ICAgcHZQZWVrRGF0YTsKICAgIHZfVThfdCAgICAgIHVjRHhFQkRXTEFOSGVhZGVyTGVuID0gV0xBTlRMX0JEX0hFQURFUl9MRU4oMCkgKyBzaXplb2YoV0xBTkJBTF9zRFhFSGVhZGVyVHlwZSk7IAogICAgdl9VOF90ICAgICAgdWNJc1VuaWNhc3Q7CiAgICBXTEFOQkFMX3NEWEVIZWFkZXJUeXBlICAqcER4RUhlYWRlcjsKICAgIHZfUFZPSURfdCAgIHB2QkRIZWFkZXI7CiAgICB2X1BWT0lEX3QgICBwdWNCdWZmUHRyOwogICAgdl9VMTZfdCAgICAgIHVzUGt0TGVuOwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBwYWNrZXQgbGVuZ3RoCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsICZ1c1BrdExlbik7CgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IE1BQyBhZGRyZXNzCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAqcHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTigwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2UGVla0RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTUFDX0FERFJfU0laRSApOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9ICpwdm9zU3RhdHVzICkgCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGV4dHJhY3QgTUFDIEFkZHIgJWQiLCAKICAgICAgICAgICAgICAgICAgKnB2b3NTdGF0dXMpKTsKICAgICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgICAgcmV0dXJuOwogICAgfQoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVzZXJ2ZSBoZWFkIHJvb20gZm9yIER4RSBoZWFkZXIsIEJELCBhbmQgV0xBTiBoZWFkZXIKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsICZwdWNCdWZmUHRyLCAKICAgICAgICAgICAgICAgICAgICAgICAgdWNEeEVCRFdMQU5IZWFkZXJMZW4gKTsKICAgIGlmICggTlVMTCA9PSBwdWNCdWZmUHRyICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Tm8gZW5vdWdoIHNwYWNlIGluIFZPU1MgcGFja2V0ICVwIGZvciBEeEUvQkQvV0xBTiBoZWFkZXIiLCB2b3NEYXRhQnVmZikpOwogICAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcER4RUhlYWRlciA9IChXTEFOQkFMX3NEWEVIZWFkZXJUeXBlICAqKXB1Y0J1ZmZQdHI7CiAgICBwdkJESGVhZGVyID0gKHZfUFZPSURfdCkgJnBEeEVIZWFkZXJbMV07CgogICAgLyogVU1BIFR4IGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkLiAKICAgICAqIFVNQSB3b3VsZCBoZWxwIGNvbnZlcnQgZnJhbWVzIHRvIDgwMi4xMSwgZmlsbCBwYXJ0aWFsIEJEIGZpZWxkcyBhbmQgCiAgICAgKiBjb25zdHJ1Y3QgTExDIGhlYWRlci4gVG8gZnVydGhlciBhY2NlbGVyYXRlIHRoaXMga2luZCBvZiBmcmFtZXMsCiAgICAgKiBIQUwgd291bGQgYXR0ZW1wdCB0byByZXVzZSB0aGUgQkQgZGVzY3JpcHRvciBpZiB0aGUgQkQgc2lnbmF0dXJlIAogICAgICogbWF0Y2hlcyB0byB0aGUgc2F2ZWQgQkQgZGVzY3JpcHRvci4KICAgICAqLwogICAgIGlmKHBTdGFJbmZvLT53U1RBVHlwZSA9PSBXTEFOX1NUQV9JQlNTKQogICAgICAgIHVjSXNVbmljYXN0ID0gISgoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSAmIDB4MDEpOwogICAgIGVsc2UKICAgICAgICB1Y0lzVW5pY2FzdCA9IDE7CiAKICAgICAqcHVGYXN0RndkT0sgPSAodl9VMzJfdCkgV0xBTkhBTF9UeEJkRmFzdEZ3ZChwdm9zR0N0eCwgcHZQZWVrRGF0YSwgcE1ldGFJbmZvLT51Y1RJRCwgdWNJc1VuaWNhc3QsIHB2QkRIZWFkZXIsIHVzUGt0TGVuICk7CiAgICAKICAgICAgLyogQ2FuJ3QgYmUgZmFzdCBmb3J3YXJkZWQuIFRyaW0gdGhlIFZPUyBoZWFkIGJhY2sgdG8gb3JpZ2luYWwgbG9jYXRpb24uICovCiAgICAgIGlmKCEgKnB1RmFzdEZ3ZE9LKXsKICAgICAgICAgIHZvc19wa3RfdHJpbV9oZWFkKHZvc0RhdGFCdWZmLCB1Y0R4RUJEV0xBTkhlYWRlckxlbik7CiAgICAgIH1lbHNlewogICAgICAgIC8qIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkLiBOb3cgbm90aWZ5IEJBTCBEeEUgaGVhZGVyIGZpbGxpbmcgY291bGQgYmUgY29tcGxldGVseSBza2lwcGVkCiAgICAgICAgICovCiAgICAgICAgdl9VMzJfdCB1UGFja2V0U2l6ZSA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKDApICsgdXNQa3RMZW47CiAgICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCiAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1UGFja2V0U2l6ZSk7CiAgICAgICAgcER4RUhlYWRlci0+c2l6ZSAgPSBTV0FQX0VORElBTl9VSU5UMzIodVBhY2tldFNpemUpOwogICAgICB9CiAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgIHJldHVybjsKfQojZW5kaWYgLypXTEFOX1BFUkYqLwojZW5kaWYKCiNpZiAwCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgRlVOQ1RJT04gICAgV0xBTlRMX1ByZXBhcmVCREhlYWRlcgoKICBERVNDUklQVElPTgogICAgSW5saW5lIGZ1bmN0aW9uIGZvciBwcmVwYXJpbmcgQkQgaGVhZGVyIGJlZm9yZSBIQUwgcHJvY2Vzc2luZy4KCiAgREVQRU5ERU5DSUVTCiAgICBKdXN0IG5vdGlmeSBIQUwgdGhhdCBzdXNwZW5kIGluIFRMIGlzIGNvbXBsZXRlLgoKICBQQVJBTUVURVJTCgogICBJTgogICAgdm9zRGF0YUJ1ZmY6ICAgICAgdm9zIGRhdGEgYnVmZmVyCiAgICB1Y0Rpc2FibGVGcm1YdGw6ICBpcyBmcmFtZSB4dGwgZGlzYWJsZWQKCiAgIE9VVAogICAgcHB2QkRIZWFkZXI6ICAgICAgaXQgd2lsbCBjb250YWluIHRoZSBCRCBoZWFkZXIKICAgIHB2RGVzdE1hY0FkZGRyOiAgIGl0IHdpbGwgY29udGFpbiB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKICAgIHB2b3NTdGF0dXM6ICAgICAgIHN0YXR1cyBvZiB0aGUgY29tYmluZWQgcHJvY2Vzc2luZwogICAgcHVzUGt0TGVuOiAgICAgICAgcGFja2V0IGxlbi4KCiAgUkVUVVJOIFZBTFVFCiAgICBObyByZXR1cm4uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQKV0xBTlRMX1ByZXBhcmVCREhlYWRlcgooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAogIHZfUFZPSURfdCogICAgICBwcHZCREhlYWRlciwKICB2X01BQ0FERFJfdCogICAgcHZEZXN0TWFjQWRkZHIsCiAgdl9VOF90ICAgICAgICAgIHVjRGlzYWJsZUZybVh0bCwKICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKICB2X1UxNl90KiAgICAgICAgcHVzUGt0TGVuLAogIHZfVThfdCAgICAgICAgICB1Y1Fvc0VuYWJsZWQsCiAgdl9VOF90ICAgICAgICAgIHVjV0RTRW5hYmxlZCwKICB2X1U4X3QgICAgICAgICAgZXh0cmFIZWFkU3BhY2UKKQp7CiAgdl9VOF90ICAgICAgdWNIZWFkZXJPZmZzZXQ7CiAgdl9VOF90ICAgICAgdWNIZWFkZXJMZW47CiAgdl9VOF90ICAgICAgdWNCREhlYWRlckxlbiA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKHVjRGlzYWJsZUZybVh0bCk7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgR2V0IGhlYWRlciBwb2ludGVyIGZyb20gVk9TUwogICAgISEhIG1ha2Ugc3VyZSByZXNlcnZlIGhlYWQgemVyb3Mgb3V0IHRoZSBtZW1vcnkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsIHB1c1BrdExlbik7CgogIGlmICggV0xBTlRMX01BQ19IRUFERVJfTEVOKHVjRGlzYWJsZUZybVh0bCkgPiAqcHVzUGt0TGVuICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBMZW5ndGggb2YgdGhlIHBhY2tldCBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQgbmV0d29yayIKICAgICAgICAgICAgICAgIiBoZWFkZXIgJWQiLCAqcHVzUGt0TGVuICkpOwoKICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgcmV0dXJuOwogIH0KCiAgdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHZvc0RhdGFCdWZmLCBwcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgdWNCREhlYWRlckxlbiApOwogIGlmICggTlVMTCA9PSAqcHB2QkRIZWFkZXIgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOlZPU1MgcGFja2V0IGNvcnJ1cHRlZCBvbiBBdHRhY2ggQkQgaGVhZGVyIikpOwogICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICByZXR1cm47CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IE1BQyBhZGRyZXNzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB7CiAgIHZfU0laRV90IHVzTWFjQWRkclNpemUgPSBWT1NfTUFDX0FERFJfU0laRTsKICAgKnB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0JESGVhZGVyTGVuICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTih1Y0Rpc2FibGVGcm1YdGwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwdkRlc3RNYWNBZGRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c01hY0FkZHJTaXplICk7CiAgfQogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9ICpwdm9zU3RhdHVzICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBNQUMgQWRkciAlZCIsCiAgICAgICAgICAgICAgICAqcHZvc1N0YXR1cykpOwogIH0KICBlbHNlCiAgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBGaWxsIE1QRFUgaW5mbyBmaWVsZHM6CiAgICAgICAgICAtIE1QRFUgZGF0YSBzdGFydCBvZmZzZXQKICAgICAgICAgIC0gTVBEVSBoZWFkZXIgc3RhcnQgb2Zmc2V0CiAgICAgICAgICAtIE1QRFUgaGVhZGVyIGxlbmd0aAogICAgICAgICAgLSBNUERVIGxlbmd0aCAtIHRoaXMgaXMgYSAxNmIgZmllbGQgLSBuZWVkcyBzd2FwcGluZwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdWNIZWFkZXJPZmZzZXQgPSB1Y0JESGVhZGVyTGVuOwogICAgdWNIZWFkZXJMZW4gICAgPSBXTEFOVExfTUFDX0hFQURFUl9MRU4odWNEaXNhYmxlRnJtWHRsKTsKCiAgICBpZiAoIDAgIT0gdWNEaXNhYmxlRnJtWHRsICkKICAgIHsKICAgICAgaWYgKCAwICE9IHVjUW9zRW5hYmxlZCApCiAgICAgIHsKICAgICAgICB1Y0hlYWRlckxlbiArPSBXTEFOVExfODAyXzExX0hFQURFUl9RT1NfQ1RMOwogICAgICB9CgogICAgICAvLyBTaW1pbGFyIHRvIFFvcyB3ZSBuZWVkIHNvbWV0aGluZyBmb3IgV0RTIGZvcm1hdCAhCiAgICAgIGlmICggdWNXRFNFbmFibGVkICE9IDAgKQogICAgICB7CiAgICAgICAgLy8gSWYgd2UgaGF2ZSBmcmFtZSB0cmFuc2xhdGlvbiBlbmFibGVkCiAgICAgICAgdWNIZWFkZXJMZW4gICAgKz0gV0xBTlRMXzgwMl8xMV9IRUFERVJfQUREUjRfTEVOOwogICAgICB9CiAgICAgIGlmICggZXh0cmFIZWFkU3BhY2UgIT0gMCApCiAgICAgIHsKICAgICAgICAvLyBEZWNyZWFzZSB0aGUgcGFja2V0IGxlbmd0aCB3aXRoIHRoZSBleHRyYSBwYWRkaW5nIGFmdGVyIHRoZSBoZWFkZXIKICAgICAgICAqcHVzUGt0TGVuID0gKnB1c1BrdExlbiAtIGV4dHJhSGVhZFNwYWNlOwogICAgICB9CiAgICB9CgogICAgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9IRUFERVJfTEVOKCAqcHB2QkRIZWFkZXIsIHVjSGVhZGVyTGVuKTsKICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfSEVBREVSX09GRlNFVCggKnBwdkJESGVhZGVyLCB1Y0hlYWRlck9mZnNldCk7CiAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0RBVEFfT0ZGU0VUKCAqcHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjSGVhZGVyT2Zmc2V0ICsgdWNIZWFkZXJMZW4gKyBleHRyYUhlYWRTcGFjZSk7CiAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0xFTiggKnBwdkJESGVhZGVyLCAqcHVzUGt0TGVuKTsKCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6IFZBTFVFUyBBUkUgSExlbj0leCBIb2ZmPSV4IGRvZmY9JXggbGVuPSV4IGV4PSVkIiwKICAgICAgICAgICAgICAgIHVjSGVhZGVyTGVuLCB1Y0hlYWRlck9mZnNldCwgCiAgICAgICAgICAgICAgICAodWNIZWFkZXJPZmZzZXQgKyB1Y0hlYWRlckxlbiArIGV4dHJhSGVhZFNwYWNlKSwgCiAgICAgICAgICAgICAgICAqcHVzUGt0TGVuLCBleHRyYUhlYWRTcGFjZSkpOwogIH0vKiBpZiBwZWVrIE1BQyBzdWNjZXNzKi8KCn0vKiBXTEFOVExfUHJlcGFyZUJESGVhZGVyICovCiNlbmRpZgoKLy9USElTIElTIEEgSEFDSyBBTkQgTkVFRFMgVE8gQkUgRklYRUQgRk9SIENPTkNVUlJFTkNZCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOX1RMR2V0TmV4dFR4SWRzCgogIERFU0NSSVBUSU9OCiAgICBHZXRzIHRoZSBuZXh0IHN0YXRpb24gYW5kIG5leHQgQUMgaW4gdGhlIGxpc3QgdGhhdCBzaG91bGQgYmUgc2VydmVkIGJ5IHRoZSBUTC4KCiAgICBNdWx0aXBsZSBTdGF0aW9uIFNjaGVkdWxpbmcgYW5kIFRMIHF1ZXVlIG1hbmFnZW1lbnQuIAoKICAgIDQgSEREIEJDL01DIGRhdGEgcGFja2V0IHF1ZXVlIHN0YXR1cyBpcyBzcGVjaWZpZWQgYXMgU3RhdGlvbiAwJ3Mgc3RhdHVzLiBXZWlnaHRzIHVzZWQKICAgIGluIFdGUSBhbGdvcml0aCBhcmUgaW5pdGlhbGl6ZWQgaW4gV0xBTlRMX09QRU4gYW5kIGNvbnRhaW5lZCBpbiB0bENvbmZpZ0luZm8gZmllbGQuCiAgICBFYWNoIHN0YXRpb24gaGFzIGZpZWxkcyBvZiB1Y1BrdFBlbmRpbmcgYW5kIEFDIG1hc2sgdG8gdGVsbCB3aGV0aGVyIGEgQUMgaGFzIHRyYWZmaWMKICAgIG9yIG5vdC4KICAgICAgCiAgICBTdGF0aW9ucyBhcmUgc2VydmVkIGluIGEgcm91bmQtcm9iaW4gZmFzaGlvbiBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgdG8gbG93ZXN0IHByaW9yaXR5LgogICAgVGhlIG51bWJlciBvZiByb3VuZC1yb2JpbiB0aW1lcyBvZiBlYWNoIHByaW9pcnR5IGVxdWFscyB0byB0aGUgV0ZRIHdlaWdodHMgYW5kIGRpZmZlcmV0aWF0ZXMKICAgIHRoZSB0cmFmZmljIG9mIGRpZmZlcmVudCBwcmlvaXJ0eS4gQXMgc3VjaCwgc3RhdGlvbnMgY2FuIG5vdCBwcm92aWRlIGxvdyBwcmlvcml0eSBwYWNrZXRzIGlmCiAgICBoaWdoIHByaW9yaXR5IHBhY2tldHMgYXJlIGFsbCBzZXJ2ZWQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICBPVVQKICAgcHVjU1RBSWQ6ICAgIFN0YXRpb24gSUQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QKCiAgU0lERSBFRkZFQ1RTCiAgIAogICBUTCBjb250ZXh0IGNvbnRhaW5zIGN1cnJlbnRseSBzZXJ2ZWQgc3RhdGlvbiBJRCBpbiB1Y0N1cnJlbnRTVEEgZmllbGQsIGN1cnJlbnRseSBzZXJ2ZWQgQUMKICAgaW4gdUN1clNlcnZlZEFDIGZpZWxkLCBhbmQgdW5zZXJ2ZWQgd2VpZ2h0cyBvZiBjdXJyZW50IEFDIGluIHVDdXJMZWZ0V2VpZ2h0LgogICBXaGVuIGV4aXN0aW5nIGZyb20gdGhlIGZ1bmN0aW9uLCB0aGVzZSB0aHJlZSBmaWVsZHMgYXJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOX1RMQVBHZXROZXh0VHhJZHMKKAogIHZfUFZPSURfdCAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgcHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiOwogIHZfVThfdCAgICAgICAgICB1Y0FDRmlsdGVyID0gMTsKICB2X1U4X3QgICAgICAgICAgdWNOZXh0U1RBIDsgCiAgdl9CT09MX3QgICAgICAgIGlzU2VydmVkID0gVFJVRTsgIC8vY3VycmVudCByb3VuZCBoYXMgZmluZCBhIHBhY2tldCBvciBub3QKICB2X1U4X3QgICAgICAgICAgdWNBQ0xvb3BOdW0gPSBXTEFOVExfQUNfVk8gKyAxOyAvL251bWJlciBvZiBsb29wIHRvIGdvCiAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzazsgLy8gVFggRmxvd01hc2sgZnJvbSBXREEKICB1aW50OCAgICAgICAgICAgdWNBQ01hc2s7IAogIHVpbnQ4ICAgICAgICAgICBpID0gMDsgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy9FTlRFUigpOwoKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOX1RMQVBHZXROZXh0VHhJZHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX0dldFR4Rmxvd01hc2soIHB2b3NHQ3R4LCAmdUZsb3dNYXNrICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6RmFpbGVkIHRvIHJldHJpZXZlIEZsb3cgY29udHJvbCBtYXNrIGZyb20gV0RBIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHVjTmV4dFNUQSA9IHBUTENiLT51Y0N1cnJlbnRTVEE7CgogICsrdWNOZXh0U1RBOwoKICBpZiAoIFdMQU5fTUFYX1NUQV9DT1VOVCA8PSB1Y05leHRTVEEgKQogIHsKICAgIC8vb25lIHJvdW5kIGlzIGRvbmUuCiAgICB1Y05leHRTVEEgPSAwOwogICAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodC0tOwogICAgaXNTZXJ2ZWQgPSBGQUxTRTsKICAgIGlmICggMCA9PSBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ICkKICAgIHsKICAgICAgLy9jdXJyZW50IHByaW9pcnR5IGlzIGRvbmUKICAgICAgaWYgKCBXTEFOVExfQUNfQksgPT0gKFdMQU5UTF9BQ0VudW1UeXBlKXBUTENiLT51Q3VyU2VydmVkQUMgKQogICAgICB7CiAgICAgICAgLy9lbmQgb2YgY3VycmVudCBWTywgVkksIEJFLCBCSyBsb29wLiBSZXNldCBwcmlvcml0eS4KICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDID0gV0xBTlRMX0FDX1ZPOwogICAgICB9CiAgICAgIGVsc2UgCiAgICAgIHsKICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDIC0tOwogICAgICB9CgogICAgICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID0gIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbcFRMQ2ItPnVDdXJTZXJ2ZWRBQ107CiAKICAgIH0gLy8gKDAgPT0gcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCkKICB9IC8vKCBXTEFOX01BWF9TVEFfQ09VTlQgPT0gdWNOZXh0U1RBICkKCiAgLy9kZWNpZGUgaG93IG1hbnkgbG9vcHMgdG8gZ28uIGlmIGN1cnJlbnQgbG9vcCBpcyBwYXJ0aWFsLCBkbyBvbmUgZXh0cmEgdG8gbWFrZSBzdXJlCiAgLy93ZSBjb3ZlciBldmVyeSBzdGF0aW9uCiAgaWYgKCgxID09IHBUTENiLT51Y0N1ckxlZnRXZWlnaHQpICYmICh1Y05leHRTVEEgIT0gMCkpCiAgewogICAgdWNBQ0xvb3BOdW0gKys7IC8vIG5vdyBpcyA1IGxvb3BzCiAgfQoKICAvKiBTdGFydCB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkuIHVjTmV4dFNUQSwgcFRMQ2ItPnVDdXJTZXJ2ZWRBQywgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodAogICAgIGFsbCBoYXZlIHByZXZpb3VzIHZhbHVlcy4qLwogIGZvciAoOyB1Y0FDTG9vcE51bSA+IDA7ICB1Y0FDTG9vcE51bS0tKQogIHsKCiAgICB1Y0FDRmlsdGVyID0gMSA8PCBwVExDYi0+dUN1clNlcnZlZEFDOwoKICAgIC8vIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQga2VlcHMgcHJldmlvdXMgcmVzdWx0cy4KICAgIGZvciAoOyAocFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA+IDApICYmICh1Rmxvd01hc2sgJiB1Y0FDRmlsdGVyKTsgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodC0tICkKICAgIHsKCiAgICAgIGZvciAoIDsgdWNOZXh0U1RBIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyB1Y05leHRTVEEgKysgKQogICAgICB7CiAgICAgICAgaWYoTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdKQogICAgICAgIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLCB1Y0FDTWFzaywgaSk7CgogICAgICAgIGlmICggKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNFeGlzdHMpIHx8CiAgICAgICAgICAgICAoKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNQa3RQZW5kaW5nKSAmJiAhKHVjQUNNYXNrKSkgfHwKICAgICAgICAgICAgICgwID09ICh1Y0FDTWFzayAmIHVjQUNGaWx0ZXIpKSApCgogICAgICAgIHsKICAgICAgICAgIC8vY3VycmVudCBzdGF0aW9uIGRvZXMgbm90IGV4aXN0IG9yIGhhdmUgYW55IHBhY2tldCB0byBzZXJ2ZS4KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT50bFN0YXRlKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIiVzIFN0YSAlZCBub3QgaW4gYXV0aCBzdGF0ZSBzbyBza2lwcGluZyBpdC4iLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCB1Y05leHRTVEEpKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy9nbyB0byBuZXh0IHN0YXRpb24gaWYgY3VycmVudCBzdGF0aW9uIGNhbid0IHNlbmQgZHVlIHRvIGZsb3cgY29udHJvbAogICAgICAgIC8vU3RhdGlvbiBpcyBhbGxvd2VkIHRvIHNlbmQgd2hlbiBpdCBpcyBub3QgaW4gTFdNIG1vZGUuIFdoZW4gc3RhdGlvbiBpcyBpbiBMV00gbW9kZSwKICAgICAgICAvL3N0YXRpb24gaXMgYWxsb3dlZCB0byBzZW5kIG9ubHkgYWZ0ZXIgRlcgcmVwb3J0cyBGVyBtZW1vcnkgaXMgYmVsb3cgdGhyZXNob2xkIGFuZCBvbi1mbHkKICAgICAgICAvL3BhY2tldHMgYXJlIGxlc3MgdGhlbiBhbGxvd2VkIHZhbHVlCiAgICAgICAgaWYgKCAoVFJVRSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y0x3bU1vZGVFbmFibGVkKSAmJgogICAgICAgICAgICAgKChGQUxTRSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y0x3bUV2ZW50UmVwb3J0ZWQpIHx8CiAgICAgICAgICAgICAgICAgKDAgPCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51QnVmZlRocmVzaG9sZE1heCkpCiAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCgogICAgICAgIC8vIEZpbmQgYSBzdGF0aW9uLiBXZWlnaHQgaXMgdXBkYXRlZCBhbHJlYWR5LgogICAgICAgICpwdWNTVEFJZCA9IHVjTmV4dFNUQTsKICAgICAgICBwVExDYi0+dWNDdXJyZW50U1RBID0gdWNOZXh0U1RBOwogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDID0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQzsKICAKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAiIFRMIHNlcnZlIG9uZSBzdGF0aW9uIEFDOiAlZCAgVzogJWQgU3RhSWQ6ICVkIiwKICAgICAgICAgICAgICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMsIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQsIHBUTENiLT51Y0N1cnJlbnRTVEEgKSk7CiAgICAgIAogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgIH0gLy9TVEEgbG9vcAoKICAgICAgdWNOZXh0U1RBID0gMDsKICAgICAgaWYgKCBGQUxTRSA9PSBpc1NlcnZlZCApCiAgICAgIHsKICAgICAgICAvL2N1cnJlbnQgbG9vcCBmaW5kcyBubyBwYWNrZXQubm8gbmVlZCB0byByZXBlYXQgZm9yIHRoZSBzYW1lIHByaW9yaXR5CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgLy9jdXJyZW50IGxvb3AgaXMgcGFydGlhbCBsb29wLiBnbyBmb3Igb25lIG1vcmUgbG9vcC4KICAgICAgaXNTZXJ2ZWQgPSBGQUxTRTsKCiAgICB9IC8vV2VpZ2h0IGxvb3AKCiAgICBpZiAoV0xBTlRMX0FDX0JLID09IHBUTENiLT51Q3VyU2VydmVkQUMpCiAgICB7CiAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfVk87CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMtLTsKICAgIH0KICAgIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgPSAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1twVExDYi0+dUN1clNlcnZlZEFDXTsKCiAgfS8vIEFDIGxvb3AKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICIgVEwgY2FuJ3QgZmluZCBvbmUgc3RhdGlvbiB0byBzZXJ2ZSBcbiIgKSk7CgogIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfQks7CiAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA9IDE7CiAgLy9pbnZhbGlkIG51bWJlciB3aWxsIGJlIGNhcHR1cmVkIGJ5IGNhbGxlcgogIHBUTENiLT51Y0N1cnJlbnRTVEEgPSBXTEFOX01BWF9TVEFfQ09VTlQ7IAoKICAqcHVjU1RBSWQgPSBwVExDYi0+dWNDdXJyZW50U1RBOwogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTl9UTEdldE5leHRUeElkcwoKICBERVNDUklQVElPTgogICAgR2V0cyB0aGUgbmV4dCBzdGF0aW9uIGFuZCBuZXh0IEFDIGluIHRoZSBsaXN0CgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICBPVVQKICAgcHVjU1RBSWQ6ICAgIFN0YXRpb24gSUQKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTl9UTEdldE5leHRUeElkcwooCiAgdl9QVk9JRF90ICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICBwdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2I7CiAgdl9VOF90ICAgICAgICAgIHVjTmV4dEFDOwogIHZfVThfdCAgICAgICAgICB1Y05leHRTVEE7IAogIHZfVThfdCAgICAgICAgICB1Y0NvdW50OyAKICB2X1U4X3QgICAgICAgICAgdUZsb3dNYXNrOyAvLyBUWCBGbG93TWFzayBmcm9tIFdEQQogIHZfVThfdCAgICAgICAgICB1Y0FDTWFzayA9IDA7CiAgdl9VOF90ICAgICAgICAgIGkgPSAwOyAKCiAgdEJzc1N5c3RlbVJvbGUgc3lzdGVtUm9sZTsgLy9SRyBIQUNLIHRvIGJlIHJlbW92ZWQKICB0cEFuaVNpckdsb2JhbCBwTWFjOwoKICBwTWFjID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcE1hYyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBNYWMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHN5c3RlbVJvbGUgPSB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOX1RMR2V0TmV4dFR4SWRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKGVTWVNURU1fQVBfUk9MRSA9PSBzeXN0ZW1Sb2xlKSB8fCAodm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZygpKSB8fCBwVExDYi0+dWNUZGxzUGVlckNvdW50KQojZWxzZQogIGlmICgoZVNZU1RFTV9BUF9ST0xFID09IHN5c3RlbVJvbGUpIHx8ICh2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpKQojZW5kaWYKICB7CiAgICByZXR1cm4gV0xBTl9UTEFQR2V0TmV4dFR4SWRzKHB2b3NHQ3R4LHB1Y1NUQUlkKTsKICB9CgoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfR2V0VHhGbG93TWFzayggcHZvc0dDdHgsICZ1Rmxvd01hc2sgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gcmV0cmlldmUgRmxvdyBjb250cm9sIG1hc2sgZnJvbSBXREEiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLypTVEEgaWQgLSBubyBwcmlvcml0eSB5ZXQgaW1wbGVtZW50ZWQgKi8KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaG9vc2UgdGhlIG5leHQgU1RBIGZvciB0eCAtIGZvciBub3cgZ28gaW4gYSByb3VuZCByb2JpbiBmYXNoaW9uCiAgICB0aHJvdWdoIGFsbCB0aGUgc3RhdGlvbnMgdGhhdCBoYXZlIHBlbmRpbmcgcGFja2V0cyAgICAgCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNOZXh0U1RBID0gcFRMQ2ItPnVjQ3VycmVudFNUQTsKICAKICBwVExDYi0+dWNDdXJyZW50U1RBID0gV0xBTl9NQVhfU1RBX0NPVU5UOyAKICBmb3IgKCB1Y0NvdW50ID0gMDsgCiAgICAgICAgdWNDb3VudCA8IFdMQU5fTUFYX1NUQV9DT1VOVDsKICAgICAgICB1Y0NvdW50KysgKQogIHsKICAgIHVjTmV4dFNUQSA9ICggKHVjTmV4dFNUQSsxKSA+PSBXTEFOX01BWF9TVEFfQ09VTlQgKT8wOih1Y05leHRTVEErMSk7CiAgICBpZihOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0pCiAgICB7CiAgICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y0V4aXN0cyApICYmCiAgICAgICAgKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y1BrdFBlbmRpbmcgKSkKICAgIHsKICAgICAgaWYgKFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT50bFN0YXRlKQogICAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIlNUQSBJRDogJWQgb24gV0xBTl9UTEdldE5leHRUeElkcyIsICpwdWNTVEFJZCkpOwogICAgICAgIHBUTENiLT51Y0N1cnJlbnRTVEEgPSB1Y05leHRTVEE7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIiVzIFN0YSAlZCBpcyBub3QgaW4gYXV0aCBzdGF0ZSwgc2tpcHBpbmcgdGhpcyBzdGEuIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIHVjTmV4dFNUQSkpOwogICAgICB9CiAgICB9CiAgfQoKICAqcHVjU1RBSWQgPSBwVExDYi0+dWNDdXJyZW50U1RBOwoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggKnB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICJXTEFOIFRMOk5vIHN0YXRpb24gcmVnaXN0ZXJlZCB3aXRoIFRMIGF0IHRoaXMgcG9pbnQiKSk7CgogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKCiAgfQoKICAvKkNvbnZlcnQgdGhlIGFycmF5IHRvIGEgbWFzayBmb3IgZWFzaWVyIG9wZXJhdGlvbiovCiAgV0xBTl9UTF9BQ19BUlJBWV8yX01BU0soIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0sIHVjQUNNYXNrLCBpKTsKICAKICBpZiAoIDAgPT0gdWNBQ01hc2sgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6IE1hc2sgMCAiCiAgICAgICJTVEEgSUQ6ICVkIG9uIFdMQU5fVExHZXROZXh0VHhJZHMiLCAqcHVjU1RBSWQpKTsKCiAgICAgLypzZXR0aW5nIFNUQSBpZCB0byBpbnZhbGlkIGlmIG1hc2sgaXMgMCovCiAgICAgKnB1Y1NUQUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOwoKICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQUMgaXMgdXBkYXRlZCB3aGVuZXZlciBhIHBhY2tldCBpcyBmZXRjaGVkIGZyb20gSEREIC0+IHRoZSBjdXJyZW50CiAgICB3ZWlnaHQgb2Ygc3VjaCBhbiBBQyBjYW5ub3QgYmUgMCAtPiBpbiB0aGlzIGNhc2UgVEwgaXMgZXhwZWN0ZWQgdG8KICAgIGV4aXQgdGhpcyBmdW5jdGlvbiBhdCB0aGlzIHBvaW50IGR1cmluZyB0aGUgbWFpbiBUeCBsb29wCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCA8IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudFdlaWdodCAgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBNYWludGFpbmluZyBzZXJ2aWNlZCBBQyB0bzogJWQgZm9yIFdlaWdodDogJWQiLAogICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQyAsCiAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudFdlaWdodCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBDaG9vc2UgaGlnaGVzdCBwcmlvcml0eSBBQyAtICEhISBvcHRpbWl6ZSBtZQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y05leHRBQyA9IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDOwogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJOZXh0IEFDOiAlZCIsIHVjTmV4dEFDKSk7CgogIHdoaWxlICggMCAhPSB1Y0FDTWFzayApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICIgQUMgTWFzazogJWQgTmV4dDogJWQgUmVzIDogJWQiLAogICAgICAgICAgICAgICB1Y0FDTWFzaywgKCAxIDw8IHVjTmV4dEFDICksICggdWNBQ01hc2sgJiAoIDEgPDwgdWNOZXh0QUMgKSkpKTsKCiAgICBpZiAoIDAgIT0gKCB1Y0FDTWFzayAmICggMSA8PCB1Y05leHRBQyApICYgdUZsb3dNYXNrICkpCiAgICB7CiAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQyAgICAgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfQUNFbnVtVHlwZSl1Y05leHRBQzsKICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudFdlaWdodCA9CiAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y05leHRBQ107CgogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBTd2l0Y2hpbmcgc2VydmljZWQgQUMgdG86ICVkIHdpdGggV2VpZ2h0OiAlZCIsCiAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDICwKICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50V2VpZ2h0KSk7CiAgICAgICBicmVhazsKICAgIH0KCiAgICB1Y05leHRBQyA9ICggdWNOZXh0QUMgLSAxICkgJiBXTEFOVExfTUFTS19BQzsKCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiTmV4dCBBQyAlZCIsIHVjTmV4dEFDKSk7CgogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICIgQyBBQzogJWQgQyBXOiAlZCIsCiAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQywKICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudFdlaWdodCkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTl9UTEdldE5leHRUeElkcyAqLwoKCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIERFRkFVTFQgSEFORExFUlM6IFJlZ2lzdGVyZWQgYXQgaW5pdGlhbGl6YXRpb24gd2l0aCBUTAogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYgoKICBERVNDUklQVElPTgogICAgRGVmYXVsdCBNZ210IEZybSByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIE1nbXQgRnJtLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwogICAgTm90IHVzZWQuCgogIFJFVFVSTiBWQUxVRQoKICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYgooCiAgdl9QVk9JRF90ICBwdm9zR0N0eCwKICB2X1BWT0lEX3QgIHZvc0J1ZmYKKQp7CiAgaWYgKCBOVUxMICE9IHZvc0J1ZmYgKQogIHsKICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICJXTEFOIFRMOkZhdGFsIGZhaWx1cmU6IE5vIHJlZ2lzdGVyZWQgTWdtdCBGcm0gY2xpZW50IG9uIHBrdCBSWCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoKHZvc19wa3RfdCAqKXZvc0J1ZmYpOwogIH0KCiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vIHJlZ2lzdGVyZWQgTWdtdCBGcm0gY2xpZW50IG9uIHBrdCBSWC4gTG9hZC9VbmxvYWQgaW4gcHJvZ3Jlc3MsIElnbm9yZSIpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IEJBUCByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIEJBUC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgIE5vdCB1c2VkLgoKICBSRVRVUk4gVkFMVUUKCiAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiBBbHdheXMgRkFJTFVSRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9CQVBSeERlZmF1bHRDYgooCiAgdl9QVk9JRF90ICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgIHZvc0RhdGFCdWZmLAogIFdMQU5UTF9CQVBGcmFtZUVudW1UeXBlIGZyYW1lVHlwZQopCnsKICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAiV0xBTiBUTDpGYXRhbCBmYWlsdXJlOiBObyByZWdpc3RlcmVkIEJBUCBjbGllbnQgb24gQkFQIHBrdCBSWCIpKTsKI2lmbmRlZiBCVEFNUF9URVNUCiAgVk9TX0FTU0VSVCgwKTsKI2VuZGlmCiAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IFNUQSByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIHN0YXRpb24uCiAgICAoTWVtIGNvcnJ1cHRpb24gbW9zdCBsaWtlbHksIGl0IHNob3VsZCBuZXZlciBoYXBwZW4pCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgICBOb3QgdXNlZC4KCiAgUkVUVVJOIFZBTFVFCgogICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVJ4RGVmYXVsdENiCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSogIHBSeE1ldGFJbmZvCikKewogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICJXTEFOIFRMOiBObyByZWdpc3RlcmVkIFNUQSBjbGllbnQgcnggY2IgZm9yIFNUQUlEOiAlZCBkcm9wcGluZyBwa3QiLAogICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7Cn0vKldMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IGZldGNoIGNhbGxiYWNrOiBhc3NlcnRzIGFsbCB0aGUgdGltZS4gSWYgdGhpcyBmdW5jdGlvbiBnZXRzCiAgICBjYWxsZWQgIGl0IG1lYW5zIHRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgZmV0Y2ggY2IgcG9pbnRlciBmb3Igc3RhdGlvbi4KICAgIChNZW0gY29ycnVwdGlvbiBtb3N0IGxpa2VseSwgaXQgc2hvdWxkIG5ldmVyIGhhcHBlbikKCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgIE5vdCB1c2VkLgoKICBSRVRVUk4gVkFMVUUKCiAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRTogQWx3YXlzIEZBSUxVUkUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBRmV0Y2hQa3REZWZhdWx0Q2IKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90KiAgICAgICAgICAgICAgICBwdWNTVEFJZCwKICBXTEFOVExfQUNFbnVtVHlwZSAgICAgIHVjQUMsCiAgdm9zX3BrdF90KiogICAgICAgICAgICB2b3NEYXRhQnVmZiwKICBXTEFOVExfTWV0YUluZm9UeXBlKiAgIHRsTWV0YUluZm8KKQp7CiAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgIldMQU4gVEw6RmF0YWwgZmFpbHVyZTogTm8gcmVnaXN0ZXJlZCBTVEEgY2xpZW50IG9uIGRhdGEgcGt0IFJYIikpOwogIFZPU19BU1NFUlQoMCk7CiAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4Q29tcERlZmF1bHRDYgoKICBERVNDUklQVElPTgogICAgRGVmYXVsdCB0eCBjb21wbGV0ZSBoYW5kbGVyLiBJdCB3aWxsIHJlbGVhc2UgdGhlIGNvbXBsZXRlZCBwa3QgdG8KICAgIHByZXZlbnQgbWVtb3J5IGxlYWtzLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvCiAgICAgICAgICAgICAgICAgICAgVEwvSEFML1BFL0JBUC9IREQgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20KICAgICAgICAgICAgICAgICAgICBpdHMgY29udGV4dAogICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgVk9TUyBkYXRhIGJ1ZmZlciB0aGF0IHdhcyB0cmFuc21pdHRlZAogICAgd1R4U1RBdHVzOiAgICAgIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXNzaW9uCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uOyBwbGVhc2UKICAgIGNoZWNrIHZvc19wa3RfcmV0dXJuX3BhY2tldCBmb3IgcG9zc2libGUgZXJyb3IgY29kZXMuCgogICAgUGxlYXNlIGNoZWNrICB2b3NfcGt0X3JldHVybl9wYWNrZXQgQVBJIGZvciBwb3NzaWJsZSByZXR1cm4gdmFsdWVzLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4Q29tcERlZmF1bHRDYgooCiB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKIHZvc19wa3RfdCogICAgIHZvc0RhdGFCdWZmLAogVk9TX1NUQVRVUyAgICAgd1R4U1RBdHVzCikKewogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICJXTEFOIFRMOlRYQ29tcCBub3QgcmVnaXN0ZXJlZCwgcmVsZWFzaW5nIHBrdCB0byBwcmV2ZW50IG1lbSBsZWFrIikpOwogIHJldHVybiB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwp9LypXTEFOVExfVHhDb21wRGVmYXVsdENiKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIENsZWFudXAgZnVuY3Rpb25zCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xlYW5DQgoKICBERVNDUklQVElPTgogICAgQ2xlYW5zIFRMIGNvbnRyb2wgYmxvY2sKCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcFRMQ2I6ICAgICAgIHBvaW50ZXIgdG8gVEwncyBjb250cm9sIGJsb2NrCiAgICB1Y0VtcHR5OiAgICAgc2V0IGlmIFRMIGhhcyB0byBjbGVhbiB1cCB0aGUgcXVldWVzIGFuZCByZWxlYXNlIHBlZG5pbmcgcGt0cwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0NsZWFuQ0IKKAogIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKICB2X1U4X3QgICAgICB1Y0VtcHR5CikKewogIHZfVThfdCB1Y0luZGV4OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfQ2xlYW5DQiIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKiBudW1iZXIgb2YgcGFja2V0cyBzZW50IHRvIEJBTCB3YWl0aW5nIGZvciB0eCBjb21wbGV0ZSBjb25maXJtYXRpb24gKi8KICBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50ID0gMDsKCiAgLyogZ2xvYmFsIHN1c3BlbmQgZmxhZyAqLwogICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAxKTsKCiAgLyogcmVzb3VyY2UgZmxhZyAqLwogIHBUTENiLT51UmVzQ291bnQgPSAwOwoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGllbnQgc3RhdGlvbnMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9TVEFfQ09VTlQgOyB1Y0luZGV4KyspCiAgewogICAgaWYoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSkKICAgIHsKICAgICAgICBXTEFOVExfQ2xlYW5TVEEoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLCB1Y0VtcHR5KTsKICAgIH0KICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWFuYWdlbWVudCBGcmFtZSBjbGllbnQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyA9IDA7CgogIGlmICggKCAwICE9IHVjRW1wdHkpICYmCiAgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKSkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOwogIH0KCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgID0gTlVMTDsKCiAgLyogc2V0IHRvIGEgZGVmYXVsdCBjYiBpbiBvcmRlciB0byBwcmV2ZW50IGNvbnN0YW50IGNoZWNraW5nIGZvciBOVUxMICovCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCA9IFdMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2I7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQlQgQU1QIGNsaWVudAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMgPSAwOwoKICBpZiAoKCAwICE9IHVjRW1wdHkpICYmCiAgICAgICggTlVMTCAhPSBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkpCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOwogIH0KICAKICBpZiAoKCAwICE9IHVjRW1wdHkpICYmCiAgICAgICggTlVMTCAhPSBwVExDYi0+dm9zRHVtbXlCdWYgKSkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnZvc0R1bW15QnVmKTsKICB9CgogIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgID0gTlVMTDsKCiAgcFRMQ2ItPnZvc0R1bW15QnVmID0gTlVMTDsKICBwVExDYi0+dm9zVGVtcEJ1ZiAgPSBOVUxMOwogIHBUTENiLT51Y0NhY2hlZFNUQUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOwoKICAvKiBzZXQgdG8gYSBkZWZhdWx0IGNiIGluIG9yZGVyIHRvIHByZXZlbnQgY29uc3RhbnQgY2hlY2tpbmcgZm9yIE5VTEwgKi8KICBwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCA9IFdMQU5UTF9CQVBSeERlZmF1bHRDYjsKCiAgcFRMQ2ItPnVjUmVnaXN0ZXJlZFN0YUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwoKfS8qIFdMQU5UTF9DbGVhbkNCKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFuU1RBCgogIERFU0NSSVBUSU9OCiAgICBDbGVhbnMgYSBzdGF0aW9uIGNvbnRyb2wgYmxvY2suCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNFbXB0eTogICAgICAgIGlmIHNldCB0aGUgcXVldWVzIGFuZCBwZW5kaW5nIHBrdHMgd2lsbCBiZSBlbXB0eWVkCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0NsZWFuU1RBCigKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogIHB0bFNUQUNsaWVudCwKICB2X1U4X3QgICAgICAgICAgICAgdWNFbXB0eQopCnsKICB2X1U4X3QgIHVjSW5kZXg7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdGxTVEFDbGllbnQgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfQ2xlYW5TVEEiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFyIHN0YXRpb24gZnJvbSBUTAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDogQ2xlYXJpbmcgU1RBIENsaWVudCBJRDogJWQsIEVtcHR5IGZsYWc6ICVkIiwKICAgICAgICAgICAgIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNTVEFJZCwgdWNFbXB0eSApKTsKCiAgcHRsU1RBQ2xpZW50LT5wZm5TVEFSeCAgICAgICAgICA9IFdMQU5UTF9TVEFSeERlZmF1bHRDYjsKICBwdGxTVEFDbGllbnQtPnBmblNUQVR4Q29tcCAgICAgID0gV0xBTlRMX1R4Q29tcERlZmF1bHRDYjsKICBwdGxTVEFDbGllbnQtPnBmblNUQUZldGNoUGt0ICAgID0gV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiOwoKICBwdGxTVEFDbGllbnQtPnRsU3RhdGUgICAgICAgICAgID0gV0xBTlRMX1NUQV9JTklUOwogIHB0bFNUQUNsaWVudC0+dGxQcmkgICAgICAgICAgICAgPSBXTEFOVExfU1RBX1BSSV9OT1JNQUw7CgogIHZvc196ZXJvX21hY2FkZHIoICZwdGxTVEFDbGllbnQtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzICk7CiAgdm9zX3plcm9fbWFjYWRkciggJnB0bFNUQUNsaWVudC0+d1NUQURlc2MudkJTU0lEZm9ySUJTUyApOwogIHZvc196ZXJvX21hY2FkZHIoICZwdGxTVEFDbGllbnQtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcyApOwoKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU1RBSWQgID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlID0gV0xBTl9TVEFfTUFYOwoKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCAgICAgPSAwOwogIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNBZGRSbXZMTEMgICAgICA9IDA7CiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gPSAwOwogIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjUHJvdGVjdGVkRnJhbWUgPSAwOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFNU0RVIGluZm9ybWF0aW9uIGZvciB0aGUgU1RBCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggKCAwICE9IHVjRW1wdHkgKSAmJgogICAgICAgKCBOVUxMICE9IHB0bFNUQUNsaWVudC0+dm9zQU1TRFVDaGFpblJvb3QgKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAgICJXTEFOIFRMOk5vbiBOVUxMIHZvc0FNU0RVQ2hhaW5Sb290ICg9JXApIG9uIFdMQU5UTF9DbGVhblNUQSwiCiAgICAgICAgICAgICAgICJzdXNwZWN0aW5nIGEgbWVtb3J5IGNvcnJ1cHRpb24iKSk7CgogIH0KCiAgcHRsU1RBQ2xpZW50LT52b3NBTVNEVUNoYWluICAgICA9IE5VTEw7CiAgcHRsU1RBQ2xpZW50LT52b3NBTVNEVUNoYWluUm9vdCA9IE5VTEw7CgogIHZvc19tZW1femVybyggKHZfUFZPSURfdClwdGxTVEFDbGllbnQtPmF1Y01QRFVIZWFkZXIsCiAgICAgICAgICAgICAgICAgV0xBTlRMX01QRFVfSEVBREVSX0xFTik7CiAgcHRsU1RBQ2xpZW50LT51Y01QRFVIZWFkZXJMZW4gICAgPSAwOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlb3JkZXJpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBTVEEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9USUQgOyB1Y0luZGV4KyspCiAgewogICAgaWYoMCA9PSBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0udWNFeGlzdHMpCiAgICB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYoTlVMTCAhPSBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlcikKICAgIHsKICAgICAgcHRsU1RBQ2xpZW50LT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLnJlb3JkZXJCdWZmZXItPmlzQXZhaWxhYmxlID0gVk9TX1RSVUU7CiAgICAgIG1lbXNldCgmcHRsU1RBQ2xpZW50LT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLnJlb3JkZXJCdWZmZXItPmFycmF5QnVmZmVyWzBdLCAwLCBXTEFOVExfTUFYX1dJTlNJWkUgKiBzaXplb2Yodl9QVk9JRF90KSk7CiAgICB9CiAgICB2b3NfdGltZXJfZGVzdHJveSgmcHRsU1RBQ2xpZW50LT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLmFnaW5nVGltZXIpOwogICAgbWVtc2V0KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0sIDAsIHNpemVvZihXTEFOVExfQkFSZW9yZGVyVHlwZSkpOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgUU9TIGluZm9ybWF0aW9uIGZvciB0aGUgU1RBCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgcHRsU1RBQ2xpZW50LT51Y0N1cnJlbnRBQyAgICAgPSBXTEFOVExfQUNfVk87CiAgIHB0bFNUQUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKICAgcHRsU1RBQ2xpZW50LT51Y1NlcnZpY2VkQUMgICAgPSBXTEFOVExfQUNfQks7CgogICB2b3NfbWVtX3plcm8oIHB0bFNUQUNsaWVudC0+YXVjQUNNYXNrLCBzaXplb2YocHRsU1RBQ2xpZW50LT5hdWNBQ01hc2spKTsKICAgdm9zX21lbV96ZXJvKCAmcHRsU1RBQ2xpZW50LT53VUFQU0RJbmZvLCBzaXplb2YocHRsU1RBQ2xpZW50LT53VUFQU0RJbmZvKSk7CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGF0cyBpbmZvCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIHZvc19tZW1femVybyggcHRsU1RBQ2xpZW50LT5hdVJ4Q291bnQsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0bFNUQUNsaWVudC0+YXVSeENvdW50WzBdKSogV0xBTl9NQVhfVElEKTsKICAgdm9zX21lbV96ZXJvKCBwdGxTVEFDbGllbnQtPmF1VHhDb3VudCwKICAgICAgICAgICAgICAgICBzaXplb2YocHRsU1RBQ2xpZW50LT5hdVR4Q291bnRbMF0pKiBXTEFOX01BWF9USUQpOwogICBwdGxTVEFDbGllbnQtPnJzc2lBdmcgPSAwOwoKICAgLypUeCBub3Qgc3VzcGVuZGVkIGFuZCBzdGF0aW9uIGZ1bGx5IHJlZ2lzdGVyZWQqLwogICB2b3NfYXRvbWljX3NldF9VOCggJnB0bFNUQUNsaWVudC0+dWNUeFN1c3BlbmRlZCwgMCk7CiAgIHZvc19hdG9taWNfc2V0X1U4KCAmcHRsU1RBQ2xpZW50LT51Y05vTW9yZURhdGEsIDEpOwoKICBpZiAoIDAgPT0gdWNFbXB0eSApCiAgewogICAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1VjYXN0U2lnICAgICAgID0gV0xBTl9UTF9JTlZBTElEX1VfU0lHOwogICAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y0JjYXN0U2lnICAgICAgID0gV0xBTl9UTF9JTlZBTElEX0JfU0lHOwogIH0KCiAgcHRsU1RBQ2xpZW50LT51Y0V4aXN0cyAgICAgICA9IDA7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0YXRpc3RpY3MgaW5mbyAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBtZW1zZXQoJnB0bFNUQUNsaWVudC0+dHJhZmZpY1N0YXRpc3RpY3MsCiAgICAgICAgIDAsCiAgICAgICAgIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCiAgLypmaXggbWUhITogYWRkIG5ldyB2YWx1ZXMgZnJvbSB0aGUgVEwgQ2IgZm9yIGNsZWFudXAgKi8KICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0NsZWFuU1RBICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9FbmFibGVVQVBTREZvckFDCgogIERFU0NSSVBUSU9OCiAgIENhbGxlZCBieSBIREQgdG8gZW5hYmxlIFVBUFNELiBUTCBpbiB0dXJuIGNhbGxzIFdEQSBBUEkgdG8gZW5hYmxlIHRoZQogICBsb2dpYyBpbiBGVy9TTE0gdG8gc3RhcnQgc2VuZGluZyB0cmlnZ2VyIGZyYW1lcy4gUHJldmlvdXNseSBUTCBoYWQgdGhlCiAgIHRyaWdnZXIgZnJhbWUgbG9naWMgd2hpY2ggbGF0ZXIgbW92ZWQgZG93biB0byBGVy4gSGVuY2UKICAgSEREIC0+IFRMIC0+IFdEQSAtPiBGVyBjYWxsIGZsb3cuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIElkCiAgICB1Y0FDOiAgICAgICAgICAgQUMgZm9yIHdoaWNoIFUtQVBTRCBpcyBiZWluZyBlbmFibGVkCiAgICB1Y1RpZDogICAgICAgICAgVElEIGZvciB3aGljaCBVLUFQU0QgaXMgc2V0dXAKICAgIHVjVVA6ICAgICAgICAgICB1c2VkIHRvIHBsYWNlIGluIHRoZSB0cmlnZ2VyIGZyYW1lIGdlbmVyYXRpb24KICAgIHVjU2VydmljZUludDogICBzZXJ2aWNlIGludGVydmFsIHVzZWQgYnkgVEwgdG8gc2VuZCB0cmlnZ2VyIGZyYW1lcwogICAgdWNTdXNwZW5kSW50OiAgIHN1c3BlbmQgaW50ZXJ2YWwgdXNlZCBieSBUTCB0byBkZXRlcm1pbmUgdGhhdCBhbgogICAgICAgICAgICAgICAgICAgIGFwcCBpcyBpZGxlIGFuZCBzaG91bGQgc3RhcnQgc2VuZGluZyB0cmlnZyBmcm1zIGxlc3Mgb2Z0ZW4KICAgIHdUU0RpcjogICAgICAgICBkaXJlY3Rpb24gb2YgVFNwZWMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRW5hYmxlVUFQU0RGb3JBQwooCiAgdl9QVk9JRF90ICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9BQ0VudW1UeXBlICB1Y0FDLAogIHZfVThfdCAgICAgICAgICAgICB1Y1RpZCwKICB2X1U4X3QgICAgICAgICAgICAgdWNVUCwKICB2X1UzMl90ICAgICAgICAgICAgdVNlcnZpY2VJbnQsCiAgdl9VMzJfdCAgICAgICAgICAgIHVTdXNwZW5kSW50LAogIFdMQU5UTF9UU0RpclR5cGUgICB3VFNEaXIKKQp7CgogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgICAgICA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXMgICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB0VWFwc2RJbmZvICAgICAgICAgIGhhbFVBUFNESW5mbzsgCiAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkKICAgICAgfHwgICBXTEFOVExfQUNfSU5WQUxJRCh1Y0FDKSB8fCAoIDAgPT0gdVNlcnZpY2VJbnQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIGlucHV0IHBhcmFtcyBvbiBXTEFOVExfRW5hYmxlVUFQU0RGb3JBQyIKICAgICAgICAgICAgICAgIiBUTDogJXAgIFNUQTogJWQgIEFDOiAlZCBTSTogJWQiLAogICAgICAgICAgICAgICBwVExDYiwgdWNTVEFJZCwgdWNBQywgdVNlcnZpY2VJbnQgKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICAvKlNldCB0aGlzIGZsYWcgaW4gb3JkZXIgdG8gcmVtZW1iZXIgdGhhdCB0aGlzIGlzIGEgdHJpZ2dlciBlbmFibGVkIEFDKi8KICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1VBUFNESW5mb1t1Y0FDXS51Y1NldCA9IDE7CiAgCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkVuYWJsaW5nIFUtQVBTRCBpbiBGVyBmb3IgU1RBOiAlZCBBQzogJWQgU0k6ICVkIFNQSTogJWQgIgogICAgICAgICAgICAgIkRJOiAlZCIsCiAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FDLCB1U2VydmljZUludCwgdVN1c3BlbmRJbnQsCiAgICAgICAgICAgICBwVExDYi0+dGxDb25maWdJbmZvLnVEZWxheWVkVHJpZ2dlckZybUludCkpOwoKICAvKlNhdmUgYWxsIGluZm8gZm9yIEhBTCovCiAgaGFsVUFQU0RJbmZvLnN0YWlkeCAgICAgICAgID0gdWNTVEFJZDsgCiAgaGFsVUFQU0RJbmZvLmFjICAgICAgICAgICAgID0gdWNBQzsgICAKICBoYWxVQVBTREluZm8udXAgICAgICAgICAgICAgPSB1Y1VQOyAgIAogIGhhbFVBUFNESW5mby5zcnZJbnRlcnZhbCAgICA9IHVTZXJ2aWNlSW50OyAgCiAgaGFsVUFQU0RJbmZvLnN1c0ludGVydmFsICAgID0gdVN1c3BlbmRJbnQ7CiAgaGFsVUFQU0RJbmZvLmRlbGF5SW50ZXJ2YWwgID0gcFRMQ2ItPnRsQ29uZmlnSW5mby51RGVsYXllZFRyaWdnZXJGcm1JbnQ7IAoKICAvKk5vdGlmeSBIQUwqLwogIHZvc1N0YXR1cyA9IFdEQV9FbmFibGVVYXBzZEFjUGFyYW1zKHB2b3NHQ3R4LCB1Y1NUQUlkLCAmaGFsVUFQU0RJbmZvKTsKCiAgcmV0dXJuIHZvc1N0YXR1czsKCn0vKldMQU5UTF9FbmFibGVVQVBTREZvckFDKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0Rpc2FibGVVQVBTREZvckFDCgogIERFU0NSSVBUSU9OCiAgIENhbGxlZCBieSBIREQgdG8gZGlzYWJsZSBVQVBTRC4gVEwgaW4gdHVybiBjYWxscyBXREEgQVBJIHRvIGRpc2FibGUgdGhlCiAgIGxvZ2ljIGluIEZXL1NMTSB0byBzdG9wIHNlbmRpbmcgdHJpZ2dlciBmcmFtZXMuIFByZXZpb3VzbHkgVEwgaGFkIHRoZQogICB0cmlnZ2VyIGZyYW1lIGxvZ2ljIHdoaWNoIGxhdGVyIG1vdmVkIGRvd24gdG8gRlcuIEhlbmNlCiAgIEhERCAtPiBUTCAtPiBXREEgLT4gRlcgY2FsbCBmbG93LgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBJZAogICAgdWNBQzogICAgICAgICBBQyBmb3Igd2hpY2ggVS1BUFNEIGlzIGJlaW5nIGVuYWJsZWQKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0Rpc2FibGVVQVBTREZvckFDCigKICB2X1BWT0lEX3QgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX0FDRW51bVR5cGUgIHVjQUMKKQp7CiAgV0xBTlRMX0NiVHlwZSogcFRMQ2I7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8IFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApCiAgICAgIHx8ICAgV0xBTlRMX0FDX0lOVkFMSUQodWNBQykgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBpbnB1dCBwYXJhbXMgb24gV0xBTlRMX0Rpc2FibGVVQVBTREZvckFDIgogICAgICAgICAgICAgICAiIFRMOiAlcCAgU1RBOiAlZCAgQUM6ICVkIiwgcFRMQ2IsIHVjU1RBSWQsIHVjQUMgKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICAvKlJlc2V0IHRoaXMgZmxhZyBhcyB0aGlzIGlzIG5vIGxvbmdlciBhIHRyaWdnZXIgZW5hYmxlZCBBQyovCiAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndVQVBTREluZm9bdWNBQ10udWNTZXQgPSAxOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6RGlzYWJsaW5nIFUtQVBTRCBpbiBGVyBmb3IgU1RBOiAlZCBBQzogJWQgIiwKICAgICAgICAgICAgIHVjU1RBSWQsIHVjQUMpKTsKCiAgLypOb3RpZnkgSEFMKi8KICBXREFfRGlzYWJsZVVhcHNkQWNQYXJhbXMocHZvc0dDdHgsIHVjU1RBSWQsIHVjQUMpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0Rpc2FibGVVQVBTREZvckFDICovCgojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgIFdMQU5UTF9SZWdSU1NJSW5kaWNhdGlvbkNCCgogIERFU0NSSVBUSU9OICBSZWdpc3RyYXRpb24gZnVuY3Rpb24gdG8gZ2V0IG5vdGlmaWNhdGlvbiBpZiBSU1NJIGNyb3NzCiAgICAgICAgICAgICAgIHRocmVzaG9sZC4KICAgICAgICAgICAgICAgQ2xpZW50IHNob3VsZCByZWdpc3RlciB0aHJlc2hvbGQsIGRpcmVjdGlvbiwgYW5kIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCgogIERFUEVOREVOQ0lFUyBOT05FCiAgICAKICBQQVJBTUVURVJTICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgIGluIHJzc2lWYWx1ZSAtIFJTU0kgdGhyZXNob2xkIHZhbHVlCiAgICAgICAgICAgICAgIGluIHRyaWdnZXJFdmVudCAtIENyb3NzIGRpcmVjdGlvbiBzaG91bGQgYmUgbm90aWZpZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVAsIERPV04sIGFuZCBDUk9TUwogICAgICAgICAgICAgICBpbiBjcm9zc0NCRnVuY3Rpb24gLSBOb3RpZmljYXRpb24gQ0IgRnVuY3Rpb24KICAgICAgICAgICAgICAgaW4gdXNyQ3R4dCAtIHVzZXIgY29udGV4dAoKICBSRVRVUk4gVkFMVUUgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVnUlNTSUluZGljYXRpb25DQgooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHZfUzdfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaVZhbHVlLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCwKICAgV0xBTlRMX1JTU0lDcm9zc1RocmVzaG9sZENCVHlwZSBjcm9zc0NCRnVuY3Rpb24sCiAgIFZPU19NT0RVTEVfSUQgICAgICAgICAgICAgICAgICAgbW9kdWxlSUQsCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dAopCnsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgIHN0YXR1cyA9IFdMQU5UTF9IU1JlZ1JTU0lJbmRpY2F0aW9uQ0IocEFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaVZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9zc0NCRnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dCk7CgogICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgIFdMQU5UTF9EZXJlZ1JTU0lJbmRpY2F0aW9uQ0IKCiAgREVTQ1JJUFRJT04gIFJlbW92ZSBzcGVjaWZpYyB0aHJlc2hvbGQgZnJvbSBsaXN0CgogIERFUEVOREVOQ0lFUyBOT05FCiAgICAKICBQQVJBTUVURVJTICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgIGluIHJzc2lWYWx1ZSAtIFJTU0kgdGhyZXNob2xkIHZhbHVlCiAgICAgICAgICAgICAgIGluIHRyaWdnZXJFdmVudCAtIENyb3NzIGRpcmVjdGlvbiBzaG91bGQgYmUgbm90aWZpZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVAsIERPV04sIGFuZCBDUk9TUwogICAKICBSRVRVUk4gVkFMVUUgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgdl9TN190ICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAogICBXTEFOVExfUlNTSUNyb3NzVGhyZXNob2xkQ0JUeXBlIGNyb3NzQ0JGdW5jdGlvbiwKICAgVk9TX01PRFVMRV9JRCAgICAgICAgICAgICAgICAgICBtb2R1bGVJRAopCnsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgIHN0YXR1cyA9IFdMQU5UTF9IU0RlcmVnUlNTSUluZGljYXRpb25DQihwQWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzQ0JGdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUlEKTsKICAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICBXTEFOVExfU2V0QWxwaGEKCiAgREVTQ1JJUFRJT04gIEFMUExBIGlzIHdlaWdodCB2YWx1ZSB0byBjYWxjdWxhdGUgQVZHIFJTU0kKICAgICAgICAgICAgICAgYXZnUlNTSSA9IChBTFBIQSAqIGhpc3RvcnlSU1NJKSArICgoMTAgLSBBTFBIQSkgKiBuZXdSU1NJKQogICAgICAgICAgICAgICBhdmdSU1NJIGhhcyAoQUxQSEEgKiAxMCklIG9mIGhpc3RvcnkgUlNTSSB3ZWlnaHQgYW5kCiAgICAgICAgICAgICAgICgxMCAtIEFMUEhBKSUgb2YgbmV3UlNTSSB3ZWlnaHQKICAgICAgICAgICAgICAgVGhpcyBwb3J0aW9uIGlzIGR5bmFtaWNhbGx5IGNvbmZpZ3VyYWJsZS4KICAgICAgICAgICAgICAgRGVmYXVsdCBpcyA/CgogIERFUEVOREVOQ0lFUyBOT05FCiAgICAKICBQQVJBTUVURVJTICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgIGluIHZhbHVlQWxwYWggLSBBTFBIQQogICAKICBSRVRVUk4gVkFMVUUgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfU2V0QWxwaGEKKAogICB2X1BWT0lEX3QgcEFkYXB0ZXIsCiAgIHZfVThfdCAgICB2YWx1ZUFscGhhCikKewogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwoKICAgc3RhdHVzID0gV0xBTlRMX0hTU2V0QWxwaGEocEFkYXB0ZXIsIHZhbHVlQWxwaGEpOwogICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICBGVU5DVElPTgoKICAgREVTQ1JJUFRJT04gCiAgICAKICAgUEFSQU1FVEVSUyAKCiAgIFJFVFVSTiBWQUxVRQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0JNUFNSU1NJUmVnaW9uQ2hhbmdlZE5vdGlmaWNhdGlvbgooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICBwQWRhcHRlciwKICAgdHBTaXJSU1NJTm90aWZpY2F0aW9uIHBSU1NJTm90aWZpY2F0aW9uCikKewogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwoKICAgc3RhdHVzID0gV0xBTlRMX0hTQk1QU1JTU0lSZWdpb25DaGFuZ2VkTm90aWZpY2F0aW9uKHBBZGFwdGVyLCBwUlNTSU5vdGlmaWNhdGlvbik7CiAgIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgV0xBTlRMX1JlZ0dldFRyYWZmaWNTdGF0dXMKCiAgREVTQ1JJUFRJT04gIFJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBmb3IgdHJhZmZpYyBzdGF0dXMgbW9uaXRvcmluZwogICAgICAgICAgICAgICBEdXJpbmcgbWVhc3VyZSBwZXJpb2QgY291bnQgZGF0YSBmcmFtZXMuCiAgICAgICAgICAgICAgIElmIGZyYW1lIGNvdW50IGlzIGxhcmdlciB0aGVuIElETEUgdGhyZXNob2xkIHNldCBhcyB0cmFmZmljIE9OCiAgICAgICAgICAgICAgIG9yIE9GRi4KICAgICAgICAgICAgICAgQW5kIHRyYWZmaWMgc3RhdHVzIGlzIGNoYW5nZWQgc2VuZCByZXBvcnQgdG8gY2xpZW50IHdpdGgKICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbgoKICBERVBFTkRFTkNJRVMgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICBpbiBpZGxlVGhyZXNob2xkIC0gVHJhZmZpYyBvbiBvciBvZmYgdGhyZXNob2xkCiAgICAgICAgICAgICAgIGluIG1lYXN1cmVQZXJpb2QgLSBUcmFmZmljIHN0YXRlIGNoZWNrIHBlcmlvZAogICAgICAgICAgICAgICBpbiB0cmZmaWNTdGF0dXNDQiAtIHRyYWZmaWMgc3RhdHVzIGNoYW5nZWQgbm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0IgZnVuY3Rpb24KICAgICAgICAgICAgICAgaW4gdXNyQ3R4dCAtIHVzZXIgY29udGV4dAogICAKICBSRVRVUk4gVkFMVUUgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVnR2V0VHJhZmZpY1N0YXR1cwooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRsZVRocmVzaG9sZCwKICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlUGVyaW9kLAogICBXTEFOVExfVHJhZmZpY1N0YXR1c0NoYW5nZWRDQlR5cGUgIHRyZmZpY1N0YXR1c0NCLAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQKKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNSZWdHZXRUcmFmZmljU3RhdHVzKHBBZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkbGVUaHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVBlcmlvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmZmaWNTdGF0dXNDQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0KTsKICAgcmV0dXJuIHN0YXR1czsKfQojZW5kaWYKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFN0YXRpc3RpY3MKCiAgREVTQ1JJUFRJT04gICBHZXQgdHJhZmZpYyBzdGF0aXN0aWNzIGZvciBpZGVudGlmaWVkIHN0YXRpb24gCgogIERFUEVOREVOQ0lFUyAgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgIGluIHN0YXRUeXBlIC0gc3BlY2lmaWMgc3RhdGlzdGljcyBmaWVsZCB0byByZXNldAogICAgICAgICAgICAgICAgb3V0IHN0YXRCdWZmZXIgLSB0cmFmZmljIHN0YXRpc3RpY3MgYnVmZmVyCiAgIAogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0dldFN0YXRpc3RpY3MKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICAqc3RhdEJ1ZmZlciwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgU1RBaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICpwVExDYiAgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogICAgIHBDbGllbnRTVEEgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAqc3RhdGlzdGljcyA9IE5VTEw7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW1NUQWlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmKDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDogJWQgU1RBIElEIGRvZXMgbm90IGV4aXN0IiwgU1RBaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZihOVUxMID09IHN0YXRCdWZmZXIpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHN0YXRpc3RpY3MgYnVmZmVyIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgc3RhdGlzdGljcyA9ICZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljczsKICBtZW1jcHkoc3RhdEJ1ZmZlciwgc3RhdGlzdGljcywgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwoKICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfUmVzZXRTdGF0aXN0aWNzCgogIERFU0NSSVBUSU9OICAgUmVzZXQgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgZm9yIGlkZW50aWZpZWQgc3RhdGlvbiBJRAogICAgICAgICAgICAgICAgUmVzZXQgbWVhbnMgc2V0IHZhbHVlcyBhcyAwCgogIERFUEVOREVOQ0lFUyAgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgIGluIHN0YXRUeXBlIC0gc3BlY2lmaWMgc3RhdGlzdGljcyBmaWVsZCB0byByZXNldAogICAKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTICBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZXNldFN0YXRpc3RpY3MKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgU1RBaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICpwVExDYiAgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogICAgIHBDbGllbnRTVEEgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAqc3RhdGlzdGljcyA9IE5VTEw7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoTlVMTCA9PSBwVExDYikgCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYoMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOiAlZCBTVEEgSUQgZG9lcyBub3QgZXhpc3QiLCBTVEFpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHN0YXRpc3RpY3MgPSAmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3M7CiAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXN0YXRpc3RpY3MsIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCiAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFNwZWNTdGF0aXN0aWMKCiAgREVTQ1JJUFRJT04gICBHZXQgc3BlY2lmaWMgZmllbGQgd2l0aGluIHN0YXRpc3RpY3Mgc3RydWN0dXJlIGZvcgogICAgICAgICAgICAgICAgaWRlbnRpZmllZCBzdGF0aW9uIElEIAoKICBERVBFTkRFTkNJRVMgIE5PTkUKCiAgUEFSQU1FVEVSUyAgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgIGluIHN0YXRUeXBlIC0gc3BlY2lmaWMgc3RhdGlzdGljcyBmaWVsZCB0byByZXNldAogICAgICAgICAgICAgICAgaW4gU1RBaWQgICAgLSBTdGF0aW9uIElECiAgICAgICAgICAgICAgICBvdXQgYnVmZmVyICAtIFN0YXRpc3RpYyB2YWx1ZQogICAKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTICBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9HZXRTcGVjU3RhdGlzdGljCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgV0xBTlRMX1RSQU5TRkVSX1NUQVRJQ19UWVBFICBzdGF0VHlwZSwKICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgU1RBaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICpwVExDYiAgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogICAgIHBDbGllbnRTVEEgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAqc3RhdGlzdGljcyA9IE5VTEw7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoTlVMTCA9PSBwVExDYikgCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZigwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYoTlVMTCA9PSBidWZmZXIpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHN0YXRpc3RpYyBidWZmZXIgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBzdGF0aXN0aWNzID0gJnBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzOwogIHN3aXRjaChzdGF0VHlwZSkKICB7CiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfVUNfRkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnR4VUNGY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfTUNfRkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnR4TUNGY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfQkNfRkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnR4QkNGY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfVUNfQkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnR4VUNCY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfTUNfQkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnR4TUNCY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfQkNfQkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnR4QkNCY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfVUNfRkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4VUNGY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfTUNfRkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4TUNGY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNfRkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4QkNGY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfVUNfQkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4VUNCY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfTUNfQkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4TUNCY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNfQkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4QkNCY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNOVDoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4QmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDTlRfQ1JDX09LOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhCY250Q1JDb2s7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9SQVRFOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhSYXRlOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAqYnVmZmVyID0gMDsKICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgICBicmVhazsKICB9CgoKICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfUmVzZXRTcGVjU3RhdGlzdGljCgogIERFU0NSSVBUSU9OICAgUmVzZXQgc3BlY2lmaWMgZmllbGQgd2l0aGluIHN0YXRpc3RpY3Mgc3RydWN0dXJlIGZvcgogICAgICAgICAgICAgICAgaWRlbnRpZmllZCBzdGF0aW9uIElECiAgICAgICAgICAgICAgICBSZXNldCBtZWFucyBzZXQgYXMgMAoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKICAgICAgICAgICAgICAgIGluIFNUQWlkICAgIC0gU3RhdGlvbiBJRAoKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTICBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZXNldFNwZWNTdGF0aXN0aWMKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICBXTEFOVExfVFJBTlNGRVJfU1RBVElDX1RZUEUgIHN0YXRUeXBlLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgIFNUQWlkCikKewogIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgICBwQ2xpZW50U1RBID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKE5VTEwgPT0gcFRMQ2IpIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW1NUQWlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmKDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDogJWQgU1RBIElEIGRvZXMgbm90IGV4aXN0IiwgU1RBaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBzdGF0aXN0aWNzID0gJnBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzOwogIHN3aXRjaChzdGF0VHlwZSkKICB7CiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfVUNfRkNOVDoKICAgICAgc3RhdGlzdGljcy0+dHhVQ0ZjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfTUNfRkNOVDoKICAgICAgc3RhdGlzdGljcy0+dHhNQ0ZjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfQkNfRkNOVDoKICAgICAgc3RhdGlzdGljcy0+dHhCQ0ZjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfVUNfQkNOVDoKICAgICAgc3RhdGlzdGljcy0+dHhVQ0JjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfTUNfQkNOVDoKICAgICAgc3RhdGlzdGljcy0+dHhNQ0JjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfQkNfQkNOVDoKICAgICAgc3RhdGlzdGljcy0+dHhCQ0JjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfVUNfRkNOVDoKICAgICAgc3RhdGlzdGljcy0+cnhVQ0ZjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfTUNfRkNOVDoKICAgICAgc3RhdGlzdGljcy0+cnhNQ0ZjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNfRkNOVDoKICAgICAgc3RhdGlzdGljcy0+cnhCQ0ZjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfVUNfQkNOVDoKICAgICAgc3RhdGlzdGljcy0+cnhVQ0JjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfTUNfQkNOVDoKICAgICAgc3RhdGlzdGljcy0+cnhNQ0JjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNfQkNOVDoKICAgICAgc3RhdGlzdGljcy0+cnhCQ0JjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNOVDoKICAgICAgc3RhdGlzdGljcy0+cnhCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDTlRfQ1JDX09LOgogICAgICBzdGF0aXN0aWNzLT5yeEJjbnRDUkNvayA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9SQVRFOgogICAgICBzdGF0aXN0aWNzLT5yeFJhdGUgPSAwOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIHN0YXR1czsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgIEZVTkNUSU9OCgogICBERVNDUklQVElPTiAgIFJlYWQgUlNTSSB2YWx1ZSBvdXQgb2YgYSBSWCBCRAogICAgCiAgIFBBUkFNRVRFUlM6ICBDYWxsZXIgbXVzdCB2YWxpZGF0ZSBhbGwgcGFyYW1ldGVycyAKCiAgIFJFVFVSTiBWQUxVRQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1JlYWRSU1NJCigKICAgdl9QVk9JRF90ICAgICAgICBwQWRhcHRlciwKICAgdl9QVk9JRF90ICAgICAgICBwQkRIZWFkZXIsCiAgIHZfVThfdCAgICAgICAgICAgU1RBaWQKKQp7CiAgIFdMQU5UTF9DYlR5cGUgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgIHZfUzdfdCAgICAgICAgICAgY3VycmVudFJTU0ksIGN1cnJlbnRSU1NJMCwgY3VycmVudFJTU0kxOwoKCiAgIGlmKE5VTEwgPT0gdGxDdHh0KQogICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgSW52YWxpZCBUTCBoYW5kbGUiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogICB9CgogICBpZiAoIE5VTEwgPT0gdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXSApCiAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgfQoKICAgY3VycmVudFJTU0kwID0gV0xBTlRMX0dFVFJTU0kwKHBCREhlYWRlcik7CiAgIGN1cnJlbnRSU1NJMSA9IFdMQU5UTF9HRVRSU1NJMShwQkRIZWFkZXIpOwogICBjdXJyZW50UlNTSSAgPSAoY3VycmVudFJTU0kwID4gY3VycmVudFJTU0kxKSA/IGN1cnJlbnRSU1NJMCA6IGN1cnJlbnRSU1NJMTsKCiAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnJzc2lBdmcgPSBjdXJyZW50UlNTSTsKCiAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKgogREVTQ1JJUFRJT04gCiAgICBUTCByZXR1cm5zIHRoZSB3ZWlnaHQgY3VycmVudGx5IG1haW50YWluZWQgaW4gVEwuCiBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKCiBPVVQKICAgIHBBQ1dlaWdodHM6ICAgICBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBmb3IgZmlsbGluZyBpbiB3ZWlnaHRzCgogUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCiovClZPU19TVEFUVVMgIApXTEFOVExfR2V0QUNXZWlnaHRzIAooIAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICAgICAgICAgcEFDV2VpZ2h0cwopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgdl9VOF90ICAgICAgICAgIHVjSW5kZXg7IAogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBBQ1dlaWdodHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0QUNXZWlnaHRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldEFDV2VpZ2h0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwQUNXZWlnaHRzW3VjSW5kZXhdID0gcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y0luZGV4XTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgoKLyoKIERFU0NSSVBUSU9OIAogICAgQ2hhbmdlIHRoZSB3ZWlnaHQgY3VycmVudGx5IG1haW50YWluZWQgYnkgVEwuCiBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKICAgIHBBQ1dlaWdodHM6ICAgICBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBjb250YWluIHRoZSB3ZWlnaHRzIHRvIHVzZQoKCiBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKKi8KVk9TX1NUQVRVUyAgCldMQU5UTF9TZXRBQ1dlaWdodHMgCiggCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgICAgICAgICBwQUNXZWlnaHRzCikKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcEFDV2VpZ2h0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRBQ1dlaWdodHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0QUNXZWlnaHRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOVExfTUFYX0FDIDsgdWNJbmRleCsrKQogIHsKICAgIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNJbmRleF0gPSBwQUNXZWlnaHRzW3VjSW5kZXhdOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgIEZVTkNUSU9OCgogICBERVNDUklQVElPTiAKICAgIAogICBQQVJBTUVURVJTIAoKICAgUkVUVVJOIFZBTFVFCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZCBXTEFOVExfUG93ZXJTdGF0ZUNoYW5nZWRDQgooCiAgIHZfUFZPSURfdCBwQWRhcHRlciwKICAgdFBtY1N0YXRlIG5ld1N0YXRlCikKewogICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgICAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKCiAgIGlmIChOVUxMID09IHRsQ3R4dCkKICAgewogICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFRMIENvbnRyb2wgQmxvY2siLCBfX2Z1bmNfXyApOwogICAgIHJldHVybjsKICAgfQoKICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIlBvd2VyIHN0YXRlIGNoYW5nZWQsIG5ldyBzdGF0ZSBpcyAlZCIsIG5ld1N0YXRlICk7CiAgIHN3aXRjaChuZXdTdGF0ZSkKICAgewogICAgICBjYXNlIEZVTExfUE9XRVI6CiAgICAgICAgIHRsQ3R4dC0+aXNCTVBTID0gVk9TX0ZBTFNFOwogICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQk1QUzoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgICAgICAgV0xBTlRMX1NldEZXUlNTSVRocmVzaG9sZHMocEFkYXB0ZXIpOwojZW5kaWYKCiAgICAgICAgIHRsQ3R4dC0+aXNCTVBTID0gVk9TX1RSVUU7CiAgICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBJTVBTOgogICAgICBjYXNlIExPV19QT1dFUjoKICAgICAgY2FzZSBSRVFVRVNUX0JNUFM6CiAgICAgIGNhc2UgUkVRVUVTVF9GVUxMX1BPV0VSOgogICAgICBjYXNlIFJFUVVFU1RfSU1QUzoKICAgICAgY2FzZSBTVE9QUEVEOgogICAgICBjYXNlIFJFUVVFU1RfU1RBUlRfVUFQU0Q6CiAgICAgIGNhc2UgUkVRVUVTVF9TVE9QX1VBUFNEOgogICAgICBjYXNlIFVBUFNEOgogICAgICBjYXNlIFJFUVVFU1RfU1RBTkRCWToKICAgICAgY2FzZSBTVEFOREJZOgogICAgICBjYXNlIFJFUVVFU1RfRU5URVJfV09XTDoKICAgICAgY2FzZSBSRVFVRVNUX0VYSVRfV09XTDoKICAgICAgY2FzZSBXT1dMOgogICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIk5vdCBoYW5kbGUgdGhpcyBldmVudHMgJWQiLCBuZXdTdGF0ZSApKTsKICAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJOb3QgYSB2YWxpZCBldmVudCAlZCIsIG5ld1N0YXRlICkpOwogICAgICAgICBicmVhazsKICAgfQoKICAgcmV0dXJuOwp9Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRFdGhlclR5cGUKCiAgREVTQ1JJUFRJT04gICBFeHRyYWN0IEV0aGVyIHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgQkQKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIGF1Y0JESGVhZGVyIC0gQkQgaGVhZGVyCiAgICAgICAgICAgICAgICBpbiB2b3NEYXRhQnVmZiAtIGRhdGEgYnVmZmVyCiAgICAgICAgICAgICAgICBpbiB1Y01QRFVITGVuICAtIE1QRFUgaGVhZGVyIGxlbmd0aAogICAgICAgICAgICAgICAgb3V0IHBVc0V0aGVyVHlwZSAtIHBvaW50ZXIgdG8gRXRoZXJ0eXBlCgogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVU19TVUNDRVNTIDogaWYgdGhlIEV0aGVyVHlwZSBpcyBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkCiAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0ZBSUxVUkUgOiBpZiB0aGUgRXRoZXJUeXBlIGV4dHJhY3Rpb24gZmFpbGVkIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldCB3YXMgZHJvcHBlZAoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTIFdMQU5UTF9HZXRFdGhlclR5cGUKKAogICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogICB2b3NfcGt0X3QgICAgICAgICAgICAqIHZvc0RhdGFCdWZmLAogICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgIHZfVTE2X3QgICAgICAgICAgICAgICogcFVzRXRoZXJUeXBlCikKewogIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAqcFVzRXRoZXJUeXBlOwogIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c0xMQ1NpemUgPSBzaXplb2YodXNFdGhlclR5cGUpOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBMTEMgaXMgcHJlc2VudCAtIGlmIG5vdCwgVEwgaXMgdW5hYmxlIHRvIGRldGVybWluZSB0eXBlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBWT1NfRkFMU0UgPT0gV0RBX0lTX1JYX0xMQ19QUkVTRU5UKCBhdWNCREhlYWRlciApICkKICB7CiAgICB1Y09mZnNldCA9IFdMQU5UTF84MDJfM19IRUFERVJfTEVOIC0gc2l6ZW9mKHVzRXRoZXJUeXBlKTsgCiAgfQogIGVsc2UKICB7CiAgICB1Y09mZnNldCA9IHVjTVBEVUhMZW4gKyBXTEFOVExfTExDX1BST1RPX1RZUEVfT0ZGU0VUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgTExDIHR5cGUgCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsIHVjT2Zmc2V0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmdXNFdGhlclR5cGUsICZ1c0xMQ1NpemUpOyAKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8IAogICAgICAoIHNpemVvZih1c0V0aGVyVHlwZSkgIT0gdXNMTENTaXplICkpCiAgICAgIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3IgZXh0cmFjdGluZyBFdGhlciB0eXBlIGZyb20gZGF0YSBwYWNrZXQiKSk7CiAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KICBlbHNlCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXRoZXIgdHlwZSByZXRyaWV2ZWQgYmVmb3JlIGVuZGlhbmVzcyBjb252OiAlZCIsIAogICAgICAgICAgICAgICB1c0V0aGVyVHlwZSkpOwoKICAgIHVzRXRoZXJUeXBlID0gdm9zX2JlMTZfdG9fY3B1KHVzRXRoZXJUeXBlKTsKICAgICpwVXNFdGhlclR5cGUgPSB1c0V0aGVyVHlwZTsKCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZDogJWQiLCB1c0V0aGVyVHlwZSkpOwogIH0KICAKICByZXR1cm4gdm9zU3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0U29mdEFQU3RhdGlzdGljcwoKICBERVNDUklQVElPTiAgIENvbGxlY3QgdGhlIGN1bXVsYXRpdmUgc3RhdGlzdGljcyBmb3IgYWxsIFNvZnRhcCBzdGF0aW9ucwoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcHZvc0dDdHggIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0CiAgICAgICAgICAgICAgICAgICBiUmVzZXQgICAgLSBJZiBzZXQgVEwgc3RhdGlzdGljcyB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgcmVhZGluZwogICAgICAgICAgICAgICAgb3V0IHN0YXRzU3VtIC0gcG9pbnRlciB0byBjb2xsZWN0ZWQgc3RhdGlzdGljcwoKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVNfU1VDQ0VTUyA6IGlmIHRoZSBTdGF0aXN0aWNzIGFyZSBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkCgogIFNJREUgRUZGRUNUUyAgTk9ORQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0dldFNvZnRBUFN0YXRpc3RpY3Modl9QVk9JRF90IHBBZGFwdGVyLCBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRzU3VtLCB2X0JPT0xfdCBiUmVzZXQpCnsKICAgIHZfVThfdCBpID0gMDsKICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIFdMQU5UTF9DYlR5cGUgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogICAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFIHN0YXRCdWZmZXJUZW1wOwogICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKSZzdGF0QnVmZmVyVGVtcCwgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwogICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXN0YXRzU3VtLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgoKICAgIGlmICggTlVMTCA9PSBwVExDYiApCiAgICB7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfSAKCiAgICAvLyBTdW0gdXAgYWxsIHRoZSBzdGF0aXN0aWNzIGZvciBzdGF0aW9ucyBvZiBTb2Z0IEFQIGZyb20gVEwKICAgIGZvciAoaSA9IDA7IGkgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKykKICAgIHsKICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0pCiAgICAgICAgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT53U1RBRGVzYy53U1RBVHlwZSA9PSBXTEFOX1NUQV9TT0ZUQVApCiAgICAgICAgewogICAgICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRTdGF0aXN0aWNzKHBBZGFwdGVyLCAmc3RhdEJ1ZmZlclRlbXAsIGkpOy8vIENhbiBpbmNsdWRlIHN0YUlkIDEgYmVjYXVzZSBzdGF0aXN0aWNzIG5vdCBjb2xsZWN0ZWQgZm9yIGl0CgogICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwoKICAgICAgICAgICAgLy8gQWRkIHRvIHRoZSBjb3VudGVycwogICAgICAgICAgIHN0YXRzU3VtLT50eFVDRmNudCArPSBzdGF0QnVmZmVyVGVtcC50eFVDRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhNQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhNQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4QkNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4QkNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT50eFVDQmNudCArPSBzdGF0QnVmZmVyVGVtcC50eFVDQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhNQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhNQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4QkNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4QkNCY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeFVDRmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeFVDRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhNQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhNQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4QkNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4QkNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeFVDQmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeFVDQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhNQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhNQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4QkNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4QkNCY250OwoKICAgICAgICAgICBpZiAoYlJlc2V0KQogICAgICAgICAgIHsKICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVzZXRTdGF0aXN0aWNzKHBBZGFwdGVyLCBpKTsKICAgICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsgICAgICAgICAgICAgICAKICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHZvc1N0YXR1czsKfQojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFNfSU5URVJOQUwKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldEV0aGVyVHlwZV8yCgogIERFU0NSSVBUSU9OICAgRXh0cmFjdCBFdGhlciB0eXBlIGluZm9ybWF0aW9uIGZyb20gdGhlIEJECgogIERFUEVOREVOQ0lFUyAgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgICBpbiBhdWNCREhlYWRlciAtIEJEIGhlYWRlcgogICAgICAgICAgICAgICAgaW4gdm9zRGF0YUJ1ZmYgLSBkYXRhIGJ1ZmZlcgogICAgICAgICAgICAgICAgaW4gdWNNUERVSExlbiAgLSBNUERVIGhlYWRlciBsZW5ndGgKICAgICAgICAgICAgICAgIG91dCBwVXNFdGhlclR5cGUgLSBwb2ludGVyIHRvIEV0aGVydHlwZQoKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVNfU1VDQ0VTUyA6IGlmIHRoZSBFdGhlclR5cGUgaXMgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZAogICAgICAgICAgICAgICAgVk9TX1NUQVRVU19GQUlMVVJFIDogaWYgdGhlIEV0aGVyVHlwZSBleHRyYWN0aW9uIGZhaWxlZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWNrZXQgd2FzIGRyb3BwZWQKCiAgU0lERSBFRkZFQ1RTICBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgVk9TX1NUQVRVUyBXTEFOVExfR2V0RXRoZXJUeXBlXzIKKAogICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogICB2b3NfcGt0X3QgICAgICAgICAgICAqIHZvc0RhdGFCdWZmLAogICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgIHZfVTE2X3QgICAgICAgICAgICAgICogcFVzRXRoZXJUeXBlCikKewogIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAqcFVzRXRoZXJUeXBlOwogIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c0xMQ1NpemUgPSBzaXplb2YodXNFdGhlclR5cGUpOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIC8vdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTExDSGVhZGVyOwogIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0IDsgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIExMQyBpcyBwcmVzZW50IC0gaWYgbm90LCBUTCBpcyB1bmFibGUgdG8gZGV0ZXJtaW5lIHR5cGUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvL3VjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdMQU5IQUxfUlhfQkRfR0VUX01QRFVfSF9PRkZTRVQoYXVjQkRIZWFkZXIpIDsKICAvL3VjTExDSGVhZGVyICAgPSAodl9VOF90KVdMQU5IQUxfUlhfQkRfR0VUX0xMQyhhdWNCREhlYWRlcik7CiAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQoYXVjQkRIZWFkZXIpOwoKICBpZiAoIFZPU19UUlVFID09IFdEQV9JU19SWF9MTENfUFJFU0VOVChhdWNCREhlYWRlcikgKQogIHsKICAgIHVjT2Zmc2V0ID0gdWNNUERVSE9mZnNldCArIFdMQU5UTF84MDJfM19IRUFERVJfTEVOIC0gc2l6ZW9mKHVzRXRoZXJUeXBlKTsgCiAgfQogIGVsc2UKICB7CiAgICB1Y09mZnNldCA9IFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUgKyB1Y01QRFVITGVuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTlRMX0xMQ19QUk9UT19UWVBFX09GRlNFVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IExMQyB0eXBlIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc0RhdGFCdWZmLCB1Y09mZnNldCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnVzRXRoZXJUeXBlLCAmdXNMTENTaXplKTsgCgogIC8qIFRPRE86IERvIGl0IGluIGJldHRlciB3YXkgKi8KICBpZih2b3NfYmUxNl90b19jcHUodXNFdGhlclR5cGUpID09IDB4ODkwZCkKICB7CiAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCiAgICAgICAgICAgICAgICAgICAgICAoIlRETFMgZnJhbWUgbGxjICV4IFxuIiksIHZvc19iZTE2X3RvX2NwdSh1c0V0aGVyVHlwZSkpIDsKICB9CiAgICAgIAogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZCBiZWZvcmUgZW5kaWFuZXNzIGNvbnY6ICVkIiwgCiAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlKTsKCiAgICB1c0V0aGVyVHlwZSA9IHZvc19iZTE2X3RvX2NwdSh1c0V0aGVyVHlwZSk7CiAgICAqcFVzRXRoZXJUeXBlID0gdXNFdGhlclR5cGU7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZDogJWQiLCB1c0V0aGVyVHlwZSk7CiAgCiAgcmV0dXJuIHZvc1N0YXR1czsKfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0lzUmVwbGF5UGFja2V0CiAgICAgCiAgREVTQ1JJUFRJT04gICBUaGlzIGZ1bmN0aW9uIGRvZXMgcmVwbGF5IGNoZWNrIGZvciB2YWxpZCBzdGF0aW9ucwogCiAgREVQRU5ERU5DSUVTICBWYWxpZGl0eSBvZiByZXBsYXkgY2hlY2sgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZnVuY3Rpb24gCiAgICAgICAgICAgICAgICBpcyBjYWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAKICBQQVJBTUVURVJTICAgIGN1cnJlbnRSZXBsYXlDb3VudGVyICAgIGN1cnJlbnQgcmVwbGF5IGNvdW50ZXIgdGFrZW4gZnJvbSBSWCBCRCAKICAgICAgICAgICAgICAgIHByZXZpb3VzUmVwbGF5Q291bnRlciAgIHByZXZpb3VzIHJlcGxheSBjb3VudGVyIHRha2VuIGZyb20gVEwgQ0IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUkVUUlVOICAgICAgICBWT1NfVFJVRSAgICBwYWNrZXQgaXMgYSByZXBsYXkgcGFja2V0CiAgICAgICAgICAgICAgICBWT1NfRkFMU0UgICBwYWNrZXQgaXMgbm90IGEgcmVwbGF5IHBhY2tldAoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9CT09MX3QKV0xBTlRMX0lzUmVwbGF5UGFja2V0CigKICB2X1U2NF90ICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLAogIHZfVTY0X3QgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyCikKewogICAvKiBEbyB0aGUgcmVwbGF5IGNoZWNrIGJ5IGNvbXBhcmluZyBwcmV2aW91cyByZWNlaXZlZCByZXBsYXkgY291bnRlciB3aXRoCiAgICAgIGN1cnJlbnQgcmVjZWl2ZWQgcmVwbGF5IGNvdW50ZXIqLwogICAgaWYodWxscHJldmlvdXNSZXBsYXlDb3VudGVyIDwgdWxsY3VycmVudFJlcGxheUNvdW50ZXIpCiAgICB7CiAgICAgICAgLyogVmFsaWQgcGFja2V0IG5vdCByZXBsYXkgKi8KICAgICAgICByZXR1cm4gVk9TX0ZBTFNFOwogICAgfQogICAgZWxzZQogICAgewoKICAgICAgICAvKiBDdXJyZW50IHBhY2tldCBudW1iZXIgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHByZXZpdW9zIHJlY2VpdmVkIAogICAgICAgICAgIHBhY2tldCBubywgdGhpcyBtZWFucyBjdXJyZW50IHBhY2tldCBpcyByZXBsYXkgcGFja2V0ICovCiAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6IFJlcGxheSBwYWNrZXQgZm91bmQgd2l0aCByZXBsYXkgY291bnRlciA6WzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKICAgICAgICAgICAKICAgICAgICByZXR1cm4gVk9TX1RSVUU7CiAgICB9Cn0KCiNpZiAwCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFJlcGxheUNvdW50ZXJGcm9tUnhCRAogICAgIAogIERFU0NSSVBUSU9OICAgVGhpcyBmdW5jdGlvbiBleHRyYWN0cyA0OC1iaXQgcmVwbGF5IHBhY2tldCBudW1iZXIgZnJvbSBSWCBCRCAKIAogIERFUEVOREVOQ0lFUyAgVmFsaWRpdHkgb2YgcmVwbGF5IGNoZWNrIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGZ1bmN0aW9uIAogICAgICAgICAgICAgICAgaXMgY2FsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUEFSQU1FVEVSUyAgICBwdWNSeEhlYWRlciBwb2ludGVyIHRvIFJYIEJEIGhlYWRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBSRVRSVU4gICAgICAgIHZfVTY0X3QgICAgUGFja2V0IG51bWJlciBleHRhcmN0ZWQgZnJvbSBSWCBCRAoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9VNjRfdApXTEFOVExfR2V0UmVwbGF5Q291bnRlckZyb21SeEJECigKICAgdl9VOF90ICpwdWNSeEJESGVhZGVyCikKewovKiA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgaXMgY3JlYXRlZCBhcyBmb2xsb3dzCiAgIGZyb20gUlggQkQgNiBieXRlIFBNSSBjb21tYW5kOgogICBBZGRyIDogQUVTL1RLSVAKICAgMHgzOCA6IHBuMy90c2MzCiAgIDB4MzkgOiBwbjIvdHNjMgogICAweDNhIDogcG4xL3RzYzEKICAgMHgzYiA6IHBuMC90c2MwCgogICAweDNjIDogcG41L3RzYzUKICAgMHgzZCA6IHBuNC90c2M0ICovCgojaWZkZWYgQU5JX0JJR19CWVRFX0VORElBTgogICAgdl9VNjRfdCB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IDA7CiAgICAvKiBHZXR0aW5nIDQ4LWJpdCByZXBsYXkgY291bnRlciBmcm9tIHRoZSBSWCBCRCAqLwogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSBXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjBUTzIzKHB1Y1J4QkRIZWFkZXIpOyAKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIDw8PSAxNjsKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIHw9ICgoIFdMQU5IQUxfUlhfQkRfR0VUX1BNSUNNRF8yNFRPMjUocHVjUnhCREhlYWRlcikgJiAweEZGRkYwMDAwKSA+PiAxNik7CiAgICByZXR1cm4gdWxsY3VycmVudFJlcGxheUNvdW50ZXI7CiNlbHNlCiAgICB2X1U2NF90IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gMDsKICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IChXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjRUTzI1KHB1Y1J4QkRIZWFkZXIpICYgMHgwMDAwRkZGRik7IAogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPDw9IDMyOyAKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIHw9IFdMQU5IQUxfUlhfQkRfR0VUX1BNSUNNRF8yMFRPMjMocHVjUnhCREhlYWRlcik7IAogICAgcmV0dXJuIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwojZW5kaWYKfQojZW5kaWYKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX1Bvc3RSZXNOZWVkZWQKICAgICAKICBERVNDUklQVElPTiAgIFRoaXMgZnVuY3Rpb24gcG9zdHMgbWVzc2FnZSB0byBUTCB0byByZXNlcnZlIEJEL1BEVSBtZW1vcnkKIAogIERFUEVOREVOQ0lFUyAgTm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgIAogIFBBUkFNRVRFUlMgICAgcHZvc0dDdHgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUkVUVVJOICAgICAgICBOb25lCgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdm9pZCBXTEFOVExfUG9zdFJlc05lZWRlZCh2X1BWT0lEX3QgcHZvc0dDdHgpCnsKICB2b3NfbXNnX3QgICAgICAgICAgICB2b3NNc2c7CgogIHZvc01zZy5yZXNlcnZlZCA9IDA7CiAgdm9zTXNnLmJvZHlwdHIgID0gTlVMTDsKICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfUkVTX05FRURFRDsKICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIldMQU4gVEw6IEJEL1BEVSBhdmFpbGFibGUgaW50ZXJydXB0IHJlY2VpdmVkLCBQb3N0aW5nIG1lc3NhZ2UgdG8gVEwiKTsKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NUV9JRF9UTCwgJnZvc01zZykpKQogIHsKICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiICVzIGZhaWxzIHRvIHBvc3QgbWVzc2FnZSIsIF9fZnVuY19fKTsKICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgIFdMQU5UTF9VcGRhdGVSc3NpQm1wcwoKICBERVNDUklQVElPTiAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIFRMJ3MgUlNTSSAoaW4gQk1QUyBtb2RlKQoKICBERVBFTkRFTkNJRVMgICBOb25lCgogIFBBUkFNRVRFUlMKCiAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0ICAgICAgICAgIFZPUyBHbG9iYWwgY29udGV4dAogICAgc3RhSWQgICAgICAgICAgICBTdGF0aW9uIElEICAgICAgICAgICBTdGF0aW9uIElECiAgICByc3NpICAgICAgICAgICAgIFJTU0kgKEJNUFMgbW9kZSkgICAgIFJTU0kgaW4gQk1QUyBtb2RlCgogIFJFVFVSTiAgICAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTICAgbm9uZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2b2lkIFdMQU5UTF9VcGRhdGVSc3NpQm1wcyh2X1BWT0lEX3QgcHZvc0dDdHgsIHZfVThfdCBzdGFJZCwgdl9TN190IHJzc2kpCnsKICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwoKICBpZiAoTlVMTCAhPSBwVExDYiAmJiBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXSkKICB7CiAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0tPnJzc2lBdmdCbXBzID0gcnNzaTsKICB9Cn0K