LyoKIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBpbgogY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsIGluc3RhbGxhdGlvbiwgCiBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZSBjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIAogdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgCiByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4KIAogSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgc3ViamVjdCB0byB0aGVzZSAKIHRlcm1zLCBBcHBsZSBncmFudHMgeW91IGEgcGVyc29uYWwsIG5vbi1leGNsdXNpdmUgbGljZW5zZSwgdW5kZXIgQXBwbGXVcyBjb3B5cmlnaHRzIGluIAogdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZCAKIHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSAKIGZvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlIGluIGl0cyBlbnRpcmV0eSBhbmQgd2l0aG91dCAKIG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgCiBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIAogb3IgbG9nb3Mgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSAKIHRoZSBBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiBFeGNlcHQgYXMgZXhwcmVzc2x5CiBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBBcHBsZQogaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIAogZGVyaXZhdGl2ZSB3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgQXBwbGUgU29mdHdhcmUgbWF5IGJlIGluY29ycG9yYXRlZC4KIAogVGhlIEFwcGxlIFNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEFwcGxlIG9uIGFuICJBUyBJUyIgYmFzaXMuICBBUFBMRSBNQUtFUyBOTyBXQVJSQU5USUVTLCAKIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIAogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBBUFBMRSBTT0ZUV0FSRSBPUiBJVFMgCiBVU0UgQU5EIE9QRVJBVElPTiBBTE9ORSBPUiBJTiBDT01CSU5BVElPTiBXSVRIIFlPVVIgUFJPRFVDVFMuCiAKIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgCiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyAKICAgICAgICAgIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UsIAogUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCAKIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULCBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IgCiBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwoKI2ltcG9ydCA8V2ViS2l0L25wYXBpLmg+CiNpbXBvcnQgPFdlYktpdC9ucGZ1bmN0aW9ucy5oPgojaW1wb3J0IDxXZWJLaXQvbnBydW50aW1lLmg+CgpOUE5ldHNjYXBlRnVuY3MgKmJyb3dzZXI7CgpOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCk7Ck5QRXJyb3IgTlBQX0Rlc3Ryb3koTlBQIGluc3RhbmNlLCBOUFNhdmVkRGF0YSoqIHNhdmUpOwpOUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KTsKTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSk7Ck5QRXJyb3IgTlBQX0Rlc3Ryb3lTdHJlYW0oTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBOUFJlYXNvbiByZWFzb24pOwppbnQzMl90IE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7CmludDMyX3QgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgbGVuLCB2b2lkKiBidWZmZXIpOwp2b2lkIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSk7CnZvaWQgTlBQX1ByaW50KE5QUCBpbnN0YW5jZSwgTlBQcmludCogcGxhdGZvcm1QcmludCk7CmludDE2X3QgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOwp2b2lkIE5QUF9VUkxOb3RpZnkoTlBQIGluc3RhbmNlLCBjb25zdCBjaGFyKiBVUkwsIE5QUmVhc29uIHJlYXNvbiwgdm9pZCogbm90aWZ5RGF0YSk7Ck5QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKTsKTlBFcnJvciBOUFBfU2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwoKI3ByYWdtYSBleHBvcnQgb24KLy8gTWFjaC1vIGVudHJ5IHBvaW50cwpOUEVycm9yIE5QX0luaXRpYWxpemUoTlBOZXRzY2FwZUZ1bmNzICpicm93c2VyRnVuY3MpOwpOUEVycm9yIE5QX0dldEVudHJ5UG9pbnRzKE5QUGx1Z2luRnVuY3MgKnBsdWdpbkZ1bmNzKTsKdm9pZCBOUF9TaHV0ZG93bih2b2lkKTsKLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBDRk0gYnJvd3NlcnMuCmludCBtYWluKE5QTmV0c2NhcGVGdW5jcyAqYnJvd3NlckZ1bmNzLCBOUFBsdWdpbkZ1bmNzICpwbHVnaW5GdW5jcywgTlBQX1NodXRkb3duUHJvY1B0ciAqc2h1dGRvd24pOwojcHJhZ21hIGV4cG9ydCBvZmYKCgp0eXBlZGVmIHZvaWQgKCogRnVuY3Rpb25Qb2ludGVyKSAodm9pZCk7CnR5cGVkZWYgdm9pZCAoKiBUcmFuc2l0aW9uVmVjdG9yKSAodm9pZCk7CnN0YXRpYyBGdW5jdGlvblBvaW50ZXIgZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcihUcmFuc2l0aW9uVmVjdG9yKTsKc3RhdGljIFRyYW5zaXRpb25WZWN0b3IgdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcihGdW5jdGlvblBvaW50ZXIpOwoKLy8gTWFjaC1vIGVudHJ5IHBvaW50cwpOUEVycm9yIE5QX0luaXRpYWxpemUoTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyRnVuY3MpCnsKICAgIGJyb3dzZXIgPSBicm93c2VyRnVuY3M7CiAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cn0KCk5QRXJyb3IgTlBfR2V0RW50cnlQb2ludHMoTlBQbHVnaW5GdW5jcyogcGx1Z2luRnVuY3MpCnsKICAgIHBsdWdpbkZ1bmNzLT52ZXJzaW9uID0gMTE7CiAgICBwbHVnaW5GdW5jcy0+c2l6ZSA9IHNpemVvZihwbHVnaW5GdW5jcyk7CiAgICBwbHVnaW5GdW5jcy0+bmV3cCA9IE5QUF9OZXc7CiAgICBwbHVnaW5GdW5jcy0+ZGVzdHJveSA9IE5QUF9EZXN0cm95OwogICAgcGx1Z2luRnVuY3MtPnNldHdpbmRvdyA9IE5QUF9TZXRXaW5kb3c7CiAgICBwbHVnaW5GdW5jcy0+bmV3c3RyZWFtID0gTlBQX05ld1N0cmVhbTsKICAgIHBsdWdpbkZ1bmNzLT5kZXN0cm95c3RyZWFtID0gTlBQX0Rlc3Ryb3lTdHJlYW07CiAgICBwbHVnaW5GdW5jcy0+YXNmaWxlID0gTlBQX1N0cmVhbUFzRmlsZTsKICAgIHBsdWdpbkZ1bmNzLT53cml0ZXJlYWR5ID0gTlBQX1dyaXRlUmVhZHk7CiAgICBwbHVnaW5GdW5jcy0+d3JpdGUgPSAoTlBQX1dyaXRlUHJvY1B0cilOUFBfV3JpdGU7CiAgICBwbHVnaW5GdW5jcy0+cHJpbnQgPSBOUFBfUHJpbnQ7CiAgICBwbHVnaW5GdW5jcy0+ZXZlbnQgPSBOUFBfSGFuZGxlRXZlbnQ7CiAgICBwbHVnaW5GdW5jcy0+dXJsbm90aWZ5ID0gTlBQX1VSTE5vdGlmeTsKICAgIHBsdWdpbkZ1bmNzLT5nZXR2YWx1ZSA9IE5QUF9HZXRWYWx1ZTsKICAgIHBsdWdpbkZ1bmNzLT5zZXR2YWx1ZSA9IE5QUF9TZXRWYWx1ZTsKICAgIAogICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwp9Cgp2b2lkIE5QX1NodXRkb3duKHZvaWQpCnsKCn0KIAovLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIENGTSBicm93c2Vycy4KaW50IG1haW4oTlBOZXRzY2FwZUZ1bmNzICpicm93c2VyRnVuY3MsIE5QUGx1Z2luRnVuY3MgKnBsdWdpbkZ1bmNzLCBOUFBfU2h1dGRvd25Qcm9jUHRyICpzaHV0ZG93bikKewogICAgYnJvd3NlciA9IG1hbGxvYyhzaXplb2YoTlBOZXRzY2FwZUZ1bmNzKSk7CiAgICBiemVybyhicm93c2VyLCBzaXplb2YoTlBOZXRzY2FwZUZ1bmNzKSk7CiAgICAKICAgIGJyb3dzZXItPnNpemUgPSBicm93c2VyRnVuY3MtPnNpemU7CiAgICBicm93c2VyLT52ZXJzaW9uID0gYnJvd3NlckZ1bmNzLT52ZXJzaW9uOwogICAgCiAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbWFjaC1vIHBsdWctaW4gYW5kIHRoZSBicm93c2VyIGlzIENGTSBiZWNhdXNlIGl0IGlzIGNhbGxpbmcgbWFpbiwgdHJhbnNsYXRlCiAgICAvLyBvdXIgZnVuY3Rpb24gcG9pbnRzIGludG8gVFZlY3RvcnMgc28gdGhlIGJyb3dzZXIgY2FuIGNhbGwgdGhlbS4KICAgIGJyb3dzZXItPmdldHVybCA9IChOUE5fR2V0VVJMUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+Z2V0dXJsKTsKICAgIGJyb3dzZXItPnBvc3R1cmwgPSAoTlBOX1Bvc3RVUkxQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5wb3N0dXJsKTsKICAgIGJyb3dzZXItPnJlcXVlc3RyZWFkID0gKE5QTl9SZXF1ZXN0UmVhZFByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPnJlcXVlc3RyZWFkKTsKICAgIGJyb3dzZXItPm5ld3N0cmVhbSA9IChOUE5fTmV3U3RyZWFtUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+bmV3c3RyZWFtKTsKICAgIGJyb3dzZXItPndyaXRlID0gKE5QTl9Xcml0ZVByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPndyaXRlKTsKICAgIGJyb3dzZXItPmRlc3Ryb3lzdHJlYW0gPSAoTlBOX0Rlc3Ryb3lTdHJlYW1Qcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5kZXN0cm95c3RyZWFtKTsKICAgIGJyb3dzZXItPnN0YXR1cyA9IChOUE5fU3RhdHVzUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+c3RhdHVzKTsKICAgIGJyb3dzZXItPnVhZ2VudCA9IChOUE5fVXNlckFnZW50UHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+dWFnZW50KTsKICAgIGJyb3dzZXItPm1lbWFsbG9jID0gKE5QTl9NZW1BbGxvY1Byb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPm1lbWFsbG9jKTsKICAgIGJyb3dzZXItPm1lbWZyZWUgPSAoTlBOX01lbUZyZWVQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5tZW1mcmVlKTsKICAgIGJyb3dzZXItPm1lbWZsdXNoID0gKE5QTl9NZW1GbHVzaFByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPm1lbWZsdXNoKTsKICAgIGJyb3dzZXItPnJlbG9hZHBsdWdpbnMgPSAoTlBOX1JlbG9hZFBsdWdpbnNQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5yZWxvYWRwbHVnaW5zKTsKICAgIGJyb3dzZXItPmdldHVybG5vdGlmeSA9IChOUE5fR2V0VVJMTm90aWZ5UHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+Z2V0dXJsbm90aWZ5KTsKICAgIGJyb3dzZXItPnBvc3R1cmxub3RpZnkgPSAoTlBOX1Bvc3RVUkxOb3RpZnlQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5wb3N0dXJsbm90aWZ5KTsKICAgIGJyb3dzZXItPmdldHZhbHVlID0gKE5QTl9HZXRWYWx1ZVByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPmdldHZhbHVlKTsKICAgIGJyb3dzZXItPnNldHZhbHVlID0gKE5QTl9TZXRWYWx1ZVByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPnNldHZhbHVlKTsKICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0ID0gKE5QTl9JbnZhbGlkYXRlUmVjdFByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPmludmFsaWRhdGVyZWN0KTsKICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWdpb24gPSAoTlBOX0ludmFsaWRhdGVSZWdpb25Qcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5pbnZhbGlkYXRlcmVnaW9uKTsKICAgIGJyb3dzZXItPmZvcmNlcmVkcmF3ID0gKE5QTl9Gb3JjZVJlZHJhd1Byb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPmZvcmNlcmVkcmF3KTsKICAgIGJyb3dzZXItPmdldEphdmFFbnYgPSAoTlBOX0dldEphdmFFbnZQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5nZXRKYXZhRW52KTsKICAgIGJyb3dzZXItPmdldEphdmFQZWVyID0gKE5QTl9HZXRKYXZhUGVlclByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPmdldEphdmFQZWVyKTsKICAgIAogICAgcGx1Z2luRnVuY3MtPnZlcnNpb24gPSAxMTsKICAgIHBsdWdpbkZ1bmNzLT5zaXplID0gc2l6ZW9mKHBsdWdpbkZ1bmNzKTsKICAgIHBsdWdpbkZ1bmNzLT5uZXdwID0gKE5QUF9OZXdQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfTmV3KTsKICAgIHBsdWdpbkZ1bmNzLT5kZXN0cm95ID0gKE5QUF9EZXN0cm95UHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX0Rlc3Ryb3kpOwogICAgcGx1Z2luRnVuY3MtPnNldHdpbmRvdyA9IChOUFBfU2V0V2luZG93UHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX1NldFdpbmRvdyk7CiAgICBwbHVnaW5GdW5jcy0+bmV3c3RyZWFtID0gKE5QUF9OZXdTdHJlYW1Qcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfTmV3U3RyZWFtKTsKICAgIHBsdWdpbkZ1bmNzLT5kZXN0cm95c3RyZWFtID0gKE5QUF9EZXN0cm95U3RyZWFtUHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX0Rlc3Ryb3lTdHJlYW0pOwogICAgcGx1Z2luRnVuY3MtPmFzZmlsZSA9IChOUFBfU3RyZWFtQXNGaWxlUHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX1N0cmVhbUFzRmlsZSk7CiAgICBwbHVnaW5GdW5jcy0+d3JpdGVyZWFkeSA9IChOUFBfV3JpdGVSZWFkeVByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9Xcml0ZVJlYWR5KTsKICAgIHBsdWdpbkZ1bmNzLT53cml0ZSA9IChOUFBfV3JpdGVQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfV3JpdGUpOwogICAgcGx1Z2luRnVuY3MtPnByaW50ID0gKE5QUF9QcmludFByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9QcmludCk7CiAgICBwbHVnaW5GdW5jcy0+ZXZlbnQgPSAoTlBQX0hhbmRsZUV2ZW50UHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX0hhbmRsZUV2ZW50KTsKICAgIHBsdWdpbkZ1bmNzLT51cmxub3RpZnkgPSAoTlBQX1VSTE5vdGlmeVByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9VUkxOb3RpZnkpOwogICAgcGx1Z2luRnVuY3MtPmdldHZhbHVlID0gKE5QUF9HZXRWYWx1ZVByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9HZXRWYWx1ZSk7CiAgICBwbHVnaW5GdW5jcy0+c2V0dmFsdWUgPSAoTlBQX1NldFZhbHVlUHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX1NldFZhbHVlKTsKICAgIAogICAgKnNodXRkb3duID0gKE5QUF9TaHV0ZG93blByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QX1NodXRkb3duKTsKICAgIAogICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwp9CgpOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCkKewogICAgLy8gQ2FsbCB3aW5kb3cuYWxlcnQoIlN1Y2Nlc3MhIikKICAgIE5QRXJyb3IgZXJyb3I7CiAgICBOUE9iamVjdCAqd2luZG93T2JqZWN0ID0gTlVMTDsKICAgIGVycm9yID0gYnJvd3Nlci0+Z2V0dmFsdWUoaW5zdGFuY2UsIE5QTlZXaW5kb3dOUE9iamVjdCwgJndpbmRvd09iamVjdCk7CiAgICBpZiAoZXJyb3IgPT0gTlBFUlJfTk9fRVJST1IpIHsKICAgICAgICBOUFZhcmlhbnQgYWxlcnRNZXNzYWdlOwogICAgICAgIFNUUklOR1pfVE9fTlBWQVJJQU5UKCJTdWNjZXNzISIsIGFsZXJ0TWVzc2FnZSk7CiAgICAgICAgTlBWYXJpYW50IHJlc3VsdDsKICAgICAgICBicm93c2VyLT5pbnZva2UoaW5zdGFuY2UsIHdpbmRvd09iamVjdCwgYnJvd3Nlci0+Z2V0c3RyaW5naWRlbnRpZmllcigiYWxlcnQiKSwgJmFsZXJ0TWVzc2FnZSwgMSwgJnJlc3VsdCk7CiAgICAgICAgYnJvd3Nlci0+cmVsZWFzZW9iamVjdCh3aW5kb3dPYmplY3QpOwogICAgfQogICAgCiAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cn0KCk5QRXJyb3IgTlBQX0Rlc3Ryb3koTlBQIGluc3RhbmNlLCBOUFNhdmVkRGF0YSoqIHNhdmUpCnsKICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKfQoKTlBFcnJvciBOUFBfU2V0V2luZG93KE5QUCBpbnN0YW5jZSwgTlBXaW5kb3cqIHdpbmRvdykKewogICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwp9CgpOUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2X3QqIHN0eXBlKQp7CiAgICAqc3R5cGUgPSBOUF9BU0ZJTEVPTkxZOwogICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwp9CgpOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKQp7CiAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cn0KCmludDMyX3QgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQp7CiAgICByZXR1cm4gMDsKfQoKaW50MzJfdCBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBsZW4sIHZvaWQqIGJ1ZmZlcikKewogICAgcmV0dXJuIDA7Cn0KCnZvaWQgTlBQX1N0cmVhbUFzRmlsZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGZuYW1lKQp7Cn0KCnZvaWQgTlBQX1ByaW50KE5QUCBpbnN0YW5jZSwgTlBQcmludCogcGxhdGZvcm1QcmludCkKewoKfQoKaW50MTZfdCBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKewogICAgcmV0dXJuIDE7Cn0KCnZvaWQgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHVybCwgTlBSZWFzb24gcmVhc29uLCB2b2lkKiBub3RpZnlEYXRhKQp7Cgp9CgpOUEVycm9yIE5QUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSkKewogICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Cn0KCk5QRXJyb3IgTlBQX1NldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBOVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKQp7CiAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKfQoKLy8gZnVuY3Rpb24gcG9pbnRlciBjb252ZXJ0ZXJzCgpGdW5jdGlvblBvaW50ZXIgZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcihUcmFuc2l0aW9uVmVjdG9yIHR2cCkKewogICAgY29uc3QgdWludDMyX3QgdGVtcFs2XSA9IHsweDNEODAwMDAwLCAweDYxOEMwMDAwLCAweDgwMEMwMDAwLCAweDgwNEMwMDA0LCAweDdDMDkwM0E2LCAweDRFODAwNDIwfTsKICAgIHVpbnQzMl90ICpuZXdHbHVlID0gTlVMTDsKICAgIAogICAgaWYgKHR2cCAhPSBOVUxMKSB7CiAgICAgICAgbmV3R2x1ZSA9ICh1aW50MzJfdCAqKW1hbGxvYyhzaXplb2YodGVtcCkpOwogICAgICAgIGlmIChuZXdHbHVlICE9IE5VTEwpIHsKICAgICAgICAgICAgdW5zaWduZWQgaTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgbmV3R2x1ZVtpXSA9IHRlbXBbaV07CiAgICAgICAgICAgIG5ld0dsdWVbMF0gfD0gKChVSW50MzIpdHZwID4+IDE2KTsKICAgICAgICAgICAgbmV3R2x1ZVsxXSB8PSAoKFVJbnQzMil0dnAgJiAweEZGRkYpOwogICAgICAgICAgICBNYWtlRGF0YUV4ZWN1dGFibGUobmV3R2x1ZSwgc2l6ZW9mKHRlbXApKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiAoRnVuY3Rpb25Qb2ludGVyKW5ld0dsdWU7Cn0KClRyYW5zaXRpb25WZWN0b3IgdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcihGdW5jdGlvblBvaW50ZXIgZnApCnsKICAgIEZ1bmN0aW9uUG9pbnRlciAqbmV3R2x1ZSA9IE5VTEw7CiAgICBpZiAoZnAgIT0gTlVMTCkgewogICAgICAgIG5ld0dsdWUgPSAoRnVuY3Rpb25Qb2ludGVyICopbWFsbG9jKDIgKiBzaXplb2YoRnVuY3Rpb25Qb2ludGVyKSk7CiAgICAgICAgaWYgKG5ld0dsdWUgIT0gTlVMTCkgewogICAgICAgICAgICBuZXdHbHVlWzBdID0gZnA7CiAgICAgICAgICAgIG5ld0dsdWVbMV0gPSBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoVHJhbnNpdGlvblZlY3RvciluZXdHbHVlOwp9Cg==