Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBUb25lIG1hcHBpbmcgb3BlcmF0b3JzCi8vCi8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMwovLwovLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECi8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAovLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCi8vIFRISVMgRElTQ0xBSU1FUi4KLy8KLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKI2luY2x1ZGUgIlV0aWxpdGllcy5oIgoKLyoqClBlcmZvcm1zIGEgdG9uZSBtYXBwaW5nIG9uIGEgNDgtYml0IFJHQiBvciBhIDk2LWJpdCBSR0JGIGltYWdlIGFuZCByZXR1cm5zIGEgMjQtYml0IGltYWdlLiAKVGhlIG1lYW5pbmcgb2YgdGhlIHBhcmFtZXRlcnMgZGVwZW5kcyBvbiB0aGUgY2hvb3NlbiBhbGdvcml0aG0uIApXaGVuIGJvdGggcGFyYW1ldGVycyBhcmUgc2V0IHRvIHplcm8sIGEgZGVmYXVsdCBzZXQgb2YgcGFyYW1ldGVycyBpcyB1c2VkLiAKQHBhcmFtIGRpYiBJbnB1dCBSR0IvUkdCRiBpbWFnZQpAcGFyYW0gdG1vIFRvbmUgbWFwcGluZyBvcGVyYXRvcgpAcGFyYW0gZmlyc3RfcGFyYW0gRmlyc3QgcGFyYW1ldGVyIG9mIHRoZSBhbGdvcml0aG0KQHBhcmFtIHNlY29uZF9wYXJhbSBTZWNvbmQgcGFyYW1ldGVyIG9mIHRoZSBhbGdvcml0aG0KcmV0dXJuIFJldHVybnMgYSAyNC1iaXQgdG9uZSBtYXBwZWQgaW1hZ2UgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQoqLyAKRklCSVRNQVAgKiBETExfQ0FMTENPTlYKRnJlZUltYWdlX1RvbmVNYXBwaW5nKEZJQklUTUFQICpkaWIsIEZSRUVfSU1BR0VfVE1PIHRtbywgZG91YmxlIGZpcnN0X3BhcmFtLCBkb3VibGUgc2Vjb25kX3BhcmFtKSB7CglpZihGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikpIHsKCQlzd2l0Y2godG1vKSB7CgkJCS8vIEFkYXB0aXZlIGxvZ2FyaXRobWljIG1hcHBpbmcgKEYuIERyYWdvLCAyMDAzKQoJCQljYXNlIEZJVE1PX0RSQUdPMDM6CgkJCQlpZigoZmlyc3RfcGFyYW0gPT0gMCkgJiYgKHNlY29uZF9wYXJhbSA9PSAwKSkgewoJCQkJCS8vIHVzZSBkZWZhdWx0IHZhbHVlcyAoZ2FtbWEgPSAyLjIsIGV4cG9zdXJlID0gMCkKCQkJCQlyZXR1cm4gRnJlZUltYWdlX1Rtb0RyYWdvMDMoZGliLCAyLjIsIDApOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyB1c2UgdXNlcidzIHZhbHVlCgkJCQkJcmV0dXJuIEZyZWVJbWFnZV9UbW9EcmFnbzAzKGRpYiwgZmlyc3RfcGFyYW0sIHNlY29uZF9wYXJhbSk7CgkJCQl9CgkJCQlicmVhazsKCQkJLy8gRHluYW1pYyByYW5nZSByZWR1Y3Rpb24gaW5zcGlyZWQgYnkgcGhvdG9yZWNlcHRvciBwaGh5c2lvbG9neSAoRS4gUmVpbmhhcmQsIDIwMDUpCgkJCWNhc2UgRklUTU9fUkVJTkhBUkQwNToKCQkJCWlmKChmaXJzdF9wYXJhbSA9PSAwKSAmJiAoc2Vjb25kX3BhcmFtID09IDApKSB7CgkJCQkJLy8gdXNlIGRlZmF1bHQgdmFsdWVzIGJ5IHNldHRpbmcgaW50ZW5zaXR5IHRvIDAgYW5kIGNvbnRyYXN0IHRvIDAKCQkJCQlyZXR1cm4gRnJlZUltYWdlX1Rtb1JlaW5oYXJkMDUoZGliLCAwLCAwKTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gdXNlIHVzZXIncyB2YWx1ZQoJCQkJCXJldHVybiBGcmVlSW1hZ2VfVG1vUmVpbmhhcmQwNShkaWIsIGZpcnN0X3BhcmFtLCBzZWNvbmRfcGFyYW0pOwoJCQkJfQoJCQkJYnJlYWs7CgkJCS8vIEdyYWRpZW50IERvbWFpbiBIRFIgQ29tcHJlc3Npb24gKFIuIEZhdHRhbCwgMjAwMikKCQkJY2FzZSBGSVRNT19GQVRUQUwwMjoKCQkJCWlmKChmaXJzdF9wYXJhbSA9PSAwKSAmJiAoc2Vjb25kX3BhcmFtID09IDApKSB7CgkJCQkJLy8gdXNlIGRlZmF1bHQgdmFsdWVzIGJ5IHNldHRpbmcgY29sb3Igc2F0dXJhdGlvbiB0byAwLjUgYW5kIGF0dGVudWF0aW9uIHRvIDAuODUKCQkJCQlyZXR1cm4gRnJlZUltYWdlX1Rtb0ZhdHRhbDAyKGRpYiwgMC41LCAwLjg1KTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gdXNlIHVzZXIncyB2YWx1ZQoJCQkJCXJldHVybiBGcmVlSW1hZ2VfVG1vRmF0dGFsMDIoZGliLCBmaXJzdF9wYXJhbSwgc2Vjb25kX3BhcmFtKTsKCQkJCX0KCQkJCWJyZWFrOwoJCX0KCX0KCglyZXR1cm4gTlVMTDsKfQoKCg==