IiIiIFRlc3Qgc2NyaXB0IGZvciB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbi4KCldyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgoKKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KCiIiIiMiCmZyb20gdGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJpZnksIHZlcmJvc2UsIFRlc3RGYWlsZWQKaW1wb3J0IHN5cywgc3RyaW5nCgppZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgICMgVGVzdCBiYXNpYyBzYW5pdHkgb2YgcmVwcigpCiAgICB2ZXJpZnkocmVwcih1J2FiYycpID09ICJ1J2FiYyciKQogICAgdmVyaWZ5KHJlcHIodSdhYlxcYycpID09ICJ1J2FiXFxcXGMnIikKICAgIHZlcmlmeShyZXByKHUnYWJcXCcpID09ICJ1J2FiXFxcXCciKQogICAgdmVyaWZ5KHJlcHIodSdcXGMnKSA9PSAidSdcXFxcYyciKQogICAgdmVyaWZ5KHJlcHIodSdcXCcpID09ICJ1J1xcXFwnIikKICAgIHZlcmlmeShyZXByKHUnXG4nKSA9PSAidSdcXG4nIikKICAgIHZlcmlmeShyZXByKHUnXHInKSA9PSAidSdcXHInIikKICAgIHZlcmlmeShyZXByKHUnXHQnKSA9PSAidSdcXHQnIikKICAgIHZlcmlmeShyZXByKHUnXGInKSA9PSAidSdcXHgwOCciKQogICAgdmVyaWZ5KHJlcHIodSInXCIiKSA9PSAiIiJ1J1xcJyInIiIiKQogICAgdmVyaWZ5KHJlcHIodSInXCIiKSA9PSAiIiJ1J1xcJyInIiIiKQogICAgdmVyaWZ5KHJlcHIodSInIikgPT0gJycndSInIicnJykKICAgIHZlcmlmeShyZXByKHUnIicpID09ICIiInUnIiciIiIpCiAgICBsYXRpbjFyZXByID0gKAogICAgICAgICJ1J1xceDAwXFx4MDFcXHgwMlxceDAzXFx4MDRcXHgwNVxceDA2XFx4MDdcXHgwOFxcdFxcblxceDBiXFx4MGNcXHIiCiAgICAgICAgIlxceDBlXFx4MGZcXHgxMFxceDExXFx4MTJcXHgxM1xceDE0XFx4MTVcXHgxNlxceDE3XFx4MThcXHgxOVxceDFhIgogICAgICAgICJcXHgxYlxceDFjXFx4MWRcXHgxZVxceDFmICFcIiMkJSZcXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJIgogICAgICAgICJKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9flxceDdmIgogICAgICAgICJcXHg4MFxceDgxXFx4ODJcXHg4M1xceDg0XFx4ODVcXHg4NlxceDg3XFx4ODhcXHg4OVxceDhhXFx4OGJcXHg4Y1xceDhkIgogICAgICAgICJcXHg4ZVxceDhmXFx4OTBcXHg5MVxceDkyXFx4OTNcXHg5NFxceDk1XFx4OTZcXHg5N1xceDk4XFx4OTlcXHg5YVxceDliIgogICAgICAgICJcXHg5Y1xceDlkXFx4OWVcXHg5ZlxceGEwXFx4YTFcXHhhMlxceGEzXFx4YTRcXHhhNVxceGE2XFx4YTdcXHhhOFxceGE5IgogICAgICAgICJcXHhhYVxceGFiXFx4YWNcXHhhZFxceGFlXFx4YWZcXHhiMFxceGIxXFx4YjJcXHhiM1xceGI0XFx4YjVcXHhiNlxceGI3IgogICAgICAgICJcXHhiOFxceGI5XFx4YmFcXHhiYlxceGJjXFx4YmRcXHhiZVxceGJmXFx4YzBcXHhjMVxceGMyXFx4YzNcXHhjNFxceGM1IgogICAgICAgICJcXHhjNlxceGM3XFx4YzhcXHhjOVxceGNhXFx4Y2JcXHhjY1xceGNkXFx4Y2VcXHhjZlxceGQwXFx4ZDFcXHhkMlxceGQzIgogICAgICAgICJcXHhkNFxceGQ1XFx4ZDZcXHhkN1xceGQ4XFx4ZDlcXHhkYVxceGRiXFx4ZGNcXHhkZFxceGRlXFx4ZGZcXHhlMFxceGUxIgogICAgICAgICJcXHhlMlxceGUzXFx4ZTRcXHhlNVxceGU2XFx4ZTdcXHhlOFxceGU5XFx4ZWFcXHhlYlxceGVjXFx4ZWRcXHhlZVxceGVmIgogICAgICAgICJcXHhmMFxceGYxXFx4ZjJcXHhmM1xceGY0XFx4ZjVcXHhmNlxceGY3XFx4ZjhcXHhmOVxceGZhXFx4ZmJcXHhmY1xceGZkIgogICAgICAgICJcXHhmZVxceGZmJyIpCiAgICB0ZXN0cmVwciA9IHJlcHIodScnLmpvaW4obWFwKHVuaWNociwgcmFuZ2UoMjU2KSkpKQogICAgdmVyaWZ5KHRlc3RyZXByID09IGxhdGluMXJlcHIpCgpkZWYgdGVzdChtZXRob2QsIGlucHV0LCBvdXRwdXQsICphcmdzKToKICAgIGlmIHZlcmJvc2U6CiAgICAgICAgcHJpbnQgJyVzLiVzJXMgPT8gJXMuLi4gJyAlIChyZXByKGlucHV0KSwgbWV0aG9kLCBhcmdzLCByZXByKG91dHB1dCkpLAogICAgdHJ5OgogICAgICAgIGYgPSBnZXRhdHRyKGlucHV0LCBtZXRob2QpCiAgICAgICAgdmFsdWUgPSBhcHBseShmLCBhcmdzKQogICAgZXhjZXB0OgogICAgICAgIHZhbHVlID0gc3lzLmV4Y190eXBlCiAgICAgICAgZXhjID0gc3lzLmV4Y19pbmZvKClbOjJdCiAgICBlbHNlOgogICAgICAgIGV4YyA9IE5vbmUKICAgIGlmIHZhbHVlICE9IG91dHB1dCBvciB0eXBlKHZhbHVlKSBpcyBub3QgdHlwZShvdXRwdXQpOgogICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgIHByaW50ICdubycKICAgICAgICBwcmludCAnKicsZiwgYGlucHV0YCwgYG91dHB1dGAsIGB2YWx1ZWAKICAgICAgICBpZiBleGM6CiAgICAgICAgICAgIHByaW50ICcgIHZhbHVlID09ICVzOiAlcycgJSAoZXhjKQogICAgZWxzZToKICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICBwcmludCAneWVzJwoKdGVzdCgnY2FwaXRhbGl6ZScsIHUnIGhlbGxvICcsIHUnIGhlbGxvICcpCnRlc3QoJ2NhcGl0YWxpemUnLCB1J2hlbGxvICcsIHUnSGVsbG8gJykKdGVzdCgnY2FwaXRhbGl6ZScsIHUnYWFhYScsIHUnQWFhYScpCnRlc3QoJ2NhcGl0YWxpemUnLCB1J0FhQWEnLCB1J0FhYWEnKQoKdGVzdCgnY291bnQnLCB1J2FhYScsIDMsIHUnYScpCnRlc3QoJ2NvdW50JywgdSdhYWEnLCAwLCB1J2InKQp0ZXN0KCdjb3VudCcsICdhYWEnLCAzLCB1J2EnKQp0ZXN0KCdjb3VudCcsICdhYWEnLCAwLCB1J2InKQp0ZXN0KCdjb3VudCcsIHUnYWFhJywgMywgJ2EnKQp0ZXN0KCdjb3VudCcsIHUnYWFhJywgMCwgJ2InKQoKdGVzdCgndGl0bGUnLCB1JyBoZWxsbyAnLCB1JyBIZWxsbyAnKQp0ZXN0KCd0aXRsZScsIHUnaGVsbG8gJywgdSdIZWxsbyAnKQp0ZXN0KCd0aXRsZScsIHUiZk9yTWFUIHRoSXMgYVMgdGl0TGUgU3RyaW5nIiwgdSdGb3JtYXQgVGhpcyBBcyBUaXRsZSBTdHJpbmcnKQp0ZXN0KCd0aXRsZScsIHUiZk9yTWFULHRoSXMtYVMqdGl0TGU7U3RyaW5nIiwgdSdGb3JtYXQsVGhpcy1BcypUaXRsZTtTdHJpbmcnKQp0ZXN0KCd0aXRsZScsIHUiZ2V0SW50IiwgdSdHZXRpbnQnKQoKdGVzdCgnZmluZCcsIHUnYWJjZGVmZ2hpYWJjJywgMCwgdSdhYmMnKQp0ZXN0KCdmaW5kJywgdSdhYmNkZWZnaGlhYmMnLCA5LCB1J2FiYycsIDEpCnRlc3QoJ2ZpbmQnLCB1J2FiY2RlZmdoaWFiYycsIC0xLCB1J2RlZicsIDQpCgp0ZXN0KCdyZmluZCcsIHUnYWJjZGVmZ2hpYWJjJywgOSwgdSdhYmMnKQoKdGVzdCgnbG93ZXInLCB1J0hlTExvJywgdSdoZWxsbycpCnRlc3QoJ2xvd2VyJywgdSdoZWxsbycsIHUnaGVsbG8nKQoKdGVzdCgndXBwZXInLCB1J0hlTExvJywgdSdIRUxMTycpCnRlc3QoJ3VwcGVyJywgdSdIRUxMTycsIHUnSEVMTE8nKQoKaWYgMDoKICAgIHRyYW5zdGFibGUgPSAnXDAwMFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDAxN1wwMjBcMDIxXDAyMlwwMjNcMDI0XDAyNVwwMjZcMDI3XDAzMFwwMzFcMDMyXDAzM1wwMzRcMDM1XDAzNlwwMzcgISIjJCUmXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9geHl6ZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+XDE3N1wyMDBcMjAxXDIwMlwyMDNcMjA0XDIwNVwyMDZcMjA3XDIxMFwyMTFcMjEyXDIxM1wyMTRcMjE1XDIxNlwyMTdcMjIwXDIyMVwyMjJcMjIzXDIyNFwyMjVcMjI2XDIyN1wyMzBcMjMxXDIzMlwyMzNcMjM0XDIzNVwyMzZcMjM3XDI0MFwyNDFcMjQyXDI0M1wyNDRcMjQ1XDI0NlwyNDdcMjUwXDI1MVwyNTJcMjUzXDI1NFwyNTVcMjU2XDI1N1wyNjBcMjYxXDI2MlwyNjNcMjY0XDI2NVwyNjZcMjY3XDI3MFwyNzFcMjcyXDI3M1wyNzRcMjc1XDI3NlwyNzdcMzAwXDMwMVwzMDJcMzAzXDMwNFwzMDVcMzA2XDMwN1wzMTBcMzExXDMxMlwzMTNcMzE0XDMxNVwzMTZcMzE3XDMyMFwzMjFcMzIyXDMyM1wzMjRcMzI1XDMyNlwzMjdcMzMwXDMzMVwzMzJcMzMzXDMzNFwzMzVcMzM2XDMzN1wzNDBcMzQxXDM0MlwzNDNcMzQ0XDM0NVwzNDZcMzQ3XDM1MFwzNTFcMzUyXDM1M1wzNTRcMzU1XDM1NlwzNTdcMzYwXDM2MVwzNjJcMzYzXDM2NFwzNjVcMzY2XDM2N1wzNzBcMzcxXDM3MlwzNzNcMzc0XDM3NVwzNzZcMzc3JwoKICAgIHRlc3QoJ21ha2V0cmFucycsIHUnYWJjJywgdHJhbnN0YWJsZSwgdSd4eXonKQogICAgdGVzdCgnbWFrZXRyYW5zJywgdSdhYmMnLCBWYWx1ZUVycm9yLCB1J3h5enEnKQoKdGVzdCgnc3BsaXQnLCB1J3RoaXMgaXMgdGhlIHNwbGl0IGZ1bmN0aW9uJywKICAgICBbdSd0aGlzJywgdSdpcycsIHUndGhlJywgdSdzcGxpdCcsIHUnZnVuY3Rpb24nXSkKdGVzdCgnc3BsaXQnLCB1J2F8YnxjfGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sIHUnfCcpCnRlc3QoJ3NwbGl0JywgdSdhfGJ8Y3xkJywgW3UnYScsIHUnYicsIHUnY3xkJ10sIHUnfCcsIDIpCnRlc3QoJ3NwbGl0JywgdSdhIGIgYyBkJywgW3UnYScsIHUnYiBjIGQnXSwgTm9uZSwgMSkKdGVzdCgnc3BsaXQnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjIGQnXSwgTm9uZSwgMikKdGVzdCgnc3BsaXQnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sIE5vbmUsIDMpCnRlc3QoJ3NwbGl0JywgdSdhIGIgYyBkJywgW3UnYScsIHUnYicsIHUnYycsIHUnZCddLCBOb25lLCA0KQp0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EgYiBjIGQnXSwgTm9uZSwgMCkKdGVzdCgnc3BsaXQnLCB1J2EgIGIgIGMgIGQnLCBbdSdhJywgdSdiJywgdSdjICBkJ10sIE5vbmUsIDIpCnRlc3QoJ3NwbGl0JywgdSdhIGIgYyBkICcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSkKdGVzdCgnc3BsaXQnLCB1J2EvL2IvL2MvL2QnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sIHUnLy8nKQp0ZXN0KCdzcGxpdCcsIHUnYS8vYi8vYy8vZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgJy8vJykKdGVzdCgnc3BsaXQnLCAnYS8vYi8vYy8vZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgdScvLycpCnRlc3QoJ3NwbGl0JywgdSdlbmRjYXNlIHRlc3QnLCBbdSdlbmRjYXNlICcsIHUnJ10sIHUndGVzdCcpCnRlc3QoJ3NwbGl0JywgdSdlbmRjYXNlIHRlc3QnLCBbdSdlbmRjYXNlICcsIHUnJ10sICd0ZXN0JykKdGVzdCgnc3BsaXQnLCAnZW5kY2FzZSB0ZXN0JywgW3UnZW5kY2FzZSAnLCB1JyddLCB1J3Rlc3QnKQoKCiMgam9pbiBub3cgd29ya3Mgd2l0aCBhbnkgc2VxdWVuY2UgdHlwZQpjbGFzcyBTZXF1ZW5jZToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXEpOiBzZWxmLnNlcSA9IHNlcQogICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5zZXEpCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6IHJldHVybiBzZWxmLnNlcVtpXQoKdGVzdCgnam9pbicsIHUnICcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSkKdGVzdCgnam9pbicsIHUnICcsIHUnYSBiIGMgZCcsIFsnYScsICdiJywgdSdjJywgdSdkJ10pCnRlc3QoJ2pvaW4nLCB1JycsIHUnYWJjZCcsICh1J2EnLCB1J2InLCB1J2MnLCB1J2QnKSkKdGVzdCgnam9pbicsIHUnICcsIHUndyB4IHkgeicsIFNlcXVlbmNlKCd3eHl6JykpCnRlc3QoJ2pvaW4nLCB1JyAnLCBUeXBlRXJyb3IsIDcpCnRlc3QoJ2pvaW4nLCB1JyAnLCBUeXBlRXJyb3IsIFNlcXVlbmNlKFs3LCB1J2hlbGxvJywgMTIzTF0pKQp0ZXN0KCdqb2luJywgJyAnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10pCnRlc3QoJ2pvaW4nLCAnICcsIHUnYSBiIGMgZCcsIFsnYScsICdiJywgdSdjJywgdSdkJ10pCnRlc3QoJ2pvaW4nLCAnJywgdSdhYmNkJywgKHUnYScsIHUnYicsIHUnYycsIHUnZCcpKQp0ZXN0KCdqb2luJywgJyAnLCB1J3cgeCB5IHonLCBTZXF1ZW5jZSh1J3d4eXonKSkKdGVzdCgnam9pbicsICcgJywgVHlwZUVycm9yLCA3KQoKcmVzdWx0ID0gdScnCmZvciBpIGluIHJhbmdlKDEwKToKICAgIGlmIGkgPiAwOgogICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHUnOicKICAgIHJlc3VsdCA9IHJlc3VsdCArIHUneCcqMTAKdGVzdCgnam9pbicsIHUnOicsIHJlc3VsdCwgW3UneCcgKiAxMF0gKiAxMCkKdGVzdCgnam9pbicsIHUnOicsIHJlc3VsdCwgKHUneCcgKiAxMCwpICogMTApCgp0ZXN0KCdzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1J2hlbGxvJykKdGVzdCgnbHN0cmlwJywgdScgICBoZWxsbyAgICcsIHUnaGVsbG8gICAnKQp0ZXN0KCdyc3RyaXAnLCB1JyAgIGhlbGxvICAgJywgdScgICBoZWxsbycpCnRlc3QoJ3N0cmlwJywgdSdoZWxsbycsIHUnaGVsbG8nKQoKdGVzdCgnc3dhcGNhc2UnLCB1J0hlTExvIGNPbXBVdGVScycsIHUnaEVsbE8gQ29NUHVURXJTJykKCmlmIDA6CiAgICB0ZXN0KCd0cmFuc2xhdGUnLCB1J3h5emFiY2RlZicsIHUneHl6eHl6JywgdHJhbnN0YWJsZSwgdSdkZWYnKQoKICAgIHRhYmxlID0gc3RyaW5nLm1ha2V0cmFucygnYScsIHUnQScpCiAgICB0ZXN0KCd0cmFuc2xhdGUnLCB1J2FiYycsIHUnQWJjJywgdGFibGUpCiAgICB0ZXN0KCd0cmFuc2xhdGUnLCB1J3h5eicsIHUneHl6JywgdGFibGUpCgp0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lQHR3byF0aHJlZSEnLCB1JyEnLCB1J0AnLCAxKQp0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25ldHdvdGhyZWUnLCAnIScsICcnKQp0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lQHR3b0B0aHJlZSEnLCB1JyEnLCB1J0AnLCAyKQp0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lQHR3b0B0aHJlZUAnLCB1JyEnLCB1J0AnLCAzKQp0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lQHR3b0B0aHJlZUAnLCB1JyEnLCB1J0AnLCA0KQp0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lIXR3byF0aHJlZSEnLCB1JyEnLCB1J0AnLCAwKQp0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lQHR3b0B0aHJlZUAnLCB1JyEnLCB1J0AnKQp0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lIXR3byF0aHJlZSEnLCB1J3gnLCB1J0AnKQp0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lIXR3byF0aHJlZSEnLCB1J3gnLCB1J0AnLCAyKQoKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCBUcnVlLCB1J2hlJykKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCBUcnVlLCB1J2hlbGxvJykKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCBGYWxzZSwgdSdoZWxsbyB3b3JsZCcpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgVHJ1ZSwgdScnKQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIEZhbHNlLCB1J2VsbG8nKQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIFRydWUsIHUnZWxsbycsIDEpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgVHJ1ZSwgdSdvJywgNCkKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCBGYWxzZSwgdSdvJywgNSkKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCBUcnVlLCB1JycsIDUpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgRmFsc2UsIHUnbG8nLCA2KQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsb3dvcmxkJywgVHJ1ZSwgdSdsb3dvJywgMykKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIFRydWUsIHUnbG93bycsIDMsIDcpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvd29ybGQnLCBGYWxzZSwgdSdsb3dvJywgMywgNikKCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsbycsIFRydWUsIHUnbG8nKQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG8nLCBGYWxzZSwgdSdoZScpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsbycsIFRydWUsIHUnJykKdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvJywgRmFsc2UsIHUnaGVsbG8gd29ybGQnKQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIEZhbHNlLCB1J3dvcmwnKQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIFRydWUsIHUnd29ybCcsIDMsIDkpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgVHJ1ZSwgdSd3b3JsZCcsIDMsIDEyKQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIFRydWUsIHUnbG93bycsIDEsIDcpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgVHJ1ZSwgdSdsb3dvJywgMiwgNykKdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCBUcnVlLCB1J2xvd28nLCAzLCA3KQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIEZhbHNlLCB1J2xvd28nLCA0LCA3KQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIEZhbHNlLCB1J2xvd28nLCAzLCA4KQp0ZXN0KCdlbmRzd2l0aCcsIHUnYWInLCBGYWxzZSwgdSdhYicsIDAsIDEpCnRlc3QoJ2VuZHN3aXRoJywgdSdhYicsIEZhbHNlLCB1J2FiJywgMCwgMCkKCnRlc3QoJ2V4cGFuZHRhYnMnLCB1J2FiY1xyYWJcdGRlZlxuZ1x0aGknLCB1J2FiY1xyYWIgICAgICBkZWZcbmcgICAgICAgaGknKQp0ZXN0KCdleHBhbmR0YWJzJywgdSdhYmNccmFiXHRkZWZcbmdcdGhpJywgdSdhYmNccmFiICAgICAgZGVmXG5nICAgICAgIGhpJywgOCkKdGVzdCgnZXhwYW5kdGFicycsIHUnYWJjXHJhYlx0ZGVmXG5nXHRoaScsIHUnYWJjXHJhYiAgZGVmXG5nICAgaGknLCA0KQp0ZXN0KCdleHBhbmR0YWJzJywgdSdhYmNcclxuYWJcdGRlZlxuZ1x0aGknLCB1J2FiY1xyXG5hYiAgZGVmXG5nICAgaGknLCA0KQoKaWYgMDoKICAgIHRlc3QoJ2NhcHdvcmRzJywgdSdhYmMgZGVmIGdoaScsIHUnQWJjIERlZiBHaGknKQogICAgdGVzdCgnY2Fwd29yZHMnLCB1J2FiY1x0ZGVmXG5naGknLCB1J0FiYyBEZWYgR2hpJykKICAgIHRlc3QoJ2NhcHdvcmRzJywgdSdhYmNcdCAgIGRlZiAgXG5naGknLCB1J0FiYyBEZWYgR2hpJykKCnZlcmlmeShzdHJpbmcuemZpbGwodSczNCcsIDEpID09IHUnMzQnKQp2ZXJpZnkoc3RyaW5nLnpmaWxsKHUnMzQnLCA1KSA9PSB1JzAwMDM0JykKCiMgQ29tcGFyaXNvbnM6CnByaW50ICdUZXN0aW5nIFVuaWNvZGUgY29tcGFyaXNvbnMuLi4nLAp2ZXJpZnkodSdhYmMnID09ICdhYmMnKQp2ZXJpZnkoJ2FiYycgPT0gdSdhYmMnKQp2ZXJpZnkodSdhYmMnID09IHUnYWJjJykKdmVyaWZ5KHUnYWJjZCcgPiAnYWJjJykKdmVyaWZ5KCdhYmNkJyA+IHUnYWJjJykKdmVyaWZ5KHUnYWJjZCcgPiB1J2FiYycpCnZlcmlmeSh1J2FiYycgPCAnYWJjZCcpCnZlcmlmeSgnYWJjJyA8IHUnYWJjZCcpCnZlcmlmeSh1J2FiYycgPCB1J2FiY2QnKQpwcmludCAnZG9uZS4nCgppZiAwOgogICAgIyBNb3ZlIHRoZXNlIHRlc3RzIHRvIGEgVW5pY29kZSBjb2xsYXRpb24gbW9kdWxlIHRlc3QuLi4KCiAgICBwcmludCAnVGVzdGluZyBVVEYtMTYgY29kZSBwb2ludCBvcmRlciBjb21wYXJpc29ucy4uLicsCiAgICAjTm8gc3Vycm9nYXRlcywgbm8gZml4dXAgcmVxdWlyZWQuCiAgICB2ZXJpZnkodSdcdTAwNjEnIDwgdSdcdTIwYWMnKQogICAgIyBOb24gc3Vycm9nYXRlIGJlbG93IHN1cnJvZ2F0ZSB2YWx1ZSwgbm8gZml4dXAgcmVxdWlyZWQKICAgIHZlcmlmeSh1J1x1MDA2MScgPCB1J1x1ZDgwMFx1ZGMwMicpCgogICAgIyBOb24gc3Vycm9nYXRlIGFib3ZlIHN1cnJvZ2F0ZSB2YWx1ZSwgZml4dXAgcmVxdWlyZWQKICAgIGRlZiB0ZXN0X2xlY21wKHMsIHMyKToKICAgICAgICB2ZXJpZnkocyA8ICBzMiAsICJjb21wYXJpc29uIGZhaWxlZCBvbiAlcyA8ICVzIiAlIChzLCBzMikpCgogICAgZGVmIHRlc3RfZml4dXAocyk6CiAgICAgICAgczIgPSB1J1x1ZDgwMFx1ZGMwMScKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQogICAgICAgIHMyID0gdSdcdWQ5MDBcdWRjMDEnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKICAgICAgICBzMiA9IHUnXHVkYTAwXHVkYzAxJwogICAgICAgIHRlc3RfbGVjbXAocywgczIpCiAgICAgICAgczIgPSB1J1x1ZGIwMFx1ZGMwMScKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQogICAgICAgIHMyID0gdSdcdWQ4MDBcdWRkMDEnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKICAgICAgICBzMiA9IHUnXHVkOTAwXHVkZDAxJwogICAgICAgIHRlc3RfbGVjbXAocywgczIpCiAgICAgICAgczIgPSB1J1x1ZGEwMFx1ZGQwMScKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQogICAgICAgIHMyID0gdSdcdWRiMDBcdWRkMDEnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKICAgICAgICBzMiA9IHUnXHVkODAwXHVkZTAxJwogICAgICAgIHRlc3RfbGVjbXAocywgczIpCiAgICAgICAgczIgPSB1J1x1ZDkwMFx1ZGUwMScKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQogICAgICAgIHMyID0gdSdcdWRhMDBcdWRlMDEnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKICAgICAgICBzMiA9IHUnXHVkYjAwXHVkZTAxJwogICAgICAgIHRlc3RfbGVjbXAocywgczIpCiAgICAgICAgczIgPSB1J1x1ZDgwMFx1ZGZmZicKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQogICAgICAgIHMyID0gdSdcdWQ5MDBcdWRmZmYnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKICAgICAgICBzMiA9IHUnXHVkYTAwXHVkZmZmJwogICAgICAgIHRlc3RfbGVjbXAocywgczIpCiAgICAgICAgczIgPSB1J1x1ZGIwMFx1ZGZmZicKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQoKICAgIHRlc3RfZml4dXAodSdcdWUwMDAnKQogICAgdGVzdF9maXh1cCh1J1x1ZmY2MScpCgogICAgIyBTdXJyb2dhdGVzIG9uIGJvdGggc2lkZXMsIG5vIGZpeHVwIHJlcXVpcmVkCiAgICB2ZXJpZnkodSdcdWQ4MDBcdWRjMDInIDwgdSdcdWQ4NGRcdWRjNTYnKQogICAgcHJpbnQgJ2RvbmUuJwoKdGVzdCgnbGp1c3QnLCB1J2FiYycsICB1J2FiYyAgICAgICAnLCAxMCkKdGVzdCgncmp1c3QnLCB1J2FiYycsICB1JyAgICAgICBhYmMnLCAxMCkKdGVzdCgnY2VudGVyJywgdSdhYmMnLCB1JyAgIGFiYyAgICAnLCAxMCkKdGVzdCgnbGp1c3QnLCB1J2FiYycsICB1J2FiYyAgICcsIDYpCnRlc3QoJ3JqdXN0JywgdSdhYmMnLCAgdScgICBhYmMnLCA2KQp0ZXN0KCdjZW50ZXInLCB1J2FiYycsIHUnIGFiYyAgJywgNikKdGVzdCgnbGp1c3QnLCB1J2FiYycsIHUnYWJjJywgMikKdGVzdCgncmp1c3QnLCB1J2FiYycsIHUnYWJjJywgMikKdGVzdCgnY2VudGVyJywgdSdhYmMnLCB1J2FiYycsIDIpCgp0ZXN0KCdpc2xvd2VyJywgdSdhJywgVHJ1ZSkKdGVzdCgnaXNsb3dlcicsIHUnQScsIEZhbHNlKQp0ZXN0KCdpc2xvd2VyJywgdSdcbicsIEZhbHNlKQp0ZXN0KCdpc2xvd2VyJywgdSdcdTFGRmMnLCBGYWxzZSkKdGVzdCgnaXNsb3dlcicsIHUnYWJjJywgVHJ1ZSkKdGVzdCgnaXNsb3dlcicsIHUnYUJjJywgRmFsc2UpCnRlc3QoJ2lzbG93ZXInLCB1J2FiY1xuJywgVHJ1ZSkKCnRlc3QoJ2lzdXBwZXInLCB1J2EnLCBGYWxzZSkKdGVzdCgnaXN1cHBlcicsIHUnQScsIFRydWUpCnRlc3QoJ2lzdXBwZXInLCB1J1xuJywgRmFsc2UpCmlmIHN5cy5wbGF0Zm9ybVs6NF0gIT0gJ2phdmEnOgogICAgdGVzdCgnaXN1cHBlcicsIHUnXHUxRkZjJywgRmFsc2UpCnRlc3QoJ2lzdXBwZXInLCB1J0FCQycsIFRydWUpCnRlc3QoJ2lzdXBwZXInLCB1J0FiQycsIEZhbHNlKQp0ZXN0KCdpc3VwcGVyJywgdSdBQkNcbicsIFRydWUpCgp0ZXN0KCdpc3RpdGxlJywgdSdhJywgRmFsc2UpCnRlc3QoJ2lzdGl0bGUnLCB1J0EnLCBUcnVlKQp0ZXN0KCdpc3RpdGxlJywgdSdcbicsIEZhbHNlKQp0ZXN0KCdpc3RpdGxlJywgdSdcdTFGRmMnLCBUcnVlKQp0ZXN0KCdpc3RpdGxlJywgdSdBIFRpdGxlY2FzZWQgTGluZScsIFRydWUpCnRlc3QoJ2lzdGl0bGUnLCB1J0FcblRpdGxlY2FzZWQgTGluZScsIFRydWUpCnRlc3QoJ2lzdGl0bGUnLCB1J0EgVGl0bGVjYXNlZCwgTGluZScsIFRydWUpCnRlc3QoJ2lzdGl0bGUnLCB1J0dyZWVrIFx1MUZGY2l0bGVjYXNlcyAuLi4nLCBUcnVlKQp0ZXN0KCdpc3RpdGxlJywgdSdOb3QgYSBjYXBpdGFsaXplZCBTdHJpbmcnLCBGYWxzZSkKdGVzdCgnaXN0aXRsZScsIHUnTm90XHRhIFRpdGxlY2FzZSBTdHJpbmcnLCBGYWxzZSkKdGVzdCgnaXN0aXRsZScsIHUnTm90LS1hIFRpdGxlY2FzZSBTdHJpbmcnLCBGYWxzZSkKCnRlc3QoJ2lzYWxwaGEnLCB1J2EnLCBUcnVlKQp0ZXN0KCdpc2FscGhhJywgdSdBJywgVHJ1ZSkKdGVzdCgnaXNhbHBoYScsIHUnXG4nLCBGYWxzZSkKdGVzdCgnaXNhbHBoYScsIHUnXHUxRkZjJywgVHJ1ZSkKdGVzdCgnaXNhbHBoYScsIHUnYWJjJywgVHJ1ZSkKdGVzdCgnaXNhbHBoYScsIHUnYUJjMTIzJywgRmFsc2UpCnRlc3QoJ2lzYWxwaGEnLCB1J2FiY1xuJywgRmFsc2UpCgp0ZXN0KCdpc2FsbnVtJywgdSdhJywgVHJ1ZSkKdGVzdCgnaXNhbG51bScsIHUnQScsIFRydWUpCnRlc3QoJ2lzYWxudW0nLCB1J1xuJywgRmFsc2UpCnRlc3QoJ2lzYWxudW0nLCB1JzEyM2FiYzQ1NicsIFRydWUpCnRlc3QoJ2lzYWxudW0nLCB1J2ExYjNjJywgVHJ1ZSkKdGVzdCgnaXNhbG51bScsIHUnYUJjMDAwICcsIEZhbHNlKQp0ZXN0KCdpc2FsbnVtJywgdSdhYmNcbicsIEZhbHNlKQoKdGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcblxyZ2hpIiwgW3UnYWJjJywgdSdkZWYnLCB1JycsIHUnZ2hpJ10pCnRlc3QoJ3NwbGl0bGluZXMnLCB1ImFiY1xuZGVmXG5cclxuZ2hpIiwgW3UnYWJjJywgdSdkZWYnLCB1JycsIHUnZ2hpJ10pCnRlc3QoJ3NwbGl0bGluZXMnLCB1ImFiY1xuZGVmXHJcbmdoaSIsIFt1J2FiYycsIHUnZGVmJywgdSdnaGknXSkKdGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcclxuZ2hpXG4iLCBbdSdhYmMnLCB1J2RlZicsIHUnZ2hpJ10pCnRlc3QoJ3NwbGl0bGluZXMnLCB1ImFiY1xuZGVmXHJcbmdoaVxuXHIiLCBbdSdhYmMnLCB1J2RlZicsIHUnZ2hpJywgdScnXSkKdGVzdCgnc3BsaXRsaW5lcycsIHUiXG5hYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnJywgdSdhYmMnLCB1J2RlZicsIHUnZ2hpJywgdScnXSkKdGVzdCgnc3BsaXRsaW5lcycsIHUiXG5hYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnXG4nLCB1J2FiY1xuJywgdSdkZWZcclxuJywgdSdnaGlcbicsIHUnXHInXSwgVHJ1ZSkKCnRlc3QoJ3RyYW5zbGF0ZScsIHUiYWJhYmFiYyIsIHUnYmJiYycsIHtvcmQoJ2EnKTpOb25lfSkKdGVzdCgndHJhbnNsYXRlJywgdSJhYmFiYWJjIiwgdSdpaWljJywge29yZCgnYScpOk5vbmUsIG9yZCgnYicpOm9yZCgnaScpfSkKdGVzdCgndHJhbnNsYXRlJywgdSJhYmFiYWJjIiwgdSdpaWl4Jywge29yZCgnYScpOk5vbmUsIG9yZCgnYicpOm9yZCgnaScpLCBvcmQoJ2MnKTp1J3gnfSkKCiMgQ29udGFpbnM6CnByaW50ICdUZXN0aW5nIFVuaWNvZGUgY29udGFpbnMgbWV0aG9kLi4uJywKdmVyaWZ5KCgnYScgaW4gdSdhYmRiJykgPT0gMSkKdmVyaWZ5KCgnYScgaW4gdSdiZGFiJykgPT0gMSkKdmVyaWZ5KCgnYScgaW4gdSdiZGFiYScpID09IDEpCnZlcmlmeSgoJ2EnIGluIHUnYmRiYScpID09IDEpCnZlcmlmeSgoJ2EnIGluIHUnYmRiYScpID09IDEpCnZlcmlmeSgodSdhJyBpbiB1J2JkYmEnKSA9PSAxKQp2ZXJpZnkoKHUnYScgaW4gdSdiZGInKSA9PSAwKQp2ZXJpZnkoKHUnYScgaW4gJ2JkYicpID09IDApCnZlcmlmeSgodSdhJyBpbiAnYmRiYScpID09IDEpCnZlcmlmeSgodSdhJyBpbiAoJ2EnLDEsTm9uZSkpID09IDEpCnZlcmlmeSgodSdhJyBpbiAoMSxOb25lLCdhJykpID09IDEpCnZlcmlmeSgodSdhJyBpbiAoMSxOb25lLHUnYScpKSA9PSAxKQp2ZXJpZnkoKCdhJyBpbiAoJ2EnLDEsTm9uZSkpID09IDEpCnZlcmlmeSgoJ2EnIGluICgxLE5vbmUsJ2EnKSkgPT0gMSkKdmVyaWZ5KCgnYScgaW4gKDEsTm9uZSx1J2EnKSkgPT0gMSkKdmVyaWZ5KCgnYScgaW4gKCd4JywxLHUneScpKSA9PSAwKQp2ZXJpZnkoKCdhJyBpbiAoJ3gnLDEsTm9uZSkpID09IDApCnByaW50ICdkb25lLicKCiMgRm9ybWF0dGluZzoKcHJpbnQgJ1Rlc3RpbmcgVW5pY29kZSBmb3JtYXR0aW5nIHN0cmluZ3MuLi4nLAp2ZXJpZnkodSIlcywgJXMiICUgKHUiYWJjIiwgImFiYyIpID09IHUnYWJjLCBhYmMnKQp2ZXJpZnkodSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIDEsIDIsIDMpID09IHUnYWJjLCBhYmMsIDEsIDIuMDAwMDAwLCAgMy4wMCcpCnZlcmlmeSh1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgMSwgLTIsIDMpID09IHUnYWJjLCBhYmMsIDEsIC0yLjAwMDAwMCwgIDMuMDAnKQp2ZXJpZnkodSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIC0xLCAtMiwgMy41KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41MCcpCnZlcmlmeSh1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41NycpCnZlcmlmeSh1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAxMDAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAxMDAzLjU3JykKdmVyaWZ5KHUiJWMiICUgKHUiYSIsKSA9PSB1J2EnKQp2ZXJpZnkodSIlYyIgJSAoImEiLCkgPT0gdSdhJykKdmVyaWZ5KHUiJWMiICUgKDM0LCkgPT0gdSciJykKdmVyaWZ5KHUiJWMiICUgKDM2LCkgPT0gdSckJykKaWYgc3lzLnBsYXRmb3JtWzo0XSAhPSAnamF2YSc6CiAgICB2YWx1ZSA9IHUiJXIsICVyIiAlICh1ImFiYyIsICJhYmMiKQogICAgaWYgdmFsdWUgIT0gdSJ1J2FiYycsICdhYmMnIjoKICAgICAgICBwcmludCAnKioqIGZvcm1hdHRpbmcgZmFpbGVkIGZvciAiJXMiJyAlICd1IiVyLCAlciIgJSAodSJhYmMiLCAiYWJjIiknCgp2ZXJpZnkodSIlKHgpcywgJSh5KXMiICUgeyd4Jzp1ImFiYyIsICd5JzoiZGVmIn0gPT0gdSdhYmMsIGRlZicpCnRyeToKICAgIHZhbHVlID0gdSIlKHgpcywgJSjkKXMiICUgeyd4Jzp1ImFiYyIsIHUn5Cc6ImRlZiJ9CmV4Y2VwdCBLZXlFcnJvcjoKICAgIHByaW50ICcqKiogZm9ybWF0dGluZyBmYWlsZWQgZm9yICIlcyInICUgInUnYWJjLCBkZWYnIgplbHNlOgogICAgdmVyaWZ5KHZhbHVlID09IHUnYWJjLCBkZWYnKQoKIyBmb3JtYXR0aW5nIGpvYnMgZGVsZWdhdGVkIGZyb20gdGhlIHN0cmluZyBpbXBsZW1lbnRhdGlvbjoKdmVyaWZ5KCcuLi4lKGZvbylzLi4uJyAlIHsnZm9vJzp1ImFiYyJ9ID09IHUnLi4uYWJjLi4uJykKdmVyaWZ5KCcuLi4lKGZvbylzLi4uJyAlIHsnZm9vJzoiYWJjIn0gPT0gJy4uLmFiYy4uLicpCnZlcmlmeSgnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOiJhYmMifSA9PSAnLi4uYWJjLi4uJykKdmVyaWZ5KCcuLi4lKGZvbylzLi4uJyAlIHt1J2Zvbyc6dSJhYmMifSA9PSB1Jy4uLmFiYy4uLicpCnZlcmlmeSgnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOnUiYWJjIiwnZGVmJzoxMjN9ID09ICB1Jy4uLmFiYy4uLicpCnZlcmlmeSgnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOnUiYWJjIix1J2RlZic6MTIzfSA9PSB1Jy4uLmFiYy4uLicpCnZlcmlmeSgnLi4uJXMuLi4lcy4uLiVzLi4uJXMuLi4nICUgKDEsMiwzLHUiYWJjIikgPT0gdScuLi4xLi4uMi4uLjMuLi5hYmMuLi4nKQp2ZXJpZnkoJy4uLiUlLi4uJSVzLi4uJXMuLi4lcy4uLiVzLi4uJXMuLi4nICUgKDEsMiwzLHUiYWJjIikgPT0gdScuLi4lLi4uJXMuLi4xLi4uMi4uLjMuLi5hYmMuLi4nKQp2ZXJpZnkoJy4uLiVzLi4uJyAlIHUiYWJjIiA9PSB1Jy4uLmFiYy4uLicpCnZlcmlmeSgnJSpzJyAlICg1LHUnYWJjJywpID09IHUnICBhYmMnKQp2ZXJpZnkoJyUqcycgJSAoLTUsdSdhYmMnLCkgPT0gdSdhYmMgICcpCnZlcmlmeSgnJSouKnMnICUgKDUsMix1J2FiYycsKSA9PSB1JyAgIGFiJykKdmVyaWZ5KCclKi4qcycgJSAoNSwzLHUnYWJjJywpID09IHUnICBhYmMnKQp2ZXJpZnkoJyVpICUqLipzJyAlICgxMCwgNSwzLHUnYWJjJywpID09IHUnMTAgICBhYmMnKQp2ZXJpZnkoJyVpJXMgJSouKnMnICUgKDEwLCAzLCA1LDMsdSdhYmMnLCkgPT0gdScxMDMgICBhYmMnKQpwcmludCAnZG9uZS4nCgpwcmludCAnVGVzdGluZyBidWlsdGluIHVuaWNvZGUoKS4uLicsCgojIHVuaWNvZGUob2JqKSB0ZXN0cyAodGhpcyBtYXBzIHRvIFB5T2JqZWN0X1VuaWNvZGUoKSBhdCBDIGxldmVsKQoKdmVyaWZ5KHVuaWNvZGUodSd1bmljb2RlIHJlbWFpbnMgdW5pY29kZScpID09IHUndW5pY29kZSByZW1haW5zIHVuaWNvZGUnKQoKY2xhc3MgVW5pY29kZVN1YmNsYXNzKHVuaWNvZGUpOgogICAgcGFzcwoKdmVyaWZ5KHVuaWNvZGUoVW5pY29kZVN1YmNsYXNzKCd1bmljb2RlIHN1YmNsYXNzIGJlY29tZXMgdW5pY29kZScpKQogICAgICAgPT0gdSd1bmljb2RlIHN1YmNsYXNzIGJlY29tZXMgdW5pY29kZScpCgp2ZXJpZnkodW5pY29kZSgnc3RyaW5ncyBhcmUgY29udmVydGVkIHRvIHVuaWNvZGUnKQogICAgICAgPT0gdSdzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgdG8gdW5pY29kZScpCgpjbGFzcyBVbmljb2RlQ29tcGF0OgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgogICAgICAgIHNlbGYueCA9IHgKICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi54Cgp2ZXJpZnkodW5pY29kZShVbmljb2RlQ29tcGF0KCdfX3VuaWNvZGVfXyBjb21wYXRpYmxlIG9iamVjdHMgYXJlIHJlY29nbml6ZWQnKSkKICAgICAgID09IHUnX191bmljb2RlX18gY29tcGF0aWJsZSBvYmplY3RzIGFyZSByZWNvZ25pemVkJykKCmNsYXNzIFN0cmluZ0NvbXBhdDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKICAgICAgICBzZWxmLnggPSB4CiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi54Cgp2ZXJpZnkodW5pY29kZShTdHJpbmdDb21wYXQoJ19fc3RyX18gY29tcGF0aWJsZSBvYmplY3RzIGFyZSByZWNvZ25pemVkJykpCiAgICAgICA9PSB1J19fc3RyX18gY29tcGF0aWJsZSBvYmplY3RzIGFyZSByZWNvZ25pemVkJykKCiMgdW5pY29kZShvYmopIGlzIGNvbXBhdGlibGUgdG8gc3RyKCk6CgpvID0gU3RyaW5nQ29tcGF0KCd1bmljb2RlKG9iaikgaXMgY29tcGF0aWJsZSB0byBzdHIoKScpCnZlcmlmeSh1bmljb2RlKG8pID09IHUndW5pY29kZShvYmopIGlzIGNvbXBhdGlibGUgdG8gc3RyKCknKQp2ZXJpZnkoc3RyKG8pID09ICd1bmljb2RlKG9iaikgaXMgY29tcGF0aWJsZSB0byBzdHIoKScpCgpmb3Igb2JqIGluICgxMjMsIDEyMy40NSwgMTIzTCk6CiAgICB2ZXJpZnkodW5pY29kZShvYmopID09IHVuaWNvZGUoc3RyKG9iaikpKQoKIyB1bmljb2RlKG9iaiwgZW5jb2RpbmcsIGVycm9yKSB0ZXN0cyAodGhpcyBtYXBzIHRvCiMgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KCkgYXQgQyBsZXZlbCkKCmlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgdHJ5OgogICAgICAgIHVuaWNvZGUodSdkZWNvZGluZyB1bmljb2RlIGlzIG5vdCBzdXBwb3J0ZWQnLCAndXRmLTgnLCAnc3RyaWN0JykKICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiZGVjb2RpbmcgdW5pY29kZSBzaG91bGQgTk9UIGJlIHN1cHBvcnRlZCIKCnZlcmlmeSh1bmljb2RlKCdzdHJpbmdzIGFyZSBkZWNvZGVkIHRvIHVuaWNvZGUnLCAndXRmLTgnLCAnc3RyaWN0JykKICAgICAgID09IHUnc3RyaW5ncyBhcmUgZGVjb2RlZCB0byB1bmljb2RlJykKCmlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgdmVyaWZ5KHVuaWNvZGUoYnVmZmVyKCdjaGFyYWN0ZXIgYnVmZmVycyBhcmUgZGVjb2RlZCB0byB1bmljb2RlJyksCiAgICAgICAgICAgICAgICAgICAndXRmLTgnLCAnc3RyaWN0JykKICAgICAgICAgICA9PSB1J2NoYXJhY3RlciBidWZmZXJzIGFyZSBkZWNvZGVkIHRvIHVuaWNvZGUnKQoKcHJpbnQgJ2RvbmUuJwoKIyBUZXN0IGJ1aWx0aW4gY29kZWNzCnByaW50ICdUZXN0aW5nIGJ1aWx0aW4gY29kZWNzLi4uJywKCiMgVVRGLTcgc3BlY2lmaWMgZW5jb2RpbmcgdGVzdHM6CnV0ZlRlc3RzID0gWyh1J0FcdTIyNjJcdTAzOTEuJywgJ0ErSW1JRGtRLicpLCAgIyBSRkMyMTUyIGV4YW1wbGUKICh1J0hpIE1vbSAtXHUyNjNhLSEnLCAnSGkgTW9tIC0rSmpvLS0hJyksICAgICAjIFJGQzIxNTIgZXhhbXBsZQogKHUnXHU2NUU1XHU2NzJDXHU4QTlFJywgJytaZVZuTElxZS0nKSwgICAgICAgICMgUkZDMjE1MiBleGFtcGxlCiAodSdJdGVtIDMgaXMgXHUwMGEzMS4nLCAnSXRlbSAzIGlzICtBS00tMS4nKSwgIyBSRkMyMTUyIGV4YW1wbGUKICh1JysnLCAnKy0nKSwKICh1JystJywgJystLScpLAogKHUnKz8nLCAnKy0/JyksCiAodSdcPycsICcrQUZ3PycpLAogKHUnKz8nLCAnKy0/JyksCiAodXInXFw/JywgJytBRndBWEE/JyksCiAodXInXFxcPycsICcrQUZ3QVhBQmM/JyksCiAodXInKystLScsICcrLSstLS0nKV0KCmZvciB4LHkgaW4gdXRmVGVzdHM6CiAgICB2ZXJpZnkoIHguZW5jb2RlKCd1dGYtNycpID09IHkgKQoKdHJ5OgogICAgdW5pY29kZSgnKzNBRFlBQS0nLCAndXRmLTcnKSAjIHN1cnJvZ2F0ZXMgbm90IHN1cHBvcnRlZApleGNlcHQgVW5pY29kZUVycm9yOgogICAgcGFzcwplbHNlOgogICAgcmFpc2UgVGVzdEZhaWxlZCwgInVuaWNvZGUoJyszQURZQUEtJywgJ3V0Zi03JykgZmFpbGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiIKCnZlcmlmeSh1bmljb2RlKCcrM0FEWUFBLScsICd1dGYtNycsICdyZXBsYWNlJykgPT0gdSdcdWZmZmQnKQoKIyBVVEYtOCBzcGVjaWZpYyBlbmNvZGluZyB0ZXN0czoKdmVyaWZ5KHUnJy5lbmNvZGUoJ3V0Zi04JykgPT0gJycpCnZlcmlmeSh1J1x1MjBhYycuZW5jb2RlKCd1dGYtOCcpID09ICdceGUyXHg4Mlx4YWMnKQp2ZXJpZnkodSdcdWQ4MDBcdWRjMDInLmVuY29kZSgndXRmLTgnKSA9PSAnXHhmMFx4OTBceDgwXHg4MicpCnZlcmlmeSh1J1x1ZDg0ZFx1ZGM1NicuZW5jb2RlKCd1dGYtOCcpID09ICdceGYwXHhhM1x4OTFceDk2JykKdmVyaWZ5KHUnXHVkODAwJy5lbmNvZGUoJ3V0Zi04JykgPT0gJ1x4ZWRceGEwXHg4MCcpCnZlcmlmeSh1J1x1ZGMwMCcuZW5jb2RlKCd1dGYtOCcpID09ICdceGVkXHhiMFx4ODAnKQp2ZXJpZnkoKHUnXHVkODAwXHVkYzAyJyoxMDAwKS5lbmNvZGUoJ3V0Zi04JykgPT0KICAgICAgICdceGYwXHg5MFx4ODBceDgyJyoxMDAwKQp2ZXJpZnkodSdcdTZiNjNcdTc4YmFcdTMwNmJcdThhMDBcdTMwNDZcdTMwNjhcdTdmZmJcdThhMzNcdTMwNmYnCiAgICAgICB1J1x1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NGUwMCcKICAgICAgIHUnXHU5MGU4XHUzMDZmXHUzMGM5XHUzMGE0XHUzMGM0XHU4YTllXHUzMDY3XHUzMDU5XHUzMDRjJwogICAgICAgdSdcdTMwMDFcdTMwNDJcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNWZcdTMwODlcdTMwODFcdTMwNjcnCiAgICAgICB1J1x1MzA1OVx1MzAwMlx1NWI5Zlx1OTY5Ylx1MzA2Ylx1MzA2Zlx1MzAwY1dlbm4gaXN0IGRhcycKICAgICAgIHUnIE51bnN0dWNrIGdpdCB1bmQnLmVuY29kZSgndXRmLTgnKSA9PSAKICAgICAgICdceGU2XHhhZFx4YTNceGU3XHhhMlx4YmFceGUzXHg4MVx4YWJceGU4XHhhOFx4ODBceGUzXHg4MScKICAgICAgICdceDg2XHhlM1x4ODFceGE4XHhlN1x4YmZceGJiXHhlOFx4YThceGIzXHhlM1x4ODFceGFmXHhlMycKICAgICAgICdceDgxXHg5NVx4ZTNceDgyXHg4Y1x4ZTNceDgxXHhhNlx4ZTNceDgxXHg4NFx4ZTNceDgxXHhiZScKICAgICAgICdceGUzXHg4MVx4OWJceGUzXHg4Mlx4OTNceGUzXHg4MFx4ODJceGU0XHhiOFx4ODBceGU5XHg4MycKICAgICAgICdceGE4XHhlM1x4ODFceGFmXHhlM1x4ODNceDg5XHhlM1x4ODJceGE0XHhlM1x4ODNceDg0XHhlOCcKICAgICAgICdceGFhXHg5ZVx4ZTNceDgxXHhhN1x4ZTNceDgxXHg5OVx4ZTNceDgxXHg4Y1x4ZTNceDgwXHg4MScKICAgICAgICdceGUzXHg4MVx4ODJceGUzXHg4MVx4YThceGUzXHg4MVx4YWZceGUzXHg4MVx4YTdceGUzXHg4MScKICAgICAgICdceDlmXHhlM1x4ODJceDg5XHhlM1x4ODJceDgxXHhlM1x4ODFceGE3XHhlM1x4ODFceDk5XHhlMycKICAgICAgICdceDgwXHg4Mlx4ZTVceGFlXHg5Zlx4ZTlceDlhXHg5Ylx4ZTNceDgxXHhhYlx4ZTNceDgxXHhhZicKICAgICAgICdceGUzXHg4MFx4OGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0IHVuZCcpCgojIFVURi04IHNwZWNpZmljIGRlY29kaW5nIHRlc3RzCnZlcmlmeSh1bmljb2RlKCdceGYwXHhhM1x4OTFceDk2JywgJ3V0Zi04JykgPT0gdSdcVTAwMDIzNDU2JyApCnZlcmlmeSh1bmljb2RlKCdceGYwXHg5MFx4ODBceDgyJywgJ3V0Zi04JykgPT0gdSdcVTAwMDEwMDAyJyApCnZlcmlmeSh1bmljb2RlKCdceGUyXHg4Mlx4YWMnLCAndXRmLTgnKSA9PSB1J1x1MjBhYycgKQoKIyBPdGhlciBwb3NzaWJsZSB1dGYtOCB0ZXN0IGNhc2VzOgojICogc3RyaWN0IGRlY29kaW5nIHRlc3RpbmcgZm9yIGFsbCBvZiB0aGUKIyAgIFVURjhfRVJST1IgY2FzZXMgaW4gUHlVbmljb2RlX0RlY29kZVVURjgKCnZlcmlmeSh1bmljb2RlKCdoZWxsbycsJ2FzY2lpJykgPT0gdSdoZWxsbycpCnZlcmlmeSh1bmljb2RlKCdoZWxsbycsJ3V0Zi04JykgPT0gdSdoZWxsbycpCnZlcmlmeSh1bmljb2RlKCdoZWxsbycsJ3V0ZjgnKSA9PSB1J2hlbGxvJykKdmVyaWZ5KHVuaWNvZGUoJ2hlbGxvJywnbGF0aW4tMScpID09IHUnaGVsbG8nKQoKIyBFcnJvciBoYW5kbGluZwp0cnk6CiAgICB1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknKQogICAgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJywnc3RyaWN0JykKZXhjZXB0IFZhbHVlRXJyb3I6CiAgICBwYXNzCmVsc2U6CiAgICByYWlzZSBUZXN0RmFpbGVkLCAidSdBbmRyXDIwMicuZW5jb2RlKCdhc2NpaScpIGZhaWxlZCB0byByYWlzZSBhbiBleGNlcHRpb24iCnZlcmlmeSh1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknLCdpZ25vcmUnKSA9PSAiQW5kciB4IikKdmVyaWZ5KHUnQW5kclwyMDIgeCcuZW5jb2RlKCdhc2NpaScsJ3JlcGxhY2UnKSA9PSAiQW5kcj8geCIpCgp0cnk6CiAgICB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknKQogICAgdW5pY29kZSgnQW5kclwyMDIgeCcsJ2FzY2lpJywnc3RyaWN0JykKZXhjZXB0IFZhbHVlRXJyb3I6CiAgICBwYXNzCmVsc2U6CiAgICByYWlzZSBUZXN0RmFpbGVkLCAidW5pY29kZSgnQW5kclwyMDInKSBmYWlsZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIgp2ZXJpZnkodW5pY29kZSgnQW5kclwyMDIgeCcsJ2FzY2lpJywnaWdub3JlJykgPT0gdSJBbmRyIHgiKQp2ZXJpZnkodW5pY29kZSgnQW5kclwyMDIgeCcsJ2FzY2lpJywncmVwbGFjZScpID09IHUnQW5kclx1RkZGRCB4JykKCnZlcmlmeSgiXFxOe2Zvb314eCIuZGVjb2RlKCJ1bmljb2RlLWVzY2FwZSIsICJpZ25vcmUiKSA9PSB1Inh4IikKdHJ5OgogICAgIlxcIi5kZWNvZGUoInVuaWNvZGUtZXNjYXBlIikKZXhjZXB0IFZhbHVlRXJyb3I6CiAgICBwYXNzCmVsc2U6CiAgICByYWlzZSBUZXN0RmFpbGVkLCAnIlxcIi5kZWNvZGUoInVuaWNvZGUtZXNjYXBlIikgc2hvdWxkIGZhaWwnCgp2ZXJpZnkodSdoZWxsbycuZW5jb2RlKCdhc2NpaScpID09ICdoZWxsbycpCnZlcmlmeSh1J2hlbGxvJy5lbmNvZGUoJ3V0Zi03JykgPT0gJ2hlbGxvJykKdmVyaWZ5KHUnaGVsbG8nLmVuY29kZSgndXRmLTgnKSA9PSAnaGVsbG8nKQp2ZXJpZnkodSdoZWxsbycuZW5jb2RlKCd1dGY4JykgPT0gJ2hlbGxvJykKdmVyaWZ5KHUnaGVsbG8nLmVuY29kZSgndXRmLTE2LWxlJykgPT0gJ2hcMDAwZVwwMDBsXDAwMGxcMDAwb1wwMDAnKQp2ZXJpZnkodSdoZWxsbycuZW5jb2RlKCd1dGYtMTYtYmUnKSA9PSAnXDAwMGhcMDAwZVwwMDBsXDAwMGxcMDAwbycpCnZlcmlmeSh1J2hlbGxvJy5lbmNvZGUoJ2xhdGluLTEnKSA9PSAnaGVsbG8nKQoKIyBSb3VuZHRyaXAgc2FmZXR5IGZvciBCTVAgKGp1c3QgdGhlIGZpcnN0IDEwMjQgY2hhcnMpCnUgPSB1Jycuam9pbihtYXAodW5pY2hyLCByYW5nZSgxMDI0KSkpCmZvciBlbmNvZGluZyBpbiAoJ3V0Zi03JywgJ3V0Zi04JywgJ3V0Zi0xNicsICd1dGYtMTYtbGUnLCAndXRmLTE2LWJlJywKICAgICAgICAgICAgICAgICAncmF3X3VuaWNvZGVfZXNjYXBlJywgJ3VuaWNvZGVfZXNjYXBlJywgJ3VuaWNvZGVfaW50ZXJuYWwnKToKICAgIHZlcmlmeSh1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZykgPT0gdSkKCiMgUm91bmR0cmlwIHNhZmV0eSBmb3IgQk1QIChqdXN0IHRoZSBmaXJzdCAyNTYgY2hhcnMpCnUgPSB1Jycuam9pbihtYXAodW5pY2hyLCByYW5nZSgyNTYpKSkKZm9yIGVuY29kaW5nIGluICgKICAgICdsYXRpbi0xJywKICAgICk6CiAgICB0cnk6CiAgICAgICAgdmVyaWZ5KHVuaWNvZGUodS5lbmNvZGUoZW5jb2RpbmcpLGVuY29kaW5nKSA9PSB1KQogICAgZXhjZXB0IFRlc3RGYWlsZWQ6CiAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyAiJXMiIGZhaWxlZCByb3VuZC10cmlwJyAlIGVuY29kaW5nCiAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6CiAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyBmb3IgIiVzIiBmYWlsZWQ6ICVzJyAlIChlbmNvZGluZywgd2h5KQoKIyBSb3VuZHRyaXAgc2FmZXR5IGZvciBCTVAgKGp1c3QgdGhlIGZpcnN0IDEyOCBjaGFycykKdSA9IHUnJy5qb2luKG1hcCh1bmljaHIsIHJhbmdlKDEyOCkpKQpmb3IgZW5jb2RpbmcgaW4gKAogICAgJ2FzY2lpJywKICAgICk6CiAgICB0cnk6CiAgICAgICAgdmVyaWZ5KHVuaWNvZGUodS5lbmNvZGUoZW5jb2RpbmcpLGVuY29kaW5nKSA9PSB1KQogICAgZXhjZXB0IFRlc3RGYWlsZWQ6CiAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyAiJXMiIGZhaWxlZCByb3VuZC10cmlwJyAlIGVuY29kaW5nCiAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6CiAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyBmb3IgIiVzIiBmYWlsZWQ6ICVzJyAlIChlbmNvZGluZywgd2h5KQoKIyBSb3VuZHRyaXAgc2FmZXR5IGZvciBub24tQk1QIChqdXN0IGEgZmV3IGNoYXJzKQp1ID0gdSdcVTAwMDEwMDAxXFUwMDAyMDAwMlxVMDAwMzAwMDNcVTAwMDQwMDA0XFUwMDA1MDAwNScKZm9yIGVuY29kaW5nIGluICgndXRmLTgnLAogICAgICAgICAgICAgICAgICd1dGYtMTYnLCAndXRmLTE2LWxlJywgJ3V0Zi0xNi1iZScsCiAgICAgICAgICAgICAgICAgIydyYXdfdW5pY29kZV9lc2NhcGUnLAogICAgICAgICAgICAgICAgICd1bmljb2RlX2VzY2FwZScsICd1bmljb2RlX2ludGVybmFsJyk6CiAgICB2ZXJpZnkodW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpID09IHUpCgojIFVURi04IG11c3QgYmUgcm91bmR0cmlwIHNhZmUgZm9yIGFsbCBVQ1MtMiBjb2RlIHBvaW50cwp1ID0gdScnLmpvaW4obWFwKHVuaWNociwgcmFuZ2UoMHgxMDAwMCkpKQpmb3IgZW5jb2RpbmcgaW4gKCd1dGYtOCcsKToKICAgIHZlcmlmeSh1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZykgPT0gdSkKCnByaW50ICdkb25lLicKCnByaW50ICdUZXN0aW5nIHN0YW5kYXJkIG1hcHBpbmcgY29kZWNzLi4uJywKCnByaW50ICcwLTEyNy4uLicsCnMgPSAnJy5qb2luKG1hcChjaHIsIHJhbmdlKDEyOCkpKQpmb3IgZW5jb2RpbmcgaW4gKAogICAgJ2NwMDM3JywgJ2NwMTAyNicsCiAgICAnY3A0MzcnLCAnY3A1MDAnLCAnY3A3MzcnLCAnY3A3NzUnLCAnY3A4NTAnLAogICAgJ2NwODUyJywgJ2NwODU1JywgJ2NwODYwJywgJ2NwODYxJywgJ2NwODYyJywKICAgICdjcDg2MycsICdjcDg2NScsICdjcDg2NicsCiAgICAnaXNvODg1OV8xMCcsICdpc284ODU5XzEzJywgJ2lzbzg4NTlfMTQnLCAnaXNvODg1OV8xNScsCiAgICAnaXNvODg1OV8yJywgJ2lzbzg4NTlfMycsICdpc284ODU5XzQnLCAnaXNvODg1OV81JywgJ2lzbzg4NTlfNicsCiAgICAnaXNvODg1OV83JywgJ2lzbzg4NTlfOScsICdrb2k4X3InLCAnbGF0aW5fMScsCiAgICAnbWFjX2N5cmlsbGljJywgJ21hY19sYXRpbjInLAoKICAgICdjcDEyNTAnLCAnY3AxMjUxJywgJ2NwMTI1MicsICdjcDEyNTMnLCAnY3AxMjU0JywgJ2NwMTI1NScsCiAgICAnY3AxMjU2JywgJ2NwMTI1NycsICdjcDEyNTgnLAogICAgJ2NwODU2JywgJ2NwODU3JywgJ2NwODY0JywgJ2NwODY5JywgJ2NwODc0JywKCiAgICAnbWFjX2dyZWVrJywgJ21hY19pY2VsYW5kJywnbWFjX3JvbWFuJywgJ21hY190dXJraXNoJywKICAgICdjcDEwMDYnLCAnaXNvODg1OV84JywKCiAgICAjIyMgVGhlc2UgaGF2ZSB1bmRlZmluZWQgbWFwcGluZ3M6CiAgICAjJ2NwNDI0JywKCiAgICAjIyMgVGhlc2UgZmFpbCB0aGUgcm91bmQtdHJpcDoKICAgICMnY3A4NzUnCgogICAgKToKICAgIHRyeToKICAgICAgICB2ZXJpZnkodW5pY29kZShzLGVuY29kaW5nKS5lbmNvZGUoZW5jb2RpbmcpID09IHMpCiAgICBleGNlcHQgVGVzdEZhaWxlZDoKICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKICAgICAgICBwcmludCAnKioqIGNvZGVjIGZvciAiJXMiIGZhaWxlZDogJXMnICUgKGVuY29kaW5nLCB3aHkpCgpwcmludCAnMTI4LTI1NS4uLicsCnMgPSAnJy5qb2luKG1hcChjaHIsIHJhbmdlKDEyOCwyNTYpKSkKZm9yIGVuY29kaW5nIGluICgKICAgICdjcDAzNycsICdjcDEwMjYnLAogICAgJ2NwNDM3JywgJ2NwNTAwJywgJ2NwNzM3JywgJ2NwNzc1JywgJ2NwODUwJywKICAgICdjcDg1MicsICdjcDg1NScsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCiAgICAnY3A4NjMnLCAnY3A4NjUnLCAnY3A4NjYnLAogICAgJ2lzbzg4NTlfMTAnLCAnaXNvODg1OV8xMycsICdpc284ODU5XzE0JywgJ2lzbzg4NTlfMTUnLAogICAgJ2lzbzg4NTlfMicsICdpc284ODU5XzQnLCAnaXNvODg1OV81JywKICAgICdpc284ODU5XzknLCAna29pOF9yJywgJ2xhdGluXzEnLAogICAgJ21hY19jeXJpbGxpYycsICdtYWNfbGF0aW4yJywKCiAgICAjIyMgVGhlc2UgaGF2ZSB1bmRlZmluZWQgbWFwcGluZ3M6CiAgICAjJ2NwMTI1MCcsICdjcDEyNTEnLCAnY3AxMjUyJywgJ2NwMTI1MycsICdjcDEyNTQnLCAnY3AxMjU1JywKICAgICMnY3AxMjU2JywgJ2NwMTI1NycsICdjcDEyNTgnLAogICAgIydjcDQyNCcsICdjcDg1NicsICdjcDg1NycsICdjcDg2NCcsICdjcDg2OScsICdjcDg3NCcsCiAgICAjJ2lzbzg4NTlfMycsICdpc284ODU5XzYnLCAnaXNvODg1OV83JywKICAgICMnbWFjX2dyZWVrJywgJ21hY19pY2VsYW5kJywnbWFjX3JvbWFuJywgJ21hY190dXJraXNoJywKCiAgICAjIyMgVGhlc2UgZmFpbCB0aGUgcm91bmQtdHJpcDoKICAgICMnY3AxMDA2JywgJ2NwODc1JywgJ2lzbzg4NTlfOCcsCgogICAgKToKICAgIHRyeToKICAgICAgICB2ZXJpZnkodW5pY29kZShzLGVuY29kaW5nKS5lbmNvZGUoZW5jb2RpbmcpID09IHMpCiAgICBleGNlcHQgVGVzdEZhaWxlZDoKICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKICAgICAgICBwcmludCAnKioqIGNvZGVjIGZvciAiJXMiIGZhaWxlZDogJXMnICUgKGVuY29kaW5nLCB3aHkpCgpwcmludCAnZG9uZS4nCgpwcmludCAnVGVzdGluZyBVbmljb2RlIHN0cmluZyBjb25jYXRlbmF0aW9uLi4uJywKdmVyaWZ5KCh1ImFiYyIgdSJkZWYiKSA9PSB1ImFiY2RlZiIpCnZlcmlmeSgoImFiYyIgdSJkZWYiKSA9PSB1ImFiY2RlZiIpCnZlcmlmeSgodSJhYmMiICJkZWYiKSA9PSB1ImFiY2RlZiIpCnZlcmlmeSgodSJhYmMiIHUiZGVmIiAiZ2hpIikgPT0gdSJhYmNkZWZnaGkiKQp2ZXJpZnkoKCJhYmMiICJkZWYiIHUiZ2hpIikgPT0gdSJhYmNkZWZnaGkiKQpwcmludCAnZG9uZS4nCgpwcmludCAnVGVzdGluZyBVbmljb2RlIHByaW50aW5nLi4uJywKcHJpbnQgdSdhYmMnCnByaW50IHUnYWJjJywgdSdkZWYnCnByaW50IHUnYWJjJywgJ2RlZicKcHJpbnQgJ2FiYycsIHUnZGVmJwpwcmludCB1J2FiY1xuJwpwcmludCB1J2FiY1xuJywKcHJpbnQgdSdhYmNcbicsCnByaW50IHUnZGVmXG4nCnByaW50IHUnZGVmXG4nCnByaW50ICdkb25lLicK