LyogQm9vc3QgaW50ZXJ2YWwvY29tcGFyZS9leHBsaWNpdC5ocHAgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24gZmlsZQogKgogKiBDb3B5cmlnaHQgMjAwMCBKZW5zIE1hdXJlcgogKiBDb3B5cmlnaHQgMjAwMiBIZXJ26SBCcvZubmltYW5uLCBHdWlsbGF1bWUgTWVscXVpb25kLCBTeWx2YWluIFBpb24KICoKICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgogKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgogKiBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKICovCgojaWZuZGVmIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfQ09NUEFSRV9FWFBMSUNJVF9IUFAKI2RlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0NPTVBBUkVfRVhQTElDSVRfSFBQCgojaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9pbnRlcnZhbC9kZXRhaWwvaW50ZXJ2YWxfcHJvdG90eXBlLmhwcD4KCm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSBudW1lcmljIHsKbmFtZXNwYWNlIGludGVydmFsX2xpYiB7CgovKgogKiBDZXJ0YWlubHkuLi4gb3BlcmF0aW9ucwogKi8KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzMSwgY2xhc3MgUG9saWNpZXMyPiBpbmxpbmUKYm9vbCBjZXJsdChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczE+JiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQp7CiAgcmV0dXJuIHgudXBwZXIoKSA8IHkubG93ZXIoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIGNlcmx0KGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCwgY29uc3QgVCYgeSkKewogIHJldHVybiB4LnVwcGVyKCkgPCB5Owp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgY2VybHQoY29uc3QgVCYgeCwgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB5KQp7CiAgcmV0dXJuIHggPCB5Lmxvd2VyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzMSwgY2xhc3MgUG9saWNpZXMyPiBpbmxpbmUKYm9vbCBjZXJsZShjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczE+JiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQp7CiAgcmV0dXJuIHgudXBwZXIoKSA8PSB5Lmxvd2VyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBjZXJsZShjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgsIGNvbnN0IFQmIHkpCnsKICByZXR1cm4geC51cHBlcigpIDw9IHk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBjZXJsZShjb25zdCBUJiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHkpCnsKICByZXR1cm4geCA8PSB5Lmxvd2VyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzMSwgY2xhc3MgUG9saWNpZXMyPiBpbmxpbmUKYm9vbCBjZXJndChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczE+JiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQp7CiAgcmV0dXJuIHgubG93ZXIoKSA+IHkudXBwZXIoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIGNlcmd0KGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCwgY29uc3QgVCYgeSkKewogIHJldHVybiB4Lmxvd2VyKCkgPiB5Owp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgY2VyZ3QoY29uc3QgVCYgeCwgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB5KQp7CiAgcmV0dXJuIHggPiB5LnVwcGVyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzMSwgY2xhc3MgUG9saWNpZXMyPiBpbmxpbmUKYm9vbCBjZXJnZShjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczE+JiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQp7CiAgcmV0dXJuIHgubG93ZXIoKSA+PSB5LnVwcGVyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBjZXJnZShjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgsIGNvbnN0IFQmIHkpCnsKICByZXR1cm4geC5sb3dlcigpID49IHk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBjZXJnZShjb25zdCBUJiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHkpCnsKICByZXR1cm4geCA+PSB5LnVwcGVyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzMSwgY2xhc3MgUG9saWNpZXMyPiBpbmxpbmUKYm9vbCBjZXJlcShjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczE+JiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQp7CiAgcmV0dXJuIHgubG93ZXIoKSA9PSB5LnVwcGVyKCkgJiYgeS5sb3dlcigpID09IHgudXBwZXIoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIGNlcmVxKGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCwgY29uc3QgVCYgeSkKewogIHJldHVybiB4Lmxvd2VyKCkgPT0geSAmJiB4LnVwcGVyKCkgPT0geTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIGNlcmVxKGNvbnN0IFQmIHgsIGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeSkKewogIHJldHVybiB4ID09IHkubG93ZXIoKSAmJiB4ID09IHkudXBwZXIoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXMxLCBjbGFzcyBQb2xpY2llczI+IGlubGluZQpib29sIGNlcm5lKGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzMT4mIHgsIGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzMj4mIHkpCnsKICByZXR1cm4geC51cHBlcigpIDwgeS5sb3dlcigpIHx8IHkudXBwZXIoKSA8IHgubG93ZXIoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIGNlcm5lKGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCwgY29uc3QgVCYgeSkKewogIHJldHVybiB4LnVwcGVyKCkgPCB5IHx8IHkgPCB4Lmxvd2VyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBjZXJuZShjb25zdCBUJiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHkpCnsKICByZXR1cm4geCA8IHkubG93ZXIoKSB8fCB5LnVwcGVyKCkgPCB4Owp9CgovKgogKiBQb3NzaWJseS4uLiBjb21wYXJpc29ucwogKi8KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzMSwgY2xhc3MgUG9saWNpZXMyPiBpbmxpbmUKYm9vbCBwb3NsdChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczE+JiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQp7CiAgcmV0dXJuIHgubG93ZXIoKSA8IHkudXBwZXIoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIHBvc2x0KGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCwgY29uc3QgVCYgeSkKewogIHJldHVybiB4Lmxvd2VyKCkgPCB5Owp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgcG9zbHQoY29uc3QgVCYgeCwgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB5KQp7CiAgcmV0dXJuIHggPCB5LnVwcGVyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzMSwgY2xhc3MgUG9saWNpZXMyPiBpbmxpbmUKYm9vbCBwb3NsZShjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczE+JiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQp7CiAgcmV0dXJuIHgubG93ZXIoKSA8PSB5LnVwcGVyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBwb3NsZShjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgsIGNvbnN0IFQmIHkpCnsKICByZXR1cm4geC5sb3dlcigpIDw9IHk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBwb3NsZShjb25zdCBUJiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHkpCnsKICByZXR1cm4geCA8PSB5LnVwcGVyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzMSwgY2xhc3MgUG9saWNpZXMyPiBpbmxpbmUKYm9vbCBwb3NndChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczE+JiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQp7CiAgcmV0dXJuIHgudXBwZXIoKSA+IHkubG93ZXIoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIHBvc2d0KGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCwgY29uc3QgVCYgeSkKewogIHJldHVybiB4LnVwcGVyKCkgPiB5Owp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgcG9zZ3QoY29uc3QgVCYgeCwgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+ICYgeSkKewogIHJldHVybiB4ID4geS5sb3dlcigpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llczEsIGNsYXNzIFBvbGljaWVzMj4gaW5saW5lCmJvb2wgcG9zZ2UoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXMxPiYgeCwgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXMyPiYgeSkKewogIHJldHVybiB4LnVwcGVyKCkgPj0geS5sb3dlcigpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgcG9zZ2UoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4LCBjb25zdCBUJiB5KQp7CiAgcmV0dXJuIHgudXBwZXIoKSA+PSB5Owp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgcG9zZ2UoY29uc3QgVCYgeCwgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB5KQp7CiAgcmV0dXJuIHggPj0geS5sb3dlcigpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llczEsIGNsYXNzIFBvbGljaWVzMj4gaW5saW5lCmJvb2wgcG9zZXEoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXMxPiYgeCwgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXMyPiYgeSkKewogIHJldHVybiB4LnVwcGVyKCkgPj0geS5sb3dlcigpICYmIHkudXBwZXIoKSA+PSB4Lmxvd2VyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBwb3NlcShjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgsIGNvbnN0IFQmIHkpCnsKICByZXR1cm4geC51cHBlcigpID49IHkgJiYgeSA+PSB4Lmxvd2VyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBwb3NlcShjb25zdCBUJiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHkpCnsKICByZXR1cm4geCA+PSB5Lmxvd2VyKCkgJiYgeS51cHBlcigpID49IHg7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzMSwgY2xhc3MgUG9saWNpZXMyPiBpbmxpbmUKYm9vbCBwb3NuZShjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczE+JiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQp7CiAgcmV0dXJuIHgudXBwZXIoKSAhPSB5Lmxvd2VyKCkgfHwgeS51cHBlcigpICE9IHgubG93ZXIoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIHBvc25lKGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCwgY29uc3QgVCYgeSkKewogIHJldHVybiB4LnVwcGVyKCkgIT0geSB8fCB5ICE9IHgubG93ZXIoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIHBvc25lKGNvbnN0IFQmIHgsIGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeSkKewogIHJldHVybiB4ICE9IHkubG93ZXIoKSB8fCB5LnVwcGVyKCkgIT0geDsKfQoKfSAvLyBuYW1lc3BhY2UgaW50ZXJ2YWxfbGliCn0gLy8gbmFtZXNwYWNlIG51bWVyaWMKfSAvL25hbWVzcGFjZSBib29zdAoKI2VuZGlmIC8vIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfQ09NUEFSRV9FWFBMSUNJVF9IUFAK