LyoKICogIENvcHlyaWdodCAoYykgMjAxMSBUaGUgV2ViUlRDIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQogKiAgdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAogKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQogKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCiAqLwoKLy8gSW4gc29tZSBjYXNlcyBpdCBpcyBkZXNpcmFibGUgdG8gdXNlIGFuIGF1ZGlvIHNvdXJjZSBvciBzaW5rIHdoaWNoIG1heQovLyBub3QgYmUgYXZhaWxhYmxlIHRvIHRoZSBWb2ljZUVuZ2luZSwgc3VjaCBhcyBhIERWIGNhbWVyYS4gVGhpcyBzdWItQVBJCi8vIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IGFsbG93IGZvciB0aGUgdXNlIG9mIHN1Y2ggZXh0ZXJuYWwgcmVjb3JkaW5nCi8vIHNvdXJjZXMgYW5kIHBsYXlvdXQgc2lua3MuIEl0IGFsc28gZGVzY3JpYmVzIGhvdyByZWNvcmRlZCBkYXRhLCBvciBkYXRhCi8vIHRvIGJlIHBsYXllZCBvdXQsIGNhbiBiZSBtb2RpZmllZCBvdXRzaWRlIHRoZSBWb2ljZUVuZ2luZS4KLy8KLy8gVXNhZ2UgZXhhbXBsZSwgb21pdHRpbmcgZXJyb3IgY2hlY2tpbmc6Ci8vCi8vICB1c2luZyBuYW1lc3BhY2Ugd2VicnRjOwovLyAgVm9pY2VFbmdpbmUqIHZvZSA9IFZvaWNlRW5naW5lOjpDcmVhdGUoKTsKLy8gIFZvRUJhc2UqIGJhc2UgPSBWb0VCYXNlOjpHZXRJbnRlcmZhY2Uodm9lKTsKLy8gIFZvRU1lZGlhUHJvY2VzcyBtZWRpYSA9IFZvRU1lZGlhUHJvY2Vzczo6R2V0SW50ZXJmYWNlKHZvZSk7Ci8vICBiYXNlLT5Jbml0KCk7Ci8vICAuLi4KLy8gIG1lZGlhLT5TZXRFeHRlcm5hbFJlY29yZGluZ1N0YXR1cyh0cnVlKTsKLy8gIC4uLgovLyAgYmFzZS0+VGVybWluYXRlKCk7Ci8vICBiYXNlLT5SZWxlYXNlKCk7Ci8vICBtZWRpYS0+UmVsZWFzZSgpOwovLyAgVm9pY2VFbmdpbmU6OkRlbGV0ZSh2b2UpOwovLwojaWZuZGVmIFdFQlJUQ19WT0lDRV9FTkdJTkVfVk9FX0VYVEVSTkFMX01FRElBX0gKI2RlZmluZSBXRUJSVENfVk9JQ0VfRU5HSU5FX1ZPRV9FWFRFUk5BTF9NRURJQV9ICgojaW5jbHVkZSAiY29tbW9uX3R5cGVzLmgiCgpuYW1lc3BhY2Ugd2VicnRjIHsKCmNsYXNzIFZvaWNlRW5naW5lOwoKY2xhc3MgV0VCUlRDX0RMTEVYUE9SVCBWb0VNZWRpYVByb2Nlc3MKewpwdWJsaWM6CiAgICAvLyBUaGUgVm9pY2VFbmdpbmUgdXNlciBzaG91bGQgb3ZlcnJpZGUgdGhlIFByb2Nlc3MoKSBtZXRob2QgaW4gYQogICAgLy8gZGVyaXZlZCBjbGFzcy4gUHJvY2VzcygpIHdpbGwgYmUgY2FsbGVkIHdoZW4gYXVkaW8gaXMgcmVhZHkgdG8KICAgIC8vIGJlIHByb2Nlc3NlZC4gVGhlIGF1ZGlvIGNhbiBiZSBhY2Nlc3NlZCBpbiBzZXZlcmFsIGRpZmZlcmVudCBtb2RlcwogICAgLy8gZ2l2ZW4gYnkgdGhlIHx0eXBlfCBwYXJhbWV0ZXIuIFRoZSBmdW5jdGlvbiBzaG91bGQgbW9kaWZ5IHRoZQogICAgLy8gb3JpZ2luYWwgZGF0YSBhbmQgZW5zdXJlIHRoYXQgaXQgaXMgY29waWVkIGJhY2sgdG8gdGhlIHxhdWRpbzEwbXN8CiAgICAvLyBhcnJheS4gVGhlIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBmcmFtZSBjYW5ub3QgYmUgY2hhbmdlZC4KICAgIC8vIFRoZSBzYW1wbGluZyBmcmVxdWVuY3kgd2lsbCBkZXBlbmQgdXBvbiB0aGUgY29kZWMgdXNlZC4gCiAgICAvLyBJZiB8aXNTdGVyZW98IGlzIHRydWUsIGF1ZGlvMTBtcyB3aWxsIGNvbnRhaW4gMTYtYml0IFBDTSBkYXRhCiAgICAvLyBzYW1wbGVzIGluIGludGVybGVhdmVkIHN0ZXJlbyBmb3JtYXQgKEwwLFIwLEwxLFIxLIUpOgogICAgdmlydHVhbCB2b2lkIFByb2Nlc3MoY29uc3QgaW50IGNoYW5uZWwsIGNvbnN0IFByb2Nlc3NpbmdUeXBlcyB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgV2ViUnRjX1dvcmQxNiBhdWRpbzEwbXNbXSwgY29uc3QgaW50IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGluZ0ZyZXEsIGNvbnN0IGJvb2wgaXNTdGVyZW8pID0gMDsKCnByb3RlY3RlZDoKICAgIHZpcnR1YWwgflZvRU1lZGlhUHJvY2VzcygpIHt9Cn07CgpjbGFzcyBXRUJSVENfRExMRVhQT1JUIFZvRUV4dGVybmFsTWVkaWEKewpwdWJsaWM6CiAgICAvLyBGYWN0b3J5IGZvciB0aGUgVm9FRXh0ZXJuYWxNZWRpYSBzdWItQVBJLiBJbmNyZWFzZXMgYW4gaW50ZXJuYWwKICAgIC8vIHJlZmVyZW5jZSBjb3VudGVyIGlmIHN1Y2Nlc3NmdWwuIFJldHVybnMgTlVMTCBpZiB0aGUgQVBJIGlzIG5vdAogICAgLy8gc3VwcG9ydGVkIG9yIGlmIGNvbnN0cnVjdGlvbiBmYWlscy4KICAgIHN0YXRpYyBWb0VFeHRlcm5hbE1lZGlhKiBHZXRJbnRlcmZhY2UoVm9pY2VFbmdpbmUqIHZvaWNlRW5naW5lKTsKCiAgICAvLyBSZWxlYXNlcyB0aGUgVm9FRXh0ZXJuYWxNZWRpYSBzdWItQVBJIGFuZCBkZWNyZWFzZXMgYW4gaW50ZXJuYWwKICAgIC8vIHJlZmVyZW5jZSBjb3VudGVyLiBSZXR1cm5zIHRoZSBuZXcgcmVmZXJlbmNlIGNvdW50LiBUaGlzIHZhbHVlIHNob3VsZAogICAgLy8gYmUgemVybyBmb3IgYWxsIHN1Yi1BUEk6cyBiZWZvcmUgdGhlIFZvaWNlRW5naW5lIG9iamVjdCBjYW4gYmUgc2FmZWx5CiAgICAvLyBkZWxldGVkLgogICAgdmlydHVhbCBpbnQgUmVsZWFzZSgpID0gMDsKCiAgICAvLyBJbnN0YWxscyBhIFZvRU1lZGlhUHJvY2VzcyBkZXJpdmVkIGluc3RhbmNlIGFuZCBhY3RpdmF0ZXMgZXh0ZXJuYWwKICAgIC8vIG1lZGlhIGZvciB0aGUgc3BlY2lmaWVkIHxjaGFubmVsfCBhbmQgfHR5cGV8LgogICAgdmlydHVhbCBpbnQgUmVnaXN0ZXJFeHRlcm5hbE1lZGlhUHJvY2Vzc2luZygKICAgICAgICBpbnQgY2hhbm5lbCwgUHJvY2Vzc2luZ1R5cGVzIHR5cGUsIFZvRU1lZGlhUHJvY2VzcyYgcHJvY2Vzc09iamVjdCkgPSAwOwoKICAgIC8vIFJlbW92ZXMgdGhlIFZvRU1lZGlhUHJvY2VzcyBkZXJpdmVkIGluc3RhbmNlIGFuZCBkZWFjdGl2YXRlcyBleHRlcm5hbAogICAgLy8gbWVkaWEgZm9yIHRoZSBzcGVjaWZpZWQgfGNoYW5uZWx8IGFuZCB8dHlwZXwuCiAgICB2aXJ0dWFsIGludCBEZVJlZ2lzdGVyRXh0ZXJuYWxNZWRpYVByb2Nlc3NpbmcoCiAgICAgICAgaW50IGNoYW5uZWwsIFByb2Nlc3NpbmdUeXBlcyB0eXBlKSA9IDA7CgogICAgLy8gVG9vZ2xlcyBzdGF0ZSBvZiBleHRlcm5hbCByZWNvcmRpbmcuCiAgICB2aXJ0dWFsIGludCBTZXRFeHRlcm5hbFJlY29yZGluZ1N0YXR1cyhib29sIGVuYWJsZSkgPSAwOwoKICAgIC8vIFRvb2dsZXMgc3RhdGUgb2YgZXh0ZXJuYWwgcGxheW91dC4KICAgIHZpcnR1YWwgaW50IFNldEV4dGVybmFsUGxheW91dFN0YXR1cyhib29sIGVuYWJsZSkgPSAwOwoKICAgIC8vIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBleHRlcm5hbGx5IHJlY29yZGVkIGF1ZGlvLiBEdXJpbmcgdHJhbnNtaXNzaW9uLAogICAgLy8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhdCBhcyByZWd1bGFyIGFuIGludGVydmFsIGFzIHBvc3NpYmxlCiAgICAvLyB3aXRoIGZyYW1lcyBvZiBjb3JyZXNwb25kaW5nIHNpemUuCiAgICB2aXJ0dWFsIGludCBFeHRlcm5hbFJlY29yZGluZ0luc2VydERhdGEoCiAgICAgICAgY29uc3QgV2ViUnRjX1dvcmQxNiBzcGVlY2hEYXRhMTBtc1tdLCBpbnQgbGVuZ3RoU2FtcGxlcywKICAgICAgICBpbnQgc2FtcGxpbmdGcmVxSHosIGludCBjdXJyZW50X2RlbGF5X21zKSA9IDA7CgogICAgLy8gVGhpcyBmdW5jdGlvbiBnZXRzIGF1ZGlvIGZvciBhbiBleHRlcm5hbCBwbGF5b3V0IHNpbmsuCiAgICAvLyBEdXJpbmcgdHJhbnNtaXNzaW9uLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgfjEwIG1zCiAgICAvLyB0byBvYnRhaW4gYSBuZXcgMTAgbXMgZnJhbWUgb2YgYXVkaW8uIFRoZSBsZW5ndGggb2YgdGhlIGJsb2NrIHdpbGwKICAgIC8vIGJlIDE2MCwgMzIwLCA0NDAgb3IgNDgwIHNhbXBsZXMgKGZvciAxNiwgMzIsIDQ0IG9yIDQ4IGtIeiBzYW1wbGluZwogICAgLy8gcmF0ZXMgcmVzcGVjdGl2ZWx5KS4KICAgIHZpcnR1YWwgaW50IEV4dGVybmFsUGxheW91dEdldERhdGEoCiAgICAgICAgV2ViUnRjX1dvcmQxNiBzcGVlY2hEYXRhMTBtc1tdLCBpbnQgc2FtcGxpbmdGcmVxSHosCiAgICAgICAgaW50IGN1cnJlbnRfZGVsYXlfbXMsIGludCYgbGVuZ3RoU2FtcGxlcykgPSAwOwoKcHJvdGVjdGVkOgogICAgVm9FRXh0ZXJuYWxNZWRpYSgpIHt9CiAgICB2aXJ0dWFsIH5Wb0VFeHRlcm5hbE1lZGlhKCkge30KfTsKCn0gIC8vIG5hbWVzcGFjZSB3ZWJydGMKCiNlbmRpZiAgLy8gIFdFQlJUQ19WT0lDRV9FTkdJTkVfVk9FX0VYVEVSTkFMX01FRElBX0gK