Ly8KLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNAovLwovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gCi8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQovLwoKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CnVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKCm5hbWVzcGFjZSBEb3RaTGliCnsKICAgIAogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIEltcGxlbWVudHMgYSBkYXRhIGRlY29tcHJlc3NvciwgdXNpbmcgdGhlIGluZmxhdGUgYWxnb3JpdGhtIGluIHRoZSBaTGliIGRsbAogICAgLy8vIDwvc3VtbWFyeT4KICAgIHB1YmxpYyBjbGFzcyBJbmZsYXRlciA6IENvZGVjQmFzZQoJewogICAgICAgICNyZWdpb24gRGxsIGltcG9ydHMKICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZUluaXRfKHJlZiBaU3RyZWFtIHN6LCBzdHJpbmcgdnMsIGludCBzaXplKTsKCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZShyZWYgWlN0cmVhbSBzeiwgaW50IGZsdXNoKTsKCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZVJlc2V0KHJlZiBaU3RyZWFtIHN6KTsKCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZUVuZChyZWYgWlN0cmVhbSBzeik7CiAgICAgICAgI2VuZHJlZ2lvbgoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIENvbnN0cnVjdHMgYW4gbmV3IGluc3RhbmNlIG9mIHRoZSA8Yz5JbmZsYXRlcjwvYz4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBJbmZsYXRlcigpIDogYmFzZSgpCgkJewogICAgICAgICAgICBpbnQgcmV0dmFsID0gaW5mbGF0ZUluaXRfKHJlZiBfenRyZWFtLCBJbmZvLlZlcnNpb24sIE1hcnNoYWwuU2l6ZU9mKF96dHJlYW0pKTsKICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpMaWJFeGNlcHRpb24ocmV0dmFsLCAiQ291bGQgbm90IGluaXRpYWxpemUgaW5mbGF0ZXIiKTsKCiAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7CiAgICAgICAgfQoKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5CeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgYWRkZWQgdG8gdGhlIGNvZGVjPC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+CiAgICAgICAgLy8vIDxyZW1hcmtzPkFkZGluZyBkYXRhIG1heSwgb3IgbWF5IG5vdCwgcmFpc2UgdGhlIDxjPkRhdGFBdmFpbGFibGU8L2M+IGV2ZW50PC9yZW1hcmtzPgogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEFkZChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigpOwogICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gZGF0YS5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOwoKICAgICAgICAgICAgaW50IHRvdGFsID0gY291bnQ7CiAgICAgICAgICAgIGludCBpbnB1dEluZGV4ID0gb2Zmc2V0OwogICAgICAgICAgICBpbnQgZXJyID0gMDsKCiAgICAgICAgICAgIHdoaWxlIChlcnIgPj0gMCAmJiBpbnB1dEluZGV4IDwgdG90YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHlJbnB1dChkYXRhLCBpbnB1dEluZGV4LCBNYXRoLk1pbih0b3RhbCAtIGlucHV0SW5kZXgsIGtCdWZmZXJTaXplKSk7CiAgICAgICAgICAgICAgICBlcnIgPSBpbmZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7CiAgICAgICAgICAgICAgICBpZiAoZXJyID09IDApCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF96dHJlYW0uYXZhaWxfb3V0ID09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBPbkRhdGFBdmFpbGFibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gaW5mbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpbnB1dEluZGV4ICs9IChpbnQpX3p0cmVhbS50b3RhbF9pbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRDaGVja3N1bSggX3p0cmVhbS5hZGxlciApOwogICAgICAgIH0KCgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gRmluaXNoZXMgdXAgYW55IHBlbmRpbmcgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBhbmQgaGFuZGxlZC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZpbmlzaCgpCiAgICAgICAgewogICAgICAgICAgICBpbnQgZXJyOwogICAgICAgICAgICBkbyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXJyID0gaW5mbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLkZpbmlzaCk7CiAgICAgICAgICAgICAgICBPbkRhdGFBdmFpbGFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoZXJyID09IDApOwogICAgICAgICAgICBzZXRDaGVja3N1bSggX3p0cmVhbS5hZGxlciApOwogICAgICAgICAgICBpbmZsYXRlUmVzZXQocmVmIF96dHJlYW0pOwogICAgICAgICAgICByZXNldE91dHB1dCgpOwogICAgICAgIH0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBDbG9zZXMgdGhlIGludGVybmFsIHpsaWIgaW5mbGF0ZSBzdHJlYW0KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIENsZWFuVXAoKSB7IGluZmxhdGVFbmQocmVmIF96dHJlYW0pOyB9CgoKCX0KfQo=