LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoqIENvcHlyaWdodCCpIHsxOTk3LTE5OTl9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBGaWxlIFdEQktUQkwuSAoqCiogV29yZEJyZWFrVGFibGUgaW1wbGVtZW50cyBhIHN0YXRlIHRyYW5zaXRpb24gdGFibGUuCioKKiBAcGFja2FnZSAgVGV4dCBhbmQgSW50ZXJuYXRpb25hbAoqIEBjYXRlZ29yeSBUZXh0IFNjYW5uaW5nCioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDAyLzE4Lzk3ICAgIGFsaXUgICAgICAgIENvbnZlcnRlZCBmcm9tIE9wZW5DbGFzcy4gIE1hZGUgc3RhdGljcyBjb25zdC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgV0RCS1RCTF9ICiNkZWZpbmUgV0RCS1RCTF9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKI2luY2x1ZGUgInR4dGJkYXQuaCIKCi8qKgogKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzdGF0ZSB0cmFuc2l0aW9uIHRhYmxlLgogKiBBZnRlciBlYWNoIHRyYW5zaXRpb24sIHVzaW5nIHRoZSBnZXQgbWV0aG9kLCB0aGUKICogbmV3IHN0YXRlIGlzIHJldHVybmVkIGFsb25nIHdpdGggaW5mb3JtYXRpb24gYWJvdXQKICogdGhlIHN0YXRlIGNoYW5nZSAoZXguIHdhcyBpdCBhICJtYXJrZWQiIHRyYW5zaXRpb24iKS4KICogRm9yIGVmZmljaWVuY3ksIG5vbmUgb2YgdGhlIGFyZ3VtZW50cyB0byBhbnkgb2YgdGhlc2UKICogbWV0aG9kcyBhcmUgdmFsaWRhdGVkLgogKi8KY2xhc3MgV29yZEJyZWFrVGFibGUgewpwdWJsaWM6CiAgICAvLyBGb3IgY29udmVuaWVuY2UKICAgIHR5cGVkZWYgVGV4dEJvdW5kYXJ5RGF0YTo6Tm9kZSBOb2RlOwogICAgdHlwZWRlZiBUZXh0Qm91bmRhcnlEYXRhOjpUeXBlIFR5cGU7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3QgYSB0YWJsZSBmcm9tIHRoZSBwcm92aWRlZCBkYXRhLiAgU2VlIENoYXJhY3RlckJyZWFrRGF0YSBvcgogICAgICogdGhlIG90aGVyIFRleHRCb3VuZGFyeURhdGEgc3ViY2xhc3NlcyBmb3IgZXhhbXBsZXMuICBFYWNoIHJvdyByZXByZXNlbnRzCiAgICAgKiBhIHN0YXRlLCBlYWNoIGNvbHVtbiB3aXRoaW4gYSByb3cgcmVwcmVzZW50cyBhIHRyYW5zaXRpb24uICBUaGUgdmFsdWVzCiAgICAgKiBpbiB0aGUgdGFibGUgcmVwcmVzZW50IHRoZSBuZXcgc3RhdGUgYW5kIG1hcmsgaW5mb3JtYXRpb24uCiAgICAgKiBAcGFyYW0gY29scyBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUgKHRyYW5zaXRpb25zKQogICAgICogQHBhcmFtIGRhdGEgYW4gZW5jb2RlZCBieXRlIGFycmF5IGNvbnRhaW5pbmcgc3RhdGUgYW5kIHRyYW5zaXRpb24gZGF0YQogICAgICogQHBhcmFtIGRhdGFfbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIGJ5dGUgYXJyYXkgZGF0YQogICAgICovCiAgICBXb3JkQnJlYWtUYWJsZShpbnQzMl90IGNvbHMsIGNvbnN0IE5vZGUgZGF0YVtdLCBpbnQzMl90IGRhdGFfbGVuZ3RoKTsKCiAgICAvKioKICAgICAqIEdldCB0aGUgcmVzdWx0aW5nIHN0YXRlIG1vdmluZyBmcm9tIG9sZFN0YXRlIGFjY2VwdGluZyBpbnB1dC4KICAgICAqIEBwYXJhbSBvbGRTdGF0ZSBjdXJyZW50IHN0YXRlCiAgICAgKiBAcGFyYW0gaW5wdXQgaW5wdXQKICAgICAqIEByZXR1cm4gcmVzdWx0aW5nIHN0YXRlIGFuZCB0cmFuc2l0aW9uIGRhdGEKICAgICAqLwogICAgTm9kZSBnZXQoTm9kZSBvbGRTdGF0ZSwgVHlwZSBpbnB1dCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSB0cmFuc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZCBzdGF0ZSB3YXMgIm1hcmtlZC4iCiAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIHN0YXRlIGFzIHJldHVybmVkIGJ5IGdldCwgaW5pdGlhbFN0YXRlLCBvciBlbmRTdGF0ZQogICAgICogQHJldHVybiB0cnVlIGlmIHRyYW5zaXRpb24gaW50byBzdGF0ZSB3YXMgbWFya2VkLgogICAgICovCiAgICBib29sX3QgaXNNYXJrU3RhdGUoTm9kZSBzdGF0ZSkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHN0YXRlIGlzIHRoZSBlbmQgc3RhdGUKICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgc3RhdGUgdG8gY2hlY2sKICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdGF0ZSBpcyBhbiBlbmQgc3RhdGUKICAgICAqLwogICAgYm9vbF90IGlzRW5kU3RhdGUoTm9kZSBzdGF0ZSkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGluaXRpYWwgc3RhdGUKICAgICAqIEByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUKICAgICAqLwogICAgTm9kZSBpbml0aWFsU3RhdGUodm9pZCkgY29uc3Q7Cgpwcml2YXRlOgogICAgc3RhdGljIGNvbnN0IE5vZGUgIGtNYXJrX21hc2s7CiAgICBzdGF0aWMgY29uc3QgTm9kZSAga0luZGV4X21hc2s7CgogICAgc3RhdGljIGNvbnN0IE5vZGUgICBrSW5pdGlhbF9zdGF0ZTsKICAgIHN0YXRpYyBjb25zdCBOb2RlICAga0VuZF9zdGF0ZTsKCiAgICBjb25zdCBUZXh0Qm91bmRhcnlEYXRhOjpOb2RlKiBmRGF0YTsKICAgIGludDMyX3QgZkRhdGFfbGVuZ3RoOwogICAgaW50MzJfdCBmQ29sczsKfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlubGluZSBXb3JkQnJlYWtUYWJsZTo6Tm9kZQpXb3JkQnJlYWtUYWJsZTo6Z2V0KFdvcmRCcmVha1RhYmxlOjpOb2RlIG9sZFN0YXRlLCBXb3JkQnJlYWtUYWJsZTo6VHlwZSBpbnB1dCkgY29uc3QKewogICAgcmV0dXJuIGZEYXRhWyhvbGRTdGF0ZSAmIGtJbmRleF9tYXNrKSAqIGZDb2xzICsgaW5wdXRdOwp9CgppbmxpbmUgYm9vbF90CldvcmRCcmVha1RhYmxlOjppc01hcmtTdGF0ZShXb3JkQnJlYWtUYWJsZTo6Tm9kZSBzdGF0ZSkgY29uc3QKewogICAgcmV0dXJuIChzdGF0ZSAmIGtNYXJrX21hc2spICE9IDA7Cn0KCmlubGluZSBib29sX3QKV29yZEJyZWFrVGFibGU6OmlzRW5kU3RhdGUoV29yZEJyZWFrVGFibGU6Ok5vZGUgc3RhdGUpIGNvbnN0CnsKICAgIHJldHVybiAoc3RhdGUgJiBrSW5kZXhfbWFzaykgPT0ga0VuZF9zdGF0ZTsKfQoKaW5saW5lIFdvcmRCcmVha1RhYmxlOjpOb2RlCldvcmRCcmVha1RhYmxlOjppbml0aWFsU3RhdGUoKSBjb25zdAp7CiAgICByZXR1cm4ga0luaXRpYWxfc3RhdGU7Cn0KCiNlbmRpZiAvLyBfV0RCS1RCTAovL2VvZgo=