LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIFNETy9VRFAtUHJvdG9jb2xhYnN0cmFjdGlvbmxheWVyIG1vZHVsZQoKICBMaWNlbnNlOgoKICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAgICBhcmUgbWV0OgoKICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCgogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgogICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgoKICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwogICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAogICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgogICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKCiAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgogICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgogICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgogICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9VZHB1LmMsdiAkCgogICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKCiAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCgogICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAoKICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgogICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgUmV2aXNpb24gSGlzdG9yeToKCiAgMjAwNi8wNi8yNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJ1c2VyL0VwbFNkb1VkcHUuaCIKCiNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQoKI2luY2x1ZGUgIlNvY2tldExpbnV4S2VybmVsLmgiCiNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGNvbnN0IGRlZmluZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFAKI2RlZmluZSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCAgNQojZW5kaWYKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGxvY2FsIHR5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0eXBlZGVmIHN0cnVjdCB7Cgl1bnNpZ25lZCBsb25nIG1fdWxJcEFkZHI7CS8vIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgoJdW5zaWduZWQgaW50IG1fdWlQb3J0OwkvLyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKCn0gdEVwbFNkb1VkcENvbjsKCi8vIGluc3RhbmNlIHRhYmxlCnR5cGVkZWYgc3RydWN0IHsKCXRFcGxTZG9VZHBDb24gbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUF07Cgl0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIG1fZnBTZG9Bc3lTZXFDYjsKCVNPQ0tFVCBtX1VkcFNvY2tldDsKCglzdHJ1Y3QgY29tcGxldGlvbiBtX0NvbXBsZXRpb25VZHBUaHJlYWQ7CglpbnQgbV9UaHJlYWRIYW5kbGU7CglpbnQgbV9pVGVybWluYXRlVGhyZWFkOwp9IHRFcGxTZG9VZHBJbnN0YW5jZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIG1vZHVsIGdsb2JhbGUgdmFycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIHRFcGxTZG9VZHBJbnN0YW5jZSBTZG9VZHBJbnN0YW5jZV9nOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIGludCBFcGxTZG9VZHBUaHJlYWQodm9pZCAqcEFyZ19wKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVQTC1TRE8tVURQLUxheWVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8vCi8vIERlc2NyaXB0aW9uOiBQcm90b2NvbGFic3RyYWN0aW9uIGxheWVyIGZvciBVRFAKLy8KLy8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdUluaXQKLy8KLy8gRGVzY3JpcHRpb246IGluaXQgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgcFJlY2VpdmVDYl9wICAgID0gICBmdW5jdGlvbnBvaW50ZXIgdG8gU2RvLVNlcXVlbmNlIGxheWVyCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLWZ1bmN0aW9uCi8vCi8vCi8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQovLwovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFcGxTZG9VZHB1SW5pdCh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApCnsKCXRFcGxLZXJuZWwgUmV0OwoKCVJldCA9IEVwbFNkb1VkcHVBZGRJbnN0YW5jZShmcFJlY2VpdmVDYl9wKTsKCglyZXR1cm4gUmV0Owp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdUFkZEluc3RhbmNlCi8vCi8vIERlc2NyaXB0aW9uOiBpbml0IGFkZGl0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQovLyAgICAgICAgICAgICAg7m5pdCBzb2NrZXQgYW5kIHN0YXJ0IExpc3Rlbi1UaHJlYWQKLy8KLy8KLy8KLy8gUGFyYW1ldGVyczogIHBSZWNlaXZlQ2JfcCAgICA9ICAgZnVuY3Rpb25wb2ludGVyIHRvIFNkby1TZXF1ZW5jZSBsYXllcgovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay1mdW5jdGlvbgovLwovLwovLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRXBsU2RvVWRwdUFkZEluc3RhbmNlKHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCkKewoJdEVwbEtlcm5lbCBSZXQ7CgoJLy8gc2V0IGluc3RhbmNlIHZhcmlhYmxlcyB0byAwCglFUExfTUVNU0VUKCZTZG9VZHBJbnN0YW5jZV9nLCAweDAwLCBzaXplb2YoU2RvVWRwSW5zdGFuY2VfZykpOwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCS8vIHNhdmUgcG9pbnRlciB0byBjYWxsYmFjay1mdW5jdGlvbgoJaWYgKGZwUmVjZWl2ZUNiX3AgIT0gTlVMTCkgewoJCVNkb1VkcEluc3RhbmNlX2cubV9mcFNkb0FzeVNlcUNiID0gZnBSZWNlaXZlQ2JfcDsKCX0gZWxzZSB7CgkJUmV0ID0ga0VwbFNkb1VkcE1pc3NDYjsKCQlnb3RvIEV4aXQ7Cgl9CgoJaW5pdF9jb21wbGV0aW9uKCZTZG9VZHBJbnN0YW5jZV9nLm1fQ29tcGxldGlvblVkcFRocmVhZCk7CglTZG9VZHBJbnN0YW5jZV9nLm1faVRlcm1pbmF0ZVRocmVhZCA9IDA7CglTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID0gMDsKCVNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVDsKCglSZXQgPSBFcGxTZG9VZHB1Q29uZmlnKElOQUREUl9BTlksIDApOwoKICAgICAgRXhpdDoKCXJldHVybiBSZXQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1RGVsSW5zdGFuY2UKLy8KLy8gRGVzY3JpcHRpb246IGRlbCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCi8vICAgICAgICAgICAgICBkZWwgc29ja2V0IGFuZCBkZWwgTGlzdGVuLVRocmVhZAovLwovLwovLwovLyBQYXJhbWV0ZXJzOgovLwovLwovLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRXBsU2RvVWRwdURlbEluc3RhbmNlKHZvaWQpCnsKCXRFcGxLZXJuZWwgUmV0OwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlICE9IDApIHsJLy8gbGlzdGVuIHRocmVhZCB3YXMgc3RhcnRlZAoJCS8vIGNsb3NlIHRocmVhZAoJCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMTsKCQkvKiBraWxsX3Byb2MoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgU0lHVEVSTSwgMSApOyAqLwoJCXNlbmRfc2lnKFNJR1RFUk0sIFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIDEpOwoJCXdhaXRfZm9yX2NvbXBsZXRpb24oJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkKTsKCQlTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID0gMDsKCX0KCglpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCAhPSBJTlZBTElEX1NPQ0tFVCkgewoJCS8vIGNsb3NlIHNvY2tldAoJCWNsb3Nlc29ja2V0KFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQpOwoJCVNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVDsKCX0KCXJldHVybiBSZXQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1Q29uZmlnCi8vCi8vIERlc2NyaXB0aW9uOiByZWNvbmZpZ3VyYXRlIHNvY2tldCB3aXRoIG5ldyBJUC1BZGRyZXNzCi8vICAgICAgICAgICAgICAtPiBuZWVkZWQgZm9yIE5NVCBSZXNldENvbmZpZ3VyYXRpb24KLy8KLy8gUGFyYW1ldGVyczogIHVsSXBBZGRyX3AgICAgICA9IElwQWRkcmVzcyBpbiBwbGF0Zm9ybSBieXRlIG9yZGVyCi8vICAgICAgICAgICAgICB1aVBvcnRfcCAgICAgICAgPSBwb3J0IG51bWJlciBpbiBwbGF0Zm9ybSBieXRlIG9yZGVyCi8vCi8vCi8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQovLwovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFcGxTZG9VZHB1Q29uZmlnKHVuc2lnbmVkIGxvbmcgdWxJcEFkZHJfcCwgdW5zaWduZWQgaW50IHVpUG9ydF9wKQp7Cgl0RXBsS2VybmVsIFJldDsKCXN0cnVjdCBzb2NrYWRkcl9pbiBBZGRyOwoJaW50IGlFcnJvcjsKCglSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCglpZiAodWlQb3J0X3AgPT0gMCkgewkvLyBzZXQgVURQIHBvcnQgdG8gZGVmYXVsdCBwb3J0IG51bWJlcgoJCXVpUG9ydF9wID0gRVBMX0NfU0RPX0VQTF9QT1JUOwoJfSBlbHNlIGlmICh1aVBvcnRfcCA+IDY1NTM1KSB7CgkJUmV0ID0ga0VwbFNkb1VkcFNvY2tldEVycm9yOwoJCWdvdG8gRXhpdDsKCX0KCglpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSAhPSAwKSB7CS8vIGxpc3RlbiB0aHJlYWQgd2FzIHN0YXJ0ZWQKCgkJLy8gY2xvc2Ugb2xkIHRocmVhZAoJCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMTsKCQkvKiBraWxsX3Byb2MoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgU0lHVEVSTSwgMSApOyAqLwoJCXNlbmRfc2lnKFNJR1RFUk0sIFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIDEpOwoJCXdhaXRfZm9yX2NvbXBsZXRpb24oJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkKTsKCQlTZG9VZHBJbnN0YW5jZV9nLm1faVRlcm1pbmF0ZVRocmVhZCA9IDA7CgkJU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9IDA7Cgl9CgoJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgIT0gSU5WQUxJRF9TT0NLRVQpIHsKCQkvLyBjbG9zZSBzb2NrZXQKCQlpRXJyb3IgPSBjbG9zZXNvY2tldChTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0KTsKCQlTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7CgkJaWYgKGlFcnJvciAhPSAwKSB7CgkJCVJldCA9IGtFcGxTZG9VZHBTb2NrZXRFcnJvcjsKCQkJZ290byBFeGl0OwoJCX0KCX0KCS8vIGNyZWF0ZSBTb2NrZXQKCVNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOwoJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPT0gSU5WQUxJRF9TT0NLRVQpIHsKCQlSZXQgPSBrRXBsU2RvVWRwTm9Tb2NrZXQ7CgkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwKCJFcGxTZG9VZHB1Q29uZmlnOiBzb2NrZXQoKSBmYWlsZWRcbiIpOwoJCWdvdG8gRXhpdDsKCX0KCS8vIGJpbmQgc29ja2V0CglBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwoJQWRkci5zaW5fcG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydCl1aVBvcnRfcCk7CglBZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKHVsSXBBZGRyX3ApOwoJaUVycm9yID0KCSAgICBiaW5kKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmQWRkciwKCQkgc2l6ZW9mKEFkZHIpKTsKCWlmIChpRXJyb3IgPCAwKSB7CgkJLy9pRXJyb3IgPSBXU0FHZXRMYXN0RXJyb3IoKTsKCQlFUExfREJHTFZMX1NET19UUkFDRTEKCQkgICAgKCJFcGxTZG9VZHB1Q29uZmlnOiBiaW5kKCkgZmluaXNoZWQgd2l0aCAlaVxuIiwgaUVycm9yKTsKCQlSZXQgPSBrRXBsU2RvVWRwTm9Tb2NrZXQ7CgkJZ290byBFeGl0OwoJfQoJLy8gY3JlYXRlIExpc3Rlbi1UaHJlYWQKCVNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPQoJCWtlcm5lbF90aHJlYWQoRXBsU2RvVWRwVGhyZWFkLCAmU2RvVWRwSW5zdGFuY2VfZywKCQkJCUNMT05FX0ZTIHwgQ0xPTkVfRklMRVMpOwoJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPT0gMCkgewoJCVJldCA9IGtFcGxTZG9VZHBUaHJlYWRFcnJvcjsKCQlnb3RvIEV4aXQ7Cgl9CgogICAgICBFeGl0OgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1SW5pdENvbgovLwovLyBEZXNjcmlwdGlvbjogaW5pdCBhIG5ldyBjb25uZWN0Ci8vCi8vCi8vCi8vIFBhcmFtZXRlcnM6ICBwU2RvQ29uSGFuZGxlX3AgPSBwb2ludGVyIGZvciB0aGUgbmV3IGNvbm5lY3Rpb24gaGFuZGxlCi8vICAgICAgICAgICAgICB1aVRhcmdldE5vZGVJZF9wID0gTm9kZUlkIG9mIHRoZSB0YXJnZXQgbm9kZQovLwovLwovLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRXBsU2RvVWRwdUluaXRDb24odEVwbFNkb0NvbkhkbCAqcFNkb0NvbkhhbmRsZV9wLAoJCQkgICAgIHVuc2lnbmVkIGludCB1aVRhcmdldE5vZGVJZF9wKQp7Cgl0RXBsS2VybmVsIFJldDsKCXVuc2lnbmVkIGludCB1aUNvdW50OwoJdW5zaWduZWQgaW50IHVpRnJlZUNvbjsKCXRFcGxTZG9VZHBDb24gKnBTZG9VZHBDb247CgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgoJLy8gZ2V0IGZyZWUgZW50cnkgaW4gY29udHJvbCBzdHJ1Y3R1cmUKCXVpQ291bnQgPSAwOwoJdWlGcmVlQ29uID0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFA7CglwU2RvVWRwQ29uID0gJlNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblswXTsKCXdoaWxlICh1aUNvdW50IDwgRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKCQlpZiAoKHBTZG9VZHBDb24tPm1fdWxJcEFkZHIgJiBodG9ubCgweEZGKSkgPT0gaHRvbmwodWlUYXJnZXROb2RlSWRfcCkpIHsJLy8gZXhpc3RpbmcgY29ubmVjdGlvbiB0byB0YXJnZXQgbm9kZSBmb3VuZAoJCQkvLyBzZXQgaGFuZGxlCgkJCSpwU2RvQ29uSGFuZGxlX3AgPSAodWlDb3VudCB8IEVQTF9TRE9fVURQX0hBTkRMRSk7CgoJCQlnb3RvIEV4aXQ7CgkJfSBlbHNlIGlmICgocFNkb1VkcENvbi0+bV91bElwQWRkciA9PSAwKQoJCQkgICAmJiAocFNkb1VkcENvbi0+bV91aVBvcnQgPT0gMCkpIHsKCQkJdWlGcmVlQ29uID0gdWlDb3VudDsKCQl9CgkJdWlDb3VudCsrOwoJCXBTZG9VZHBDb24rKzsKCX0KCglpZiAodWlGcmVlQ29uID09IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CgkJLy8gZXJyb3Igbm8gZnJlZSBoYW5kbGUKCQlSZXQgPSBrRXBsU2RvVWRwTm9GcmVlSGFuZGxlOwoJfSBlbHNlIHsKCQlwU2RvVWRwQ29uID0KCQkgICAgJlNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUZyZWVDb25dOwoJCS8vIHNhdmUgaW5mb3MgZm9yIGNvbm5lY3Rpb24KCQlwU2RvVWRwQ29uLT5tX3VpUG9ydCA9IGh0b25zKEVQTF9DX1NET19FUExfUE9SVCk7CgkJcFNkb1VkcENvbi0+bV91bElwQWRkciA9IGh0b25sKDB4QzBBODY0MDAgfCB1aVRhcmdldE5vZGVJZF9wKTsJLy8gMTkyLjE2OC4xMDAudWlUYXJnZXROb2RlSWRfcAoKCQkvLyBzZXQgaGFuZGxlCgkJKnBTZG9Db25IYW5kbGVfcCA9ICh1aUZyZWVDb24gfCBFUExfU0RPX1VEUF9IQU5ETEUpOwoKCX0KCiAgICAgIEV4aXQ6CglyZXR1cm4gUmV0OwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVwbFNkb1VkcHVTZW5kRGF0YQovLwovLyBEZXNjcmlwdGlvbjogc2VuZCBkYXRhIHVzaW5nIGV4aXNpdGluZyBjb25uZWN0aW9uCi8vCi8vCi8vCi8vIFBhcmFtZXRlcnM6ICBTZG9Db25IYW5kbGVfcCAgPSBjb25uZWN0aW9uIGhhbmRsZQovLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gcG9pbnRlciB0byBkYXRhCi8vICAgICAgICAgICAgICBkd0RhdGFTaXplX3AgICAgPSBudW1iZXIgb2YgZGF0YWJ5dGUKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2l0aG91dCBhc2VuZC1oZWFkZXIhISEKLy8KLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCi8vCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVwbFNkb1VkcHVTZW5kRGF0YSh0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wLAoJCQkgICAgICB0RXBsRnJhbWUgKnBTcmNEYXRhX3AsIHUzMiBkd0RhdGFTaXplX3ApCnsKCXRFcGxLZXJuZWwgUmV0OwoJaW50IGlFcnJvcjsKCXVuc2lnbmVkIGludCB1aUFycmF5OwoJc3RydWN0IHNvY2thZGRyX2luIEFkZHI7CgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgoJdWlBcnJheSA9IChTZG9Db25IYW5kbGVfcCAmIH5FUExfU0RPX0FTWV9IQU5ETEVfTUFTSyk7CglpZiAodWlBcnJheSA+PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgewoJCVJldCA9IGtFcGxTZG9VZHBJbnZhbGlkSGRsOwoJCWdvdG8gRXhpdDsKCX0KCS8vc2V0IG1lc3NhZ2UgdHlwZQoJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYk1lc3NhZ2VUeXBlLCAweDA2KTsJLy8gU0RPCgkvLyB0YXJnZXQgbm9kZSBpZCAoZm9yIFVkcCA9IDApCglBbWlTZXRCeXRlVG9MZSgmcFNyY0RhdGFfcC0+bV9sZV9iRHN0Tm9kZUlkLCAweDAwKTsKCS8vIHNldCBzb3VyY2Utbm9kZWlkIChmb3IgVWRwID0gMCkKCUFtaVNldEJ5dGVUb0xlKCZwU3JjRGF0YV9wLT5tX2xlX2JTcmNOb2RlSWQsIDB4MDApOwoKCS8vIGNhbGMgc2l6ZQoJZHdEYXRhU2l6ZV9wICs9IEVQTF9BU05EX0hFQURFUl9TSVpFOwoKCS8vIGNhbGwgc2VuZHRvCglBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwoJQWRkci5zaW5fcG9ydCA9CgkgICAgKHVuc2lnbmVkIHNob3J0KVNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUFycmF5XS4KCSAgICBtX3VpUG9ydDsKCUFkZHIuc2luX2FkZHIuc19hZGRyID0KCSAgICBTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bdWlBcnJheV0ubV91bElwQWRkcjsKCglpRXJyb3IgPSBzZW5kdG8oU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCwJLy8gc29ja2V0aGFuZGxlCgkJCShjb25zdCBjaGFyICopJnBTcmNEYXRhX3AtPm1fbGVfYk1lc3NhZ2VUeXBlLAkvLyBkYXRhIHRvIHNlbmQKCQkJZHdEYXRhU2l6ZV9wLAkvLyBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZAoJCQkwLAkvLyBmbGFncwoJCQkoc3RydWN0IHNvY2thZGRyICopJkFkZHIsCS8vIHRhcmdldAoJCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CS8vIHNpemVvZiB0YXJnZXRhZHJlc3MKCWlmIChpRXJyb3IgPCAwKSB7CgkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UxCgkJICAgICgiRXBsU2RvVWRwdVNlbmREYXRhOiBzZW5kdG8oKSBmaW5pc2hlZCB3aXRoICVpXG4iLCBpRXJyb3IpOwoJCVJldCA9IGtFcGxTZG9VZHBTZW5kRXJyb3I7CgkJZ290byBFeGl0OwoJfQoKICAgICAgRXhpdDoKCXJldHVybiBSZXQ7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdURlbENvbgovLwovLyBEZXNjcmlwdGlvbjogZGVsZXRlIGNvbm5lY3Rpb24gZnJvbSBpbnRlcm4gc3RydWN0dXJlCi8vCi8vCi8vCi8vIFBhcmFtZXRlcnM6ICBTZG9Db25IYW5kbGVfcCAgPSBjb25uZWN0aW9uIGhhbmRsZQovLwovLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRXBsU2RvVWRwdURlbENvbih0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wKQp7Cgl0RXBsS2VybmVsIFJldDsKCXVuc2lnbmVkIGludCB1aUFycmF5OwoKCXVpQXJyYXkgPSAoU2RvQ29uSGFuZGxlX3AgJiB+RVBMX1NET19BU1lfSEFORExFX01BU0spOwoKCWlmICh1aUFycmF5ID49IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CgkJUmV0ID0ga0VwbFNkb1VkcEludmFsaWRIZGw7CgkJZ290byBFeGl0OwoJfSBlbHNlIHsKCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCX0KCgkvLyBkZWxldGUgY29ubmVjdGlvbgoJU2RvVWRwSW5zdGFuY2VfZy5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW3VpQXJyYXldLm1fdWxJcEFkZHIgPSAwOwoJU2RvVWRwSW5zdGFuY2VfZy5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW3VpQXJyYXldLm1fdWlQb3J0ID0gMDsKCiAgICAgIEV4aXQ6CglyZXR1cm4gUmV0Owp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9VZHBUaHJlYWQKLy8KLy8gRGVzY3JpcHRpb246ICAgICB0aHJlYWQgY2hlY2sgc29ja2V0IGZvciBuZXcgZGF0YQovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgICAgIGxwUGFyYW1ldGVyID0gcG9pbnRlciB0byBwYXJhbWV0ZXIgdHlwZSB0RXBsU2RvVWRwVGhyZWFkUGFyYQovLwovLwovLyBSZXR1cm5zOiAgICAgICAgIHUzMiAgID0gICBlcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyBpbnQgRXBsU2RvVWRwVGhyZWFkKHZvaWQgKnBBcmdfcCkKewoKCXRFcGxTZG9VZHBJbnN0YW5jZSAqcEluc3RhbmNlOwoJc3RydWN0IHNvY2thZGRyX2luIFJlbW90ZUFkZHI7CglpbnQgaUVycm9yOwoJaW50IGlDb3VudDsKCWludCBpRnJlZUVudHJ5OwoJdTggYWJCdWZmZXJbRVBMX01BWF9TRE9fUkVDX0ZSQU1FX1NJWkVdOwoJdW5zaWduZWQgaW50IHVpU2l6ZTsKCXRFcGxTZG9Db25IZGwgU2RvQ29uSGRsOwoKCXBJbnN0YW5jZSA9ICh0RXBsU2RvVWRwSW5zdGFuY2UgKikgcEFyZ19wOwoJZGFlbW9uaXplKCJFcGxTZG9VZHBUaHJlYWQiKTsKCWFsbG93X3NpZ25hbChTSUdURVJNKTsKCglmb3IgKDsgcEluc3RhbmNlLT5tX2lUZXJtaW5hdGVUaHJlYWQgPT0gMDspCgoJewoJCS8vIHdhaXQgZm9yIGRhdGEKCQl1aVNpemUgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKTsKCQlpRXJyb3IgPSByZWN2ZnJvbShwSW5zdGFuY2UtPm1fVWRwU29ja2V0LAkvLyBTb2NrZXQKCQkJCSAgKGNoYXIgKikmYWJCdWZmZXJbMF0sCS8vIGJ1ZmZlciBmb3IgZGF0YQoJCQkJICBzaXplb2YoYWJCdWZmZXIpLAkvLyBzaXplIG9mIHRoZSBidWZmZXIKCQkJCSAgMCwJLy8gZmxhZ3MKCQkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSZSZW1vdGVBZGRyLAoJCQkJICAoaW50ICopJnVpU2l6ZSk7CgkJaWYgKGlFcnJvciA9PSAtRVJFU1RBUlRTWVMpIHsKCQkJYnJlYWs7CgkJfQoJCWlmIChpRXJyb3IgPiAwKSB7CgkJCS8vIGdldCBoYW5kbGUgZm9yIGhpZ2hlciBsYXllcgoJCQlpQ291bnQgPSAwOwoJCQlpRnJlZUVudHJ5ID0gMHhGRkZGOwoJCQl3aGlsZSAoaUNvdW50IDwgRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKCQkJCS8vIGNoZWNrIGlmIHRoaXMgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGtub3duCgkJCQlpZiAoKHBJbnN0YW5jZS0+bV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpQ291bnRdLgoJCQkJICAgICBtX3VsSXBBZGRyID09IFJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKQoJCQkJICAgICYmIChwSW5zdGFuY2UtPgoJCQkJCW1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUNvdW50XS4KCQkJCQltX3VpUG9ydCA9PSBSZW1vdGVBZGRyLnNpbl9wb3J0KSkgewoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICgocEluc3RhbmNlLT5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lDb3VudF0uCgkJCQkgICAgIG1fdWxJcEFkZHIgPT0gMCkKCQkJCSAgICAmJiAocEluc3RhbmNlLT4KCQkJCQltX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lDb3VudF0uCgkJCQkJbV91aVBvcnQgPT0gMCkKCQkJCSAgICAmJiAoaUZyZWVFbnRyeSA9PSAweEZGRkYpKQoJCQkJewoJCQkJCWlGcmVlRW50cnkgPSBpQ291bnQ7CgkJCQl9CgoJCQkJaUNvdW50Kys7CgkJCX0KCgkJCWlmIChpQ291bnQgPT0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKCQkJCS8vIGNvbm5lY3Rpb24gdW5rbm93bgoJCQkJLy8gc2VlIGlmIHRoZXJlIGlzIGEgZnJlZSBoYW5kbGUKCQkJCWlmIChpRnJlZUVudHJ5ICE9IDB4RkZGRikgewoJCQkJCS8vIHNhdmUgYWRyZXNzIGluZm9zCgkJCQkJcEluc3RhbmNlLT4KCQkJCQkgICAgbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpRnJlZUVudHJ5XS4KCQkJCQkgICAgbV91bElwQWRkciA9CgkJCQkJICAgIFJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyOwoJCQkJCXBJbnN0YW5jZS0+CgkJCQkJICAgIG1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUZyZWVFbnRyeV0uCgkJCQkJICAgIG1fdWlQb3J0ID0gUmVtb3RlQWRkci5zaW5fcG9ydDsKCQkJCQkvLyBjYWxsIGNhbGxiYWNrCgkJCQkJU2RvQ29uSGRsID0gaUZyZWVFbnRyeTsKCQkJCQlTZG9Db25IZGwgfD0gRVBMX1NET19VRFBfSEFORExFOwoJCQkJCS8vIG9mZnNldCA0IC0+IHN0YXJ0IG9mIFNETyBTZXF1ZW5jZSBoZWFkZXIKCQkJCQlwSW5zdGFuY2UtPm1fZnBTZG9Bc3lTZXFDYihTZG9Db25IZGwsCgkJCQkJCQkJICAgKHRFcGxBc3lTZG9TZXEKCQkJCQkJCQkgICAgKikgJgoJCQkJCQkJCSAgIGFiQnVmZmVyWzRdLAoJCQkJCQkJCSAgIChpRXJyb3IgLQoJCQkJCQkJCSAgICA0KSk7CgkJCQl9IGVsc2UgewoJCQkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMAoJCQkJCSAgICAoIkVycm9yIGluIEVwbFNkb1VkcFRocmVhZCgpIG5vIGZyZWUgaGFuZGxlXG4iKTsKCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQkvLyBrbm93biBjb25uZWN0aW9uCgkJCQkvLyBjYWxsIGNhbGxiYWNrIHdpdGggY29ycmVjdCBoYW5kbGUKCQkJCVNkb0NvbkhkbCA9IGlDb3VudDsKCQkJCVNkb0NvbkhkbCB8PSBFUExfU0RPX1VEUF9IQU5ETEU7CgkJCQkvLyBvZmZzZXQgNCAtPiBzdGFydCBvZiBTRE8gU2VxdWVuY2UgaGVhZGVyCgkJCQlwSW5zdGFuY2UtPm1fZnBTZG9Bc3lTZXFDYihTZG9Db25IZGwsCgkJCQkJCQkgICAodEVwbEFzeVNkb1NlcSAqKSAmCgkJCQkJCQkgICBhYkJ1ZmZlcls0XSwKCQkJCQkJCSAgIChpRXJyb3IgLSA0KSk7CgkJCX0KCQl9CQkvLyBlbmQgb2YgIGlmKGlFcnJvciE9U09DS0VUX0VSUk9SKQoJfQkJCS8vIGVuZCBvZiBmb3IoOzspCgoJY29tcGxldGVfYW5kX2V4aXQoJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkLCAwKTsKCXJldHVybiAwOwp9CgojZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCgovLyBFT0YK