LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIFNETy9VRFAtUHJvdG9jb2xhYnN0cmFjdGlvbmxheWVyIG1vZHVsZQoKICBMaWNlbnNlOgoKICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAgICBhcmUgbWV0OgoKICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCgogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgogICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgoKICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwogICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAogICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgogICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKCiAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgogICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgogICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgogICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9VZHB1LmMsdiAkCgogICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKCiAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCgogICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAoKICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgogICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgUmV2aXNpb24gSGlzdG9yeToKCiAgMjAwNi8wNi8yNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJ1c2VyL0VwbFNkb1VkcHUuaCIKCiNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQoKI2luY2x1ZGUgIlNvY2tldExpbnV4S2VybmVsLmgiCiNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGNvbnN0IGRlZmluZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFAKI2RlZmluZSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCAgNQojZW5kaWYKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGxvY2FsIHR5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0eXBlZGVmIHN0cnVjdCB7Cgl1bnNpZ25lZCBsb25nIG1fdWxJcEFkZHI7CS8vIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgoJdW5zaWduZWQgaW50IG1fdWlQb3J0OwkvLyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKCn0gdEVwbFNkb1VkcENvbjsKCi8vIGluc3RhbmNlIHRhYmxlCnR5cGVkZWYgc3RydWN0IHsKCXRFcGxTZG9VZHBDb24gbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUF07Cgl0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIG1fZnBTZG9Bc3lTZXFDYjsKCVNPQ0tFVCBtX1VkcFNvY2tldDsKCglzdHJ1Y3QgY29tcGxldGlvbiBtX0NvbXBsZXRpb25VZHBUaHJlYWQ7CglpbnQgbV9UaHJlYWRIYW5kbGU7CglpbnQgbV9pVGVybWluYXRlVGhyZWFkOwp9IHRFcGxTZG9VZHBJbnN0YW5jZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIG1vZHVsIGdsb2JhbGUgdmFycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIHRFcGxTZG9VZHBJbnN0YW5jZSBTZG9VZHBJbnN0YW5jZV9nOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIGludCBFcGxTZG9VZHBUaHJlYWQodm9pZCAqcEFyZ19wKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVQTC1TRE8tVURQLUxheWVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8vCi8vIERlc2NyaXB0aW9uOiBQcm90b2NvbGFic3RyYWN0aW9uIGxheWVyIGZvciBVRFAKLy8KLy8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdUluaXQKLy8KLy8gRGVzY3JpcHRpb246IGluaXQgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgcFJlY2VpdmVDYl9wICAgID0gICBmdW5jdGlvbnBvaW50ZXIgdG8gU2RvLVNlcXVlbmNlIGxheWVyCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLWZ1bmN0aW9uCi8vCi8vCi8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQovLwovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFcGxTZG9VZHB1SW5pdCh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApCnsKCXRFcGxLZXJuZWwgUmV0OwoKCVJldCA9IEVwbFNkb1VkcHVBZGRJbnN0YW5jZShmcFJlY2VpdmVDYl9wKTsKCglyZXR1cm4gUmV0Owp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdUFkZEluc3RhbmNlCi8vCi8vIERlc2NyaXB0aW9uOiBpbml0IGFkZGl0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQovLyAgICAgICAgICAgICAg7m5pdCBzb2NrZXQgYW5kIHN0YXJ0IExpc3Rlbi1UaHJlYWQKLy8KLy8KLy8KLy8gUGFyYW1ldGVyczogIHBSZWNlaXZlQ2JfcCAgICA9ICAgZnVuY3Rpb25wb2ludGVyIHRvIFNkby1TZXF1ZW5jZSBsYXllcgovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay1mdW5jdGlvbgovLwovLwovLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRXBsU2RvVWRwdUFkZEluc3RhbmNlKHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCkKewoJdEVwbEtlcm5lbCBSZXQ7CgoJLy8gc2V0IGluc3RhbmNlIHZhcmlhYmxlcyB0byAwCglFUExfTUVNU0VUKCZTZG9VZHBJbnN0YW5jZV9nLCAweDAwLCBzaXplb2YoU2RvVWRwSW5zdGFuY2VfZykpOwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCS8vIHNhdmUgcG9pbnRlciB0byBjYWxsYmFjay1mdW5jdGlvbgoJaWYgKGZwUmVjZWl2ZUNiX3AgIT0gTlVMTCkgewoJCVNkb1VkcEluc3RhbmNlX2cubV9mcFNkb0FzeVNlcUNiID0gZnBSZWNlaXZlQ2JfcDsKCX0gZWxzZSB7CgkJUmV0ID0ga0VwbFNkb1VkcE1pc3NDYjsKCQlnb3RvIEV4aXQ7Cgl9CgoJaW5pdF9jb21wbGV0aW9uKCZTZG9VZHBJbnN0YW5jZV9nLm1fQ29tcGxldGlvblVkcFRocmVhZCk7CglTZG9VZHBJbnN0YW5jZV9nLm1faVRlcm1pbmF0ZVRocmVhZCA9IDA7CglTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID0gMDsKCVNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVDsKCglSZXQgPSBFcGxTZG9VZHB1Q29uZmlnKElOQUREUl9BTlksIDApOwoKICAgICAgRXhpdDoKCXJldHVybiBSZXQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1RGVsSW5zdGFuY2UKLy8KLy8gRGVzY3JpcHRpb246IGRlbCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCi8vICAgICAgICAgICAgICBkZWwgc29ja2V0IGFuZCBkZWwgTGlzdGVuLVRocmVhZAovLwovLwovLwovLyBQYXJhbWV0ZXJzOgovLwovLwovLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRXBsU2RvVWRwdURlbEluc3RhbmNlKHZvaWQpCnsKCXRFcGxLZXJuZWwgUmV0OwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlICE9IDApIHsJLy8gbGlzdGVuIHRocmVhZCB3YXMgc3RhcnRlZAoJCS8vIGNsb3NlIHRocmVhZAoJCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMTsKCQkvKiBraWxsX3Byb2MoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgU0lHVEVSTSwgMSApOyAqLwoJCXNlbmRfc2lnKFNJR1RFUk0sIFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIDEpOwoJCXdhaXRfZm9yX2NvbXBsZXRpb24oJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkKTsKCQlTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID0gMDsKCX0KCglpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCAhPSBJTlZBTElEX1NPQ0tFVCkgewoJCS8vIGNsb3NlIHNvY2tldAoJCWNsb3Nlc29ja2V0KFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQpOwoJCVNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVDsKCX0KCXJldHVybiBSZXQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1Q29uZmlnCi8vCi8vIERlc2NyaXB0aW9uOiByZWNvbmZpZ3VyYXRlIHNvY2tldCB3aXRoIG5ldyBJUC1BZGRyZXNzCi8vICAgICAgICAgICAgICAtPiBuZWVkZWQgZm9yIE5NVCBSZXNldENvbmZpZ3VyYXRpb24KLy8KLy8gUGFyYW1ldGVyczogIHVsSXBBZGRyX3AgICAgICA9IElwQWRkcmVzcyBpbiBwbGF0Zm9ybSBieXRlIG9yZGVyCi8vICAgICAgICAgICAgICB1aVBvcnRfcCAgICAgICAgPSBwb3J0IG51bWJlciBpbiBwbGF0Zm9ybSBieXRlIG9yZGVyCi8vCi8vCi8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQovLwovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFcGxTZG9VZHB1Q29uZmlnKHVuc2lnbmVkIGxvbmcgdWxJcEFkZHJfcCwgdW5zaWduZWQgaW50IHVpUG9ydF9wKQp7Cgl0RXBsS2VybmVsIFJldDsKCXN0cnVjdCBzb2NrYWRkcl9pbiBBZGRyOwoJaW50IGlFcnJvcjsKCglSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCglpZiAodWlQb3J0X3AgPT0gMCkgewkvLyBzZXQgVURQIHBvcnQgdG8gZGVmYXVsdCBwb3J0IG51bWJlcgoJCXVpUG9ydF9wID0gRVBMX0NfU0RPX0VQTF9QT1JUOwoJfSBlbHNlIGlmICh1aVBvcnRfcCA+IDY1NTM1KSB7CgkJUmV0ID0ga0VwbFNkb1VkcFNvY2tldEVycm9yOwoJCWdvdG8gRXhpdDsKCX0KCglpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSAhPSAwKSB7CS8vIGxpc3RlbiB0aHJlYWQgd2FzIHN0YXJ0ZWQKCgkJLy8gY2xvc2Ugb2xkIHRocmVhZAoJCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMTsKCQkvKiBraWxsX3Byb2MoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgU0lHVEVSTSwgMSApOyAqLwoJCXNlbmRfc2lnKFNJR1RFUk0sIFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIDEpOwoJCXdhaXRfZm9yX2NvbXBsZXRpb24oJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkKTsKCQlTZG9VZHBJbnN0YW5jZV9nLm1faVRlcm1pbmF0ZVRocmVhZCA9IDA7CgkJU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9IDA7Cgl9CgoJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgIT0gSU5WQUxJRF9TT0NLRVQpIHsKCQkvLyBjbG9zZSBzb2NrZXQKCQlpRXJyb3IgPSBjbG9zZXNvY2tldChTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0KTsKCQlTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7CgkJaWYgKGlFcnJvciAhPSAwKSB7CgkJCVJldCA9IGtFcGxTZG9VZHBTb2NrZXRFcnJvcjsKCQkJZ290byBFeGl0OwoJCX0KCX0KCS8vIGNyZWF0ZSBTb2NrZXQKCVNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOwoJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPT0gSU5WQUxJRF9TT0NLRVQpIHsKCQlSZXQgPSBrRXBsU2RvVWRwTm9Tb2NrZXQ7CgkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwKCJFcGxTZG9VZHB1Q29uZmlnOiBzb2NrZXQoKSBmYWlsZWRcbiIpOwoJCWdvdG8gRXhpdDsKCX0KCS8vIGJpbmQgc29ja2V0CglBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwoJQWRkci5zaW5fcG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydCl1aVBvcnRfcCk7CglBZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKHVsSXBBZGRyX3ApOwoJaUVycm9yID0KCSAgICBiaW5kKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmQWRkciwKCQkgc2l6ZW9mKEFkZHIpKTsKCWlmIChpRXJyb3IgPCAwKSB7CgkJLy9pRXJyb3IgPSBXU0FHZXRMYXN0RXJyb3IoKTsKCQlFUExfREJHTFZMX1NET19UUkFDRTEKCQkgICAgKCJFcGxTZG9VZHB1Q29uZmlnOiBiaW5kKCkgZmluaXNoZWQgd2l0aCAlaVxuIiwgaUVycm9yKTsKCQlSZXQgPSBrRXBsU2RvVWRwTm9Tb2NrZXQ7CgkJZ290byBFeGl0OwoJfQoJLy8gY3JlYXRlIExpc3Rlbi1UaHJlYWQKCVNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPQoJICAgIGtlcm5lbF90aHJlYWQoRXBsU2RvVWRwVGhyZWFkLCAmU2RvVWRwSW5zdGFuY2VfZywgQ0xPTkVfS0VSTkVMKTsKCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID09IDApIHsKCQlSZXQgPSBrRXBsU2RvVWRwVGhyZWFkRXJyb3I7CgkJZ290byBFeGl0OwoJfQoKICAgICAgRXhpdDoKCXJldHVybiBSZXQ7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdUluaXRDb24KLy8KLy8gRGVzY3JpcHRpb246IGluaXQgYSBuZXcgY29ubmVjdAovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbkhhbmRsZV9wID0gcG9pbnRlciBmb3IgdGhlIG5ldyBjb25uZWN0aW9uIGhhbmRsZQovLyAgICAgICAgICAgICAgdWlUYXJnZXROb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgdGFyZ2V0IG5vZGUKLy8KLy8KLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCi8vCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVwbFNkb1VkcHVJbml0Q29uKHRFcGxTZG9Db25IZGwgKnBTZG9Db25IYW5kbGVfcCwKCQkJICAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCkKewoJdEVwbEtlcm5lbCBSZXQ7Cgl1bnNpZ25lZCBpbnQgdWlDb3VudDsKCXVuc2lnbmVkIGludCB1aUZyZWVDb247Cgl0RXBsU2RvVWRwQ29uICpwU2RvVWRwQ29uOwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCS8vIGdldCBmcmVlIGVudHJ5IGluIGNvbnRyb2wgc3RydWN0dXJlCgl1aUNvdW50ID0gMDsKCXVpRnJlZUNvbiA9IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQOwoJcFNkb1VkcENvbiA9ICZTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bMF07Cgl3aGlsZSAodWlDb3VudCA8IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CgkJaWYgKChwU2RvVWRwQ29uLT5tX3VsSXBBZGRyICYgaHRvbmwoMHhGRikpID09IGh0b25sKHVpVGFyZ2V0Tm9kZUlkX3ApKSB7CS8vIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gdGFyZ2V0IG5vZGUgZm91bmQKCQkJLy8gc2V0IGhhbmRsZQoJCQkqcFNkb0NvbkhhbmRsZV9wID0gKHVpQ291bnQgfCBFUExfU0RPX1VEUF9IQU5ETEUpOwoKCQkJZ290byBFeGl0OwoJCX0gZWxzZSBpZiAoKHBTZG9VZHBDb24tPm1fdWxJcEFkZHIgPT0gMCkKCQkJICAgJiYgKHBTZG9VZHBDb24tPm1fdWlQb3J0ID09IDApKSB7CgkJCXVpRnJlZUNvbiA9IHVpQ291bnQ7CgkJfQoJCXVpQ291bnQrKzsKCQlwU2RvVWRwQ29uKys7Cgl9CgoJaWYgKHVpRnJlZUNvbiA9PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgewoJCS8vIGVycm9yIG5vIGZyZWUgaGFuZGxlCgkJUmV0ID0ga0VwbFNkb1VkcE5vRnJlZUhhbmRsZTsKCX0gZWxzZSB7CgkJcFNkb1VkcENvbiA9CgkJICAgICZTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bdWlGcmVlQ29uXTsKCQkvLyBzYXZlIGluZm9zIGZvciBjb25uZWN0aW9uCgkJcFNkb1VkcENvbi0+bV91aVBvcnQgPSBodG9ucyhFUExfQ19TRE9fRVBMX1BPUlQpOwoJCXBTZG9VZHBDb24tPm1fdWxJcEFkZHIgPSBodG9ubCgweEMwQTg2NDAwIHwgdWlUYXJnZXROb2RlSWRfcCk7CS8vIDE5Mi4xNjguMTAwLnVpVGFyZ2V0Tm9kZUlkX3AKCgkJLy8gc2V0IGhhbmRsZQoJCSpwU2RvQ29uSGFuZGxlX3AgPSAodWlGcmVlQ29uIHwgRVBMX1NET19VRFBfSEFORExFKTsKCgl9CgogICAgICBFeGl0OgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1U2VuZERhdGEKLy8KLy8gRGVzY3JpcHRpb246IHNlbmQgZGF0YSB1c2luZyBleGlzaXRpbmcgY29ubmVjdGlvbgovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgU2RvQ29uSGFuZGxlX3AgID0gY29ubmVjdGlvbiBoYW5kbGUKLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICA9IHBvaW50ZXIgdG8gZGF0YQovLyAgICAgICAgICAgICAgZHdEYXRhU2l6ZV9wICAgID0gbnVtYmVyIG9mIGRhdGFieXRlCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpdGhvdXQgYXNlbmQtaGVhZGVyISEhCi8vCi8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQovLwovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFcGxTZG9VZHB1U2VuZERhdGEodEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCwKCQkJICAgICAgdEVwbEZyYW1lICpwU3JjRGF0YV9wLCB1MzIgZHdEYXRhU2l6ZV9wKQp7Cgl0RXBsS2VybmVsIFJldDsKCWludCBpRXJyb3I7Cgl1bnNpZ25lZCBpbnQgdWlBcnJheTsKCXN0cnVjdCBzb2NrYWRkcl9pbiBBZGRyOwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCXVpQXJyYXkgPSAoU2RvQ29uSGFuZGxlX3AgJiB+RVBMX1NET19BU1lfSEFORExFX01BU0spOwoJaWYgKHVpQXJyYXkgPj0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKCQlSZXQgPSBrRXBsU2RvVWRwSW52YWxpZEhkbDsKCQlnb3RvIEV4aXQ7Cgl9CgkvL3NldCBtZXNzYWdlIHR5cGUKCUFtaVNldEJ5dGVUb0xlKCZwU3JjRGF0YV9wLT5tX2xlX2JNZXNzYWdlVHlwZSwgMHgwNik7CS8vIFNETwoJLy8gdGFyZ2V0IG5vZGUgaWQgKGZvciBVZHAgPSAwKQoJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYkRzdE5vZGVJZCwgMHgwMCk7CgkvLyBzZXQgc291cmNlLW5vZGVpZCAoZm9yIFVkcCA9IDApCglBbWlTZXRCeXRlVG9MZSgmcFNyY0RhdGFfcC0+bV9sZV9iU3JjTm9kZUlkLCAweDAwKTsKCgkvLyBjYWxjIHNpemUKCWR3RGF0YVNpemVfcCArPSBFUExfQVNORF9IRUFERVJfU0laRTsKCgkvLyBjYWxsIHNlbmR0bwoJQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKCUFkZHIuc2luX3BvcnQgPQoJICAgICh1bnNpZ25lZCBzaG9ydClTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bdWlBcnJheV0uCgkgICAgbV91aVBvcnQ7CglBZGRyLnNpbl9hZGRyLnNfYWRkciA9CgkgICAgU2RvVWRwSW5zdGFuY2VfZy5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW3VpQXJyYXldLm1fdWxJcEFkZHI7CgoJaUVycm9yID0gc2VuZHRvKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQsCS8vIHNvY2tldGhhbmRsZQoJCQkoY29uc3QgY2hhciAqKSZwU3JjRGF0YV9wLT5tX2xlX2JNZXNzYWdlVHlwZSwJLy8gZGF0YSB0byBzZW5kCgkJCWR3RGF0YVNpemVfcCwJLy8gbnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQKCQkJMCwJLy8gZmxhZ3MKCQkJKHN0cnVjdCBzb2NrYWRkciAqKSZBZGRyLAkvLyB0YXJnZXQKCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwkvLyBzaXplb2YgdGFyZ2V0YWRyZXNzCglpZiAoaUVycm9yIDwgMCkgewoJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMQoJCSAgICAoIkVwbFNkb1VkcHVTZW5kRGF0YTogc2VuZHRvKCkgZmluaXNoZWQgd2l0aCAlaVxuIiwgaUVycm9yKTsKCQlSZXQgPSBrRXBsU2RvVWRwU2VuZEVycm9yOwoJCWdvdG8gRXhpdDsKCX0KCiAgICAgIEV4aXQ6CglyZXR1cm4gUmV0OwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVwbFNkb1VkcHVEZWxDb24KLy8KLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBjb25uZWN0aW9uIGZyb20gaW50ZXJuIHN0cnVjdHVyZQovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgU2RvQ29uSGFuZGxlX3AgID0gY29ubmVjdGlvbiBoYW5kbGUKLy8KLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCi8vCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVwbFNkb1VkcHVEZWxDb24odEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCkKewoJdEVwbEtlcm5lbCBSZXQ7Cgl1bnNpZ25lZCBpbnQgdWlBcnJheTsKCgl1aUFycmF5ID0gKFNkb0NvbkhhbmRsZV9wICYgfkVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKTsKCglpZiAodWlBcnJheSA+PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgewoJCVJldCA9IGtFcGxTZG9VZHBJbnZhbGlkSGRsOwoJCWdvdG8gRXhpdDsKCX0gZWxzZSB7CgkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7Cgl9CgoJLy8gZGVsZXRlIGNvbm5lY3Rpb24KCVNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUFycmF5XS5tX3VsSXBBZGRyID0gMDsKCVNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUFycmF5XS5tX3VpUG9ydCA9IDA7CgogICAgICBFeGl0OgoJcmV0dXJuIFJldDsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvVWRwVGhyZWFkCi8vCi8vIERlc2NyaXB0aW9uOiAgICAgdGhyZWFkIGNoZWNrIHNvY2tldCBmb3IgbmV3IGRhdGEKLy8KLy8KLy8KLy8gUGFyYW1ldGVyczogICAgICBscFBhcmFtZXRlciA9IHBvaW50ZXIgdG8gcGFyYW1ldGVyIHR5cGUgdEVwbFNkb1VkcFRocmVhZFBhcmEKLy8KLy8KLy8gUmV0dXJuczogICAgICAgICB1MzIgICA9ICAgZXJyb3Jjb2RlCi8vCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgaW50IEVwbFNkb1VkcFRocmVhZCh2b2lkICpwQXJnX3ApCnsKCgl0RXBsU2RvVWRwSW5zdGFuY2UgKnBJbnN0YW5jZTsKCXN0cnVjdCBzb2NrYWRkcl9pbiBSZW1vdGVBZGRyOwoJaW50IGlFcnJvcjsKCWludCBpQ291bnQ7CglpbnQgaUZyZWVFbnRyeTsKCXU4IGFiQnVmZmVyW0VQTF9NQVhfU0RPX1JFQ19GUkFNRV9TSVpFXTsKCXVuc2lnbmVkIGludCB1aVNpemU7Cgl0RXBsU2RvQ29uSGRsIFNkb0NvbkhkbDsKCglwSW5zdGFuY2UgPSAodEVwbFNkb1VkcEluc3RhbmNlICopIHBBcmdfcDsKCWRhZW1vbml6ZSgiRXBsU2RvVWRwVGhyZWFkIik7CglhbGxvd19zaWduYWwoU0lHVEVSTSk7CgoJZm9yICg7IHBJbnN0YW5jZS0+bV9pVGVybWluYXRlVGhyZWFkID09IDA7KQoKCXsKCQkvLyB3YWl0IGZvciBkYXRhCgkJdWlTaXplID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcik7CgkJaUVycm9yID0gcmVjdmZyb20ocEluc3RhbmNlLT5tX1VkcFNvY2tldCwJLy8gU29ja2V0CgkJCQkgIChjaGFyICopJmFiQnVmZmVyWzBdLAkvLyBidWZmZXIgZm9yIGRhdGEKCQkJCSAgc2l6ZW9mKGFiQnVmZmVyKSwJLy8gc2l6ZSBvZiB0aGUgYnVmZmVyCgkJCQkgIDAsCS8vIGZsYWdzCgkJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmUmVtb3RlQWRkciwKCQkJCSAgKGludCAqKSZ1aVNpemUpOwoJCWlmIChpRXJyb3IgPT0gLUVSRVNUQVJUU1lTKSB7CgkJCWJyZWFrOwoJCX0KCQlpZiAoaUVycm9yID4gMCkgewoJCQkvLyBnZXQgaGFuZGxlIGZvciBoaWdoZXIgbGF5ZXIKCQkJaUNvdW50ID0gMDsKCQkJaUZyZWVFbnRyeSA9IDB4RkZGRjsKCQkJd2hpbGUgKGlDb3VudCA8IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CgkJCQkvLyBjaGVjayBpZiB0aGlzIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBrbm93bgoJCQkJaWYgKChwSW5zdGFuY2UtPm1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUNvdW50XS4KCQkJCSAgICAgbV91bElwQWRkciA9PSBSZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcikKCQkJCSAgICAmJiAocEluc3RhbmNlLT4KCQkJCQltX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lDb3VudF0uCgkJCQkJbV91aVBvcnQgPT0gUmVtb3RlQWRkci5zaW5fcG9ydCkpIHsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQlpZiAoKHBJbnN0YW5jZS0+bV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpQ291bnRdLgoJCQkJICAgICBtX3VsSXBBZGRyID09IDApCgkJCQkgICAgJiYgKHBJbnN0YW5jZS0+CgkJCQkJbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpQ291bnRdLgoJCQkJCW1fdWlQb3J0ID09IDApCgkJCQkgICAgJiYgKGlGcmVlRW50cnkgPT0gMHhGRkZGKSkKCQkJCXsKCQkJCQlpRnJlZUVudHJ5ID0gaUNvdW50OwoJCQkJfQoKCQkJCWlDb3VudCsrOwoJCQl9CgoJCQlpZiAoaUNvdW50ID09IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CgkJCQkvLyBjb25uZWN0aW9uIHVua25vd24KCQkJCS8vIHNlZSBpZiB0aGVyZSBpcyBhIGZyZWUgaGFuZGxlCgkJCQlpZiAoaUZyZWVFbnRyeSAhPSAweEZGRkYpIHsKCQkJCQkvLyBzYXZlIGFkcmVzcyBpbmZvcwoJCQkJCXBJbnN0YW5jZS0+CgkJCQkJICAgIG1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUZyZWVFbnRyeV0uCgkJCQkJICAgIG1fdWxJcEFkZHIgPQoJCQkJCSAgICBSZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcjsKCQkJCQlwSW5zdGFuY2UtPgoJCQkJCSAgICBtX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lGcmVlRW50cnldLgoJCQkJCSAgICBtX3VpUG9ydCA9IFJlbW90ZUFkZHIuc2luX3BvcnQ7CgkJCQkJLy8gY2FsbCBjYWxsYmFjawoJCQkJCVNkb0NvbkhkbCA9IGlGcmVlRW50cnk7CgkJCQkJU2RvQ29uSGRsIHw9IEVQTF9TRE9fVURQX0hBTkRMRTsKCQkJCQkvLyBvZmZzZXQgNCAtPiBzdGFydCBvZiBTRE8gU2VxdWVuY2UgaGVhZGVyCgkJCQkJcEluc3RhbmNlLT5tX2ZwU2RvQXN5U2VxQ2IoU2RvQ29uSGRsLAoJCQkJCQkJCSAgICh0RXBsQXN5U2RvU2VxCgkJCQkJCQkJICAgICopICYKCQkJCQkJCQkgICBhYkJ1ZmZlcls0XSwKCQkJCQkJCQkgICAoaUVycm9yIC0KCQkJCQkJCQkgICAgNCkpOwoJCQkJfSBlbHNlIHsKCQkJCQlFUExfREJHTFZMX1NET19UUkFDRTAKCQkJCQkgICAgKCJFcnJvciBpbiBFcGxTZG9VZHBUaHJlYWQoKSBubyBmcmVlIGhhbmRsZVxuIik7CgkJCQl9CgoJCQl9IGVsc2UgewoJCQkJLy8ga25vd24gY29ubmVjdGlvbgoJCQkJLy8gY2FsbCBjYWxsYmFjayB3aXRoIGNvcnJlY3QgaGFuZGxlCgkJCQlTZG9Db25IZGwgPSBpQ291bnQ7CgkJCQlTZG9Db25IZGwgfD0gRVBMX1NET19VRFBfSEFORExFOwoJCQkJLy8gb2Zmc2V0IDQgLT4gc3RhcnQgb2YgU0RPIFNlcXVlbmNlIGhlYWRlcgoJCQkJcEluc3RhbmNlLT5tX2ZwU2RvQXN5U2VxQ2IoU2RvQ29uSGRsLAoJCQkJCQkJICAgKHRFcGxBc3lTZG9TZXEgKikgJgoJCQkJCQkJICAgYWJCdWZmZXJbNF0sCgkJCQkJCQkgICAoaUVycm9yIC0gNCkpOwoJCQl9CgkJfQkJLy8gZW5kIG9mICBpZihpRXJyb3IhPVNPQ0tFVF9FUlJPUikKCX0JCQkvLyBlbmQgb2YgZm9yKDs7KQoKCWNvbXBsZXRlX2FuZF9leGl0KCZTZG9VZHBJbnN0YW5jZV9nLm1fQ29tcGxldGlvblVkcFRocmVhZCwgMCk7CglyZXR1cm4gMDsKfQoKI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQoKLy8gRU9GCg==