LyoKIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBpbgogY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsIGluc3RhbGxhdGlvbiwgCiBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZSBjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIAogdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgCiByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4KIAogSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgc3ViamVjdCB0byB0aGVzZSAKIHRlcm1zLCBBcHBsZSBncmFudHMgeW91IGEgcGVyc29uYWwsIG5vbi1leGNsdXNpdmUgbGljZW5zZSwgdW5kZXIgQXBwbGXVcyBjb3B5cmlnaHRzIGluIAogdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZCAKIHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSAKIGZvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlIGluIGl0cyBlbnRpcmV0eSBhbmQgd2l0aG91dCAKIG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgCiBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIAogb3IgbG9nb3Mgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSAKIHRoZSBBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiBFeGNlcHQgYXMgZXhwcmVzc2x5CiBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBBcHBsZQogaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIAogZGVyaXZhdGl2ZSB3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgQXBwbGUgU29mdHdhcmUgbWF5IGJlIGluY29ycG9yYXRlZC4KIAogVGhlIEFwcGxlIFNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEFwcGxlIG9uIGFuICJBUyBJUyIgYmFzaXMuICBBUFBMRSBNQUtFUyBOTyBXQVJSQU5USUVTLCAKIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIAogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBBUFBMRSBTT0ZUV0FSRSBPUiBJVFMgCiBVU0UgQU5EIE9QRVJBVElPTiBBTE9ORSBPUiBJTiBDT01CSU5BVElPTiBXSVRIIFlPVVIgUFJPRFVDVFMuCiAKIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgCiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyAKICAgICAgICAgIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UsIAogUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCAKIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULCBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IgCiBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwoKI2ltcG9ydCA8V2ViS2l0L25wYXBpLmg+CiNpbXBvcnQgPFdlYktpdC9ucGZ1bmN0aW9ucy5oPgojaW1wb3J0IDxXZWJLaXQvbnBydW50aW1lLmg+CgpOUE5ldHNjYXBlRnVuY3MgKmJyb3dzZXI7CgpOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLCBjaGFyKiBhcmduW10sIGNoYXIqIGFyZ3ZbXSwgTlBTYXZlZERhdGEqIHNhdmVkKTsKTlBFcnJvciBOUFBfRGVzdHJveShOUFAgaW5zdGFuY2UsIE5QU2F2ZWREYXRhKiogc2F2ZSk7Ck5QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpOwpOUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2KiBzdHlwZSk7Ck5QRXJyb3IgTlBQX0Rlc3Ryb3lTdHJlYW0oTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBOUFJlYXNvbiByZWFzb24pOwppbnQzMiBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pOwppbnQzMiBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMiBvZmZzZXQsIGludDMyIGxlbiwgdm9pZCogYnVmZmVyKTsKdm9pZCBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpOwp2b2lkIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpOwppbnQxNiBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCk7CnZvaWQgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIFVSTCwgTlBSZWFzb24gcmVhc29uLCB2b2lkKiBub3RpZnlEYXRhKTsKTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwpOUEVycm9yIE5QUF9TZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSk7CgojcHJhZ21hIGV4cG9ydCBvbgovLyBNYWNoLW8gZW50cnkgcG9pbnRzCk5QRXJyb3IgTlBfSW5pdGlhbGl6ZShOUE5ldHNjYXBlRnVuY3MgKmJyb3dzZXJGdW5jcyk7Ck5QRXJyb3IgTlBfR2V0RW50cnlQb2ludHMoTlBQbHVnaW5GdW5jcyAqcGx1Z2luRnVuY3MpOwp2b2lkIE5QX1NodXRkb3duKHZvaWQpOwovLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIENGTSBicm93c2Vycy4KaW50IG1haW4oTlBOZXRzY2FwZUZ1bmNzICpicm93c2VyRnVuY3MsIE5QUGx1Z2luRnVuY3MgKnBsdWdpbkZ1bmNzLCBOUFBfU2h1dGRvd25Qcm9jUHRyICpzaHV0ZG93bik7CiNwcmFnbWEgZXhwb3J0IG9mZgoKCnR5cGVkZWYgdm9pZCAoKiBGdW5jdGlvblBvaW50ZXIpICh2b2lkKTsKdHlwZWRlZiB2b2lkICgqIFRyYW5zaXRpb25WZWN0b3IpICh2b2lkKTsKc3RhdGljIEZ1bmN0aW9uUG9pbnRlciBmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKFRyYW5zaXRpb25WZWN0b3IpOwpzdGF0aWMgVHJhbnNpdGlvblZlY3RvciB0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKEZ1bmN0aW9uUG9pbnRlcik7CgovLyBNYWNoLW8gZW50cnkgcG9pbnRzCk5QRXJyb3IgTlBfSW5pdGlhbGl6ZShOUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXJGdW5jcykKewogICAgYnJvd3NlciA9IGJyb3dzZXJGdW5jczsKICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKfQoKTlBFcnJvciBOUF9HZXRFbnRyeVBvaW50cyhOUFBsdWdpbkZ1bmNzKiBwbHVnaW5GdW5jcykKewogICAgcGx1Z2luRnVuY3MtPnZlcnNpb24gPSAxMTsKICAgIHBsdWdpbkZ1bmNzLT5zaXplID0gc2l6ZW9mKHBsdWdpbkZ1bmNzKTsKICAgIHBsdWdpbkZ1bmNzLT5uZXdwID0gTlBQX05ldzsKICAgIHBsdWdpbkZ1bmNzLT5kZXN0cm95ID0gTlBQX0Rlc3Ryb3k7CiAgICBwbHVnaW5GdW5jcy0+c2V0d2luZG93ID0gTlBQX1NldFdpbmRvdzsKICAgIHBsdWdpbkZ1bmNzLT5uZXdzdHJlYW0gPSBOUFBfTmV3U3RyZWFtOwogICAgcGx1Z2luRnVuY3MtPmRlc3Ryb3lzdHJlYW0gPSBOUFBfRGVzdHJveVN0cmVhbTsKICAgIHBsdWdpbkZ1bmNzLT5hc2ZpbGUgPSBOUFBfU3RyZWFtQXNGaWxlOwogICAgcGx1Z2luRnVuY3MtPndyaXRlcmVhZHkgPSBOUFBfV3JpdGVSZWFkeTsKICAgIHBsdWdpbkZ1bmNzLT53cml0ZSA9IChOUFBfV3JpdGVQcm9jUHRyKU5QUF9Xcml0ZTsKICAgIHBsdWdpbkZ1bmNzLT5wcmludCA9IE5QUF9QcmludDsKICAgIHBsdWdpbkZ1bmNzLT5ldmVudCA9IE5QUF9IYW5kbGVFdmVudDsKICAgIHBsdWdpbkZ1bmNzLT51cmxub3RpZnkgPSBOUFBfVVJMTm90aWZ5OwogICAgcGx1Z2luRnVuY3MtPmdldHZhbHVlID0gTlBQX0dldFZhbHVlOwogICAgcGx1Z2luRnVuY3MtPnNldHZhbHVlID0gTlBQX1NldFZhbHVlOwogICAgCiAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cn0KCnZvaWQgTlBfU2h1dGRvd24odm9pZCkKewoKfQogCi8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggQ0ZNIGJyb3dzZXJzLgppbnQgbWFpbihOUE5ldHNjYXBlRnVuY3MgKmJyb3dzZXJGdW5jcywgTlBQbHVnaW5GdW5jcyAqcGx1Z2luRnVuY3MsIE5QUF9TaHV0ZG93blByb2NQdHIgKnNodXRkb3duKQp7CiAgICBicm93c2VyID0gbWFsbG9jKHNpemVvZihOUE5ldHNjYXBlRnVuY3MpKTsKICAgIGJ6ZXJvKGJyb3dzZXIsIHNpemVvZihOUE5ldHNjYXBlRnVuY3MpKTsKICAgIAogICAgYnJvd3Nlci0+c2l6ZSA9IGJyb3dzZXJGdW5jcy0+c2l6ZTsKICAgIGJyb3dzZXItPnZlcnNpb24gPSBicm93c2VyRnVuY3MtPnZlcnNpb247CiAgICAKICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBtYWNoLW8gcGx1Zy1pbiBhbmQgdGhlIGJyb3dzZXIgaXMgQ0ZNIGJlY2F1c2UgaXQgaXMgY2FsbGluZyBtYWluLCB0cmFuc2xhdGUKICAgIC8vIG91ciBmdW5jdGlvbiBwb2ludHMgaW50byBUVmVjdG9ycyBzbyB0aGUgYnJvd3NlciBjYW4gY2FsbCB0aGVtLgogICAgYnJvd3Nlci0+Z2V0dXJsID0gKE5QTl9HZXRVUkxQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5nZXR1cmwpOwogICAgYnJvd3Nlci0+cG9zdHVybCA9IChOUE5fUG9zdFVSTFByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPnBvc3R1cmwpOwogICAgYnJvd3Nlci0+cmVxdWVzdHJlYWQgPSAoTlBOX1JlcXVlc3RSZWFkUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+cmVxdWVzdHJlYWQpOwogICAgYnJvd3Nlci0+bmV3c3RyZWFtID0gKE5QTl9OZXdTdHJlYW1Qcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5uZXdzdHJlYW0pOwogICAgYnJvd3Nlci0+d3JpdGUgPSAoTlBOX1dyaXRlUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+d3JpdGUpOwogICAgYnJvd3Nlci0+ZGVzdHJveXN0cmVhbSA9IChOUE5fRGVzdHJveVN0cmVhbVByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPmRlc3Ryb3lzdHJlYW0pOwogICAgYnJvd3Nlci0+c3RhdHVzID0gKE5QTl9TdGF0dXNQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5zdGF0dXMpOwogICAgYnJvd3Nlci0+dWFnZW50ID0gKE5QTl9Vc2VyQWdlbnRQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT51YWdlbnQpOwogICAgYnJvd3Nlci0+bWVtYWxsb2MgPSAoTlBOX01lbUFsbG9jUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+bWVtYWxsb2MpOwogICAgYnJvd3Nlci0+bWVtZnJlZSA9IChOUE5fTWVtRnJlZVByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPm1lbWZyZWUpOwogICAgYnJvd3Nlci0+bWVtZmx1c2ggPSAoTlBOX01lbUZsdXNoUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+bWVtZmx1c2gpOwogICAgYnJvd3Nlci0+cmVsb2FkcGx1Z2lucyA9IChOUE5fUmVsb2FkUGx1Z2luc1Byb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPnJlbG9hZHBsdWdpbnMpOwogICAgYnJvd3Nlci0+Z2V0dXJsbm90aWZ5ID0gKE5QTl9HZXRVUkxOb3RpZnlQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5nZXR1cmxub3RpZnkpOwogICAgYnJvd3Nlci0+cG9zdHVybG5vdGlmeSA9IChOUE5fUG9zdFVSTE5vdGlmeVByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPnBvc3R1cmxub3RpZnkpOwogICAgYnJvd3Nlci0+Z2V0dmFsdWUgPSAoTlBOX0dldFZhbHVlUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+Z2V0dmFsdWUpOwogICAgYnJvd3Nlci0+c2V0dmFsdWUgPSAoTlBOX1NldFZhbHVlUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+c2V0dmFsdWUpOwogICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QgPSAoTlBOX0ludmFsaWRhdGVSZWN0UHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+aW52YWxpZGF0ZXJlY3QpOwogICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlZ2lvbiA9IChOUE5fSW52YWxpZGF0ZVJlZ2lvblByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPmludmFsaWRhdGVyZWdpb24pOwogICAgYnJvd3Nlci0+Zm9yY2VyZWRyYXcgPSAoTlBOX0ZvcmNlUmVkcmF3UHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+Zm9yY2VyZWRyYXcpOwogICAgYnJvd3Nlci0+Z2V0SmF2YUVudiA9IChOUE5fR2V0SmF2YUVudlByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPmdldEphdmFFbnYpOwogICAgYnJvd3Nlci0+Z2V0SmF2YVBlZXIgPSAoTlBOX0dldEphdmFQZWVyUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+Z2V0SmF2YVBlZXIpOwogICAgCiAgICBwbHVnaW5GdW5jcy0+dmVyc2lvbiA9IDExOwogICAgcGx1Z2luRnVuY3MtPnNpemUgPSBzaXplb2YocGx1Z2luRnVuY3MpOwogICAgcGx1Z2luRnVuY3MtPm5ld3AgPSAoTlBQX05ld1Byb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9OZXcpOwogICAgcGx1Z2luRnVuY3MtPmRlc3Ryb3kgPSAoTlBQX0Rlc3Ryb3lQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfRGVzdHJveSk7CiAgICBwbHVnaW5GdW5jcy0+c2V0d2luZG93ID0gKE5QUF9TZXRXaW5kb3dQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfU2V0V2luZG93KTsKICAgIHBsdWdpbkZ1bmNzLT5uZXdzdHJlYW0gPSAoTlBQX05ld1N0cmVhbVByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9OZXdTdHJlYW0pOwogICAgcGx1Z2luRnVuY3MtPmRlc3Ryb3lzdHJlYW0gPSAoTlBQX0Rlc3Ryb3lTdHJlYW1Qcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfRGVzdHJveVN0cmVhbSk7CiAgICBwbHVnaW5GdW5jcy0+YXNmaWxlID0gKE5QUF9TdHJlYW1Bc0ZpbGVQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfU3RyZWFtQXNGaWxlKTsKICAgIHBsdWdpbkZ1bmNzLT53cml0ZXJlYWR5ID0gKE5QUF9Xcml0ZVJlYWR5UHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX1dyaXRlUmVhZHkpOwogICAgcGx1Z2luRnVuY3MtPndyaXRlID0gKE5QUF9Xcml0ZVByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9Xcml0ZSk7CiAgICBwbHVnaW5GdW5jcy0+cHJpbnQgPSAoTlBQX1ByaW50UHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX1ByaW50KTsKICAgIHBsdWdpbkZ1bmNzLT5ldmVudCA9IChOUFBfSGFuZGxlRXZlbnRQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfSGFuZGxlRXZlbnQpOwogICAgcGx1Z2luRnVuY3MtPnVybG5vdGlmeSA9IChOUFBfVVJMTm90aWZ5UHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX1VSTE5vdGlmeSk7CiAgICBwbHVnaW5GdW5jcy0+Z2V0dmFsdWUgPSAoTlBQX0dldFZhbHVlUHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX0dldFZhbHVlKTsKICAgIHBsdWdpbkZ1bmNzLT5zZXR2YWx1ZSA9IChOUFBfU2V0VmFsdWVQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfU2V0VmFsdWUpOwogICAgCiAgICAqc2h1dGRvd24gPSAoTlBQX1NodXRkb3duUHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBfU2h1dGRvd24pOwogICAgCiAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cn0KCk5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpCnsKICAgIC8vIENhbGwgd2luZG93LmFsZXJ0KCJTdWNjZXNzISIpCiAgICBOUEVycm9yIGVycm9yOwogICAgTlBPYmplY3QgKndpbmRvd09iamVjdCA9IE5VTEw7CiAgICBlcnJvciA9IGJyb3dzZXItPmdldHZhbHVlKGluc3RhbmNlLCBOUE5WV2luZG93TlBPYmplY3QsICZ3aW5kb3dPYmplY3QpOwogICAgaWYgKGVycm9yID09IE5QRVJSX05PX0VSUk9SKSB7CiAgICAgICAgTlBWYXJpYW50IGFsZXJ0TWVzc2FnZTsKICAgICAgICBTVFJJTkdaX1RPX05QVkFSSUFOVCgiU3VjY2VzcyEiLCBhbGVydE1lc3NhZ2UpOwogICAgICAgIE5QVmFyaWFudCByZXN1bHQ7CiAgICAgICAgYnJvd3Nlci0+aW52b2tlKGluc3RhbmNlLCB3aW5kb3dPYmplY3QsIGJyb3dzZXItPmdldHN0cmluZ2lkZW50aWZpZXIoImFsZXJ0IiksICZhbGVydE1lc3NhZ2UsIDEsICZyZXN1bHQpOwogICAgICAgIGJyb3dzZXItPnJlbGVhc2VvYmplY3Qod2luZG93T2JqZWN0KTsKICAgIH0KICAgIAogICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwp9CgpOUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKQp7CiAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cn0KCk5QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpCnsKICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKfQoKTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpCnsKICAgICpzdHlwZSA9IE5QX0FTRklMRU9OTFk7CiAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cn0KCk5QRXJyb3IgTlBQX0Rlc3Ryb3lTdHJlYW0oTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBOUFJlYXNvbiByZWFzb24pCnsKICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKfQoKaW50MzIgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQp7CiAgICByZXR1cm4gMDsKfQoKaW50MzIgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sIHZvaWQqIGJ1ZmZlcikKewogICAgcmV0dXJuIDA7Cn0KCnZvaWQgTlBQX1N0cmVhbUFzRmlsZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGZuYW1lKQp7Cn0KCnZvaWQgTlBQX1ByaW50KE5QUCBpbnN0YW5jZSwgTlBQcmludCogcGxhdGZvcm1QcmludCkKewoKfQoKaW50MTYgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpCnsKICAgIHJldHVybiAxOwp9Cgp2b2lkIE5QUF9VUkxOb3RpZnkoTlBQIGluc3RhbmNlLCBjb25zdCBjaGFyKiB1cmwsIE5QUmVhc29uIHJlYXNvbiwgdm9pZCogbm90aWZ5RGF0YSkKewoKfQoKTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpCnsKICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOwp9CgpOUEVycm9yIE5QUF9TZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSkKewogICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Cn0KCi8vIGZ1bmN0aW9uIHBvaW50ZXIgY29udmVydGVycwoKRnVuY3Rpb25Qb2ludGVyIGZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoVHJhbnNpdGlvblZlY3RvciB0dnApCnsKICAgIGNvbnN0IHVpbnQzMiB0ZW1wWzZdID0gezB4M0Q4MDAwMDAsIDB4NjE4QzAwMDAsIDB4ODAwQzAwMDAsIDB4ODA0QzAwMDQsIDB4N0MwOTAzQTYsIDB4NEU4MDA0MjB9OwogICAgdWludDMyICpuZXdHbHVlID0gTlVMTDsKICAgIAogICAgaWYgKHR2cCAhPSBOVUxMKSB7CiAgICAgICAgbmV3R2x1ZSA9ICh1aW50MzIgKiltYWxsb2Moc2l6ZW9mKHRlbXApKTsKICAgICAgICBpZiAobmV3R2x1ZSAhPSBOVUxMKSB7CiAgICAgICAgICAgIHVuc2lnbmVkIGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIG5ld0dsdWVbaV0gPSB0ZW1wW2ldOwogICAgICAgICAgICBuZXdHbHVlWzBdIHw9ICgoVUludDMyKXR2cCA+PiAxNik7CiAgICAgICAgICAgIG5ld0dsdWVbMV0gfD0gKChVSW50MzIpdHZwICYgMHhGRkZGKTsKICAgICAgICAgICAgTWFrZURhdGFFeGVjdXRhYmxlKG5ld0dsdWUsIHNpemVvZih0ZW1wKSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gKEZ1bmN0aW9uUG9pbnRlciluZXdHbHVlOwp9CgpUcmFuc2l0aW9uVmVjdG9yIHRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoRnVuY3Rpb25Qb2ludGVyIGZwKQp7CiAgICBGdW5jdGlvblBvaW50ZXIgKm5ld0dsdWUgPSBOVUxMOwogICAgaWYgKGZwICE9IE5VTEwpIHsKICAgICAgICBuZXdHbHVlID0gKEZ1bmN0aW9uUG9pbnRlciAqKW1hbGxvYygyICogc2l6ZW9mKEZ1bmN0aW9uUG9pbnRlcikpOwogICAgICAgIGlmIChuZXdHbHVlICE9IE5VTEwpIHsKICAgICAgICAgICAgbmV3R2x1ZVswXSA9IGZwOwogICAgICAgICAgICBuZXdHbHVlWzFdID0gTlVMTDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gKFRyYW5zaXRpb25WZWN0b3IpbmV3R2x1ZTsKfQo=