PGh0bWw+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KPHRpdGxlPk1hbnVhbGx5IHJlZ2lzdGVyZWQgbnVsbGFyeSBmdW5jdGlvbiBiYXNlZCB0ZXN0IGNhc2U8L3RpdGxlPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uL3N0eWxlL3N0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgo8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiPgo8bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uLy4uLy4uL2luZGV4Lmh0bWwiIHRpdGxlPSJCb29zdCBUZXN0IExpYnJhcnkiPgo8bGluayByZWw9InVwIiBocmVmPSJudWxsYXJ5LXRlc3QtY2FzZS5odG1sIiB0aXRsZT0iTnVsbGFyeSBmdW5jdGlvbiBiYXNlZCB0ZXN0IGNhc2UiPgo8bGluayByZWw9InByZXYiIGhyZWY9Im51bGxhcnktdGVzdC1jYXNlLmh0bWwiIHRpdGxlPSJOdWxsYXJ5IGZ1bmN0aW9uIGJhc2VkIHRlc3QgY2FzZSI+CjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0iYXV0by1udWxsYXJ5LXRlc3QtY2FzZS5odG1sIiB0aXRsZT0iTnVsbGFyeSBmdW5jdGlvbiBiYXNlZCB0ZXN0IGNhc2Ugd2l0aCBhdXRvbWF0ZWQgcmVnaXN0cmF0aW9uIj4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdDEuMiIgc3JjPSIuLi8uLi8uLi8uLi9qcy9ib29zdC10ZXN0LmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+Cjx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyPgo8dGQgd2lkdGg9IjEwJSI+PGEgaHJlZj0iLi4vLi4vLi4vaW5kZXguaHRtbCI+PGltZyBhbHQ9IkhvbWUiIHdpZHRoPSIyMjkiIGhlaWdodD0iNjEiIGJvcmRlcj0iMCIgc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Rlc3QvZG9jYm9vay9pbWcvYm9vc3QudGVzdC5sb2dvLnBuZyI+PC9hPjwvdGQ+Cjx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiPiAmZ3Q7IDxhIGhyZWY9Ii4uLy4uLy4uL3V0Zi5odG1sIj5UaGUgVW5pdCBUZXN0IEZyYW1ld29yazwvYT4gJmd0OyA8YSBocmVmPSIuLi8uLi91c2VyLWd1aWRlLmh0bWwiPlVzZXIncyBndWlkZTwvYT48YSBocmVmPSIuLi8uLi90ZXN0aW5nLXRvb2xzLmh0bWwiPgogICAgICAmZ3Q7CiAgICAgIDwvYT48YSBocmVmPSIuLi90ZXN0LW9yZ2FuaXphdGlvbi5odG1sIj5UZXN0IG9yZ2FuaXphdGlvbjwvYT48YSBocmVmPSIuLi9maXh0dXJlLmh0bWwiPgogICAgICAmZ3Q7CiAgICAgIDwvYT48YSBocmVmPSJudWxsYXJ5LXRlc3QtY2FzZS5odG1sIj5OdWxsYXJ5IGZ1bmN0aW9uIGJhc2VkIHRlc3QgY2FzZTwvYT48YSBocmVmPSJ1bmFyeS10ZXN0LWNhc2UuaHRtbCI+CiAgICAgICZndDsKICAgICAgPC9hPjxiPk1hbnVhbCByZWdpc3RyYXRpb248L2I+CjwvdGQ+Cjx0ZD48ZGl2IGNsYXNzPSJzcGlyaXQtbmF2Ij4KPGEgaHJlZj0ibnVsbGFyeS10ZXN0LWNhc2UuaHRtbCI+PGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RvYy9odG1sL2ltYWdlcy9wcmV2LnBuZyIgYWx0PSJQcmV2Ij48L2E+PGEgaHJlZj0iYXV0by1udWxsYXJ5LXRlc3QtY2FzZS5odG1sIj48aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL25leHQucG5nIiBhbHQ9Ik5leHQiPjwvYT4KPC9kaXY+PC90ZD4KPC90cj48L3RhYmxlPgo8aHI+CjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj4KPGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg2IGNsYXNzPSJ0aXRsZSI+CjxhIG5hbWU9InV0Zi51c2VyLWd1aWRlLnRlc3Qtb3JnYW5pemF0aW9uLm1hbnVhbC1udWxsYXJ5LXRlc3QtY2FzZSI+PC9hPk1hbnVhbGx5IHJlZ2lzdGVyZWQgbnVsbGFyeSBmdW5jdGlvbiBiYXNlZCB0ZXN0IGNhc2U8L2g2PjwvZGl2PjwvZGl2PjwvZGl2Pgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgICBUbyBjcmVhdGUgYSB0ZXN0IGNhc2UgbWFudWFsbHksIGVtcGxveSB0aGUgbWFjcm8gQk9PU1RfVEVTVF9DQVNFOgogICA8L3A+CjxwcmUgY2xhc3M9ImlubGluZS1zeW5vcHNpcyI+CjxhIG5hbWU9IkJPT1NUX1RFU1RfQ0FTRSI+PC9hPkJPT1NUX1RFU1RfQ0FTRSg8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT50ZXN0X2Z1bmN0aW9uPC9lbT48L3NwYW4+KTwvcHJlPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgICBCT09TVF9URVNUX0NBU0UgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9jYXNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKICAgIGNvbnN0cnVjdGVkIGluc3RhbmNlLiBUaGUgdGVzdCBjYXNlIG5hbWUgaXMgZGVkdWNlZCBmcm9tIHRoZSBtYWNybyBhcmd1bWVudCB0ZXN0X2Z1bmN0aW9uLiBJZiB5b3UgcHJlZmVyIHRvCiAgICBhc3NpZ24gYSBkaWZmZXJlbnQgdGVzdCBjYXNlIG5hbWUsIHlvdSBoYXZlIHRvIHVzZSB0aGUgdW5kZXJseWluZyBtYWtlX3Rlc3RfY2FzZSBpbnRlcmZhY2UgaW5zdGVhZC4gVG8KICAgIHJlZ2lzdGVyIGEgbmV3IHRlc3QgY2FzZSwgZW1wbG95IHRoZSBtZXRob2QgdGVzdF9zdWl0ZTo6YWRkLiBCb3RoIHRlc3QgY2FzZSBjcmVhdGlvbiBhbmQgcmVnaXN0cmF0aW9uIGFyZQogICAgcGVyZm9ybWVkIGluIHRoZSB0ZXN0IG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KICAgPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgICBIZXJlIGlzIHRoZSBzaW1wbGVzdCBwb3NzaWJsZSBtYW51YWxseSByZWdpc3RlcmVkIHRlc3QgY2FzZS4gVGhpcyBleGFtcGxlIGVtcGxveXMgdGhlIG9yaWdpbmFsIHRlc3QgbW9kdWxlCiAgICBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBzcGVjaWZpY2F0aW9uLiBBIHNpbmdsZSB0ZXN0IGNhc2UgaXMgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZCBpbiB0aGUgbWFzdGVyIHRlc3Qgc3VpdGUuCiAgICBOb3RlIHRoYXQgdGhlIGZyZWUgZnVuY3Rpb24gbmFtZSBpcyBwYXNzZWQgYnkgYWRkcmVzcyB0byB0aGUgbWFjcm8gQk9PU1RfVEVTVF9DQVNFLgogICA8L3A+CjxkaXYgY2xhc3M9ImV4YW1wbGUiPgo8YSBuYW1lPSJ1dGYudXNlci1ndWlkZS50ZXN0LW9yZ2FuaXphdGlvbi5tYW51YWwtbnVsbGFyeS10ZXN0LWNhc2UuZXhhbXBsZTAxIj48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5FeGFtcGxloDUuoE51bGxhcnkgZnJlZSBmdW5jdGlvbiBtYW51YWxseSByZWdpc3RlcmVkPC9iPjwvcD4KPGRpdiBjbGFzcz0iZXhhbXBsZS1jb250ZW50cyI+CjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4jaW5jbHVkZSAmbHQ7Ym9vc3QvdGVzdC9pbmNsdWRlZC91bml0X3Rlc3QuaHBwJmd0Owp1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDsKCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCgp2b2lkIGZyZWVfdGVzdF9mdW5jdGlvbigpCnsKICAgIEJPT1NUX0NIRUNLKCB0cnVlIC8qIHRlc3QgYXNzZXJ0aW9uICovICk7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCgp0ZXN0X3N1aXRlKgppbml0X3VuaXRfdGVzdF9zdWl0ZSggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIAp7CiAgICBmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuCiAgICAgICAgYWRkKCBCT09TVF9URVNUX0NBU0UoICZhbXA7ZnJlZV90ZXN0X2Z1bmN0aW9uICkgKTsKCiAgICByZXR1cm4gMDsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy8KPC9wcmU+Cjx0YWJsZSBjbGFzcz0ic2ltcGxlbGlzdCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSJTaW1wbGUgbGlzdCI+PHRyPgo8dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPjxhIGhyZWY9Ii4uLy4uLy4uLy4uL3NyYy9leGFtcGxlcy9leGFtcGxlMDEuY3BwIiB0YXJnZXQ9Il90b3AiPlNvdXJjZSBjb2RlPC9hPjwvY29kZT48L3RkPgo8dGQ+IHwgPC90ZD4KPHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj48YSBocmVmPSIjIiB0YXJnZXQ9Il90b3AiIGlkPSJpZDY0OTIzNyIgb25jbGljaz0idG9nZ2xlX2VsZW1lbnQoICdleGFtcGxlMDEtb3V0cHV0JywgJ2lkNjQ5MjM3JywgJ1Nob3cgb3V0cHV0JywgJ0hpZGUgb3V0cHV0JyApOyByZXR1cm4gZmFsc2U7Ij5TaG93IG91dHB1dDwvYT48L2NvZGU+PC90ZD4KPC90cj48L3RhYmxlPgo8cHJlIGNsYXNzPSJleGFtcGxlLW91dHB1dCIgaWQ9ImV4YW1wbGUwMS1vdXRwdXQiPiZndDsgZXhhbXBsZQpSdW5uaW5nIDEgdGVzdCBjYXNlLi4uCgoqKiogTm8gZXJyb3JzIGRldGVjdGVkPC9wcmU+CjwvZGl2Pgo8L2Rpdj4KPGJyIGNsYXNzPSJleGFtcGxlLWJyZWFrIj48cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgICBBIHRlc3QgY2FzZSBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgYSBtZXRob2Qgb2YgYSBjbGFzcy4gSW4gdGhpcyBjYXNlIGEgcG9pbnRlciB0byB0aGUgY2xhc3MgaW5zdGFuY2UgaGFzIHRvIGJlCiAgICBib3VuZCB0byB0aGUgdGVzdCBtZXRob2QgdG8gY3JlYXRlIGEgdGVzdCBjYXNlLiBZb3UgY2FuIHVzZSB0aGUgc2FtZSBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgZm9yIG11bHRpcGxlIHRlc3QKICAgIGNhc2VzLiBUaGUgPGFjcm9ueW0gY2xhc3M9ImFjcm9ueW0iPlVURjwvYWNyb255bT4gZG9lc24ndCB0YWtlIGFuIG93bmVyc2hpcCBvZiB0aGUgY2xhc3MgaW5zdGFuY2UgYW5kIHlvdSBhcmUgcmVxdWlyZWQgdG8gbWFuYWdlIHRoZSBjbGFzcwogICAgaW5zdGFuY2UgbGlmZXRpbWUgeW91cnNlbGYuCiAgIDwvcD4KPGRpdiBjbGFzcz0id2FybmluZyI+PHRhYmxlIGJvcmRlcj0iMCIgc3VtbWFyeT0iV2FybmluZyI+Cjx0cj4KPHRkIHJvd3NwYW49IjIiIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjUiPjxpbWcgYWx0PSJbV2FybmluZ10iIHNyYz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL3dhcm5pbmcucG5nIj48L3RkPgo8dGggYWxpZ249ImxlZnQiPldhcm5pbmc8L3RoPgo8L3RyPgo8dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CiAgICAgVGhlIGNsYXNzIGluc3RhbmNlIGNhbid0IGJlIGRlZmluZWQgaW4gdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHNjb3BlLCBzaW5jZSBpdCBiZWNvbWVzIGludmFsaWQgYXMKICAgICBzb29uIGFzIHRoZSB0ZXN0IGV4ZWN1dGlvbiBleGl0cyBpdC4gSXQgbmVlZHMgdG8gYmUgZWl0aGVyIGRlZmluZWQgc3RhdGljYWxseS9nbG9iYWxseSBvciBtYW5hZ2VkIHVzaW5nIGEKICAgICBzaGFyZWQgcG9pbnRlci4KICAgIDwvcD48L3RkPjwvdHI+CjwvdGFibGU+PC9kaXY+CjxkaXYgY2xhc3M9ImV4YW1wbGUiPgo8YSBuYW1lPSJ1dGYudXNlci1ndWlkZS50ZXN0LW9yZ2FuaXphdGlvbi5tYW51YWwtbnVsbGFyeS10ZXN0LWNhc2UuZXhhbXBsZTAyIj48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5FeGFtcGxloDYuoE51bGxhcnkgbWV0aG9kIG9mIGEgY2xhc3MgYm91bmQgdG8gZ2xvYmFsIGNsYXNzIGluc3RhbmNlIGFuZCBtYW51YWxseSByZWdpc3RlcmVkPC9iPjwvcD4KPGRpdiBjbGFzcz0iZXhhbXBsZS1jb250ZW50cyI+CjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4jaW5jbHVkZSAmbHQ7Ym9vc3QvdGVzdC9pbmNsdWRlZC91bml0X3Rlc3QuaHBwJmd0OwojaW5jbHVkZSAmbHQ7Ym9vc3QvYmluZC5ocHAmZ3Q7CnVzaW5nIG5hbWVzcGFjZSBib29zdDo6dW5pdF90ZXN0OwoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy8KCmNsYXNzIHRlc3RfY2xhc3MgewpwdWJsaWM6CiAgICB2b2lkIHRlc3RfbWV0aG9kKCkKICAgIHsKICAgICAgICBCT09TVF9DSEVDSyggdHJ1ZSAvKiB0ZXN0IGFzc2VydGlvbiAqLyApOwogICAgfQp9IHRlc3RlcjsKCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCgp0ZXN0X3N1aXRlKgppbml0X3VuaXRfdGVzdF9zdWl0ZSggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIAp7CiAgICBmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuCiAgICAgICAgYWRkKCBCT09TVF9URVNUX0NBU0UoIGJvb3N0OjpiaW5kKCAmYW1wO3Rlc3RfY2xhc3M6OnRlc3RfbWV0aG9kLCAmYW1wO3Rlc3RlciApKSk7CgogICAgcmV0dXJuIDA7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCjwvcHJlPgo8dGFibGUgY2xhc3M9InNpbXBsZWxpc3QiIGJvcmRlcj0iMCIgc3VtbWFyeT0iU2ltcGxlIGxpc3QiPjx0cj4KPHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj48YSBocmVmPSIuLi8uLi8uLi8uLi9zcmMvZXhhbXBsZXMvZXhhbXBsZTAyLmNwcCIgdGFyZ2V0PSJfdG9wIj5Tb3VyY2UgY29kZTwvYT48L2NvZGU+PC90ZD4KPHRkPiB8IDwvdGQ+Cjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+PGEgaHJlZj0iIyIgdGFyZ2V0PSJfdG9wIiBpZD0iaWQ2NDkzNDQiIG9uY2xpY2s9InRvZ2dsZV9lbGVtZW50KCAnZXhhbXBsZTAyLW91dHB1dCcsICdpZDY0OTM0NCcsICdTaG93IG91dHB1dCcsICdIaWRlIG91dHB1dCcgKTsgcmV0dXJuIGZhbHNlOyI+U2hvdyBvdXRwdXQ8L2E+PC9jb2RlPjwvdGQ+CjwvdHI+PC90YWJsZT4KPHByZSBjbGFzcz0iZXhhbXBsZS1vdXRwdXQiIGlkPSJleGFtcGxlMDItb3V0cHV0Ij4mZ3Q7IGV4YW1wbGUKUnVubmluZyAxIHRlc3QgY2FzZS4uLgp0ZXN0LmNwcCgxMSk6IGVycm9yIGluICJib29zdDo6YmluZCggJmFtcDt0ZXN0X2NsYXNzOjp0ZXN0X21ldGhvZCwgJmFtcDt0ZXN0ZXIgKSI6IGNoZWNrIGZhbHNlIGZhaWxlZAoKKioqIDEgZmFpbHVyZSBkZXRlY3RlZCBpbiB0ZXN0IHN1aXRlICJNYXN0ZXIgVGVzdCBTdWl0ZSIKPC9wcmU+CjwvZGl2Pgo8L2Rpdj4KPGJyIGNsYXNzPSJleGFtcGxlLWJyZWFrIj48ZGl2IGNsYXNzPSJleGFtcGxlIj4KPGEgbmFtZT0idXRmLnVzZXItZ3VpZGUudGVzdC1vcmdhbml6YXRpb24ubWFudWFsLW51bGxhcnktdGVzdC1jYXNlLmV4YW1wbGUwMyI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RXhhbXBsZaA3LqBOdWxsYXJ5IG1ldGhvZCBvZiBhIGNsYXNzIGJvdW5kIHRvIHNoYXJlZCBjbGFzcyBpbnN0YW5jZSBhbmQgbWFudWFsbHkgcmVnaXN0ZXJlZDwvYj48L3A+CjxkaXYgY2xhc3M9ImV4YW1wbGUtY29udGVudHMiPgo8cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+I2luY2x1ZGUgJmx0O2Jvb3N0L3Rlc3QvaW5jbHVkZWQvdW5pdF90ZXN0LmhwcCZndDsKI2luY2x1ZGUgJmx0O2Jvb3N0L2JpbmQuaHBwJmd0Owp1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDsKCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCgpjbGFzcyB0ZXN0X2NsYXNzIHsKcHVibGljOgogICAgdm9pZCB0ZXN0X21ldGhvZDEoKQogICAgewogICAgICAgIEJPT1NUX0NIRUNLKCB0cnVlIC8qIHRlc3QgYXNzZXJ0aW9uICovICk7CiAgICB9CiAgICB2b2lkIHRlc3RfbWV0aG9kMigpCiAgICB7CiAgICAgICAgQk9PU1RfQ0hFQ0soIGZhbHNlIC8qIHRlc3QgYXNzZXJ0aW9uICovICk7CiAgICB9Cn07CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vLwoKdGVzdF9zdWl0ZSoKaW5pdF91bml0X3Rlc3Rfc3VpdGUoIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSAKewogICAgYm9vc3Q6OnNoYXJlZF9wdHImbHQ7dGVzdF9jbGFzcyZndDsgdGVzdGVyKCBuZXcgdGVzdF9jbGFzcyApOwoKICAgIGZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS4KICAgICAgICBhZGQoIEJPT1NUX1RFU1RfQ0FTRSggYm9vc3Q6OmJpbmQoICZhbXA7dGVzdF9jbGFzczo6dGVzdF9tZXRob2QxLCB0ZXN0ZXIgKSkpOwogICAgZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLgogICAgICAgIGFkZCggQk9PU1RfVEVTVF9DQVNFKCBib29zdDo6YmluZCggJmFtcDt0ZXN0X2NsYXNzOjp0ZXN0X21ldGhvZDIsIHRlc3RlciApKSk7CiAgICByZXR1cm4gMDsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy8KPC9wcmU+Cjx0YWJsZSBjbGFzcz0ic2ltcGxlbGlzdCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSJTaW1wbGUgbGlzdCI+PHRyPgo8dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPjxhIGhyZWY9Ii4uLy4uLy4uLy4uL3NyYy9leGFtcGxlcy9leGFtcGxlMDMuY3BwIiB0YXJnZXQ9Il90b3AiPlNvdXJjZSBjb2RlPC9hPjwvY29kZT48L3RkPgo8dGQ+IHwgPC90ZD4KPHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj48YSBocmVmPSIjIiB0YXJnZXQ9Il90b3AiIGlkPSJpZDY0OTQyOCIgb25jbGljaz0idG9nZ2xlX2VsZW1lbnQoICdleGFtcGxlMDMtb3V0cHV0JywgJ2lkNjQ5NDI4JywgJ1Nob3cgb3V0cHV0JywgJ0hpZGUgb3V0cHV0JyApOyByZXR1cm4gZmFsc2U7Ij5TaG93IG91dHB1dDwvYT48L2NvZGU+PC90ZD4KPC90cj48L3RhYmxlPgo8cHJlIGNsYXNzPSJleGFtcGxlLW91dHB1dCIgaWQ9ImV4YW1wbGUwMy1vdXRwdXQiPiZndDsgZXhhbXBsZQpSdW5uaW5nIDIgdGVzdCBjYXNlcy4uLgp0ZXN0LmNwcCgxNSk6IGVycm9yIGluICJib29zdDo6YmluZCggJmFtcDt0ZXN0X2NsYXNzOjp0ZXN0X21ldGhvZDIsIHRlc3RlciApIjogY2hlY2sgZmFsc2UgZmFpbGVkCgoqKiogMSBmYWlsdXJlIGRldGVjdGVkIGluIHRlc3Qgc3VpdGUgIk1hc3RlciBUZXN0IFN1aXRlIgo8L3ByZT4KPC9kaXY+CjwvZGl2Pgo8YnIgY2xhc3M9ImV4YW1wbGUtYnJlYWsiPjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICAgIElmIHlvdSBkbyBub3QgbmVlZCB0byByZXVzZSB0aGUgdGVzdCBjbGFzcyBpbnN0YW5jZSBhbmQgY2FuJ3Qgb3IgZG8gbm90IHdpc2ggdG8gY3JlYXRlIHRlc3QgY2xhc3MKICAgIGluc3RhbmNlIGdsb2JhbGx5IGl0IG1heSBiZSBlYXNpZXIgYW5kIHNhZmVyIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvbiB0aGUgc3RhY2sgb2YgZnJlZSBmdW5jdGlvbjoKICAgPC9wPgo8ZGl2IGNsYXNzPSJleGFtcGxlIj4KPGEgbmFtZT0idXRmLnVzZXItZ3VpZGUudGVzdC1vcmdhbml6YXRpb24ubWFudWFsLW51bGxhcnktdGVzdC1jYXNlLmV4YW1wbGUwNCI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RXhhbXBsZaA4LqBOdWxsYXJ5IG1ldGhvZCBvZiBhIGNsYXNzIGJvdW5kIHRvIGxvY2FsIGNsYXNzIGluc3RhbmNlIGluc2lkZSBmcmVlIGZ1bmN0aW9uPC9iPjwvcD4KPGRpdiBjbGFzcz0iZXhhbXBsZS1jb250ZW50cyI+CjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4jaW5jbHVkZSZsdDtib29zdC90ZXN0L2luY2x1ZGVkL3VuaXRfdGVzdC5ocHAmZ3Q7Cgp1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDsgCgpjbGFzcyB0ZXN0X2NsYXNzIHsKcHVibGljOgogICAgdm9pZCB0ZXN0X21ldGhvZCgpCiAgICB7CiAgICAgICAgQk9PU1RfQ0hFQ0soIHRydWUgLyogdGVzdCBhc3NlcnRpb24gKi8gKTsKICAgIH0KfTsKCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCgp2b2lkIGZyZWVfdGVzdF9mdW5jdGlvbigpIAp7IAogICAgdGVzdF9jbGFzcyBpbnN0OyAKCiAgICBpbnN0LnRlc3RfbWV0aG9kKCk7IAp9IAoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy8KCnRlc3Rfc3VpdGUqIAppbml0X3VuaXRfdGVzdF9zdWl0ZSggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIAp7IAogICAgZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFkZCggQk9PU1RfVEVTVF9DQVNFKCAmYW1wO2ZyZWVfdGVzdF9mdW5jdGlvbiApICk7IAoKICAgIHJldHVybiAwOyAKfSAKCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCjwvcHJlPgo8dGFibGUgY2xhc3M9InNpbXBsZWxpc3QiIGJvcmRlcj0iMCIgc3VtbWFyeT0iU2ltcGxlIGxpc3QiPjx0cj4KPHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj48YSBocmVmPSIuLi8uLi8uLi8uLi9zcmMvZXhhbXBsZXMvZXhhbXBsZTA0LmNwcCIgdGFyZ2V0PSJfdG9wIj5Tb3VyY2UgY29kZTwvYT48L2NvZGU+PC90ZD4KPHRkPiB8IDwvdGQ+Cjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+PGEgaHJlZj0iIyIgdGFyZ2V0PSJfdG9wIiBpZD0iaWQ2NDk1MjMiIG9uY2xpY2s9InRvZ2dsZV9lbGVtZW50KCAnZXhhbXBsZTA0LW91dHB1dCcsICdpZDY0OTUyMycsICdTaG93IG91dHB1dCcsICdIaWRlIG91dHB1dCcgKTsgcmV0dXJuIGZhbHNlOyI+U2hvdyBvdXRwdXQ8L2E+PC9jb2RlPjwvdGQ+CjwvdHI+PC90YWJsZT4KPHByZSBjbGFzcz0iZXhhbXBsZS1vdXRwdXQiIGlkPSJleGFtcGxlMDQtb3V0cHV0Ij4mZ3Q7IGV4YW1wbGUKUnVubmluZyAxIHRlc3QgY2FzZS4uLgoKKioqIE5vIGVycm9ycyBkZXRlY3RlZAo8L3ByZT4KPC9kaXY+CjwvZGl2Pgo8YnIgY2xhc3M9ImV4YW1wbGUtYnJlYWsiPjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICAgIElmIHlvdSBoYXZlIHRvIHBlcmZvcm0gdGhlIHNhbWUgc2V0IG9mIHRlc3RzIHdpdGggZGlmZmVyZW50IHNldHMgb2YgcGFyYW1ldGVycyB5b3UgbWF5IHdhbnQgdG8gYmFzZSB5b3VyIHRlc3QKICAgIGNhc2Ugb24gYSBmdW5jdGlvbiB3aXRoIGFyZ3VtZW50cyBhbmQgYmluZCBwYXJ0aWN1bGFyIHBhcmFtZXRlcnMgZHVyaW5nIHRlc3QgY2FzZSBjcmVhdGlvbi4KICAgPC9wPgo8ZGl2IGNsYXNzPSJ3YXJuaW5nIj48dGFibGUgYm9yZGVyPSIwIiBzdW1tYXJ5PSJXYXJuaW5nIj4KPHRyPgo8dGQgcm93c3Bhbj0iMiIgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNSI+PGltZyBhbHQ9IltXYXJuaW5nXSIgc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvd2FybmluZy5wbmciPjwvdGQ+Cjx0aCBhbGlnbj0ibGVmdCI+V2FybmluZzwvdGg+CjwvdHI+Cjx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KICAgICBJZiB5b3UgYmluZCBwYXJhbWV0ZXJzIGJ5IHJlZmVyZW5jZSBvciBwb2ludGVyLCB0aGUgcmVmZXJlbmNlZCB2YWx1ZSBjYW4ndCBoYXZlIGxvY2FsIHN0b3JhZ2UgaW4gdGhlCiAgICAgdGVzdCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAgICA8L3A+PC90ZD48L3RyPgo8L3RhYmxlPjwvZGl2Pgo8ZGl2IGNsYXNzPSJleGFtcGxlIj4KPGEgbmFtZT0idXRmLnVzZXItZ3VpZGUudGVzdC1vcmdhbml6YXRpb24ubWFudWFsLW51bGxhcnktdGVzdC1jYXNlLmV4YW1wbGUwNSI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RXhhbXBsZaA5LqBCaW5hcnkgZnJlZSBmdW5jdGlvbiBib3VuZCB0byBzZXQgb2YgZGlmZmVyZW50IHBhcmFtZXRlciBwYWlyczwvYj48L3A+CjxkaXYgY2xhc3M9ImV4YW1wbGUtY29udGVudHMiPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgICAgVGhpcyBleGFtcGxlIGVtcGxveXMgdGhlIGFsdGVybmF0aXZlIHRlc3QgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHNwZWNpZmljYXRpb24uCiAgICA8L3A+CjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4jZGVmaW5lIEJPT1NUX1RFU1RfRFlOX0xJTksKI2luY2x1ZGUgJmx0O2Jvb3N0L3Rlc3QvaW5jbHVkZWQvdW5pdF90ZXN0LmhwcCZndDsKI2luY2x1ZGUgJmx0O2Jvb3N0L2JpbmQuaHBwJmd0Owp1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDsKCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCgp2b2lkIGZyZWVfdGVzdF9mdW5jdGlvbiggaW50IGksIGludCBqICkKewogICAgQk9PU1RfQ0hFQ0soIHRydWUgLyogdGVzdCBhc3NlcnRpb24gKi8gKTsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy8KCmJvb2wKaW5pdF9mdW5jdGlvbigpCnsKICAgIGZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS4KICAgICAgICBhZGQoIEJPT1NUX1RFU1RfQ0FTRSggYm9vc3Q6OmJpbmQoICZhbXA7ZnJlZV90ZXN0X2Z1bmN0aW9uLCAxLCAxICkgKSApOwogICAgZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLgogICAgICAgIGFkZCggQk9PU1RfVEVTVF9DQVNFKCBib29zdDo6YmluZCggJmFtcDtmcmVlX3Rlc3RfZnVuY3Rpb24sIDEsIDIgKSApICk7CiAgICBmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuCiAgICAgICAgYWRkKCBCT09TVF9URVNUX0NBU0UoIGJvb3N0OjpiaW5kKCAmYW1wO2ZyZWVfdGVzdF9mdW5jdGlvbiwgMiwgMSApICkgKTsKCiAgICByZXR1cm4gdHJ1ZTsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy8KCmludAptYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkKewogICAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oICZhbXA7aW5pdF9mdW5jdGlvbiwgYXJnYywgYXJndiApOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vLwo8L3ByZT4KPHRhYmxlIGNsYXNzPSJzaW1wbGVsaXN0IiBib3JkZXI9IjAiIHN1bW1hcnk9IlNpbXBsZSBsaXN0Ij48dHI+Cjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+PGEgaHJlZj0iLi4vLi4vLi4vLi4vc3JjL2V4YW1wbGVzL2V4YW1wbGUwNS5jcHAiIHRhcmdldD0iX3RvcCI+U291cmNlIGNvZGU8L2E+PC9jb2RlPjwvdGQ+Cjx0ZD4gfCA8L3RkPgo8dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPjxhIGhyZWY9IiMiIHRhcmdldD0iX3RvcCIgaWQ9ImlkNjQ5NjM0IiBvbmNsaWNrPSJ0b2dnbGVfZWxlbWVudCggJ2V4YW1wbGUwNS1vdXRwdXQnLCAnaWQ2NDk2MzQnLCAnU2hvdyBvdXRwdXQnLCAnSGlkZSBvdXRwdXQnICk7IHJldHVybiBmYWxzZTsiPlNob3cgb3V0cHV0PC9hPjwvY29kZT48L3RkPgo8L3RyPjwvdGFibGU+CjxwcmUgY2xhc3M9ImV4YW1wbGUtb3V0cHV0IiBpZD0iZXhhbXBsZTA1LW91dHB1dCI+Jmd0OyBleGFtcGxlClJ1bm5pbmcgMyB0ZXN0IGNhc2VzLi4uCgoqKiogTm8gZXJyb3JzIGRldGVjdGVkCjwvcHJlPgo8L2Rpdj4KPC9kaXY+CjxiciBjbGFzcz0iZXhhbXBsZS1icmVhayI+PHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogICAgVGhlIDxhY3JvbnltIGNsYXNzPSJhY3JvbnltIj5VVEY8L2Fjcm9ueW0+IGFsc28gcHJlc2VudHMgYW4gYWx0ZXJuYXRpdmUgbWV0aG9kIGZvciBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjcmVhdGlvbiwgd2hpY2ggaXMgY292ZXJlZCBpbgogICAgPGEgY2xhc3M9InhyZWYiIGhyZWY9InVuYXJ5LXRlc3QtY2FzZS5odG1sIiB0aXRsZT0iVW5hcnkgZnVuY3Rpb24gYmFzZWQgdGVzdCBjYXNlIj50aGUgc2VjdGlvbiBjYWxsZWQgJiM4MjIwO1VuYXJ5IGZ1bmN0aW9uIGJhc2VkIHRlc3QgY2FzZSYjODIyMTs8L2E+LgogICA8L3A+CjwvZGl2Pgo8dGFibGUgeG1sbnM6cmV2PSJodHRwOi8vd3d3LmNzLnJwaS5lZHUvfmdyZWdvZC9ib29zdC90b29scy9kb2MvcmV2aXNpb24iIHdpZHRoPSIxMDAlIj48dHI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJyaWdodCI+PGRpdiBjbGFzcz0iY29weXJpZ2h0LWZvb3RlciI+Q29weXJpZ2h0IKkgMjAwMS0yMDA3IEdlbm5hZGl5IFJvemVudGFsPC9kaXY+PC90ZD4KPC90cj48L3RhYmxlPgo8aHI+CjxkaXYgY2xhc3M9InNwaXJpdC1uYXYiPgo8YSBhY2Nlc3NrZXk9InAiIGhyZWY9Im51bGxhcnktdGVzdC1jYXNlLmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvcHJldi5wbmciIGFsdD0iUHJldiI+PC9hPjxhIGFjY2Vzc2tleT0idSIgaHJlZj0ibnVsbGFyeS10ZXN0LWNhc2UuaHRtbCI+PGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RvYy9odG1sL2ltYWdlcy91cC5wbmciIGFsdD0iVXAiPjwvYT48YSBhY2Nlc3NrZXk9ImgiIGhyZWY9Ii4uLy4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvaG9tZS5wbmciIGFsdD0iSG9tZSI+PC9hPjxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iYXV0by1udWxsYXJ5LXRlc3QtY2FzZS5odG1sIj48aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL25leHQucG5nIiBhbHQ9Ik5leHQiPjwvYT4KPC9kaXY+CjwvYm9keT4KPC9odG1sPgo=