LyoKICogVkdBIGVtdWxhdGlvbgogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS8V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2lmbmRlZiBfX1dJTkVfVkdBX0gKI2RlZmluZSBfX1dJTkVfVkdBX0gKCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgoKLyogZ3JhcGhpY3MgbW9kZSAqLwppbnQgVkdBX1NldE1vZGUodW5zaWduZWQgWHJlcyx1bnNpZ25lZCBZcmVzLHVuc2lnbmVkIERlcHRoKTsKaW50IFZHQV9HZXRNb2RlKHVuc2lnbmVkKkhlaWdodCx1bnNpZ25lZCpXaWR0aCx1bnNpZ25lZCpEZXB0aCk7CnZvaWQgVkdBX1NldFBhbGV0dGUoUEFMRVRURUVOVFJZKnBhbCxpbnQgc3RhcnQsaW50IGxlbik7CnZvaWQgVkdBX1NldENvbG9yMTYoaW50IHJlZyxpbnQgY29sb3IpOwpjaGFyIFZHQV9HZXRDb2xvcjE2KGludCByZWcpOwp2b2lkIFZHQV9TZXQxNlBhbGV0dGUoY2hhciAqVGFibGUpOwp2b2lkIFZHQV9HZXQxNlBhbGV0dGUoY2hhciAqVGFibGUpOwp2b2lkIFZHQV9TZXRRdWFkUGFsZXR0ZShSR0JRVUFEKmNvbG9yLGludCBzdGFydCxpbnQgbGVuKTsKdm9pZCBWR0FfU2V0V2luZG93U3RhcnQoaW50IHN0YXJ0KTsKaW50ICBWR0FfR2V0V2luZG93U3RhcnQodm9pZCk7CnZvaWQgVkdBX1Nob3dNb3VzZShCT09MIHNob3cpOwoKLyogdGV4dCBtb2RlICovCnZvaWQgVkdBX0luaXRBbHBoYU1vZGUodW5zaWduZWQqWHJlcyx1bnNpZ25lZCpZcmVzKTsKdm9pZCBWR0FfU2V0QWxwaGFNb2RlKHVuc2lnbmVkIFhyZXMsdW5zaWduZWQgWXJlcyk7CkJPT0wgVkdBX0dldEFscGhhTW9kZSh1bnNpZ25lZCpYcmVzLHVuc2lnbmVkKllyZXMpOwp2b2lkIFZHQV9TZXRDdXJzb3JTaGFwZSh1bnNpZ25lZCBjaGFyIHN0YXJ0X29wdGlvbnMsdW5zaWduZWQgY2hhciBlbmQpOwp2b2lkIFZHQV9TZXRDdXJzb3JQb3ModW5zaWduZWQgWCx1bnNpZ25lZCBZKTsKdm9pZCBWR0FfR2V0Q3Vyc29yUG9zKHVuc2lnbmVkKlgsdW5zaWduZWQqWSk7CnZvaWQgVkdBX1dyaXRlQ2hhcnModW5zaWduZWQgWCx1bnNpZ25lZCBZLHVuc2lnbmVkIGNoLGludCBhdHRyLGludCBjb3VudCk7CnZvaWQgVkdBX1B1dENoYXIoQllURSBhc2NpaSk7CnZvaWQgVkdBX1NldFRleHRBdHRyaWJ1dGUoQllURSBhdHRyKTsKdm9pZCBWR0FfQ2xlYXJUZXh0KHVuc2lnbmVkIHJvdzEsIHVuc2lnbmVkIGNvbDEsCiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJvdzIsIHVuc2lnbmVkIGNvbDIsCiAgICAgICAgICAgICAgICAgIEJZVEUgYXR0cik7CnZvaWQgVkdBX1Njcm9sbFVwVGV4dCh1bnNpZ25lZCByb3cxLCB1bnNpZ25lZCBjb2wxLAogICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByb3cyLCB1bnNpZ25lZCBjb2wyLAogICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsaW5lcywgQllURSBhdHRyKTsKdm9pZCBWR0FfU2Nyb2xsRG93blRleHQodW5zaWduZWQgcm93MSwgdW5zaWduZWQgY29sMSwKICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByb3cyLCB1bnNpZ25lZCBjb2wyLAogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmVzLCBCWVRFIGF0dHIpOwp2b2lkIFZHQV9HZXRDaGFyYWN0ZXJBdEN1cnNvcihCWVRFICphc2NpaSwgQllURSAqYXR0cik7CgovKiBjb250cm9sICovCnZvaWQgVkdBX2lvcG9ydF9vdXQoV09SRCBwb3J0LCBCWVRFIHZhbCk7CkJZVEUgVkdBX2lvcG9ydF9pbihXT1JEIHBvcnQpOwp2b2lkIFZHQV9DbGVhbih2b2lkKTsKCiNlbmRpZiAvKiBfX1dJTkVfVkdBX0ggKi8K