Ly8NCi8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi8vDQovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gDQovLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCi8vDQoNCnVzaW5nIFN5c3RlbTsNCnVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsNCnVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCg0KbmFtZXNwYWNlIERvdFpMaWINCnsNCiAgICANCiAgICAvLy8gPHN1bW1hcnk+DQogICAgLy8vIEltcGxlbWVudHMgYSBkYXRhIGRlY29tcHJlc3NvciwgdXNpbmcgdGhlIGluZmxhdGUgYWxnb3JpdGhtIGluIHRoZSBaTGliIGRsbA0KICAgIC8vLyA8L3N1bW1hcnk+DQogICAgcHVibGljIGNsYXNzIEluZmxhdGVyIDogQ29kZWNCYXNlDQoJew0KICAgICAgICAjcmVnaW9uIERsbCBpbXBvcnRzDQogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsLCBDaGFyU2V0PUNoYXJTZXQuQW5zaSldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZUluaXRfKHJlZiBaU3RyZWFtIHN6LCBzdHJpbmcgdnMsIGludCBzaXplKTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZShyZWYgWlN0cmVhbSBzeiwgaW50IGZsdXNoKTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZVJlc2V0KHJlZiBaU3RyZWFtIHN6KTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZUVuZChyZWYgWlN0cmVhbSBzeik7DQogICAgICAgICNlbmRyZWdpb24NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIG5ldyBpbnN0YW5jZSBvZiB0aGUgPGM+SW5mbGF0ZXI8L2M+DQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHB1YmxpYyBJbmZsYXRlcigpIDogYmFzZSgpDQoJCXsNCiAgICAgICAgICAgIGludCByZXR2YWwgPSBpbmZsYXRlSW5pdF8ocmVmIF96dHJlYW0sIEluZm8uVmVyc2lvbiwgTWFyc2hhbC5TaXplT2YoX3p0cmVhbSkpOw0KICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKHJldHZhbCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGluZmxhdGVyIik7DQoNCiAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQogICAgICAgIH0NCg0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gYWRkIGZyb20gPGM+ZGF0YTwvYz48L3BhcmFtPg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+DQogICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCiAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQWRkKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsNCiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCkgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOw0KICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gZGF0YS5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOw0KDQogICAgICAgICAgICBpbnQgdG90YWwgPSBjb3VudDsNCiAgICAgICAgICAgIGludCBpbnB1dEluZGV4ID0gb2Zmc2V0Ow0KICAgICAgICAgICAgaW50IGVyciA9IDA7DQoNCiAgICAgICAgICAgIHdoaWxlIChlcnIgPj0gMCAmJiBpbnB1dEluZGV4IDwgdG90YWwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29weUlucHV0KGRhdGEsIGlucHV0SW5kZXgsIE1hdGguTWluKHRvdGFsIC0gaW5wdXRJbmRleCwga0J1ZmZlclNpemUpKTsNCiAgICAgICAgICAgICAgICBlcnIgPSBpbmZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7DQogICAgICAgICAgICAgICAgaWYgKGVyciA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX3p0cmVhbS5hdmFpbF9vdXQgPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgT25EYXRhQXZhaWxhYmxlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBpbmZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlucHV0SW5kZXggKz0gKGludClfenRyZWFtLnRvdGFsX2luOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2V0Q2hlY2tzdW0oIF96dHJlYW0uYWRsZXIgKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gRmluaXNoZXMgdXAgYW55IHBlbmRpbmcgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBhbmQgaGFuZGxlZC4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmluaXNoKCkNCiAgICAgICAgew0KICAgICAgICAgICAgaW50IGVycjsNCiAgICAgICAgICAgIGRvIA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGVyciA9IGluZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5GaW5pc2gpOw0KICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgd2hpbGUgKGVyciA9PSAwKTsNCiAgICAgICAgICAgIHNldENoZWNrc3VtKCBfenRyZWFtLmFkbGVyICk7DQogICAgICAgICAgICBpbmZsYXRlUmVzZXQocmVmIF96dHJlYW0pOw0KICAgICAgICAgICAgcmVzZXRPdXRwdXQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIENsb3NlcyB0aGUgaW50ZXJuYWwgemxpYiBpbmZsYXRlIHN0cmVhbQ0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBDbGVhblVwKCkgeyBpbmZsYXRlRW5kKHJlZiBfenRyZWFtKTsgfQ0KDQoNCgl9DQp9DQo=