I3ZlcnNpb24gNDMwDQoNCiNleHRlbnNpb24gR0xfM0RMX2FycmF5X29iamVjdHMgOiBlbmFibGUNCg0KaW50ICBhID0gMHhmZmZmZmZmZjsgIC8vIDMyIGJpdHMsIGEgZ2V0cyB0aGUgdmFsdWUgLTENCmludCAgYiA9IDB4ZmZmZmZmZmZVOyAvLyBFUlJPUjogY2FuJ3QgY29udmVydCB1aW50IHRvIGludA0KdWludCBjID0gMHhmZmZmZmZmZjsgIC8vIDMyIGJpdHMsIGMgZ2V0cyB0aGUgdmFsdWUgMHhGRkZGRkZGRg0KdWludCBkID0gMHhmZmZmZmZmZlU7IC8vIDMyIGJpdHMsIGQgZ2V0cyB0aGUgdmFsdWUgMHhGRkZGRkZGRg0KaW50ICBlID0gLTE7ICAgICAgICAgIC8vIHRoZSBsaXRlcmFsIGlzICIxIiwgdGhlbiBuZWdhdGlvbiBpcyBwZXJmb3JtZWQsDQogICAgICAgICAgICAgICAgICAgICAgLy8gICBhbmQgdGhlIHJlc3VsdGluZyBub24tbGl0ZXJhbCAzMi1iaXQgc2lnbmVkIA0KICAgICAgICAgICAgICAgICAgICAgIC8vICAgYml0IHBhdHRlcm4gb2YgMHhGRkZGRkZGRiBpcyBhc3NpZ25lZCwgZ2l2aW5nIGUgDQogICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgdmFsdWUgb2YgLTEuDQp1aW50IGYgPSAtMXU7ICAgICAgICAgLy8gdGhlIGxpdGVyYWwgaXMgIjF1IiwgdGhlbiBuZWdhdGlvbiBpcyBwZXJmb3JtZWQsDQogICAgICAgICAgICAgICAgICAgICAgLy8gICBhbmQgdGhlIHJlc3VsdGluZyBub24tbGl0ZXJhbCAzMi1iaXQgdW5zaWduZWQgDQogICAgICAgICAgICAgICAgICAgICAgLy8gICBiaXQgcGF0dGVybiBvZiAweEZGRkZGRkZGIGlzIGFzc2lnbmVkLCBnaXZpbmcgZiANCiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHRoZSB2YWx1ZSBvZiAweEZGRkZGRkZGLg0KaW50ICBnID0gMzAwMDAwMDAwMDsgIC8vIGEgc2lnbmVkIGRlY2ltYWwgbGl0ZXJhbCB0YWtpbmcgMzIgYml0cywNCiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHNldHRpbmcgdGhlIHNpZ24gYml0LCBnIGdldHMgLTEyOTQ5NjcyOTYNCmludCAgaCA9IDB4QTAwMDAwMDA7ICAvLyBva2F5LCAzMi1iaXQgc2lnbmVkIGhleGFkZWNpbWFsDQppbnQgIGkgPSA1MDAwMDAwMDAwOyAgLy8gRVJST1I6IG5lZWRzIG1vcmUgdGhhbiAzMiBiaXRzDQppbnQgIGogPSAweEZGRkZGRkZGRjsgLy8gRVJST1I6IG5lZWRzIG1vcmUgdGhhdCAzMiBiaXRzDQppbnQgIGsgPSAweDgwMDAwMDAwOyAgLy8gayBnZXRzIC0yMTQ3NDgzNjQ4ID09IDB4ODAwMDAwMDANCmludCAgbCA9IDIxNDc0ODM2NDg7ICAvLyBsIGdldHMgLTIxNDc0ODM2NDggKHRoZSBsaXRlcmFsIHNldCB0aGUgc2lnbiBiaXQpDQoNCmZsb2F0IGZhLCBmYiA9IDEuNTsgICAgIC8vIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQNCmRvdWJsZSBmYywgZmQgPSAyLjBMRjsgIC8vIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQNCg0KdmVjMiB0ZXhjb29yZDEsIHRleGNvb3JkMjsNCnZlYzMgcG9zaXRpb247DQp2ZWM0IG15UkdCQTsNCml2ZWMyIHRleHR1cmVMb29rdXA7DQpidmVjMyBsZXNzOw0KDQptYXQyIG1hdDJEOw0KbWF0MyBvcHRNYXRyaXg7DQptYXQ0IHZpZXcsIHByb2plY3Rpb247DQptYXQ0eDQgdmlldzsgIC8vIGFuIGFsdGVybmF0ZSB3YXkgb2YgZGVjbGFyaW5nIGEgbWF0NA0KbWF0M3gyIG07ICAgICAvLyBhIG1hdHJpeCB3aXRoIDMgY29sdW1ucyBhbmQgMiByb3dzDQpkbWF0NCBoaWdoUHJlY2lzaW9uTVZQOw0KZG1hdDJ4NCBkbTsNCg0Kc3RydWN0IGxpZ2h0IHsNCiAgICBmbG9hdCBpbnRlbnNpdHk7DQogICAgdmVjMyBwb3NpdGlvbjsNCn0gbGlnaHRWYXI7DQoNCnN0cnVjdCBTIHsgZmxvYXQgZjsgfTsNCg0Kc3RydWN0IFQgew0KCS8vUzsgICAgICAgICAgICAgIC8vIEVycm9yOiBhbm9ueW1vdXMgc3RydWN0dXJlcyBkaXNhbGxvd2VkDQoJLy9zdHJ1Y3QgeyAuLi4gfTsgLy8gRXJyb3I6IGVtYmVkZGVkIHN0cnVjdHVyZXMgZGlzYWxsb3dlZA0KCVMgczsgICAgICAgICAgICAvLyBPa2F5OiBuZXN0ZWQgc3RydWN0dXJlcyB3aXRoIG5hbWUgYXJlIGFsbG93ZWQNCn07DQoNCmZsb2F0IGZyZXF1ZW5jaWVzWzNdOwkNCnVuaWZvcm0gdmVjNCBsaWdodFBvc2l0aW9uWzRdOw0KbGlnaHQgbGlnaHRzW107DQpjb25zdCBpbnQgbnVtTGlnaHRzID0gMjsNCmxpZ2h0IGxpZ2h0c1tudW1MaWdodHNdOw0KDQppbiB2ZWMzIG5vcm1hbDsNCmNlbnRyb2lkIGluIHZlYzIgVGV4Q29vcmQ7DQppbnZhcmlhbnQgY2VudHJvaWQgaW4gdmVjNCBDb2xvcjsNCm5vcGVyc3BlY3RpdmUgaW4gZmxvYXQgdGVtcGVyYXR1cmU7DQpmbGF0IGluIHZlYzMgbXlDb2xvcjsNCm5vcGVyc3BlY3RpdmUgY2VudHJvaWQgaW4gdmVjMiBteVRleENvb3JkOw0KDQp1bmlmb3JtIHZlYzQgbGlnaHRQb3NpdGlvbjsNCnVuaWZvcm0gdmVjMyBjb2xvciA9IHZlYzMoMC43LCAwLjcsIDAuMik7ICAvLyB2YWx1ZSBhc3NpZ25lZCBhdCBsaW5rIHRpbWUNCg0KaW4gTWF0ZXJpYWwgew0KICAgIHNtb290aCBpbiB2ZWM0IENvbG9yMTsgLy8gbGVnYWwsIGlucHV0IGluc2lkZSBpbiBibG9jaw0KICAgIHNtb290aCB2ZWM0IENvbG9yMjsgICAgLy8gbGVnYWwsICdpbicgaW5oZXJpdGVkIGZyb20gJ2luIE1hdGVyaWFsJw0KICAgIHZlYzIgVGV4Q29vcmRBOyAgICAgICAgLy8gbGVnYWwsIFRleENvb3JkIGlzIGFuIGlucHV0DQogICAgdW5pZm9ybSBmbG9hdCBBdHRlbjsgICAvLyBpbGxlZ2FsLCBtaXNtYXRjaGVkICBzdG9yYWdlIHF1YWxpZmllcg0KDQp9Ow0KDQppbiBMaWdodCB7DQogICAgdmVjNCBMaWdodFBvczsNCiAgICB2ZWMzIExpZ2h0Q29sb3I7DQp9Ow0KaW4gQ29sb3JlZFRleHR1cmUgew0KICAgIHZlYzQgQ29sb3I7DQogICAgdmVjMiBUZXhDb29yZDsgICAgICAgIA0KfSBNYXRlcmlhbGE7ICAgICAgICAgICAvLyBpbnN0YW5jZSBuYW1lDQp2ZWMzIENvbG9yOyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBDb2xvciB0aGFuIE1hdGVyaWFsLkNvbG9yDQoNCmluIHZlYzQgZ2xfRnJhZ0Nvb3JkOyAgICAgLy8gcmVkZWNsYXJhdGlvbiB0aGF0IGNoYW5nZXMgbm90aGluZyBpcyBhbGxvd2VkDQoNCi8vIEFsbCB0aGUgZm9sbG93aW5nIGFyZSBhbGxvd2VkIHJlZGVjbGFyYXRpb24gdGhhdCBjaGFuZ2UgYmVoYXZpb3INCmxheW91dChvcmlnaW5fdXBwZXJfbGVmdCkgaW4gdmVjNCBnbF9GcmFnQ29vcmQ7DQpsYXlvdXQocGl4ZWxfY2VudGVyX2ludGVnZXIpIGluIHZlYzQgZ2xfRnJhZ0Nvb3JkOw0KbGF5b3V0KG9yaWdpbl91cHBlcl9sZWZ0LCBwaXhlbF9jZW50ZXJfaW50ZWdlcikgaW4gdmVjNCBnbF9GcmFnQ29vcmQ7DQoNCmxheW91dChlYXJseV9mcmFnbWVudF90ZXN0cykgaW47DQoNCi8vIGNvbXB1dGUgc2hhZGVyOg0KbGF5b3V0IChsb2NhbF9zaXplX3ggPSAzMiwgbG9jYWxfc2l6ZV95ID0gMzIpIGluOw0KbGF5b3V0IChsb2NhbF9zaXplX3ggPSA4KSBpbjsNCg0KbGF5b3V0KGxvY2F0aW9uID0gMykgb3V0IHZlYzQgY29sb3I7DQpsYXlvdXQobG9jYXRpb24gPSAzLCBpbmRleCA9IDEpIG91dCB2ZWM0IGZhY3RvcjsNCmxheW91dChsb2NhdGlvbiA9IDIpIG91dCB2ZWM0IGNvbG9yc1szXTsNCg0KbGF5b3V0IChkZXB0aF9ncmVhdGVyKSBvdXQgZmxvYXQgZ2xfRnJhZ0RlcHRoOw0KDQovLyByZWRlY2xhcmF0aW9uIHRoYXQgY2hhbmdlcyBub3RoaW5nIGlzIGFsbG93ZWQNCm91dCBmbG9hdCBnbF9GcmFnRGVwdGg7DQoNCi8vIGFzc3VtZSBpdCBtYXkgYmUgbW9kaWZpZWQgaW4gYW55IHdheQ0KbGF5b3V0IChkZXB0aF9hbnkpIG91dCBmbG9hdCBnbF9GcmFnRGVwdGg7DQoNCi8vIGFzc3VtZSBpdCBtYXkgYmUgbW9kaWZpZWQgc3VjaCB0aGF0IGl0cyB2YWx1ZSB3aWxsIG9ubHkgaW5jcmVhc2UNCmxheW91dCAoZGVwdGhfZ3JlYXRlcikgb3V0IGZsb2F0IGdsX0ZyYWdEZXB0aDsNCg0KLy8gYXNzdW1lIGl0IG1heSBiZSBtb2RpZmllZCBzdWNoIHRoYXQgaXRzIHZhbHVlIHdpbGwgb25seSBkZWNyZWFzZQ0KbGF5b3V0IChkZXB0aF9sZXNzKSBvdXQgZmxvYXQgZ2xfRnJhZ0RlcHRoOw0KDQovLyBhc3N1bWUgaXQgd2lsbCBub3QgYmUgbW9kaWZpZWQNCmxheW91dCAoZGVwdGhfdW5jaGFuZ2VkKSBvdXQgZmxvYXQgZ2xfRnJhZ0RlcHRoOw0KDQppbiB2ZWM0IGdsX0NvbG9yOyAgICAgICAgICAgICAvLyBwcmVkZWNsYXJlZCBieSB0aGUgZnJhZ21lbnQgbGFuZ3VhZ2UNCmZsYXQgIGluIHZlYzQgZ2xfQ29sb3I7ICAgICAgIC8vIHJlZGVjbGFyZWQgYnkgdXNlciB0byBiZSBmbGF0DQoNCg0KZmxvYXRbNV0gZm9vKGZsb2F0WzVdKSANCnsNCiAgICByZXR1cm4gZmxvYXRbNV0oMy40LCA0LjIsIDUuMCwgNS4yLCAxLjEpOw0KfQ0KDQpwcmVjaXNpb24gaGlnaHAgZmxvYXQ7DQpwcmVjaXNpb24gaGlnaHAgaW50Ow0KcHJlY2lzaW9uIG1lZGl1bXAgaW50Ow0KcHJlY2lzaW9uIGhpZ2hwIGZsb2F0Ow0KDQp2b2lkIG1haW4oKQ0Kew0KICAgIHsNCgkJZmxvYXQgYVs1XSA9IGZsb2F0WzVdKDMuNCwgNC4yLCA1LjAsIDUuMiwgMS4xKTsNCgl9DQoJew0KCQlmbG9hdCBhWzVdID0gZmxvYXRbXSgzLjQsIDQuMiwgNS4wLCA1LjIsIDEuMSk7ICAvLyBzYW1lIHRoaW5nDQoJfQ0KICAgIHsNCgkgICAgdmVjNCBhWzNdWzJdOyAgLy8gc2l6ZS0zIGFycmF5IG9mIHNpemUtMiBhcnJheSBvZiB2ZWM0DQoJCXZlYzRbMl0gYTFbM107ICAvLyBzaXplLTMgYXJyYXkgb2Ygc2l6ZS0yIGFycmF5IG9mIHZlYzQNCgkJdmVjNFszXVsyXSBhMjsgIC8vIHNpemUtMyBhcnJheSBvZiBzaXplLTIgYXJyYXkgb2YgdmVjNA0KCQl2ZWM0IGJbMl0gPSB2ZWM0WzJdKHZlYzQoMC4wKSwgdmVjNCgwLjEpKTsNCgkJdmVjNFszXVsyXSBhMyA9IHZlYzRbM11bMl0oYiwgYiwgYik7ICAgICAgICAvLyBjb25zdHJ1Y3Rvcg0KCQl2b2lkIGZvbyh2ZWM0WzNdWzJdKTsgIC8vIHByb3RvdHlwZSB3aXRoIHVubmFtZWQgcGFyYW1ldGVyDQoJCXZlYzQgYTRbM11bMl0gPSB7dmVjNFsyXSh2ZWM0KDAuMCksIHZlYzQoMS4wKSksICAgDQoJCQkJCQkgdmVjNFsyXSh2ZWM0KDAuMCksIHZlYzQoMS4wKSksICAgDQoJCQkJCQkgdmVjNFsyXSh2ZWM0KDAuMCksIHZlYzQoMS4wKSkgfTsNCiAgICB9DQoJew0KCQlmbG9hdCBhWzVdOw0KCQl7DQoJCQlmbG9hdCBiW10gPSBhOyAgLy8gYiBpcyBleHBsaWNpdGx5IHNpemUgNQ0KCQl9DQoJCXsNCgkJCWZsb2F0IGJbNV0gPSBhOyAvLyBtZWFucyB0aGUgc2FtZSB0aGluZw0KCQl9DQoJCXsNCgkJCWZsb2F0IGJbXSA9IGZsb2F0W10oMSwyLDMsNCw1KTsgIC8vIGFsc28gZXhwbGljaXRseSBzaXplcyB0byA1DQoJCX0NCgkJYS5sZW5ndGgoKTsgIC8vIHJldHVybnMgNSANCgl9DQogICAgew0KCQl2ZWM0IGFbM11bMl07DQoJCWEubGVuZ3RoKCk7ICAgICAvLyB0aGlzIGlzIDMNCgkJYVt4XS5sZW5ndGgoKTsgIC8vIHRoaXMgaXMgMg0KICAgIH0NCgkvLyBmb3IgYW4gYXJyYXkgYiBjb250YWluaW5nIGEgbWVtYmVyIGFycmF5IGE6DQoJYlsrK3hdLmEubGVuZ3RoKCk7ICAgIC8vIGIgaXMgbmV2ZXIgZGVyZWZlcmVuY2VkLCBidXQgkysreJQgaXMgZXZhbHVhdGVkDQoNCgkvLyBmb3IgYW4gYXJyYXkgcyBvZiBhIHNoYWRlciBzdG9yYWdlIG9iamVjdCBjb250YWluaW5nIGEgbWVtYmVyIGFycmF5IGE6DQoJc1t4XS5hLmxlbmd0aCgpOyAgICAgIC8vIHMgaXMgZGVyZWZlcmVuY2VkOyB4IG5lZWRzIHRvIGJlIGEgdmFsaWQgaW5kZXgNCgkvLw0KCS8vQWxsIG9mIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zIHJlc3VsdCBpbiBhIGNvbXBpbGUtdGltZSBlcnJvci4NCgkvL2Zsb2F0IGFbMl0gPSB7IDMuNCwgNC4yLCA1LjAgfTsgICAgICAgICAvLyBpbGxlZ2FsDQoJLy92ZWMyIGIgPSB7IDEuMCwgMi4wLCAzLjAgfTsgICAgICAgICAgICAgLy8gaWxsZWdhbA0KCS8vbWF0M3gzIGMgPSB7IHZlYzMoMC4wKSwgdmVjMygxLjApLCB2ZWMzKDIuMCksIHZlYzMoMy4wKSB9OyAgICAvLyBpbGxlZ2FsDQoJLy9tYXQyeDIgZCA9IHsgMS4wLCAwLjAsIDAuMCwgMS4wIH07ICAgICAgLy8gaWxsZWdhbCwgY2FuJ3QgZmxhdHRlbiBuZXN0aW5nDQoJLy9zdHJ1Y3Qgew0KCS8vCWZsb2F0IGE7DQoJLy8JaW50ICAgYjsNCgkvL30gZSA9IHsgMS4yLCAyLCAzIH07ICAgICAgICAgICAgICAgICAgICAvLyBpbGxlZ2FsDQoNCiAgICBzdHJ1Y3Qgew0KICAgICAgICBmbG9hdCBhOw0KICAgICAgICBpbnQgICBiOw0KICAgIH0gZSA9IHsgMS4yLCAyIH07ICAgICAgICAgICAgIC8vIGxlZ2FsLCBhbGwgdHlwZXMgbWF0Y2gNCg0KICAgIHN0cnVjdCB7DQogICAgICAgIGZsb2F0IGE7DQogICAgICAgIGludCAgIGI7DQogICAgfSBlID0geyAxLCAzIH07ICAgICAgICAgICAgICAgLy8gbGVnYWwsIGZpcnN0IGluaXRpYWxpemVyIGlzIGNvbnZlcnRlZA0KDQogICAgLy9BbGwgb2YgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgcmVzdWx0IGluIGEgY29tcGlsZS10aW1lIGVycm9yLg0KICAgIC8vaW50IGEgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlsbGVnYWwNCiAgICAvL3ZlYzQgYlsyXSA9IHsgdmVjNCgwLjApLCAxLjAgfTsgICAgICAgICAvLyBpbGxlZ2FsDQogICAgLy9tYXQ0eDIgYyA9IHsgdmVjMygwLjApLCB2ZWMzKDEuMCkgfTsgICAgLy8gaWxsZWdhbA0KDQogICAgLy9zdHJ1Y3QgUzEgew0KICAgIC8vICAgIHZlYzQgYTsNCiAgICAvLyAgICB2ZWM0IGI7DQogICAgLy99Ow0KDQogICAgLy9zdHJ1Y3Qgew0KICAgIC8vICAgIGZsb2F0IHM7DQogICAgLy8gICAgZmxvYXQgdDsNCiAgICAvL30gZFtdID0geyBTMSh2ZWM0KDAuMCksIHZlYzQoMS4xKSkgfTsgICAvLyBpbGxlZ2FsDQoNCiAgICB7DQogICAgICAgIGZsb2F0IGFbXSA9IGZsb2F0W10oMy40LCA0LjIsIDUuMCwgNS4yLCAxLjEpOw0KICAgICAgICBmbG9hdCBiW10gPSB7IDMuNCwgNC4yLCA1LjAsIDUuMiwgMS4xIH07DQogICAgICAgIGZsb2F0IGNbXSA9IGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjIGlzIGV4cGxpY2l0bHkgc2l6ZSA1DQogICAgICAgIGZsb2F0IGRbNV0gPSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFucyB0aGUgc2FtZSB0aGluZw0KICAgIH0NCiAgICB7DQogICAgICAgIGNvbnN0IHZlYzMgekF4aXMgPSB2ZWMzICgwLjAsIDAuMCwgMS4wKTsNCiAgICAgICAgY29uc3QgZmxvYXQgY2VpbGluZyA9IGEgKyBiOyAvLyBhIGFuZCBiIG5vdCBuZWNlc3NhcmlseSBjb25zdGFudHMNCiAgICB9DQogICAgew0KICAgICAgICBpbiB2ZWM0IHBvc2l0aW9uOw0KICAgICAgICBpbiB2ZWMzIG5vcm1hbDsNCiAgICAgICAgaW4gdmVjMiB0ZXhDb29yZFs0XTsNCiAgICB9DQogICAgew0KICAgICAgICBsb3dwIGZsb2F0IGNvbG9yOw0KICAgICAgICBvdXQgbWVkaXVtcCB2ZWMyIFA7DQogICAgICAgIGxvd3AgaXZlYzIgZm9vKGxvd3AgbWF0Myk7DQogICAgICAgIGhpZ2hwIG1hdDQgbTsNCiAgICB9DQoNCn0NCg==