Ly8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4NCi8vIA0KLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi8vDQovLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdA0KLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi8vDQovLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUDQovLw0KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCANCi8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiANCi8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIA0KLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCg0KI2luY2x1ZGUgInVuaXR0ZXN0LmgiDQoNCiNpbmNsdWRlICJyYXBpZGpzb24vcmVhZGVyLmgiDQojaW5jbHVkZSAicmFwaWRqc29uL2ludGVybmFsL2R0b2EuaCINCiNpbmNsdWRlICJyYXBpZGpzb24vaW50ZXJuYWwvaXRvYS5oIg0KI2luY2x1ZGUgInJhcGlkanNvbi9tZW1vcnlzdHJlYW0uaCINCg0KdXNpbmcgbmFtZXNwYWNlIHJhcGlkanNvbjsNCg0KI2lmZGVmIF9fR05VQ19fDQpSQVBJREpTT05fRElBR19QVVNIDQpSQVBJREpTT05fRElBR19PRkYoZWZmYysrKQ0KUkFQSURKU09OX0RJQUdfT0ZGKGZsb2F0LWVxdWFsKQ0KI2VuZGlmDQoNCnRlbXBsYXRlPGJvb2wgZXhwZWN0Pg0Kc3RydWN0IFBhcnNlQm9vbEhhbmRsZXIgOiBCYXNlUmVhZGVySGFuZGxlcjxVVEY4PD4sIFBhcnNlQm9vbEhhbmRsZXI8ZXhwZWN0PiA+IHsNCiAgICBQYXJzZUJvb2xIYW5kbGVyKCkgOiBzdGVwXygwKSB7fQ0KICAgIGJvb2wgRGVmYXVsdCgpIHsgQUREX0ZBSUxVUkUoKTsgcmV0dXJuIGZhbHNlOyB9DQogICAgLy8gZ2NjIDQuOC54IGdlbmVyYXRlcyB3YXJuaW5nIGluIEVYUEVDVF9FUShib29sLCBib29sKSBvbiB0aGlzIGd0ZXN0IHZlcnNpb24uDQogICAgLy8gV29ya2Fyb3VuZCB3aXRoIEVYUEVDVF9UUlVFKCkuDQogICAgYm9vbCBCb29sKGJvb2wgYikgeyAvKkVYUEVDVF9FUShleHBlY3QsIGIpOyAqL0VYUEVDVF9UUlVFKGV4cGVjdCA9PSBiKTsgICsrc3RlcF87IHJldHVybiB0cnVlOyB9DQoNCiAgICB1bnNpZ25lZCBzdGVwXzsNCn07DQoNClRFU1QoUmVhZGVyLCBQYXJzZVRydWUpIHsNCiAgICBTdHJpbmdTdHJlYW0gcygidHJ1ZSIpOw0KICAgIFBhcnNlQm9vbEhhbmRsZXI8dHJ1ZT4gaDsNCiAgICBSZWFkZXIgcmVhZGVyOw0KICAgIHJlYWRlci5QYXJzZShzLCBoKTsNCiAgICBFWFBFQ1RfRVEoMXUsIGguc3RlcF8pOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VGYWxzZSkgew0KICAgIFN0cmluZ1N0cmVhbSBzKCJmYWxzZSIpOw0KICAgIFBhcnNlQm9vbEhhbmRsZXI8ZmFsc2U+IGg7DQogICAgUmVhZGVyIHJlYWRlcjsNCiAgICByZWFkZXIuUGFyc2UocywgaCk7DQogICAgRVhQRUNUX0VRKDF1LCBoLnN0ZXBfKTsNCn0NCg0Kc3RydWN0IFBhcnNlSW50SGFuZGxlciA6IEJhc2VSZWFkZXJIYW5kbGVyPFVURjg8PiwgUGFyc2VJbnRIYW5kbGVyPiB7DQogICAgUGFyc2VJbnRIYW5kbGVyKCkgOiBzdGVwXygwKSwgYWN0dWFsXygpIHt9DQogICAgYm9vbCBEZWZhdWx0KCkgeyBBRERfRkFJTFVSRSgpOyByZXR1cm4gZmFsc2U7IH0NCiAgICBib29sIEludChpbnQgaSkgeyBhY3R1YWxfID0gaTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7IH0NCg0KICAgIHVuc2lnbmVkIHN0ZXBfOw0KICAgIGludCBhY3R1YWxfOw0KfTsNCg0Kc3RydWN0IFBhcnNlVWludEhhbmRsZXIgOiBCYXNlUmVhZGVySGFuZGxlcjxVVEY4PD4sIFBhcnNlVWludEhhbmRsZXI+IHsNCiAgICBQYXJzZVVpbnRIYW5kbGVyKCkgOiBzdGVwXygwKSwgYWN0dWFsXygpIHt9DQogICAgYm9vbCBEZWZhdWx0KCkgeyBBRERfRkFJTFVSRSgpOyByZXR1cm4gZmFsc2U7IH0NCiAgICBib29sIFVpbnQodW5zaWduZWQgaSkgeyBhY3R1YWxfID0gaTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7IH0NCg0KICAgIHVuc2lnbmVkIHN0ZXBfOw0KICAgIHVuc2lnbmVkIGFjdHVhbF87DQp9Ow0KDQpzdHJ1Y3QgUGFyc2VJbnQ2NEhhbmRsZXIgOiBCYXNlUmVhZGVySGFuZGxlcjxVVEY4PD4sIFBhcnNlSW50NjRIYW5kbGVyPiB7DQogICAgUGFyc2VJbnQ2NEhhbmRsZXIoKSA6IHN0ZXBfKDApLCBhY3R1YWxfKCkge30NCiAgICBib29sIERlZmF1bHQoKSB7IEFERF9GQUlMVVJFKCk7IHJldHVybiBmYWxzZTsgfQ0KICAgIGJvb2wgSW50NjQoaW50NjRfdCBpKSB7IGFjdHVhbF8gPSBpOyBzdGVwXysrOyByZXR1cm4gdHJ1ZTsgfQ0KDQogICAgdW5zaWduZWQgc3RlcF87DQogICAgaW50NjRfdCBhY3R1YWxfOw0KfTsNCg0Kc3RydWN0IFBhcnNlVWludDY0SGFuZGxlciA6IEJhc2VSZWFkZXJIYW5kbGVyPFVURjg8PiwgUGFyc2VVaW50NjRIYW5kbGVyPiB7DQogICAgUGFyc2VVaW50NjRIYW5kbGVyKCkgOiBzdGVwXygwKSwgYWN0dWFsXygpIHt9DQogICAgYm9vbCBEZWZhdWx0KCkgeyBBRERfRkFJTFVSRSgpOyByZXR1cm4gZmFsc2U7IH0NCiAgICBib29sIFVpbnQ2NCh1aW50NjRfdCBpKSB7IGFjdHVhbF8gPSBpOyBzdGVwXysrOyByZXR1cm4gdHJ1ZTsgfQ0KDQogICAgdW5zaWduZWQgc3RlcF87DQogICAgdWludDY0X3QgYWN0dWFsXzsNCn07DQoNCnN0cnVjdCBQYXJzZURvdWJsZUhhbmRsZXIgOiBCYXNlUmVhZGVySGFuZGxlcjxVVEY4PD4sIFBhcnNlRG91YmxlSGFuZGxlcj4gew0KICAgIFBhcnNlRG91YmxlSGFuZGxlcigpIDogc3RlcF8oMCksIGFjdHVhbF8oKSB7fQ0KICAgIGJvb2wgRGVmYXVsdCgpIHsgQUREX0ZBSUxVUkUoKTsgcmV0dXJuIGZhbHNlOyB9DQogICAgYm9vbCBEb3VibGUoZG91YmxlIGQpIHsgYWN0dWFsXyA9IGQ7IHN0ZXBfKys7IHJldHVybiB0cnVlOyB9DQoNCiAgICB1bnNpZ25lZCBzdGVwXzsNCiAgICBkb3VibGUgYWN0dWFsXzsNCn07DQoNClRFU1QoUmVhZGVyLCBQYXJzZU51bWJlcl9JbnRlZ2VyKSB7DQojZGVmaW5lIFRFU1RfSU5URUdFUihIYW5kbGVyLCBzdHIsIHgpIFwNCiAgICB7IFwNCiAgICAgICAgU3RyaW5nU3RyZWFtIHMoc3RyKTsgXA0KICAgICAgICBIYW5kbGVyIGg7IFwNCiAgICAgICAgUmVhZGVyIHJlYWRlcjsgXA0KICAgICAgICByZWFkZXIuUGFyc2UocywgaCk7IFwNCiAgICAgICAgRVhQRUNUX0VRKDF1LCBoLnN0ZXBfKTsgXA0KICAgICAgICBFWFBFQ1RfRVEoeCwgaC5hY3R1YWxfKTsgXA0KICAgIH0NCg0KICAgIFRFU1RfSU5URUdFUihQYXJzZVVpbnRIYW5kbGVyLCAiMCIsIDB1KTsNCiAgICBURVNUX0lOVEVHRVIoUGFyc2VVaW50SGFuZGxlciwgIjEyMyIsIDEyM3UpOw0KICAgIFRFU1RfSU5URUdFUihQYXJzZVVpbnRIYW5kbGVyLCAiMjE0NzQ4MzY0OCIsIDIxNDc0ODM2NDh1KTsgICAgICAgLy8gMl4zMSAtIDEgKGNhbm5vdCBiZSBzdG9yZWQgaW4gaW50KQ0KICAgIFRFU1RfSU5URUdFUihQYXJzZVVpbnRIYW5kbGVyLCAiNDI5NDk2NzI5NSIsIDQyOTQ5NjcyOTV1KTsNCg0KICAgIFRFU1RfSU5URUdFUihQYXJzZUludEhhbmRsZXIsICItMTIzIiwgLTEyMyk7DQogICAgVEVTVF9JTlRFR0VSKFBhcnNlSW50SGFuZGxlciwgIi0yMTQ3NDgzNjQ4Iiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oMHg4MDAwMDAwMCkpOyAgICAgLy8gLTJeMzEgKG1pbiBvZiBpbnQpDQoNCiAgICBURVNUX0lOVEVHRVIoUGFyc2VVaW50NjRIYW5kbGVyLCAiNDI5NDk2NzI5NiIsIFJBUElESlNPTl9VSU5UNjRfQzIoMSwgMCkpOyAgIC8vIDJeMzIgKG1heCBvZiB1bnNpZ25lZCArIDEsIGZvcmNlIHRvIHVzZSB1aW50NjRfdCkNCiAgICBURVNUX0lOVEVHRVIoUGFyc2VVaW50NjRIYW5kbGVyLCAiMTg0NDY3NDQwNzM3MDk1NTE2MTUiLCBSQVBJREpTT05fVUlOVDY0X0MyKDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpKTsgICAvLyAyXjY0IC0gMSAobWF4IG9mIHVpbnQ2NF90KQ0KDQogICAgVEVTVF9JTlRFR0VSKFBhcnNlSW50NjRIYW5kbGVyLCAiLTIxNDc0ODM2NDkiLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihSQVBJREpTT05fVUlOVDY0X0MyKDB4RkZGRkZGRkYsIDB4N0ZGRkZGRkYpKSk7ICAgLy8gLTJeMzEgLTEgKG1pbiBvZiBpbnQgLSAxLCBmb3JjZSB0byB1c2UgaW50NjRfdCkNCiAgICBURVNUX0lOVEVHRVIoUGFyc2VJbnQ2NEhhbmRsZXIsICItOTIyMzM3MjAzNjg1NDc3NTgwOCIsIHN0YXRpY19jYXN0PGludDY0X3Q+KFJBUElESlNPTl9VSU5UNjRfQzIoMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCkpKTsgICAgICAgLy8gLTJeNjMgKG1pbiBvZiBpbnQ2NF90KQ0KDQogICAgLy8gUmFuZG9tIHRlc3QgZm9yIHVpbnQzMl90L2ludDMyX3QNCiAgICB7DQogICAgICAgIHVuaW9uIHsNCiAgICAgICAgICAgIHVpbnQzMl90IHU7DQogICAgICAgICAgICBpbnQzMl90IGk7DQogICAgICAgIH11Ow0KICAgICAgICBSYW5kb20gcjsNCg0KICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsNCiAgICAgICAgICAgIHUudSA9IHIoKTsNCg0KICAgICAgICAgICAgY2hhciBidWZmZXJbMzJdOw0KICAgICAgICAgICAgKmludGVybmFsOjp1MzJ0b2EodS51LCBidWZmZXIpID0gJ1wwJzsNCiAgICAgICAgICAgIFRFU1RfSU5URUdFUihQYXJzZVVpbnRIYW5kbGVyLCBidWZmZXIsIHUudSk7DQoNCiAgICAgICAgICAgIGlmICh1LmkgPCAwKSB7DQogICAgICAgICAgICAgICAgKmludGVybmFsOjppMzJ0b2EodS5pLCBidWZmZXIpID0gJ1wwJzsNCiAgICAgICAgICAgICAgICBURVNUX0lOVEVHRVIoUGFyc2VJbnRIYW5kbGVyLCBidWZmZXIsIHUuaSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyBSYW5kb20gdGVzdCBmb3IgdWludDY0X3QvaW50NjRfdA0KICAgIHsNCiAgICAgICAgdW5pb24gew0KICAgICAgICAgICAgdWludDY0X3QgdTsNCiAgICAgICAgICAgIGludDY0X3QgaTsNCiAgICAgICAgfXU7DQogICAgICAgIFJhbmRvbSByOw0KDQogICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgew0KICAgICAgICAgICAgdS51ID0gdWludDY0X3QocigpKSA8PCAzMjsNCiAgICAgICAgICAgIHUudSB8PSByKCk7DQoNCiAgICAgICAgICAgIGNoYXIgYnVmZmVyWzMyXTsNCiAgICAgICAgICAgIGlmICh1LnUgPj0gNDI5NDk2NzI5NlVMTCkgew0KICAgICAgICAgICAgICAgICppbnRlcm5hbDo6dTY0dG9hKHUudSwgYnVmZmVyKSA9ICdcMCc7DQogICAgICAgICAgICAgICAgVEVTVF9JTlRFR0VSKFBhcnNlVWludDY0SGFuZGxlciwgYnVmZmVyLCB1LnUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodS5pIDw9IC0yMTQ3NDgzNjQ5TEwpIHsNCiAgICAgICAgICAgICAgICAqaW50ZXJuYWw6Omk2NHRvYSh1LmksIGJ1ZmZlcikgPSAnXDAnOw0KICAgICAgICAgICAgICAgIFRFU1RfSU5URUdFUihQYXJzZUludDY0SGFuZGxlciwgYnVmZmVyLCB1LmkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KI3VuZGVmIFRFU1RfSU5URUdFUg0KfQ0KDQp0ZW1wbGF0ZTxib29sIGZ1bGxQcmVjaXNpb24+DQpzdGF0aWMgdm9pZCBUZXN0UGFyc2VEb3VibGUoKSB7DQojZGVmaW5lIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sIHN0ciwgeCkgXA0KICAgIHsgXA0KICAgICAgICBTdHJpbmdTdHJlYW0gcyhzdHIpOyBcDQogICAgICAgIFBhcnNlRG91YmxlSGFuZGxlciBoOyBcDQogICAgICAgIFJlYWRlciByZWFkZXI7IFwNCiAgICAgICAgQVNTRVJUX0VRKGtQYXJzZUVycm9yTm9uZSwgcmVhZGVyLlBhcnNlPGZ1bGxQcmVjaXNpb24gPyBrUGFyc2VGdWxsUHJlY2lzaW9uRmxhZyA6IDA+KHMsIGgpLkNvZGUoKSk7IFwNCiAgICAgICAgRVhQRUNUX0VRKDF1LCBoLnN0ZXBfKTsgXA0KICAgICAgICBpbnRlcm5hbDo6RG91YmxlIGUoeCksIGEoaC5hY3R1YWxfKTsgXA0KICAgICAgICBpZiAoZnVsbFByZWNpc2lvbikgeyBcDQogICAgICAgICAgICBFWFBFQ1RfRVEoZS5VaW50NjRWYWx1ZSgpLCBhLlVpbnQ2NFZhbHVlKCkpOyBcDQogICAgICAgICAgICBpZiAoZS5VaW50NjRWYWx1ZSgpICE9IGEuVWludDY0VmFsdWUoKSkgXA0KICAgICAgICAgICAgICAgIHByaW50ZigiICBTdHJpbmc6ICVzXG4gIEFjdHVhbDogJS4xN2dcbkV4cGVjdGVkOiAlLjE3Z1xuIiwgc3RyLCBoLmFjdHVhbF8sIHgpOyBcDQogICAgICAgIH0gXA0KICAgICAgICBlbHNlIHsgXA0KICAgICAgICAgICAgRVhQRUNUX0VRKGUuU2lnbigpLCBhLlNpZ24oKSk7IC8qIGZvciAwLjAgIT0gLTAuMCAqLyBcDQogICAgICAgICAgICBFWFBFQ1RfRE9VQkxFX0VRKHgsIGguYWN0dWFsXyk7IFwNCiAgICAgICAgfSBcDQogICAgfQ0KDQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjAuMCIsIDAuMCk7DQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIi0wLjAiLCAtMC4wKTsgLy8gRm9yIGNoZWNraW5nIGlzc3VlICMyODkNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMS4wIiwgMS4wKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiLTEuMCIsIC0xLjApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIxLjUiLCAxLjUpOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICItMS41IiwgLTEuNSk7DQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjMuMTQxNiIsIDMuMTQxNik7DQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjFFMTAiLCAxRTEwKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMWUxMCIsIDFlMTApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIxRSsxMCIsIDFFKzEwKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMUUtMTAiLCAxRS0xMCk7DQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIi0xRTEwIiwgLTFFMTApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICItMWUxMCIsIC0xZTEwKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiLTFFKzEwIiwgLTFFKzEwKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiLTFFLTEwIiwgLTFFLTEwKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMS4yMzRFKzEwIiwgMS4yMzRFKzEwKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMS4yMzRFLTEwIiwgMS4yMzRFLTEwKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMS43OTc2OWUrMzA4IiwgMS43OTc2OWUrMzA4KTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMi4yMjUwN2UtMzA4IiwgMi4yMjUwN2UtMzA4KTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiLTEuNzk3NjllKzMwOCIsIC0xLjc5NzY5ZSszMDgpOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICItMi4yMjUwN2UtMzA4IiwgLTIuMjI1MDdlLTMwOCk7DQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0IiwgNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQpOyAvLyBtaW5pbXVtIGRlbm9ybWFsDQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjIuMjI1MDczODU4NTA3MjAwOWUtMzA4IiwgMi4yMjUwNzM4NTg1MDcyMDA5ZS0zMDgpOyAvLyBNYXggc3Vibm9ybWFsIGRvdWJsZQ0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCIsIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4KTsgLy8gTWluIG5vcm1hbCBwb3NpdGl2ZSBkb3VibGUNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgiLCAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCk7IC8vIE1heCBkb3VibGUNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMWUtMTAwMDAiLCAwLjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgdW5kZXJmbG93DQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjE4NDQ2NzQ0MDczNzA5NTUxNjE2IiwgMTg0NDY3NDQwNzM3MDk1NTE2MTYuMCk7ICAgICAvLyAyXjY0IChtYXggb2YgdWludDY0X3QgKyAxLCBmb3JjZSB0byB1c2UgZG91YmxlKQ0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICItOTIyMzM3MjAzNjg1NDc3NTgwOSIsIC05MjIzMzcyMDM2ODU0Nzc1ODA5LjApOyAgICAgLy8gLTJeNjMgLSAxKG1pbiBvZiBpbnQ2NF90ICsgMSwgZm9yY2UgdG8gdXNlIGRvdWJsZSkNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMC45ODY4MDExNDc0NjA5Mzc1IiwgMC45ODY4MDExNDc0NjA5Mzc1KTsgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWxveWlwL3JhcGlkanNvbi9pc3N1ZXMvMTIwDQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjEyM2UzNCIsIDEyM2UzNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXN0IFBhdGggQ2FzZXMgSW4gRGlzZ3Vpc2UNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiNDU5MTMxNDE4NzcyNzA2NDAwMDAuMCIsIDQ1OTEzMTQxODc3MjcwNjQwMDAwLjApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIyLjIyNTA3Mzg1ODUwNzIwMTFlLTMwOCIsIDIuMjI1MDczODU4NTA3MjAxMWUtMzA4KTsgLy8gaHR0cDovL3d3dy5leHBsb3JpbmdiaW5hcnkuY29tL3BocC1oYW5ncy1vbi1udW1lcmljLXZhbHVlLTItMjI1MDczODU4NTA3MjAxMWUtMzA4Lw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIxZS0wMDAxMTExMTExMTExMSIsIDAuMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgIzMxMw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICItMWUtMDAwMTExMTExMTExMTEiLCAtMC4wKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMWUtMjE0NzQ4MzYzIiwgMC4wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4aW11bSBzdXBwb3J0ZWQgbmVnYXRpdmUgZXhwb25lbnQNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMWUtMjE0NzQ4MzY0IiwgMC4wKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMWUtMjE0NzQ4MzYzMTEiLCAwLjApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIwLjAxNzk3NjkzMTM0ODYyMzE1N2UrMzEwIiwgMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgpOyAvLyBNYXggZG91YmxlIGluIGFub3RoZXIgZm9ybQ0KDQogICAgLy8gU2luY2UNCiAgICAvLyBhYnMoKDJeLTEwMjIgLSAyXi0xMDc0KSAtIDIuMjI1MDczODU4NTA3MjAxMmUtMzA4KSA9IDMuMTA5NzU0MTMxMjM5MTQxNDAxMTIzNDk1NzY4ODc3NTkwNDA1MzQ1MDY0NzUxOTc0Mzc1NTk5Li4uIKHBIDEwXi0zMjQNCiAgICAvLyBhYnMoKDJeLTEwMjIpIC0gMi4yMjUwNzM4NTg1MDcyMDEyZS0zMDgpID0gMS44MzA5MDIzMjcxNzMzMjQwNDA2NDIxOTIxNTk4MDQ2MjMzMTgzMDU1MzMyNzQxNjg4NzIwNDQuLi4gocEgMTAgXiAtMzI0DQogICAgLy8gU28gMi4yMjUwNzM4NTg1MDcyMDEyZS0zMDggc2hvdWxkIHJvdW5kIHRvIDJeLTEwMjIgPSAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOA0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIyLjIyNTA3Mzg1ODUwNzIwMTJlLTMwOCIsIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4KTsgLy8gaHR0cDovL3d3dy5leHBsb3JpbmdiaW5hcnkuY29tL2phdmEtaGFuZ3Mtd2hlbi1jb252ZXJ0aW5nLTItMjI1MDczODU4NTA3MjAxMmUtMzA4Lw0KDQogICAgLy8gTW9yZSBjbG9zZXIgdG8gbm9ybWFsL3N1Ym5vcm1hbCBib3VuZGFyeQ0KICAgIC8vIGJvdW5kYXJ5ID0gMl4tMTAyMiAtIDJeLTEwNzUgPSAyLjIyNTA3Mzg1ODUwNzIwMTEzNjA1NzQwOTc5NjcwOTEzMTk3NTkzNDgxOTU0NjM1MTY0NTY0OC4uLiChwSAxMF4tMzA4DQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjIuMjI1MDczODU4NTA3MjAxMTM2MDU3NDA5Nzk2NzA5MTMxOTc1OTM0ODE5NTQ2MzUxNjQ1NjRlLTMwOCIsIDIuMjI1MDczODU4NTA3MjAwOWUtMzA4KTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMi4yMjUwNzM4NTg1MDcyMDExMzYwNTc0MDk3OTY3MDkxMzE5NzU5MzQ4MTk1NDYzNTE2NDU2NWUtMzA4IiwgMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpOw0KDQogICAgLy8gMS4wIGlzIGluICgxLjAgLSAyXi01NCwgMS4wICsgMl4tNTMpDQogICAgLy8gMS4wIC0gMl4tNTQgPSAwLjk5OTk5OTk5OTk5OTk5OTk0NDQ4ODg0ODc2ODc0MjE3Mjk3ODgxODQxNjU5NTQ1ODk4NDM3NQ0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIwLjk5OTk5OTk5OTk5OTk5OTk0NDQ4ODg0ODc2ODc0MjE3Mjk3ODgxODQxNjU5NTQ1ODk4NDM3NSIsIDEuMCk7IC8vIHJvdW5kIHRvIGV2ZW4NCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMC45OTk5OTk5OTk5OTk5OTk5NDQ0ODg4NDg3Njg3NDIxNzI5Nzg4MTg0MTY1OTU0NTg5ODQzNzQiLCAwLjk5OTk5OTk5OTk5OTk5OTg5KTsgLy8gcHJldmlvdXMgZG91YmxlDQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjAuOTk5OTk5OTk5OTk5OTk5OTQ0NDg4ODQ4NzY4NzQyMTcyOTc4ODE4NDE2NTk1NDU4OTg0Mzc2IiwgMS4wKTsgLy8gbmV4dCBkb3VibGUNCiAgICAvLyAxLjAgKyAyXi01MyA9IDEuMDAwMDAwMDAwMDAwMDAwMTExMDIyMzAyNDYyNTE1NjU0MDQyMzYzMTY2ODA5MDgyMDMxMjUNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMS4wMDAwMDAwMDAwMDAwMDAxMTEwMjIzMDI0NjI1MTU2NTQwNDIzNjMxNjY4MDkwODIwMzEyNSIsIDEuMCk7IC8vIHJvdW5kIHRvIGV2ZW4NCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiMS4wMDAwMDAwMDAwMDAwMDAxMTEwMjIzMDI0NjI1MTU2NTQwNDIzNjMxNjY4MDkwODIwMzEyNCIsIDEuMCk7IC8vIHByZXZpb3VzIGRvdWJsZQ0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIxLjAwMDAwMDAwMDAwMDAwMDExMTAyMjMwMjQ2MjUxNTY1NDA0MjM2MzE2NjgwOTA4MjAzMTI2IiwgMS4wMDAwMDAwMDAwMDAwMDAyMik7IC8vIG5leHQgZG91YmxlDQoNCiAgICAvLyBOdW1iZXJzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2l0c2NoL2RvdWJsZS1jb252ZXJzaW9uL2Jsb2IvbWFzdGVyL3Rlc3QvY2N0ZXN0L3Rlc3Qtc3RydG9kLmNjDQoNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiNzIwNTc1OTQwMzc5Mjc5MjguMCIsIDcyMDU3NTk0MDM3OTI3OTI4LjApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICI3MjA1NzU5NDAzNzkyNzkzNi4wIiwgNzIwNTc1OTQwMzc5Mjc5MzYuMCk7DQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjcyMDU3NTk0MDM3OTI3OTMyLjAiLCA3MjA1NzU5NDAzNzkyNzkzNi4wKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiNzIwNTc1OTQwMzc5Mjc5MzE5OTk5OWUtNSIsIDcyMDU3NTk0MDM3OTI3OTI4LjApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICI3MjA1NzU5NDAzNzkyNzkzMjAwMDAxZS01IiwgNzIwNTc1OTQwMzc5Mjc5MzYuMCk7DQoNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiOTIyMzM3MjAzNjg1NDc3NDc4NC4wIiwgOTIyMzM3MjAzNjg1NDc3NDc4NC4wKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiOTIyMzM3MjAzNjg1NDc3NTgwOC4wIiwgOTIyMzM3MjAzNjg1NDc3NTgwOC4wKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiOTIyMzM3MjAzNjg1NDc3NTI5Ni4wIiwgOTIyMzM3MjAzNjg1NDc3NTgwOC4wKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiOTIyMzM3MjAzNjg1NDc3NTI5NTk5OTk5ZS01IiwgOTIyMzM3MjAzNjg1NDc3NDc4NC4wKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiOTIyMzM3MjAzNjg1NDc3NTI5NjAwMDAxZS01IiwgOTIyMzM3MjAzNjg1NDc3NTgwOC4wKTsNCg0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIxMDE0MTIwNDgwMTgyNTgzNDA4NjA3MzcxODgwMDM4NCIsIDEwMTQxMjA0ODAxODI1ODM0MDg2MDczNzE4ODAwMzg0LjApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIxMDE0MTIwNDgwMTgyNTgzNTIxMTk3MzYyNTY0MzAwOCIsIDEwMTQxMjA0ODAxODI1ODM1MjExOTczNjI1NjQzMDA4LjApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIxMDE0MTIwNDgwMTgyNTgzNDY0OTAyMzY3MjIyMTY5NiIsIDEwMTQxMjA0ODAxODI1ODM1MjExOTczNjI1NjQzMDA4LjApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICIxMDE0MTIwNDgwMTgyNTgzNDY0OTAyMzY3MjIyMTY5NTk5OTk5ZS01IiwgMTAxNDEyMDQ4MDE4MjU4MzQwODYwNzM3MTg4MDAzODQuMCk7DQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjEwMTQxMjA0ODAxODI1ODM0NjQ5MDIzNjcyMjIxNjk2MDAwMDFlLTUiLCAxMDE0MTIwNDgwMTgyNTgzNTIxMTk3MzYyNTY0MzAwOC4wKTsNCg0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICI1NzA4OTkwNzcwODIzODM4ODkwNDA3ODQzNzYzNjgzMjc5Nzk3MTc5MzgzODA4IiwgNTcwODk5MDc3MDgyMzgzODg5MDQwNzg0Mzc2MzY4MzI3OTc5NzE3OTM4MzgwOC4wKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiNTcwODk5MDc3MDgyMzgzOTUyNDIzMzE0Mzg3Nzc5Nzk4MDU0NTUzMDk4NjQ5NiIsIDU3MDg5OTA3NzA4MjM4Mzk1MjQyMzMxNDM4Nzc3OTc5ODA1NDU1MzA5ODY0OTYuMCk7DQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjU3MDg5OTA3NzA4MjM4MzkyMDczMjA0OTM4MjA3NDA2MzAxNzEzNTUxODUxNTIiLCA1NzA4OTkwNzcwODIzODM5NTI0MjMzMTQzODc3Nzk3OTgwNTQ1NTMwOTg2NDk2LjApOw0KICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sICI1NzA4OTkwNzcwODIzODM5MjA3MzIwNDkzODIwNzQwNjMwMTcxMzU1MTg1MTUxOTk5ZS0zIiwgNTcwODk5MDc3MDgyMzgzODg5MDQwNzg0Mzc2MzY4MzI3OTc5NzE3OTM4MzgwOC4wKTsNCiAgICBURVNUX0RPVUJMRShmdWxsUHJlY2lzaW9uLCAiNTcwODk5MDc3MDgyMzgzOTIwNzMyMDQ5MzgyMDc0MDYzMDE3MTM1NTE4NTE1MjAwMWUtMyIsIDU3MDg5OTA3NzA4MjM4Mzk1MjQyMzMxNDM4Nzc3OTc5ODA1NDU1MzA5ODY0OTYuMCk7DQoNCiAgICB7DQogICAgICAgIGNoYXIgbjFlMzA4WzMxMF07ICAgLy8gJzEnIGZvbGxvd2VkIGJ5IDMwOCAnMCcNCiAgICAgICAgbjFlMzA4WzBdID0gJzEnOw0KICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDMwOTsgaSsrKQ0KICAgICAgICAgICAgbjFlMzA4W2ldID0gJzAnOw0KICAgICAgICBuMWUzMDhbMzA5XSA9ICdcMCc7DQogICAgICAgIFRFU1RfRE9VQkxFKGZ1bGxQcmVjaXNpb24sIG4xZTMwOCwgMUUzMDgpOw0KICAgIH0NCg0KICAgIC8vIENvdmVyIHRyaW1taW5nDQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgDQoiMi4yMjUwNzM4NTg1MDcyMDExMzYwNTc0MDk3OTY3MDkxMzE5NzU5MzQ4MTk1NDYzNTE2NDU2NDgwMjM0MjYxMDk3MjQ4MjIyMjIwMjEwNzY5NDU1MTY1Mjk1MjM5MDgxMzUwOCINCiI3OTE0MTQ5MTU4OTEzMDM5NjIxMTA2ODcwMDg2NDM4Njk0NTk0NjQ1NTI3NjU3MjA3NDA3ODIwNjIxNzQzMzc5OTg4MTQxMDYzMjY3MzI5MjUzNTUyMjg2ODgxMzcyMTQ5MDEyIg0KIjk4MTEyMjQ1MTQ1MTg4OTg0OTA1NzIyMjMwNzI4NTI1NTEzMzE1NTc1NTAxNTkxNDM5NzQ3NjM5Nzk4MzQxMTgwMTk5OTMyMzk2MjU0ODI4OTAxNzEwNzA4MTg1MDY5MDYzMDYiDQoiNjY2NTU5OTQ5MzgyNzU3NzI1NzIwMTU3NjMwNjI2OTA2NjMzMzI2NDc1NjUzMDAwMDkyNDU4ODgzMTY0MzMwMzc3Nzk3OTE4Njk2MTIwNDk0OTczOTAzNzc4Mjk3MDQ5MDUwNSINCiIxMDgwNjA5OTQwNzMwMjYyOTM3MTI4OTU4OTUwMDAzNTgzNzk5OTY3MjA3MjU0MzA0MzYwMjg0MDc4ODk1NzcxNzk2MTUwOTQ1NTE2NzQ4MjQzNDcxMDMwNzAyNjA5MTQ0NjIxIg0KIjU3MjI4OTg4MDI1ODE4MjU0NTE4MDMyNTcwNzAxODg2MDg3MjExMzEyODA3OTUxMjIzMzQyNjI4ODM2ODYyMjMyMTUwMzc3NTY2NjYyMjUwMzk4MjUzNDMzNTk3NDU2ODg4NDQiDQoiMjM5MDAyNjU0OTgxOTgzODU0ODc5NDgyOTIyMDY4OTQ3MjE2ODk4MzEwOTk2OTgzNjU4NDY4MTQwMjI4NTQyNDMzMzA2NjAzMzk4NTA4ODY0NDU4MDQwMDEwMzQ5MzM5NzA0MiINCiI3NTY3MTg2NDQzMzgzNzcwNDg2MDM3ODYxNjIyNzcxNzM4NTQ1NjIzMDY1ODc0Njc5MDE0MDg2NzIzMzI3NjM2NzE4NzUxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxIg0KImUtMzA4IiwgDQogICAgMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpOw0KDQogICAgew0KICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY291bnQgPSAxMDA7IC8vIFRlc3RlZCB3aXRoIDEwMDAwMDAgbG9jYWxseQ0KICAgICAgICBSYW5kb20gcjsNCiAgICAgICAgUmVhZGVyIHJlYWRlcjsgLy8gUmV1c2luZyByZWFkZXIgdG8gcHJldmVudCBoZWFwIGFsbG9jYXRpb24NCg0KICAgICAgICAvLyBFeGhhdXN0aXZlbHkgdGVzdCBkaWZmZXJlbnQgZXhwb25lbnRzIHdpdGggcmFuZG9tIHNpZ25pZmljYW50DQogICAgICAgIGZvciAodWludDY0X3QgZXhwID0gMDsgZXhwIDwgMjA0NzsgZXhwKyspIHsNCiAgICAgICAgICAgIDsNCiAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjYWxsIHIoKSBpbiB0d28gc3RhdGVtZW50cyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29oZXJlbnQgc2VxdWVuY2UuDQogICAgICAgICAgICAgICAgdWludDY0X3QgdSA9IChleHAgPDwgNTIpIHwgdWludDY0X3QocigpICYgMHgwMDBGRkZGRikgPDwgMzI7DQogICAgICAgICAgICAgICAgdSB8PSB1aW50NjRfdChyKCkpOw0KICAgICAgICAgICAgICAgIGludGVybmFsOjpEb3VibGUgZCA9IGludGVybmFsOjpEb3VibGUodSk7DQoNCiAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclszMl07DQogICAgICAgICAgICAgICAgKmludGVybmFsOjpkdG9hKGQuVmFsdWUoKSwgYnVmZmVyKSA9ICdcMCc7DQoNCiAgICAgICAgICAgICAgICBTdHJpbmdTdHJlYW0gcyhidWZmZXIpOw0KICAgICAgICAgICAgICAgIFBhcnNlRG91YmxlSGFuZGxlciBoOw0KICAgICAgICAgICAgICAgIEFTU0VSVF9FUShrUGFyc2VFcnJvck5vbmUsIHJlYWRlci5QYXJzZTxmdWxsUHJlY2lzaW9uID8ga1BhcnNlRnVsbFByZWNpc2lvbkZsYWcgOiAwPihzLCBoKS5Db2RlKCkpOw0KICAgICAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgaC5zdGVwXyk7DQogICAgICAgICAgICAgICAgaW50ZXJuYWw6OkRvdWJsZSBhKGguYWN0dWFsXyk7DQogICAgICAgICAgICAgICAgaWYgKGZ1bGxQcmVjaXNpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKGQuVWludDY0VmFsdWUoKSwgYS5VaW50NjRWYWx1ZSgpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGQuVWludDY0VmFsdWUoKSAhPSBhLlVpbnQ2NFZhbHVlKCkpDQogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgU3RyaW5nOiAlc1xuICBBY3R1YWw6ICUuMTdnXG5FeHBlY3RlZDogJS4xN2dcbiIsIGJ1ZmZlciwgaC5hY3R1YWxfLCBkLlZhbHVlKCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKGQuU2lnbigpLCBhLlNpZ24oKSk7IC8vIGZvciAwLjAgIT0gLTAuMA0KICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRE9VQkxFX0VRKGQuVmFsdWUoKSwgaC5hY3R1YWxfKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyBJc3N1ZSAjMzQwDQogICAgVEVTVF9ET1VCTEUoZnVsbFByZWNpc2lvbiwgIjcuNDUwNTgwNTk2OTIzODI4ZS05IiwgNy40NTA1ODA1OTY5MjM4MjhlLTkpOw0KICAgIHsNCiAgICAgICAgaW50ZXJuYWw6OkRvdWJsZSBkKDEuMCk7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzI0OyBpKyspIHsNCiAgICAgICAgICAgIGNoYXIgYnVmZmVyWzMyXTsNCiAgICAgICAgICAgICppbnRlcm5hbDo6ZHRvYShkLlZhbHVlKCksIGJ1ZmZlcikgPSAnXDAnOw0KDQogICAgICAgICAgICBTdHJpbmdTdHJlYW0gcyhidWZmZXIpOw0KICAgICAgICAgICAgUGFyc2VEb3VibGVIYW5kbGVyIGg7DQogICAgICAgICAgICBSZWFkZXIgcmVhZGVyOw0KICAgICAgICAgICAgQVNTRVJUX0VRKGtQYXJzZUVycm9yTm9uZSwgcmVhZGVyLlBhcnNlPGZ1bGxQcmVjaXNpb24gPyBrUGFyc2VGdWxsUHJlY2lzaW9uRmxhZyA6IDA+KHMsIGgpLkNvZGUoKSk7DQogICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIGguc3RlcF8pOw0KICAgICAgICAgICAgaW50ZXJuYWw6OkRvdWJsZSBhKGguYWN0dWFsXyk7DQogICAgICAgICAgICBpZiAoZnVsbFByZWNpc2lvbikgew0KICAgICAgICAgICAgICAgIEVYUEVDVF9FUShkLlVpbnQ2NFZhbHVlKCksIGEuVWludDY0VmFsdWUoKSk7DQogICAgICAgICAgICAgICAgaWYgKGQuVWludDY0VmFsdWUoKSAhPSBhLlVpbnQ2NFZhbHVlKCkpDQogICAgICAgICAgICAgICAgICAgIHByaW50ZigiICBTdHJpbmc6ICVzXG4gIEFjdHVhbDogJS4xN2dcbkV4cGVjdGVkOiAlLjE3Z1xuIiwgYnVmZmVyLCBoLmFjdHVhbF8sIGQuVmFsdWUoKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoZC5TaWduKCksIGEuU2lnbigpKTsgLy8gZm9yIDAuMCAhPSAtMC4wDQogICAgICAgICAgICAgICAgRVhQRUNUX0RPVUJMRV9FUShkLlZhbHVlKCksIGguYWN0dWFsXyk7DQogICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgZCA9IGQuVmFsdWUoKSAqIDAuNTsNCiAgICAgICAgfQ0KICAgIH0NCiN1bmRlZiBURVNUX0RPVUJMRQ0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VOdW1iZXJfTm9ybWFsUHJlY2lzaW9uRG91YmxlKSB7DQogICAgVGVzdFBhcnNlRG91YmxlPGZhbHNlPigpOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VOdW1iZXJfRnVsbFByZWNpc2lvbkRvdWJsZSkgew0KICAgIFRlc3RQYXJzZURvdWJsZTx0cnVlPigpOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VOdW1iZXJfTm9ybWFsUHJlY2lzaW9uRXJyb3IpIHsNCiAgICBzdGF0aWMgdW5zaWduZWQgY291bnQgPSAxMDAwMDAwOw0KICAgIFJhbmRvbSByOw0KDQogICAgZG91YmxlIHVscFN1bSA9IDAuMDsNCiAgICBkb3VibGUgdWxwTWF4ID0gMC4wOw0KICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQogICAgICAgIGludGVybmFsOjpEb3VibGUgZSwgYTsNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgLy8gTmVlZCB0byBjYWxsIHIoKSBpbiB0d28gc3RhdGVtZW50cyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29oZXJlbnQgc2VxdWVuY2UuDQogICAgICAgICAgICB1aW50NjRfdCB1ID0gdWludDY0X3QocigpKSA8PCAzMjsNCiAgICAgICAgICAgIHUgfD0gdWludDY0X3QocigpKTsNCiAgICAgICAgICAgIGUgPSB1Ow0KICAgICAgICB9IHdoaWxlIChlLklzTmFuKCkgfHwgZS5Jc0luZigpIHx8ICFlLklzTm9ybWFsKCkpOw0KDQogICAgICAgIGNoYXIgYnVmZmVyWzMyXTsNCiAgICAgICAgKmludGVybmFsOjpkdG9hKGUuVmFsdWUoKSwgYnVmZmVyKSA9ICdcMCc7DQoNCiAgICAgICAgU3RyaW5nU3RyZWFtIHMoYnVmZmVyKTsNCiAgICAgICAgUGFyc2VEb3VibGVIYW5kbGVyIGg7DQogICAgICAgIFJlYWRlciByZWFkZXI7DQogICAgICAgIEFTU0VSVF9FUShrUGFyc2VFcnJvck5vbmUsIHJlYWRlci5QYXJzZShzLCBoKS5Db2RlKCkpOw0KICAgICAgICBFWFBFQ1RfRVEoMXUsIGguc3RlcF8pOw0KDQogICAgICAgIGEgPSBoLmFjdHVhbF87DQogICAgICAgIHVpbnQ2NF90IGJpYXMxID0gZS5Ub0JpYXMoKTsNCiAgICAgICAgdWludDY0X3QgYmlhczIgPSBhLlRvQmlhcygpOw0KICAgICAgICBkb3VibGUgdWxwID0gYmlhczEgPj0gYmlhczIgPyBiaWFzMSAtIGJpYXMyIDogYmlhczIgLSBiaWFzMTsNCiAgICAgICAgdWxwTWF4ID0gc3RkOjptYXgodWxwTWF4LCB1bHApOw0KICAgICAgICB1bHBTdW0gKz0gdWxwOw0KICAgIH0NCiAgICBwcmludGYoIlVMUCBBdmVyYWdlID0gJWcsIE1heCA9ICVnIFxuIiwgdWxwU3VtIC8gY291bnQsIHVscE1heCk7DQp9DQoNClRFU1QoUmVhZGVyLCBQYXJzZU51bWJlcl9FcnJvcikgew0KI2RlZmluZSBURVNUX05VTUJFUl9FUlJPUihlcnJvckNvZGUsIHN0cikgXA0KICAgIHsgXA0KICAgICAgICBjaGFyIGJ1ZmZlclsxMDAxXTsgXA0KICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVzIiwgc3RyKTsgXA0KICAgICAgICBJbnNpdHVTdHJpbmdTdHJlYW0gcyhidWZmZXIpOyBcDQogICAgICAgIEJhc2VSZWFkZXJIYW5kbGVyPD4gaDsgXA0KICAgICAgICBSZWFkZXIgcmVhZGVyOyBcDQogICAgICAgIEVYUEVDVF9GQUxTRShyZWFkZXIuUGFyc2UocywgaCkpOyBcDQogICAgICAgIEVYUEVDVF9FUShlcnJvckNvZGUsIHJlYWRlci5HZXRQYXJzZUVycm9yQ29kZSgpKTtcDQogICAgfQ0KDQogICAgLy8gTnVtYmVyIHRvbyBiaWcgdG8gYmUgc3RvcmVkIGluIGRvdWJsZS4NCiAgICB7DQogICAgICAgIGNoYXIgbjFlMzA5WzMxMV07ICAgLy8gJzEnIGZvbGxvd2VkIGJ5IDMwOSAnMCcNCiAgICAgICAgbjFlMzA5WzBdID0gJzEnOw0KICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDMxMDsgaSsrKQ0KICAgICAgICAgICAgbjFlMzA5W2ldID0gJzAnOw0KICAgICAgICBuMWUzMDlbMzEwXSA9ICdcMCc7DQogICAgICAgIFRFU1RfTlVNQkVSX0VSUk9SKGtQYXJzZUVycm9yTnVtYmVyVG9vQmlnLCBuMWUzMDkpOw0KICAgIH0NCiAgICBURVNUX05VTUJFUl9FUlJPUihrUGFyc2VFcnJvck51bWJlclRvb0JpZywgIjFlMzA5Iik7DQoNCiAgICAvLyBNaXNzIGZyYWN0aW9uIHBhcnQgaW4gbnVtYmVyLg0KICAgIFRFU1RfTlVNQkVSX0VSUk9SKGtQYXJzZUVycm9yTnVtYmVyTWlzc0ZyYWN0aW9uLCAiMS4iKTsNCiAgICBURVNUX05VTUJFUl9FUlJPUihrUGFyc2VFcnJvck51bWJlck1pc3NGcmFjdGlvbiwgIjEuYSIpOw0KDQogICAgLy8gTWlzcyBleHBvbmVudCBpbiBudW1iZXIuDQogICAgVEVTVF9OVU1CRVJfRVJST1Ioa1BhcnNlRXJyb3JOdW1iZXJNaXNzRXhwb25lbnQsICIxZSIpOw0KICAgIFRFU1RfTlVNQkVSX0VSUk9SKGtQYXJzZUVycm9yTnVtYmVyTWlzc0V4cG9uZW50LCAiMWVfIik7DQoNCiN1bmRlZiBURVNUX05VTUJFUl9FUlJPUg0KfQ0KDQp0ZW1wbGF0ZSA8dHlwZW5hbWUgRW5jb2Rpbmc+DQpzdHJ1Y3QgUGFyc2VTdHJpbmdIYW5kbGVyIDogQmFzZVJlYWRlckhhbmRsZXI8RW5jb2RpbmcsIFBhcnNlU3RyaW5nSGFuZGxlcjxFbmNvZGluZz4gPiB7DQogICAgUGFyc2VTdHJpbmdIYW5kbGVyKCkgOiBzdHJfKDApLCBsZW5ndGhfKDApLCBjb3B5XygpIHt9DQogICAgflBhcnNlU3RyaW5nSGFuZGxlcigpIHsgRVhQRUNUX1RSVUUoc3RyXyAhPSAwKTsgaWYgKGNvcHlfKSBmcmVlKGNvbnN0X2Nhc3Q8dHlwZW5hbWUgRW5jb2Rpbmc6OkNoKj4oc3RyXykpOyB9DQogICAgDQogICAgUGFyc2VTdHJpbmdIYW5kbGVyKGNvbnN0IFBhcnNlU3RyaW5nSGFuZGxlciYpOw0KICAgIFBhcnNlU3RyaW5nSGFuZGxlciYgb3BlcmF0b3I9KGNvbnN0IFBhcnNlU3RyaW5nSGFuZGxlciYpOw0KDQogICAgYm9vbCBEZWZhdWx0KCkgeyBBRERfRkFJTFVSRSgpOyByZXR1cm4gZmFsc2U7IH0NCiAgICBib29sIFN0cmluZyhjb25zdCB0eXBlbmFtZSBFbmNvZGluZzo6Q2gqIHN0ciwgc2l6ZV90IGxlbmd0aCwgYm9vbCBjb3B5KSB7IA0KICAgICAgICBFWFBFQ1RfRVEoMCwgc3RyXyk7DQogICAgICAgIGlmIChjb3B5KSB7DQogICAgICAgICAgICBzdHJfID0gKHR5cGVuYW1lIEVuY29kaW5nOjpDaCopbWFsbG9jKChsZW5ndGggKyAxKSAqIHNpemVvZih0eXBlbmFtZSBFbmNvZGluZzo6Q2gpKTsNCiAgICAgICAgICAgIG1lbWNweShjb25zdF9jYXN0PHR5cGVuYW1lIEVuY29kaW5nOjpDaCo+KHN0cl8pLCBzdHIsIChsZW5ndGggKyAxKSAqIHNpemVvZih0eXBlbmFtZSBFbmNvZGluZzo6Q2gpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgICAgICBzdHJfID0gc3RyOw0KICAgICAgICBsZW5ndGhfID0gbGVuZ3RoOyANCiAgICAgICAgY29weV8gPSBjb3B5Ow0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICBjb25zdCB0eXBlbmFtZSBFbmNvZGluZzo6Q2gqIHN0cl87DQogICAgc2l6ZV90IGxlbmd0aF87DQogICAgYm9vbCBjb3B5XzsNCn07DQoNClRFU1QoUmVhZGVyLCBQYXJzZVN0cmluZykgew0KI2RlZmluZSBURVNUX1NUUklORyhFbmNvZGluZywgZSwgeCkgXA0KICAgIHsgXA0KICAgICAgICBFbmNvZGluZzo6Q2gqIGJ1ZmZlciA9IFN0ckR1cCh4KTsgXA0KICAgICAgICBHZW5lcmljSW5zaXR1U3RyaW5nU3RyZWFtPEVuY29kaW5nPiBpcyhidWZmZXIpOyBcDQogICAgICAgIFBhcnNlU3RyaW5nSGFuZGxlcjxFbmNvZGluZz4gaDsgXA0KICAgICAgICBHZW5lcmljUmVhZGVyPEVuY29kaW5nLCBFbmNvZGluZz4gcmVhZGVyOyBcDQogICAgICAgIHJlYWRlci5QYXJzZTxrUGFyc2VJbnNpdHVGbGFnIHwga1BhcnNlVmFsaWRhdGVFbmNvZGluZ0ZsYWc+KGlzLCBoKTsgXA0KICAgICAgICBFWFBFQ1RfRVEoMCwgU3RyQ21wPEVuY29kaW5nOjpDaD4oZSwgaC5zdHJfKSk7IFwNCiAgICAgICAgRVhQRUNUX0VRKFN0ckxlbihlKSwgaC5sZW5ndGhfKTsgXA0KICAgICAgICBmcmVlKGJ1ZmZlcik7IFwNCiAgICAgICAgR2VuZXJpY1N0cmluZ1N0cmVhbTxFbmNvZGluZz4gcyh4KTsgXA0KICAgICAgICBQYXJzZVN0cmluZ0hhbmRsZXI8RW5jb2Rpbmc+IGgyOyBcDQogICAgICAgIEdlbmVyaWNSZWFkZXI8RW5jb2RpbmcsIEVuY29kaW5nPiByZWFkZXIyOyBcDQogICAgICAgIHJlYWRlcjIuUGFyc2UocywgaDIpOyBcDQogICAgICAgIEVYUEVDVF9FUSgwLCBTdHJDbXA8RW5jb2Rpbmc6OkNoPihlLCBoMi5zdHJfKSk7IFwNCiAgICAgICAgRVhQRUNUX0VRKFN0ckxlbihlKSwgaDIubGVuZ3RoXyk7IFwNCiAgICB9DQoNCiAgICAvLyBTdHJpbmcgY29uc3RhbnQgTCJceFhYIiBjYW4gb25seSBzcGVjaWZ5IGNoYXJhY3RlciBjb2RlIGluIGJ5dGVzLCB3aGljaCBpcyBub3QgZW5kaWFubmVzcy1uZXV0cmFsLiANCiAgICAvLyBBbmQgb2xkIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgdSIiIGFuZCBVIiIgc3RyaW5nIGxpdGVyYWwuIFNvIGhlcmUgc3BlY2lmeSBzdHJpbmcgbGl0ZXJhbCBieSBhcnJheSBvZiBDaC4NCiAgICAvLyBJbiBhZGRpdGlvbiwgR0NDIDQuOCBnZW5lcmF0ZXMgLVduYXJyb3dpbmcgd2FybmluZ3Mgd2hlbiBjaGFyYWN0ZXIgY29kZSA+PSAxMjggYXJlIGFzc2lnbmVkIHRvIHNpZ25lZCBpbnRlZ2VyIHR5cGVzLg0KICAgIC8vIFRoZXJlZm9yZSwgdXR5cGUgaXMgYWRkZWQgZm9yIGRlY2xhcmluZyB1bnNpZ25lZCBhcnJheSwgYW5kIHRoZW4gY2FzdCBpdCB0byBFbmNvZGluZzo6Q2guDQojZGVmaW5lIEFSUkFZKC4uLikgeyBfX1ZBX0FSR1NfXyB9DQojZGVmaW5lIFRFU1RfU1RSSU5HQVJSQVkoRW5jb2RpbmcsIHV0eXBlLCBhcnJheSwgeCkgXA0KICAgIHsgXA0KICAgICAgICBzdGF0aWMgY29uc3QgdXR5cGUgdWVbXSA9IGFycmF5OyBcDQogICAgICAgIHN0YXRpYyBjb25zdCBFbmNvZGluZzo6Q2gqIGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEVuY29kaW5nOjpDaCAqPigmdWVbMF0pOyBcDQogICAgICAgIFRFU1RfU1RSSU5HKEVuY29kaW5nLCBlLCB4KTsgXA0KICAgIH0NCg0KI2RlZmluZSBURVNUX1NUUklOR0FSUkFZMihFbmNvZGluZywgdXR5cGUsIGVhcnJheSwgeGFycmF5KSBcDQogICAgeyBcDQogICAgICAgIHN0YXRpYyBjb25zdCB1dHlwZSB1ZVtdID0gZWFycmF5OyBcDQogICAgICAgIHN0YXRpYyBjb25zdCB1dHlwZSB4ZVtdID0geGFycmF5OyBcDQogICAgICAgIHN0YXRpYyBjb25zdCBFbmNvZGluZzo6Q2gqIGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEVuY29kaW5nOjpDaCAqPigmdWVbMF0pOyBcDQogICAgICAgIHN0YXRpYyBjb25zdCBFbmNvZGluZzo6Q2gqIHggPSByZWludGVycHJldF9jYXN0PGNvbnN0IEVuY29kaW5nOjpDaCAqPigmeGVbMF0pOyBcDQogICAgICAgIFRFU1RfU1RSSU5HKEVuY29kaW5nLCBlLCB4KTsgXA0KICAgIH0NCg0KICAgIFRFU1RfU1RSSU5HKFVURjg8PiwgIiIsICJcIlwiIik7DQogICAgVEVTVF9TVFJJTkcoVVRGODw+LCAiSGVsbG8iLCAiXCJIZWxsb1wiIik7DQogICAgVEVTVF9TVFJJTkcoVVRGODw+LCAiSGVsbG9cbldvcmxkIiwgIlwiSGVsbG9cXG5Xb3JsZFwiIik7DQogICAgVEVTVF9TVFJJTkcoVVRGODw+LCAiXCJcXC9cYlxmXG5cclx0IiwgIlwiXFxcIlxcXFwvXFxiXFxmXFxuXFxyXFx0XCIiKTsNCiAgICBURVNUX1NUUklORyhVVEY4PD4sICJceDI0IiwgIlwiXFx1MDAyNFwiIik7ICAgICAgICAgLy8gRG9sbGFyIHNpZ24gVSswMDI0DQogICAgVEVTVF9TVFJJTkcoVVRGODw+LCAiXHhDMlx4QTIiLCAiXCJcXHUwMEEyXCIiKTsgICAgIC8vIENlbnRzIHNpZ24gVSswMEEyDQogICAgVEVTVF9TVFJJTkcoVVRGODw+LCAiXHhFMlx4ODJceEFDIiwgIlwiXFx1MjBBQ1wiIik7IC8vIEV1cm8gc2lnbiBVKzIwQUMNCiAgICBURVNUX1NUUklORyhVVEY4PD4sICJceEYwXHg5RFx4ODRceDlFIiwgIlwiXFx1RDgzNFxcdUREMUVcIiIpOyAgLy8gRyBjbGVmIHNpZ24gVSsxRDExRQ0KDQogICAgLy8gVVRGMTYNCiAgICBURVNUX1NUUklORyhVVEYxNjw+LCBMIiIsIEwiXCJcIiIpOw0KICAgIFRFU1RfU1RSSU5HKFVURjE2PD4sIEwiSGVsbG8iLCBMIlwiSGVsbG9cIiIpOw0KICAgIFRFU1RfU1RSSU5HKFVURjE2PD4sIEwiSGVsbG9cbldvcmxkIiwgTCJcIkhlbGxvXFxuV29ybGRcIiIpOw0KICAgIFRFU1RfU1RSSU5HKFVURjE2PD4sIEwiXCJcXC9cYlxmXG5cclx0IiwgTCJcIlxcXCJcXFxcL1xcYlxcZlxcblxcclxcdFwiIik7DQogICAgVEVTVF9TVFJJTkdBUlJBWShVVEYxNjw+LCB3Y2hhcl90LCBBUlJBWSgweDAwMjQsIDB4MDAwMCksIEwiXCJcXHUwMDI0XCIiKTsNCiAgICBURVNUX1NUUklOR0FSUkFZKFVURjE2PD4sIHdjaGFyX3QsIEFSUkFZKDB4MDBBMiwgMHgwMDAwKSwgTCJcIlxcdTAwQTJcIiIpOyAgLy8gQ2VudHMgc2lnbiBVKzAwQTINCiAgICBURVNUX1NUUklOR0FSUkFZKFVURjE2PD4sIHdjaGFyX3QsIEFSUkFZKDB4MjBBQywgMHgwMDAwKSwgTCJcIlxcdTIwQUNcIiIpOyAgLy8gRXVybyBzaWduIFUrMjBBQw0KICAgIFRFU1RfU1RSSU5HQVJSQVkoVVRGMTY8Piwgd2NoYXJfdCwgQVJSQVkoMHhEODM0LCAweEREMUUsIDB4MDAwMCksIEwiXCJcXHVEODM0XFx1REQxRVwiIik7ICAgLy8gRyBjbGVmIHNpZ24gVSsxRDExRQ0KDQogICAgLy8gVVRGMzINCiAgICBURVNUX1NUUklOR0FSUkFZMihVVEYzMjw+LCB1bnNpZ25lZCwgQVJSQVkoJ1wwJyksIEFSUkFZKCdcIicsICdcIicsICdcMCcpKTsNCiAgICBURVNUX1NUUklOR0FSUkFZMihVVEYzMjw+LCB1bnNpZ25lZCwgQVJSQVkoJ0gnLCAnZScsICdsJywgJ2wnLCAnbycsICdcMCcpLCBBUlJBWSgnXCInLCAnSCcsICdlJywgJ2wnLCAnbCcsICdvJywgJ1wiJywgJ1wwJykpOw0KICAgIFRFU1RfU1RSSU5HQVJSQVkyKFVURjMyPD4sIHVuc2lnbmVkLCBBUlJBWSgnSCcsICdlJywgJ2wnLCAnbCcsICdvJywgJ1xuJywgJ1cnLCAnbycsICdyJywgJ2wnLCAnZCcsICdcMCcpLCBBUlJBWSgnXCInLCAnSCcsICdlJywgJ2wnLCAnbCcsICdvJywgJ1xcJywgJ24nLCAnVycsICdvJywgJ3InLCAnbCcsICdkJywgJ1wiJywgJ1wwJykpOw0KICAgIFRFU1RfU1RSSU5HQVJSQVkyKFVURjMyPD4sIHVuc2lnbmVkLCBBUlJBWSgnXCInLCAnXFwnLCAnLycsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsICdcMCcpLCBBUlJBWSgnXCInLCAnXFwnLCAnXCInLCAnXFwnLCAnXFwnLCAnLycsICdcXCcsICdiJywgJ1xcJywgJ2YnLCAnXFwnLCAnbicsICdcXCcsICdyJywgJ1xcJywgJ3QnLCAnXCInLCAnXDAnKSk7DQogICAgVEVTVF9TVFJJTkdBUlJBWTIoVVRGMzI8PiwgdW5zaWduZWQsIEFSUkFZKDB4MDAwMjQsIDB4MDAwMCksIEFSUkFZKCdcIicsICdcXCcsICd1JywgJzAnLCAnMCcsICcyJywgJzQnLCAnXCInLCAnXDAnKSk7DQogICAgVEVTVF9TVFJJTkdBUlJBWTIoVVRGMzI8PiwgdW5zaWduZWQsIEFSUkFZKDB4MDAwQTIsIDB4MDAwMCksIEFSUkFZKCdcIicsICdcXCcsICd1JywgJzAnLCAnMCcsICdBJywgJzInLCAnXCInLCAnXDAnKSk7ICAgLy8gQ2VudHMgc2lnbiBVKzAwQTINCiAgICBURVNUX1NUUklOR0FSUkFZMihVVEYzMjw+LCB1bnNpZ25lZCwgQVJSQVkoMHgwMjBBQywgMHgwMDAwKSwgQVJSQVkoJ1wiJywgJ1xcJywgJ3UnLCAnMicsICcwJywgJ0EnLCAnQycsICdcIicsICdcMCcpKTsgICAvLyBFdXJvIHNpZ24gVSsyMEFDDQogICAgVEVTVF9TVFJJTkdBUlJBWTIoVVRGMzI8PiwgdW5zaWduZWQsIEFSUkFZKDB4MUQxMUUsIDB4MDAwMCksIEFSUkFZKCdcIicsICdcXCcsICd1JywgJ0QnLCAnOCcsICczJywgJzQnLCAnXFwnLCAndScsICdEJywgJ0QnLCAnMScsICdFJywgJ1wiJywgJ1wwJykpOyAgICAvLyBHIGNsZWYgc2lnbiBVKzFEMTFFDQoNCiN1bmRlZiBURVNUX1NUUklOR0FSUkFZDQojdW5kZWYgQVJSQVkNCiN1bmRlZiBURVNUX1NUUklORw0KDQogICAgLy8gU3VwcG9ydCBvZiBudWxsIGNoYXJhY3RlciBpbiBzdHJpbmcNCiAgICB7DQogICAgICAgIFN0cmluZ1N0cmVhbSBzKCJcIkhlbGxvXFx1MDAwMFdvcmxkXCIiKTsNCiAgICAgICAgY29uc3QgY2hhciBlW10gPSAiSGVsbG9cMFdvcmxkIjsNCiAgICAgICAgUGFyc2VTdHJpbmdIYW5kbGVyPFVURjg8PiA+IGg7DQogICAgICAgIFJlYWRlciByZWFkZXI7DQogICAgICAgIHJlYWRlci5QYXJzZShzLCBoKTsNCiAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChlLCBoLnN0cl8sIGgubGVuZ3RoXyArIDEpKTsNCiAgICAgICAgRVhQRUNUX0VRKDExdSwgaC5sZW5ndGhfKTsNCiAgICB9DQp9DQoNClRFU1QoUmVhZGVyLCBQYXJzZVN0cmluZ19UcmFuc2NvZGluZykgew0KICAgIGNvbnN0IGNoYXIqIHggPSAiXCJIZWxsb1wiIjsNCiAgICBjb25zdCB3Y2hhcl90KiBlID0gTCJIZWxsbyI7DQogICAgR2VuZXJpY1N0cmluZ1N0cmVhbTxVVEY4PD4gPiBpcyh4KTsNCiAgICBHZW5lcmljUmVhZGVyPFVURjg8PiwgVVRGMTY8PiA+IHJlYWRlcjsNCiAgICBQYXJzZVN0cmluZ0hhbmRsZXI8VVRGMTY8PiA+IGg7DQogICAgcmVhZGVyLlBhcnNlKGlzLCBoKTsNCiAgICBFWFBFQ1RfRVEoMCwgU3RyQ21wPFVURjE2PD46OkNoPihlLCBoLnN0cl8pKTsNCiAgICBFWFBFQ1RfRVEoU3RyTGVuKGUpLCBoLmxlbmd0aF8pOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VTdHJpbmdfVHJhbnNjb2RpbmdXaXRoVmFsaWRhdGlvbikgew0KICAgIGNvbnN0IGNoYXIqIHggPSAiXCJIZWxsb1wiIjsNCiAgICBjb25zdCB3Y2hhcl90KiBlID0gTCJIZWxsbyI7DQogICAgR2VuZXJpY1N0cmluZ1N0cmVhbTxVVEY4PD4gPiBpcyh4KTsNCiAgICBHZW5lcmljUmVhZGVyPFVURjg8PiwgVVRGMTY8PiA+IHJlYWRlcjsNCiAgICBQYXJzZVN0cmluZ0hhbmRsZXI8VVRGMTY8PiA+IGg7DQogICAgcmVhZGVyLlBhcnNlPGtQYXJzZVZhbGlkYXRlRW5jb2RpbmdGbGFnPihpcywgaCk7DQogICAgRVhQRUNUX0VRKDAsIFN0ckNtcDxVVEYxNjw+OjpDaD4oZSwgaC5zdHJfKSk7DQogICAgRVhQRUNUX0VRKFN0ckxlbihlKSwgaC5sZW5ndGhfKTsNCn0NCg0KVEVTVChSZWFkZXIsIFBhcnNlU3RyaW5nX05vbkRlc3RydWN0aXZlKSB7DQogICAgU3RyaW5nU3RyZWFtIHMoIlwiSGVsbG9cXG5Xb3JsZFwiIik7DQogICAgUGFyc2VTdHJpbmdIYW5kbGVyPFVURjg8PiA+IGg7DQogICAgUmVhZGVyIHJlYWRlcjsNCiAgICByZWFkZXIuUGFyc2UocywgaCk7DQogICAgRVhQRUNUX0VRKDAsIFN0ckNtcCgiSGVsbG9cbldvcmxkIiwgaC5zdHJfKSk7DQogICAgRVhQRUNUX0VRKDExdSwgaC5sZW5ndGhfKTsNCn0NCg0KdGVtcGxhdGUgPHR5cGVuYW1lIEVuY29kaW5nPg0KUGFyc2VFcnJvckNvZGUgVGVzdFN0cmluZyhjb25zdCB0eXBlbmFtZSBFbmNvZGluZzo6Q2gqIHN0cikgew0KICAgIEdlbmVyaWNTdHJpbmdTdHJlYW08RW5jb2Rpbmc+IHMoc3RyKTsNCiAgICBCYXNlUmVhZGVySGFuZGxlcjxFbmNvZGluZz4gaDsNCiAgICBHZW5lcmljUmVhZGVyPEVuY29kaW5nLCBFbmNvZGluZz4gcmVhZGVyOw0KICAgIHJlYWRlci50ZW1wbGF0ZSBQYXJzZTxrUGFyc2VWYWxpZGF0ZUVuY29kaW5nRmxhZz4ocywgaCk7DQogICAgcmV0dXJuIHJlYWRlci5HZXRQYXJzZUVycm9yQ29kZSgpOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VTdHJpbmdfRXJyb3IpIHsNCiNkZWZpbmUgVEVTVF9TVFJJTkdfRVJST1IoZXJyb3JDb2RlLCBzdHIpXA0KICAgICAgICBFWFBFQ1RfRVEoZXJyb3JDb2RlLCBUZXN0U3RyaW5nPFVURjg8PiA+KHN0cikpDQoNCiNkZWZpbmUgQVJSQVkoLi4uKSB7IF9fVkFfQVJHU19fIH0NCiNkZWZpbmUgVEVTVF9TVFJJTkdFTkNPRElOR19FUlJPUihFbmNvZGluZywgVGFyZ2V0RW5jb2RpbmcsIHV0eXBlLCBhcnJheSkgXA0KICAgIHsgXA0KICAgICAgICBzdGF0aWMgY29uc3QgdXR5cGUgdWVbXSA9IGFycmF5OyBcDQogICAgICAgIHN0YXRpYyBjb25zdCBFbmNvZGluZzo6Q2gqIGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEVuY29kaW5nOjpDaCAqPigmdWVbMF0pOyBcDQogICAgICAgIEVYUEVDVF9FUShrUGFyc2VFcnJvclN0cmluZ0ludmFsaWRFbmNvZGluZywgVGVzdFN0cmluZzxFbmNvZGluZz4oZSkpO1wNCiAgICAgICAgLyogZGVjb2RlIGVycm9yICovXA0KICAgICAgICBHZW5lcmljU3RyaW5nU3RyZWFtPEVuY29kaW5nPiBzKGUpO1wNCiAgICAgICAgQmFzZVJlYWRlckhhbmRsZXI8VGFyZ2V0RW5jb2Rpbmc+IGg7XA0KICAgICAgICBHZW5lcmljUmVhZGVyPEVuY29kaW5nLCBUYXJnZXRFbmNvZGluZz4gcmVhZGVyO1wNCiAgICAgICAgcmVhZGVyLlBhcnNlKHMsIGgpO1wNCiAgICAgICAgRVhQRUNUX0VRKGtQYXJzZUVycm9yU3RyaW5nSW52YWxpZEVuY29kaW5nLCByZWFkZXIuR2V0UGFyc2VFcnJvckNvZGUoKSk7XA0KICAgIH0NCg0KICAgIC8vIEludmFsaWQgZXNjYXBlIGNoYXJhY3RlciBpbiBzdHJpbmcuDQogICAgVEVTVF9TVFJJTkdfRVJST1Ioa1BhcnNlRXJyb3JTdHJpbmdFc2NhcGVJbnZhbGlkLCAiW1wiXFxhXCJdIik7DQoNCiAgICAvLyBJbmNvcnJlY3QgaGV4IGRpZ2l0IGFmdGVyIFxcdSBlc2NhcGUgaW4gc3RyaW5nLg0KICAgIFRFU1RfU1RSSU5HX0VSUk9SKGtQYXJzZUVycm9yU3RyaW5nVW5pY29kZUVzY2FwZUludmFsaWRIZXgsICJbXCJcXHVBQkNHXCJdIik7DQoNCiAgICAvLyBRdW90YXRpb24gaW4gXFx1IGVzY2FwZSBpbiBzdHJpbmcgKElzc3VlICMyODgpDQogICAgVEVTVF9TVFJJTkdfRVJST1Ioa1BhcnNlRXJyb3JTdHJpbmdVbmljb2RlRXNjYXBlSW52YWxpZEhleCwgIltcIlxcdWFhYVwiXSIpOw0KICAgIFRFU1RfU1RSSU5HX0VSUk9SKGtQYXJzZUVycm9yU3RyaW5nVW5pY29kZUVzY2FwZUludmFsaWRIZXgsICJbXCJcXHVEODAwXFx1RkZGXCJdIik7DQoNCiAgICAvLyBUaGUgc3Vycm9nYXRlIHBhaXIgaW4gc3RyaW5nIGlzIGludmFsaWQuDQogICAgVEVTVF9TVFJJTkdfRVJST1Ioa1BhcnNlRXJyb3JTdHJpbmdVbmljb2RlU3Vycm9nYXRlSW52YWxpZCwgIltcIlxcdUQ4MDBYXCJdIik7DQogICAgVEVTVF9TVFJJTkdfRVJST1Ioa1BhcnNlRXJyb3JTdHJpbmdVbmljb2RlU3Vycm9nYXRlSW52YWxpZCwgIltcIlxcdUQ4MDBcXHVGRkZGXCJdIik7DQoNCiAgICAvLyBNaXNzaW5nIGEgY2xvc2luZyBxdW90YXRpb24gbWFyayBpbiBzdHJpbmcuDQogICAgVEVTVF9TVFJJTkdfRVJST1Ioa1BhcnNlRXJyb3JTdHJpbmdNaXNzUXVvdGF0aW9uTWFyaywgIltcIlRlc3RdIik7DQoNCiAgICAvLyBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzL2V4YW1wbGVzL1VURi04LXRlc3QudHh0DQoNCiAgICAvLyAzICBNYWxmb3JtZWQgc2VxdWVuY2VzIA0KDQogICAgLy8gMy4xIFVuZXhwZWN0ZWQgY29udGludWF0aW9uIGJ5dGVzDQogICAgew0KICAgICAgICAgY2hhciBlW10gPSB7ICdbJywgJ1wiJywgMCwgJ1wiJywgJ10nLCAnXDAnIH07DQogICAgICAgICBmb3IgKHVuc2lnbmVkIGNoYXIgYyA9IDB4ODB1OyBjIDw9IDB4QkZ1OyBjKyspIHsNCiAgICAgICAgICAgIGVbMl0gPSBjOw0KICAgICAgICAgICAgUGFyc2VFcnJvckNvZGUgZXJyb3IgPSBUZXN0U3RyaW5nPFVURjg8PiA+KGUpOw0KICAgICAgICAgICAgRVhQRUNUX0VRKGtQYXJzZUVycm9yU3RyaW5nSW52YWxpZEVuY29kaW5nLCBlcnJvcik7DQogICAgICAgICAgICBpZiAoZXJyb3IgIT0ga1BhcnNlRXJyb3JTdHJpbmdJbnZhbGlkRW5jb2RpbmcpDQogICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICh1bnNpZ25lZCkodW5zaWduZWQgY2hhciljIDw8IHN0ZDo6ZW5kbDsNCiAgICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAzLjIgTG9uZWx5IHN0YXJ0IGNoYXJhY3RlcnMsIDMuNSBJbXBvc3NpYmxlIGJ5dGVzDQogICAgew0KICAgICAgICBjaGFyIGVbXSA9IHsgJ1snLCAnXCInLCAwLCAnICcsICdcIicsICddJywgJ1wwJyB9Ow0KICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAweEMwdTsgYyA8PSAweEZGdTsgYysrKSB7DQogICAgICAgICAgICBlWzJdID0gKGNoYXIpYzsNCiAgICAgICAgICAgIFRFU1RfU1RSSU5HX0VSUk9SKGtQYXJzZUVycm9yU3RyaW5nSW52YWxpZEVuY29kaW5nLCBlKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIDQgIE92ZXJsb25nIHNlcXVlbmNlcyANCg0KICAgIC8vIDQuMSAgRXhhbXBsZXMgb2YgYW4gb3ZlcmxvbmcgQVNDSUkgY2hhcmFjdGVyDQogICAgVEVTVF9TVFJJTkdFTkNPRElOR19FUlJPUihVVEY4PD4sIFVURjE2PD4sIHVuc2lnbmVkIGNoYXIsIEFSUkFZKCdbJywgJ1wiJywgMHhDMHUsIDB4QUZ1LCAnXCInLCAnXScsICdcMCcpKTsNCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjg8PiwgVVRGMTY8PiwgdW5zaWduZWQgY2hhciwgQVJSQVkoJ1snLCAnXCInLCAweEUwdSwgMHg4MHUsIDB4QUZ1LCAnXCInLCAnXScsICdcMCcpKTsNCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjg8PiwgVVRGMTY8PiwgdW5zaWduZWQgY2hhciwgQVJSQVkoJ1snLCAnXCInLCAweEYwdSwgMHg4MHUsIDB4ODB1LCAweEFGdSwgJ1wiJywgJ10nLCAnXDAnKSk7DQoNCiAgICAvLyA0LjIgIE1heGltdW0gb3Zlcmxvbmcgc2VxdWVuY2VzIA0KICAgIFRFU1RfU1RSSU5HRU5DT0RJTkdfRVJST1IoVVRGODw+LCBVVEYxNjw+LCB1bnNpZ25lZCBjaGFyLCBBUlJBWSgnWycsICdcIicsIDB4QzF1LCAweEJGdSwgJ1wiJywgJ10nLCAnXDAnKSk7DQogICAgVEVTVF9TVFJJTkdFTkNPRElOR19FUlJPUihVVEY4PD4sIFVURjE2PD4sIHVuc2lnbmVkIGNoYXIsIEFSUkFZKCdbJywgJ1wiJywgMHhFMHUsIDB4OUZ1LCAweEJGdSwgJ1wiJywgJ10nLCAnXDAnKSk7DQogICAgVEVTVF9TVFJJTkdFTkNPRElOR19FUlJPUihVVEY4PD4sIFVURjE2PD4sIHVuc2lnbmVkIGNoYXIsIEFSUkFZKCdbJywgJ1wiJywgMHhGMHUsIDB4OEZ1LCAweEJGdSwgMHhCRnUsICdcIicsICddJywgJ1wwJykpOw0KDQogICAgLy8gNC4zICBPdmVybG9uZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgTlVMIGNoYXJhY3RlciANCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjg8PiwgVVRGMTY8PiwgdW5zaWduZWQgY2hhciwgQVJSQVkoJ1snLCAnXCInLCAweEMwdSwgMHg4MHUsICdcIicsICddJywgJ1wwJykpOw0KICAgIFRFU1RfU1RSSU5HRU5DT0RJTkdfRVJST1IoVVRGODw+LCBVVEYxNjw+LCB1bnNpZ25lZCBjaGFyLCBBUlJBWSgnWycsICdcIicsIDB4RTB1LCAweDgwdSwgMHg4MHUsICdcIicsICddJywgJ1wwJykpOw0KICAgIFRFU1RfU1RSSU5HRU5DT0RJTkdfRVJST1IoVVRGODw+LCBVVEYxNjw+LCB1bnNpZ25lZCBjaGFyLCBBUlJBWSgnWycsICdcIicsIDB4RjB1LCAweDgwdSwgMHg4MHUsIDB4ODB1LCAnXCInLCAnXScsICdcMCcpKTsNCg0KICAgIC8vIDUgIElsbGVnYWwgY29kZSBwb3NpdGlvbnMNCg0KICAgIC8vIDUuMSBTaW5nbGUgVVRGLTE2IHN1cnJvZ2F0ZXMNCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjg8PiwgVVRGMTY8PiwgdW5zaWduZWQgY2hhciwgQVJSQVkoJ1snLCAnXCInLCAweEVEdSwgMHhBMHUsIDB4ODB1LCAnXCInLCAnXScsICdcMCcpKTsNCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjg8PiwgVVRGMTY8PiwgdW5zaWduZWQgY2hhciwgQVJSQVkoJ1snLCAnXCInLCAweEVEdSwgMHhBRHUsIDB4QkZ1LCAnXCInLCAnXScsICdcMCcpKTsNCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjg8PiwgVVRGMTY8PiwgdW5zaWduZWQgY2hhciwgQVJSQVkoJ1snLCAnXCInLCAweEVEdSwgMHhBRXUsIDB4ODB1LCAnXCInLCAnXScsICdcMCcpKTsNCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjg8PiwgVVRGMTY8PiwgdW5zaWduZWQgY2hhciwgQVJSQVkoJ1snLCAnXCInLCAweEVEdSwgMHhBRnUsIDB4QkZ1LCAnXCInLCAnXScsICdcMCcpKTsNCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjg8PiwgVVRGMTY8PiwgdW5zaWduZWQgY2hhciwgQVJSQVkoJ1snLCAnXCInLCAweEVEdSwgMHhCMHUsIDB4ODB1LCAnXCInLCAnXScsICdcMCcpKTsNCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjg8PiwgVVRGMTY8PiwgdW5zaWduZWQgY2hhciwgQVJSQVkoJ1snLCAnXCInLCAweEVEdSwgMHhCRXUsIDB4ODB1LCAnXCInLCAnXScsICdcMCcpKTsNCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjg8PiwgVVRGMTY8PiwgdW5zaWduZWQgY2hhciwgQVJSQVkoJ1snLCAnXCInLCAweEVEdSwgMHhCRnUsIDB4QkZ1LCAnXCInLCAnXScsICdcMCcpKTsNCg0KICAgIC8vIE1hbGZvcm0gVVRGLTE2IHNlcXVlbmNlcw0KICAgIFRFU1RfU1RSSU5HRU5DT0RJTkdfRVJST1IoVVRGMTY8PiwgVVRGODw+LCB3Y2hhcl90LCBBUlJBWSgnWycsICdcIicsIDB4REMwMCwgMHhEQzAwLCAnXCInLCAnXScsICdcMCcpKTsNCiAgICBURVNUX1NUUklOR0VOQ09ESU5HX0VSUk9SKFVURjE2PD4sIFVURjg8Piwgd2NoYXJfdCwgQVJSQVkoJ1snLCAnXCInLCAweEQ4MDAsIDB4RDgwMCwgJ1wiJywgJ10nLCAnXDAnKSk7DQoNCiAgICAvLyBNYWxmb3JtIFVURi0zMiBzZXF1ZW5jZQ0KICAgIFRFU1RfU1RSSU5HRU5DT0RJTkdfRVJST1IoVVRGMzI8PiwgVVRGODw+LCB1bnNpZ25lZCwgQVJSQVkoJ1snLCAnXCInLCAweDExMDAwMCwgJ1wiJywgJ10nLCAnXDAnKSk7DQoNCiAgICAvLyBNYWxmb3JtIEFTQ0lJIHNlcXVlbmNlDQogICAgVEVTVF9TVFJJTkdFTkNPRElOR19FUlJPUihBU0NJSTw+LCBVVEY4PD4sIGNoYXIsIEFSUkFZKCdbJywgJ1wiJywgY2hhcigweDgwKSwgJ1wiJywgJ10nLCAnXDAnKSk7DQoNCiN1bmRlZiBBUlJBWQ0KI3VuZGVmIFRFU1RfU1RSSU5HQVJSQVlfRVJST1INCn0NCg0KdGVtcGxhdGUgPHVuc2lnbmVkIGNvdW50Pg0Kc3RydWN0IFBhcnNlQXJyYXlIYW5kbGVyIDogQmFzZVJlYWRlckhhbmRsZXI8VVRGODw+LCBQYXJzZUFycmF5SGFuZGxlcjxjb3VudD4gPiB7DQogICAgUGFyc2VBcnJheUhhbmRsZXIoKSA6IHN0ZXBfKDApIHt9DQoNCiAgICBib29sIERlZmF1bHQoKSB7IEFERF9GQUlMVVJFKCk7IHJldHVybiBmYWxzZTsgfQ0KICAgIGJvb2wgVWludCh1bnNpZ25lZCBpKSB7IEVYUEVDVF9FUShzdGVwXywgaSk7IHN0ZXBfKys7IHJldHVybiB0cnVlOyB9DQogICAgYm9vbCBTdGFydEFycmF5KCkgeyBFWFBFQ1RfRVEoMHUsIHN0ZXBfKTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7IH0NCiAgICBib29sIEVuZEFycmF5KFNpemVUeXBlKSB7IHN0ZXBfKys7IHJldHVybiB0cnVlOyB9DQoNCiAgICB1bnNpZ25lZCBzdGVwXzsNCn07DQoNClRFU1QoUmVhZGVyLCBQYXJzZUVtcHR5QXJyYXkpIHsNCiAgICBjaGFyICpqc29uID0gU3RyRHVwKCJbIF0gIik7DQogICAgSW5zaXR1U3RyaW5nU3RyZWFtIHMoanNvbik7DQogICAgUGFyc2VBcnJheUhhbmRsZXI8MD4gaDsNCiAgICBSZWFkZXIgcmVhZGVyOw0KICAgIHJlYWRlci5QYXJzZShzLCBoKTsNCiAgICBFWFBFQ1RfRVEoMnUsIGguc3RlcF8pOw0KICAgIGZyZWUoanNvbik7DQp9DQoNClRFU1QoUmVhZGVyLCBQYXJzZUFycmF5KSB7DQogICAgY2hhciAqanNvbiA9IFN0ckR1cCgiWzEsIDIsIDMsIDRdIik7DQogICAgSW5zaXR1U3RyaW5nU3RyZWFtIHMoanNvbik7DQogICAgUGFyc2VBcnJheUhhbmRsZXI8ND4gaDsNCiAgICBSZWFkZXIgcmVhZGVyOw0KICAgIHJlYWRlci5QYXJzZShzLCBoKTsNCiAgICBFWFBFQ1RfRVEoNnUsIGguc3RlcF8pOw0KICAgIGZyZWUoanNvbik7DQp9DQoNClRFU1QoUmVhZGVyLCBQYXJzZUFycmF5X0Vycm9yKSB7DQojZGVmaW5lIFRFU1RfQVJSQVlfRVJST1IoZXJyb3JDb2RlLCBzdHIpIFwNCiAgICB7IFwNCiAgICAgICAgY2hhciBidWZmZXJbMTAwMV07IFwNCiAgICAgICAgc3RybmNweShidWZmZXIsIHN0ciwgMTAwMCk7IFwNCiAgICAgICAgSW5zaXR1U3RyaW5nU3RyZWFtIHMoYnVmZmVyKTsgXA0KICAgICAgICBCYXNlUmVhZGVySGFuZGxlcjw+IGg7IFwNCiAgICAgICAgR2VuZXJpY1JlYWRlcjxVVEY4PD4sIFVURjg8PiwgQ3J0QWxsb2NhdG9yPiByZWFkZXI7IFwNCiAgICAgICAgRVhQRUNUX0ZBTFNFKHJlYWRlci5QYXJzZShzLCBoKSk7IFwNCiAgICAgICAgRVhQRUNUX0VRKGVycm9yQ29kZSwgcmVhZGVyLkdldFBhcnNlRXJyb3JDb2RlKCkpO1wNCiAgICB9DQoNCiAgICAvLyBNaXNzaW5nIGEgY29tbWEgb3IgJ10nIGFmdGVyIGFuIGFycmF5IGVsZW1lbnQuDQogICAgVEVTVF9BUlJBWV9FUlJPUihrUGFyc2VFcnJvckFycmF5TWlzc0NvbW1hT3JTcXVhcmVCcmFja2V0LCAiWzEiKTsNCiAgICBURVNUX0FSUkFZX0VSUk9SKGtQYXJzZUVycm9yQXJyYXlNaXNzQ29tbWFPclNxdWFyZUJyYWNrZXQsICJbMX0iKTsNCiAgICBURVNUX0FSUkFZX0VSUk9SKGtQYXJzZUVycm9yQXJyYXlNaXNzQ29tbWFPclNxdWFyZUJyYWNrZXQsICJbMSAyXSIpOw0KDQojdW5kZWYgVEVTVF9BUlJBWV9FUlJPUg0KfQ0KDQpzdHJ1Y3QgUGFyc2VPYmplY3RIYW5kbGVyIDogQmFzZVJlYWRlckhhbmRsZXI8VVRGODw+LCBQYXJzZU9iamVjdEhhbmRsZXI+IHsNCiAgICBQYXJzZU9iamVjdEhhbmRsZXIoKSA6IHN0ZXBfKDApIHt9DQoNCiAgICBib29sIERlZmF1bHQoKSB7IEFERF9GQUlMVVJFKCk7IHJldHVybiBmYWxzZTsgfQ0KICAgIGJvb2wgTnVsbCgpIHsgRVhQRUNUX0VRKDh1LCBzdGVwXyk7IHN0ZXBfKys7IHJldHVybiB0cnVlOyB9DQogICAgYm9vbCBCb29sKGJvb2wgYikgeyANCiAgICAgICAgc3dpdGNoKHN0ZXBfKSB7DQogICAgICAgICAgICBjYXNlIDQ6IEVYUEVDVF9UUlVFKGIpOyBzdGVwXysrOyByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIGNhc2UgNjogRVhQRUNUX0ZBTFNFKGIpOyBzdGVwXysrOyByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIGRlZmF1bHQ6IEFERF9GQUlMVVJFKCk7IHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBib29sIEludChpbnQgaSkgeyANCiAgICAgICAgc3dpdGNoKHN0ZXBfKSB7DQogICAgICAgICAgICBjYXNlIDEwOiBFWFBFQ1RfRVEoMTIzLCBpKTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7DQogICAgICAgICAgICBjYXNlIDE1OiBFWFBFQ1RfRVEoMSwgaSk7IHN0ZXBfKys7IHJldHVybiB0cnVlOw0KICAgICAgICAgICAgY2FzZSAxNjogRVhQRUNUX0VRKDIsIGkpOyBzdGVwXysrOyByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIGNhc2UgMTc6IEVYUEVDVF9FUSgzLCBpKTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7DQogICAgICAgICAgICBkZWZhdWx0OiBBRERfRkFJTFVSRSgpOyByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQogICAgYm9vbCBVaW50KHVuc2lnbmVkIGkpIHsgcmV0dXJuIEludChpKTsgfQ0KICAgIGJvb2wgRG91YmxlKGRvdWJsZSBkKSB7IEVYUEVDVF9FUSgxMnUsIHN0ZXBfKTsgRVhQRUNUX0RPVUJMRV9FUSgzLjE0MTYsIGQpOyBzdGVwXysrOyByZXR1cm4gdHJ1ZTsgfQ0KICAgIGJvb2wgU3RyaW5nKGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90LCBib29sKSB7IA0KICAgICAgICBzd2l0Y2goc3RlcF8pIHsNCiAgICAgICAgICAgIGNhc2UgMTogRVhQRUNUX1NUUkVRKCJoZWxsbyIsIHN0cik7IHN0ZXBfKys7IHJldHVybiB0cnVlOw0KICAgICAgICAgICAgY2FzZSAyOiBFWFBFQ1RfU1RSRVEoIndvcmxkIiwgc3RyKTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7DQogICAgICAgICAgICBjYXNlIDM6IEVYUEVDVF9TVFJFUSgidCIsIHN0cik7IHN0ZXBfKys7IHJldHVybiB0cnVlOw0KICAgICAgICAgICAgY2FzZSA1OiBFWFBFQ1RfU1RSRVEoImYiLCBzdHIpOyBzdGVwXysrOyByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIGNhc2UgNzogRVhQRUNUX1NUUkVRKCJuIiwgc3RyKTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7DQogICAgICAgICAgICBjYXNlIDk6IEVYUEVDVF9TVFJFUSgiaSIsIHN0cik7IHN0ZXBfKys7IHJldHVybiB0cnVlOw0KICAgICAgICAgICAgY2FzZSAxMTogRVhQRUNUX1NUUkVRKCJwaSIsIHN0cik7IHN0ZXBfKys7IHJldHVybiB0cnVlOw0KICAgICAgICAgICAgY2FzZSAxMzogRVhQRUNUX1NUUkVRKCJhIiwgc3RyKTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7DQogICAgICAgICAgICBkZWZhdWx0OiBBRERfRkFJTFVSRSgpOyByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQogICAgYm9vbCBTdGFydE9iamVjdCgpIHsgRVhQRUNUX0VRKDB1LCBzdGVwXyk7IHN0ZXBfKys7IHJldHVybiB0cnVlOyB9DQogICAgYm9vbCBFbmRPYmplY3QoU2l6ZVR5cGUgbWVtYmVyQ291bnQpIHsgRVhQRUNUX0VRKDE5dSwgc3RlcF8pOyBFWFBFQ1RfRVEoN3UsIG1lbWJlckNvdW50KTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7IH0NCiAgICBib29sIFN0YXJ0QXJyYXkoKSB7IEVYUEVDVF9FUSgxNHUsIHN0ZXBfKTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7IH0NCiAgICBib29sIEVuZEFycmF5KFNpemVUeXBlIGVsZW1lbnRDb3VudCkgeyBFWFBFQ1RfRVEoMTh1LCBzdGVwXyk7IEVYUEVDVF9FUSgzdSwgZWxlbWVudENvdW50KTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7IH0NCg0KICAgIHVuc2lnbmVkIHN0ZXBfOw0KfTsNCg0KVEVTVChSZWFkZXIsIFBhcnNlT2JqZWN0KSB7DQogICAgY29uc3QgY2hhcioganNvbiA9ICJ7IFwiaGVsbG9cIiA6IFwid29ybGRcIiwgXCJ0XCIgOiB0cnVlICwgXCJmXCIgOiBmYWxzZSwgXCJuXCI6IG51bGwsIFwiaVwiOjEyMywgXCJwaVwiOiAzLjE0MTYsIFwiYVwiOlsxLCAyLCAzXSB9ICI7DQoNCiAgICAvLyBJbnNpdHUNCiAgICB7DQogICAgICAgIGNoYXIqIGpzb24yID0gU3RyRHVwKGpzb24pOw0KICAgICAgICBJbnNpdHVTdHJpbmdTdHJlYW0gcyhqc29uMik7DQogICAgICAgIFBhcnNlT2JqZWN0SGFuZGxlciBoOw0KICAgICAgICBSZWFkZXIgcmVhZGVyOw0KICAgICAgICByZWFkZXIuUGFyc2U8a1BhcnNlSW5zaXR1RmxhZz4ocywgaCk7DQogICAgICAgIEVYUEVDVF9FUSgyMHUsIGguc3RlcF8pOw0KICAgICAgICBmcmVlKGpzb24yKTsNCiAgICB9DQoNCiAgICAvLyBOb3JtYWwNCiAgICB7DQogICAgICAgIFN0cmluZ1N0cmVhbSBzKGpzb24pOw0KICAgICAgICBQYXJzZU9iamVjdEhhbmRsZXIgaDsNCiAgICAgICAgUmVhZGVyIHJlYWRlcjsNCiAgICAgICAgcmVhZGVyLlBhcnNlKHMsIGgpOw0KICAgICAgICBFWFBFQ1RfRVEoMjB1LCBoLnN0ZXBfKTsNCiAgICB9DQp9DQoNCnN0cnVjdCBQYXJzZUVtcHR5T2JqZWN0SGFuZGxlciA6IEJhc2VSZWFkZXJIYW5kbGVyPFVURjg8PiwgUGFyc2VFbXB0eU9iamVjdEhhbmRsZXI+IHsNCiAgICBQYXJzZUVtcHR5T2JqZWN0SGFuZGxlcigpIDogc3RlcF8oMCkge30NCg0KICAgIGJvb2wgRGVmYXVsdCgpIHsgQUREX0ZBSUxVUkUoKTsgcmV0dXJuIGZhbHNlOyB9DQogICAgYm9vbCBTdGFydE9iamVjdCgpIHsgRVhQRUNUX0VRKDB1LCBzdGVwXyk7IHN0ZXBfKys7IHJldHVybiB0cnVlOyB9DQogICAgYm9vbCBFbmRPYmplY3QoU2l6ZVR5cGUpIHsgRVhQRUNUX0VRKDF1LCBzdGVwXyk7IHN0ZXBfKys7IHJldHVybiB0cnVlOyB9DQoNCiAgICB1bnNpZ25lZCBzdGVwXzsNCn07DQoNClRFU1QoUmVhZGVyLCBQYXJzZV9FbXB0eU9iamVjdCkgew0KICAgIFN0cmluZ1N0cmVhbSBzKCJ7IH0gIik7DQogICAgUGFyc2VFbXB0eU9iamVjdEhhbmRsZXIgaDsNCiAgICBSZWFkZXIgcmVhZGVyOw0KICAgIHJlYWRlci5QYXJzZShzLCBoKTsNCiAgICBFWFBFQ1RfRVEoMnUsIGguc3RlcF8pOw0KfQ0KDQpzdHJ1Y3QgUGFyc2VNdWx0aXBsZVJvb3RIYW5kbGVyIDogQmFzZVJlYWRlckhhbmRsZXI8VVRGODw+LCBQYXJzZU11bHRpcGxlUm9vdEhhbmRsZXI+IHsNCiAgICBQYXJzZU11bHRpcGxlUm9vdEhhbmRsZXIoKSA6IHN0ZXBfKDApIHt9DQoNCiAgICBib29sIERlZmF1bHQoKSB7IEFERF9GQUlMVVJFKCk7IHJldHVybiBmYWxzZTsgfQ0KICAgIGJvb2wgU3RhcnRPYmplY3QoKSB7IEVYUEVDVF9FUSgwdSwgc3RlcF8pOyBzdGVwXysrOyByZXR1cm4gdHJ1ZTsgfQ0KICAgIGJvb2wgRW5kT2JqZWN0KFNpemVUeXBlKSB7IEVYUEVDVF9FUSgxdSwgc3RlcF8pOyBzdGVwXysrOyByZXR1cm4gdHJ1ZTsgfQ0KICAgIGJvb2wgU3RhcnRBcnJheSgpIHsgRVhQRUNUX0VRKDJ1LCBzdGVwXyk7IHN0ZXBfKys7IHJldHVybiB0cnVlOyB9DQogICAgYm9vbCBFbmRBcnJheShTaXplVHlwZSkgeyBFWFBFQ1RfRVEoM3UsIHN0ZXBfKTsgc3RlcF8rKzsgcmV0dXJuIHRydWU7IH0NCg0KICAgIHVuc2lnbmVkIHN0ZXBfOw0KfTsNCg0KdGVtcGxhdGUgPHVuc2lnbmVkIHBhcnNlRmxhZ3M+DQp2b2lkIFRlc3RNdWx0aXBsZVJvb3QoKSB7DQogICAgU3RyaW5nU3RyZWFtIHMoInt9W10gYSIpOw0KICAgIFBhcnNlTXVsdGlwbGVSb290SGFuZGxlciBoOw0KICAgIFJlYWRlciByZWFkZXI7DQogICAgRVhQRUNUX1RSVUUocmVhZGVyLlBhcnNlPHBhcnNlRmxhZ3M+KHMsIGgpKTsNCiAgICBFWFBFQ1RfRVEoMnUsIGguc3RlcF8pOw0KICAgIEVYUEVDVF9UUlVFKHJlYWRlci5QYXJzZTxwYXJzZUZsYWdzPihzLCBoKSk7DQogICAgRVhQRUNUX0VRKDR1LCBoLnN0ZXBfKTsNCiAgICBFWFBFQ1RfRVEoJyAnLCBzLlRha2UoKSk7DQogICAgRVhQRUNUX0VRKCdhJywgcy5UYWtlKCkpOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VfTXVsdGlwbGVSb290KSB7DQogICAgVGVzdE11bHRpcGxlUm9vdDxrUGFyc2VTdG9wV2hlbkRvbmVGbGFnPigpOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VJdGVyYXRpdmVfTXVsdGlwbGVSb290KSB7DQogICAgVGVzdE11bHRpcGxlUm9vdDxrUGFyc2VJdGVyYXRpdmVGbGFnIHwga1BhcnNlU3RvcFdoZW5Eb25lRmxhZz4oKTsNCn0NCg0KdGVtcGxhdGUgPHVuc2lnbmVkIHBhcnNlRmxhZ3M+DQp2b2lkIFRlc3RJbnNpdHVNdWx0aXBsZVJvb3QoKSB7DQogICAgY2hhciogYnVmZmVyID0gc3RyZHVwKCJ7fVtdIGEiKTsNCiAgICBJbnNpdHVTdHJpbmdTdHJlYW0gcyhidWZmZXIpOw0KICAgIFBhcnNlTXVsdGlwbGVSb290SGFuZGxlciBoOw0KICAgIFJlYWRlciByZWFkZXI7DQogICAgRVhQRUNUX1RSVUUocmVhZGVyLlBhcnNlPGtQYXJzZUluc2l0dUZsYWcgfCBwYXJzZUZsYWdzPihzLCBoKSk7DQogICAgRVhQRUNUX0VRKDJ1LCBoLnN0ZXBfKTsNCiAgICBFWFBFQ1RfVFJVRShyZWFkZXIuUGFyc2U8a1BhcnNlSW5zaXR1RmxhZyB8IHBhcnNlRmxhZ3M+KHMsIGgpKTsNCiAgICBFWFBFQ1RfRVEoNHUsIGguc3RlcF8pOw0KICAgIEVYUEVDVF9FUSgnICcsIHMuVGFrZSgpKTsNCiAgICBFWFBFQ1RfRVEoJ2EnLCBzLlRha2UoKSk7DQogICAgZnJlZShidWZmZXIpOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VJbnNpdHVfTXVsdGlwbGVSb290KSB7DQogICAgVGVzdEluc2l0dU11bHRpcGxlUm9vdDxrUGFyc2VTdG9wV2hlbkRvbmVGbGFnPigpOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VJbnNpdHVJdGVyYXRpdmVfTXVsdGlwbGVSb290KSB7DQogICAgVGVzdEluc2l0dU11bHRpcGxlUm9vdDxrUGFyc2VJdGVyYXRpdmVGbGFnIHwga1BhcnNlU3RvcFdoZW5Eb25lRmxhZz4oKTsNCn0NCg0KI2RlZmluZSBURVNUX0VSUk9SKGVycm9yQ29kZSwgc3RyKSBcDQogICAgeyBcDQogICAgICAgIGNoYXIgYnVmZmVyWzEwMDFdOyBcDQogICAgICAgIHN0cm5jcHkoYnVmZmVyLCBzdHIsIDEwMDApOyBcDQogICAgICAgIEluc2l0dVN0cmluZ1N0cmVhbSBzKGJ1ZmZlcik7IFwNCiAgICAgICAgQmFzZVJlYWRlckhhbmRsZXI8PiBoOyBcDQogICAgICAgIFJlYWRlciByZWFkZXI7IFwNCiAgICAgICAgRVhQRUNUX0ZBTFNFKHJlYWRlci5QYXJzZShzLCBoKSk7IFwNCiAgICAgICAgRVhQRUNUX0VRKGVycm9yQ29kZSwgcmVhZGVyLkdldFBhcnNlRXJyb3JDb2RlKCkpO1wNCiAgICB9DQoNClRFU1QoUmVhZGVyLCBQYXJzZURvY3VtZW50X0Vycm9yKSB7DQogICAgLy8gVGhlIGRvY3VtZW50IGlzIGVtcHR5Lg0KICAgIFRFU1RfRVJST1Ioa1BhcnNlRXJyb3JEb2N1bWVudEVtcHR5LCAiIik7DQogICAgVEVTVF9FUlJPUihrUGFyc2VFcnJvckRvY3VtZW50RW1wdHksICIgIik7DQogICAgVEVTVF9FUlJPUihrUGFyc2VFcnJvckRvY3VtZW50RW1wdHksICIgXG4iKTsNCg0KICAgIC8vIFRoZSBkb2N1bWVudCByb290IG11c3Qgbm90IGZvbGxvdyBieSBvdGhlciB2YWx1ZXMuDQogICAgVEVTVF9FUlJPUihrUGFyc2VFcnJvckRvY3VtZW50Um9vdE5vdFNpbmd1bGFyLCAiW10gMCIpOw0KICAgIFRFU1RfRVJST1Ioa1BhcnNlRXJyb3JEb2N1bWVudFJvb3ROb3RTaW5ndWxhciwgInt9IDAiKTsNCiAgICBURVNUX0VSUk9SKGtQYXJzZUVycm9yRG9jdW1lbnRSb290Tm90U2luZ3VsYXIsICJudWxsIFtdIik7DQogICAgVEVTVF9FUlJPUihrUGFyc2VFcnJvckRvY3VtZW50Um9vdE5vdFNpbmd1bGFyLCAiMCB7fSIpOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VWYWx1ZV9FcnJvcikgew0KICAgIC8vIEludmFsaWQgdmFsdWUuDQogICAgVEVTVF9FUlJPUihrUGFyc2VFcnJvclZhbHVlSW52YWxpZCwgIm51bEwiKTsNCiAgICBURVNUX0VSUk9SKGtQYXJzZUVycm9yVmFsdWVJbnZhbGlkLCAidHJ1RSIpOw0KICAgIFRFU1RfRVJST1Ioa1BhcnNlRXJyb3JWYWx1ZUludmFsaWQsICJmYWxzRSIpOw0KICAgIFRFU1RfRVJST1Ioa1BhcnNlRXJyb3JWYWx1ZUludmFsaWQsICJhXSIpOw0KICAgIFRFU1RfRVJST1Ioa1BhcnNlRXJyb3JWYWx1ZUludmFsaWQsICIuMSIpOw0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VPYmplY3RfRXJyb3IpIHsNCiAgICAvLyBNaXNzaW5nIGEgbmFtZSBmb3Igb2JqZWN0IG1lbWJlci4NCiAgICBURVNUX0VSUk9SKGtQYXJzZUVycm9yT2JqZWN0TWlzc05hbWUsICJ7MX0iKTsNCiAgICBURVNUX0VSUk9SKGtQYXJzZUVycm9yT2JqZWN0TWlzc05hbWUsICJ7OjF9Iik7DQogICAgVEVTVF9FUlJPUihrUGFyc2VFcnJvck9iamVjdE1pc3NOYW1lLCAie251bGw6MX0iKTsNCiAgICBURVNUX0VSUk9SKGtQYXJzZUVycm9yT2JqZWN0TWlzc05hbWUsICJ7dHJ1ZToxfSIpOw0KICAgIFRFU1RfRVJST1Ioa1BhcnNlRXJyb3JPYmplY3RNaXNzTmFtZSwgIntmYWxzZToxfSIpOw0KICAgIFRFU1RfRVJST1Ioa1BhcnNlRXJyb3JPYmplY3RNaXNzTmFtZSwgInsxOjF9Iik7DQogICAgVEVTVF9FUlJPUihrUGFyc2VFcnJvck9iamVjdE1pc3NOYW1lLCAie1tdOjF9Iik7DQogICAgVEVTVF9FUlJPUihrUGFyc2VFcnJvck9iamVjdE1pc3NOYW1lLCAie3t9OjF9Iik7DQogICAgVEVTVF9FUlJPUihrUGFyc2VFcnJvck9iamVjdE1pc3NOYW1lLCAie3h5ejoxfSIpOw0KDQogICAgLy8gTWlzc2luZyBhIGNvbG9uIGFmdGVyIGEgbmFtZSBvZiBvYmplY3QgbWVtYmVyLg0KICAgIFRFU1RfRVJST1Ioa1BhcnNlRXJyb3JPYmplY3RNaXNzQ29sb24sICJ7XCJhXCIgMX0iKTsNCiAgICBURVNUX0VSUk9SKGtQYXJzZUVycm9yT2JqZWN0TWlzc0NvbG9uLCAie1wiYVwiLDF9Iik7DQoNCiAgICAvLyBNdXN0IGJlIGEgY29tbWEgb3IgJ30nIGFmdGVyIGFuIG9iamVjdCBtZW1iZXINCiAgICBURVNUX0VSUk9SKGtQYXJzZUVycm9yT2JqZWN0TWlzc0NvbW1hT3JDdXJseUJyYWNrZXQsICJ7XCJhXCI6MV0iKTsNCg0KICAgIC8vIFRoaXMgdGVzdHMgdGhhdCBNZW1vcnlTdHJlYW0gaXMgY2hlY2tpbmcgdGhlIGxlbmd0aCBpbiBQZWVrKCkuDQogICAgew0KICAgICAgICBNZW1vcnlTdHJlYW0gbXMoIntcImFcIiIsIDEpOw0KICAgICAgICBCYXNlUmVhZGVySGFuZGxlcjw+IGg7DQogICAgICAgIFJlYWRlciByZWFkZXI7DQogICAgICAgIEVYUEVDVF9GQUxTRShyZWFkZXIuUGFyc2U8a1BhcnNlU3RvcFdoZW5Eb25lRmxhZz4obXMsIGgpKTsNCiAgICAgICAgRVhQRUNUX0VRKGtQYXJzZUVycm9yT2JqZWN0TWlzc05hbWUsIHJlYWRlci5HZXRQYXJzZUVycm9yQ29kZSgpKTsNCiAgICB9DQp9DQoNCiN1bmRlZiBURVNUX0VSUk9SDQoNClRFU1QoUmVhZGVyLCBTa2lwV2hpdGVzcGFjZSkgew0KICAgIFN0cmluZ1N0cmVhbSBzcygiIEEgXHRcdEJcbiBcblxuQ1xyXHIgXHJEIFx0XG5cciBFIik7DQogICAgY29uc3QgY2hhciogZXhwZWN0ZWQgPSAiQUJDREUiOw0KICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTsgaSsrKSB7DQogICAgICAgIFNraXBXaGl0ZXNwYWNlKHNzKTsNCiAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBzcy5UYWtlKCkpOw0KICAgIH0NCn0NCg0KLy8gVGVzdCBpbXBsZW1lbnRpbmcgYSBzdHJlYW0gd2l0aG91dCBjb3B5IHN0cmVhbSBvcHRpbWl6YXRpb24uDQovLyBDbG9uZSBmcm9tIEdlbmVyaWNTdHJpbmdTdHJlYW0gZXhjZXB0IHRoYXQgY29weSBjb25zdHJ1Y3RvciBpcyBkaXNhYmxlZC4NCnRlbXBsYXRlIDx0eXBlbmFtZSBFbmNvZGluZz4NCmNsYXNzIEN1c3RvbVN0cmluZ1N0cmVhbSB7DQpwdWJsaWM6DQogICAgdHlwZWRlZiB0eXBlbmFtZSBFbmNvZGluZzo6Q2ggQ2g7DQoNCiAgICBDdXN0b21TdHJpbmdTdHJlYW0oY29uc3QgQ2ggKnNyYykgOiBzcmNfKHNyYyksIGhlYWRfKHNyYykge30NCg0KICAgIENoIFBlZWsoKSBjb25zdCB7IHJldHVybiAqc3JjXzsgfQ0KICAgIENoIFRha2UoKSB7IHJldHVybiAqc3JjXysrOyB9DQogICAgc2l6ZV90IFRlbGwoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHNyY18gLSBoZWFkXyk7IH0NCg0KICAgIENoKiBQdXRCZWdpbigpIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IHJldHVybiAwOyB9DQogICAgdm9pZCBQdXQoQ2gpIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IH0NCiAgICB2b2lkIEZsdXNoKCkgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgfQ0KICAgIHNpemVfdCBQdXRFbmQoQ2gqKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDsgfQ0KDQpwcml2YXRlOg0KICAgIC8vIFByb2hpYml0IGNvcHkgY29uc3RydWN0b3IgJiBhc3NpZ25tZW50IG9wZXJhdG9yLg0KICAgIEN1c3RvbVN0cmluZ1N0cmVhbShjb25zdCBDdXN0b21TdHJpbmdTdHJlYW0mKTsNCiAgICBDdXN0b21TdHJpbmdTdHJlYW0mIG9wZXJhdG9yPShjb25zdCBDdXN0b21TdHJpbmdTdHJlYW0mKTsNCg0KICAgIGNvbnN0IENoKiBzcmNfOyAgICAgLy8hPCBDdXJyZW50IHJlYWQgcG9zaXRpb24uDQogICAgY29uc3QgQ2gqIGhlYWRfOyAgICAvLyE8IE9yaWdpbmFsIGhlYWQgb2YgdGhlIHN0cmluZy4NCn07DQoNCi8vIElmIHRoZSBmb2xsb3dpbmcgY29kZSBpcyBjb21waWxlZCwgaXQgc2hvdWxkIGdlbmVyYXRlIGNvbXBpbGF0aW9uIGVycm9yIGFzIHByZWRpY3RlZC4NCi8vIEJlY2F1c2UgQ3VzdG9tU3RyaW5nU3RyZWFtPD4gaXMgbm90IGNvcHlhYmxlIHZpYSBtYWtpbmcgY29weSBjb25zdHJ1Y3RvciBwcml2YXRlLg0KI2lmIDANCm5hbWVzcGFjZSByYXBpZGpzb24gew0KDQp0ZW1wbGF0ZSA8dHlwZW5hbWUgRW5jb2Rpbmc+DQpzdHJ1Y3QgU3RyZWFtVHJhaXRzPEN1c3RvbVN0cmluZ1N0cmVhbTxFbmNvZGluZz4gPiB7DQogICAgZW51bSB7IGNvcHlPcHRpbWl6YXRpb24gPSAxIH07DQp9Ow0KDQp9IC8vIG5hbWVzcGFjZSByYXBpZGpzb24NCiNlbmRpZiANCg0KVEVTVChSZWFkZXIsIEN1c3RvbVN0cmluZ1N0cmVhbSkgew0KICAgIGNvbnN0IGNoYXIqIGpzb24gPSAieyBcImhlbGxvXCIgOiBcIndvcmxkXCIsIFwidFwiIDogdHJ1ZSAsIFwiZlwiIDogZmFsc2UsIFwiblwiOiBudWxsLCBcImlcIjoxMjMsIFwicGlcIjogMy4xNDE2LCBcImFcIjpbMSwgMiwgM10gfSAiOw0KICAgIEN1c3RvbVN0cmluZ1N0cmVhbTxVVEY4PGNoYXI+ID4gcyhqc29uKTsNCiAgICBQYXJzZU9iamVjdEhhbmRsZXIgaDsNCiAgICBSZWFkZXIgcmVhZGVyOw0KICAgIHJlYWRlci5QYXJzZShzLCBoKTsNCiAgICBFWFBFQ1RfRVEoMjB1LCBoLnN0ZXBfKTsNCn0NCg0KI2luY2x1ZGUgPHNzdHJlYW0+DQoNCmNsYXNzIElTdHJlYW1XcmFwcGVyIHsNCnB1YmxpYzoNCiAgICB0eXBlZGVmIGNoYXIgQ2g7DQoNCiAgICBJU3RyZWFtV3JhcHBlcihzdGQ6OmlzdHJlYW0mIGlzKSA6IGlzXyhpcykge30NCg0KICAgIENoIFBlZWsoKSBjb25zdCB7DQogICAgICAgIGludCBjID0gaXNfLnBlZWsoKTsNCiAgICAgICAgcmV0dXJuIGMgPT0gc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCkgPyAnXDAnIDogKENoKWM7DQogICAgfQ0KDQogICAgQ2ggVGFrZSgpIHsgDQogICAgICAgIGludCBjID0gaXNfLmdldCgpOw0KICAgICAgICByZXR1cm4gYyA9PSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKSA/ICdcMCcgOiAoQ2gpYzsNCiAgICB9DQoNCiAgICBzaXplX3QgVGVsbCgpIGNvbnN0IHsgcmV0dXJuIChzaXplX3QpaXNfLnRlbGxnKCk7IH0NCg0KICAgIENoKiBQdXRCZWdpbigpIHsgYXNzZXJ0KGZhbHNlKTsgcmV0dXJuIDA7IH0NCiAgICB2b2lkIFB1dChDaCkgeyBhc3NlcnQoZmFsc2UpOyB9DQogICAgdm9pZCBGbHVzaCgpIHsgYXNzZXJ0KGZhbHNlKTsgfQ0KICAgIHNpemVfdCBQdXRFbmQoQ2gqKSB7IGFzc2VydChmYWxzZSk7IHJldHVybiAwOyB9DQoNCnByaXZhdGU6DQogICAgSVN0cmVhbVdyYXBwZXIoY29uc3QgSVN0cmVhbVdyYXBwZXImKTsNCiAgICBJU3RyZWFtV3JhcHBlciYgb3BlcmF0b3I9KGNvbnN0IElTdHJlYW1XcmFwcGVyJik7DQoNCiAgICBzdGQ6OmlzdHJlYW0mIGlzXzsNCn07DQoNClRFU1QoUmVhZGVyLCBQYXJzZV9JU3RyZWFtV3JhcHBlcl9TdHJpbmdTdHJlYW0pIHsNCiAgICBjb25zdCBjaGFyKiBqc29uID0gIlsxLDIsMyw0XSI7DQoNCiAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzcyhqc29uKTsNCiAgICBJU3RyZWFtV3JhcHBlciBpcyhzcyk7DQoNCiAgICBSZWFkZXIgcmVhZGVyOw0KICAgIFBhcnNlQXJyYXlIYW5kbGVyPDQ+IGg7DQogICAgcmVhZGVyLlBhcnNlKGlzLCBoKTsNCiAgICBFWFBFQ1RfRkFMU0UocmVhZGVyLkhhc1BhcnNlRXJyb3IoKSk7ICAgDQp9DQoNCi8vIFRlc3QgaXRlcmF0aXZlIHBhcnNpbmcuDQoNCiNkZWZpbmUgVEVTVEVSUk9SSEFORExJTkcodGV4dCwgZXJyb3JDb2RlLCBvZmZzZXQpXA0Ke1wNCiAgICBTdHJpbmdTdHJlYW0ganNvbih0ZXh0KTsgXA0KICAgIEJhc2VSZWFkZXJIYW5kbGVyPD4gaGFuZGxlcjsgXA0KICAgIFJlYWRlciByZWFkZXI7IFwNCiAgICByZWFkZXIuUGFyc2U8a1BhcnNlSXRlcmF0aXZlRmxhZz4oanNvbiwgaGFuZGxlcik7IFwNCiAgICBFWFBFQ1RfVFJVRShyZWFkZXIuSGFzUGFyc2VFcnJvcigpKTsgXA0KICAgIEVYUEVDVF9FUShlcnJvckNvZGUsIHJlYWRlci5HZXRQYXJzZUVycm9yQ29kZSgpKTsgXA0KICAgIEVYUEVDVF9FUShvZmZzZXQsIHJlYWRlci5HZXRFcnJvck9mZnNldCgpKTsgXA0KfQ0KDQpURVNUKFJlYWRlciwgSXRlcmF0aXZlUGFyc2luZ19FcnJvckhhbmRsaW5nKSB7DQogICAgVEVTVEVSUk9SSEFORExJTkcoIntcImFcIjogYX0iLCBrUGFyc2VFcnJvclZhbHVlSW52YWxpZCwgNnUpOw0KDQogICAgVEVTVEVSUk9SSEFORExJTkcoIiIsIGtQYXJzZUVycm9yRG9jdW1lbnRFbXB0eSwgMHUpOw0KICAgIFRFU1RFUlJPUkhBTkRMSU5HKCJ7fXt9Iiwga1BhcnNlRXJyb3JEb2N1bWVudFJvb3ROb3RTaW5ndWxhciwgMnUpOw0KDQogICAgVEVTVEVSUk9SSEFORExJTkcoInsxfSIsIGtQYXJzZUVycm9yT2JqZWN0TWlzc05hbWUsIDF1KTsNCiAgICBURVNURVJST1JIQU5ETElORygie1wiYVwiLCAxfSIsIGtQYXJzZUVycm9yT2JqZWN0TWlzc0NvbG9uLCA0dSk7DQogICAgVEVTVEVSUk9SSEFORExJTkcoIntcImFcIn0iLCBrUGFyc2VFcnJvck9iamVjdE1pc3NDb2xvbiwgNHUpOw0KICAgIFRFU1RFUlJPUkhBTkRMSU5HKCJ7XCJhXCI6IDEiLCBrUGFyc2VFcnJvck9iamVjdE1pc3NDb21tYU9yQ3VybHlCcmFja2V0LCA3dSk7DQogICAgVEVTVEVSUk9SSEFORExJTkcoIlsxIDIgM10iLCBrUGFyc2VFcnJvckFycmF5TWlzc0NvbW1hT3JTcXVhcmVCcmFja2V0LCAzdSk7DQogICAgVEVTVEVSUk9SSEFORExJTkcoIntcImE6IDEiLCBrUGFyc2VFcnJvclN0cmluZ01pc3NRdW90YXRpb25NYXJrLCA1dSk7DQoNCiAgICAvLyBBbnkgSlNPTiB2YWx1ZSBjYW4gYmUgYSB2YWxpZCByb290IGVsZW1lbnQgaW4gUkZDNzE1OS4NCiAgICBURVNURVJST1JIQU5ETElORygiXCJhYiIsIGtQYXJzZUVycm9yU3RyaW5nTWlzc1F1b3RhdGlvbk1hcmssIDJ1KTsNCiAgICBURVNURVJST1JIQU5ETElORygidHJ1RSIsIGtQYXJzZUVycm9yVmFsdWVJbnZhbGlkLCAzdSk7DQogICAgVEVTVEVSUk9SSEFORExJTkcoIkZhbHNlIiwga1BhcnNlRXJyb3JWYWx1ZUludmFsaWQsIDB1KTsNCiAgICBURVNURVJST1JIQU5ETElORygidHJ1ZSwgZmFsc2UiLCBrUGFyc2VFcnJvckRvY3VtZW50Um9vdE5vdFNpbmd1bGFyLCA0dSk7DQogICAgVEVTVEVSUk9SSEFORExJTkcoImZhbHNlLCBmYWxzZSIsIGtQYXJzZUVycm9yRG9jdW1lbnRSb290Tm90U2luZ3VsYXIsIDV1KTsNCiAgICBURVNURVJST1JIQU5ETElORygibnVsTCIsIGtQYXJzZUVycm9yVmFsdWVJbnZhbGlkLCAzdSk7DQogICAgVEVTVEVSUk9SSEFORExJTkcoIm51bGwgLCBudWxsIiwga1BhcnNlRXJyb3JEb2N1bWVudFJvb3ROb3RTaW5ndWxhciwgNXUpOw0KICAgIFRFU1RFUlJPUkhBTkRMSU5HKCIxYSIsIGtQYXJzZUVycm9yRG9jdW1lbnRSb290Tm90U2luZ3VsYXIsIDF1KTsNCn0NCg0KdGVtcGxhdGU8dHlwZW5hbWUgRW5jb2RpbmcgPSBVVEY4PD4gPg0Kc3RydWN0IEl0ZXJhdGl2ZVBhcnNpbmdSZWFkZXJIYW5kbGVyIHsNCiAgICB0eXBlZGVmIHR5cGVuYW1lIEVuY29kaW5nOjpDaCBDaDsNCg0KICAgIGNvbnN0IHN0YXRpYyBpbnQgTE9HX05VTEwgPSAtMTsNCiAgICBjb25zdCBzdGF0aWMgaW50IExPR19CT09MID0gLTI7DQogICAgY29uc3Qgc3RhdGljIGludCBMT0dfSU5UID0gLTM7DQogICAgY29uc3Qgc3RhdGljIGludCBMT0dfVUlOVCA9IC00Ow0KICAgIGNvbnN0IHN0YXRpYyBpbnQgTE9HX0lOVDY0ID0gLTU7DQogICAgY29uc3Qgc3RhdGljIGludCBMT0dfVUlOVDY0ID0gLTY7DQogICAgY29uc3Qgc3RhdGljIGludCBMT0dfRE9VQkxFID0gLTc7DQogICAgY29uc3Qgc3RhdGljIGludCBMT0dfU1RSSU5HID0gLTg7DQogICAgY29uc3Qgc3RhdGljIGludCBMT0dfU1RBUlRPQkpFQ1QgPSAtOTsNCiAgICBjb25zdCBzdGF0aWMgaW50IExPR19LRVkgPSAtMTA7DQogICAgY29uc3Qgc3RhdGljIGludCBMT0dfRU5ET0JKRUNUID0gLTExOw0KICAgIGNvbnN0IHN0YXRpYyBpbnQgTE9HX1NUQVJUQVJSQVkgPSAtMTI7DQogICAgY29uc3Qgc3RhdGljIGludCBMT0dfRU5EQVJSQVkgPSAtMTM7DQoNCiAgICBjb25zdCBzdGF0aWMgc2l6ZV90IExvZ0NhcGFjaXR5ID0gMjU2Ow0KICAgIGludCBMb2dzW0xvZ0NhcGFjaXR5XTsNCiAgICBzaXplX3QgTG9nQ291bnQ7DQoNCiAgICBJdGVyYXRpdmVQYXJzaW5nUmVhZGVySGFuZGxlcigpIDogTG9nQ291bnQoMCkgew0KICAgIH0NCg0KICAgIGJvb2wgTnVsbCgpIHsgUkFQSURKU09OX0FTU0VSVChMb2dDb3VudCA8IExvZ0NhcGFjaXR5KTsgTG9nc1tMb2dDb3VudCsrXSA9IExPR19OVUxMOyByZXR1cm4gdHJ1ZTsgfQ0KDQogICAgYm9vbCBCb29sKGJvb2wpIHsgUkFQSURKU09OX0FTU0VSVChMb2dDb3VudCA8IExvZ0NhcGFjaXR5KTsgTG9nc1tMb2dDb3VudCsrXSA9IExPR19CT09MOyByZXR1cm4gdHJ1ZTsgfQ0KDQogICAgYm9vbCBJbnQoaW50KSB7IFJBUElESlNPTl9BU1NFUlQoTG9nQ291bnQgPCBMb2dDYXBhY2l0eSk7IExvZ3NbTG9nQ291bnQrK10gPSBMT0dfSU5UOyByZXR1cm4gdHJ1ZTsgfQ0KDQogICAgYm9vbCBVaW50KHVuc2lnbmVkKSB7IFJBUElESlNPTl9BU1NFUlQoTG9nQ291bnQgPCBMb2dDYXBhY2l0eSk7IExvZ3NbTG9nQ291bnQrK10gPSBMT0dfSU5UOyByZXR1cm4gdHJ1ZTsgfQ0KDQogICAgYm9vbCBJbnQ2NChpbnQ2NF90KSB7IFJBUElESlNPTl9BU1NFUlQoTG9nQ291bnQgPCBMb2dDYXBhY2l0eSk7IExvZ3NbTG9nQ291bnQrK10gPSBMT0dfSU5UNjQ7IHJldHVybiB0cnVlOyB9DQoNCiAgICBib29sIFVpbnQ2NCh1aW50NjRfdCkgeyBSQVBJREpTT05fQVNTRVJUKExvZ0NvdW50IDwgTG9nQ2FwYWNpdHkpOyBMb2dzW0xvZ0NvdW50KytdID0gTE9HX1VJTlQ2NDsgcmV0dXJuIHRydWU7IH0NCg0KICAgIGJvb2wgRG91YmxlKGRvdWJsZSkgeyBSQVBJREpTT05fQVNTRVJUKExvZ0NvdW50IDwgTG9nQ2FwYWNpdHkpOyBMb2dzW0xvZ0NvdW50KytdID0gTE9HX0RPVUJMRTsgcmV0dXJuIHRydWU7IH0NCg0KICAgIGJvb2wgU3RyaW5nKGNvbnN0IENoKiwgU2l6ZVR5cGUsIGJvb2wpIHsgUkFQSURKU09OX0FTU0VSVChMb2dDb3VudCA8IExvZ0NhcGFjaXR5KTsgTG9nc1tMb2dDb3VudCsrXSA9IExPR19TVFJJTkc7IHJldHVybiB0cnVlOyB9DQoNCiAgICBib29sIFN0YXJ0T2JqZWN0KCkgeyBSQVBJREpTT05fQVNTRVJUKExvZ0NvdW50IDwgTG9nQ2FwYWNpdHkpOyBMb2dzW0xvZ0NvdW50KytdID0gTE9HX1NUQVJUT0JKRUNUOyByZXR1cm4gdHJ1ZTsgfQ0KDQogICAgYm9vbCBLZXkgKGNvbnN0IENoKiwgU2l6ZVR5cGUsIGJvb2wpIHsgUkFQSURKU09OX0FTU0VSVChMb2dDb3VudCA8IExvZ0NhcGFjaXR5KTsgTG9nc1tMb2dDb3VudCsrXSA9IExPR19LRVk7IHJldHVybiB0cnVlOyB9DQoJDQogICAgYm9vbCBFbmRPYmplY3QoU2l6ZVR5cGUgYykgew0KICAgICAgICBSQVBJREpTT05fQVNTRVJUKExvZ0NvdW50IDwgTG9nQ2FwYWNpdHkpOw0KICAgICAgICBMb2dzW0xvZ0NvdW50KytdID0gTE9HX0VORE9CSkVDVDsNCiAgICAgICAgTG9nc1tMb2dDb3VudCsrXSA9IChpbnQpYzsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgYm9vbCBTdGFydEFycmF5KCkgeyBSQVBJREpTT05fQVNTRVJUKExvZ0NvdW50IDwgTG9nQ2FwYWNpdHkpOyBMb2dzW0xvZ0NvdW50KytdID0gTE9HX1NUQVJUQVJSQVk7IHJldHVybiB0cnVlOyB9DQoNCiAgICBib29sIEVuZEFycmF5KFNpemVUeXBlIGMpIHsNCiAgICAgICAgUkFQSURKU09OX0FTU0VSVChMb2dDb3VudCA8IExvZ0NhcGFjaXR5KTsNCiAgICAgICAgTG9nc1tMb2dDb3VudCsrXSA9IExPR19FTkRBUlJBWTsNCiAgICAgICAgTG9nc1tMb2dDb3VudCsrXSA9IChpbnQpYzsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KfTsNCg0KVEVTVChSZWFkZXIsIEl0ZXJhdGl2ZVBhcnNpbmdfR2VuZXJhbCkgew0KICAgIHsNCiAgICAgICAgU3RyaW5nU3RyZWFtIGlzKCJbMSwge1wia1wiOiBbMSwgMl19LCBudWxsLCBmYWxzZSwgdHJ1ZSwgXCJzdHJpbmdcIiwgMS4yXSIpOw0KICAgICAgICBSZWFkZXIgcmVhZGVyOw0KICAgICAgICBJdGVyYXRpdmVQYXJzaW5nUmVhZGVySGFuZGxlcjw+IGhhbmRsZXI7DQoNCiAgICAgICAgUGFyc2VSZXN1bHQgciA9IHJlYWRlci5QYXJzZTxrUGFyc2VJdGVyYXRpdmVGbGFnPihpcywgaGFuZGxlcik7DQoNCiAgICAgICAgRVhQRUNUX0ZBTFNFKHIuSXNFcnJvcigpKTsNCiAgICAgICAgRVhQRUNUX0ZBTFNFKHJlYWRlci5IYXNQYXJzZUVycm9yKCkpOw0KDQogICAgICAgIGludCBlW10gPSB7DQogICAgICAgICAgICBoYW5kbGVyLkxPR19TVEFSVEFSUkFZLA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfSU5ULA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfU1RBUlRPQkpFQ1QsDQogICAgICAgICAgICBoYW5kbGVyLkxPR19LRVksDQogICAgICAgICAgICBoYW5kbGVyLkxPR19TVEFSVEFSUkFZLA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfSU5ULA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfSU5ULA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfRU5EQVJSQVksIDIsDQogICAgICAgICAgICBoYW5kbGVyLkxPR19FTkRPQkpFQ1QsIDEsDQogICAgICAgICAgICBoYW5kbGVyLkxPR19OVUxMLA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfQk9PTCwNCiAgICAgICAgICAgIGhhbmRsZXIuTE9HX0JPT0wsDQogICAgICAgICAgICBoYW5kbGVyLkxPR19TVFJJTkcsDQogICAgICAgICAgICBoYW5kbGVyLkxPR19ET1VCTEUsDQogICAgICAgICAgICBoYW5kbGVyLkxPR19FTkRBUlJBWSwgNw0KICAgICAgICB9Ow0KDQogICAgICAgIEVYUEVDVF9FUShzaXplb2YoZSkgLyBzaXplb2YoaW50KSwgaGFuZGxlci5Mb2dDb3VudCk7DQoNCiAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYW5kbGVyLkxvZ0NvdW50OyArK2kpIHsNCiAgICAgICAgICAgIEVYUEVDVF9FUShlW2ldLCBoYW5kbGVyLkxvZ3NbaV0pIDw8ICJpID0gIiA8PCBpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpURVNUKFJlYWRlciwgSXRlcmF0aXZlUGFyc2luZ19Db3VudCkgew0KICAgIHsNCiAgICAgICAgU3RyaW5nU3RyZWFtIGlzKCJbe30sIHtcImtcIjogMX0sIFsxXSwgW11dIik7DQogICAgICAgIFJlYWRlciByZWFkZXI7DQogICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdSZWFkZXJIYW5kbGVyPD4gaGFuZGxlcjsNCg0KICAgICAgICBQYXJzZVJlc3VsdCByID0gcmVhZGVyLlBhcnNlPGtQYXJzZUl0ZXJhdGl2ZUZsYWc+KGlzLCBoYW5kbGVyKTsNCg0KICAgICAgICBFWFBFQ1RfRkFMU0Uoci5Jc0Vycm9yKCkpOw0KICAgICAgICBFWFBFQ1RfRkFMU0UocmVhZGVyLkhhc1BhcnNlRXJyb3IoKSk7DQoNCiAgICAgICAgaW50IGVbXSA9IHsNCiAgICAgICAgICAgIGhhbmRsZXIuTE9HX1NUQVJUQVJSQVksDQogICAgICAgICAgICBoYW5kbGVyLkxPR19TVEFSVE9CSkVDVCwNCiAgICAgICAgICAgIGhhbmRsZXIuTE9HX0VORE9CSkVDVCwgMCwNCiAgICAgICAgICAgIGhhbmRsZXIuTE9HX1NUQVJUT0JKRUNULA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfS0VZLA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfSU5ULA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfRU5ET0JKRUNULCAxLA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfU1RBUlRBUlJBWSwNCiAgICAgICAgICAgIGhhbmRsZXIuTE9HX0lOVCwNCiAgICAgICAgICAgIGhhbmRsZXIuTE9HX0VOREFSUkFZLCAxLA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfU1RBUlRBUlJBWSwNCiAgICAgICAgICAgIGhhbmRsZXIuTE9HX0VOREFSUkFZLCAwLA0KICAgICAgICAgICAgaGFuZGxlci5MT0dfRU5EQVJSQVksIDQNCiAgICAgICAgfTsNCg0KICAgICAgICBFWFBFQ1RfRVEoc2l6ZW9mKGUpIC8gc2l6ZW9mKGludCksIGhhbmRsZXIuTG9nQ291bnQpOw0KDQogICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFuZGxlci5Mb2dDb3VudDsgKytpKSB7DQogICAgICAgICAgICBFWFBFQ1RfRVEoZVtpXSwgaGFuZGxlci5Mb2dzW2ldKSA8PCAiaSA9ICIgPDwgaTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLy8gVGVzdCBpdGVyYXRpdmUgcGFyc2luZyBvbiBrUGFyc2VFcnJvclRlcm1pbmF0aW9uLg0Kc3RydWN0IEhhbmRsZXJUZXJtaW5hdGVBdFN0YXJ0T2JqZWN0IDogcHVibGljIEl0ZXJhdGl2ZVBhcnNpbmdSZWFkZXJIYW5kbGVyPD4gew0KICAgIGJvb2wgU3RhcnRPYmplY3QoKSB7IHJldHVybiBmYWxzZTsgfQ0KfTsNCg0Kc3RydWN0IEhhbmRsZXJUZXJtaW5hdGVBdFN0YXJ0QXJyYXkgOiBwdWJsaWMgSXRlcmF0aXZlUGFyc2luZ1JlYWRlckhhbmRsZXI8PiB7DQogICAgYm9vbCBTdGFydEFycmF5KCkgeyByZXR1cm4gZmFsc2U7IH0NCn07DQoNCnN0cnVjdCBIYW5kbGVyVGVybWluYXRlQXRFbmRPYmplY3QgOiBwdWJsaWMgSXRlcmF0aXZlUGFyc2luZ1JlYWRlckhhbmRsZXI8PiB7DQogICAgYm9vbCBFbmRPYmplY3QoU2l6ZVR5cGUpIHsgcmV0dXJuIGZhbHNlOyB9DQp9Ow0KDQpzdHJ1Y3QgSGFuZGxlclRlcm1pbmF0ZUF0RW5kQXJyYXkgOiBwdWJsaWMgSXRlcmF0aXZlUGFyc2luZ1JlYWRlckhhbmRsZXI8PiB7DQogICAgYm9vbCBFbmRBcnJheShTaXplVHlwZSkgeyByZXR1cm4gZmFsc2U7IH0NCn07DQoNClRFU1QoUmVhZGVyLCBJdGVyYXRpdmVQYXJzaW5nX1Nob3J0Q2lyY3VpdCkgew0KICAgIHsNCiAgICAgICAgSGFuZGxlclRlcm1pbmF0ZUF0U3RhcnRPYmplY3QgaGFuZGxlcjsNCiAgICAgICAgUmVhZGVyIHJlYWRlcjsNCiAgICAgICAgU3RyaW5nU3RyZWFtIGlzKCJbMSwge31dIik7DQoNCiAgICAgICAgUGFyc2VSZXN1bHQgciA9IHJlYWRlci5QYXJzZTxrUGFyc2VJdGVyYXRpdmVGbGFnPihpcywgaGFuZGxlcik7DQoNCiAgICAgICAgRVhQRUNUX1RSVUUocmVhZGVyLkhhc1BhcnNlRXJyb3IoKSk7DQogICAgICAgIEVYUEVDVF9FUShrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCByLkNvZGUoKSk7DQogICAgICAgIEVYUEVDVF9FUSg0dSwgci5PZmZzZXQoKSk7DQogICAgfQ0KDQogICAgew0KICAgICAgICBIYW5kbGVyVGVybWluYXRlQXRTdGFydEFycmF5IGhhbmRsZXI7DQogICAgICAgIFJlYWRlciByZWFkZXI7DQogICAgICAgIFN0cmluZ1N0cmVhbSBpcygie1wiYVwiOiBbXX0iKTsNCg0KICAgICAgICBQYXJzZVJlc3VsdCByID0gcmVhZGVyLlBhcnNlPGtQYXJzZUl0ZXJhdGl2ZUZsYWc+KGlzLCBoYW5kbGVyKTsNCg0KICAgICAgICBFWFBFQ1RfVFJVRShyZWFkZXIuSGFzUGFyc2VFcnJvcigpKTsNCiAgICAgICAgRVhQRUNUX0VRKGtQYXJzZUVycm9yVGVybWluYXRpb24sIHIuQ29kZSgpKTsNCiAgICAgICAgRVhQRUNUX0VRKDZ1LCByLk9mZnNldCgpKTsNCiAgICB9DQoNCiAgICB7DQogICAgICAgIEhhbmRsZXJUZXJtaW5hdGVBdEVuZE9iamVjdCBoYW5kbGVyOw0KICAgICAgICBSZWFkZXIgcmVhZGVyOw0KICAgICAgICBTdHJpbmdTdHJlYW0gaXMoIlsxLCB7fV0iKTsNCg0KICAgICAgICBQYXJzZVJlc3VsdCByID0gcmVhZGVyLlBhcnNlPGtQYXJzZUl0ZXJhdGl2ZUZsYWc+KGlzLCBoYW5kbGVyKTsNCg0KICAgICAgICBFWFBFQ1RfVFJVRShyZWFkZXIuSGFzUGFyc2VFcnJvcigpKTsNCiAgICAgICAgRVhQRUNUX0VRKGtQYXJzZUVycm9yVGVybWluYXRpb24sIHIuQ29kZSgpKTsNCiAgICAgICAgRVhQRUNUX0VRKDV1LCByLk9mZnNldCgpKTsNCiAgICB9DQoNCiAgICB7DQogICAgICAgIEhhbmRsZXJUZXJtaW5hdGVBdEVuZEFycmF5IGhhbmRsZXI7DQogICAgICAgIFJlYWRlciByZWFkZXI7DQogICAgICAgIFN0cmluZ1N0cmVhbSBpcygie1wiYVwiOiBbXX0iKTsNCg0KICAgICAgICBQYXJzZVJlc3VsdCByID0gcmVhZGVyLlBhcnNlPGtQYXJzZUl0ZXJhdGl2ZUZsYWc+KGlzLCBoYW5kbGVyKTsNCg0KICAgICAgICBFWFBFQ1RfVFJVRShyZWFkZXIuSGFzUGFyc2VFcnJvcigpKTsNCiAgICAgICAgRVhQRUNUX0VRKGtQYXJzZUVycm9yVGVybWluYXRpb24sIHIuQ29kZSgpKTsNCiAgICAgICAgRVhQRUNUX0VRKDd1LCByLk9mZnNldCgpKTsNCiAgICB9DQp9DQoNCi8vIEZvciBjb3ZlcmluZyBCYXNlUmVhZGVySGFuZGxlciBkZWZhdWx0IGZ1bmN0aW9ucw0KVEVTVChSZWFkZXIsIEJhc2VSZWFkZXJIYW5kbGVyX0RlZmF1bHQpIHsNCiAgICBCYXNlUmVhZGVySGFuZGxlcjw+IGg7DQogICAgUmVhZGVyIHJlYWRlcjsNCiAgICBTdHJpbmdTdHJlYW0gaXMoIltudWxsLCB0cnVlLCAtMSwgMSwgLTEyMzQ1Njc4OTAxMjM0NTY3ODksIDEyMzQ1Njc4OTAxMjM0NTY3ODksIDMuMTQsIFwic1wiLCB7IFwiYVwiIDogMSB9XSIpOw0KICAgIEVYUEVDVF9UUlVFKHJlYWRlci5QYXJzZShpcywgaCkpOw0KfQ0KDQp0ZW1wbGF0ZSA8aW50IGU+DQpzdHJ1Y3QgVGVybWluYXRlSGFuZGxlciB7DQogICAgYm9vbCBOdWxsKCkgeyByZXR1cm4gZSAhPSAwOyB9DQogICAgYm9vbCBCb29sKGJvb2wpIHsgcmV0dXJuIGUgIT0gMTsgfQ0KICAgIGJvb2wgSW50KGludCkgeyByZXR1cm4gZSAhPSAyOyB9DQogICAgYm9vbCBVaW50KHVuc2lnbmVkKSB7IHJldHVybiBlICE9IDM7IH0NCiAgICBib29sIEludDY0KGludDY0X3QpIHsgcmV0dXJuIGUgIT0gNDsgfQ0KICAgIGJvb2wgVWludDY0KHVpbnQ2NF90KSB7IHJldHVybiBlICE9IDU7ICB9DQogICAgYm9vbCBEb3VibGUoZG91YmxlKSB7IHJldHVybiBlICE9IDY7IH0NCiAgICBib29sIFN0cmluZyhjb25zdCBjaGFyKiwgU2l6ZVR5cGUsIGJvb2wpIHsgcmV0dXJuIGUgIT0gNzsgfQ0KICAgIGJvb2wgU3RhcnRPYmplY3QoKSB7IHJldHVybiBlICE9IDg7IH0NCiAgICBib29sIEtleShjb25zdCBjaGFyKiwgU2l6ZVR5cGUsIGJvb2wpICB7IHJldHVybiBlICE9IDk7IH0NCiAgICBib29sIEVuZE9iamVjdChTaXplVHlwZSkgeyByZXR1cm4gZSAhPSAxMDsgfQ0KICAgIGJvb2wgU3RhcnRBcnJheSgpIHsgcmV0dXJuIGUgIT0gMTE7IH0NCiAgICBib29sIEVuZEFycmF5KFNpemVUeXBlKSB7IHJldHVybiBlICE9IDEyOyB9DQp9Ow0KDQojZGVmaW5lIFRFU1RfVEVSTUlOQVRJT04oZSwganNvbilcDQp7XA0KICAgIFJlYWRlciByZWFkZXI7XA0KICAgIFRlcm1pbmF0ZUhhbmRsZXI8ZT4gaDtcDQogICAgU3RyaW5nU3RyZWFtIGlzKGpzb24pO1wNCiAgICBFWFBFQ1RfRkFMU0UocmVhZGVyLlBhcnNlKGlzLCBoKSk7XA0KICAgIEVYUEVDVF9FUShrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCByZWFkZXIuR2V0UGFyc2VFcnJvckNvZGUoKSk7XA0KfQ0KDQpURVNUKFJlYWRlciwgUGFyc2VUZXJtaW5hdGlvbkJ5SGFuZGxlcikgew0KICAgIFRFU1RfVEVSTUlOQVRJT04oMCwgIltudWxsIik7DQogICAgVEVTVF9URVJNSU5BVElPTigxLCAiW3RydWUiKTsNCiAgICBURVNUX1RFUk1JTkFUSU9OKDEsICJbZmFsc2UiKTsNCiAgICBURVNUX1RFUk1JTkFUSU9OKDIsICJbLTEiKTsNCiAgICBURVNUX1RFUk1JTkFUSU9OKDMsICJbMSIpOw0KICAgIFRFU1RfVEVSTUlOQVRJT04oNCwgIlstMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOw0KICAgIFRFU1RfVEVSTUlOQVRJT04oNSwgIlsxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7DQogICAgVEVTVF9URVJNSU5BVElPTig2LCAiWzAuNV0iKTsNCiAgICBURVNUX1RFUk1JTkFUSU9OKDcsICJbXCJhXCIiKTsNCiAgICBURVNUX1RFUk1JTkFUSU9OKDgsICJbeyIpOw0KICAgIFRFU1RfVEVSTUlOQVRJT04oOSwgIlt7XCJhXCIiKTsNCiAgICBURVNUX1RFUk1JTkFUSU9OKDEwLCAiW3t9Iik7DQogICAgVEVTVF9URVJNSU5BVElPTigxMCwgIlt7XCJhXCI6MX0iKTsgLy8gbm9uLWVtcHR5IG9iamVjdA0KICAgIFRFU1RfVEVSTUlOQVRJT04oMTEsICJ7XCJhXCI6WyIpOw0KICAgIFRFU1RfVEVSTUlOQVRJT04oMTIsICJ7XCJhXCI6W10iKTsNCiAgICBURVNUX1RFUk1JTkFUSU9OKDEyLCAie1wiYVwiOlsxXSIpOyAvLyBub24tZW1wdHkgYXJyYXkNCn0NCg0KI2lmZGVmIF9fR05VQ19fDQpSQVBJREpTT05fRElBR19QT1ANCiNlbmRpZg0K