LyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQogICAwMjExMS0xMzA3IFVTQS4gICovCgojaWZuZGVmIF9NQ0hFQ0tfSAojZGVmaW5lIF9NQ0hFQ0tfSAkxCgojaW5jbHVkZSA8ZmVhdHVyZXMuaD4KCl9fQkVHSU5fREVDTFMKCi8qIFJldHVybiB2YWx1ZXMgZm9yIGBtcHJvYmUnOiB0aGVzZSBhcmUgdGhlIGtpbmRzIG9mIGluY29uc2lzdGVuY2llcyB0aGF0CiAgIGBtY2hlY2snIGVuYWJsZXMgZGV0ZWN0aW9uIG9mLiAgKi8KZW51bSBtY2hlY2tfc3RhdHVzCiAgewogICAgTUNIRUNLX0RJU0FCTEVEID0gLTEsICAgICAgIC8qIENvbnNpc3RlbmN5IGNoZWNraW5nIGlzIG5vdCB0dXJuZWQgb24uICAqLwogICAgTUNIRUNLX09LLCAgICAgICAgICAgICAgICAgIC8qIEJsb2NrIGlzIGZpbmUuICAqLwogICAgTUNIRUNLX0ZSRUUsICAgICAgICAgICAgICAgIC8qIEJsb2NrIGZyZWVkIHR3aWNlLiAgKi8KICAgIE1DSEVDS19IRUFELCAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYmVmb3JlIHRoZSBibG9jayB3YXMgY2xvYmJlcmVkLiAgKi8KICAgIE1DSEVDS19UQUlMICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWZ0ZXIgdGhlIGJsb2NrIHdhcyBjbG9iYmVyZWQuICAqLwogIH07CgoKLyogQWN0aXZhdGUgYSBzdGFuZGFyZCBjb2xsZWN0aW9uIG9mIGRlYnVnZ2luZyBob29rcy4gIFRoaXMgbXVzdCBiZSBjYWxsZWQKICAgYmVmb3JlIGBtYWxsb2MnIGlzIGV2ZXIgY2FsbGVkLiAgQUJPUlRGVU5DIGlzIGNhbGxlZCB3aXRoIGFuIGVycm9yIGNvZGUKICAgKHNlZSBlbnVtIGFib3ZlKSB3aGVuIGFuIGluY29uc2lzdGVuY3kgaXMgZGV0ZWN0ZWQuICBJZiBBQk9SVEZVTkMgaXMKICAgbnVsbCwgdGhlIHN0YW5kYXJkIGZ1bmN0aW9uIHByaW50cyBvbiBzdGRlcnIgYW5kIHRoZW4gY2FsbHMgYGFib3J0Jy4gICovCmV4dGVybiBpbnQgbWNoZWNrICh2b2lkICgqX19hYm9ydGZ1bmMpIChlbnVtIG1jaGVja19zdGF0dXMpKSBfX1RIUk9XOwoKLyogU2ltaWxhciB0byBgbWNoZWNrtCBidXQgcGVyZm9ybXMgY2hlY2tzIGZvciBhbGwgYmxvY2sgd2hlbmV2ZXIgb25lIG9mCiAgIHRoZSBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zIGlzIGNhbGxlZC4gIFRoaXMgY2FuIGJlIHZlcnkgc2xvdy4gICovCmV4dGVybiBpbnQgbWNoZWNrX3BlZGFudGljICh2b2lkICgqX19hYm9ydGZ1bmMpIChlbnVtIG1jaGVja19zdGF0dXMpKSBfX1RIUk9XOwoKLyogRm9yY2UgY2hlY2sgb2YgYWxsIGJsb2NrcyBub3cuICAqLwpleHRlcm4gdm9pZCBtY2hlY2tfY2hlY2tfYWxsICh2b2lkKTsKCi8qIENoZWNrIGZvciBhYmVycmF0aW9ucyBpbiBhIHBhcnRpY3VsYXIgbWFsbG9jJ2QgYmxvY2suICBZb3UgbXVzdCBoYXZlCiAgIGNhbGxlZCBgbWNoZWNrJyBhbHJlYWR5LiAgVGhlc2UgYXJlIHRoZSBzYW1lIGNoZWNrcyB0aGF0IGBtY2hlY2snIGRvZXMKICAgd2hlbiB5b3UgZnJlZSBvciByZWFsbG9jYXRlIGEgYmxvY2suICAqLwpleHRlcm4gZW51bSBtY2hlY2tfc3RhdHVzIG1wcm9iZSAodm9pZCAqX19wdHIpIF9fVEhST1c7CgovKiBBY3RpdmF0ZSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gb2YgdHJhY2luZyBob29rcy4gICovCmV4dGVybiB2b2lkIG10cmFjZSAodm9pZCkgX19USFJPVzsKZXh0ZXJuIHZvaWQgbXVudHJhY2UgKHZvaWQpIF9fVEhST1c7CgpfX0VORF9ERUNMUwoKI2VuZGlmIC8qIG1jaGVjay5oICovCg==