A casa do meu equilíbrio: uma ferramenta para reflexão pessoalBy Martha Ramirez / August 13, 2026 LinkedIn Twitter/X Facebook WhatsApp Reddit Email Carregando… PCFET0NUWVBFIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CjxzY3JpcHQ+Ly8gR0VORVJBVEVEIGZyb20gZGMtcnVudGltZS9zcmMvKi50cyDigJQgZG8gbm90IGVkaXQuIFJlYnVpbGQgd2l0aCBgY2QgZGMtcnVudGltZSAmJiBidW4gcnVuIGJ1aWxkYC4KInVzZSBzdHJpY3QiOwooKCkgPT4gewogIHZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgdmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlOwogIHZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4gX19kZWZOb3JtYWxQcm9wKG9iaiwgdHlwZW9mIGtleSAhPT0gInN5bWJvbCIgPyBrZXkgKyAiIiA6IGtleSwgdmFsdWUpOwoKICAvLyBzcmMvcmVhY3QudHMKICBmdW5jdGlvbiBnZXRSZWFjdCgpIHsKICAgIGNvbnN0IFIgPSB3aW5kb3cuUmVhY3Q7CiAgICBpZiAoIVIpIHRocm93IG5ldyBFcnJvcigiZGMtcnVudGltZTogd2luZG93LlJlYWN0IGlzIG5vdCBhdmFpbGFibGUgeWV0Iik7CiAgICByZXR1cm4gUjsKICB9CiAgZnVuY3Rpb24gZ2V0UmVhY3RET00oKSB7CiAgICBjb25zdCBSRCA9IHdpbmRvdy5SZWFjdERPTTsKICAgIGlmICghUkQpIHRocm93IG5ldyBFcnJvcigiZGMtcnVudGltZTogd2luZG93LlJlYWN0RE9NIGlzIG5vdCBhdmFpbGFibGUgeWV0Iik7CiAgICByZXR1cm4gUkQ7CiAgfQogIHZhciBoID0gKCguLi5hcmdzKSA9PiBnZXRSZWFjdCgpLmNyZWF0ZUVsZW1lbnQoCiAgICAuLi5hcmdzCiAgKSk7CgogIC8vIHNyYy9wYXJzZS50cwogIGZ1bmN0aW9uIHBhcnNlRGNEb2N1bWVudChkb2MpIHsKICAgIGNvbnN0IGRjID0gZG9jLnF1ZXJ5U2VsZWN0b3IoIngtZGMiKTsKICAgIGlmICghZGMpIHJldHVybiBudWxsOwogICAgY29uc3Qgc2NyaXB0RWwgPSBkb2MucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZGMtc2NyaXB0XSIpOwogICAgY29uc3QgeyBwcm9wcywgcHJldmlldyB9ID0gcGFyc2VEYXRhUHJvcHMoCiAgICAgIHNjcmlwdEVsPy5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvcHMiKSA/PyBudWxsCiAgICApOwogICAgcmV0dXJuIHsKICAgICAgdGVtcGxhdGU6IGRjLmlubmVySFRNTCwKICAgICAganM6IHNjcmlwdEVsID8gc2NyaXB0RWwudGV4dENvbnRlbnQgfHwgIiIgOiAiIiwKICAgICAgcHJvcHMsCiAgICAgIHByZXZpZXcKICAgIH07CiAgfQogIGZ1bmN0aW9uIHBhcnNlRGNUZXh0KHNyYykgewogICAgY29uc3Qgb3Blbk1hdGNoID0gLzx4LWRjKD86XHNbXj5dKik/Pi8uZXhlYyhzcmMpOwogICAgaWYgKCFvcGVuTWF0Y2gpIHJldHVybiBudWxsOwogICAgY29uc3QgY2xvc2UgPSBzcmMubGFzdEluZGV4T2YoIjwveC1kYz4iKTsKICAgIGlmIChjbG9zZSA9PT0gLTEgfHwgY2xvc2UgPCBvcGVuTWF0Y2guaW5kZXgpIHJldHVybiBudWxsOwogICAgY29uc3QgdGVtcGxhdGUgPSBzcmMuc2xpY2Uob3Blbk1hdGNoLmluZGV4ICsgb3Blbk1hdGNoWzBdLmxlbmd0aCwgY2xvc2UpOwogICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzcmMsICJ0ZXh0L2h0bWwiKTsKICAgIGNvbnN0IHNjcmlwdEVsID0gZG9jLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWRjLXNjcmlwdF0iKTsKICAgIGNvbnN0IHsgcHJvcHMsIHByZXZpZXcgfSA9IHBhcnNlRGF0YVByb3BzKAogICAgICBzY3JpcHRFbD8uZ2V0QXR0cmlidXRlKCJkYXRhLXByb3BzIikgPz8gbnVsbAogICAgKTsKICAgIHJldHVybiB7CiAgICAgIHRlbXBsYXRlLAogICAgICBqczogc2NyaXB0RWwgPyBzY3JpcHRFbC50ZXh0Q29udGVudCB8fCAiIiA6ICIiLAogICAgICBwcm9wcywKICAgICAgcHJldmlldwogICAgfTsKICB9CiAgZnVuY3Rpb24gcGFyc2VEYXRhUHJvcHMocmF3KSB7CiAgICBpZiAoIXJhdykgcmV0dXJuIHsgcHJvcHM6IG51bGwsIHByZXZpZXc6IG51bGwgfTsKICAgIGxldCBwYXJzZWQ7CiAgICB0cnkgewogICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIHsgcHJvcHM6IG51bGwsIHByZXZpZXc6IG51bGwgfTsKICAgIH0KICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICJvYmplY3QiIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkKSkgewogICAgICByZXR1cm4geyBwcm9wczogbnVsbCwgcHJldmlldzogbnVsbCB9OwogICAgfQogICAgY29uc3Qgb2JqID0gcGFyc2VkOwogICAgY29uc3QgcHJldmlldyA9IG9iai4kcHJldmlldyAmJiB0eXBlb2Ygb2JqLiRwcmV2aWV3ID09PSAib2JqZWN0IiA/IG9iai4kcHJldmlldyA6IG51bGw7CiAgICBjb25zdCByZXN0ID0ge307CiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMob2JqKSkgewogICAgICBpZiAoa1swXSAhPT0gIiQiKSByZXN0W2tdID0gb2JqW2tdOwogICAgfQogICAgcmV0dXJuIHsgcHJvcHM6IE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCA/IHJlc3QgOiBudWxsLCBwcmV2aWV3IH07CiAgfQogIGZ1bmN0aW9uIGRjTmFtZUZyb21QYXRoKHBhdGhuYW1lKSB7CiAgICBsZXQgcCA9IHBhdGhuYW1lIHx8ICIiOwogICAgdHJ5IHsKICAgICAgcCA9IGRlY29kZVVSSUNvbXBvbmVudChwKTsKICAgIH0gY2F0Y2ggewogICAgfQogICAgY29uc3QgYmFzZSA9IHAuc3BsaXQoIi8iKS5wb3AoKSB8fCAiUm9vdCI7CiAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLmRjXC5odG1sJC8sICIiKS5yZXBsYWNlKC9cLmh0bWw/JC8sICIiKSB8fCAiUm9vdCI7CiAgfQoKICAvLyBzcmMvYm9vdC50cwogIHZhciBCQVNFX0NTUyA9IGAKICAgIC5zYy1wbGFjZWhvbGRlcntiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA4JSx0cmFuc3BhcmVudCk7CiAgICAgIGJvcmRlcjoxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDUwJSx0cmFuc3BhcmVudCk7CiAgICAgIGJvcmRlci1yYWRpdXM6MnB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpoaWRkZW59CiAgICBAa2V5ZnJhbWVzIHNjLXNoaW5lezAle2JhY2tncm91bmQtcG9zaXRpb246MTAwJSA1MCV9MTAwJXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAlIDUwJX19CiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtcGxhY2Vob2xkZXIsCiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtaW50ZXJwLnNjLW1pc3Npbmd7cG9zaXRpb246cmVsYXRpdmU7CiAgICAgIGJhY2tncm91bmQ6Y29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDUlLHRyYW5zcGFyZW50KTsKICAgICAgYm9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fQogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLXBsYWNlaG9sZGVyOjpiZWZvcmUsCiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtaW50ZXJwLnNjLW1pc3Npbmc6OmJlZm9yZXtjb250ZW50OicnOwogICAgICBwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO3BvaW50ZXItZXZlbnRzOm5vbmU7CiAgICAgIGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLHJnYmEoMjE3LDExOSw4NywwKSAyNSUscmdiYSgyNDcsMjI1LDIxMSwuOTUpIDM3JSxyZ2JhKDIxNywxMTksODcsMCkgNjMlKTsKICAgICAgYmFja2dyb3VuZC1zaXplOjQwMCUgMTAwJTthbmltYXRpb246c2Mtc2hpbmUgMS40cyBlYXNlIGluZmluaXRlfQogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLXBsYWNlaG9sZGVyOm50aC1jaGlsZChuKzkgb2YgLnNjLXBsYWNlaG9sZGVyKTo6YmVmb3JlLAogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLWludGVycC5zYy1taXNzaW5nOm50aC1jaGlsZChuKzkgb2YgLnNjLWludGVycC5zYy1taXNzaW5nKTo6YmVmb3Jle2FuaW1hdGlvbjpub25lOwogICAgICBiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA4JSx0cmFuc3BhcmVudCl9CiAgICAuc2MtcGxhY2Vob2xkZXItZXJyb3J7cGFkZGluZzo0cHggOHB4O2ZvbnQ6MTFweC8xLjQgdWktbW9ub3NwYWNlLG1vbm9zcGFjZTsKICAgICAgY29sb3I6Y29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDcwJSx0cmFuc3BhcmVudCk7d29yZC1icmVhazpicmVhay13b3JkfQogICAgLnNjLWludGVycC5zYy1taXNzaW5ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjJlbTtoZWlnaHQ6MWVtO292ZXJmbG93OmhpZGRlbjsKICAgICAgdmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4zKTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjUpOwogICAgICBib3JkZXItcmFkaXVzOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6dHJhbnNwYXJlbnQ7CiAgICAgIHVzZXItc2VsZWN0Om5vbmV9CiAgICAuc2MtaW50ZXJwLnNjLXVucmVzb2x2ZWR7Zm9udC1mYW1pbHk6dWktbW9ub3NwYWNlLG1vbm9zcGFjZTtmb250LXNpemU6Ljg1ZW07CiAgICAgIGNvbG9yOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA1MCUsdHJhbnNwYXJlbnQpOwogICAgICBiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciAxMCUsdHJhbnNwYXJlbnQpO2JvcmRlci1yYWRpdXM6M3B4OwogICAgICBwYWRkaW5nOjAgM3B4fQogICAgLnNjLWhvc3Quc2MtaGFzLWVycm9ye3Bvc2l0aW9uOnJlbGF0aXZlfQogICAgLnNjLWxvZ2ljLWVycm9ye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo4cHg7bGVmdDo4cHg7ei1pbmRleDoyMTQ3NDgzNjQ3O21heC13aWR0aDo2MGNoOwogICAgICBwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6I2IwMDAyMDtjb2xvcjojZmZmO2ZvbnQ6MTJweC8xLjQgdWktbW9ub3NwYWNlLG1vbm9zcGFjZTsKICAgICAgYm9yZGVyLXJhZGl1czo0cHg7d2hpdGUtc3BhY2U6cHJlLXdyYXA7cG9pbnRlci1ldmVudHM6bm9uZX0KICAgIC8qIE1pcnJvcnMgUFJJTlRfQkFTRUxJTkVfQ1NTIGluIGFwcHMvd2ViIGRlY2stc3RhZ2UtZXhwb3J0LnRzIFx1MjAxNCBrZWVwIGJvdGgKICAgICAgIGluIHN5bmMgdW50aWwgZGMtcnVudGltZSByZWdhaW5zIGEgYnVpbGQgc3RlcC4gKi8KICAgIEBtZWRpYSBwcmludCB7CiAgICAgIEBwYWdlIHsgbWFyZ2luOiAwLjVjbTsgfQogICAgICBmaWd1cmUsIHRhYmxlIHsgYnJlYWstaW5zaWRlOiBhdm9pZDsgfQogICAgICAjZGMtcm9vdCwgI2RjLXJvb3QgPiAuc2MtaG9zdCB7IGhlaWdodDogYXV0bzsgfQogICAgICAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsKICAgICAgICBwcmludC1jb2xvci1hZGp1c3Q6IGV4YWN0OyAtd2Via2l0LXByaW50LWNvbG9yLWFkanVzdDogZXhhY3Q7CiAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7IC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtOTlzICFpbXBvcnRhbnQ7IGFuaW1hdGlvbi1kdXJhdGlvbjogLjAwMXMgIWltcG9ydGFudDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxICFpbXBvcnRhbnQ7IGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGggIWltcG9ydGFudDsKICAgICAgICBhbmltYXRpb24tcGxheS1zdGF0ZTogcnVubmluZyAhaW1wb3J0YW50OyB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwcyAhaW1wb3J0YW50OwogICAgICB9CiAgICB9CiAgYDsKICB2YXIgRlVMTF9QQUdFX0NTUyA9ICJodG1sLGJvZHl7aGVpZ2h0OjEwMCU7bWFyZ2luOjB9I2RjLXJvb3QsI2RjLXJvb3Q+LnNjLWhvc3R7aGVpZ2h0OjEwMCV9IjsKICBmdW5jdGlvbiByb290TmFtZUZvckRvY3VtZW50KGRvYywgbG9jKSB7CiAgICBsZXQgYm9vdFBhdGggPSBsb2MucGF0aG5hbWUgfHwgIiI7CiAgICBpZiAoIS9cLmRjXC5odG1sPyQvaS50ZXN0KHNhZmVEZWNvZGUoYm9vdFBhdGgpKSkgewogICAgICB0cnkgewogICAgICAgIGJvb3RQYXRoID0gbmV3IFVSTChkb2MuYmFzZVVSSSB8fCAiLyIpLnBhdGhuYW1lOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRjTmFtZUZyb21QYXRoKGJvb3RQYXRoKTsKICB9CiAgZnVuY3Rpb24gc2FmZURlY29kZShzKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHMpOwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBzOwogICAgfQogIH0KICBmdW5jdGlvbiBib290KHJ1bnRpbWUsIGRvYyA9IGRvY3VtZW50KSB7CiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURjRG9jdW1lbnQoZG9jKTsKICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IFJlYWN0ID0gZ2V0UmVhY3QoKTsKICAgIGNvbnN0IHJvb3ROYW1lID0gcm9vdE5hbWVGb3JEb2N1bWVudChkb2MsIGxvY2F0aW9uKTsKICAgIHJ1bnRpbWUubWFya0ZldGNoZWQocm9vdE5hbWUpOwogICAgcnVudGltZS5zZXRSb290TmFtZShyb290TmFtZSk7CiAgICBydW50aW1lLmFkb3B0UGFyc2VkKHJvb3ROYW1lLCBwYXJzZWQpOwogICAgaWYgKCF3aW5kb3cuX19yZXNvdXJjZXMpIHsKICAgICAgZmV0Y2gobG9jYXRpb24uaHJlZikudGhlbigocmVzKSA9PiByZXMub2sgPyByZXMudGV4dCgpIDogIiIpLnRoZW4oKHQpID0+IHsKICAgICAgICBjb25zdCByYXcgPSB0ID8gcGFyc2VEY1RleHQodCkgOiBudWxsOwogICAgICAgIGlmIChyYXc/LnRlbXBsYXRlKSBydW50aW1lLnVwZGF0ZUh0bWwocm9vdE5hbWUsIHJhdy50ZW1wbGF0ZSk7CiAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgfSk7CiAgICB9CiAgICBjb25zdCBkYyA9IGRvYy5xdWVyeVNlbGVjdG9yKCJ4LWRjIik7CiAgICBjb25zdCBob3N0RWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBob3N0RWwuaWQgPSAiZGMtcm9vdCI7CiAgICBkYy5yZXBsYWNlV2l0aChob3N0RWwpOwogICAgaWYgKCFwYXJzZWQucHJldmlldykgewogICAgICBjb25zdCBzID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgIHMudGV4dENvbnRlbnQgPSBGVUxMX1BBR0VfQ1NTOwogICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0KICAgIGNvbnN0IFJvb3QgPSBydW50aW1lLmdldERDKHJvb3ROYW1lKTsKICAgIGNvbnN0IGVudHJ5ID0gcnVudGltZS5yZWdpc3RyeS5nZXQocm9vdE5hbWUpOwogICAgZnVuY3Rpb24gU3RhbmRhbG9uZVJvb3QoKSB7CiAgICAgIGNvbnN0IFssIHNldFRpY2tdID0gUmVhY3QudXNlU3RhdGUoMCk7CiAgICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7CiAgICAgICAgY29uc3Qgc3ViID0gKCkgPT4gc2V0VGljaygobikgPT4gbiArIDEpOwogICAgICAgIGVudHJ5LnN1YnMuYWRkKHN1Yik7CiAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgIGVudHJ5LnN1YnMuZGVsZXRlKHN1Yik7CiAgICAgICAgfTsKICAgICAgfSwgW10pOwogICAgICBjb25zdCBkZWZhdWx0cyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gewogICAgICAgIGNvbnN0IGQgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IGsgaW4gZW50cnkucHJvcHNNZXRhIHx8IHt9KSB7CiAgICAgICAgICBjb25zdCB2ID0gZW50cnkucHJvcHNNZXRhPy5ba10/LmRlZmF1bHQ7CiAgICAgICAgICBpZiAodiAhPT0gdm9pZCAwKSBkW2tdID0gdjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGQ7CiAgICAgIH0sIFtlbnRyeS5wcm9wc01ldGFdKTsKICAgICAgcmV0dXJuIGgoUm9vdCwgeyAuLi5kZWZhdWx0cywgLi4uZW50cnkucHJvcE92ZXJyaWRlcyB8fCB7fSB9KTsKICAgIH0KICAgIGNvbnN0IFJlYWN0RE9NID0gZ2V0UmVhY3RET00oKTsKICAgIGlmIChSZWFjdERPTS5jcmVhdGVSb290KQogICAgICBSZWFjdERPTS5jcmVhdGVSb290KGhvc3RFbCkucmVuZGVyKGgoU3RhbmRhbG9uZVJvb3QpKTsKICAgIGVsc2UgUmVhY3RET00ucmVuZGVyKGgoU3RhbmRhbG9uZVJvb3QpLCBob3N0RWwpOwogICAgcmV0dXJuIHJvb3ROYW1lOwogIH0KCiAgLy8gc3JjL2V4cHIudHMKICB2YXIgSURFTlRfUkUgPSAvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKi87CiAgdmFyIE5VTUJFUl9SRSA9IC9eLT9cZCsoXC5cZCspPyQvOwogIGZ1bmN0aW9uIHJlc29sdmUodmFscywgc3JjKSB7CiAgICBjb25zdCBleHByID0gU3RyaW5nKHNyYykudHJpbSgpOwogICAgaWYgKCFleHByKSByZXR1cm4gdm9pZCAwOwogICAgaWYgKGV4cHJbMF0gPT09ICIoIiAmJiBleHByW2V4cHIubGVuZ3RoIC0gMV0gPT09ICIpIiAmJiBwYXJlbnNXcmFwV2hvbGUoZXhwcikpIHsKICAgICAgcmV0dXJuIHJlc29sdmUodmFscywgZXhwci5zbGljZSgxLCAtMSkpOwogICAgfQogICAgY29uc3QgZXEgPSBmaW5kVG9wTGV2ZWxFcXVhbGl0eShleHByKTsKICAgIGlmIChlcSkgewogICAgICBjb25zdCBsdiA9IHJlc29sdmUodmFscywgZXhwci5zbGljZSgwLCBlcS5pbmRleCkpOwogICAgICBjb25zdCBydiA9IHJlc29sdmUodmFscywgZXhwci5zbGljZShlcS5pbmRleCArIGVxLm9wLmxlbmd0aCkpOwogICAgICBzd2l0Y2ggKGVxLm9wKSB7CiAgICAgICAgY2FzZSAiPT09IjoKICAgICAgICAgIHJldHVybiBsdiA9PT0gcnY7CiAgICAgICAgY2FzZSAiIT09IjoKICAgICAgICAgIHJldHVybiBsdiAhPT0gcnY7CiAgICAgICAgY2FzZSAiPT0iOgogICAgICAgICAgcmV0dXJuIGx2ID09IHJ2OwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gbHYgIT0gcnY7CiAgICAgIH0KICAgIH0KICAgIGlmIChleHByWzBdID09PSAiISIpIHJldHVybiAhcmVzb2x2ZSh2YWxzLCBleHByLnNsaWNlKDEpKTsKICAgIGlmIChleHByID09PSAidHJ1ZSIpIHJldHVybiB0cnVlOwogICAgaWYgKGV4cHIgPT09ICJmYWxzZSIpIHJldHVybiBmYWxzZTsKICAgIGlmIChleHByID09PSAibnVsbCIpIHJldHVybiBudWxsOwogICAgaWYgKGV4cHIgPT09ICJ1bmRlZmluZWQiKSByZXR1cm4gdm9pZCAwOwogICAgaWYgKE5VTUJFUl9SRS50ZXN0KGV4cHIpKSByZXR1cm4gTnVtYmVyKGV4cHIpOwogICAgaWYgKGV4cHIubGVuZ3RoID49IDIgJiYgKGV4cHJbMF0gPT09ICciJyB8fCBleHByWzBdID09PSAiJyIpICYmIGV4cHJbZXhwci5sZW5ndGggLSAxXSA9PT0gZXhwclswXSkgewogICAgICByZXR1cm4gZXhwci5zbGljZSgxLCAtMSk7CiAgICB9CiAgICByZXR1cm4gcmVzb2x2ZVBhdGgodmFscywgZXhwcik7CiAgfQogIGZ1bmN0aW9uIHBhcmVuc1dyYXBXaG9sZShleHByKSB7CiAgICBsZXQgZGVwdGggPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByLmxlbmd0aCAtIDE7IGkrKykgewogICAgICBpZiAoZXhwcltpXSA9PT0gIigiKSBkZXB0aCsrOwogICAgICBlbHNlIGlmIChleHByW2ldID09PSAiKSIpIHsKICAgICAgICBkZXB0aC0tOwogICAgICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gZmluZFRvcExldmVsRXF1YWxpdHkoZXhwcikgewogICAgbGV0IGRlcHRoID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwci5sZW5ndGg7IGkrKykgewogICAgICBjb25zdCBjID0gZXhwcltpXTsKICAgICAgaWYgKGMgPT09ICJbIiB8fCBjID09PSAiKCIpIGRlcHRoKys7CiAgICAgIGVsc2UgaWYgKGMgPT09ICJdIiB8fCBjID09PSAiKSIpIGRlcHRoLS07CiAgICAgIGVsc2UgaWYgKGRlcHRoID09PSAwICYmIChjID09PSAiPSIgfHwgYyA9PT0gIiEiKSAmJiBleHByW2kgKyAxXSA9PT0gIj0iKSB7CiAgICAgICAgaWYgKGkgPiAwICYmIChleHByW2kgLSAxXSA9PT0gIj0iIHx8IGV4cHJbaSAtIDFdID09PSAiISIpKSBjb250aW51ZTsKICAgICAgICBpZiAoIWV4cHIuc2xpY2UoMCwgaSkudHJpbSgpKSBjb250aW51ZTsKICAgICAgICBjb25zdCBvcCA9IGV4cHJbaSArIDJdID09PSAiPSIgPyBjICsgIj09IiA6IGMgKyAiPSI7CiAgICAgICAgcmV0dXJuIHsgaW5kZXg6IGksIG9wIH07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBmdW5jdGlvbiByZXNvbHZlUGF0aCh2YWxzLCBleHByKSB7CiAgICBjb25zdCBoZWFkID0gZXhwci5tYXRjaChJREVOVF9SRSk7CiAgICBpZiAoIWhlYWQpIHJldHVybiB2b2lkIDA7CiAgICBsZXQgY3VyID0gdmFscyA9PSBudWxsID8gdm9pZCAwIDogdmFsc1toZWFkWzBdXTsKICAgIGxldCBpID0gaGVhZFswXS5sZW5ndGg7CiAgICB3aGlsZSAoaSA8IGV4cHIubGVuZ3RoKSB7CiAgICAgIGlmIChleHByW2ldID09PSAiLiIpIHsKICAgICAgICBjb25zdCBtID0gZXhwci5zbGljZShpICsgMSkubWF0Y2goSURFTlRfUkUpIHx8IGV4cHIuc2xpY2UoaSArIDEpLm1hdGNoKC9eXGQrLyk7CiAgICAgICAgaWYgKCFtKSByZXR1cm4gdm9pZCAwOwogICAgICAgIGN1ciA9IGN1ciA9PSBudWxsID8gdm9pZCAwIDogY3VyW21bMF1dOwogICAgICAgIGkgKz0gMSArIG1bMF0ubGVuZ3RoOwogICAgICB9IGVsc2UgaWYgKGV4cHJbaV0gPT09ICJbIikgewogICAgICAgIGxldCBkZXB0aCA9IDE7CiAgICAgICAgbGV0IGogPSBpICsgMTsKICAgICAgICB3aGlsZSAoaiA8IGV4cHIubGVuZ3RoICYmIGRlcHRoID4gMCkgewogICAgICAgICAgaWYgKGV4cHJbal0gPT09ICJbIikgZGVwdGgrKzsKICAgICAgICAgIGVsc2UgaWYgKGV4cHJbal0gPT09ICJdIikgewogICAgICAgICAgICBkZXB0aC0tOwogICAgICAgICAgICBpZiAoZGVwdGggPT09IDApIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBpZiAoZGVwdGggIT09IDApIHJldHVybiB2b2lkIDA7CiAgICAgICAgY29uc3Qga2V5ID0gcmVzb2x2ZSh2YWxzLCBleHByLnNsaWNlKGkgKyAxLCBqKSk7CiAgICAgICAgY3VyID0gY3VyID09IG51bGwgPyB2b2lkIDAgOiBjdXJba2V5XTsKICAgICAgICBpID0gaiArIDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGN1cjsKICB9CgogIC8vIHNyYy9lbmNvZGUudHMKICB2YXIgQ0FNRUxfQVRUUiA9ICJzYy1jYW1lbC0iOwogIHZhciBJTkxJTkVfVEVYVF9UQUdTID0gbmV3IFNldCgKICAgICJhIGFiYnIgYiBiZGkgYmRvIGJyIGNpdGUgY29kZSBkZWwgZGZuIGVtIGkgaW5zIGtiZCBtYXJrIHEgcyBzYW1wIHNtYWxsIHNwYW4gc3RyaWtlIHN0cm9uZyBzdWIgc3VwIHUgdmFyIHdiciIuc3BsaXQoCiAgICAgICIgIgogICAgKQogICk7CiAgdmFyIFJBV19XUkFQID0gewogICAgc2VsZWN0OiAic2MtcmF3LXNlbGVjdCIsCiAgICB0YWJsZTogInNjLXJhdy10YWJsZSIsCiAgICB0Ym9keTogInNjLXJhdy10Ym9keSIsCiAgICB0aGVhZDogInNjLXJhdy10aGVhZCIsCiAgICB0Zm9vdDogInNjLXJhdy10Zm9vdCIsCiAgICB0cjogInNjLXJhdy10ciIsCiAgICB0ZDogInNjLXJhdy10ZCIsCiAgICB0aDogInNjLXJhdy10aCIsCiAgICBjYXB0aW9uOiAic2MtcmF3LWNhcHRpb24iCiAgfTsKICB2YXIgUkFXX1VOV1JBUCA9IE9iamVjdC5mcm9tRW50cmllcygKICAgIE9iamVjdC5lbnRyaWVzKFJBV19XUkFQKS5tYXAoKFtrLCB2XSkgPT4gW3YsIGtdKQogICk7CiAgdmFyIEVWRU5UX01BUCA9IHsKICAgIG9uY2xpY2s6ICJvbkNsaWNrIiwKICAgIG9uY2hhbmdlOiAib25DaGFuZ2UiLAogICAgb25pbnB1dDogIm9uSW5wdXQiLAogICAgb25zdWJtaXQ6ICJvblN1Ym1pdCIsCiAgICBvbmtleWRvd246ICJvbktleURvd24iLAogICAgb25rZXl1cDogIm9uS2V5VXAiLAogICAgb25rZXlwcmVzczogIm9uS2V5UHJlc3MiLAogICAgb25tb3VzZWRvd246ICJvbk1vdXNlRG93biIsCiAgICBvbm1vdXNldXA6ICJvbk1vdXNlVXAiLAogICAgb25tb3VzZWVudGVyOiAib25Nb3VzZUVudGVyIiwKICAgIG9ubW91c2VsZWF2ZTogIm9uTW91c2VMZWF2ZSIsCiAgICBvbmZvY3VzOiAib25Gb2N1cyIsCiAgICBvbmJsdXI6ICJvbkJsdXIiLAogICAgb25kb3VibGVjbGljazogIm9uRG91YmxlQ2xpY2siLAogICAgb25jb250ZXh0bWVudTogIm9uQ29udGV4dE1lbnUiLAogICAgb25tb3VzZW1vdmU6ICJvbk1vdXNlTW92ZSIsCiAgICBvbm1vdXNlb3ZlcjogIm9uTW91c2VPdmVyIiwKICAgIG9ubW91c2VvdXQ6ICJvbk1vdXNlT3V0IiwKICAgIG9ucG9pbnRlcmRvd246ICJvblBvaW50ZXJEb3duIiwKICAgIG9ucG9pbnRlcnVwOiAib25Qb2ludGVyVXAiLAogICAgb25wb2ludGVybW92ZTogIm9uUG9pbnRlck1vdmUiLAogICAgb25wb2ludGVyZW50ZXI6ICJvblBvaW50ZXJFbnRlciIsCiAgICBvbnBvaW50ZXJsZWF2ZTogIm9uUG9pbnRlckxlYXZlIiwKICAgIG9ucG9pbnRlcmNhbmNlbDogIm9uUG9pbnRlckNhbmNlbCIsCiAgICBvbnBvaW50ZXJvdmVyOiAib25Qb2ludGVyT3ZlciIsCiAgICBvbnBvaW50ZXJvdXQ6ICJvblBvaW50ZXJPdXQiLAogICAgb25nb3Rwb2ludGVyY2FwdHVyZTogIm9uR290UG9pbnRlckNhcHR1cmUiLAogICAgb25sb3N0cG9pbnRlcmNhcHR1cmU6ICJvbkxvc3RQb2ludGVyQ2FwdHVyZSIsCiAgICBvbnRvdWNoc3RhcnQ6ICJvblRvdWNoU3RhcnQiLAogICAgb250b3VjaGVuZDogIm9uVG91Y2hFbmQiLAogICAgb250b3VjaG1vdmU6ICJvblRvdWNoTW92ZSIsCiAgICBvbnRvdWNoY2FuY2VsOiAib25Ub3VjaENhbmNlbCIsCiAgICBvbmRyYWdzdGFydDogIm9uRHJhZ1N0YXJ0IiwKICAgIG9uZHJhZ2VuZDogIm9uRHJhZ0VuZCIsCiAgICBvbmRyYWdlbnRlcjogIm9uRHJhZ0VudGVyIiwKICAgIG9uZHJhZ2xlYXZlOiAib25EcmFnTGVhdmUiLAogICAgb25kcmFnb3ZlcjogIm9uRHJhZ092ZXIiLAogICAgb25hbmltYXRpb25zdGFydDogIm9uQW5pbWF0aW9uU3RhcnQiLAogICAgb25hbmltYXRpb25lbmQ6ICJvbkFuaW1hdGlvbkVuZCIsCiAgICBvbmFuaW1hdGlvbml0ZXJhdGlvbjogIm9uQW5pbWF0aW9uSXRlcmF0aW9uIiwKICAgIG9udHJhbnNpdGlvbmVuZDogIm9uVHJhbnNpdGlvbkVuZCIKICB9OwogIHZhciBBVFRSUyA9IGAoPzpbXj4iJ118IlteIl0qInwnW14nXSonKSpgOwogIHZhciBJTVBPUlRfU0VMRl9DTE9TRV9SRSA9IG5ldyBSZWdFeHAoCiAgICAiPCh4LWltcG9ydHxkYy1pbXBvcnQpKCIgKyBBVFRSUyArICIpLz4iLAogICAgImdpIgogICk7CiAgdmFyIENBTUVMX0FUVFJfUkUgPSAvKFxzKShbYS16XStbQS1aXVtBLVphLXowLTldKikoXHMqPSkvZzsKICBmdW5jdGlvbiBlbmNvZGVDYW1lbEF0dHJzKGh0bWwpIHsKICAgIHJldHVybiBodG1sLnJlcGxhY2UoCiAgICAgIENBTUVMX0FUVFJfUkUsCiAgICAgIChfLCBzcCwgbmFtZSwgZXEpID0+IHNwICsgQ0FNRUxfQVRUUiArIG5hbWUucmVwbGFjZSgvW0EtWl0vZywgKGMpID0+ICItIiArIGMudG9Mb3dlckNhc2UoKSkgKyBlcQogICAgKTsKICB9CiAgZnVuY3Rpb24gZW5jb2RlQ2FzZShodG1sKSB7CiAgICBodG1sID0gaHRtbC5yZXBsYWNlKAogICAgICBJTVBPUlRfU0VMRl9DTE9TRV9SRSwKICAgICAgKF8sIHQsIGEpID0+ICI8IiArIHQgKyBhICsgIj48LyIgKyB0ICsgIj4iCiAgICApOwogICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvPGhlbG1ldChcc3w+KS9naSwgIjxzYy1oZWxtZXQkMSIpOwogICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvPFwvaGVsbWV0XHMqPi9naSwgIjwvc2MtaGVsbWV0PiIpOwogICAgaHRtbCA9IGVuY29kZUNhbWVsQXR0cnMoaHRtbCk7CiAgICBmb3IgKGNvbnN0IFtyZWFsLCBhbGlhc10gb2YgT2JqZWN0LmVudHJpZXMoUkFXX1dSQVApKSB7CiAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoCiAgICAgICAgbmV3IFJlZ0V4cCgiKDwvPykiICsgcmVhbCArICIoPz1bXFxzPl0pIiwgImdpIiksCiAgICAgICAgIiQxIiArIGFsaWFzCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gaHRtbDsKICB9CiAgZnVuY3Rpb24ga2ViYWJUb0NhbWVsKHMpIHsKICAgIHJldHVybiBzLnJlcGxhY2UoLy0oW2Etel0pL2csIChfLCBjKSA9PiBjLnRvVXBwZXJDYXNlKCkpOwogIH0KICBmdW5jdGlvbiBjc3NUb09iaihjc3MpIHsKICAgIGNvbnN0IG8gPSB7fTsKICAgIGZvciAoY29uc3QgZGVjbCBvZiBjc3Muc3BsaXQoIjsiKSkgewogICAgICBjb25zdCBpID0gZGVjbC5pbmRleE9mKCI6Iik7CiAgICAgIGlmIChpIDwgMCkgY29udGludWU7CiAgICAgIGNvbnN0IHByb3AgPSBkZWNsLnNsaWNlKDAsIGkpLnRyaW0oKTsKICAgICAgb1twcm9wLnN0YXJ0c1dpdGgoIi0tIikgPyBwcm9wIDoga2ViYWJUb0NhbWVsKHByb3ApXSA9IGRlY2wuc2xpY2UoaSArIDEpLnRyaW0oKTsKICAgIH0KICAgIHJldHVybiBvOwogIH0KICBmdW5jdGlvbiBjb21waWxlQXR0cihyYXcpIHsKICAgIGNvbnN0IHdob2xlID0gcmF3Lm1hdGNoKC9eXHMqXHtceyhbXHNcU10rPylcfVx9XHMqJC8pOwogICAgaWYgKHdob2xlKSB7CiAgICAgIGNvbnN0IHBhdGggPSB3aG9sZVsxXTsKICAgICAgcmV0dXJuICh2YWxzKSA9PiByZXNvbHZlKHZhbHMsIHBhdGgpOwogICAgfQogICAgaWYgKHJhdy5pbmNsdWRlcygie3siKSkgewogICAgICBjb25zdCBwYXJ0cyA9IHJhdy5zcGxpdCgvXHtceyhbXHNcU10rPylcfVx9L2cpOwogICAgICByZXR1cm4gKHZhbHMpID0+IHBhcnRzLm1hcCgocywgaSkgPT4gaSAmIDEgPyByZXNvbHZlKHZhbHMsIHMpID8/ICIiIDogcykuam9pbigiIik7CiAgICB9CiAgICByZXR1cm4gKCkgPT4gcmF3OwogIH0KCiAgLy8gc3JjL2NvbXBpbGUudHMKICBmdW5jdGlvbiBjb2xsZWN0UHJvcHMobm9kZSwga2luZCwgaG9zdCkgewogICAgY29uc3QgcHJvcEdldHRlcnMgPSBbXTsKICAgIGNvbnN0IHBzZXVkb0NsYXNzZXMgPSBbXTsKICAgIGxldCBoaW50U2l6ZSA9IG51bGw7CiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmFsdWUgfSBvZiBbLi4ubm9kZS5hdHRyaWJ1dGVzXSkgewogICAgICBpZiAobmFtZSA9PT0gInNjLW5hbWUiIHx8IG5hbWUgPT09ICJkYXRhLWRjLXRwbCIpIGNvbnRpbnVlOwogICAgICBsZXQga2V5ID0gbmFtZTsKICAgICAgaWYgKGtleS5zdGFydHNXaXRoKENBTUVMX0FUVFIpKQogICAgICAgIGtleSA9IGtlYmFiVG9DYW1lbChrZXkuc2xpY2UoQ0FNRUxfQVRUUi5sZW5ndGgpKTsKICAgICAgaWYgKGtleSA9PT0gImhpbnQtc2l6ZSIpIHsKICAgICAgICBoaW50U2l6ZSA9IHZhbHVlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgic3R5bGUtIikpIHsKICAgICAgICBwc2V1ZG9DbGFzc2VzLnB1c2goaG9zdC5wc2V1ZG9DbGFzcyhrZXkuc2xpY2UoNiksIHZhbHVlKSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGtpbmQgIT09ICJkb20iKSB7CiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygiLSIpICYmICEoa2luZCA9PT0gIngtaW1wb3J0IiAmJiAoa2V5LnN0YXJ0c1dpdGgoImFyaWEtIikgfHwga2V5LnN0YXJ0c1dpdGgoImRhdGEtIikpKSkKICAgICAgICAgIGtleSA9IGtlYmFiVG9DYW1lbChrZXkpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChrZXkgPT09ICJjbGFzcyIpIGtleSA9ICJjbGFzc05hbWUiOwogICAgICAgIGVsc2UgaWYgKGtleSA9PT0gImZvciIpIGtleSA9ICJodG1sRm9yIjsKICAgICAgICBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aCgib24iKSkKICAgICAgICAgIGtleSA9IEVWRU5UX01BUFtrZXldIHx8ICJvbiIgKyBrZXlbMl0udG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgzKTsKICAgICAgfQogICAgICBwcm9wR2V0dGVycy5wdXNoKFtrZXksIGNvbXBpbGVBdHRyKHZhbHVlKV0pOwogICAgfQogICAgcmV0dXJuIHsgcHJvcEdldHRlcnMsIHBzZXVkb0NsYXNzZXMsIGhpbnRTaXplIH07CiAgfQogIHZhciBIT1NUX1NUWUxFX1BST1BTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWwogICAgInBvc2l0aW9uIiwKICAgICJsZWZ0IiwKICAgICJyaWdodCIsCiAgICAidG9wIiwKICAgICJib3R0b20iLAogICAgImluc2V0IiwKICAgICJ3aWR0aCIsCiAgICAiaGVpZ2h0IiwKICAgICJ6LWluZGV4IiwKICAgICJ0cmFuc2Zvcm0iCiAgXSk7CiAgZnVuY3Rpb24gaG9zdFBvc2l0aW9uU3R5bGUoc3R5bGUpIHsKICAgIGNvbnN0IGFsbCA9IHR5cGVvZiBzdHlsZSA9PT0gInN0cmluZyIgPyBjc3NUb09iaihzdHlsZSkgOiBzdHlsZSAhPSBudWxsICYmIHR5cGVvZiBzdHlsZSA9PT0gIm9iamVjdCIgPyBzdHlsZSA6IG51bGw7CiAgICBpZiAoIWFsbCkgcmV0dXJuIHZvaWQgMDsKICAgIGNvbnN0IG91dCA9IHt9OwogICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYWxsKSkgewogICAgICBjb25zdCBrZWJhYiA9IGsucmVwbGFjZSgvW0EtWl0vZywgKGMpID0+ICItIiArIGMudG9Mb3dlckNhc2UoKSk7CiAgICAgIGlmIChIT1NUX1NUWUxFX1BST1BTLmhhcyhrZWJhYikpIG91dFtrXSA9IHY7CiAgICB9CiAgICByZXR1cm4gT2JqZWN0LmtleXMob3V0KS5sZW5ndGggPyBvdXQgOiB2b2lkIDA7CiAgfQogIGZ1bmN0aW9uIGNvbXBpbGVUZW1wbGF0ZShodG1sLCBob3N0KSB7CiAgICBjb25zdCB0cGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpOwogICAgLy8hIG5vc2VtZ3JlcDogZGlyZWN0LWlubmVyLWh0bWwtYXNzaWdubWVudAogICAgdHBsLmlubmVySFRNTCA9IGVuY29kZUNhc2UoaHRtbCk7CiAgICBsZXQgdHBsTiA9IDA7CiAgICAoZnVuY3Rpb24gc3RhbXAobm9kZSkgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgiZGF0YS1kYy10cGwiLCBTdHJpbmcodHBsTisrKSk7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBjIG9mIG5vZGUuY2hpbGROb2Rlcykgc3RhbXAoYyk7CiAgICB9KSh0cGwuY29udGVudCk7CiAgICBjb25zdCBidWlsZGVycyA9IHdhbGtDaGlsZHJlbih0cGwuY29udGVudCwgaG9zdCk7CiAgICBjb25zdCByZW5kZXIgPSAoKHZhbHMsIGN0eCkgPT4gYnVpbGRlcnMubWFwKChiLCBpKSA9PiBiKHZhbHMgfHwge30sIGN0eCwgaSkpKTsKICAgIHJlbmRlci5fX2Fubm90YXRlZCA9IHRwbC5pbm5lckhUTUw7CiAgICByZXR1cm4gcmVuZGVyOwogIH0KICBmdW5jdGlvbiB3YWxrQ2hpbGRyZW4obm9kZSwgaG9zdCkgewogICAgcmV0dXJuIFsuLi5ub2RlLmNoaWxkTm9kZXNdLm1hcCgoYykgPT4gd2FsayhjLCBob3N0KSkuZmlsdGVyKChiKSA9PiBiICE9IG51bGwpOwogIH0KICB2YXIgU0xJREVfSURfVkFMVUVfUkUgPSAvXlswLTlhLWZdezh9JC87CiAgdmFyIERFQ0tfQ09OVFJPTF9GTE9XX1JFID0gL14oc2MtaWZ8c2MtZm9yfHNjLWVsc2V8ZGMtaW1wb3J0fHgtaW1wb3J0KSQvOwogIHZhciBERUNLX0FVWF9SRSA9IC9eKHRlbXBsYXRlfHNjcmlwdHxzdHlsZXxzYy1oZWxtZXR8aGVsbWV0KSQvOwogIGZ1bmN0aW9uIGlzRGVja01vdW50VGFnKGVsKSB7CiAgICBpZiAoZWwubG9jYWxOYW1lID09PSAiZGVjay1zdGFnZSIpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGVsLmxvY2FsTmFtZSA9PT0gIngtaW1wb3J0IiAmJiAoZWwuZ2V0QXR0cmlidXRlKCJjb21wb25lbnQtZnJvbS1nbG9iYWwtc2NvcGUiKSB8fCAiIikgPT09ICJkZWNrLXN0YWdlIjsKICB9CiAgZnVuY3Rpb24gd2Fsa0RlY2tDaGlsZHJlbihlbCwgaG9zdCkgewogICAgY29uc3QgcGFpcnMgPSBbLi4uZWwuY2hpbGROb2Rlc10ubWFwKChjKSA9PiAoeyBjLCBiOiB3YWxrKGMsIGhvc3QpIH0pKS5maWx0ZXIoKHApID0+IHAuYiAhPT0gbnVsbCk7CiAgICBjb25zdCBraWRzID0gcGFpcnMubWFwKChwKSA9PiBwLmIpOwogICAgY29uc3Qgc2VlbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICBjb25zdCB3c1NlZW4gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgY29uc3Qga2V5cyA9IFtdOwogICAgY29uc3QgbmV4dFNsaWRlSWQgPSBuZXcgQXJyYXkocGFpcnMubGVuZ3RoKTsKICAgIHsKICAgICAgbGV0IHVwY29taW5nID0gbnVsbDsKICAgICAgZm9yIChsZXQgaiA9IHBhaXJzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CiAgICAgICAgY29uc3QgbiA9IHBhaXJzW2pdLmM7CiAgICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICBjb25zdCB0ID0gbi5sb2NhbE5hbWU7CiAgICAgICAgICB1cGNvbWluZyA9ICFERUNLX0FVWF9SRS50ZXN0KHQpICYmICFERUNLX0NPTlRST0xfRkxPV19SRS50ZXN0KHQpID8gbi5nZXRBdHRyaWJ1dGUoImRhdGEtb20tc2xpZGUtaWQiKSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIG5leHRTbGlkZUlkW2pdID0gdXBjb21pbmc7CiAgICAgIH0KICAgIH0KICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGFpcnMubGVuZ3RoOyBqKyspIHsKICAgICAgY29uc3QgeyBjIH0gPSBwYWlyc1tqXTsKICAgICAgaWYgKGMubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgaWYgKChjLm5vZGVWYWx1ZSA/PyAiIikudHJpbSgpID09PSAiIikgewogICAgICAgICAgY29uc3QgYmFzZSA9IG5leHRTbGlkZUlkW2pdID8gIm9taWQtd3M6IiArIG5leHRTbGlkZUlkW2pdIDogIm9taWQtd3M6YXV4IjsKICAgICAgICAgIGNvbnN0IG4gPSB3c1NlZW4uZ2V0KGJhc2UpID8/IDA7CiAgICAgICAgICB3c1NlZW4uc2V0KGJhc2UsIG4gKyAxKTsKICAgICAgICAgIGtleXMucHVzaChuID09PSAwID8gYmFzZSA6IGJhc2UgKyAiOiIgKyBuKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBraWRzLCBrZXlzOiBudWxsIH07CiAgICAgIH0KICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAga2V5cy5wdXNoKGopOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGNoaWxkID0gYzsKICAgICAgY29uc3QgdGFnID0gY2hpbGQubG9jYWxOYW1lOwogICAgICBpZiAoREVDS19BVVhfUkUudGVzdCh0YWcpKSB7CiAgICAgICAga2V5cy5wdXNoKGopOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChERUNLX0NPTlRST0xfRkxPV19SRS50ZXN0KHRhZykpIHJldHVybiB7IGtpZHMsIGtleXM6IG51bGwgfTsKICAgICAgY29uc3QgdiA9IGNoaWxkLmdldEF0dHJpYnV0ZSgiZGF0YS1vbS1zbGlkZS1pZCIpOwogICAgICBpZiAoIXYgfHwgIVNMSURFX0lEX1ZBTFVFX1JFLnRlc3QodikgfHwgc2Vlbi5oYXModikpIHsKICAgICAgICByZXR1cm4geyBraWRzLCBrZXlzOiBudWxsIH07CiAgICAgIH0KICAgICAgc2Vlbi5hZGQodik7CiAgICAgIGtleXMucHVzaCgib21pZDoiICsgdik7CiAgICB9CiAgICByZXR1cm4geyBraWRzLCBrZXlzIH07CiAgfQogIGZ1bmN0aW9uIHJlbmRlckRlY2tLaWRzKGtpZHMsIGtpZEtleXMsIHZhbHMsIGN0eCkgewogICAgcmV0dXJuIGtpZHMubWFwKChiLCBqKSA9PiB7CiAgICAgIGNvbnN0IGsgPSBraWRLZXlzID8ga2lkS2V5c1tqXSA6IGo7CiAgICAgIGNvbnN0IG91dCA9IGIodmFscywgY3R4LCBrKTsKICAgICAgcmV0dXJuIGtpZEtleXMgIT0gbnVsbCAmJiB0eXBlb2Ygb3V0ID09PSAic3RyaW5nIiA/IGgoZ2V0UmVhY3QoKS5GcmFnbWVudCwgeyBrZXk6IGsgfSwgb3V0KSA6IG91dDsKICAgIH0pOwogIH0KICBmdW5jdGlvbiB3YWxrKG5vZGUsIGhvc3QpIHsKICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIHdhbGtUZXh0KG5vZGUpOwogICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IGVsID0gbm9kZTsKICAgIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIGlmICh0YWcgPT09ICJzYy1mb3IiKSByZXR1cm4gd2Fsa0ZvcihlbCwgaG9zdCk7CiAgICBpZiAodGFnID09PSAic2MtaWYiKSByZXR1cm4gd2Fsa0lmKGVsLCBob3N0KTsKICAgIGlmICh0YWcgPT09ICJ4LWltcG9ydCIpIHJldHVybiB3YWxrWEltcG9ydChlbCwgaG9zdCk7CiAgICBpZiAodGFnID09PSAic2MtaGVsbWV0IikgcmV0dXJuIGhvc3QuaGVsbWV0KGVsKTsKICAgIGlmICh0YWcgPT09ICJkYy1pbXBvcnQiKSByZXR1cm4gd2Fsa0NvbXBvbmVudChlbCwgaG9zdCk7CiAgICByZXR1cm4gd2Fsa0VsZW1lbnQoZWwsIGhvc3QpOwogIH0KICB2YXIgd2FybmVkSG9sZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogIGZ1bmN0aW9uIHdhcm5VbnJlc29sdmVkKGN0eCwgd2hhdCkgewogICAgY29uc3Qga2V5ID0gKGN0eD8uX19uYW1lIHx8ICI/IikgKyAiXDAiICsgd2hhdDsKICAgIGlmICh3YXJuZWRIb2xlcy5oYXMoa2V5KSkgcmV0dXJuOwogICAgd2FybmVkSG9sZXMuYWRkKGtleSk7CiAgICBjb25zb2xlLndhcm4oIltkYy1ydW50aW1lXSAiICsgKGN0eD8uX19uYW1lIHx8ICJ0ZW1wbGF0ZSIpICsgIjogIiArIHdoYXQpOwogIH0KICBmdW5jdGlvbiB3YWxrVGV4dChub2RlKSB7CiAgICBjb25zdCB0eHQgPSBub2RlLm5vZGVWYWx1ZSA/PyAiIjsKICAgIGlmICghdHh0LmluY2x1ZGVzKCJ7eyIpKSB7CiAgICAgIGlmICghdHh0LnRyaW0oKSAmJiAhdHh0LmluY2x1ZGVzKCIgIikpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gKCkgPT4gdHh0OwogICAgfQogICAgY29uc3QgcGFydHMgPSB0eHQuc3BsaXQoL1x7XHsoW1xzXFNdKz8pXH1cfS9nKTsKICAgIHJldHVybiAodmFscywgY3R4LCBrZXkpID0+IGgoCiAgICAgIGdldFJlYWN0KCkuRnJhZ21lbnQsCiAgICAgIHsga2V5IH0sCiAgICAgIC4uLnBhcnRzLm1hcCgocCwgaSkgPT4gewogICAgICAgIGlmICghKGkgJiAxKSkgcmV0dXJuIHA7CiAgICAgICAgY29uc3QgdiA9IHJlc29sdmUodmFscywgcCk7CiAgICAgICAgaWYgKHYgPT09IHZvaWQgMCkgewogICAgICAgICAgaWYgKCFjdHg/Ll9fc3RyZWFtaW5nTm93KSB7CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5ib2R5Py5oYXNBdHRyaWJ1dGUoImRhdGEtZGMtZWRpdG9yLW9uIikpIHsKICAgICAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgICAgICJzcGFuIiwKICAgICAgICAgICAgICAgIHsga2V5OiBpLCBjbGFzc05hbWU6ICJzYy1pbnRlcnAgc2MtdW5yZXNvbHZlZCIgfSwKICAgICAgICAgICAgICAgICJ7eyAiICsgcC50cmltKCkgKyAiIH19IgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2FyblVucmVzb2x2ZWQoCiAgICAgICAgICAgICAgY3R4LAogICAgICAgICAgICAgICJ7eyAiICsgcC50cmltKCkgKyAiIH19IG5ldmVyIHJlc29sdmVkIFx1MjAxNCByZW5kZXJlZCBhcyBlbXB0eSIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgInNwYW4iLAogICAgICAgICAgICB7IGtleTogaSwgY2xhc3NOYW1lOiAic2MtaW50ZXJwIHNjLW1pc3NpbmciIH0sCiAgICAgICAgICAgIHAudHJpbSgpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0UmVhY3QoKS5pc1ZhbGlkRWxlbWVudCh2KSB8fCBBcnJheS5pc0FycmF5KHYpKSB7CiAgICAgICAgICByZXR1cm4gaChnZXRSZWFjdCgpLkZyYWdtZW50LCB7IGtleTogaSB9LCB2KTsKICAgICAgICB9CiAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdHlwZW9mIHYgPT09ICJib29sZWFuIikgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIGgoInNwYW4iLCB7IGtleTogaSwgY2xhc3NOYW1lOiAic2MtaW50ZXJwIiB9LCBTdHJpbmcodikpOwogICAgICB9KQogICAgKTsKICB9CiAgZnVuY3Rpb24gd2Fsa0ZvcihlbCwgaG9zdCkgewogICAgY29uc3QgbGlzdEdldCA9IGNvbXBpbGVBdHRyKGVsLmdldEF0dHJpYnV0ZSgibGlzdCIpIHx8ICIiKTsKICAgIGNvbnN0IGFzTmFtZSA9IGVsLmdldEF0dHJpYnV0ZSgiYXMiKSB8fCAiaXRlbSI7CiAgICBjb25zdCBoaW50TiA9IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZSgiaGludC1wbGFjZWhvbGRlci1jb3VudCIpIHx8ICIwIiwgMTApOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICBjb25zdCBsaXN0U3JjID0gZWwuZ2V0QXR0cmlidXRlKCJsaXN0IikgfHwgIiI7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGxldCBsaXN0ID0gbGlzdEdldCh2YWxzKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7CiAgICAgICAgaWYgKCFjdHg/Ll9fc3RyZWFtaW5nTm93KSB7CiAgICAgICAgICBpZiAobGlzdCAhPT0gdm9pZCAwICYmIGxpc3QgIT09IG51bGwpIHsKICAgICAgICAgICAgd2FyblVucmVzb2x2ZWQoCiAgICAgICAgICAgICAgY3R4LAogICAgICAgICAgICAgICdzYy1mb3IgbGlzdD0iJyArIGxpc3RTcmMgKyAnIiBpcyBub3QgYW4gYXJyYXkgKCcgKyB0eXBlb2YgbGlzdCArICIpIgogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgICAgbGlzdCA9IFtdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaXN0ID0gaGludE4gPiAwID8gQXJyYXkoaGludE4pLmZpbGwodm9pZCAwKSA6IFtdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaCgKICAgICAgICBnZXRSZWFjdCgpLkZyYWdtZW50LAogICAgICAgIHsga2V5IH0sCiAgICAgICAgbGlzdC5tYXAoKGl0ZW0sIGkpID0+IHsKICAgICAgICAgIGNvbnN0IHN1YiA9IHsgLi4udmFscywgW2FzTmFtZV06IGl0ZW0sICRpbmRleDogaSB9OwogICAgICAgICAgcmV0dXJuIGgoCiAgICAgICAgICAgIGdldFJlYWN0KCkuRnJhZ21lbnQsCiAgICAgICAgICAgIHsga2V5OiBpIH0sCiAgICAgICAgICAgIGtpZHMubWFwKChiLCBqKSA9PiBiKHN1YiwgY3R4LCBqKSkKICAgICAgICAgICk7CiAgICAgICAgfSkKICAgICAgKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHdhbGtJZihlbCwgaG9zdCkgewogICAgY29uc3QgdmFsR2V0ID0gY29tcGlsZUF0dHIoZWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpIHx8ICIiKTsKICAgIGNvbnN0IGhpbnRSYXcgPSBlbC5nZXRBdHRyaWJ1dGUoImhpbnQtcGxhY2Vob2xkZXItdmFsIik7CiAgICBjb25zdCBoaW50R2V0ID0gaGludFJhdyAhPSBudWxsID8gY29tcGlsZUF0dHIoaGludFJhdykgOiBudWxsOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGxldCB2ID0gdmFsR2V0KHZhbHMpOwogICAgICBpZiAodiA9PT0gdm9pZCAwICYmIGhpbnRHZXQgJiYgY3R4Py5fX3N0cmVhbWluZ05vdykgdiA9IGhpbnRHZXQodmFscyk7CiAgICAgIHJldHVybiB2ID8gaCgKICAgICAgICBnZXRSZWFjdCgpLkZyYWdtZW50LAogICAgICAgIHsga2V5IH0sCiAgICAgICAga2lkcy5tYXAoKGIsIGopID0+IGIodmFscywgY3R4LCBqKSkKICAgICAgKSA6IG51bGw7CiAgICB9OwogIH0KICBmdW5jdGlvbiB3YWxrQ29tcG9uZW50KGVsLCBob3N0KSB7CiAgICBjb25zdCBuYW1lID0gZWwuZ2V0QXR0cmlidXRlKCJuYW1lIikgfHwgZWwuZ2V0QXR0cmlidXRlKCJjb21wb25lbnQiKSB8fCAiIjsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgibmFtZSIpOwogICAgZWwucmVtb3ZlQXR0cmlidXRlKCJjb21wb25lbnQiKTsKICAgIGNvbnN0IHRwbElkID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLWRjLXRwbCIpOwogICAgY29uc3Qgc3R5bGVSYXcgPSBlbC5nZXRBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBjb25zdCBzdHlsZUdldCA9IHN0eWxlUmF3ICE9IG51bGwgPyBjb21waWxlQXR0cihzdHlsZVJhdykgOiBudWxsOwogICAgY29uc3QgeyBwcm9wR2V0dGVycywgaGludFNpemUgfSA9IGNvbGxlY3RQcm9wcyhlbCwgImRjLWltcG9ydCIsIGhvc3QpOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGNvbnN0IHByb3BzID0gewogICAgICAgIGtleSwKICAgICAgICBfX2hpbnRTaXplOiBoaW50U2l6ZSwKICAgICAgICBfX3RwbElkOiB0cGxJZCwKICAgICAgICBfX2hvc3RTdHlsZTogc3R5bGVHZXQgPyBob3N0UG9zaXRpb25TdHlsZShzdHlsZUdldCh2YWxzKSkgOiB2b2lkIDAKICAgICAgfTsKICAgICAgZm9yIChjb25zdCBbaywgZ10gb2YgcHJvcEdldHRlcnMpIHsKICAgICAgICBjb25zdCB2ID0gZyh2YWxzKTsKICAgICAgICBpZiAoayA9PT0gImRjUHJvcHMiKSB7CiAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gIm9iamVjdCIpIE9iamVjdC5hc3NpZ24ocHJvcHMsIHYpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHByb3BzW2tdID0gdjsKICAgICAgfQogICAgICBpZiAoa2lkcy5sZW5ndGgpIHByb3BzLmNoaWxkcmVuID0ga2lkcy5tYXAoKGIsIGopID0+IGIodmFscywgY3R4LCBqKSk7CiAgICAgIHJldHVybiBoKGhvc3QuY29tcG9uZW50KG5hbWUpLCBwcm9wcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiB3YWxrWEltcG9ydChlbCwgaG9zdCkgewogICAgY29uc3QgZ2xvYmFsTmFtZUdldCA9IGNvbXBpbGVBdHRyKAogICAgICBlbC5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudC1mcm9tLWdsb2JhbC1zY29wZSIpIHx8ICIiCiAgICApOwogICAgY29uc3QgZXhwb3J0TmFtZUdldCA9IGNvbXBpbGVBdHRyKAogICAgICBlbC5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudCIpIHx8IGVsLmdldEF0dHJpYnV0ZSgibmFtZSIpIHx8ICIiCiAgICApOwogICAgY29uc3QgZnJvbVJhdyA9IGVsLmdldEF0dHJpYnV0ZSgiZnJvbSIpIHx8IChlbC5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudC1mcm9tLWdsb2JhbC1zY29wZSIpID8gIiIgOiBlbC5nZXRBdHRyaWJ1dGUoInNyYyIpIHx8IGVsLmdldEF0dHJpYnV0ZSgiaW1wb3J0IikgfHwgIiIpOwogICAgY29uc3QgdXJscyA9IGZyb21SYXcudHJpbSgpID8gZnJvbVJhdy50cmltKCkuc3BsaXQoL1xzKy8pIDogW107CiAgICBjb25zdCB1cmwgPSB1cmxzLmxlbmd0aCA/IHVybHNbdXJscy5sZW5ndGggLSAxXSA6ICIiOwogICAgY29uc3Qga2luZE9mID0gKHUpID0+IC9cLihqc3h8dHN4KShcP3wjfCQpL2kudGVzdCh1KSA/ICJqc3giIDogImpzIjsKICAgIGNvbnN0IHRwbElkID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLWRjLXRwbCIpOwogICAgY29uc3Qgc3R5bGVSYXcgPSBlbC5nZXRBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBjb25zdCBzdHlsZUdldCA9IHN0eWxlUmF3ICE9IG51bGwgPyBjb21waWxlQXR0cihzdHlsZVJhdykgOiBudWxsOwogICAgY29uc3Qgd3JhcCA9IHRwbElkICE9IG51bGwgfHwgc3R5bGVHZXQgIT0gbnVsbDsKICAgIGNvbnN0IHsgcHJvcEdldHRlcnMsIGhpbnRTaXplIH0gPSBjb2xsZWN0UHJvcHMoZWwsICJ4LWltcG9ydCIsIGhvc3QpOwogICAgY29uc3QgaGFzQ29udGVudCA9IGVsLmNoaWxkcmVuLmxlbmd0aCA+IDAgfHwgISEoZWwudGV4dENvbnRlbnQgfHwgIiIpLnRyaW0oKTsKICAgIGNvbnN0IGRlY2tLZXllZCA9IGhhc0NvbnRlbnQgJiYgaXNEZWNrTW91bnRUYWcoZWwpID8gd2Fsa0RlY2tDaGlsZHJlbihlbCwgaG9zdCkgOiBudWxsOwogICAgY29uc3Qga2lkcyA9IGRlY2tLZXllZCA/IGRlY2tLZXllZC5raWRzIDogaGFzQ29udGVudCA/IHdhbGtDaGlsZHJlbihlbCwgaG9zdCkgOiBbXTsKICAgIGNvbnN0IGtpZEtleXMgPSBkZWNrS2V5ZWQ/LmtleXMgPz8gbnVsbDsKICAgIGNvbnN0IHVybEJpbmRhYmxlID0gZnJvbVJhdy5pbmNsdWRlcygie3siKTsKICAgIGlmICh1cmxzLmxlbmd0aCAmJiAhdXJsQmluZGFibGUpIHsKICAgICAgbGV0IHByZXY7CiAgICAgIGZvciAoY29uc3QgdSBvZiB1cmxzKSBwcmV2ID0gaG9zdC5sb2FkRXh0ZXJuYWwoa2luZE9mKHUpLCB1LCBwcmV2KTsKICAgIH0KICAgIGNvbnN0IGV2YWxOYW1lID0gKGcsIHZhbHMpID0+IHsKICAgICAgY29uc3QgdiA9IGcodmFscyk7CiAgICAgIGNvbnN0IHMgPSB2ID09IG51bGwgPyAiIiA6IFN0cmluZyh2KTsKICAgICAgcmV0dXJuIHMuaW5jbHVkZXMoInt7IikgPyAiIiA6IHM7CiAgICB9OwogICAgcmV0dXJuICh2YWxzLCBjdHgsIGtleSkgPT4gewogICAgICBjb25zdCBnbG9iYWxOYW1lID0gZXZhbE5hbWUoZ2xvYmFsTmFtZUdldCwgdmFscyk7CiAgICAgIGNvbnN0IG5hbWUgPSBnbG9iYWxOYW1lIHx8IGV2YWxOYW1lKGV4cG9ydE5hbWVHZXQsIHZhbHMpOwogICAgICBjb25zdCBDID0gIW5hbWUgfHwgdXJsQmluZGFibGUgPyBudWxsIDogZ2xvYmFsTmFtZSA/IGhvc3QucmVzb2x2ZUV4dGVybmFsR2xvYmFsKHVybCwgZ2xvYmFsTmFtZSkgOiBob3N0LnJlc29sdmVFeHRlcm5hbCh1cmwsIG5hbWUpOwogICAgICBjb25zdCBob3N0U3R5bGUgPSBzdHlsZUdldCA/IGhvc3RQb3NpdGlvblN0eWxlKHN0eWxlR2V0KHZhbHMpKSA6IHZvaWQgMDsKICAgICAgY29uc3Qgd3JhcHBlciA9IHdyYXAgPyB7CiAgICAgICAga2V5LAogICAgICAgIGNsYXNzTmFtZTogInNjLWhvc3QteCIsCiAgICAgICAgImRhdGEtZGMtdHBsIjogdHBsSWQsCiAgICAgICAgc3R5bGU6IGhvc3RTdHlsZSB8fCB7IGRpc3BsYXk6ICJjb250ZW50cyIgfQogICAgICB9IDogbnVsbDsKICAgICAgaWYgKCFDKSB7CiAgICAgICAgY29uc3QgZXJyb3IgPSB1cmxCaW5kYWJsZSA/ICJ4LWltcG9ydCBgZnJvbWAgY2Fubm90IGNvbnRhaW4ge3sgXHUyMDI2IH19IFx1MjAxNCBtb2R1bGUgVVJMcyBhcmUgcmVzb2x2ZWQgYXQgcGFyc2UgdGltZTsgdXNlIGEgbGl0ZXJhbCBVUkwiIDogaG9zdC5yZXNvbHZlRXh0ZXJuYWxFcnJvcih1cmwsIG5hbWUpOwogICAgICAgIGNvbnN0IHBoID0gaG9zdC5wbGFjZWhvbGRlcih7CiAgICAgICAgICBrZXk6IHdyYXBwZXIgPyB2b2lkIDAgOiBrZXksCiAgICAgICAgICBuYW1lLAogICAgICAgICAgaGludFNpemUsCiAgICAgICAgICBlcnJvcgogICAgICAgIH0pOwogICAgICAgIHJldHVybiB3cmFwcGVyID8gaCgiZGl2Iiwgd3JhcHBlciwgcGgpIDogcGg7CiAgICAgIH0KICAgICAgY29uc3QgcHJvcHMgPSB3cmFwcGVyID8ge30gOiB7IGtleSB9OwogICAgICBsZXQgdW5yZXNvbHZlZEhvbGUgPSBmYWxzZTsKICAgICAgZm9yIChjb25zdCBbaywgZ10gb2YgcHJvcEdldHRlcnMpIHsKICAgICAgICBpZiAoayA9PT0gImNvbXBvbmVudCIgfHwgayA9PT0gImNvbXBvbmVudEZyb21HbG9iYWxTY29wZSIgfHwgayA9PT0gImZyb20iKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdiA9IGcodmFscyk7CiAgICAgICAgaWYgKHYgPT09IHZvaWQgMCkgdW5yZXNvbHZlZEhvbGUgPSB0cnVlOwogICAgICAgIGlmIChrID09PSAiZGNQcm9wcyIpIHsKICAgICAgICAgIGlmICh2ICYmIHR5cGVvZiB2ID09PSAib2JqZWN0IikgT2JqZWN0LmFzc2lnbihwcm9wcywgdik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcHJvcHNba10gPSB2OwogICAgICB9CiAgICAgIGlmICh1bnJlc29sdmVkSG9sZSAmJiBjdHg/Ll9faHRtbFN0cmVhbWluZ05vdykgewogICAgICAgIGNvbnN0IHBoID0gaG9zdC5wbGFjZWhvbGRlcih7CiAgICAgICAgICBrZXk6IHdyYXBwZXIgPyB2b2lkIDAgOiBrZXksCiAgICAgICAgICBuYW1lLAogICAgICAgICAgaGludFNpemUsCiAgICAgICAgICBlcnJvcjogbnVsbAogICAgICAgIH0pOwogICAgICAgIHJldHVybiB3cmFwcGVyID8gaCgiZGl2Iiwgd3JhcHBlciwgcGgpIDogcGg7CiAgICAgIH0KICAgICAgaWYgKGtpZHMubGVuZ3RoKSB7CiAgICAgICAgcHJvcHMuY2hpbGRyZW4gPSByZW5kZXJEZWNrS2lkcyhraWRzLCBraWRLZXlzLCB2YWxzLCBjdHgpOwogICAgICB9CiAgICAgIHJldHVybiB3cmFwcGVyID8gaCgiZGl2Iiwgd3JhcHBlciwgaChDLCBwcm9wcykpIDogaChDLCBwcm9wcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjb250ZW50S2V5KGVsKSB7CiAgICBjb25zdCBjbG9uZSA9IGVsLmNsb25lTm9kZSh0cnVlKTsKICAgIGZvciAoY29uc3QgZCBvZiBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCIqIikpIHsKICAgICAgd2hpbGUgKGQuYXR0cmlidXRlcy5sZW5ndGgpIGQucmVtb3ZlQXR0cmlidXRlKGQuYXR0cmlidXRlc1swXS5uYW1lKTsKICAgIH0KICAgIGNvbnN0IHMgPSBjbG9uZS5pbm5lckhUTUw7CiAgICBsZXQgaDIgPSA1MzgxOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSBoMiA9IChoMiA8PCA1KSArIGgyICsgcy5jaGFyQ29kZUF0KGkpIHwgMDsKICAgIHJldHVybiBzLmxlbmd0aCArICIuIiArIChoMiA+Pj4gMCkudG9TdHJpbmcoMzYpOwogIH0KICB2YXIgTkVWRVJfQ09OVEVOVF9LRVlFRCA9IG5ldyBTZXQoCiAgICAic2NyaXB0IHN0eWxlIHRleHRhcmVhIG9wdGlvbiB0aXRsZSBzZWxlY3QgY2FudmFzIGlmcmFtZSB2aWRlbyBhdWRpbyIuc3BsaXQoCiAgICAgICIgIgogICAgKQogICk7CiAgdmFyIE5PVF9JTkxJTkVfU0VMRUNUT1IgPSAiOm5vdCgiICsgWy4uLklOTElORV9URVhUX1RBR1NdLmpvaW4oIiwiKSArICIpIjsKICBmdW5jdGlvbiB3YWxrRWxlbWVudChlbCwgaG9zdCkgewogICAgY29uc3QgcmVhbFRhZyA9IFJBV19VTldSQVBbZWwubG9jYWxOYW1lXSB8fCBlbC5sb2NhbE5hbWU7CiAgICBjb25zdCB0cGxJZCA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1kYy10cGwiKTsKICAgIGNvbnN0IGlubGluZU9ubHkgPSBlbC5jaGlsZE5vZGVzLmxlbmd0aCA+IDAgJiYgIU5FVkVSX0NPTlRFTlRfS0VZRUQuaGFzKHJlYWxUYWcpICYmIGVsLnF1ZXJ5U2VsZWN0b3IoTk9UX0lOTElORV9TRUxFQ1RPUikgPT09IG51bGw7CiAgICBjb25zdCBrZXlTdWZmaXggPSBpbmxpbmVPbmx5ID8gInwiICsgY29udGVudEtleShlbCkgOiAiIjsKICAgIGNvbnN0IHsgcHJvcEdldHRlcnMsIHBzZXVkb0NsYXNzZXMgfSA9IGNvbGxlY3RQcm9wcyhlbCwgImRvbSIsIGhvc3QpOwogICAgY29uc3QgZGVja0tleWVkID0gaXNEZWNrTW91bnRUYWcoZWwpID8gd2Fsa0RlY2tDaGlsZHJlbihlbCwgaG9zdCkgOiBudWxsOwogICAgY29uc3Qga2lkcyA9IGRlY2tLZXllZCA/IGRlY2tLZXllZC5raWRzIDogd2Fsa0NoaWxkcmVuKGVsLCBob3N0KTsKICAgIGNvbnN0IGtpZEtleXMgPSBkZWNrS2V5ZWQ/LmtleXMgPz8gbnVsbDsKICAgIHJldHVybiAodmFscywgY3R4LCBrZXkpID0+IHsKICAgICAgY29uc3QgcHJvcHMgPSB7CiAgICAgICAga2V5OiBrZXkgKyBrZXlTdWZmaXgsCiAgICAgICAgImRhdGEtZGMtdHBsIjogdHBsSWQKICAgICAgfTsKICAgICAgZm9yIChjb25zdCBbaywgZ10gb2YgcHJvcEdldHRlcnMpIHsKICAgICAgICBsZXQgdiA9IGcodmFscyk7CiAgICAgICAgaWYgKGsgPT09ICJzdHlsZSIgJiYgdHlwZW9mIHYgPT09ICJzdHJpbmciKSB2ID0gY3NzVG9PYmoodik7CiAgICAgICAgaWYgKChrID09PSAidmFsdWUiIHx8IGsgPT09ICJjaGVja2VkIikgJiYgdiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB2ID0gayA9PT0gImNoZWNrZWQiID8gZmFsc2UgOiAiIjsKICAgICAgICB9CiAgICAgICAgcHJvcHNba10gPSB2OwogICAgICB9CiAgICAgIGlmIChwc2V1ZG9DbGFzc2VzLmxlbmd0aCkgewogICAgICAgIHByb3BzLmNsYXNzTmFtZSA9IFtwcm9wcy5jbGFzc05hbWUsIC4uLnBzZXVkb0NsYXNzZXNdLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIik7CiAgICAgIH0KICAgICAgcmV0dXJuIGgocmVhbFRhZywgcHJvcHMsIC4uLnJlbmRlckRlY2tLaWRzKGtpZHMsIGtpZEtleXMsIHZhbHMsIGN0eCkpOwogICAgfTsKICB9CgogIC8vIHNyYy9sb2dpYy50cwogIHZhciBTdHJlYW1hYmxlTG9naWMgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcihwcm9wcykgewogICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJwcm9wcyIpOwogICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJzdGF0ZSIsIHt9KTsKICAgICAgLyoqIEJhY2stcG9pbnRlciB0byB0aGUgd3JhcHBlciBjb21wb25lbnQsIGluc3RhbGxlZCBhZnRlciBjb25zdHJ1Y3Rpb24uICovCiAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9faG9zdCIpOwogICAgICB0aGlzLnByb3BzID0gcHJvcHMgfHwge307CiAgICB9CiAgICBzZXRTdGF0ZSh1cGRhdGUsIGNiKSB7CiAgICAgIHRoaXMuX19ob3N0ICYmIHRoaXMuX19ob3N0Ll9fc2V0TG9naWNTdGF0ZSh1cGRhdGUsIGNiKTsKICAgIH0KICAgIGZvcmNlVXBkYXRlKCkgewogICAgICB0aGlzLl9faG9zdCAmJiB0aGlzLl9faG9zdC5mb3JjZVVwZGF0ZSgpOwogICAgfQogICAgY29tcG9uZW50RGlkTW91bnQoKSB7CiAgICB9CiAgICBjb21wb25lbnREaWRVcGRhdGUoX3ByZXZQcm9wcykgewogICAgfQogICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7CiAgICB9CiAgICAvKiogVGhlIGZsYXQgb2JqZWN0IHRoZSB0ZW1wbGF0ZSByZW5kZXJzIGFnYWluc3QgKG1lcmdlZCBvdmVyIHByb3BzKS4gKi8KICAgIHJlbmRlclZhbHMoKSB7CiAgICAgIHJldHVybiB7fTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGV2YWxEY0xvZ2ljKHNyYykgewogICAgLy8hIG5vc2VtZ3JlcDogZXZhbC1hbmQtZnVuY3Rpb24tY29uc3RydWN0b3IKICAgIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKAogICAgICAiRENMb2dpYyIsCiAgICAgICJTdHJlYW1hYmxlTG9naWMiLAogICAgICAiUmVhY3QiLAogICAgICBzcmMgKyAnXG47cmV0dXJuICh0eXBlb2YgQ29tcG9uZW50IT09InVuZGVmaW5lZCImJkNvbXBvbmVudCl8fHVuZGVmaW5lZDsnCiAgICApOwogICAgcmV0dXJuIGZuKFN0cmVhbWFibGVMb2dpYywgU3RyZWFtYWJsZUxvZ2ljLCBnZXRSZWFjdCgpKTsKICB9CgogIC8vIHNyYy9jb21wb25lbnQudHMKICBmdW5jdGlvbiBzaGFsbG93RXF1YWwoYSwgYikgewogICAgaWYgKCFiKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBhayA9IE9iamVjdC5rZXlzKGEpLmZpbHRlcigoaykgPT4gayAhPT0gImNoaWxkcmVuIik7CiAgICBjb25zdCBiayA9IE9iamVjdC5rZXlzKGIpLmZpbHRlcigoaykgPT4gayAhPT0gImNoaWxkcmVuIik7CiAgICBpZiAoYWsubGVuZ3RoICE9PSBiay5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoY29uc3QgayBvZiBhaykgaWYgKGFba10gIT09IGJba10pIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiBQbGFjZWhvbGRlcih7CiAgICBuYW1lLAogICAgaGludFNpemUsCiAgICBzdHJlYW1pbmcsCiAgICBlcnJvcgogIH0pIHsKICAgIGNvbnN0IFt3LCBoZ3RdID0gKGhpbnRTaXplIHx8ICIxMDAlLDYwcHgiKS5zcGxpdCgiLCIpOwogICAgcmV0dXJuIGgoCiAgICAgICJkaXYiLAogICAgICB7CiAgICAgICAgY2xhc3NOYW1lOiAic2MtcGxhY2Vob2xkZXIiICsgKHN0cmVhbWluZyA/ICIgc2Mtc3RyZWFtaW5nIiA6ICIiKSwKICAgICAgICBzdHlsZTogeyB3aWR0aDogdy50cmltKCksIGhlaWdodDogaGd0ICYmIGhndC50cmltKCkgfSwKICAgICAgICB0aXRsZTogbmFtZQogICAgICB9LAogICAgICBlcnJvciA/IGgoCiAgICAgICAgImRpdiIsCiAgICAgICAgeyBjbGFzc05hbWU6ICJzYy1wbGFjZWhvbGRlci1lcnJvciIgfSwKICAgICAgICAobmFtZSA/IG5hbWUgKyAiOiAiIDogIiIpICsgZXJyb3IKICAgICAgKSA6IG51bGwKICAgICk7CiAgfQogIGZ1bmN0aW9uIGhpbnRUb01pbihoaW50KSB7CiAgICBpZiAoIWhpbnQpIHJldHVybiB2b2lkIDA7CiAgICBjb25zdCBbdywgaGd0XSA9IGhpbnQuc3BsaXQoIiwiKTsKICAgIHJldHVybiB7IG1pbldpZHRoOiB3LnRyaW0oKSwgbWluSGVpZ2h0OiBoZ3QgJiYgaGd0LnRyaW0oKSB9OwogIH0KICBmdW5jdGlvbiBjcmVhdGVDb21wb25lbnRGYWN0b3J5KHJlZ2lzdHJ5LCBlbnN1cmVGZXRjaGVkKSB7CiAgICBjb25zdCBSZWFjdCA9IGdldFJlYWN0KCk7CiAgICBjb25zdCBBbmNlc3RvckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KFtdKTsKICAgIGNsYXNzIFN0cmVhbWFibGVDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgewogICAgICBjb25zdHJ1Y3Rvcihwcm9wcykgewogICAgICAgIHN1cGVyKHByb3BzKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX25hbWUiKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX3N1YiIpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fbmVlZHNEaWRNb3VudCIsIGZhbHNlKTsKICAgICAgICAvKiogU25hcHNob3Qgb2YgdGhlIHJlZ2lzdHJ5J3Mgc3RyZWFtaW5nIGZsYWdzIHRha2VuIGF0IHJlbmRlciB0aW1lIOKAlAogICAgICAgICAqICBidWlsZGVycyByZWFkIGl0IG9mZiB0aGUgUmVuZGVyQ3R4ICh0aGlzKSB0byBwaWNrIHBsYWNlaG9sZGVyIHZzCiAgICAgICAgICogIHJlbmRlci1ub3RoaW5nIGZvciB1bnJlc29sdmVkIHZhbHVlcy4gKi8KICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX3N0cmVhbWluZ05vdyIsIGZhbHNlKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX2h0bWxTdHJlYW1pbmdOb3ciLCBmYWxzZSk7CiAgICAgICAgLyoqIFdoZW4gYSBjb25zdHJ1Y3QgdGhyb3dzLCByZW1lbWJlciB0aGUgKGNsYXNzLCByZWdpc3RyeS52ZXIsIHByb3BzKQogICAgICAgICAqICB0cmlwbGUgc28gcmVuZGVyLXRpbWUgcmVjb25jaWxlIGRvZXNuJ3QgcmUtYXR0ZW1wdCBpdCBvbiBldmVyeSBwYXJlbnQKICAgICAgICAgKiAgcmUtcmVuZGVyLiBBIHJlZ2lzdHJ5IGJ1bXAgKG5ldyBjbGFzcywgdGVtcGxhdGUsIGV4dGVybmFsIG1vZHVsZQogICAgICAgICAqICByZXNvbHZpbmcgdmlhIGJ1bXBBbGwpIGNoYW5nZXMgYHZlcmAgYW5kIGJyZWFrcyB0aGUgbWVtbyBzbyBhbgogICAgICAgICAqICBlbnYtZGVwZW5kZW50IGNvbnN0cnVjdG9yIGNhbiBzZWxmLWhlYWwuICovCiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19mYWlsZWRMb2dpYyIsIG51bGwpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fZmFpbGVkVXNlclByb3BzIiwgbnVsbCk7CiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19mYWlsZWRWZXIiLCAtMSk7CiAgICAgICAgLyoqIFBlci1pbnN0YW5jZSBjb25zdHJ1Y3RvciBlcnJvciDigJQga2VwdCBoZXJlIChub3Qgb24gdGhlIHJlZ2lzdHJ5IGVudHJ5KQogICAgICAgICAqICBzbyBvbmUgaW5zdGFuY2UncyBzdWNjZXNzZnVsIGNvbnN0cnVjdCBjYW4ndCBoaWRlIGEgc2libGluZydzIGZhaWx1cmUsCiAgICAgICAgICogIGFuZCBhIGNvbnN0cnVjdCBjYW4gbmV2ZXIgd2lwZSBhbiBldmFsIGVycm9yIGB1cGRhdGVKc2AgcmVjb3JkZWQgb24KICAgICAgICAgKiAgYHIubG9naWNFcnJvcmAuICovCiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19jdG9yRXJyb3IiLCBudWxsKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJsb2dpYyIpOwogICAgICAgIHRoaXMuX19uYW1lID0gcHJvcHMuX19uYW1lOwogICAgICAgIHRoaXMuc3RhdGUgPSB7IF9fdjogMCwgX19lcnI6IG51bGwgfTsKICAgICAgICB0aGlzLl9fc3ViID0gKCkgPT4gewogICAgICAgICAgaWYgKHRoaXMuc3RhdGUuX19lcnIpIHRoaXMuc2V0U3RhdGUoeyBfX2VycjogbnVsbCB9KTsKICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuX19tYWtlTG9naWMocmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS5Mb2dpYywgbnVsbCk7CiAgICAgICAgZW5zdXJlRmV0Y2hlZCh0aGlzLl9fbmFtZSk7CiAgICAgIH0KICAgICAgLyoqIEVycm9yLWJvdW5kYXJ5IGhvb2s6IGEgcmVuZGVyIGNyYXNoIGFueXdoZXJlIGluIHRoaXMgREMncyBzdWJ0cmVlCiAgICAgICAqICAoaXRzIG93biB0ZW1wbGF0ZSwgYW4geC1pbXBvcnQnZCBjb21wb25lbnQsIGEgY2hpbGQgREMgd2l0aG91dCBpdHMKICAgICAgICogIG93biBkZWVwZXIgYm91bmRhcnkpIGxhbmRzIGhlcmUgaW5zdGVhZCBvZiB1bm1vdW50aW5nIHRoZSBwYWdlLiAqLwogICAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGUpIHsKICAgICAgICByZXR1cm4geyBfX2VycjogZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZSA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSB9OwogICAgICB9CiAgICAgIGNvbXBvbmVudERpZENhdGNoKGUsIGluZm8pIHsKICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSByZW5kZXIgZXJyb3IgaW4gPCIgKyB0aGlzLl9fbmFtZSArICI+OiIsCiAgICAgICAgICBlLAogICAgICAgICAgaW5mbz8uY29tcG9uZW50U3RhY2sgfHwgIiIKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKiBJbnN0YW50aWF0ZSB0aGUgbG9naWMgY2xhc3MgKG9yIHRoZSBuby1vcCBiYXNlKSBhbmQgYWRvcHQgYHByZXZTdGF0ZWAKICAgICAgICogIG92ZXIgaXRzIGluaXRpYWwgc3RhdGUg4oCUIHVzZWQgYm90aCBhdCBtb3VudCBhbmQgb24gaG90LXN3YXAuICovCiAgICAgIF9fbWFrZUxvZ2ljKExvZ2ljLCBwcmV2U3RhdGUpIHsKICAgICAgICBjb25zdCBMID0gTG9naWMgfHwgU3RyZWFtYWJsZUxvZ2ljOwogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmxvZ2ljID0gbmV3IEwodGhpcy5fX3VzZXJQcm9wcygpKTsKICAgICAgICAgIHRoaXMuX19mYWlsZWRMb2dpYyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fZmFpbGVkVXNlclByb3BzID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19jdG9yRXJyb3IgPSBudWxsOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB0aGlzLl9fZmFpbGVkTG9naWMgPSBMb2dpYzsKICAgICAgICAgIHRoaXMuX19mYWlsZWRVc2VyUHJvcHMgPSB0aGlzLl9fdXNlclByb3BzKCk7CiAgICAgICAgICB0aGlzLl9fZmFpbGVkVmVyID0gcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS52ZXI7CiAgICAgICAgICB0aGlzLl9fY3RvckVycm9yID0gdGhpcy5fX25hbWUgKyAiOiAiICsgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpOwogICAgICAgICAgdGhpcy5sb2dpYyA9IG5ldyBTdHJlYW1hYmxlTG9naWMoCiAgICAgICAgICAgIHRoaXMuX191c2VyUHJvcHMoKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5sb2dpYy5fX2hvc3QgPSB0aGlzOwogICAgICAgIGlmIChwcmV2U3RhdGUpCiAgICAgICAgICB0aGlzLmxvZ2ljLnN0YXRlID0geyAuLi50aGlzLmxvZ2ljLnN0YXRlIHx8IHt9LCAuLi5wcmV2U3RhdGUgfTsKICAgICAgfQogICAgICAvKiogVGhlIHByb3BzIHRoZSBhdXRob3IncyBsb2dpYyArIHRlbXBsYXRlIHNlZSDigJQgaW50ZXJuYWwgX18tcHJlZml4ZWQKICAgICAgICogIHdpcmluZyBzdHJpcHBlZC4gKi8KICAgICAgX191c2VyUHJvcHMoKSB7CiAgICAgICAgY29uc3QgeyBfX25hbWUsIF9faGludFNpemUsIF9fdHBsSWQsIF9faG9zdFN0eWxlLCAuLi5yZXN0IH0gPSB0aGlzLnByb3BzOwogICAgICAgIHJldHVybiByZXN0OwogICAgICB9CiAgICAgIF9fc2V0TG9naWNTdGF0ZSh1cGRhdGUsIGNiKSB7CiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMubG9naWMuc3RhdGU7CiAgICAgICAgY29uc3QgcGF0Y2ggPSB0eXBlb2YgdXBkYXRlID09PSAiZnVuY3Rpb24iID8gdXBkYXRlKHByZXYpIDogdXBkYXRlOwogICAgICAgIHRoaXMubG9naWMuc3RhdGUgPSB7IC4uLnByZXYsIC4uLnBhdGNoIH07CiAgICAgICAgdGhpcy5zZXRTdGF0ZSgocykgPT4gKHsgX192OiBzLl9fdiArIDEgfSksIGNiKTsKICAgICAgfQogICAgICAvKiogU3dhcCB0aGUgbG9naWMgaW5zdGFuY2Ugd2hlbiB0aGUgcmVnaXN0cnkncyBMb2dpYyBjbGFzcyBjaGFuZ2VkCiAgICAgICAqICAoc3RyZWFtaW5nIGNvbXBsZXRpb24sIGhvdCByZWxvYWQpLiBTdGF0ZSBjYXJyaWVzIG92ZXI7IGRpZE1vdW50CiAgICAgICAqICByZS1maXJlcyBhZnRlciB0aGUgc3dhcCBjb21taXRzIHNvIHJlZnMgZXhpc3QuICovCiAgICAgIF9fcmVjb25jaWxlTG9naWMoKSB7CiAgICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldCh0aGlzLl9fbmFtZSk7CiAgICAgICAgY29uc3QgTmV4dCA9IHIuTG9naWM7CiAgICAgICAgY29uc3QgQ3VyID0gdGhpcy5sb2dpYy5jb25zdHJ1Y3RvcjsKICAgICAgICBpZiAoTmV4dCA9PT0gQ3VyIHx8ICFOZXh0ICYmIEN1ciA9PT0gU3RyZWFtYWJsZUxvZ2ljIHx8IE5leHQgPT09IHRoaXMuX19mYWlsZWRMb2dpYyAmJiByLnZlciA9PT0gdGhpcy5fX2ZhaWxlZFZlciAmJiBzaGFsbG93RXF1YWwodGhpcy5fX3VzZXJQcm9wcygpLCB0aGlzLl9fZmFpbGVkVXNlclByb3BzKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuX19uZWVkc0RpZE1vdW50KSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmxvZ2ljLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19tYWtlTG9naWMoTmV4dCwgdGhpcy5sb2dpYy5zdGF0ZSk7CiAgICAgICAgdGhpcy5fX25lZWRzRGlkTW91bnQgPSB0cnVlOwogICAgICB9CiAgICAgIGNvbXBvbmVudERpZE1vdW50KCkgewogICAgICAgIHJlZ2lzdHJ5LmdldCh0aGlzLl9fbmFtZSkuc3Vicy5hZGQodGhpcy5fX3N1Yik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMubG9naWMuY29tcG9uZW50RGlkTW91bnQoKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7CiAgICAgICAgdGhpcy5sb2dpYy5wcm9wcyA9IHRoaXMuX191c2VyUHJvcHMoKTsKICAgICAgICBpZiAodGhpcy5fX25lZWRzRGlkTW91bnQpIHsKICAgICAgICAgIGlmICh0aGlzLnN0YXRlLl9fZXJyIHx8ICFyZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpLnRwbCkgcmV0dXJuOwogICAgICAgICAgdGhpcy5fX25lZWRzRGlkTW91bnQgPSBmYWxzZTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMubG9naWMuY29tcG9uZW50RGlkTW91bnQoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5sb2dpYy5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7CiAgICAgICAgcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS5zdWJzLmRlbGV0ZSh0aGlzLl9fc3ViKTsKICAgICAgICBpZiAoIXRoaXMuX19uZWVkc0RpZE1vdW50KSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmxvZ2ljLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlbmRlcigpIHsKICAgICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKTsKICAgICAgICBjb25zdCBjbHMgPSAic2MtaG9zdCIgKyAoci5odG1sU3RyZWFtaW5nID8gIiBzYy1zdHJlYW1pbmctaHRtbCIgOiAiIikgKyAoci5qc1N0cmVhbWluZyA/ICIgc2Mtc3RyZWFtaW5nLWpzIiA6ICIiKTsKICAgICAgICBjb25zdCBoaW50U3R5bGUgPSByLmh0bWxTdHJlYW1pbmcgPyBoaW50VG9NaW4odGhpcy5wcm9wcy5fX2hpbnRTaXplKSA6IHZvaWQgMDsKICAgICAgICBjb25zdCBob3N0U3R5bGUgPSB0aGlzLnByb3BzLl9faG9zdFN0eWxlIHx8IGhpbnRTdHlsZSA/IHsgLi4uaGludFN0eWxlIHx8IHt9LCAuLi50aGlzLnByb3BzLl9faG9zdFN0eWxlIHx8IHt9IH0gOiB2b2lkIDA7CiAgICAgICAgY29uc3QgaG9zdEJhc2UgPSB7CiAgICAgICAgICBjbGFzc05hbWU6IGNscywKICAgICAgICAgIHN0eWxlOiBob3N0U3R5bGUsCiAgICAgICAgICAiZGF0YS1zYy1uYW1lIjogdGhpcy5fX25hbWUsCiAgICAgICAgICAiZGF0YS1kYy10cGwiOiB0aGlzLnByb3BzLl9fdHBsSWQKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYWluID0gQXJyYXkuaXNBcnJheSh0aGlzLmNvbnRleHQpID8gdGhpcy5jb250ZXh0IDogW107CiAgICAgICAgaWYgKGNoYWluLmluY2x1ZGVzKHRoaXMuX19uYW1lKSkgewogICAgICAgICAgY29uc3QgY3ljbGUgPSBbCiAgICAgICAgICAgIC4uLmNoYWluLnNsaWNlKGNoYWluLmluZGV4T2YodGhpcy5fX25hbWUpKSwKICAgICAgICAgICAgdGhpcy5fX25hbWUKICAgICAgICAgIF0uam9pbigiIFx1MjE5MiAiKTsKICAgICAgICAgIHJldHVybiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgeyAuLi5ob3N0QmFzZSwgY2xhc3NOYW1lOiBjbHMgKyAiIHNjLWhhcy1lcnJvciIgfSwKICAgICAgICAgICAgaChQbGFjZWhvbGRlciwgewogICAgICAgICAgICAgIG5hbWU6IHRoaXMuX19uYW1lLAogICAgICAgICAgICAgIGhpbnRTaXplOiB0aGlzLnByb3BzLl9faGludFNpemUsCiAgICAgICAgICAgICAgZXJyb3I6ICJjaXJjdWxhciBpbXBvcnQ6ICIgKyBjeWNsZQogICAgICAgICAgICB9KQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc3RhdGUuX19lcnIpIHsKICAgICAgICAgIHJldHVybiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgeyAuLi5ob3N0QmFzZSwgY2xhc3NOYW1lOiBjbHMgKyAiIHNjLWhhcy1lcnJvciIgfSwKICAgICAgICAgICAgaCgKICAgICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogInNjLWxvZ2ljLWVycm9yIiwgImRhdGEtb21lbGV0dGUtY2hyb21lIjogIiIgfSwKICAgICAgICAgICAgICB0aGlzLl9fbmFtZSArICI6ICIgKyB0aGlzLnN0YXRlLl9fZXJyCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGgoUGxhY2Vob2xkZXIsIHsKICAgICAgICAgICAgICBuYW1lOiB0aGlzLl9fbmFtZSwKICAgICAgICAgICAgICBoaW50U2l6ZTogdGhpcy5wcm9wcy5fX2hpbnRTaXplLAogICAgICAgICAgICAgIGVycm9yOiB0aGlzLnN0YXRlLl9fZXJyCiAgICAgICAgICAgIH0pCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICB0aGlzLl9fcmVjb25jaWxlTG9naWMoKTsKICAgICAgICBpZiAoIXIudHBsKSB7CiAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgImRpdiIsCiAgICAgICAgICAgIGhvc3RCYXNlLAogICAgICAgICAgICBoKFBsYWNlaG9sZGVyLCB7IG5hbWU6IHRoaXMuX19uYW1lLCBoaW50U2l6ZTogdGhpcy5wcm9wcy5fX2hpbnRTaXplIH0pCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCB1c2VyUHJvcHMgPSB0aGlzLl9fdXNlclByb3BzKCk7CiAgICAgICAgdGhpcy5sb2dpYy5wcm9wcyA9IHVzZXJQcm9wczsKICAgICAgICBsZXQgdmFscyA9IHVzZXJQcm9wczsKICAgICAgICBsZXQgcmVuZGVyRXJyID0gci5sb2dpY0Vycm9yIHx8IHRoaXMuX19jdG9yRXJyb3I7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhbHMgPSB7IC4uLnVzZXJQcm9wcywgLi4udGhpcy5sb2dpYy5yZW5kZXJWYWxzKCkgfHwge30gfTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgcmVuZGVyRXJyID0gdGhpcy5fX25hbWUgKyAiLnJlbmRlclZhbHMoKTogIiArIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fX3N0cmVhbWluZ05vdyA9ICEhKHIuaHRtbFN0cmVhbWluZyB8fCByLmpzU3RyZWFtaW5nKTsKICAgICAgICB0aGlzLl9faHRtbFN0cmVhbWluZ05vdyA9ICEhci5odG1sU3RyZWFtaW5nOwogICAgICAgIHJldHVybiBoKAogICAgICAgICAgImRpdiIsCiAgICAgICAgICB7IC4uLmhvc3RCYXNlLCBjbGFzc05hbWU6IGNscyArIChyZW5kZXJFcnIgPyAiIHNjLWhhcy1lcnJvciIgOiAiIikgfSwKICAgICAgICAgIHJlbmRlckVyciAmJiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgeyBjbGFzc05hbWU6ICJzYy1sb2dpYy1lcnJvciIsICJkYXRhLW9tZWxldHRlLWNocm9tZSI6ICIiIH0sCiAgICAgICAgICAgIHJlbmRlckVycgogICAgICAgICAgKSwKICAgICAgICAgIGgoCiAgICAgICAgICAgIEFuY2VzdG9yQ29udGV4dC5Qcm92aWRlciwKICAgICAgICAgICAgeyB2YWx1ZTogWy4uLmNoYWluLCB0aGlzLl9fbmFtZV0gfSwKICAgICAgICAgICAgci50cGwodmFscywgdGhpcykKICAgICAgICAgICkKICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBfX3B1YmxpY0ZpZWxkKFN0cmVhbWFibGVDb21wb25lbnQsICJjb250ZXh0VHlwZSIsIEFuY2VzdG9yQ29udGV4dCk7CiAgICBjb25zdCBuYW1lZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBmdW5jdGlvbiBnZXREQyhuYW1lKSB7CiAgICAgIGNvbnN0IGhpdCA9IG5hbWVkLmdldChuYW1lKTsKICAgICAgaWYgKGhpdCkgcmV0dXJuIGhpdDsKICAgICAgZnVuY3Rpb24gRGlzcGF0Y2hlcihwKSB7CiAgICAgICAgY29uc3QgWywgc2V0VGlja10gPSBSZWFjdC51c2VTdGF0ZSgwKTsKICAgICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gewogICAgICAgICAgY29uc3Qgc3ViID0gKCkgPT4gc2V0VGljaygobikgPT4gbiArIDEpOwogICAgICAgICAgcmVnaXN0cnkuZ2V0KG5hbWUpLnN1YnMuYWRkKHN1Yik7CiAgICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICByZWdpc3RyeS5nZXQobmFtZSkuc3Vicy5kZWxldGUoc3ViKTsKICAgICAgICAgIH07CiAgICAgICAgfSwgW10pOwogICAgICAgIGVuc3VyZUZldGNoZWQobmFtZSk7CiAgICAgICAgcmV0dXJuIGgoU3RyZWFtYWJsZUNvbXBvbmVudCwgeyAuLi5wLCBfX25hbWU6IG5hbWUgfSk7CiAgICAgIH0KICAgICAgRGlzcGF0Y2hlci5kaXNwbGF5TmFtZSA9IG5hbWU7CiAgICAgIG5hbWVkLnNldChuYW1lLCBEaXNwYXRjaGVyKTsKICAgICAgcmV0dXJuIERpc3BhdGNoZXI7CiAgICB9CiAgICByZXR1cm4gewogICAgICBnZXREQywKICAgICAgU3RyZWFtYWJsZUNvbXBvbmVudAogICAgfTsKICB9CgogIC8vIHNyYy9idW5kbGVkLnRzCiAgZnVuY3Rpb24gYnVuZGxlZEJsb2IodXJsKSB7CiAgICBjb25zdCBibG9icyA9IHdpbmRvdy5fX3Jlc291cmNlQmxvYnM7CiAgICBjb25zdCBiID0gYmxvYnMgPyBibG9ic1t1cmwuc3BsaXQoIiMiKVswXV0gOiB2b2lkIDA7CiAgICByZXR1cm4gYiBpbnN0YW5jZW9mIEJsb2IgPyBiIDogbnVsbDsKICB9CgogIC8vIHNyYy9jZG4udHMKICB2YXIgUkVBQ1RfVVJMID0gImh0dHBzOi8vdW5wa2cuY29tL3JlYWN0QDE4LjMuMS91bWQvcmVhY3QucHJvZHVjdGlvbi5taW4uanMiOwogIHZhciBSRUFDVF9TUkkgPSAic2hhMzg0LURHeUx4QXlqcTBmOVNQcFZldkQ2SWd6dENGbG5NRjZvVy9YUUdtZmUrSXNaOFRxRWlEcmNIa01MS0k2ZmlCL1oiOwogIHZhciBSRUFDVF9ET01fVVJMID0gImh0dHBzOi8vdW5wa2cuY29tL3JlYWN0LWRvbUAxOC4zLjEvdW1kL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcyI7CiAgdmFyIFJFQUNUX0RPTV9TUkkgPSAic2hhMzg0LWdUR3hoejIxbFZHWU5NY2RKT3lxMDFFZGcwamhuL2MyMm5zeDBreXFQMFR4YVY1V1Zkc1NIMWZTRFVmNVlKajEiOwogIHZhciBCQUJFTF9VUkwgPSAiaHR0cHM6Ly91bnBrZy5jb20vQGJhYmVsL3N0YW5kYWxvbmVANy4yOS4wL2JhYmVsLm1pbi5qcyI7CiAgdmFyIEJBQkVMX1NSSSA9ICJzaGEzODQtbTA4S2lkaU5xTGRwSnFMcTk1Ry9MRWk4UXZqbC94VVlsbDNRSUx5cE1vUTY1UW9ySjlMdnRwMlJYWUdCRmoxeSI7CiAgZnVuY3Rpb24gY2RuU2NyaXB0Rm9yKHVybCwgc3JpKSB7CiAgICBjb25zdCByZXMgPSB3aW5kb3cuX19yZXNvdXJjZXM7CiAgICBjb25zdCB2ID0gcmVzID8gcmVzW3VybF0gOiB2b2lkIDA7CiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICJzdHJpbmciICYmIHYgPyB7IHNyYzogdiB9IDogeyBzcmM6IHVybCwgaW50ZWdyaXR5OiBzcmkgfTsKICB9CgogIC8vIHNyYy9leHRlcm5hbC50cwogIHZhciBpc0N1c3RvbUVsZW1lbnROYW1lID0gKG4pID0+ICFuLmluY2x1ZGVzKCIuIikgJiYgbi5pbmNsdWRlcygiLSIpOwogIGZ1bmN0aW9uIGlzUmVuZGVyYWJsZVR5cGUoZykgewogICAgaWYgKHR5cGVvZiBnID09PSAiZnVuY3Rpb24iKSByZXR1cm4gIWlzRWxlbWVudENsYXNzKGcpOwogICAgcmV0dXJuIHR5cGVvZiBnID09PSAib2JqZWN0IiAmJiBnICE9PSBudWxsICYmIHR5cGVvZiBnLiQkdHlwZW9mID09PSAic3ltYm9sIjsKICB9CiAgZnVuY3Rpb24gcmVzb2x2ZURvdHRlZFBhdGgocm9vdCwgbmFtZSkgewogICAgbGV0IGN1ciA9IHJvb3Q7CiAgICBmb3IgKGNvbnN0IHNlZyBvZiBuYW1lLnNwbGl0KCIuIikpIHsKICAgICAgaWYgKGN1ciA9PSBudWxsKSByZXR1cm4gdm9pZCAwOwogICAgICBjdXIgPSBjdXJbc2VnXTsKICAgIH0KICAgIHJldHVybiBjdXI7CiAgfQogIHZhciBHTE9CQUxfUE9MTF9JTlRFUlZBTF9NUyA9IDUwOwogIHZhciBHTE9CQUxfUE9MTF9USU1FT1VUX01TID0gM2U0OwogIGZ1bmN0aW9uIGNyZWF0ZUV4dGVybmFsTW9kdWxlcyhvblJlc29sdmVkKSB7CiAgICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBsZXQgYmFiZWxMb2FkaW5nID0gbnVsbDsKICAgIGNvbnN0IHJlcG9ydGVkTWlzc2luZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBjb25zdCBwb2xsaW5nID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgIGZ1bmN0aW9uIGVuc3VyZUJhYmVsKCkgewogICAgICBpZiAod2luZG93LkJhYmVsKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgIGlmIChiYWJlbExvYWRpbmcpIHJldHVybiBiYWJlbExvYWRpbmc7CiAgICAgIGNvbnN0IGJhYmVsID0gY2RuU2NyaXB0Rm9yKEJBQkVMX1VSTCwgQkFCRUxfU1JJKTsKICAgICAgYmFiZWxMb2FkaW5nID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7CiAgICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICAgIHMuc3JjID0gYmFiZWwuc3JjOwogICAgICAgIGlmIChiYWJlbC5pbnRlZ3JpdHkpIHsKICAgICAgICAgIHMuaW50ZWdyaXR5ID0gYmFiZWwuaW50ZWdyaXR5OwogICAgICAgICAgcy5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiOwogICAgICAgIH0KICAgICAgICBzLm9ubG9hZCA9ICgpID0+IHJlcygpOwogICAgICAgIHMub25lcnJvciA9IHJlajsKICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGJhYmVsTG9hZGluZzsKICAgIH0KICAgIGNvbnN0IHBlbmRpbmcgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgZnVuY3Rpb24gbG9hZChraW5kLCB1cmwsIGFmdGVyKSB7CiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcGVuZGluZy5nZXQodXJsKTsKICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7CiAgICAgIGNhY2hlLnNldCh1cmwsIG51bGwpOwogICAgICBjb25zb2xlLmluZm8oIltkYy1ydW50aW1lXSB4LWltcG9ydDogbG9hZGluZyIsIHVybCwgIigiICsga2luZCArICIpIik7CiAgICAgIGNvbnN0IHJlYWR5ID0gUHJvbWlzZS5hbGwoWwogICAgICAgIGtpbmQgPT09ICJqc3giID8gZW5zdXJlQmFiZWwoKSA6IFByb21pc2UucmVzb2x2ZSgpLAogICAgICAgIGFmdGVyID8/IFByb21pc2UucmVzb2x2ZSgpCiAgICAgIF0pOwogICAgICBjb25zdCBwID0gcmVhZHkudGhlbigoKSA9PiB7CiAgICAgICAgY29uc3QgcHJlID0gYnVuZGxlZEJsb2IodXJsKTsKICAgICAgICBpZiAocHJlKSByZXR1cm4gcHJlLnRleHQoKTsKICAgICAgICByZXR1cm4gZmV0Y2godXJsKS50aGVuKChyKSA9PiB7CiAgICAgICAgICBpZiAoIXIub2spIHRocm93IG5ldyBFcnJvcigiSFRUUCAiICsgci5zdGF0dXMpOwogICAgICAgICAgcmV0dXJuIHIudGV4dCgpOwogICAgICAgIH0pOwogICAgICB9KS50aGVuKChzcmMpID0+IHsKICAgICAgICBjb25zdCBjb2RlID0ga2luZCA9PT0gImpzeCIgPyB3aW5kb3cuQmFiZWwudHJhbnNmb3JtKHNyYywgewogICAgICAgICAgZmlsZW5hbWU6IHVybCwKICAgICAgICAgIHByZXNldHM6IFsicmVhY3QiLCAidHlwZXNjcmlwdCJdCiAgICAgICAgfSkuY29kZSA6IHNyYzsKICAgICAgICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH07CiAgICAgICAgY29uc3QgYmVmb3JlID0gbmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cpKTsKICAgICAgICAvLyEgbm9zZW1ncmVwOiBldmFsLWFuZC1mdW5jdGlvbi1jb25zdHJ1Y3RvcgogICAgICAgIG5ldyBGdW5jdGlvbigiUmVhY3QiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAicmVxdWlyZSIsIGNvZGUpKAogICAgICAgICAgZ2V0UmVhY3QoKSwKICAgICAgICAgIG1vZHVsZSwKICAgICAgICAgIG1vZHVsZS5leHBvcnRzLAogICAgICAgICAgKCkgPT4gKHt9KQogICAgICAgICk7CiAgICAgICAgY29uc3QgZ2xvYmFscyA9IHt9OwogICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh3aW5kb3cpKSB7CiAgICAgICAgICBpZiAoIWJlZm9yZS5oYXMoaykgJiYgdHlwZW9mIHdpbmRvd1trXSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBnbG9iYWxzW2tdID0gd2luZG93W2tdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYWNoZS5zZXQodXJsLCB7IG1vZDogbW9kdWxlLmV4cG9ydHMsIGdsb2JhbHMgfSk7CiAgICAgICAgY29uc29sZS5pbmZvKAogICAgICAgICAgIltkYy1ydW50aW1lXSB4LWltcG9ydDogbG9hZGVkIiwKICAgICAgICAgIHVybCwKICAgICAgICAgICJcdTIwMTQgZXhwb3J0czoiLAogICAgICAgICAgT2JqZWN0LmtleXMobW9kdWxlLmV4cG9ydHMpLAogICAgICAgICAgIndpbmRvdyBnbG9iYWxzOiIsCiAgICAgICAgICBPYmplY3Qua2V5cyhnbG9iYWxzKQogICAgICAgICk7CiAgICAgICAgb25SZXNvbHZlZCgpOwogICAgICB9KS5jYXRjaCgoZSkgPT4gewogICAgICAgIGNhY2hlLnNldCh1cmwsIHsKICAgICAgICAgIG1vZDoge30sCiAgICAgICAgICBnbG9iYWxzOiB7fSwKICAgICAgICAgIGVycm9yOiAiZmFpbGVkIHRvIGxvYWQ6ICIgKyAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZSA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSkKICAgICAgICB9KTsKICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSB4LWltcG9ydDogRkFJTEVEIHRvIGxvYWQiLAogICAgICAgICAgdXJsLAogICAgICAgICAgIigiICsga2luZCArICIpIiwKICAgICAgICAgIGUKICAgICAgICApOwogICAgICAgIG9uUmVzb2x2ZWQoKTsKICAgICAgfSk7CiAgICAgIHBlbmRpbmcuc2V0KHVybCwgcCk7CiAgICAgIHJldHVybiBwOwogICAgfQogICAgZnVuY3Rpb24gcmVzb2x2ZTIodXJsLCBuYW1lKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gY2FjaGUuZ2V0KHVybCk7CiAgICAgIGlmICghZW50cnkpIHJldHVybiBudWxsOwogICAgICBjb25zdCB7IG1vZCwgZ2xvYmFscyB9ID0gZW50cnk7CiAgICAgIGNvbnN0IEMgPSBtb2QgJiYgbW9kW25hbWVdIHx8IGdsb2JhbHMgJiYgZ2xvYmFsc1tuYW1lXSB8fCB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiAmJiB3aW5kb3dbbmFtZV0gfHwgbW9kICYmIG1vZC5kZWZhdWx0OwogICAgICBpZiAodHlwZW9mIEMgPT09ICJmdW5jdGlvbiIpIHJldHVybiBDOwogICAgICBjb25zdCBrZXkgPSB1cmwgKyAiXDAiICsgbmFtZTsKICAgICAgaWYgKCFyZXBvcnRlZE1pc3NpbmcuaGFzKGtleSkpIHsKICAgICAgICByZXBvcnRlZE1pc3Npbmcuc2V0KAogICAgICAgICAga2V5LAogICAgICAgICAgZW50cnkuZXJyb3IgfHwgJ25vIGV4cG9ydCBuYW1lZCAiJyArIG5hbWUgKyAnIiAoaGFzOiAnICsgT2JqZWN0LmtleXMobW9kKS5qb2luKCIsICIpICsgIikiCiAgICAgICAgKTsKICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSB4LWltcG9ydDogbW9kdWxlIiwKICAgICAgICAgIHVybCwKICAgICAgICAgICJsb2FkZWQgYnV0IGhhcyBubyBjb21wb25lbnQgbmFtZWQiLAogICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZSksCiAgICAgICAgICAiXHUyMDE0IGF2YWlsYWJsZSBleHBvcnRzOiIsCiAgICAgICAgICBPYmplY3Qua2V5cyhtb2QpLAogICAgICAgICAgIndpbmRvdyBnbG9iYWxzOiIsCiAgICAgICAgICBPYmplY3Qua2V5cyhnbG9iYWxzKSwKICAgICAgICAgICIuIFRoZSBtb2R1bGUgbXVzdCBgbW9kdWxlLmV4cG9ydHMgPSB7IiArIG5hbWUgKyAifWAgb3Igc2V0IGB3aW5kb3cuIiArIG5hbWUgKyAiYC4iCiAgICAgICAgKTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHdhaXRGb3JHbG9iYWwobmFtZSkgewogICAgICBpZiAocG9sbGluZy5oYXMobmFtZSkpIHJldHVybjsKICAgICAgcG9sbGluZy5hZGQobmFtZSk7CiAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBEYXRlLm5vdygpOwogICAgICBjb25zdCBpc0NFID0gaXNDdXN0b21FbGVtZW50TmFtZShuYW1lKTsKICAgICAgY29uc3QgdGljayA9ICgpID0+IHsKICAgICAgICBjb25zdCBmb3VuZCA9IGlzQ0UgPyBjdXN0b21FbGVtZW50cy5nZXQobmFtZSkgOiBpc1JlbmRlcmFibGVUeXBlKHJlc29sdmVEb3R0ZWRQYXRoKHdpbmRvdywgbmFtZSkpOwogICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgcG9sbGluZy5kZWxldGUobmFtZSk7CiAgICAgICAgICBvblJlc29sdmVkKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRlZCA+PSBHTE9CQUxfUE9MTF9USU1FT1VUX01TKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgICAgICJbZGMtcnVudGltZV0geC1pbXBvcnQ6IGdsb2JhbCIsCiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWUpLAogICAgICAgICAgICAibmV2ZXIgYXBwZWFyZWQgb24gd2luZG93IGFmdGVyICIgKyBHTE9CQUxfUE9MTF9USU1FT1VUX01TICsgIm1zIgogICAgICAgICAgKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dCh0aWNrLCBHTE9CQUxfUE9MTF9JTlRFUlZBTF9NUyk7CiAgICAgIH07CiAgICAgIHNldFRpbWVvdXQodGljaywgR0xPQkFMX1BPTExfSU5URVJWQUxfTVMpOwogICAgfQogICAgZnVuY3Rpb24gcmVzb2x2ZUdsb2JhbCh1cmwsIG5hbWUpIHsKICAgICAgY29uc3QgaXNDRSA9IGlzQ3VzdG9tRWxlbWVudE5hbWUobmFtZSk7CiAgICAgIGlmICghdXJsKSB7CiAgICAgICAgaWYgKGlzQ0UpIHsKICAgICAgICAgIGlmIChjdXN0b21FbGVtZW50cy5nZXQobmFtZSkpIHJldHVybiBuYW1lOwogICAgICAgICAgd2FpdEZvckdsb2JhbChuYW1lKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBnMiA9IHJlc29sdmVEb3R0ZWRQYXRoKHdpbmRvdywgbmFtZSk7CiAgICAgICAgaWYgKGlzUmVuZGVyYWJsZVR5cGUoZzIpKSByZXR1cm4gZzI7CiAgICAgICAgd2FpdEZvckdsb2JhbChuYW1lKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBlbnRyeSA9IGNhY2hlLmdldCh1cmwpOwogICAgICBpZiAoIWVudHJ5KSByZXR1cm4gbnVsbDsKICAgICAgaWYgKGlzQ0UgJiYgY3VzdG9tRWxlbWVudHMuZ2V0KG5hbWUpKSByZXR1cm4gbmFtZTsKICAgICAgY29uc3QgZyA9IGVudHJ5Lmdsb2JhbHNbbmFtZV0gPz8gcmVzb2x2ZURvdHRlZFBhdGgod2luZG93LCBuYW1lKTsKICAgICAgaWYgKGlzUmVuZGVyYWJsZVR5cGUoZykpIHJldHVybiBnOwogICAgICBpZiAobmFtZS5pbmNsdWRlcygiLiIpKSByZXR1cm4gbnVsbDsKICAgICAgY29uc3Qga2V5ID0gdXJsICsgIlwwZ2xvYmFsXDAiICsgbmFtZTsKICAgICAgaWYgKCFyZXBvcnRlZE1pc3NpbmcuaGFzKGtleSkpIHsKICAgICAgICByZXBvcnRlZE1pc3Npbmcuc2V0KGtleSwgbnVsbCk7CiAgICAgICAgaWYgKGlzQ0UgJiYgIWN1c3RvbUVsZW1lbnRzLmdldChuYW1lKSkgewogICAgICAgICAgY29uc29sZS53YXJuKAogICAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHgtaW1wb3J0OiIsCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgImxvYWRlZCBidXQgbm8gY3VzdG9tIGVsZW1lbnQiLAogICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSwKICAgICAgICAgICAgImlzIHJlZ2lzdGVyZWQgYW5kIHdpbmRvdy4iICsgbmFtZSArICIgaXMgbm90IGEgZnVuY3Rpb24gXHUyMDE0IHJlbmRlcmluZyA8IiArIG5hbWUgKyAiPiBhcyBhbiB1bmtub3duIGVsZW1lbnQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRFcnJvcih1cmwsIG5hbWUpIHsKICAgICAgY29uc3QgZW50cnkgPSBjYWNoZS5nZXQodXJsKTsKICAgICAgaWYgKGVudHJ5Py5lcnJvcikgcmV0dXJuIGVudHJ5LmVycm9yOwogICAgICByZXR1cm4gcmVwb3J0ZWRNaXNzaW5nLmdldCh1cmwgKyAiXDAiICsgbmFtZSkgfHwgbnVsbDsKICAgIH0KICAgIHJldHVybiB7IGxvYWQsIHJlc29sdmU6IHJlc29sdmUyLCByZXNvbHZlR2xvYmFsLCBnZXRFcnJvciB9OwogIH0KICBmdW5jdGlvbiBpc0VsZW1lbnRDbGFzcyhnKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gdHlwZW9mIGcgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIEhUTUxFbGVtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBnLnByb3RvdHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIHNyYy9hdG9taWNzLnRzCiAgdmFyIEFUT01JQ19DU1MgPSAoCiAgICAvLyBsYXlvdXQKICAgICIuZnh7ZGlzcGxheTpmbGV4fS5jb2x7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0uZ3JpZHtkaXNwbGF5OmdyaWR9LmFje2FsaWduLWl0ZW1zOmNlbnRlcn0uamN7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uamJ7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmYxe2ZsZXg6MX0ubm9zaHJpbmt7ZmxleC1zaHJpbms6MH0ud3JhcHtmbGV4LXdyYXA6d3JhcH0uZnc1e2ZvbnQtd2VpZ2h0OjUwMH0uZnc2e2ZvbnQtd2VpZ2h0OjYwMH0uZnc3e2ZvbnQtd2VpZ2h0OjcwMH0uZnc4e2ZvbnQtd2VpZ2h0OjgwMH0uZnMxMXtmb250LXNpemU6MTFweH0uZnMxMntmb250LXNpemU6MTJweH0uZnMxM3tmb250LXNpemU6MTNweH0uZnMxNHtmb250LXNpemU6MTRweH0uZnMxNXtmb250LXNpemU6MTVweH0uZnMxNntmb250LXNpemU6MTZweH0uZnMyMHtmb250LXNpemU6MjBweH0uZnMyMntmb250LXNpemU6MjJweH0udXBwZXJ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS50Y3t0ZXh0LWFsaWduOmNlbnRlcn0ubm93cmFwe3doaXRlLXNwYWNlOm5vd3JhcH0uZ2FwOHtnYXA6OHB4fS5nYXAxMHtnYXA6MTBweH0uZ2FwMTJ7Z2FwOjEycHh9LmdhcDE2e2dhcDoxNnB4fS5nYXAyNHtnYXA6MjRweH0ubTB7bWFyZ2luOjB9Lm10OHttYXJnaW4tdG9wOjhweH0ubXQxMnttYXJnaW4tdG9wOjEycHh9Lm10MTZ7bWFyZ2luLXRvcDoxNnB4fS5tYjh7bWFyZ2luLWJvdHRvbTo4cHh9Lm1iMTJ7bWFyZ2luLWJvdHRvbToxMnB4fS5tYjE2e21hcmdpbi1ib3R0b206MTZweH0ucG9zcmVse3Bvc2l0aW9uOnJlbGF0aXZlfS5wb3NhYnN7cG9zaXRpb246YWJzb2x1dGV9LnJvdW5ke2JvcmRlci1yYWRpdXM6NTAlfS5vaGlkZXtvdmVyZmxvdzpoaWRkZW59LmJib3h7Ym94LXNpemluZzpib3JkZXItYm94fS5wb2ludGVye2N1cnNvcjpwb2ludGVyfS53MTAwe3dpZHRoOjEwMCV9LmIwe2JvcmRlcjpub25lfSIKICApOwoKICAvLyBzcmMvaGVsbWV0LnRzCiAgdmFyIERFU0lHTl9ET0NfTU9ERV9SRSA9IC88bWV0YVxiW14+XSpcYm5hbWVccyo9XHMqWyInXWRlc2lnbl9kb2NfbW9kZVsiJ11bXj5dKlxiKD86Y29udGVudHx2YWx1ZSlccyo9XHMqWyInXShcdyspWyInXS9pOwogIHZhciBDQU5WQVNfQkdfTElHSFQgPSAiI2YwZWVlNiI7CiAgdmFyIENBTlZBU19CR19EQVJLID0gIiMyZTJjMjYiOwogIGZ1bmN0aW9uIGNyZWF0ZUhlbG1ldE1hbmFnZXIoZG9jLCBpc1N0cmVhbWluZykgewogICAgY29uc3QgbW91bnRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICBjb25zdCBsaXZlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGxldCBkZXNpZ25Eb2NNb2RlID0gbnVsbDsKICAgIGxldCBjYW52YXNTdHlsZUVsID0gbnVsbDsKICAgIGxldCBhcHBUaGVtZSA9ICJsaWdodCI7CiAgICB0cnkgewogICAgICBjb25zdCBkcyA9IGRvYy5kb2N1bWVudEVsZW1lbnQuZGF0YXNldC50aGVtZTsKICAgICAgYXBwVGhlbWUgPSBkcyA9PT0gImRhcmsiIHx8IGRzID09PSAibGlnaHQiID8gZHMgOiBuZXcgVVJMU2VhcmNoUGFyYW1zKGRvYy5kZWZhdWx0Vmlldz8ubG9jYXRpb24uc2VhcmNoID8/ICIiKS5nZXQoCiAgICAgICAgInRoZW1lIgogICAgICApID09PSAiZGFyayIgPyAiZGFyayIgOiAibGlnaHQiOwogICAgfSBjYXRjaCB7CiAgICB9CiAgICBmdW5jdGlvbiBhcHBseUNhbnZhc0JnKCkgewogICAgICBpZiAoIWNhbnZhc1N0eWxlRWwpIHJldHVybjsKICAgICAgY29uc3QgYmcgPSBhcHBUaGVtZSA9PT0gImRhcmsiID8gQ0FOVkFTX0JHX0RBUksgOiBDQU5WQVNfQkdfTElHSFQ7CiAgICAgIGNhbnZhc1N0eWxlRWwudGV4dENvbnRlbnQgPSBgaHRtbCxib2R5e2JhY2tncm91bmQ6JHtiZ319I2RjLXJvb3Q+LnNjLWhvc3R7cG9zaXRpb246cmVsYXRpdmV9YDsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3REZXNpZ25Nb2RlKG1vZGUpIHsKICAgICAgaWYgKHdpbmRvdy5wYXJlbnQgPT09IHdpbmRvdykgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAiX19kY19kZXNpZ25fbW9kZSIsIG1vZGUgfSwgIioiKTsKICAgICAgfSBjYXRjaCB7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNldERlc2lnbkRvY01vZGUobW9kZSkgewogICAgICBpZiAobW9kZSA9PT0gZGVzaWduRG9jTW9kZSkgcmV0dXJuOwogICAgICBkZXNpZ25Eb2NNb2RlID0gbW9kZTsKICAgICAgcG9zdERlc2lnbk1vZGUobW9kZSk7CiAgICAgIGlmIChtb2RlID09PSAiY2FudmFzIikgewogICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLWRjLWNhbnZhcyIsICIiKTsKICAgICAgICBjYW52YXNTdHlsZUVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgY2FudmFzU3R5bGVFbC5zZXRBdHRyaWJ1dGUoImRhdGEtZGMtY2FudmFzIiwgIiIpOwogICAgICAgIGFwcGx5Q2FudmFzQmcoKTsKICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChjYW52YXNTdHlsZUVsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1kYy1jYW52YXMiKTsKICAgICAgICBjYW52YXNTdHlsZUVsPy5yZW1vdmUoKTsKICAgICAgICBjYW52YXNTdHlsZUVsID0gbnVsbDsKICAgICAgfQogICAgfQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCAoZSkgPT4gewogICAgICBjb25zdCB0eXBlID0gZS5kYXRhICYmIGUuZGF0YS50eXBlOwogICAgICBpZiAodHlwZSA9PT0gIl9fZGNfdGhlbWUiKSB7CiAgICAgICAgY29uc3QgdCA9IGUuZGF0YS50aGVtZTsKICAgICAgICBpZiAodCA9PT0gImxpZ2h0IiB8fCB0ID09PSAiZGFyayIpIHsKICAgICAgICAgIGFwcFRoZW1lID0gdDsKICAgICAgICAgIGFwcGx5Q2FudmFzQmcoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghZGVzaWduRG9jTW9kZSB8fCB0eXBlICE9PSAiX19kY19wcm9iZSIpIHJldHVybjsKICAgICAgcG9zdERlc2lnbk1vZGUoZGVzaWduRG9jTW9kZSk7CiAgICB9KTsKICAgIGZ1bmN0aW9uIGNvbXBpbGUobm9kZSkgewogICAgICBjb25zdCByYXcgPSBbLi4ubm9kZS5jaGlsZHJlbl07CiAgICAgIGNvbnN0IGhlbG1ldENsb3NlZCA9IG5vZGUubmV4dFNpYmxpbmcgIT0gbnVsbCB8fCBub2RlLnBhcmVudE5vZGU/Lm5leHRTaWJsaW5nICE9IG51bGw7CiAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZSgiZGF0YS1kYy1hdG9taWNzIikgJiYgIW1vdW50ZWQuaGFzKCJfX2RjLWF0b21pY3MiKSkgewogICAgICAgIG1vdW50ZWQuYWRkKCJfX2RjLWF0b21pY3MiKTsKICAgICAgICBjb25zdCBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIGVsLmlkID0gIl9fZGMtYXRvbWljcyI7CiAgICAgICAgZWwudGV4dENvbnRlbnQgPSBBVE9NSUNfQ1NTOwogICAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKGVsKTsKICAgICAgfQogICAgICByZXR1cm4gKF92YWxzLCBjdHgpID0+IHsKICAgICAgICBjb25zdCBuYW1lID0gY3R4ICYmIGN0eC5fX25hbWUgfHwgIiI7CiAgICAgICAgY29uc3Qgc3RyZWFtaW5nID0gISEobmFtZSAmJiBpc1N0cmVhbWluZyhuYW1lKSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGNoaWxkID0gcmF3W2ldOwogICAgICAgICAgY29uc3QgdGFnID0gY2hpbGQudGFnTmFtZTsKICAgICAgICAgIGNvbnN0IG1heUJlUGFydGlhbCA9IHN0cmVhbWluZyAmJiAhaGVsbWV0Q2xvc2VkICYmIGkgPT09IHJhdy5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKHRhZyA9PT0gIlNDUklQVCIpIHsKICAgICAgICAgICAgaWYgKG1heUJlUGFydGlhbCkgY29udGludWU7CiAgICAgICAgICAgIGNvbnN0IGtleSA9ICJTQ1JJUFR8IiArIChjaGlsZC5nZXRBdHRyaWJ1dGUoInNyYyIpIHx8IGNoaWxkLnRleHRDb250ZW50IHx8ICIiKTsKICAgICAgICAgICAgaWYgKG1vdW50ZWQuaGFzKGtleSkpIGNvbnRpbnVlOwogICAgICAgICAgICBtb3VudGVkLmFkZChrZXkpOwogICAgICAgICAgICBjb25zdCBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgICAgICAgZm9yIChjb25zdCB7IG5hbWU6IGFuLCB2YWx1ZSB9IG9mIFsuLi5jaGlsZC5hdHRyaWJ1dGVzXSkKICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoYW4sIHZhbHVlKTsKICAgICAgICAgICAgaWYgKGNoaWxkLnRleHRDb250ZW50KSBlbC50ZXh0Q29udGVudCA9IGNoaWxkLnRleHRDb250ZW50OwogICAgICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gIkxJTksiIHx8IHRhZyA9PT0gIk1FVEEiKSB7CiAgICAgICAgICAgIGlmIChtYXlCZVBhcnRpYWwpIGNvbnRpbnVlOwogICAgICAgICAgICBjb25zdCBrZXkgPSB0YWcgKyAifCIgKyAoY2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgfHwgY2hpbGQuZ2V0QXR0cmlidXRlKCJzcmMiKSB8fCBjaGlsZC5vdXRlckhUTUwpOwogICAgICAgICAgICBpZiAobW91bnRlZC5oYXMoa2V5KSkgY29udGludWU7CiAgICAgICAgICAgIG1vdW50ZWQuYWRkKGtleSk7CiAgICAgICAgICAgIGlmICh0YWcgPT09ICJMSU5LIikgewogICAgICAgICAgICAgIGNvbnN0IHJlbCA9IChjaGlsZC5nZXRBdHRyaWJ1dGUoInJlbCIpIHx8ICIiKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICBjb25zdCBocmVmID0gKGNoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpIHx8ICIiKS50cmltKCk7CiAgICAgICAgICAgICAgY29uc3QgcmVzID0gd2luZG93Ll9fcmVzb3VyY2VzOwogICAgICAgICAgICAgIGNvbnN0IHByZSA9IHJlcyAmJiByZWwuaW5jbHVkZXMoInN0eWxlc2hlZXQiKSAmJiAhcmVsLmluY2x1ZGVzKCJhbHRlcm5hdGUiKSA/IHJlc1tocmVmXSA6IHZvaWQgMDsKICAgICAgICAgICAgICBjb25zdCBibG9iID0gdHlwZW9mIHByZSA9PT0gInN0cmluZyIgJiYgcHJlID8gYnVuZGxlZEJsb2IocHJlKSA6IG51bGw7CiAgICAgICAgICAgICAgaWYgKGJsb2IpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKSB7CiAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgibWVkaWEiLCAibm90IGFsbCIpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXRBdHRyaWJ1dGUoIm1lZGlhIikpIHsKICAgICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCJtZWRpYSIsIGNoaWxkLmdldEF0dHJpYnV0ZSgibWVkaWEiKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKQogICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgY2hpbGQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKTsKICAgICAgICAgICAgICAgIHZvaWQgYmxvYi50ZXh0KCkudGhlbigoY3NzKSA9PiB7CiAgICAgICAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gY3NzOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoY2hpbGQuY2xvbmVOb2RlKHRydWUpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGtleSA9IG5hbWUgKyAifCIgKyBpOwogICAgICAgICAgICBsZXQgZWwgPSBsaXZlLmdldChrZXkpOwogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnRhZ05hbWUgIT09IHRhZykgewogICAgICAgICAgICAgIGlmIChlbCkgZWwucmVtb3ZlKCk7CiAgICAgICAgICAgICAgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCh0YWcudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICAgICAgbGl2ZS5zZXQoa2V5LCBlbCk7CiAgICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoY29uc3QgeyBuYW1lOiBhbiwgdmFsdWUgfSBvZiBbLi4uY2hpbGQuYXR0cmlidXRlc10pIHsKICAgICAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKGFuKSAhPT0gdmFsdWUpIGVsLnNldEF0dHJpYnV0ZShhbiwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbC50ZXh0Q29udGVudCAhPT0gY2hpbGQudGV4dENvbnRlbnQpCiAgICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSBjaGlsZC50ZXh0Q29udGVudDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4geyBjb21waWxlLCBzZXREZXNpZ25Eb2NNb2RlIH07CiAgfQoKICAvLyBzcmMvcHNldWRvLnRzCiAgZnVuY3Rpb24gc2NhblVucXVvdGVkVXJsKGNzcywgaSkgewogICAgaWYgKGNzc1tpXSAhPT0gInUiICYmIGNzc1tpXSAhPT0gIlUiIHx8IGNzcy5zbGljZShpLCBpICsgNCkudG9Mb3dlckNhc2UoKSAhPT0gInVybCgiIHx8IC9bYS16MC05Xy1dL2kudGVzdChjc3NbaSAtIDFdID8/ICIiKSkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBsZXQgaiA9IGkgKyA0OwogICAgd2hpbGUgKGogPCBjc3MubGVuZ3RoICYmIC9ccy8udGVzdChjc3Nbal0pKSBqKys7CiAgICBpZiAoY3NzW2pdID09PSAnIicgfHwgY3NzW2pdID09PSAiJyIpIHJldHVybiAtMTsKICAgIHdoaWxlIChqIDwgY3NzLmxlbmd0aCAmJiBjc3Nbal0gIT09ICIpIikgewogICAgICBpZiAoY3NzW2pdID09PSAiXFwiKSBqKys7CiAgICAgIGorKzsKICAgIH0KICAgIHJldHVybiBqIDwgY3NzLmxlbmd0aCA/IGogKyAxIDogY3NzLmxlbmd0aDsKICB9CiAgZnVuY3Rpb24gc3RyaXBDb21tZW50cyhjc3MpIHsKICAgIGxldCBvdXQgPSAiIjsKICAgIGxldCBxdW90ZSA9ICIiOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjc3MubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgYyA9IGNzc1tpXTsKICAgICAgaWYgKHF1b3RlKSB7CiAgICAgICAgaWYgKGMgPT09ICJcXCIpIHsKICAgICAgICAgIG91dCArPSBjICsgKGNzc1tpICsgMV0gPz8gIiIpOwogICAgICAgICAgaSsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChjID09PSBxdW90ZSkgcXVvdGUgPSAiIjsKICAgICAgICBvdXQgKz0gYzsKICAgICAgfSBlbHNlIGlmIChjID09PSAiJyIgfHwgYyA9PT0gJyInKSB7CiAgICAgICAgcXVvdGUgPSBjOwogICAgICAgIG91dCArPSBjOwogICAgICB9IGVsc2UgaWYgKGMgPT09ICIvIiAmJiBjc3NbaSArIDFdID09PSAiKiIpIHsKICAgICAgICBjb25zdCBlbmQgPSBjc3MuaW5kZXhPZigiKi8iLCBpICsgMik7CiAgICAgICAgaSA9IGVuZCA9PT0gLTEgPyBjc3MubGVuZ3RoIDogZW5kICsgMTsKICAgICAgICBvdXQgKz0gIiAiOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGVuZCA9IHNjYW5VbnF1b3RlZFVybChjc3MsIGkpOwogICAgICAgIGlmIChlbmQgPT09IC0xKSBvdXQgKz0gYzsKICAgICAgICBlbHNlIHsKICAgICAgICAgIG91dCArPSBjc3Muc2xpY2UoaSwgZW5kKTsKICAgICAgICAgIGkgPSBlbmQgLSAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dDsKICB9CiAgZnVuY3Rpb24gaW1wb3J0YW50aWZ5KGNzcykgewogICAgY3NzID0gc3RyaXBDb21tZW50cyhjc3MpOwogICAgY29uc3QgZGVjbHMgPSBbXTsKICAgIGxldCBzdGFydCA9IDA7CiAgICBsZXQgZGVwdGggPSAwOwogICAgbGV0IHF1b3RlID0gIiI7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNzcy5sZW5ndGg7IGkrKykgewogICAgICBjb25zdCBjID0gY3NzW2ldOwogICAgICBpZiAocXVvdGUpIHsKICAgICAgICBpZiAoYyA9PT0gIlxcIikgaSsrOwogICAgICAgIGVsc2UgaWYgKGMgPT09IHF1b3RlKSBxdW90ZSA9ICIiOwogICAgICB9IGVsc2UgaWYgKGMgPT09ICInIiB8fCBjID09PSAnIicpIHF1b3RlID0gYzsKICAgICAgZWxzZSBpZiAoYyA9PT0gIigiKSBkZXB0aCsrOwogICAgICBlbHNlIGlmIChjID09PSAiKSIpIGRlcHRoID0gTWF0aC5tYXgoMCwgZGVwdGggLSAxKTsKICAgICAgZWxzZSBpZiAoYyA9PT0gIjsiICYmIGRlcHRoID09PSAwKSB7CiAgICAgICAgZGVjbHMucHVzaChjc3Muc2xpY2Uoc3RhcnQsIGkpKTsKICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGVuZCA9IHNjYW5VbnF1b3RlZFVybChjc3MsIGkpOwogICAgICAgIGlmIChlbmQgIT09IC0xKSBpID0gZW5kIC0gMTsKICAgICAgfQogICAgfQogICAgZGVjbHMucHVzaChjc3Muc2xpY2Uoc3RhcnQpKTsKICAgIHJldHVybiBkZWNscy5tYXAoKGQpID0+IGQudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikubWFwKChkKSA9PiAvIVxzKmltcG9ydGFudCQvaS50ZXN0KGQpID8gZCA6IGQgKyAiICFpbXBvcnRhbnQiKS5qb2luKCI7Iik7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZVBzZXVkb1NoZWV0KGRvYykgewogICAgbGV0IGVsID0gbnVsbDsKICAgIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGxldCBuID0gMDsKICAgIHJldHVybiAocHNldWRvLCBjc3MpID0+IHsKICAgICAgY29uc3QgayA9IHBzZXVkbyArICJ8IiArIGNzczsKICAgICAgY29uc3QgaGl0ID0gY2FjaGUuZ2V0KGspOwogICAgICBpZiAoaGl0KSByZXR1cm4gaGl0OwogICAgICBpZiAoIWVsKSB7CiAgICAgICAgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgY29uc3QgY2xzID0gInNjcCIgKyAobisrKS50b1N0cmluZygzNik7CiAgICAgIGNvbnN0IGlzUHNldWRvRWxlbWVudCA9IHBzZXVkbyA9PT0gImJlZm9yZSIgfHwgcHNldWRvID09PSAiYWZ0ZXIiOwogICAgICBjb25zdCBzZWwgPSBpc1BzZXVkb0VsZW1lbnQgPyAiLiIgKyBjbHMgKyAiOjoiICsgcHNldWRvIDogIi4iICsgY2xzICsgIjoiICsgcHNldWRvOwogICAgICBlbC5zaGVldC5pbnNlcnRSdWxlKAogICAgICAgIHNlbCArICJ7IiArIChpc1BzZXVkb0VsZW1lbnQgPyBjc3MgOiBpbXBvcnRhbnRpZnkoY3NzKSkgKyAifSIsCiAgICAgICAgZWwuc2hlZXQuY3NzUnVsZXMubGVuZ3RoCiAgICAgICk7CiAgICAgIGNhY2hlLnNldChrLCBjbHMpOwogICAgICByZXR1cm4gY2xzOwogICAgfTsKICB9CgogIC8vIHNyYy9yZWdpc3RyeS50cwogIGZ1bmN0aW9uIGNyZWF0ZVJlZ2lzdHJ5KCkgewogICAgY29uc3QgZW50cmllcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZnVuY3Rpb24gZ2V0KG5hbWUpIHsKICAgICAgcmV0dXJuIGVudHJpZXNbbmFtZV0gfHwgKGVudHJpZXNbbmFtZV0gPSB7CiAgICAgICAgaHRtbDogIiIsCiAgICAgICAgdHBsOiBudWxsLAogICAgICAgIExvZ2ljOiBudWxsLAogICAgICAgIGpzU3RyZWFtaW5nOiBmYWxzZSwKICAgICAgICBodG1sU3RyZWFtaW5nOiBmYWxzZSwKICAgICAgICB2ZXI6IDAsCiAgICAgICAgc3ViczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwKICAgICAgICBmZXRjaGVkOiBmYWxzZQogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1bXAobmFtZSkgewogICAgICBjb25zdCByID0gZ2V0KG5hbWUpOwogICAgICByLnZlcisrOwogICAgICBmb3IgKGNvbnN0IGZuIG9mIHIuc3VicykgZm4oKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGVudHJpZXMsCiAgICAgIGdldCwKICAgICAgYnVtcCwKICAgICAgYnVtcEFsbCgpIHsKICAgICAgICBmb3IgKGNvbnN0IG4gaW4gZW50cmllcykgYnVtcChuKTsKICAgICAgfQogICAgfTsKICB9CgogIC8vIHNyYy9ydW50aW1lLnRzCiAgdmFyIENPTVBPTkVOVF9ESVIgPSAiLiI7CiAgZnVuY3Rpb24gY3JlYXRlUnVudGltZShkb2MgPSBkb2N1bWVudCkgewogICAgY29uc3QgcmVnaXN0cnkgPSBjcmVhdGVSZWdpc3RyeSgpOwogICAgY29uc3QgcHNldWRvQ2xhc3MgPSBjcmVhdGVQc2V1ZG9TaGVldChkb2MpOwogICAgY29uc3QgaGVsbWV0ID0gY3JlYXRlSGVsbWV0TWFuYWdlcigKICAgICAgZG9jLAogICAgICAobmFtZSkgPT4gcmVnaXN0cnkuZ2V0KG5hbWUpLmh0bWxTdHJlYW1pbmcKICAgICk7CiAgICBjb25zdCBleHRlcm5hbCA9IGNyZWF0ZUV4dGVybmFsTW9kdWxlcygoKSA9PiByZWdpc3RyeS5idW1wQWxsKCkpOwogICAgY29uc3QgZmFjdG9yeSA9IGNyZWF0ZUNvbXBvbmVudEZhY3RvcnkocmVnaXN0cnksIGVuc3VyZUZldGNoZWQpOwogICAgY29uc3QgaG9zdCA9IHsKICAgICAgY29tcG9uZW50OiAobmFtZSkgPT4gZmFjdG9yeS5nZXREQyhuYW1lKSwKICAgICAgcGxhY2Vob2xkZXI6IChwcm9wcykgPT4gaChQbGFjZWhvbGRlciwgcHJvcHMpLAogICAgICBoZWxtZXQ6IChub2RlKSA9PiBoZWxtZXQuY29tcGlsZShub2RlKSwKICAgICAgbG9hZEV4dGVybmFsOiAoa2luZCwgdXJsLCBhZnRlcikgPT4gZXh0ZXJuYWwubG9hZChraW5kLCB1cmwsIGFmdGVyKSwKICAgICAgcmVzb2x2ZUV4dGVybmFsOiAodXJsLCBuYW1lKSA9PiBleHRlcm5hbC5yZXNvbHZlKHVybCwgbmFtZSksCiAgICAgIHJlc29sdmVFeHRlcm5hbEdsb2JhbDogKHVybCwgbmFtZSkgPT4gZXh0ZXJuYWwucmVzb2x2ZUdsb2JhbCh1cmwsIG5hbWUpLAogICAgICByZXNvbHZlRXh0ZXJuYWxFcnJvcjogKHVybCwgbmFtZSkgPT4gZXh0ZXJuYWwuZ2V0RXJyb3IodXJsLCBuYW1lKSwKICAgICAgcHNldWRvQ2xhc3MKICAgIH07CiAgICBmdW5jdGlvbiBlbnN1cmVGZXRjaGVkKG5hbWUpIHsKICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldChuYW1lKTsKICAgICAgaWYgKHIuZmV0Y2hlZCkgcmV0dXJuOwogICAgICByLmZldGNoZWQgPSB0cnVlOwogICAgICBjb25zdCB1cmwgPSBDT01QT05FTlRfRElSICsgIi8iICsgZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgIi5kYy5odG1sIjsKICAgICAgY29uc3QgcmVzID0gd2luZG93Ll9fcmVzb3VyY2VzOwogICAgICBjb25zdCBwcmUgPSByZXMgPyByZXNbdXJsXSA6IHZvaWQgMDsKICAgICAgY29uc3QgdGFyZ2V0ID0gdHlwZW9mIHByZSA9PT0gInN0cmluZyIgJiYgcHJlID8gcHJlIDogdXJsOwogICAgICBjb25zdCBibG9iID0gYnVuZGxlZEJsb2IodGFyZ2V0KTsKICAgICAgKGJsb2IgPyBibG9iLnRleHQoKSA6IGZldGNoKHRhcmdldCkudGhlbigocmVzMikgPT4gewogICAgICAgIGlmICghcmVzMi5vaykgewogICAgICAgICAgY29uc29sZS5lcnJvcigKICAgICAgICAgICAgJ1tkYy1ydW50aW1lXSBzaWJsaW5nIGZldGNoIGZvciAiJyArIG5hbWUgKyAnIiBmYWlsZWQ6JywKICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAicmV0dXJuZWQiLAogICAgICAgICAgICByZXMyLnN0YXR1cywKICAgICAgICAgICAgIlx1MjAxNCB0aGUgcmVmZXJlbmNlIHJlbmRlcnMgYXMgYW4gZW1wdHkgcGxhY2Vob2xkZXIuIgogICAgICAgICAgKTsKICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczIudGV4dCgpOwogICAgICB9KSkudGhlbigodCkgPT4gewogICAgICAgIGlmICghdCkgcmV0dXJuOwogICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRGNUZXh0KHQpOwogICAgICAgIGlmICghcGFyc2VkKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgICAnW2RjLXJ1bnRpbWVdIHNpYmxpbmcgZmV0Y2ggZm9yICInICsgbmFtZSArICciOicsCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgImhhcyBubyA8eC1kYz4gYmxvY2sgXHUyMDE0IG5vdCBhIERlc2lnbiBDb21wb25lbnQuIgogICAgICAgICAgKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcnNlZC5wcm9wcykgci5wcm9wc01ldGEgPSBwYXJzZWQucHJvcHM7CiAgICAgICAgaWYgKHBhcnNlZC5wcmV2aWV3KSByLnByZXZpZXcgPSBwYXJzZWQucHJldmlldzsKICAgICAgICBpZiAocGFyc2VkLnRlbXBsYXRlICYmICFyLmh0bWwpIHVwZGF0ZUh0bWwobmFtZSwgcGFyc2VkLnRlbXBsYXRlKTsKICAgICAgICBpZiAocGFyc2VkLmpzICYmICFyLkxvZ2ljKSB1cGRhdGVKcyhuYW1lLCBwYXJzZWQuanMpOwogICAgICB9KS5jYXRjaCgKICAgICAgICAoZSkgPT4gY29uc29sZS5lcnJvcigKICAgICAgICAgICdbZGMtcnVudGltZV0gc2libGluZyBmZXRjaCBmb3IgIicgKyBuYW1lICsgJyIgdGhyZXc6JywKICAgICAgICAgIHVybCwKICAgICAgICAgIGUKICAgICAgICApCiAgICAgICk7CiAgICB9CiAgICBsZXQgcm9vdE5hbWUgPSBudWxsOwogICAgZnVuY3Rpb24gdXBkYXRlSHRtbChuYW1lLCBodG1sKSB7CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIHIuaHRtbCA9IGh0bWw7CiAgICAgIGlmIChuYW1lID09PSByb290TmFtZSkgewogICAgICAgIGNvbnN0IG1vZGUgPSBERVNJR05fRE9DX01PREVfUkUuZXhlYyhodG1sKT8uWzFdID8/IG51bGw7CiAgICAgICAgaWYgKG1vZGUgfHwgIXIuaHRtbFN0cmVhbWluZykgaGVsbWV0LnNldERlc2lnbkRvY01vZGUobW9kZSk7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICByLnRwbCA9IGNvbXBpbGVUZW1wbGF0ZShodG1sLCBob3N0KTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIltkYy1ydW50aW1lXSB0ZW1wbGF0ZSBjb21waWxlIEZBSUxFRCBmb3IiLCBuYW1lLCBlKTsKICAgICAgfQogICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlSnMobmFtZSwgc3JjKSB7CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIGNvbnN0IHNlcSA9IHIuanNTZXEgPSAoci5qc1NlcSB8fCAwKSArIDE7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgQ2xzID0gZXZhbERjTG9naWMoc3JjKTsKICAgICAgICBpZiAoci5qc1NlcSAhPT0gc2VxKSByZXR1cm47CiAgICAgICAgaWYgKHR5cGVvZiBDbHMgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHIubG9naWNFcnJvciA9IG5hbWUgKyAiLmRjLmh0bWw6IDxzY3JpcHQgZGF0YS1kYy1zY3JpcHQ+IG11c3QgZGVmaW5lIGBjbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBEQ0xvZ2ljYCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHIubG9naWNFcnJvciA9IG51bGw7CiAgICAgICAgICByLkxvZ2ljID0gQ2xzOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChyLmpzU2VxICE9PSBzZXEpIHJldHVybjsKICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSBsb2dpYyBjbGFzcyBldmFsIEZBSUxFRCBmb3IiLAogICAgICAgICAgbmFtZSwKICAgICAgICAgICJcdTIwMTQgdGhlIHRlbXBsYXRlIHJlbmRlcnMgd2l0aCBwcm9wcyBvbmx5LiIsCiAgICAgICAgICBlCiAgICAgICAgKTsKICAgICAgICByLmxvZ2ljRXJyb3IgPSBuYW1lICsgIjogIiArIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTsKICAgICAgfQogICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gc2V0U3RyZWFtaW5nKG5hbWUsIGtpbmQsIG9uKSB7CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIGlmIChraW5kID09PSAiaHRtbCIpIHIuaHRtbFN0cmVhbWluZyA9ICEhb247CiAgICAgIGVsc2Ugci5qc1N0cmVhbWluZyA9ICEhb247CiAgICAgIGxldCBhbnkgPSBmYWxzZTsKICAgICAgZm9yIChjb25zdCBuIGluIHJlZ2lzdHJ5LmVudHJpZXMpIHsKICAgICAgICBjb25zdCBlID0gcmVnaXN0cnkuZW50cmllc1tuXTsKICAgICAgICBpZiAoZSAmJiAoZS5odG1sU3RyZWFtaW5nIHx8IGUuanNTdHJlYW1pbmcpKSB7CiAgICAgICAgICBhbnkgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgic2MtZGMtc3RyZWFtaW5nIiwgYW55KTsKICAgICAgcmVnaXN0cnkuYnVtcChuYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRjVXBkYXRlKG5hbWUsIGtpbmQsIGNvbnRlbnQsIHN0cmVhbWluZykgewogICAgICBpZiAoc3RyZWFtaW5nKSByZWdpc3RyeS5nZXQobmFtZSkuZmV0Y2hlZCA9IHRydWU7CiAgICAgIGlmIChraW5kID09PSAiaHRtbCIpIHsKICAgICAgICBzZXRTdHJlYW1pbmcobmFtZSwgImh0bWwiLCAhIXN0cmVhbWluZyk7CiAgICAgICAgdXBkYXRlSHRtbChuYW1lLCBjb250ZW50KTsKICAgICAgfSBlbHNlIGlmIChraW5kID09PSAianMiKSB7CiAgICAgICAgc2V0U3RyZWFtaW5nKG5hbWUsICJqcyIsICEhc3RyZWFtaW5nKTsKICAgICAgICBpZiAoIXN0cmVhbWluZykgdXBkYXRlSnMobmFtZSwgY29udGVudCk7CiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gInByb3BzIikgewogICAgICAgIGNvbnN0IHsgcHJvcHMsIHByZXZpZXcgfSA9IHBhcnNlRGF0YVByb3BzKGNvbnRlbnQpOwogICAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgICAgci5wcm9wc01ldGEgPSBwcm9wcyA/PyB2b2lkIDA7CiAgICAgICAgci5wcmV2aWV3ID0gcHJldmlldzsKICAgICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzZXRQcm9wcyhuYW1lLCBvdmVycmlkZXMpIHsKICAgICAgcmVnaXN0cnkuZ2V0KG5hbWUpLnByb3BPdmVycmlkZXMgPSBvdmVycmlkZXMgJiYgdHlwZW9mIG92ZXJyaWRlcyA9PT0gIm9iamVjdCIgPyB7IC4uLm92ZXJyaWRlcyB9IDogbnVsbDsKICAgICAgcmVnaXN0cnkuYnVtcChuYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkb3B0UGFyc2VkKG5hbWUsIHBhcnNlZCkgewogICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuOwogICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KG5hbWUpOwogICAgICBpZiAocGFyc2VkLnByb3BzKSByLnByb3BzTWV0YSA9IHBhcnNlZC5wcm9wczsKICAgICAgaWYgKHBhcnNlZC5wcmV2aWV3KSByLnByZXZpZXcgPSBwYXJzZWQucHJldmlldzsKICAgICAgaWYgKHBhcnNlZC50ZW1wbGF0ZSkgdXBkYXRlSHRtbChuYW1lLCBwYXJzZWQudGVtcGxhdGUpOwogICAgICBpZiAocGFyc2VkLmpzKSB1cGRhdGVKcyhuYW1lLCBwYXJzZWQuanMpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgcmVnaXN0cnksCiAgICAgIGdldERDOiBmYWN0b3J5LmdldERDLAogICAgICB1cGRhdGVIdG1sLAogICAgICB1cGRhdGVKcywKICAgICAgZGNVcGRhdGUsCiAgICAgIHNldFByb3BzLAogICAgICBhZG9wdFBhcnNlZCwKICAgICAgc2V0Um9vdE5hbWU6IChuYW1lKSA9PiB7CiAgICAgICAgcm9vdE5hbWUgPSBuYW1lOwogICAgICB9LAogICAgICBtYXJrRmV0Y2hlZDogKG5hbWUpID0+IHsKICAgICAgICByZWdpc3RyeS5nZXQobmFtZSkuZmV0Y2hlZCA9IHRydWU7CiAgICAgIH0sCiAgICAgIGFubm90YXRlZFRlbXBsYXRlOiAobmFtZSkgPT4gewogICAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgICAgcmV0dXJuIHIudHBsICYmIHIudHBsLl9fYW5ub3RhdGVkIHx8IG51bGw7CiAgICAgIH0sCiAgICAgIHRlbXBsYXRlU291cmNlOiAobmFtZSkgPT4gcmVnaXN0cnkuZ2V0KG5hbWUpLmh0bWwgfHwgbnVsbCwKICAgICAgU3RyZWFtYWJsZUxvZ2ljCiAgICB9OwogIH0KCiAgLy8gc3JjL3N0cmVhbS1zdGF0ZS50cwogIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbVRyYWNrZXIoc3RhbGVNcyA9IDZlNCwgbm93ID0gRGF0ZS5ub3cpIHsKICAgIGNvbnN0IHNpbmNlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGNvbnN0IGxpdmVPbmUgPSAobikgPT4gewogICAgICBjb25zdCB0ID0gc2luY2UuZ2V0KG4pOwogICAgICBpZiAodCA9PT0gdm9pZCAwKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChub3coKSAtIHQgPiBzdGFsZU1zKSB7CiAgICAgICAgc2luY2UuZGVsZXRlKG4pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CiAgICByZXR1cm4gewogICAgICBwdXNoKG5hbWUsIHN0cmVhbWluZywgdmlld3BvcnRLZXkpIHsKICAgICAgICBpZiAodmlld3BvcnRLZXkgPT09ICJkYy1tb2RlbCIpIHJldHVybjsKICAgICAgICBpZiAoc3RyZWFtaW5nKSBzaW5jZS5zZXQobmFtZSwgbm93KCkpOwogICAgICAgIGVsc2Ugc2luY2UuZGVsZXRlKG5hbWUpOwogICAgICB9LAogICAgICBsaXZlKG5hbWUpIHsKICAgICAgICBpZiAobmFtZSAhPT0gdm9pZCAwKSByZXR1cm4gbGl2ZU9uZShuYW1lKTsKICAgICAgICBmb3IgKGNvbnN0IG4gb2YgWy4uLnNpbmNlLmtleXMoKV0pIGlmIChsaXZlT25lKG4pKSByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH07CiAgfQoKICAvLyBzcmMvaW5kZXgudHMKICBmdW5jdGlvbiBoaWRlUmF3VGVtcGxhdGUoKSB7CiAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgIHMudGV4dENvbnRlbnQgPSAieC1kY3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fSI7CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOwogIH0KICBmdW5jdGlvbiBsb2FkU2NyaXB0KHNyYywgaW50ZWdyaXR5KSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgLy8hIG5vc2VtZ3JlcDogY3JlYXRlLXNjcmlwdC1lbGVtZW50CiAgICAgIGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgcy5zcmMgPSBzcmM7CiAgICAgIGlmIChpbnRlZ3JpdHkpIHsKICAgICAgICBzLmludGVncml0eSA9IGludGVncml0eTsKICAgICAgICBzLmNyb3NzT3JpZ2luID0gImFub255bW91cyI7CiAgICAgIH0KICAgICAgcy5hc3luYyA9IGZhbHNlOwogICAgICBzLm9ubG9hZCA9ICgpID0+IHJlc29sdmUyKCk7CiAgICAgIHMub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYGZhaWxlZCB0byBsb2FkICR7c3JjfWApKTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBsb2FkUmVhY3RVbWQoKSB7CiAgICBjb25zdCB3ID0gd2luZG93OwogICAgaWYgKHcuUmVhY3QgJiYgdy5SZWFjdERPTSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY29uc3QgcmVhY3QgPSBjZG5TY3JpcHRGb3IoUkVBQ1RfVVJMLCBSRUFDVF9TUkkpOwogICAgY29uc3QgcmVhY3REb20gPSBjZG5TY3JpcHRGb3IoUkVBQ1RfRE9NX1VSTCwgUkVBQ1RfRE9NX1NSSSk7CiAgICByZXR1cm4gUHJvbWlzZS5hbGwoWwogICAgICBsb2FkU2NyaXB0KHJlYWN0LnNyYywgcmVhY3QuaW50ZWdyaXR5KSwKICAgICAgbG9hZFNjcmlwdChyZWFjdERvbS5zcmMsIHJlYWN0RG9tLmludGVncml0eSkKICAgIF0pLnRoZW4oKCkgPT4gdm9pZCAwKTsKICB9CiAgZnVuY3Rpb24gaW5pdCgpIHsKICAgIGNvbnN0IHJ1bnRpbWUgPSBjcmVhdGVSdW50aW1lKGRvY3VtZW50KTsKICAgIGxldCByb290TmFtZSA9ICJSb290IjsKICAgIGNvbnN0IGJhc2VDc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgYmFzZUNzcy50ZXh0Q29udGVudCA9IEJBU0VfQ1NTOwogICAgZG9jdW1lbnQuaGVhZC5wcmVwZW5kKGJhc2VDc3MpOwogICAgY29uc3Qgbm90aWZ5SG9zdCA9ICgpID0+IHsKICAgICAgaWYgKHdpbmRvdy5wYXJlbnQgPT09IHdpbmRvdykgcmV0dXJuOwogICAgICBjb25zdCByID0gcnVudGltZS5yZWdpc3RyeS5lbnRyaWVzW3Jvb3ROYW1lXTsKICAgICAgdHJ5IHsKICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKAogICAgICAgICAgewogICAgICAgICAgICB0eXBlOiAiX19kY19ib290ZWQiLAogICAgICAgICAgICByb290TmFtZSwKICAgICAgICAgICAgcHJvcHNNZXRhOiByICYmIHIucHJvcHNNZXRhIHx8IG51bGwsCiAgICAgICAgICAgIHByZXZpZXc6IHIgJiYgci5wcmV2aWV3IHx8IG51bGwKICAgICAgICAgIH0sCiAgICAgICAgICAiKiIKICAgICAgICApOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN0cmVhbXMgPSBjcmVhdGVTdHJlYW1UcmFja2VyKCk7CiAgICBjb25zdCBhcGkgPSB7CiAgICAgIF9fZGNVcGRhdGU6IChuYW1lLCBraW5kLCBjb250ZW50LCBzdHJlYW1pbmcsIHZpZXdwb3J0S2V5KSA9PiB7CiAgICAgICAgc3RyZWFtcy5wdXNoKG5hbWUsIHN0cmVhbWluZywgdmlld3BvcnRLZXkpOwogICAgICAgIHJ1bnRpbWUuZGNVcGRhdGUobmFtZSwga2luZCwgY29udGVudCwgc3RyZWFtaW5nKTsKICAgICAgICBpZiAobmFtZSA9PT0gcm9vdE5hbWUgJiYgIXN0cmVhbWluZyAmJiBraW5kID09PSAicHJvcHMiKSBub3RpZnlIb3N0KCk7CiAgICAgIH0sCiAgICAgIF9fZGNTdHJlYW1pbmc6IChuYW1lKSA9PiBzdHJlYW1zLmxpdmUobmFtZSksCiAgICAgIF9fZGNTZXRQcm9wczogKG5hbWUsIG92ZXJyaWRlcykgPT4gcnVudGltZS5zZXRQcm9wcyhuYW1lLCBvdmVycmlkZXMpLAogICAgICAvKiogTmFtZSBvZiB0aGUgY29tcG9uZW50IGN1cnJlbnRseSBtb3VudGVkIGFzIHRoZSBwYWdlIHJvb3Qg4oCUIERDIHRvb2xzCiAgICAgICAqICBwdXNoIHRoZWlyIHRlbXBsYXRlLXN0cmVhbSBoZXJlIHdoZW4gdGFyZ2V0aW5nICJ0aGUgb3BlbiBwYWdlIi4gKi8KICAgICAgX19kY1Jvb3ROYW1lOiAoKSA9PiByb290TmFtZSwKICAgICAgLyoqIEVkaXRvciBicmlkZ2Ug4oCUIHRoZSBlbmNvZGVkLCBgZGF0YS1kYy10cGxgLWFubm90YXRlZCB0ZW1wbGF0ZSBzb3VyY2UuCiAgICAgICAqICBUaGUgaG9zdCBlZGl0b3IgcGFyc2VzIHRoaXMgaW50byBpdHMgb3duIHRlbXBsYXRlIERPTSBzbyBpdCBjYW4gbWFwIGEKICAgICAgICogIHJlbmRlcmVkIG5vZGUgKGNhcnJ5aW5nIHRoZSBzYW1lIGBkYXRhLWRjLXRwbGApIGJhY2sgdG8gdGhlIHNvdXJjZQogICAgICAgKiAgbm9kZSB0aGF0IGVtaXR0ZWQgaXQuIFJldHVybnMgdGhlIGVuY29kZWQgZm9ybSAoYHNjLWNhbWVsLSpgIGF0dHJzLAogICAgICAgKiAgYDxzYy1yYXctKj5gL2A8c2MtaGVsbWV0PmAgdGFncyk7IHRoZSBlZGl0b3IgZGVjb2RlcyBvbiBzZXJpYWxpemUuICovCiAgICAgIF9fZGNBbm5vdGF0ZWRUZW1wbGF0ZTogKG5hbWUpID0+IHJ1bnRpbWUuYW5ub3RhdGVkVGVtcGxhdGUobmFtZSksCiAgICAgIC8qKiBFZGl0b3IgYnJpZGdlIOKAlCB0aGUgKm9yaWdpbmFsKiAoZGVjb2RlZCkgdGVtcGxhdGUgc291cmNlLiAqLwogICAgICBfX2RjVGVtcGxhdGVTb3VyY2U6IChuYW1lKSA9PiBydW50aW1lLnRlbXBsYXRlU291cmNlKG5hbWUpLAogICAgICBfX2RjQm9vdDogKCkgPT4gewogICAgICAgIHJvb3ROYW1lID0gYm9vdChydW50aW1lLCBkb2N1bWVudCkgPz8gcm9vdE5hbWU7CiAgICAgICAgbm90aWZ5SG9zdCgpOwogICAgICB9LAogICAgICBfX2RjUmVnaXN0cnk6IHJ1bnRpbWUucmVnaXN0cnkuZW50cmllcywKICAgICAgZ2V0REM6IChuYW1lKSA9PiBydW50aW1lLmdldERDKG5hbWUpLAogICAgICAvLyBgRENMb2dpY2AgaXMgdGhlIGRvY3VtZW50ZWQgYmFzZSBjbGFzcyBuYW1lOyBgU3RyZWFtYWJsZUxvZ2ljYCBpcyB0aGUKICAgICAgLy8gaW1wbGVtZW50YXRpb24gYWxpYXMga2VwdCBmb3IgYW55IHByb2plY3QgdGhhdCBhbHJlYWR5IHJlZmVyZW5jZXMgaXQuCiAgICAgIERDTG9naWM6IHJ1bnRpbWUuU3RyZWFtYWJsZUxvZ2ljLAogICAgICBTdHJlYW1hYmxlTG9naWM6IHJ1bnRpbWUuU3RyZWFtYWJsZUxvZ2ljCiAgICB9OwogICAgT2JqZWN0LmFzc2lnbih3aW5kb3csIGFwaSk7CiAgICB3aW5kb3cuX19kY0NvbnRlbnRLZXllZCA9IHRydWU7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gImxvYWRpbmciKSBhcGkuX19kY0Jvb3QoKTsKICAgIGVsc2UgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsICgpID0+IGFwaS5fX2RjQm9vdCgpKTsKICB9CiAgaGlkZVJhd1RlbXBsYXRlKCk7CiAgbG9hZFJlYWN0VW1kKCkudGhlbihpbml0KS5jYXRjaCgoZXJyKSA9PiB7CiAgICBjb25zb2xlLmVycm9yKCJbZGNdIGZhaWxlZCB0byBsb2FkIFJlYWN0IG9yIGJvb3Q6IiwgZXJyKTsKICAgIHRocm93IGVycjsKICB9KTsKfSkoKTsKPC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+Cjx4LWRjPgo8aGVsbWV0PgoKPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tIj4KPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tIiBjcm9zc29yaWdpbj0iIj4KPHN0eWxlPgogIGJvZHkgeyBtYXJnaW46IDA7IGJhY2tncm91bmQ6ICNGRkZERkI7IH0KICBhIHsgY29sb3I6ICNCNDAwNkE7IH0KICBhOmhvdmVyIHsgY29sb3I6ICMxNDI2MUM7IH0KICAuY2Itb3B0OmZvY3VzLXZpc2libGUsIC5jYi1pbnA6Zm9jdXMtdmlzaWJsZSB7IG91dGxpbmU6IDNweCBzb2xpZCAjMDBBMERDOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9CiAgQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KXsKICAgIC5jYi1sYXlvdXR7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyICFpbXBvcnRhbnQ7IH0KICAgIC5jYi1wYW5lbHsgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50OyB0b3A6IDAgIWltcG9ydGFudDsgei1pbmRleDogNjsgcGFkZGluZzogOHB4ICFpbXBvcnRhbnQ7IGJvcmRlci1yYWRpdXM6IDAgMCAyMHB4IDIwcHggIWltcG9ydGFudDsgYm94LXNoYWRvdzogMCA2cHggMCAjQ0JCM0YwICFpbXBvcnRhbnQ7IH0KICAgIC5jYi1zdmd7IG1heC1oZWlnaHQ6IDMydmg7IH0KICAgIC5jYi1jYXB0aW9ueyBkaXNwbGF5OiBub25lOyB9CiAgfQogIEBtZWRpYSAobWF4LXdpZHRoOiA3MDBweCl7CiAgICBib2R5ID4geC1kYyA+IGRpdiB7IHBhZGRpbmc6IDI0cHggMTJweCA0OHB4ICFpbXBvcnRhbnQ7IH0KICAgIC5jYi1jYXJkcyB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyICFpbXBvcnRhbnQ7IGdhcDogMTJweCAhaW1wb3J0YW50OyB9CiAgICAuY2ItcGFuZWwgeyBib3JkZXItcmFkaXVzOiAxOHB4ICFpbXBvcnRhbnQ7IH0KICAgIC5jYi1zdmcgeyBtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KICAgIC5jYi1vcHQgeyBtaW4td2lkdGg6IDA7IHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50OyBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7IH0KICAgIGgxIHsgZm9udC1zaXplOiBjbGFtcCgzMHB4LCAxMHZ3LCA0MnB4KSAhaW1wb3J0YW50OyB9CiAgfQo8L3N0eWxlPgo8L2hlbG1ldD4KPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IE51bml0bywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmOyBjb2xvcjogIzE0MjYxQzsgYmFja2dyb3VuZDogI0ZGRkRGQjsgcGFkZGluZzogNDRweCAyNHB4IDgwcHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7Ij4KICAKPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiAxMDQwcHg7IG1hcmdpbjogMCBhdXRvOyI+CgogICAgPGhlYWRlciBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAyMnB4OyI+CiAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxM3B4OyBsZXR0ZXItc3BhY2luZzogLjE0ZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGNvbG9yOiAjQjQwMDZBOyBiYWNrZ3JvdW5kOiAjRkNFOUYzOyBib3JkZXItcmFkaXVzOiAzMHB4OyBwYWRkaW5nOiA2cHggMThweDsgbWFyZ2luLWJvdHRvbTogMTRweDsiPkVxdWlsw61icmlvIG5hIHZpZGE8L2Rpdj4KICAgICAgPGgxIHN0eWxlPSJmb250LWZhbWlseTogJ0JhbG9vIDInLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogODAwOyBmb250LXNpemU6IGNsYW1wKDM0cHgsIDV2dywgNTJweCk7IG1hcmdpbjogMCAwIDEycHg7IGxpbmUtaGVpZ2h0OiAxLjA0OyB0ZXh0LXdyYXA6IGJhbGFuY2U7Ij5BIGNhc2EgZG8gbWV1IDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMwMEEwREMsICNEQzAwNzgpOyAtd2Via2l0LWJhY2tncm91bmQtY2xpcDogdGV4dDsgYmFja2dyb3VuZC1jbGlwOiB0ZXh0OyBjb2xvcjogdHJhbnNwYXJlbnQ7Ij5lcXVpbMOtYnJpbzwvc3Bhbj48L2gxPgogICAgICA8cCBzdHlsZT0iY29sb3I6ICM1OTYxNUE7IGZvbnQtc2l6ZTogMTZweDsgbWF4LXdpZHRoOiA2NDBweDsgbWFyZ2luOiAwIGF1dG8gMTZweDsgbGluZS1oZWlnaHQ6IDEuNjsgdGV4dC13cmFwOiBwcmV0dHk7Ij5EZXogcGVyZ3VudGFzIHNvYnJlIGRleiDDoXJlYXMgZGEgc3VhIHZpZGEuIFJlc3BvbmRhIGNvbSBzaW5jZXJpZGFkZSwgZGUgMSBhIDUuIDxicj5DYWRhIGVzcGHDp28gZGEgY2FzYSBnYW5oYSB1bWEgY29yIGRlIGFjb3JkbyBjb20gYSBzdWEgcmVzcG9zdGEuIE5vIGZpbmFsLCB2b2PDqiByZWNlYmUgdW1hIHN1Z2VzdMOjbyBwYXJhIGNhZGEgw6FyZWEgZSBlc2NvbGhlIHVtIGNvbXByb21pc3NvLjwvcD4KICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTBweDsgZmxleC13cmFwOiB3cmFwOyBmb250LWZhbWlseTogJ0JhbG9vIDInLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDEzcHg7IGNvbG9yOiAjM0E0NDNFOyI+CiAgICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6ICNGRkZGRkY7IGJvcmRlcjogMnB4IHNvbGlkICMxNDI2MUM7IGJvcmRlci1yYWRpdXM6IDIwcHg7IHBhZGRpbmc6IDVweCAxNHB4OyI+MTAgcGVyZ3VudGFzPC9zcGFuPgogICAgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kOiAjRkZGRkZGOyBib3JkZXI6IDJweCBzb2xpZCAjMTQyNjFDOyBib3JkZXItcmFkaXVzOiAyMHB4OyBwYWRkaW5nOiA1cHggMTRweDsiPjUgbWludXRvczwvc3Bhbj4KICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDogI0ZGRkZGRjsgYm9yZGVyOiAycHggc29saWQgIzE0MjYxQzsgYm9yZGVyLXJhZGl1czogMjBweDsgcGFkZGluZzogNXB4IDE0cHg7Ij5BbyBmaW5hbCwgdm9jw6ogcmVjZWJlIDEwIHN1Z2VzdMO1ZXMgZSBkZWZpbmUgdW0gY29tcHJvbWlzc288L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9oZWFkZXI+CgogICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA2MjBweDsgbWFyZ2luOiAwIGF1dG8gMjZweDsiPgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBiYXNlbGluZTsgZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogIzNBNDQzRTsgbWFyZ2luLWJvdHRvbTogN3B4OyI+CiAgICAgICAgPHNwYW4+e3sgcHJvZ3Jlc3NMYWJlbCB9fTwvc3Bhbj4KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM1OTYxNUE7Ij57eyBwcm9ncmVzc0hpbnQgfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDE0cHg7IGJvcmRlci1yYWRpdXM6IDlweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBvdmVyZmxvdzogaGlkZGVuOyI+CiAgICAgICAgPGRpdiBzdHlsZT0iaGVpZ2h0OiAxMDAlOyB3aWR0aDoge3sgcHJvZ3Jlc3NQY3QgfX07IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgIzAwQTBEQywgIzhBNUZBRSwgI0RDMDA3OCk7IHRyYW5zaXRpb246IHdpZHRoIC4zNXMgZWFzZTsiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBnYXA6IDE0cHg7IG1hcmdpbjogMCAwIDI2cHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICMzQTQ0M0U7IGZsZXgtd3JhcDogd3JhcDsiPgogICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogN3B4OyI+PHNwYW4gc3R5bGU9IndpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48L3NwYW4+U2VtIHJlc3Bvc3RhPC9zcGFuPgogICAgICA8c3Bhbj4xIMK3IEZyaW88L3NwYW4+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiAxNzBweDsgaGVpZ2h0OiAxM3B4OyBib3JkZXItcmFkaXVzOiA5cHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgcmdiYSgwLDE2MCwyMjAsLjMyKSwgcmdiYSgxMzgsOTUsMTc0LC41KSwgcmdiYSgyMjAsMCwxMjAsLjcyKSk7IGJvcmRlcjogMi41cHggc29saWQgIzE0MjYxQzsiPjwvZGl2PgogICAgICA8c3Bhbj41IMK3IFF1ZW50ZTwvc3Bhbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImNiLWxheW91dCIgc3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcik7IGdhcDogMzBweDsgYWxpZ24taXRlbXM6IHN0YXJ0OyI+CgogICAgICA8ZGl2IGNsYXNzPSJjYi1wYW5lbCIgc3R5bGU9InBvc2l0aW9uOiBzdGF0aWM7IGJhY2tncm91bmQ6ICNGRkZGRkY7IGJvcmRlci1yYWRpdXM6IDI0cHg7IHBhZGRpbmc6IDE2cHggMTRweCAxMnB4OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGJveC1zaGFkb3c6IDdweCA3cHggMCAjQ0JCM0YwOyI+CiAgICAgICAgPHN2ZyByZWY9Int7IHN2Z1JlZiB9fSIgY2xhc3M9ImNiLXN2ZyIgc2MtY2FtZWwtdmlldy1ib3g9IjAgMCAxNDAwIDk1MCIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IDc2MHB4OyBtYXgtaGVpZ2h0OiA1OHZoOyBoZWlnaHQ6IGF1dG87IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDAgYXV0bzsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJ7eyBhcmlhSG91c2UgfX0iPgogICAgICAgICAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMTQyNjFDIiBzdHJva2Utd2lkdGg9IjYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CgogICAgICAgICAgICA8IS0tID09PT09IE1JIEVOVE9STk86IGZyYW5qYSBkZSBzdWVsbyA9PT09PSAtLT4KICAgICAgICAgICAgPHJlY3QgeD0iNDAiIHk9IjgxOCIgd2lkdGg9IjEzMjAiIGhlaWdodD0iOTYiIHJ4PSIyNiIgZmlsbD0ie3sgYy5yNCB9fSI+PC9yZWN0PgogICAgICAgICAgICA8cmVjdCB4PSI0MCIgeT0iODE4IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSI5NiIgcng9IjI2Ij48L3JlY3Q+CiAgICAgICAgICAgIDx0ZXh0IHg9IjExMiIgeT0iODc2IiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+TWV1IGFtYmllbnRlPC90ZXh0PgoKICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI1IiBmaWxsPSJ7eyBjLmY0IH19Ij4KICAgICAgICAgICAgICA8cGF0aCBkPSJNOTAyLDg4MiBDOTAyLDg3MyA5NzIsODczIDk3Miw4ODIgQzk3Miw4OTEgOTAyLDg5MSA5MDIsODgyIFoiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTAwMiw4NjQgQzEwMDIsODU2IDEwNjAsODU2IDEwNjAsODY0IEMxMDYwLDg3MiAxMDAyLDg3MiAxMDAyLDg2NCBaIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KCiAgICAgICAgICAgIDwhLS0gw6FyYm9sIC0tPgogICAgICAgICAgICA8cGF0aCBmaWxsPSJ7eyBjLmY0IH19IiBkPSJNOTQsODE4IEM5OCw3NjQgODgsNzI0IDEwMiw2ODIgTDEzNCw2ODIgQzE0Niw3MjggMTMyLDc2OCAxNDAsODE4IFoiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mNCB9fSIgZD0iTTExOCw0OTAgQzE2MSw0ODUgMTk0LDUwOCAxOTgsNTQzIEMyMzMsNTU3IDIzNSw2MDIgMjA5LDYyMSBDMjExLDY1NCAxODAsNjc3IDE0Nyw2NjggQzEyNiw2OTIgODQsNjg5IDY3LDY2OCBDMzIsNjczIDEwLDY0MCAyNSw2MTAgQzQsNTg0IDE5LDU0MiA1Miw1MzUgQzU3LDUwMiA4OCw0ODMgMTE4LDQ5MCBaIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNSIgZD0iTTExOCw2ODIgQzExNiw2MzIgMTE4LDU4NCAxMjAsNTQ4Ij48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNSIgZD0iTTExOCw2MzQgQzEwMiw2MjAgODYsNjEwIDcwLDYwMiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik0xMTksNjA2IEMxMzQsNTkyIDE1MCw1ODIgMTY2LDU3NiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik0xMTgsNTcwIEMxMDgsNTYwIDk4LDU1MiA4OCw1NDYiPjwvcGF0aD4KCiAgICAgICAgICAgIDwhLS0gYXJidXN0b3MgeSBmbG9yZXMgLS0+CiAgICAgICAgICAgIDxwYXRoIGZpbGw9Int7IGMuZjQgfX0iIGQ9Ik0xMjA1LDgxOCBDMTE3OCw4MTggMTE3MCw3OTAgMTE4OCw3NzYgQzExODgsNzUwIDEyMjQsNzQyIDEyNDAsNzYwIEMxMjY2LDc0OCAxMjkwLDc3MCAxMjgyLDc5MiBDMTI5NCw4MDQgMTI4Niw4MTggMTI2OCw4MTggWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBmaWxsPSJ7eyBjLmY0IH19IiBkPSJNMTI5OCw4MTggQzEyNzgsODE4IDEyNzIsNzk4IDEyODYsNzg4IEMxMjg2LDc2NiAxMzIwLDc2MCAxMzMyLDc3NiBDMTM1NCw3NzIgMTM2OCw3OTQgMTM1NCw4MDggQzEzNTgsODE2IDEzNDgsODE4IDEzMzYsODE4IFoiPjwvcGF0aD4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI0Ij4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMjI4LDgxOCBDMjMwLDgwNCAyMjQsNzk2IDIyMCw3OTAiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE1MCw4MTggQzExNTIsODA0IDExNDYsNzk2IDExNDIsNzkwIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI0IiBmaWxsPSJ7eyBjLmY0IH19Ij4KICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIyMTgiIGN5PSI3ODQiIHI9IjgiPjwvY2lyY2xlPgogICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjExNDAiIGN5PSI3ODQiIHI9IjgiPjwvY2lyY2xlPgogICAgICAgICAgICA8L2c+CgogICAgICAgICAgICA8IS0tID09PT09IFZJREEgU09DSUFMOiB0ZXJyYXphID09PT09IC0tPgogICAgICAgICAgICA8cmVjdCB4PSI5NTQiIHk9IjU1NiIgd2lkdGg9IjIxNiIgaGVpZ2h0PSIyNjIiIHJ4PSIxNiIgZmlsbD0ie3sgYy5yMiB9fSIgc3Ryb2tlPSJub25lIj48L3JlY3Q+CiAgICAgICAgICAgIDx0ZXh0IHg9IjEwNjIiIHk9IjU0NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IidCYWxvbyAyJywgc2Fucy1zZXJpZiIgZm9udC13ZWlnaHQ9IjcwMCIgZm9udC1zaXplPSIyNCIgZmlsbD0iIzE0MjYxQyIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjciIHBhaW50LW9yZGVyPSJzdHJva2UiPlZpZGEgc29jaWFsPC90ZXh0PgogICAgICAgICAgICA8cmVjdCBmaWxsPSJ7eyBjLmYyIH19IiB4PSI5NjIiIHk9Ijc4MCIgd2lkdGg9IjE4IiBoZWlnaHQ9IjM4IiByeD0iMyI+PC9yZWN0PgogICAgICAgICAgICA8cmVjdCBmaWxsPSJ7eyBjLmYyIH19IiB4PSIxMTI4IiB5PSI3ODAiIHdpZHRoPSIxOCIgaGVpZ2h0PSIzOCIgcng9IjMiPjwvcmVjdD4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mMiB9fSIgeD0iOTUwIiB5PSI3NTQiIHdpZHRoPSIyMTAiIGhlaWdodD0iMjYiIHJ4PSI0Ij48L3JlY3Q+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTk4MCw3NTYgTDk4MCw3NzgiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTAxMCw3NTYgTDEwMTAsNzc4Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTEwNDAsNzU2IEwxMDQwLDc3OCI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDcwLDc1NiBMMTA3MCw3NzgiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEwMCw3NTYgTDExMDAsNzc4Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTExMzAsNzU2IEwxMTMwLDc3OCI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDU1LDYwNiBMMTA1NSw3NTQiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mMiB9fSIgZD0iTTk5Niw2MDggQzEwMDAsNTY4IDExMTAsNTY4IDExMTQsNjA4IEMxMTAwLDU5OCAxMDg0LDYxMiAxMDY5LDYwMiBDMTA1Niw2MTQgMTA0MCw1OTggMTAyNiw2MDggWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNOTUwLDY2MCBMMTE2MCw2NjAiPjwvcGF0aD4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI0Ij4KICAgICAgICAgICAgICA8cGF0aCBkPSJNOTU4LDY2MiBMOTU4LDc1MiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik05OTgsNjYyIEw5OTgsNzUyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTEwMzgsNjYyIEwxMDM4LDc1MiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDc4LDY2MiBMMTA3OCw3NTIiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTExOCw2NjIgTDExMTgsNzUyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTExNTIsNjYyIEwxMTUyLDc1MiI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjIgfX0iPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik05NjQsNzA2IEw5NzgsNjUyIEwxMDE0LDY1OSBMMTAwMCw3MDggWiI+PC9wYXRoPgogICAgICAgICAgICAgIDxyZWN0IHg9Ijk2MiIgeT0iNzAwIiB3aWR0aD0iNjYiIGhlaWdodD0iMTgiIHJ4PSI4Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iOTY0IiB5PSI3MjAiIHdpZHRoPSI2MiIgaGVpZ2h0PSIxMCIgcng9IjUiPjwvcmVjdD4KICAgICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik05NzAsNzMwIEw5NzAsNzUyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMTAyMCw3MzAgTDEwMjAsNzUyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTEwOTQsNjU5IEwxMTMwLDY1MiBMMTE0NCw3MDYgTDExMDgsNzA4IFoiPjwvcGF0aD4KICAgICAgICAgICAgICA8cmVjdCB4PSIxMDgwIiB5PSI3MDAiIHdpZHRoPSI2NiIgaGVpZ2h0PSIxOCIgcng9IjgiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSIxMDgyIiB5PSI3MjAiIHdpZHRoPSI2MiIgaGVpZ2h0PSIxMCIgcng9IjUiPjwvcmVjdD4KICAgICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik0xMDg4LDczMCBMMTA4OCw3NTIiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik0xMTM4LDczMCBMMTEzOCw3NTIiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjQiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik05NzIsNjg0IEwxMDA2LDY5MSI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMTAyLDY5MSBMMTEzNiw2ODQiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgoKICAgICAgICAgICAgPCEtLSA9PT09PSBjaGltZW5lYSA9PT09PSAtLT4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mNiB9fSIgeD0iODAyIiB5PSIxMTYiIHdpZHRoPSI2NiIgaGVpZ2h0PSIxMzAiPjwvcmVjdD4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mNiB9fSIgeD0iNzkwIiB5PSI5OCIgd2lkdGg9IjkwIiBoZWlnaHQ9IjIwIiByeD0iNCI+PC9yZWN0PgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjQiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik04MDIsMTQwIEw4NjgsMTQwIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTgwMiwxNjQgTDg2OCwxNjQiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODA2LDE4OCBMODY4LDE4OCI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik04MzUsMTE4IEw4MzUsMTQwIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTgxOCwxNDAgTDgxOCwxNjQiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODUyLDE0MCBMODUyLDE2NCI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik04MzUsMTY0IEw4MzUsMTg4Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTgxOCwxODggTDgxOCwxOTciPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODUyLDE4OCBMODUyLDIxOCI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CgogICAgICAgICAgICA8IS0tID09PT09IENSRUNJTUlFTlRPOiDDoXRpY28gPT09PT0gLS0+CiAgICAgICAgICAgIDxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0yMjgsMzAyIEMyMjYsMjk2IDIzMiwyOTAgMjM4LDI4NiBMNTkyLDY0IEM1OTgsNjAgNjA0LDYwIDYxMCw2NCBMOTY0LDI4NiBDOTcwLDI5MCA5NzQsMjk2IDk3MiwzMDIgWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBmaWxsPSJ7eyBjLnI2IH19IiBzdHJva2U9Im5vbmUiIGQ9Ik0yMzIsMjk4IEw1OTgsNjggTDk2NiwyOTggWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMjI4LDMwMiBDMjI2LDI5NiAyMzIsMjkwIDIzOCwyODYgTDU5Miw2NCBDNTk4LDYwIDYwNCw2MCA2MTAsNjQgTDk2NCwyODYgQzk3MCwyOTAgOTc0LDI5NiA5NzIsMzAyIFoiPjwvcGF0aD4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mNiB9fSIgeD0iNDA0IiB5PSIxODIiIHdpZHRoPSI5NiIgaGVpZ2h0PSIxMTIiIHJ4PSI3Ij48L3JlY3Q+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTQwNCwyMTAgTDUwMCwyMTAiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNDA0LDIzOCBMNTAwLDIzOCI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik00MDQsMjY2IEw1MDAsMjY2Ij48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI0IiBmaWxsPSJ7eyBjLmY2IH19Ij4KICAgICAgICAgICAgICA8cmVjdCB4PSI0MTIiIHk9IjE4OCIgd2lkdGg9IjE1IiBoZWlnaHQ9IjIwIiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjQzMSIgeT0iMTg4IiB3aWR0aD0iMTUiIGhlaWdodD0iMjAiIHJ4PSIyIj48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDU0IiB5PSIxOTAiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxOCIgcng9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI0MTIiIHk9IjIxNiIgd2lkdGg9IjE1IiBoZWlnaHQ9IjIwIiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjQzNCIgeT0iMjE4IiB3aWR0aD0iMTMiIGhlaWdodD0iMTgiIHJ4PSIyIj48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDY2IiB5PSIyMTYiIHdpZHRoPSIxNSIgaGVpZ2h0PSIyMCIgcng9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI0MTIiIHk9IjI0NiIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE4IiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjQzMCIgeT0iMjQ0IiB3aWR0aD0iMTUiIGhlaWdodD0iMjAiIHJ4PSIyIj48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDUyIiB5PSIyNDYiIHdpZHRoPSIxNCIgaGVpZ2h0PSIxOCIgcng9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI0MTgiIHk9IjI3NCIgd2lkdGg9IjE1IiBoZWlnaHQ9IjE2IiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjQzOSIgeT0iMjcyIiB3aWR0aD0iMTMiIGhlaWdodD0iMTgiIHJ4PSIyIj48L3JlY3Q+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPGNpcmNsZSBjeD0iNjAwIiBjeT0iMTM4IiByPSIzNCIgZmlsbD0ie3sgYy5mNiB9fSI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTYwMCwxMDQgTDYwMCwxNzIiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNTY2LDEzOCBMNjM0LDEzOCI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjYgfX0iPgogICAgICAgICAgICAgIDxyZWN0IHg9IjcwOCIgeT0iMjI4IiB3aWR0aD0iNzIiIGhlaWdodD0iNTIiIHJ4PSIxNCI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjY5MiIgeT0iMjY2IiB3aWR0aD0iMTA0IiBoZWlnaHQ9IjMwIiByeD0iMTEiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI2ODYiIHk9IjI1MCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjQ2IiByeD0iOSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9Ijc4MiIgeT0iMjUwIiB3aWR0aD0iMjAiIGhlaWdodD0iNDYiIHJ4PSI5Ij48L3JlY3Q+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI1Ij4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNzAwLDI5NiBMNzAwLDMwMCI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik03ODgsMjk2IEw3ODgsMzAwIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPHBhdGggZD0iTTgzMiwyOTYgTDgzMiwyNjIiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mNiB9fSIgZD0iTTgxNiwyMzggTDg1MCwyMzggTDg2MCwyNjIgTDgwNiwyNjIgWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik04MTgsMjk2IEw4NDYsMjk2Ij48L3BhdGg+CiAgICAgICAgICAgIDx0ZXh0IHg9IjYwMCIgeT0iMjE0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+Q3Jlc2NpbWVudG88L3RleHQ+CgogICAgICAgICAgICA8IS0tID09PT09IGN1ZXJwbyBkZSBsYSBjYXNhID09PT09IC0tPgogICAgICAgICAgICA8cmVjdCBmaWxsPSIjRkZGRkZGIiB4PSIyNTAiIHk9IjMwMCIgd2lkdGg9IjcwMCIgaGVpZ2h0PSI1MTgiIHJ4PSI2Ij48L3JlY3Q+CiAgICAgICAgICAgIDxnIHN0cm9rZT0ibm9uZSI+CiAgICAgICAgICAgICAgPHJlY3QgeD0iMjUyIiB5PSIzMDIiIHdpZHRoPSIzNDYiIGhlaWdodD0iMjA2IiBmaWxsPSJ7eyBjLnIxIH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNjAyIiB5PSIzMDIiIHdpZHRoPSIzNDYiIGhlaWdodD0iMjA2IiBmaWxsPSJ7eyBjLnI4IH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iMjUyIiB5PSI1MTIiIHdpZHRoPSIyMDYiIGhlaWdodD0iMjQwIiBmaWxsPSJ7eyBjLnIwIH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDYyIiB5PSI1MTIiIHdpZHRoPSIxNjIiIGhlaWdodD0iMjQwIiBmaWxsPSJ7eyBjLnI1IH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNjI4IiB5PSI1MTIiIHdpZHRoPSIxNDgiIGhlaWdodD0iMjQwIiBmaWxsPSJ7eyBjLnI5IH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNzgwIiB5PSI1MTIiIHdpZHRoPSIxNjgiIGhlaWdodD0iMjQwIiBmaWxsPSJ7eyBjLnIzIH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iMjUyIiB5PSI3NTYiIHdpZHRoPSI2OTYiIGhlaWdodD0iNjAiIGZpbGw9Int7IGMucjcgfX0iPjwvcmVjdD4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8cmVjdCB4PSIyNTAiIHk9IjMwMCIgd2lkdGg9IjcwMCIgaGVpZ2h0PSI1MTgiIHJ4PSI2Ij48L3JlY3Q+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yNTAsNTEwIEw5NTAsNTEwIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik02MDAsMzAyIEw2MDAsNTEwIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yNTAsNzU0IEw5NTAsNzU0Ij48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik00NjAsNTEyIEw0NjAsNzUyIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik02MjYsNTEyIEw2MjYsNzUyIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik03NzgsNTEyIEw3NzgsNzUyIj48L3BhdGg+CgogICAgICAgICAgICA8IS0tIGNpbWllbnRvczogUFJPUMOTU0lUTyAtLT4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSIyLjUiIG9wYWNpdHk9IjAuMzIiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yNTAsNzc1IEw5NTAsNzc1Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTI1MCw3OTYgTDk1MCw3OTYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMzAwLDc1NCBMMzAwLDc3NSI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zODAsNzU0IEwzODAsNzc1Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2MCw3NTQgTDQ2MCw3NzUiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNTQwLDc1NCBMNTQwLDc3NSI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik02MjAsNzU0IEw2MjAsNzc1Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTc4MCw3NTQgTDc4MCw3NzUiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODYwLDc1NCBMODYwLDc3NSI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zNDAsNzc1IEwzNDAsNzk2Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTQyMCw3NzUgTDQyMCw3OTYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNTAwLDc3NSBMNTAwLDc5NiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik01ODAsNzc1IEw1ODAsNzk2Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTc0MCw3NzUgTDc0MCw3OTYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODIwLDc3NSBMODIwLDc5NiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik05MDAsNzc1IEw5MDAsNzk2Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTMwMCw3OTYgTDMwMCw4MTYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMzgwLDc5NiBMMzgwLDgxNiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik00NjAsNzk2IEw0NjAsODE2Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTU0MCw3OTYgTDU0MCw4MTYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNzgwLDc5NiBMNzgwLDgxNiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik04NjAsNzk2IEw4NjAsODE2Ij48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPHRleHQgeD0iNDMwIiB5PSI3OTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSInQmFsb28gMicsIHNhbnMtc2VyaWYiIGZvbnQtd2VpZ2h0PSI3MDAiIGZvbnQtc2l6ZT0iMjQiIGZpbGw9IiMxNDI2MUMiIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSI3IiBwYWludC1vcmRlcj0ic3Ryb2tlIj5Qcm9ww7NzaXRvPC90ZXh0PgoKICAgICAgICAgICAgPCEtLSA9PT09PSBFU1BBQ0lPIFBFUlNPTkFMOiBkb3JtaXRvcmlvID09PT09IC0tPgogICAgICAgICAgICA8dGV4dCB4PSI0MjUiIHk9IjM0NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IidCYWxvbyAyJywgc2Fucy1zZXJpZiIgZm9udC13ZWlnaHQ9IjcwMCIgZm9udC1zaXplPSIyNCIgZmlsbD0iIzE0MjYxQyIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjciIHBhaW50LW9yZGVyPSJzdHJva2UiPkVzcGHDp28gcGVzc29hbDwvdGV4dD4KCiAgICAgICAgICAgIDxyZWN0IHg9IjUwNiIgeT0iMzg4IiB3aWR0aD0iNzQiIGhlaWdodD0iNzAiIHJ4PSI1IiBmaWxsPSJ7eyBjLmYxIH19Ij48L3JlY3Q+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTU0MywzODggTDU0Myw0NTgiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNTA2LDQyMyBMNTgwLDQyMyI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjEgfX0iPgogICAgICAgICAgICAgIDxyZWN0IHg9IjI2NiIgeT0iNDI2IiB3aWR0aD0iMTgiIGhlaWdodD0iNzgiIHJ4PSI4Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iMjg0IiB5PSI0NDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNjQiIHJ4PSIxMiI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjI5NiIgeT0iNDUwIiB3aWR0aD0iNTQiIGhlaWdodD0iMjgiIHJ4PSI5Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDQwIiB5PSI0NDgiIHdpZHRoPSI1NiIgaGVpZ2h0PSI1NiIgcng9IjYiPjwvcmVjdD4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjQiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zNjYsNDQyIEwzNjYsNTAyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTQ0MCw0NzYgTDQ5Niw0NzYiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8Y2lyY2xlIGZpbGw9Int7IGMuZjEgfX0iIHN0cm9rZS13aWR0aD0iNCIgY3g9IjQ2OCIgY3k9IjQ2NCIgcj0iNSI+PC9jaXJjbGU+CgogICAgICAgICAgICA8IS0tID09PT09IEJJRU5FU1RBUjogYmHDsW8gPT09PT0gLS0+CiAgICAgICAgICAgIDx0ZXh0IHg9Ijc3NSIgeT0iMzQ0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+QmVtLWVzdGFyPC90ZXh0PgoKICAgICAgICAgICAgPGNpcmNsZSBjeD0iNzAwIiBjeT0iNDAyIiByPSIzNiIgZmlsbD0ie3sgYy5mOCB9fSI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxjaXJjbGUgc3Ryb2tlLXdpZHRoPSI0IiBjeD0iNzAwIiBjeT0iNDAyIiByPSIyMyI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxyZWN0IGZpbGw9Int7IGMuZjggfX0iIHg9IjgyNiIgeT0iMzgwIiB3aWR0aD0iOTIiIGhlaWdodD0iMTQiIHJ4PSI0Ij48L3JlY3Q+CiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjggfX0iPgogICAgICAgICAgICAgIDxyZWN0IHg9IjgzNiIgeT0iMzk0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDQiIHJ4PSIxNSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9Ijg3NiIgeT0iMzk0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDQiIHJ4PSIxNSI+PC9yZWN0PgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTg0Niw0MDggTDg2MCw0MDgiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODg2LDQyMCBMOTAwLDQyMCI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxwYXRoIGZpbGw9Int7IGMuZjggfX0iIGQ9Ik02NjYsNDUwIEw4OTIsNDUwIEM4OTYsNDUwIDg5OCw0NTQgODk2LDQ2NCBMODg4LDQ4NiBDODg0LDQ5NCA4NzYsNDk4IDg2Niw0OTggTDY5Miw0OTggQzY4Miw0OTggNjc0LDQ5NCA2NzAsNDg2IEw2NjIsNDY0IEM2NjAsNDU0IDY2Miw0NTAgNjY2LDQ1MCBaIj48L3BhdGg+CiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjggfX0iIHN0cm9rZS13aWR0aD0iNSI+CiAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iNzAwIiBjeT0iNTA0IiByPSI2Ij48L2NpcmNsZT4KICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSI4NTgiIGN5PSI1MDQiIHI9IjYiPjwvY2lyY2xlPgogICAgICAgICAgICA8L2c+CgogICAgICAgICAgICA8IS0tID09PT09IFJFTEFDSU9ORVM6IHNhbGEgPT09PT0gLS0+CiAgICAgICAgICAgIDx0ZXh0IHg9IjM1NiIgeT0iNTU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+UmVsYWNpb25hbWVudG9zPC90ZXh0PgoKICAgICAgICAgICAgPGcgZmlsbD0ie3sgYy5mMCB9fSI+CiAgICAgICAgICAgICAgPHJlY3QgeD0iMjY4IiB5PSI2NjQiIHdpZHRoPSIxMjAiIGhlaWdodD0iNzAiIHJ4PSIxNCI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjI2MiIgeT0iNjQ0IiB3aWR0aD0iMjQiIGhlaWdodD0iOTAiIHJ4PSI5Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iMzcwIiB5PSI2NDQiIHdpZHRoPSIyNCIgaGVpZ2h0PSI5MCIgcng9IjkiPjwvcmVjdD4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjQiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zMjgsNjY4IEwzMjgsNzMyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTI4Niw2NjggTDM3MCw2NjgiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8cGF0aCBkPSJNNDI2LDc1MiBMNDI2LDYyNCI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBmaWxsPSJ7eyBjLmYwIH19IiBkPSJNNDA2LDU5NiBMNDQ2LDU5NiBMNDUyLDYyNCBMNDAwLDYyNCBaIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNSIgZD0iTTQxMiw3NTIgTDQ0MCw3NTIiPjwvcGF0aD4KCiAgICAgICAgICAgIDwhLS0gPT09PT0gRklOQU5aQVM6IGNvY2luYSA9PT09PSAtLT4KICAgICAgICAgICAgPHRleHQgeD0iNTQ0IiB5PSI1NTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSInQmFsb28gMicsIHNhbnMtc2VyaWYiIGZvbnQtd2VpZ2h0PSI3MDAiIGZvbnQtc2l6ZT0iMjQiIGZpbGw9IiMxNDI2MUMiIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSI3IiBwYWludC1vcmRlcj0ic3Ryb2tlIj5GaW5hbsOnYXM8L3RleHQ+CgogICAgICAgICAgICA8cmVjdCBmaWxsPSJ7eyBjLmY1IH19IiB4PSI0NzAiIHk9IjYzNiIgd2lkdGg9IjY4IiBoZWlnaHQ9IjQ4IiByeD0iNiI+PC9yZWN0PgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjQiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik01MDQsNjM2IEw1MDQsNjg0Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTQ5Miw2NTQgTDQ5Miw2NjYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNTE2LDY1NCBMNTE2LDY2NiI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxyZWN0IGZpbGw9Int7IGMuZjUgfX0iIHg9IjQ3NCIgeT0iNjkwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjYyIiByeD0iNiI+PC9yZWN0PgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjQiIGQ9Ik00NzQsNzA4IEw2MTQsNzA4Ij48L3BhdGg+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCIgZmlsbD0ie3sgYy5mNSB9fSI+CiAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iNTAwIiBjeT0iNjk5IiByPSI4Ij48L2NpcmNsZT4KICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSI1MjgiIGN5PSI2OTkiIHI9IjgiPjwvY2lyY2xlPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNCIgZD0iTTU1Niw3MjQgTDU5OCw3MjQiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mNSB9fSIgZD0iTTU1NCw2NjAgTDYwNiw2NjAgTDYxMCw2OTAgTDU1MCw2OTAgWiI+PC9wYXRoPgogICAgICAgICAgICA8cmVjdCBmaWxsPSJ7eyBjLmY1IH19IiB4PSI1NDgiIHk9IjY0OCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjEyIiByeD0iNSI+PC9yZWN0PgogICAgICAgICAgICA8cGF0aCBmaWxsPSJ7eyBjLmY1IH19IiBkPSJNNTcyLDY0OCBDNTcyLDYzOCA1ODgsNjM4IDU4OCw2NDggWiI+PC9wYXRoPgoKICAgICAgICAgICAgPCEtLSBlc2NhbG9uZXMgZGUgZW50cmFkYSAtLT4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mNCB9fSIgZD0iTTU5Niw4NTYgTDgwOCw4NTYgTDgwOCw4ODQgUTgwOCw4OTAgODAyLDg5MCBMNjAyLDg5MCBRNTk2LDg5MCA1OTYsODg0IFoiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mNyB9fSIgZD0iTTY2OCw3NTQgTDczNiw3NTQgTDczNiw3ODggTDc2MCw3ODggTDc2MCw4MjIgTDc4NCw4MjIgTDc4NCw4NTYgTDYyMCw4NTYgTDYyMCw4MjIgTDY0NCw4MjIgTDY0NCw3ODggTDY2OCw3ODggWiI+PC9wYXRoPgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjMuNSI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTY2OCw3ODggTDczNiw3ODgiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNjQ0LDgyMiBMNzYwLDgyMiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik02MjAsODU2IEw3ODQsODU2Ij48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KCiAgICAgICAgICAgIDwhLS0gPT09PT0gUFJJT1JJREFERVM6IGVudHJhZGEgPT09PT0gLS0+CiAgICAgICAgICAgIDx0ZXh0IHg9IjcwMiIgeT0iNTU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+UHJpb3JpZGFkZXM8L3RleHQ+CgogICAgICAgICAgICA8cmVjdCBmaWxsPSJ7eyBjLmY5IH19IiB4PSI2NzQiIHk9IjYzMCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjEyNCIgcng9IjgiPjwvcmVjdD4KICAgICAgICAgICAgPHBhdGggc3Ryb2tlLXdpZHRoPSI0IiBkPSJNNjgyLDY1MCBMNzIyLDY1MCI+PC9wYXRoPgogICAgICAgICAgICA8Y2lyY2xlIGZpbGw9Int7IGMuZjkgfX0iIHN0cm9rZS13aWR0aD0iNCIgY3g9IjcxNiIgY3k9IjcwMCIgcj0iNSI+PC9jaXJjbGU+CgogICAgICAgICAgICA8IS0tID09PT09IERFU0FSUk9MTE86IG9maWNpbmEgPT09PT0gLS0+CiAgICAgICAgICAgIDx0ZXh0IHg9Ijg2MCIgeT0iNTU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjE5IiB0ZXh0TGVuZ3RoPSIxNTAiIGxlbmd0aEFkanVzdD0ic3BhY2luZ0FuZEdseXBocyIgZmlsbD0iIzE0MjYxQyIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjUiIHBhaW50LW9yZGVyPSJzdHJva2UiPkRlc2Vudm9sdmltZW50bzwvdGV4dD4KCiAgICAgICAgICAgIDxyZWN0IGZpbGw9Int7IGMuZjMgfX0iIHg9Ijc5OCIgeT0iNjkyIiB3aWR0aD0iMTE4IiBoZWlnaHQ9IjIwIiByeD0iNiI+PC9yZWN0PgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik04MDgsNzEyIEw4MDgsNzUyIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNSIgZD0iTTkwNiw3MTIgTDkwNiw3NTIiPjwvcGF0aD4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mMyB9fSIgeD0iODE4IiB5PSI2ODAiIHdpZHRoPSI3MCIgaGVpZ2h0PSIxMiIgcng9IjUiPjwvcmVjdD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mMyB9fSIgZD0iTTgyNiw2ODAgTDg4Miw2ODAgTDg4OCw2MzIgTDgzMiw2MzIgWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjQiIGQ9Ik04MzcsNjcwIEw4NzgsNjcwIj48L3BhdGg+CiAgICAgICAgICAgIDxyZWN0IGZpbGw9Int7IGMuZjMgfX0iIHg9IjkyMCIgeT0iNjU2IiB3aWR0aD0iMTUiIGhlaWdodD0iNTgiIHJ4PSI3Ij48L3JlY3Q+CiAgICAgICAgICAgIDxyZWN0IGZpbGw9Int7IGMuZjMgfX0iIHg9IjkxNCIgeT0iNzE0IiB3aWR0aD0iMzIiIGhlaWdodD0iMTYiIHJ4PSI3Ij48L3JlY3Q+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNSIgZD0iTTkzMCw3MzAgTDkzMCw3NDQiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggc3Ryb2tlLXdpZHRoPSI1IiBkPSJNOTE2LDc1MiBMOTMwLDc0NCBMOTQ0LDc1MiI+PC9wYXRoPgoKICAgICAgICAgICAge3sgaGlnaGxpZ2h0IH19CiAgICAgICAgICAgIHt7IG1lZGFscyB9fQoKICAgICAgICAgICAgPCEtLSB6b25hcyBzZW5zaWJsZXM6IGNsaWMgc2FsdGEgYSBsYSBwcmVndW50YSAtLT4KICAgICAgICAgICAgPGcgZmlsbD0iI0ZGRkZGRiIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9Im5vbmUiIHN0eWxlPSJjdXJzb3I6IHBvaW50ZXI7Ij4KICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9IjIzOCwyOTIgNTk4LDc0IDk2MCwyOTIiIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBoaXQucjYgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWVudGVyPSJ7eyBvdmVyLnI2IH19IiBzYy1jYW1lbC1vbi1tb3VzZS1sZWF2ZT0ie3sgb3V0IH19Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgPHJlY3QgeD0iMjUyIiB5PSIzMDIiIHdpZHRoPSIzNDYiIGhlaWdodD0iMjA2IiBzYy1jYW1lbC1vbi1jbGljaz0ie3sgaGl0LnIxIH19IiBzYy1jYW1lbC1vbi1tb3VzZS1lbnRlcj0ie3sgb3Zlci5yMSB9fSIgc2MtY2FtZWwtb24tbW91c2UtbGVhdmU9Int7IG91dCB9fSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjYwMiIgeT0iMzAyIiB3aWR0aD0iMzQ2IiBoZWlnaHQ9IjIwNiIgc2MtY2FtZWwtb24tY2xpY2s9Int7IGhpdC5yOCB9fSIgc2MtY2FtZWwtb24tbW91c2UtZW50ZXI9Int7IG92ZXIucjggfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWxlYXZlPSJ7eyBvdXQgfX0iPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSIyNTIiIHk9IjUxMiIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyNDAiIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBoaXQucjAgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWVudGVyPSJ7eyBvdmVyLnIwIH19IiBzYy1jYW1lbC1vbi1tb3VzZS1sZWF2ZT0ie3sgb3V0IH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDYyIiB5PSI1MTIiIHdpZHRoPSIxNjIiIGhlaWdodD0iMjQwIiBzYy1jYW1lbC1vbi1jbGljaz0ie3sgaGl0LnI1IH19IiBzYy1jYW1lbC1vbi1tb3VzZS1lbnRlcj0ie3sgb3Zlci5yNSB9fSIgc2MtY2FtZWwtb24tbW91c2UtbGVhdmU9Int7IG91dCB9fSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjYyOCIgeT0iNTEyIiB3aWR0aD0iMTQ4IiBoZWlnaHQ9IjI0MCIgc2MtY2FtZWwtb24tY2xpY2s9Int7IGhpdC5yOSB9fSIgc2MtY2FtZWwtb24tbW91c2UtZW50ZXI9Int7IG92ZXIucjkgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWxlYXZlPSJ7eyBvdXQgfX0iPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI3ODAiIHk9IjUxMiIgd2lkdGg9IjE2OCIgaGVpZ2h0PSIyNDAiIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBoaXQucjMgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWVudGVyPSJ7eyBvdmVyLnIzIH19IiBzYy1jYW1lbC1vbi1tb3VzZS1sZWF2ZT0ie3sgb3V0IH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iMjUyIiB5PSI3NTYiIHdpZHRoPSI2OTYiIGhlaWdodD0iNjAiIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBoaXQucjcgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWVudGVyPSJ7eyBvdmVyLnI3IH19IiBzYy1jYW1lbC1vbi1tb3VzZS1sZWF2ZT0ie3sgb3V0IH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iOTU0IiB5PSI1NTYiIHdpZHRoPSIyMTYiIGhlaWdodD0iMjYyIiByeD0iMTYiIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBoaXQucjIgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWVudGVyPSJ7eyBvdmVyLnIyIH19IiBzYy1jYW1lbC1vbi1tb3VzZS1sZWF2ZT0ie3sgb3V0IH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDAiIHk9IjgxOCIgd2lkdGg9IjEzMjAiIGhlaWdodD0iOTYiIHJ4PSIyNiIgc2MtY2FtZWwtb24tY2xpY2s9Int7IGhpdC5yNCB9fSIgc2MtY2FtZWwtb24tbW91c2UtZW50ZXI9Int7IG92ZXIucjQgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWxlYXZlPSJ7eyBvdXQgfX0iPjwvcmVjdD4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgPC9nPgogICAgICAgIDwvc3ZnPgogICAgICAgIDxkaXYgY2xhc3M9ImNiLWNhcHRpb24iIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTRweDsgY29sb3I6ICM1OTYxNUE7IG1hcmdpbi10b3A6IDEwcHg7Ij5DbGlxdWUgb3UgdG9xdWUgZW0gdW0gZXNwYcOnbyBwYXJhIGlyIMOgIHBlcmd1bnRhIGNvcnJlc3BvbmRlbnRlPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2ItY2FyZHMiIHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7IGdhcDogMTZweDsgYWxpZ24taXRlbXM6IHN0cmV0Y2g7Ij4KICAgICAgICA8c2MtZm9yIGxpc3Q9Int7IHRpbGVzIH19IiBhcz0idCIgaGludC1wbGFjZWhvbGRlci1jb3VudD0iMTAiPgogICAgICAgICAgPGRpdiByZWY9Int7IHQucmVmIH19IiBzYy1jYW1lbC1vbi1tb3VzZS1lbnRlcj0ie3sgdC5vbkVudGVyIH19IiBzYy1jYW1lbC1vbi1tb3VzZS1sZWF2ZT0ie3sgdC5vbkxlYXZlIH19IiBzdHlsZT0iYmFja2dyb3VuZDogI0ZGRkZGRjsgYm9yZGVyLXJhZGl1czogMThweDsgYm9yZGVyOiAyLjVweCBzb2xpZCB7eyB0LmJvcmRlciB9fTsgb3ZlcmZsb3c6IGhpZGRlbjsgYm94LXNoYWRvdzoge3sgdC5zaGFkb3cgfX07IHRyYW5zaXRpb246IGJveC1zaGFkb3cgLjJzIGVhc2U7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Ij4KICAgICAgICAgICAgPGRpdiBzdHlsZT0iaGVpZ2h0OiA3cHg7IGJhY2tncm91bmQ6IHt7IHQuYWNjZW50IH19OyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgc3R5bGU9InBhZGRpbmc6IDE0cHggMThweCAxOHB4OyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBmbGV4OiAxOyI+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7Ij4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA3cHg7IGZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM1NjQwOEM7IGJhY2tncm91bmQ6ICNGNEVFRkI7IGJvcmRlci1yYWRpdXM6IDIwcHg7IHBhZGRpbmc6IDRweCAxM3B4OyI+e3sgdC5yb29tIH19PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA4MDA7IGZvbnQtc2l6ZTogMjBweDsgY29sb3I6IHt7IHQuYWNjZW50IH19OyI+e3sgdC5iYWRnZSB9fTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyBmb250LXNpemU6IDE1cHg7IGxpbmUtaGVpZ2h0OiAxLjQ1OyBtaW4taGVpZ2h0OiA0NHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc2l6ZTogMTdweDsiPnt7IHQubmFtZSB9fTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNTk2MTVBOyBmb250LXdlaWdodDogNjAwOyI+wrcge3sgdC5kZXNjIH19PC9zcGFuPjwvZGl2PgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbjogMTJweCAwIDZweDsgYmFja2dyb3VuZDogI0ZCRjdGRjsgYm9yZGVyOiAxLjVweCBkYXNoZWQgI0E5OEJENjsgYm9yZGVyLXJhZGl1czogMTNweDsgcGFkZGluZzogMTJweCAxNXB4OyB0ZXh0LXdyYXA6IHByZXR0eTsgZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Ij4KICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGluZS1oZWlnaHQ6IDEuNDU7IGNvbG9yOiAjMkUyNTQ1OyI+e3sgdC5xdWVzdGlvbiB9fTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogNjAwOyBsaW5lLWhlaWdodDogMS40NTsgY29sb3I6ICM2QjVFOEE7IG1hcmdpbi10b3A6IDZweDsiPnt7IHQuaGludCB9fTwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgcm9sZT0iZ3JvdXAiIGFyaWEtbGFiZWw9Int7IHQubmFtZSB9fSIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiAxMnB4OyI+CiAgICAgICAgICAgICAgICA8c2MtZm9yIGxpc3Q9Int7IHQub3B0cyB9fSIgYXM9Im8iIGhpbnQtcGxhY2Vob2xkZXItY291bnQ9IjUiPgogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjYi1vcHQiIHR5cGU9ImJ1dHRvbiIgc2MtY2FtZWwtb24tY2xpY2s9Int7IG8ub25QaWNrIH19IiBhcmlhLXByZXNzZWQ9Int7IG8uYWN0aXZlIH19IiBhcmlhLWxhYmVsPSJ7eyBvLmFyaWEgfX0iIHN0eWxlPSJmbGV4OiAxOyBtaW4taGVpZ2h0OiA0NnB4OyBib3JkZXItcmFkaXVzOiAxMnB4OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDgwMDsgZm9udC1zaXplOiAxN3B4OyBiYWNrZ3JvdW5kOiB7eyBvLmJnIH19OyBjb2xvcjoge3sgby5mZyB9fTsgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4xMnMgZWFzZTsiIHN0eWxlLWhvdmVyPSJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7Ij57eyBvLm4gfX08L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvc2MtZm9yPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgbWFyZ2luLXRvcDogOHB4OyBnYXA6IDEwcHg7IGZvbnQtc2l6ZTogMTIuNXB4OyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogIzU5NjE1QTsiPgogICAgICAgICAgICAgICAgPHNwYW4+MSDCtyB7eyB0LmxvdyB9fTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPjUgwrcge3sgdC5oaWdoIH19PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxzYy1pZiB2YWx1ZT0ie3sgdC5hbnN3ZXJlZCB9fSIgaGludC1wbGFjZWhvbGRlci12YWw9Int7IGZhbHNlIH19Ij4KICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDE0cHg7IGJvcmRlci10b3A6IDJweCBkYXNoZWQgI0U0RTBEQTsgcGFkZGluZy10b3A6IDEycHg7Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxMi41cHg7IGZvbnQtd2VpZ2h0OiA4MDA7IGxldHRlci1zcGFjaW5nOiAuMDhlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgY29sb3I6IHt7IHQuYWNjZW50IH19OyI+e3sgdC5zdGF0ZSB9fTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiA3cHg7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDEuNTsgY29sb3I6ICMyQTMzMkM7IHRleHQtd3JhcDogcHJldHR5OyI+e3sgdC50aXAgfX08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvc2MtaWY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zYy1mb3I+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHNjLWlmIHZhbHVlPSJ7eyBoYXNTdGF0cyB9fSIgaGludC1wbGFjZWhvbGRlci12YWw9Int7IHRydWUgfX0iPgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIzMHB4LCAxZnIpKTsgZ2FwOiAxNnB4OyBtYXJnaW4tdG9wOiA0NHB4OyI+CiAgICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogI0ZGRkZGRjsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBib3JkZXItcmFkaXVzOiAxOHB4OyBwYWRkaW5nOiAyMHB4IDIycHg7IGJveC1zaGFkb3c6IDZweCA2cHggMCAjQkRFN0Y3OyI+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEyLjVweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGV0dGVyLXNwYWNpbmc6IC4xZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGNvbG9yOiAjNTk2MTVBOyI+w4FyZWEgbWFpcyBhcXVlY2lkYTwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDgwMDsgZm9udC1zaXplOiAyNHB4OyBtYXJnaW4tdG9wOiA2cHg7IGxpbmUtaGVpZ2h0OiAxLjI7Ij57eyBob3R0ZXN0IH19PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogI0ZGRkZGRjsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBib3JkZXItcmFkaXVzOiAxOHB4OyBwYWRkaW5nOiAyMHB4IDIycHg7IGJveC1zaGFkb3c6IDZweCA2cHggMCAjQkRFN0Y3OyI+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEyLjVweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGV0dGVyLXNwYWNpbmc6IC4xZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGNvbG9yOiAjNTk2MTVBOyI+w4FyZWEgbWFpcyBmcmlhPC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogJ0JhbG9vIDInLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogODAwOyBmb250LXNpemU6IDI0cHg7IG1hcmdpbi10b3A6IDZweDsgbGluZS1oZWlnaHQ6IDEuMjsiPnt7IGNvbGRlc3QgfX08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjRkZGRkZGOyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGJvcmRlci1yYWRpdXM6IDE4cHg7IHBhZGRpbmc6IDIwcHggMjJweDsgYm94LXNoYWRvdzogNnB4IDZweCAwICNGN0Q5RUE7Ij4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMTIuNXB4OyBmb250LXdlaWdodDogNzAwOyBsZXR0ZXItc3BhY2luZzogLjFlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgY29sb3I6ICM1OTYxNUE7Ij5EZXNlcXVpbMOtYnJpbzwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDgwMDsgZm9udC1zaXplOiAyNHB4OyBtYXJnaW4tdG9wOiA2cHg7IGxpbmUtaGVpZ2h0OiAxLjI7Ij57eyBnYXBMYWJlbCB9fTwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzU5NjE1QTsgbWFyZ2luLXRvcDogNHB4OyBsaW5lLWhlaWdodDogMS40OyI+e3sgZ2FwTm90ZSB9fTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICNGRkZGRkY7IGJvcmRlcjogMi41cHggc29saWQgIzE0MjYxQzsgYm9yZGVyLXJhZGl1czogMThweDsgcGFkZGluZzogMjBweCAyMnB4OyBib3gtc2hhZG93OiA2cHggNnB4IDAgI0Y3RDlFQTsiPgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxMi41cHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxldHRlci1zcGFjaW5nOiAuMWVtOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBjb2xvcjogIzU5NjE1QTsiPlByZWNpc2FtIGRlIGF0ZW7Dp8OjbzwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDgwMDsgZm9udC1zaXplOiAyNHB4OyBtYXJnaW4tdG9wOiA2cHg7IGxpbmUtaGVpZ2h0OiAxLjI7Ij57eyBhdHRlbnRpb25MYWJlbCB9fTwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzU5NjE1QTsgbWFyZ2luLXRvcDogNHB4OyBsaW5lLWhlaWdodDogMS40OyI+e3sgYXR0ZW50aW9uTm90ZSB9fTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvc2MtaWY+CgogICAgPHNjLWlmIHZhbHVlPSJ7eyBhbGxBbnN3ZXJlZCB9fSIgaGludC1wbGFjZWhvbGRlci12YWw9Int7IGZhbHNlIH19Ij4KICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMzBweDsgYmFja2dyb3VuZDogI0Y0RUVGQjsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBib3JkZXItcmFkaXVzOiAyNHB4OyBwYWRkaW5nOiAzMHB4IDMwcHggMzRweDsgY29sb3I6ICMxNDI2MUM7IGJveC1zaGFkb3c6IDdweCA3cHggMCAjQ0JCM0YwOyI+CiAgICAgICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA3MjBweDsgbWFyZ2luOiAwIGF1dG87Ij4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA4MDA7IGZvbnQtc2l6ZTogMjRweDsgdGV4dC1hbGlnbjogY2VudGVyOyI+TWV1IGNvbXByb21pc3NvIGRlc3RhIHNlbWFuYTwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE1cHg7IGNvbG9yOiAjNTY0MDhDOyBtYXJnaW4tdG9wOiA4cHg7IGxpbmUtaGVpZ2h0OiAxLjU1OyB0ZXh0LXdyYXA6IHByZXR0eTsiPnt7IGNvbW1pdFByb21wdCB9fTwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4OyBtYXJnaW4tdG9wOiAyMHB4OyI+CiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ2FwOiA2cHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICMzQTJFNTI7Ij7DgXJlYSBlbSBxdWUgdm91IGFnaXIKICAgICAgICAgICAgICA8c2MtcmF3LXNlbGVjdCBjbGFzcz0iY2ItaW5wIiB2YWx1ZT0ie3sgY29tbWl0QXJlYSB9fSIgc2MtY2FtZWwtb24tY2hhbmdlPSJ7eyBvbkNvbW1pdEFyZWEgfX0iIHN0eWxlPSJmb250LWZhbWlseTogTnVuaXRvLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE1cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDEzcHggMTRweDsgYm9yZGVyLXJhZGl1czogMTNweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBjb2xvcjogIzE0MjYxQzsiPgogICAgICAgICAgICAgICAgPHNjLWZvciBsaXN0PSJ7eyBhcmVhT3B0aW9ucyB9fSIgYXM9ImEiIGhpbnQtcGxhY2Vob2xkZXItY291bnQ9IjEwIj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ie3sgYS52YWx1ZSB9fSI+e3sgYS5sYWJlbCB9fTwvb3B0aW9uPgogICAgICAgICAgICAgICAgPC9zYy1mb3I+CiAgICAgICAgICAgICAgPC9zYy1yYXctc2VsZWN0PgogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICA8bGFiZWwgc3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdhcDogNnB4OyBmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjM0EyRTUyOyI+QcOnw6NvIGNvbmNyZXRhCiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjYi1pbnAiIHR5cGU9InRleHQiIHZhbHVlPSJ7eyBjb21taXRUZXh0IH19IiBzYy1jYW1lbC1vbi1jaGFuZ2U9Int7IG9uQ29tbWl0VGV4dCB9fSIgcGxhY2Vob2xkZXI9IkV4LjogbGlnYXIgcGFyYSBtaW5oYSBpcm3DoyBuYSBxdWludGEtZmVpcmEgw6Agbm9pdGUiIHN0eWxlPSJmb250LWZhbWlseTogTnVuaXRvLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE1cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDEzcHggMTRweDsgYm9yZGVyLXJhZGl1czogMTNweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBjb2xvcjogIzE0MjYxQzsiPgogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICA8bGFiZWwgc3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdhcDogNnB4OyBmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjM0EyRTUyOyI+QXTDqSBxdWFuZG8KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNiLWlucCIgdHlwZT0iZGF0ZSIgdmFsdWU9Int7IGNvbW1pdERhdGUgfX0iIHNjLWNhbWVsLW9uLWNoYW5nZT0ie3sgb25Db21taXREYXRlIH19IiBzdHlsZT0iZm9udC1mYW1pbHk6IE51bml0bywgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxNXB4OyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiAxM3B4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDEzcHg7IGJvcmRlcjogMi41cHggc29saWQgIzE0MjYxQzsgYmFja2dyb3VuZDogI0ZGRkZGRjsgY29sb3I6ICMxNDI2MUM7Ij4KICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMTRweDsgZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzZCNUU4QTsgdGV4dC1hbGlnbjogY2VudGVyOyI+e3sgY29tbWl0U3RhdHVzIH19PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9zYy1pZj4KCiAgICA8c2MtaWYgdmFsdWU9Int7IGFsbEFuc3dlcmVkIH19IiBoaW50LXBsYWNlaG9sZGVyLXZhbD0ie3sgZmFsc2UgfX0iPgogICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAyMnB4OyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGJvcmRlci1yYWRpdXM6IDI0cHg7IHBhZGRpbmc6IDI2cHggMzBweCAzMHB4OyBjb2xvcjogIzE0MjYxQzsgYm94LXNoYWRvdzogN3B4IDdweCAwICNCREU3Rjc7Ij4KICAgICAgICA8ZGl2IHN0eWxlPSJtYXgtd2lkdGg6IDcyMHB4OyBtYXJnaW46IDAgYXV0bzsiPgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDgwMDsgZm9udC1zaXplOiAyMnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij5BbGd1bnMgZGFkb3Mgb3BjaW9uYWlzPC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTRweDsgY29sb3I6ICM1OTYxNUE7IGZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi10b3A6IDZweDsiPlZvY8OqIHBvZGUgZGVpeGFyIHR1ZG8gZW0gYnJhbmNvLjwvZGl2PgoKICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDIwcHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICMzQTQ0M0U7Ij5JZGFkZTwvZGl2PgogICAgICAgICAgPGRpdiByb2xlPSJncm91cCIgYXJpYS1sYWJlbD0iSWRhZGUiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiA4cHg7Ij4KICAgICAgICAgICAgPHNjLWZvciBsaXN0PSJ7eyBhZ2VPcHRpb25zIH19IiBhcz0iYSIgaGludC1wbGFjZWhvbGRlci1jb3VudD0iNSI+CiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBhLm9uUGljayB9fSIgYXJpYS1wcmVzc2VkPSJ7eyBhLmFjdGl2ZSB9fSIgc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc2l6ZTogMTRweDsgbWluLWhlaWdodDogNDRweDsgcGFkZGluZzogMTBweCAxOHB4OyBib3JkZXItcmFkaXVzOiA0MHB4OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGN1cnNvcjogcG9pbnRlcjsgYmFja2dyb3VuZDoge3sgYS5iZyB9fTsgY29sb3I6IHt7IGEuZmcgfX07Ij57eyBhLmxhYmVsIH19PC9idXR0b24+CiAgICAgICAgICAgIDwvc2MtZm9yPgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4OyBtYXJnaW4tdG9wOiAyMHB4OyI+CiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ2FwOiA2cHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICMzQTQ0M0U7Ij5DaWRhZGUgZSBwYcOtcwogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY2ItaW5wIiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjgwIiB2YWx1ZT0ie3sgY3R4Q2l0eSB9fSIgc2MtY2FtZWwtb24tY2hhbmdlPSJ7eyBvbkN0eENpdHkgfX0iIHBsYWNlaG9sZGVyPSJFeC46IFPDo28gUGF1bG8sIEJyYXNpbCIgc3R5bGU9ImZvbnQtZmFtaWx5OiBOdW5pdG8sIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDYwMDsgcGFkZGluZzogMTNweCAxNHB4OyBib3JkZXItcmFkaXVzOiAxM3B4OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGJhY2tncm91bmQ6ICNGRkZGRkY7IGNvbG9yOiAjMTQyNjFDOyI+CiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ2FwOiA2cHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICMzQTQ0M0U7Ij5PY3VwYcOnw6NvCiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjYi1pbnAiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iODAiIHZhbHVlPSJ7eyBjdHhKb2IgfX0iIHNjLWNhbWVsLW9uLWNoYW5nZT0ie3sgb25DdHhKb2IgfX0iIHBsYWNlaG9sZGVyPSJFeC46IGRlc2lnbmVyLCBwcm9mZXNzb3JhLCBwcm9maXNzaW9uYWwgYXV0w7Rub21hIiBzdHlsZT0iZm9udC1mYW1pbHk6IE51bml0bywgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxNXB4OyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiAxM3B4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDEzcHg7IGJvcmRlcjogMi41cHggc29saWQgIzE0MjYxQzsgYmFja2dyb3VuZDogI0ZGRkZGRjsgY29sb3I6ICMxNDI2MUM7Ij4KICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDE2cHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICM1OTYxNUE7IGxpbmUtaGVpZ2h0OiAxLjU1OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHRleHQtd3JhcDogcHJldHR5OyI+TsOjbyBwZWRpbW9zIHNldSBub21lIG5lbSBzZXUgZS1tYWlsLiBFc3NlcyBkYWRvcyBub3MgYWp1ZGFtIGEgY29tcHJlZW5kZXIgY29tbyBkaWZlcmVudGVzIHBlc3NvYXMgdml2ZW5jaWFtIHNldSBlcXVpbMOtYnJpby48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3NjLWlmPgoKICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDQycHg7IGZsZXgtd3JhcDogd3JhcDsiPgogICAgICA8YnV0dG9uIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBvbkV4cG9ydCB9fSIgZGlzYWJsZWQ9Int7IGV4cG9ydERpc2FibGVkIH19IiBzdHlsZT0iZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgYmFja2dyb3VuZDoge3sgZXhwb3J0QmcgfX07IGJvcmRlcjogMi41cHggc29saWQgIzE0MjYxQzsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDE0cHggMzBweDsgYm9yZGVyLXJhZGl1czogNDBweDsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNzAwOyBjdXJzb3I6IHt7IGV4cG9ydEN1cnNvciB9fTsgYm94LXNoYWRvdzogNHB4IDRweCAwICMxNDI2MUM7IiBzdHlsZS1ob3Zlcj0idHJhbnNmb3JtOiB0cmFuc2xhdGUoMnB4LCAycHgpOyBib3gtc2hhZG93OiAycHggMnB4IDAgIzE0MjYxQzsiPnt7IGV4cG9ydExhYmVsIH19PC9idXR0b24+CiAgICAgIDxidXR0b24gc2MtY2FtZWwtb24tY2xpY2s9Int7IG9uUmVzZXQgfX0iIHN0eWxlPSJmb250LWZhbWlseTogJ0JhbG9vIDInLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kOiB7eyByZXNldEJnIH19OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGNvbG9yOiAjMTQyNjFDOyBwYWRkaW5nOiAxM3B4IDI2cHg7IGJvcmRlci1yYWRpdXM6IDQwcHg7IGZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDcwMDsgY3Vyc29yOiBwb2ludGVyOyBib3gtc2hhZG93OiA0cHggNHB4IDAgI0U5RTRERDsiIHN0eWxlLWhvdmVyPSJ0cmFuc2Zvcm06IHRyYW5zbGF0ZSgycHgsIDJweCk7IGJveC1zaGFkb3c6IDJweCAycHggMCAjRTlFNEREOyI+e3sgcmVzZXRMYWJlbCB9fTwvYnV0dG9uPgogICAgPC9kaXY+CgogICAgPHAgc3R5bGU9Im1heC13aWR0aDogNzYwcHg7IG1hcmdpbjogMThweCBhdXRvIDA7IHRleHQtYWxpZ246IGNlbnRlcjsgdGV4dC13cmFwOiBiYWxhbmNlOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxLjY7IGNvbG9yOiAjNTk2MTVBOyBmb250LXdlaWdodDogNjAwOyI+U3VhcyByZXNwb3N0YXMgc8OjbyBhcm1hemVuYWRhcyBkZSBmb3JtYSBhbsO0bmltYS4gQSBpbWFnZW0gcXVlIHZvY8OqIGJhaXhhciDDqSBzw7Mgc3VhLiA8YnI+R3VhcmRlLWEgZSByZWZhw6dhIG8gZXhlcmPDrWNpbyBkYXF1aSBhIGFsZ3VtIHRlbXBvIHBhcmEgY29tcGFyYXIgc3VhcyBjYXNhcyBlIHBlcmNlYmVyIG8gcXVlIG11ZG91LjwvcD4KCiAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAzNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGRpc3BsYXk6IHt7IHByZXZpZXdEaXNwbGF5IH19OyI+CiAgICAgIDxjYW52YXMgcmVmPSJ7eyBjYW52YXNSZWYgfX0iIHdpZHRoPSI4MjAiIGhlaWdodD0iMTYwMCIgc3R5bGU9Im1heC13aWR0aDogMTAwJTsgaGVpZ2h0OiBhdXRvOyBib3JkZXItcmFkaXVzOiAxNnB4OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGJveC1zaGFkb3c6IDhweCA4cHggMCAjQ0JCM0YwOyI+PC9jYW52YXM+CiAgICAgIDxkaXY+CiAgICAgICAgPGEgcmVmPSJ7eyBsaW5rUmVmIH19IiBkb3dubG9hZD0ibWluaGEtY2FzYS1kby1lcXVpbGlicmlvLnBuZyIgc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXRvcDogMjBweDsgYmFja2dyb3VuZDogIzE0MjYxQzsgY29sb3I6ICNmZmY7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgcGFkZGluZzogMTNweCAzMHB4OyBib3JkZXItcmFkaXVzOiA0MHB4OyBmb250LXNpemU6IDE1cHg7IGZvbnQtd2VpZ2h0OiA3MDA7Ij5CYWl4YXIgaW1hZ2VtPC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICA8L2Rpdj48L2Rpdj4KPC94LWRjPgo8c2NyaXB0IHR5cGU9InRleHQveC1kYyIgZGF0YS1kYy1zY3JpcHQ9IiIgZGF0YS1wcm9wcz0ieyZxdW90O3Nob3dSZWZsZWN0aW9uJnF1b3Q7OnsmcXVvdDtlZGl0b3ImcXVvdDs6JnF1b3Q7Ym9vbGVhbiZxdW90OywmcXVvdDtkZWZhdWx0JnF1b3Q7OnRydWUsJnF1b3Q7dHNUeXBlJnF1b3Q7OiZxdW90O2Jvb2xlYW4mcXVvdDssJnF1b3Q7c2VjdGlvbiZxdW90OzomcXVvdDtDb250ZW5pZG8mcXVvdDt9fSI+CmNvbnN0IERPTUFJTlMgPSBbCiAge2lkOjAsa2V5OiJyNyIsbmFtZToiUHJvcMOzc2l0byIsZGVzYzoiTyBxdWUgZMOhIHVtIHNlbnRpZG8gcHJvZnVuZG8gw6AgbWluaGEgdmlkYSIscm9vbToiQWxpY2VyY2UiLAogICBxdWVzdGlvbjoiTyBxdWUgZmHDp28gZXN0w6EgY29uZWN0YWRvIGEgYWxnbyBxdWUgZMOhIHNlbnRpZG8gw6AgbWluaGEgdmlkYT8iLAogICBoaW50OiJQYXJhIGFsw6ltIGRlIHNpbXBsZXNtZW50ZSBkYXIgY29udGEgZG8gZGlhIGEgZGlhLiIsbG93OiJRdWFzZSBuYWRhIixoaWdoOiJNdWl0byIsCiAgIHRpcHM6e2Jham86IlJlY29uaGXDp2EuIEZhw6dhIHVtYSBsaXN0YSBkZSB0csOqcyBjb2lzYXMgw6BzIHF1YWlzIHZvY8OqIGdvc3RhcmlhIGRlIGRlZGljYXIgbWFpcyB0ZW1wbyBwb3JxdWUgc8OjbyBpbXBvcnRhbnRlcyBwYXJhIHZvY8OqLiIsCiAgICAgICAgIG1lZGlvOiJFc2NvbGhhLiBJZGVudGlmaXF1ZSB1bWEgYXRpdmlkYWRlIHF1ZSBmYcOnYSBzZW50aWRvIHBhcmEgdm9jw6ogZSBkZWNpZGEgbyBxdWUgcG9kZSBmYXplciBwYXJhIGRhciBtYWlzIGVzcGHDp28gYSBlbGEuIiwKICAgICAgICAgYWx0bzoiUHJvdGVqYS4gSWRlbnRpZmlxdWUgdW1hIGF0aXZpZGFkZSBxdWUgY29uZWN0YSB2b2PDqiBhbyBxdWUgw6kgaW1wb3J0YW50ZSBlIGV2aXRlIHF1ZSBvdXRyYXMgZGVtYW5kYXMgb2N1cGVtIG8gbHVnYXIgZGVsYS4ifX0sCiAge2lkOjEsa2V5OiJyOSIsbmFtZToiUHJpb3JpZGFkZXMiLGRlc2M6IlZpdmVyIGRlIGFjb3JkbyBjb20gbyBxdWUgbWFpcyBpbXBvcnRhIHBhcmEgbWltIixyb29tOiJFbnRyYWRhIiwKICAgcXVlc3Rpb246IkVzdG91IHZpdmVuZG8gaG9qZSBkZSBhY29yZG8gY29tIG8gcXVlIG1haXMgaW1wb3J0YSBwYXJhIG1pbT8iLAogICBoaW50OiJPIHF1ZSDDqSBpbXBvcnRhbnRlLCBuw6NvIGFwZW5hcyBvIHF1ZSDDqSB1cmdlbnRlLiIsbG93OiJWb3Ugbm8gcGlsb3RvIGF1dG9tw6F0aWNvIixoaWdoOiJDb20gaW50ZW7Dp8OjbyIsCiAgIHRpcHM6e2Jham86IkNvbXBhcmUuIEVzY3JldmEgc3VhcyB0csOqcyBwcmlvcmlkYWRlcyBhdHVhaXMgZSBjb21wYXJlLWFzIGNvbSBhIGZvcm1hIGNvbW8gdm9jw6ogZXN0w6EgdXNhbmRvIHNldSB0ZW1wby4iLAogICAgICAgICBtZWRpbzoiQWp1c3RlLiBFc2NvbGhhIHVtYSBkZSBzdWFzIHByaW9yaWRhZGVzIGUgbW9kaWZpcXVlIHVtYSBhw6fDo28gY29uY3JldGEgcGFyYSBkYXIgYSBlbGEgbyBlc3Bhw6dvIHF1ZSBtZXJlY2UuIiwKICAgICAgICAgYWx0bzoiUmV2aXNlLiBPYnNlcnZlIHN1YXMgcHJpb3JpZGFkZXMgZSBkZWNpZGEgcXVhaXMgZGVzZWphIG1hbnRlciwgbXVkYXIgb3UgZGVpeGFyIGRlIHByaW9yaXphci4ifX0sCiAge2lkOjIsa2V5OiJyOCIsbmFtZToiQmVtLWVzdGFyIixkZXNjOiJNZXUgZXF1aWzDrWJyaW8gZW50cmUgY29ycG8sIG1lbnRlIGUgZW1vw6fDtWVzIixyb29tOiJCYW5oZWlybyIsCiAgIHF1ZXN0aW9uOiJDdWlkbyBkbyBtZXUgY29ycG8sIGRhIG1pbmhhIG1lbnRlIGUgZGFzIG1pbmhhcyBlbW/Dp8O1ZXMgZGUgZm9ybWEgY29uc2NpZW50ZT8iLAogICBoaW50OiJBdMOpIGNoZWdhciBhbyBsaW1pdGUsIG7Do28gZGVwb2lzLiIsbG93OiJTw7MgcmVham8iLGhpZ2g6IkN1aWRvIGRpYXJpYW1lbnRlIiwKICAgdGlwczp7YmFqbzoiQWdlbmRlLiBSZXNlcnZlIHVtIHRlbXBvIHBhcmEgZGVzY2Fuc2FyLCBtb3ZpbWVudGFyIG8gY29ycG8gb3UgY3VpZGFyIGRlIHVtYSBuZWNlc3NpZGFkZSBkZSBzYcO6ZGUuIiwKICAgICAgICAgbWVkaW86IlJlc3BvbmRhLiBJZGVudGlmaXF1ZSB1bSBzaW5hbCBkZSBjYW5zYcOnbywgdGVuc8OjbyBvdSBzb2JyZWNhcmdhIGUgZXNjb2xoYSB1bWEgYcOnw6NvIGNvbmNyZXRhIHBhcmEgY3VpZGFyIGRlbGUuIiwKICAgICAgICAgYWx0bzoiU2ltcGxpZmlxdWUuIEVzY29saGEgdW1hIHByw6F0aWNhIGRlIGN1aWRhZG8gcXVlIHZvY8OqIGNvbnNpZ2EgbWFudGVyIG1lc21vIHF1YW5kbyBzdWFzIHJlc3BvbnNhYmlsaWRhZGVzIGF1bWVudGFyZW0uIn19LAogIHtpZDozLGtleToicjEiLG5hbWU6IkVzcGHDp28gcGVzc29hbCIsZGVzYzoiVGVtcG8gZSBlc3Bhw6dvIHF1ZSByZXNlcnZvIHPDsyBwYXJhIG1pbSIscm9vbToiUXVhcnRvIiwKICAgcXVlc3Rpb246IkV1IG1lIHBlcm1pdG8gdGVyIGVzcGHDp29zIHPDsyBtZXVzLCBzZW0gY3VscGE/IiwKICAgaGludDoiQ29uc2lkZXJlIG8gdGVtcG8gcXVlIHZvY8OqIGVzY29saGUgcmVzZXJ2YXIsIG7Do28gYXBlbmFzIG8gcXVlIHNvYnJhLiIsbG93OiJRdWFzZSBudW5jYSIsaGlnaDoiUXVhc2Ugc2VtcHJlIiwKICAgdGlwczp7YmFqbzoiUmVzZXJ2ZS4gQmxvcXVlaWUgMjAgbWludXRvcyBzw7MgcGFyYSB2b2PDqiBlIG1hcnF1ZSBlc3NlIHBlcsOtb2RvIGNvbW8gb2N1cGFkbyBuYSBhZ2VuZGEuIiwKICAgICAgICAgbWVkaW86IlJldG9tZS4gRXNjb2xoYSB1bWEgYXRpdmlkYWRlIGRlIHF1ZSB2b2PDqiBnb3N0YXZhIGUgZGVpeG91IGRlIGZhemVyLiBSZXNlcnZlIHVtIHRlbXBvIHBhcmEgcmV0b23DoS1sYS4iLAogICAgICAgICBhbHRvOiJQcm90ZWphLiBJZGVudGlmaXF1ZSBvIHF1ZSBhanVkYSB2b2PDqiBhIHRlciB0ZW1wbyBwYXJhIHNpIGUgcHJlc2VydmUgZXNzYXMgY29uZGnDp8O1ZXMuIn19LAogIHtpZDo0LGtleToicjYiLG5hbWU6IkNyZXNjaW1lbnRvIixkZXNjOiJNZXUgaW52ZXN0aW1lbnRvIGVtIG1pbSBjb21vIHBlc3NvYSwgcGFyYSBhbMOpbSBkbyB0cmFiYWxobyIscm9vbToiU8OzdMOjbyIsCiAgIHF1ZXN0aW9uOiJFc3RvdSBpbnZlc3RpbmRvIGVtIGFsZ28gcXVlIG1lIGVucmlxdWVjZSBjb21vIHBlc3NvYT8iLAogICBoaW50OiJQYXJhIGFsw6ltIGRhIHZpZGEgcHJvZmlzc2lvbmFsLiIsbG93OiJFc3TDoSBlbSBwYXVzYSIsaGlnaDoiTXVpdG8gYXRpdm8iLAogICB0aXBzOntiYWpvOiJDb21lY2UuIETDqiBvIHByaW1laXJvIHBhc3NvIGNvbSBhcXVlbGUgbGl2cm8sIGN1cnNvIG91IGFwcmVuZGl6YWRvIHF1ZSB2b2PDqiB2ZW0gYWRpYW5kbyBow6EgYWxndW0gdGVtcG8uIiwKICAgICAgICAgbWVkaW86IlJldG9tZS4gRXNjb2xoYSB1bSBhcHJlbmRpemFkbyBxdWUgdm9jw6ogaW50ZXJyb21wZXUgZSBkZWZpbmEgdW1hIGHDp8OjbyBjb25jcmV0YSBwYXJhIGRhciBjb250aW51aWRhZGUgYSBlbGUuIiwKICAgICAgICAgYWx0bzoiQ29uc29saWRlLiBFc2NvbGhhIGFsZ28gcXVlIHZvY8OqIGVzdGVqYSBhcHJlbmRlbmRvIGUgZW5jb250cmUgdW1hIGZvcm1hIGNvbmNyZXRhIGRlIGNvbG9jw6EtbG8gZW0gcHLDoXRpY2EuIn19LAogIHtpZDo1LGtleToicjMiLG5hbWU6IkRlc2Vudm9sdmltZW50byIsZGVzYzoiQXByZW5kaXphZG8gZSBwcm9ncmVzc28gbmEgbWluaGEgZnVuw6fDo28gYXR1YWwiLHJvb206IkVzY3JpdMOzcmlvIiwKICAgcXVlc3Rpb246IlNpbnRvIHF1ZSBlc3RvdSBhcHJlbmRlbmRvIGUgY3Jlc2NlbmRvIG5vIG1ldSB0cmFiYWxobz8iLAogICBoaW50OiJBcHJlbmRlciBkZSB2ZXJkYWRlLCBuw6NvIGFwZW5hcyBhY3VtdWxhciB0YXJlZmFzLiIsbG93OiJQaWxvdG8gYXV0b23DoXRpY28iLGhpZ2g6IkNyZXPDp28gYSBjYWRhIHNlbWFuYSIsCiAgIHRpcHM6e2Jham86IkNvbWVjZS4gRXNjb2xoYSB1bWEgaGFiaWxpZGFkZSBxdWUgdm9jw6ogZGVzZWphIGZvcnRhbGVjZXIgZSBkw6ogdW0gcHJpbWVpcm8gcGFzc28gY29uY3JldG8gcGFyYSBkZXNlbnZvbHbDqi1sYS4iLAogICAgICAgICBtZWRpbzoiUmV0b21lLiBFc2NvbGhhIHVtYSBtZXRhIHByb2Zpc3Npb25hbCBxdWUgdm9jw6ogZGVpeG91IGVtIHBhdXNhIGUgZGVmaW5hIHVtYSBhw6fDo28gY29uY3JldGEgcGFyYSByZXRvbcOhLWxhLiIsCiAgICAgICAgIGFsdG86IlN1c3RlbnRlLiBJZGVudGlmaXF1ZSB1bWEgYXRpdmlkYWRlIHF1ZSBlc3RlamEgaW1wdWxzaW9uYW5kbyBzZXUgZGVzZW52b2x2aW1lbnRvIHByb2Zpc3Npb25hbCBlIHJlc2VydmUgdGVtcG8gcGFyYSBjb250aW51w6EtbGEuIn19LAogIHtpZDo2LGtleToicjUiLG5hbWU6IkZpbmFuw6dhcyIsZGVzYzoiTWluaGFzIGRlY2lzw7VlcyBmaW5hbmNlaXJhcyBjb25zY2llbnRlcyIscm9vbToiQ296aW5oYSIsCiAgIHF1ZXN0aW9uOiJBZG1pbmlzdHJvIG1ldXMgcmVjdXJzb3MgZmluYW5jZWlyb3MgY29tIGNsYXJlemE/IiwKICAgaGludDoiQ29tIGRlY2lzw7VlcyBjb25zY2llbnRlcywgbsOjbyBwb3IgaW7DqXJjaWEuIixsb3c6IlBvciBpbsOpcmNpYSIsaGlnaDoiQ29tIGNsYXJlemEiLAogICB0aXBzOntiYWpvOiJSZXZpc2UuIE9ic2VydmUgc2V1cyBnYXN0b3MgcmVjZW50ZXMgZSBpZGVudGlmaXF1ZSB1bSBxdWUgcG9zc2EgcmVkdXppciwgZWxpbWluYXIgb3UgcGxhbmVqYXIgbWVsaG9yLiIsCiAgICAgICAgIG1lZGlvOiJQcmlvcml6ZS4gRXNjb2xoYSB1bWEgcHJpb3JpZGFkZSBpbXBvcnRhbnRlIHBhcmEgdm9jw6ogZSB2ZXJpZmlxdWUgc2Ugc3VhcyBkZWNpc8O1ZXMgZGUgZ2FzdG8gZXN0w6NvIGFsaW5oYWRhcyBhIGVsYS4iLAogICAgICAgICBhbHRvOiJBbnRlY2lwZS1zZS4gVmVyaWZpcXVlIHF1YWwgbWFyZ2VtIHZvY8OqIHRlbSBwYXJhIHVtIGdhc3RvIGluZXNwZXJhZG8gZSBkZWZpbmEgbyBxdWUgcG9kZXJpYSBhanVzdGFyIHNlIGZvc3NlIG5lY2Vzc8OhcmlvLiJ9fSwKICB7aWQ6NyxrZXk6InIwIixuYW1lOiJSZWxhY2lvbmFtZW50b3MiLGRlc2M6IkNvbW8gY3VsdGl2byBtZXVzIHbDrW5jdWxvcyBtYWlzIHByw7N4aW1vcyIscm9vbToiU2FsYSIsCiAgIHF1ZXN0aW9uOiJUZW5obyBlc3RhZG8gcHJlc2VudGUgZGUgdmVyZGFkZSBjb20gYXMgcGVzc29hcyBpbXBvcnRhbnRlcyBkYSBtaW5oYSB2aWRhPyIsCiAgIGhpbnQ6IlByZXNlbnRlIGRlIHZlcmRhZGUsIG7Do28gYXBlbmFzIGZpc2ljYW1lbnRlLiIsbG93OiJRdWFzZSBudW5jYSIsaGlnaDoiUXVhc2Ugc2VtcHJlIiwKICAgdGlwczp7YmFqbzoiUmVjb25lY3RlLXNlLiBFc2NyZXZhIHBhcmEgdW1hIHBlc3NvYSBjb20gcXVlbSBwZXJkZXUgY29udGF0byBlIHByb3BvbmhhIHVtIG1vbWVudG8gcGFyYSBjb252ZXJzYXIuIiwKICAgICAgICAgbWVkaW86IkRlc2NvbmVjdGUtc2UgcGFyYSBzZSBjb25lY3Rhci4gRXNjb2xoYSB1bWEgY29udmVyc2EgZSBkZWl4ZSBvIGNlbHVsYXIgZ3VhcmRhZG8gYXTDqSBlbGEgdGVybWluYXIuIiwKICAgICAgICAgYWx0bzoiUHJvdGVqYS4gSWRlbnRpZmlxdWUgdW0gaMOhYml0byBxdWUgYWp1ZGEgdm9jw6ogYSBjdWlkYXIgZG9zIHNldXMgcmVsYWNpb25hbWVudG9zIGUgcmVzZXJ2ZSB1bSB0ZW1wbyBwYXJhIG1hbnTDqi1sby4ifX0sCiAge2lkOjgsa2V5OiJyMiIsbmFtZToiVmlkYSBzb2NpYWwiLGRlc2M6IlByYXplciBlIGNvbmV4w6NvIGNvbSBvdXRyYXMgcGVzc29hcyBmb3JhIGRvIHRyYWJhbGhvIixyb29tOiJWYXJhbmRhIiwKICAgcXVlc3Rpb246IkluY2x1byBtb21lbnRvcyBkZSBwcmF6ZXIgZSBjb25leMOjbyBjb20gb3V0cmFzIHBlc3NvYXM/IiwKICAgaGludDoiRm9yYSBkbyB0cmFiYWxobyBlIGRhcyBvYnJpZ2HDp8O1ZXMuIixsb3c6IlF1YXNlIG51bmNhIixoaWdoOiJRdWFzZSBzZW1wcmUiLAogICB0aXBzOntiYWpvOiJBdGl2ZS4gRXNjb2xoYSB1bWEgcGVzc29hIGNvbSBxdWVtIHZvY8OqIGdvc3RhIGRlIGVzdGFyIGUgY29udmlkZS1hIHBhcmEgZmF6ZXIgYWxnbyBzaW1wbGVzIGp1bnRvcy4iLAogICAgICAgICBtZWRpbzoiUHJpb3JpemUuIElkZW50aWZpcXVlIHF1YWlzIGVuY29udHJvcyBlIGF0aXZpZGFkZXMgc29jaWFpcyB2b2PDqiByZWFsbWVudGUgYXByZWNpYSBlIGTDqiBwcmlvcmlkYWRlIGEgZWxlcywgZW0gdmV6IGRlIHBhcnRpY2lwYXIgYXBlbmFzIHBvciBvYnJpZ2HDp8Ojby4iLAogICAgICAgICBhbHRvOiJFcXVpbGlicmUuIE1hbnRlbmhhIG9zIG1vbWVudG9zIGRlIGNvbnZpdsOqbmNpYSBkZSBxdWUgdm9jw6ogZ29zdGEgc2VtIHNhY3JpZmljYXIgc2V1IGRlc2NhbnNvIG5lbSBzZXUgdGVtcG8gcGVzc29hbC4ifX0sCiAge2lkOjksa2V5OiJyNCIsbmFtZToiTWV1IGFtYmllbnRlIixkZXNjOiJPcyBlc3Bhw6dvcyBvbmRlIG1vcm8gZSB0cmFiYWxobyIscm9vbToiSmFyZGltIiwKICAgcXVlc3Rpb246Ik9zIGVzcGHDp29zIG9uZGUgbW9ybyBlIHRyYWJhbGhvIG1lIGZhemVtIGJlbT8iLAogICBoaW50OiJNaW5oYSBjYXNhIGUgbWV1IGxvY2FsIGRlIHRyYWJhbGhvLiIsbG93OiJNZSBkZXNnYXN0YW0iLGhpZ2g6Ik1lIGZhemVtIGJlbSIsCiAgIHRpcHM6e2Jham86Ik9yZ2FuaXplLiBFc2NvbGhhIHVtIGVzcGHDp28gZGEgc3VhIGNhc2Egb3UgZG8gc2V1IGxvY2FsIGRlIHRyYWJhbGhvIGUgZGVkaXF1ZSBhbGd1bnMgbWludXRvcyBwYXJhIGFycnVtw6EtbG8uIiwKICAgICAgICAgbWVkaW86Ik11ZGUuIElkZW50aWZpcXVlIGFsZ28gbm8gc2V1IGFtYmllbnRlIHF1ZSBjYXVzZSBpbmPDtG1vZG8gb3UgZGlzdHJhw6fDo28gZSBtb2RpZmlxdWUtby4iLAogICAgICAgICBhbHRvOiJBanVzdGUuIE9ic2VydmUgc2V1IGVzcGHDp28gZSBtdWRlIHVtIGRldGFsaGUgcXVlIHBvc3NhIHRvcm7DoS1sbyBtYWlzIGNvbmZvcnTDoXZlbCBvdSBmdW5jaW9uYWwuIn19Cl07Cgpjb25zdCBTVEFURVMgPSBbIiIsIkZyaW8gwrcgcXVhc2Ugc2VtIGF0ZW7Dp8OjbyIsIk1vcm5vIMK3IGF0ZW7Dp8OjbyBvY2FzaW9uYWwiLCJNb2RlcmFkbyDCtyBhdGVuw6fDo28gcGFyY2lhbCIsIkFxdWVjaWRvIMK3IGJvYSBhdGVuw6fDo28iLCJRdWVudGUgwrcgYXRlbsOnw6NvIHBsZW5hIl07CmNvbnN0IEdFT00gPSB7CiAgcjY6e3R5cGU6InBvbHkiLHBvaW50czoiMjQ2LDI5MCA1OTgsODAgOTUyLDI5MCJ9LAogIHIxOnt4OjI1OCx5OjMwOCx3OjMzNCxoOjE5NH0sIHI4Ont4OjYwOCx5OjMwOCx3OjMzNCxoOjE5NH0sCiAgcjA6e3g6MjU4LHk6NTE4LHc6MTk0LGg6MjI4fSwgcjU6e3g6NDY4LHk6NTE4LHc6MTUwLGg6MjI4fSwKICByOTp7eDo2MzQseTo1MTgsdzoxMzYsaDoyMjh9LCByMzp7eDo3ODYseTo1MTgsdzoxNTYsaDoyMjh9LAogIHI3Ont4OjI1OCx5Ojc2MSx3OjY4NCxoOjUwLHI6NH0sIHIyOnt4Ojk2MCx5OjU2Mix3OjIwNCxoOjI1MCxyOjEyfSwKICByNDp7eDo0Nyx5OjgyNSx3OjEzMDYsaDo4MixyOjIyfQp9OwoKZnVuY3Rpb24gaGVhdFJHQih2KXsKICBjb25zdCB0NSA9ICh2IC0gMSkgLyA0LCBjeWFuID0gWzAsMTYwLDIyMF0sIG1pZCA9IFsxMzgsOTUsMTc0XSwgbWFnID0gWzIyMCwwLDEyMF07CiAgbGV0IGMxLCBjMiwgdDsKICBpZiAodDUgPD0gLjUpIHsgYzEgPSBjeWFuOyBjMiA9IG1pZDsgdCA9IHQ1ICogMjsgfSBlbHNlIHsgYzEgPSBtaWQ7IGMyID0gbWFnOyB0ID0gKHQ1IC0gLjUpICogMjsgfQogIHJldHVybiBbMCwxLDJdLm1hcChpID0+IE1hdGgucm91bmQoYzFbaV0gKyAoYzJbaV0gLSBjMVtpXSkgKiB0KSk7Cn0KZnVuY3Rpb24gcmdiYSh2LCBhKXsgY29uc3QgYyA9IGhlYXRSR0Iodik7IHJldHVybiAicmdiYSgiICsgY1swXSArICIsIiArIGNbMV0gKyAiLCIgKyBjWzJdICsgIiwiICsgYSArICIpIjsgfQpmdW5jdGlvbiBzb2xpZCh2KXsgcmV0dXJuIHJnYmEodiwgMSk7IH0KLy8gYWxwaGEgY2xpbWJzIHdpdGggdGhlIHNjb3JlIHNvIDMgYW5kIDQgYXJlIGFjdHVhbGx5IGRpc3Rpbmd1aXNoYWJsZQpmdW5jdGlvbiB3YXNoKHYpeyByZXR1cm4gcmdiYSh2LCAwLjE2ICsgKCh2IC0gMSkgLyA0KSAqIDAuMzYpOyB9Ci8vIG11ZWJsZXMgb3BhY29zOiBzaSBmdWVyYW4gdHJhbnNsw7pjaWRvcywgbGFzIGJhcmFuZGFzIHkgbMOtbmVhcyBkZWwgZm9uZG8gc2UgdmVuIGEgdHJhdsOpcwpmdW5jdGlvbiBmdXJuKHYpewogIGNvbnN0IGF3ID0gMC4xNiArICgodiAtIDEpIC8gNCkgKiAwLjM2LCBhZiA9IDAuNDAgKyAoKHYgLSAxKSAvIDQpICogMC4zODsKICBjb25zdCBhID0gYXcgKyBhZiAtIGF3ICogYWYsIGMgPSBoZWF0UkdCKHYpOwogIGNvbnN0IG1peCA9IGkgPT4gTWF0aC5yb3VuZCgyNTUgKyAoY1tpXSAtIDI1NSkgKiBhKTsKICByZXR1cm4gInJnYigiICsgbWl4KDApICsgIiwiICsgbWl4KDEpICsgIiwiICsgbWl4KDIpICsgIikiOwp9CmZ1bmN0aW9uIHRpcEZvcihkLCB2KXsgcmV0dXJuIHYgPD0gMiA/IGQudGlwcy5iYWpvIDogKHYgPT09IDMgPyBkLnRpcHMubWVkaW8gOiBkLnRpcHMuYWx0byk7IH0KY29uc3QgRU1QVFlfV0FTSCA9ICIjRkZGRkZGIiwgRU1QVFlfRlVSTiA9ICIjRkZGRkZGIjsKCi8qIFBlZ2EgYXF1w60gbGEgVVJMIC9leGVjIGRlIHR1IEdvb2dsZSBBcHBzIFNjcmlwdCAoSW1wbGVtZW50YXIgPiBOdWV2YSBpbXBsZW1lbnRhY2nDs24gPiBBcHAgd2ViLAogICBlamVjdXRhciBjb21vIHTDuiwgY29uIGFjY2VzbyAiQ3VhbHF1aWVyIHBlcnNvbmEiKS4gU2kgcXVlZGEgdmFjw61hLCBubyBzZSBlbnbDrWEgbmFkYS4gKi8KY29uc3QgU0hFRVRfRU5EUE9JTlQgPSAiIjsKCmNvbnN0IFJFRkxFQ1RJT05TID0gWwogICJBIMOhcmVhIG1haXMgZnJpYSBkYSBtaW5oYSBjYXNhIGVzdMOhIGFzc2ltIHBvciBlc2NvbGhhIG91IHBvciBow6FiaXRvPyIsCiAgIlNlIGV1IGVsZXZhciBlbSB1bSBwb250byBhIMOhcmVhIG1haXMgZnJpYSBuZXN0YSBzZW1hbmEsIHF1YWwgYcOnw6NvIGNvbmNyZXRhIHBvZGUgdG9ybmFyIGlzc28gcG9zc8OtdmVsPyIKXTsKCmNvbnN0IEFHRV9PUFRTID0gWyJNZW5vcyBkZSAyNSIsICIyNeKAkzM0IiwgIjM14oCTNDQiLCAiNDXigJM1NCIsICI1NSBvdSBtYWlzIl07CgoKZnVuY3Rpb24gcG9zdFRvU2hlZXQocGF5bG9hZCwga2VlcGFsaXZlKXt0cnl7d2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7dHlwZToiY2FzYS1iYWxhbmNlLXNoZWV0IixwYXlsb2FkOnBheWxvYWQsa2VlcGFsaXZlOiEha2VlcGFsaXZlfSwiKiIpO31jYXRjaChlKXt9fQoKY2xhc3MgQ29tcG9uZW50IGV4dGVuZHMgRENMb2dpYyB7CiAgY29uc3RydWN0b3IocHJvcHMpewogICAgc3VwZXIocHJvcHMpOwogICAgdGhpcy5zdGF0ZSA9IHsKICAgICAgdmFsdWVzOiBET01BSU5TLm1hcCgoKSA9PiBudWxsKSwKICAgICAgaG92ZXI6IG51bGwsIHNob3dQcmV2aWV3OiBmYWxzZSwgc2hvd1RpcHM6IGZhbHNlLCBjb25maXJtUmVzZXQ6IGZhbHNlLCBidXN5OiBmYWxzZSwKICAgICAgY29tbWl0OiB7IGFyZWE6IG51bGwsIHRleHQ6ICIiLCBkYXRlOiAiIiB9LAogICAgICBjdHg6IHsgYWdlOiBudWxsLCBjaXR5OiAiIiwgam9iOiAiIiB9CiAgICB9OwogICAgdGhpcy5jYW52YXNSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTsKICAgIHRoaXMubGlua1JlZiA9IFJlYWN0LmNyZWF0ZVJlZigpOwogICAgdGhpcy5zdmdSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTsKICAgIHRoaXMuY2FyZFJlZnMgPSBET01BSU5TLm1hcCgoKSA9PiBSZWFjdC5jcmVhdGVSZWYoKSk7CiAgICB0aGlzLnNpZCA9IERhdGUubm93KCkudG9TdHJpbmcoMzYpICsgIi0iICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOSk7CiAgICB0aGlzLmNvcmVTZW50ID0gZmFsc2U7CiAgICB0aGlzLnNhdmVUaW1lciA9IG51bGw7CiAgICB0aGlzLnJldmlzaW9uID0gMDsKICB9CiAgc2VuZFNuYXBzaG90KGtlZXBhbGl2ZSxkb3dubG9hZGVkKXtjb25zdCB2cz10aGlzLnN0YXRlLnZhbHVlcyxhbnN3ZXJlZD12cy5maWx0ZXIodj0+diE9bnVsbCk7Y29uc3QgcD17c2lkOnRoaXMuc2lkLHJldmlzaW9uOisrdGhpcy5yZXZpc2lvbix0aW1lc3RhbXA6bmV3IERhdGUoKS50b0lTT1N0cmluZygpLHByb21lZGlvOmFuc3dlcmVkLmxlbmd0aD8oYW5zd2VyZWQucmVkdWNlKChhLGIpPT5hK2IsMCkvYW5zd2VyZWQubGVuZ3RoKS50b0ZpeGVkKDIpOiIiLGFyZWFfY29tcHJvbWlzbzp0aGlzLnN0YXRlLmNvbW1pdC5hcmVhIT1udWxsP0RPTUFJTlNbdGhpcy5zdGF0ZS5jb21taXQuYXJlYV0ubmFtZToiIixjb21wcm9taXNvOnRoaXMuc3RhdGUuY29tbWl0LnRleHR8fCIiLGZlY2hhX2NvbXByb21pc286dGhpcy5zdGF0ZS5jb21taXQuZGF0ZXx8IiIsZGVzY2FyZ29faW1hZ2VuOmRvd25sb2FkZWQ/InNpbSI6IiIsZWRhZDp0aGlzLnN0YXRlLmN0eC5hZ2V8fCIiLGNpdWRhZDp0aGlzLnN0YXRlLmN0eC5jaXR5fHwiIixvY3VwYWNpb246dGhpcy5zdGF0ZS5jdHguam9ifHwiIixpZGlvbWE6InB0LUJSIn07RE9NQUlOUy5mb3JFYWNoKChkLGkpPT57cFsicyIrKGkrMSldPXZzW2QuaWRdPT1udWxsPyIiOnZzW2QuaWRdO3BbIm4iKyhpKzEpXT1kLm5hbWU7fSk7cG9zdFRvU2hlZXQocCwhIWtlZXBhbGl2ZSk7fQogIHF1ZXVlU25hcHNob3QoKXtjbGVhclRpbWVvdXQodGhpcy5zYXZlVGltZXIpO3RoaXMuc2F2ZVRpbWVyPXNldFRpbWVvdXQoKCk9PnRoaXMuc2VuZFNuYXBzaG90KGZhbHNlLGZhbHNlKSw0NTApO30KCiAgc2V0VmFsdWUoaSwgdil7CiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnN0YXRlLnZhbHVlcy5zbGljZSgpOwogICAgdmFsdWVzW2ldID0gdmFsdWVzW2ldID09PSB2ID8gbnVsbCA6IHY7CiAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWVzLCBjb25maXJtUmVzZXQ6IGZhbHNlLCBzaG93VGlwczogZmFsc2UgfSwgKCkgPT4gdGhpcy5zZW5kU25hcHNob3QoZmFsc2UsZmFsc2UpKTsKICB9CgogIG1heWJlU2VuZENvcmUoKXsKICAgIGlmICh0aGlzLmNvcmVTZW50KSByZXR1cm47CiAgICBjb25zdCB2cyA9IHRoaXMuc3RhdGUudmFsdWVzOwogICAgaWYgKHZzLnNvbWUodiA9PiB2ID09IG51bGwpKSByZXR1cm47CiAgICB0aGlzLmNvcmVTZW50ID0gdHJ1ZTsKICAgIGNvbnN0IHAgPSB7IHNpZDogdGhpcy5zaWQsIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLCBwcm9tZWRpbzogKHZzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gdnMubGVuZ3RoKS50b0ZpeGVkKDIpIH07CiAgICBET01BSU5TLmZvckVhY2goKGQsIGkpID0+IHsgcFsicyIgKyAoaSArIDEpXSA9IHZzW2QuaWRdOyBwWyJuIiArIChpICsgMSldID0gZC5uYW1lOyB9KTsKICAgIHBvc3RUb1NoZWV0KHAsIGZhbHNlKTsKICB9CgogIHJlc2V0KCl7CiAgICBpZiAoIXRoaXMuc3RhdGUuY29uZmlybVJlc2V0KSB7IHRoaXMuc2V0U3RhdGUoeyBjb25maXJtUmVzZXQ6IHRydWUgfSk7IHJldHVybjsgfQogICAgdGhpcy5jb3JlU2VudCA9IGZhbHNlOwogICAgdGhpcy5zaWQgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KSArICItIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDkpOwogICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlczogRE9NQUlOUy5tYXAoKCkgPT4gbnVsbCksIHNob3dQcmV2aWV3OiBmYWxzZSwgc2hvd1RpcHM6IGZhbHNlLCBjb25maXJtUmVzZXQ6IGZhbHNlIH0pOwogIH0KCiAgc2F2ZUN0eChwYXRjaCl7dGhpcy5zZXRTdGF0ZSh7Y3R4Ok9iamVjdC5hc3NpZ24oe30sdGhpcy5zdGF0ZS5jdHgscGF0Y2gpfSwoKT0+dGhpcy5xdWV1ZVNuYXBzaG90KCkpO30KICBzYXZlQ29tbWl0KHBhdGNoKXt0aGlzLnNldFN0YXRlKHtjb21taXQ6T2JqZWN0LmFzc2lnbih7fSx0aGlzLnN0YXRlLmNvbW1pdCxwYXRjaCl9LCgpPT50aGlzLnF1ZXVlU25hcHNob3QoKSk7fQoKICBqdW1wVG8oaSl7CiAgICBjb25zdCBlbCA9IHRoaXMuY2FyZFJlZnNbaV0uY3VycmVudDsKICAgIHRoaXMuc2V0U3RhdGUoeyBob3ZlcjogRE9NQUlOU1tpXS5rZXkgfSk7CiAgICBpZiAoIWVsKSByZXR1cm47CiAgICBjb25zdCB0b3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIDIwOwogICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiB0b3AsIGJlaGF2aW9yOiAic21vb3RoIiB9KTsKICB9CgogIGFuc3dlcmVkSWR4KCl7IHJldHVybiBET01BSU5TLm1hcChkID0+IGQuaWQpLmZpbHRlcihpID0+IHRoaXMuc3RhdGUudmFsdWVzW2ldICE9IG51bGwpOyB9CgogIHN0YXRzKCl7CiAgICBjb25zdCB2cyA9IHRoaXMuc3RhdGUudmFsdWVzLCBpZHggPSB0aGlzLmFuc3dlcmVkSWR4KCk7CiAgICBpZiAoIWlkeC5sZW5ndGgpIHJldHVybiBudWxsOwogICAgbGV0IGhpID0gaWR4WzBdLCBsbyA9IGlkeFswXSwgc3VtID0gMDsKICAgIGlkeC5mb3JFYWNoKGkgPT4geyBzdW0gKz0gdnNbaV07IGlmICh2c1tpXSA+IHZzW2hpXSkgaGkgPSBpOyBpZiAodnNbaV0gPCB2c1tsb10pIGxvID0gaTsgfSk7CiAgICByZXR1cm4geyBoaTogaGksIGxvOiBsbywgYXZnOiAoc3VtIC8gaWR4Lmxlbmd0aCkudG9GaXhlZCgxKSwgZ2FwOiB2c1toaV0gLSB2c1tsb10sIGxvdzogaWR4LmZpbHRlcihpID0+IHZzW2ldIDw9IDIpIH07CiAgfQoKICBhc3luYyBsb2FkRm9udENTUygpewogICAgaWYgKHRoaXMuX2ZvbnRDU1MgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2ZvbnRDU1M7CiAgICB0aGlzLl9mb250Q1NTID0gIiI7CiAgICB0cnkgewogICAgICBjb25zdCB1cmwgPSAiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1CYWxvbysyOndnaHRANzAwOzgwMCZmYW1pbHk9TnVuaXRvOndnaHRANDAwOzYwMDs3MDAmZGlzcGxheT1zd2FwIjsKICAgICAgbGV0IGNzcyA9IGF3YWl0IChhd2FpdCBmZXRjaCh1cmwpKS50ZXh0KCk7CiAgICAgIGNvbnN0IHVybHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoKGNzcy5tYXRjaCgvaHR0cHM6XC9cL2ZvbnRzXC5nc3RhdGljXC5jb21bXildKy9nKSB8fCBbXSkpKTsKICAgICAgZm9yIChjb25zdCB1IG9mIHVybHMpIHsKICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgKGF3YWl0IGZldGNoKHUpKS5ibG9iKCk7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiB7IGNvbnN0IGZyID0gbmV3IEZpbGVSZWFkZXIoKTsgZnIub25sb2FkID0gKCkgPT4gcmVzKGZyLnJlc3VsdCk7IGZyLnJlYWRBc0RhdGFVUkwoYmxvYik7IH0pOwogICAgICAgIGNzcyA9IGNzcy5zcGxpdCh1KS5qb2luKGRhdGEpOwogICAgICB9CiAgICAgIHRoaXMuX2ZvbnRDU1MgPSBjc3M7CiAgICB9IGNhdGNoIChlKSB7IHRoaXMuX2ZvbnRDU1MgPSAiIjsgfQogICAgcmV0dXJuIHRoaXMuX2ZvbnRDU1M7CiAgfQoKICBhc3luYyBleHBvcnRJbWFnZSgpewogICAgY29uc3Qgc3QgPSB0aGlzLnN0YXRzKCk7CiAgICBpZiAoIXN0IHx8IHRoaXMuYW5zd2VyZWRJZHgoKS5sZW5ndGggPCBET01BSU5TLmxlbmd0aCB8fCB0aGlzLnN0YXRlLmJ1c3kpIHJldHVybjsKICAgIHRoaXMuc2V0U3RhdGUoeyBidXN5OiB0cnVlIH0pOwogICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdSZWYuY3VycmVudDsKICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzUmVmLmN1cnJlbnQ7CiAgICBpZiAoIWNhbnZhcyB8fCAhc3ZnKSB7IHRoaXMuc2V0U3RhdGUoeyBidXN5OiBmYWxzZSB9KTsgcmV0dXJuOyB9CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGNvbnN0IFcgPSBjYW52YXMud2lkdGg7CiAgICBjb25zdCBESVNQTEFZID0gIidCYWxvbyAyJywgc2Fucy1zZXJpZiIsIEJPRFkgPSAiTnVuaXRvLCBzYW5zLXNlcmlmIjsKICAgIGNvbnN0IHZzID0gdGhpcy5zdGF0ZS52YWx1ZXMsIGNtID0gdGhpcy5zdGF0ZS5jb21taXQ7CiAgICBjb25zdCBjb21taXRBcmVhID0gY20uYXJlYSAhPSBudWxsID8gRE9NQUlOU1tjbS5hcmVhXSA6IERPTUFJTlNbc3QubG9dOwogICAgY29uc3QgaGFzQ29tbWl0ID0gISEoY20udGV4dCAmJiBjbS50ZXh0LnRyaW0oKSk7CgogICAgY3R4LmZvbnQgPSAiNDAwIDEzcHggIiArIEJPRFk7CiAgICBjb25zdCBibG9ja3MgPSBET01BSU5TLm1hcChkID0+IHsKICAgICAgY29uc3QgbGluZXMgPSB0aGlzLndyYXAoY3R4LCB0aXBGb3IoZCwgdnNbZC5pZF0pLCBXIC0gMTQ2KTsKICAgICAgcmV0dXJuIHsgZDogZCwgbGluZXM6IGxpbmVzLCBoOiA0NCArIGxpbmVzLmxlbmd0aCAqIDE5IH07CiAgICB9KTsKICAgIGN0eC5mb250ID0gIjcwMCAxNXB4ICIgKyBCT0RZOwogICAgY29uc3QgY29tbWl0TGluZXMgPSBoYXNDb21taXQgPyB0aGlzLndyYXAoY3R4LCBjbS50ZXh0LnRyaW0oKSwgVyAtIDE1MCkgOiBbXTsKICAgIGNvbnN0IGNvbW1pdEggPSBoYXNDb21taXQgPyA3NCArIGNvbW1pdExpbmVzLmxlbmd0aCAqIDIxIDogMDsKICAgIGNvbnN0IHdhbnRSZWZsID0gdGhpcy5wcm9wcy5zaG93UmVmbGVjdGlvbiAhPT0gZmFsc2U7CiAgICBjdHguZm9udCA9ICI0MDAgMTNweCAiICsgQk9EWTsKICAgIGNvbnN0IHJlZmxCbG9ja3MgPSB3YW50UmVmbCA/IFJFRkxFQ1RJT05TLm1hcChxID0+IHsKICAgICAgY29uc3QgbGluZXMgPSB0aGlzLndyYXAoY3R4LCBxLCBXIC0gMTUwKTsKICAgICAgcmV0dXJuIHsgbGluZXM6IGxpbmVzLCBoOiAyMCArIGxpbmVzLmxlbmd0aCAqIDE5IH07CiAgICB9KSA6IFtdOwogICAgY29uc3QgcmVmbEggPSB3YW50UmVmbCA/IDQ0ICsgcmVmbEJsb2Nrcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLmggKyA5LCAwKSA6IDA7CiAgICBjb25zdCBkcmF3VyA9IDcyMCwgZHJhd0ggPSBkcmF3VyAqICg5NTAgLyAxNDAwKTsKICAgIGNvbnN0IHRpcHNUb3AgPSAxMTggKyBkcmF3SCArIDI2ICsgNjIgKyAzNDsKICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKHRpcHNUb3AgKyBibG9ja3MucmVkdWNlKChhLCBiKSA9PiBhICsgYi5oICsgMTEsIDApICsgY29tbWl0SCArIHJlZmxIICsgNTQpOwogICAgY29uc3QgSCA9IGNhbnZhcy5oZWlnaHQ7CgogICAgY3R4LmZpbGxTdHlsZSA9ICIjRkZGREZCIjsgY3R4LmZpbGxSZWN0KDAsIDAsIFcsIEgpOwogICAgY29uc3QgZyA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCBXLCAwKTsKICAgIGcuYWRkQ29sb3JTdG9wKDAsICIjMDBBMERDIik7IGcuYWRkQ29sb3JTdG9wKDEsICIjREMwMDc4Iik7CiAgICBjdHguZmlsbFN0eWxlID0gZzsgY3R4LmZpbGxSZWN0KDAsIDAsIFcsIDEyKTsKCiAgICBjdHgudGV4dEFsaWduID0gImNlbnRlciI7CiAgICBjdHguZmlsbFN0eWxlID0gIiMxNDI2MUMiOyBjdHguZm9udCA9ICI4MDAgNDBweCAiICsgRElTUExBWTsKICAgIGN0eC5maWxsVGV4dCgiQSBjYXNhIGRvIG1ldSBlcXVpbMOtYnJpbyIsIFcgLyAyLCA3Mik7CiAgICBjdHguZm9udCA9ICI2MDAgMTRweCAiICsgQk9EWTsgY3R4LmZpbGxTdHlsZSA9ICIjNTk2MTVBIjsKICAgIGN0eC5maWxsVGV4dChuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygicHQtQlIiLCB7IHllYXI6ICJudW1lcmljIiwgbW9udGg6ICJsb25nIiwgZGF5OiAibnVtZXJpYyIgfSksIFcgLyAyLCA5OCk7CgogICAgY29uc3QgZmluaXNoID0gKCkgPT4gewogICAgICBsZXQgeSA9IDExOCArIGRyYXdIICsgMjY7CiAgICAgIHRoaXMucm91bmRSZWN0KGN0eCwgNTUsIHksIFcgLSAxMTAsIDU2LCAxNCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI0Y0RUVGQiI7IGN0eC5maWxsKCk7CiAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICIjMTQyNjFDIjsgY3R4LmxpbmVXaWR0aCA9IDIuNTsgY3R4LnN0cm9rZSgpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiMxNDI2MUMiOyBjdHguZm9udCA9ICI3MDAgMTNweCAiICsgQk9EWTsgY3R4LnRleHRBbGlnbiA9ICJjZW50ZXIiOwogICAgICBjdHguZmlsbFRleHQoIk1haXMgYXF1ZWNpZGE6ICIgKyBET01BSU5TW3N0LmhpXS5uYW1lICsgIiAoIiArIHZzW3N0LmhpXSArICIpICAgwrcgICBNYWlzIGZyaWE6ICIgKyBET01BSU5TW3N0LmxvXS5uYW1lICsgIiAoIiArIHZzW3N0LmxvXSArICIpICAgwrcgICBEaWZlcmVuw6dhOiAiICsgc3QuZ2FwICsgIiBwb250b3MiLCBXIC8gMiwgeSArIDM0KTsKCiAgICAgIHkgKz0gOTA7CiAgICAgIGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7IGN0eC5mb250ID0gIjgwMCAyNHB4ICIgKyBESVNQTEFZOyBjdHguZmlsbFN0eWxlID0gIiMxNDI2MUMiOwogICAgICBjdHguZmlsbFRleHQoIlN1Z2VzdMO1ZXMgcGFyYSBjdWlkYXIgZGEgbWluaGEgY2FzYSIsIDU1LCB5KTsKICAgICAgeSArPSAyNDsKCiAgICAgIGJsb2Nrcy5mb3JFYWNoKGIgPT4gewogICAgICAgIGNvbnN0IHYgPSB2c1tiLmQuaWRdLCBjb2xvciA9IHNvbGlkKHYpOwogICAgICAgIHRoaXMucm91bmRSZWN0KGN0eCwgNTUsIHksIFcgLSAxMTAsIGIuaCwgMTMpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiI0ZGRkZGRiI7IGN0eC5maWxsKCk7CiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gIiMxNDI2MUMiOyBjdHgubGluZVdpZHRoID0gMjsgY3R4LnN0cm9rZSgpOwogICAgICAgIHRoaXMucm91bmRSZWN0KGN0eCwgNTUsIHksIDksIGIuaCwgNCk7IGN0eC5maWxsU3R5bGUgPSBjb2xvcjsgY3R4LmZpbGwoKTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiMxNDI2MUMiOyBjdHguZm9udCA9ICI3MDAgMTVweCAiICsgRElTUExBWTsgY3R4LnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgICBjdHguZmlsbFRleHQoYi5kLm5hbWUsIDgwLCB5ICsgMjQpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjsgY3R4LmZvbnQgPSAiODAwIDE1cHggIiArIERJU1BMQVk7IGN0eC50ZXh0QWxpZ24gPSAicmlnaHQiOwogICAgICAgIGN0eC5maWxsVGV4dCh2ICsgIi81IiwgVyAtIDc2LCB5ICsgMjQpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzJBMzMyQyI7IGN0eC5mb250ID0gIjQwMCAxM3B4ICIgKyBCT0RZOyBjdHgudGV4dEFsaWduID0gImxlZnQiOwogICAgICAgIGIubGluZXMuZm9yRWFjaCgobCwgaSkgPT4gY3R4LmZpbGxUZXh0KGwsIDgwLCB5ICsgNDQgKyBpICogMTkpKTsKICAgICAgICB5ICs9IGIuaCArIDExOwogICAgICB9KTsKCiAgICAgIGlmIChoYXNDb21taXQpIHsKICAgICAgICB5ICs9IDg7CiAgICAgICAgdGhpcy5yb3VuZFJlY3QoY3R4LCA2MSwgeSArIDYsIFcgLSAxMTAsIGNvbW1pdEggLSA4LCAxNCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjQ0JCM0YwIjsgY3R4LmZpbGwoKTsKICAgICAgICB0aGlzLnJvdW5kUmVjdChjdHgsIDU1LCB5LCBXIC0gMTEwLCBjb21taXRIIC0gOCwgMTQpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiI0Y0RUVGQiI7IGN0eC5maWxsKCk7CiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gIiMxNDI2MUMiOyBjdHgubGluZVdpZHRoID0gMi41OyBjdHguc3Ryb2tlKCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjNTY0MDhDIjsgY3R4LmZvbnQgPSAiNzAwIDEycHggIiArIEJPRFk7IGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7CiAgICAgICAgY3R4LmZpbGxUZXh0KCJNRVUgQ09NUFJPTUlTU08gwrcgIiArIGNvbW1pdEFyZWEubmFtZS50b1VwcGVyQ2FzZSgpICsgKGNtLmRhdGUgPyAiICDCtyAgQVTDiSAiICsgY20uZGF0ZSA6ICIiKSwgODAsIHkgKyAyOCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMTQyNjFDIjsgY3R4LmZvbnQgPSAiNzAwIDE1cHggIiArIEJPRFk7CiAgICAgICAgY29tbWl0TGluZXMuZm9yRWFjaCgobCwgaSkgPT4gY3R4LmZpbGxUZXh0KGwsIDgwLCB5ICsgNTQgKyBpICogMjEpKTsKICAgICAgICB5ICs9IGNvbW1pdEg7CiAgICAgIH0KCiAgICAgIGlmICh3YW50UmVmbCkgewogICAgICAgIHkgKz0gMjA7CiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICJsZWZ0IjsgY3R4LmZvbnQgPSAiODAwIDIwcHggIiArIERJU1BMQVk7IGN0eC5maWxsU3R5bGUgPSAiIzE0MjYxQyI7CiAgICAgICAgY3R4LmZpbGxUZXh0KCJQYXJhIHJlZmxldGlyIiwgNTUsIHkpOwogICAgICAgIHkgKz0gMjA7CiAgICAgICAgcmVmbEJsb2Nrcy5mb3JFYWNoKGIgPT4gewogICAgICAgICAgdGhpcy5yb3VuZFJlY3QoY3R4LCA1NSwgeSwgVyAtIDExMCwgYi5oLCAxMik7CiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gIiNGRkZGRkYiOyBjdHguZmlsbCgpOwogICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gIiMxNDI2MUMiOyBjdHgubGluZVdpZHRoID0gMjsgY3R4LnN0cm9rZSgpOwogICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMkEzMzJDIjsgY3R4LmZvbnQgPSAiNDAwIDEzcHggIiArIEJPRFk7IGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7CiAgICAgICAgICBiLmxpbmVzLmZvckVhY2goKGwsIGkpID0+IGN0eC5maWxsVGV4dChsLCA3NiwgeSArIDI0ICsgaSAqIDE5KSk7CiAgICAgICAgICB5ICs9IGIuaCArIDk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGN0eC50ZXh0QWxpZ24gPSAiY2VudGVyIjsgY3R4LmZvbnQgPSAiNjAwIDEzcHggIiArIEJPRFk7IGN0eC5maWxsU3R5bGUgPSAiIzU5NjE1QSI7CiAgICAgIGN0eC5maWxsVGV4dCgibWFydGhhcmFtaXJlei5jb20uY28iLCBXIC8gMiwgSCAtIDIyKTsKCiAgICAgIHRoaXMuc2VuZFNuYXBzaG90KHRydWUsdHJ1ZSk7CgogICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd1ByZXZpZXc6IHRydWUsIHNob3dUaXBzOiB0cnVlLCBidXN5OiBmYWxzZSB9LCAoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMubGlua1JlZi5jdXJyZW50KSB0aGlzLmxpbmtSZWYuY3VycmVudC5ocmVmID0gY2FudmFzLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIik7CiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmNhbnZhc1JlZi5jdXJyZW50OwogICAgICAgIGlmIChlbCkgd2luZG93LnNjcm9sbFRvKHsgdG9wOiBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIDMwLCBiZWhhdmlvcjogInNtb290aCIgfSk7CiAgICAgIH0pOwogICAgfTsKCiAgICBjb25zdCBjbG9uZSA9IHN2Zy5jbG9uZU5vZGUodHJ1ZSk7CiAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoInhtbG5zIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIik7CiAgICBjb25zdCBmb250Q1NTID0gYXdhaXQgdGhpcy5sb2FkRm9udENTUygpOwogICAgaWYgKGZvbnRDU1MpIHsKICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgInN0eWxlIik7CiAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gZm9udENTUzsKICAgICAgY2xvbmUuaW5zZXJ0QmVmb3JlKHN0eWxlLCBjbG9uZS5maXJzdENoaWxkKTsKICAgIH0KICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpOwogICAgaW1nLm9ubG9hZCA9ICgpID0+IHsgY3R4LmRyYXdJbWFnZShpbWcsIChXIC0gZHJhd1cpIC8gMiwgMTE4LCBkcmF3VywgZHJhd0gpOyBmaW5pc2goKTsgfTsKICAgIGltZy5vbmVycm9yID0gZmluaXNoOwogICAgaW1nLnNyYyA9ICJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoY2xvbmUpKTsKICB9CgogIHJvdW5kUmVjdChjdHgsIHgsIHksIHcsIGgsIHIpewogICAgY3R4LmJlZ2luUGF0aCgpOyBjdHgubW92ZVRvKHggKyByLCB5KTsKICAgIGN0eC5hcmNUbyh4ICsgdywgeSwgeCArIHcsIHkgKyBoLCByKTsgY3R4LmFyY1RvKHggKyB3LCB5ICsgaCwgeCwgeSArIGgsIHIpOwogICAgY3R4LmFyY1RvKHgsIHkgKyBoLCB4LCB5LCByKTsgY3R4LmFyY1RvKHgsIHksIHggKyB3LCB5LCByKTsgY3R4LmNsb3NlUGF0aCgpOwogIH0KCiAgd3JhcChjdHgsIHRleHQsIG1heFdpZHRoKXsKICAgIGNvbnN0IHdvcmRzID0gdGV4dC5zcGxpdCgiICIpLCBsaW5lcyA9IFtdOyBsZXQgbGluZSA9ICIiOwogICAgd29yZHMuZm9yRWFjaCh3ID0+IHsKICAgICAgY29uc3QgdCA9IGxpbmUgPyBsaW5lICsgIiAiICsgdyA6IHc7CiAgICAgIGlmIChjdHgubWVhc3VyZVRleHQodCkud2lkdGggPiBtYXhXaWR0aCAmJiBsaW5lKSB7IGxpbmVzLnB1c2gobGluZSk7IGxpbmUgPSB3OyB9IGVsc2UgbGluZSA9IHQ7CiAgICB9KTsKICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpOwogICAgcmV0dXJuIGxpbmVzOwogIH0KCiAgcmVuZGVyVmFscygpewogICAgY29uc3QgdnMgPSB0aGlzLnN0YXRlLnZhbHVlcywgc3QgPSB0aGlzLnN0YXRzKCksIGhvdmVyID0gdGhpcy5zdGF0ZS5ob3ZlcjsKICAgIGNvbnN0IGFuc3dlcmVkID0gdGhpcy5hbnN3ZXJlZElkeCgpLCBuID0gYW5zd2VyZWQubGVuZ3RoLCBhbGwgPSBuID09PSBET01BSU5TLmxlbmd0aDsKICAgIGNvbnN0IGMgPSB7fSwgaGl0ID0ge30sIG92ZXIgPSB7fTsKCiAgICBET01BSU5TLmZvckVhY2goZCA9PiB7CiAgICAgIGNvbnN0IHYgPSB2c1tkLmlkXSwgZmsgPSAiZiIgKyBkLmtleS5zbGljZSgxKTsKICAgICAgY1tkLmtleV0gPSB2ID09IG51bGwgPyBFTVBUWV9XQVNIIDogd2FzaCh2KTsKICAgICAgY1tma10gPSB2ID09IG51bGwgPyBFTVBUWV9GVVJOIDogZnVybih2KTsKICAgICAgaGl0W2Qua2V5XSA9ICgpID0+IHRoaXMuanVtcFRvKGQuaWQpOwogICAgICBvdmVyW2Qua2V5XSA9ICgpID0+IHRoaXMuc2V0U3RhdGUoeyBob3ZlcjogZC5rZXkgfSk7CiAgICB9KTsKCiAgICBjb25zdCBoZyA9IGhvdmVyID8gR0VPTVtob3Zlcl0gOiBudWxsOwogICAgY29uc3QgaGlnaGxpZ2h0ID0gaGcgPyBSZWFjdC5jcmVhdGVFbGVtZW50KCJnIiwgeyBrZXk6ICJobCIsIGZpbGw6ICJub25lIiwgc3Ryb2tlOiAiIzE0MjYxQyIsIHN0cm9rZVdpZHRoOiA3LCBzdHJva2VEYXNoYXJyYXk6ICIxNiAxMSIsIG9wYWNpdHk6IDAuODUsIHN0eWxlOiB7IHBvaW50ZXJFdmVudHM6ICJub25lIiB9IH0sCiAgICAgIGhnLnR5cGUgPT09ICJwb2x5IgogICAgICAgID8gUmVhY3QuY3JlYXRlRWxlbWVudCgicG9seWdvbiIsIHsgcG9pbnRzOiBoZy5wb2ludHMgfSkKICAgICAgICA6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoInJlY3QiLCB7IHg6IGhnLngsIHk6IGhnLnksIHdpZHRoOiBoZy53LCBoZWlnaHQ6IGhnLmgsIHJ4OiBoZy5yIHx8IDggfSkKICAgICkgOiBudWxsOwoKICAgIGNvbnN0IE1FREFMUyA9IFsKICAgICAgeyBrOiAicjQiLCB4OiAyODQsIHk6IDg2NyB9LCB7IGs6ICJyMiIsIHg6IDExNTAsIHk6IDUzNiB9LAogICAgICB7IGs6ICJyNiIsIHg6IDYwMCwgeTogMjU4IH0sIHsgazogInI3IiwgeDogNTM2LCB5OiA3ODYgfSwKICAgICAgeyBrOiAicjEiLCB4OiA0MjUsIHk6IDM4OCB9LCB7IGs6ICJyOCIsIHg6IDc3NSwgeTogMzg4IH0sCiAgICAgIHsgazogInIwIiwgeDogMzU2LCB5OiA1OTggfSwgeyBrOiAicjUiLCB4OiA1NDQsIHk6IDU5OCB9LAogICAgICB7IGs6ICJyOSIsIHg6IDcwMiwgeTogNTk4IH0sIHsgazogInIzIiwgeDogODY0LCB5OiA1OTggfQogICAgXTsKICAgIGNvbnN0IGJ5S2V5ID0ge307CiAgICBET01BSU5TLmZvckVhY2goZCA9PiB7IGJ5S2V5W2Qua2V5XSA9IHZzW2QuaWRdOyB9KTsKICAgIGNvbnN0IG1lZGFscyA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoImciLCB7IGtleTogIm1lZGFscyIsIHN0eWxlOiB7IHBvaW50ZXJFdmVudHM6ICJub25lIiB9IH0sIE1FREFMUy5maWx0ZXIobSA9PiBieUtleVttLmtdICE9IG51bGwpLm1hcChtID0+IHsKICAgICAgY29uc3QgdmFsID0gYnlLZXlbbS5rXTsKICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoImciLCB7IGtleTogbS5rIH0sCiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudCgiY2lyY2xlIiwgeyBjeDogbS54LCBjeTogbS55LCByOiAyNCwgZmlsbDogIiNGRkZGRkYiLCBzdHJva2U6ICIjMTQyNjFDIiwgc3Ryb2tlV2lkdGg6IDYgfSksCiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudCgidGV4dCIsIHsKICAgICAgICAgIHg6IG0ueCwgeTogbS55ICsgMjggKiAwLjM1LCB0ZXh0QW5jaG9yOiAibWlkZGxlIiwgZm9udEZhbWlseTogIidCYWxvbyAyJywgc2Fucy1zZXJpZiIsCiAgICAgICAgICBmb250V2VpZ2h0OiA4MDAsIGZvbnRTaXplOiAyOCwgZmlsbDogIiMxNDI2MUMiLCBzdHJva2U6ICJub25lIgogICAgICAgIH0sIFN0cmluZyh2YWwpKQogICAgICApOwogICAgfSkpOwoKICAgIGNvbnN0IGFyaWFIb3VzZSA9ICJDYXNhIGRvIGVxdWlsw61icmlvLiAiICsgRE9NQUlOUy5tYXAoZCA9PiBkLm5hbWUgKyAiOiAiICsgKHZzW2QuaWRdID09IG51bGwgPyAic2VtIHJlc3Bvc3RhIiA6IHZzW2QuaWRdICsgIiBkZSA1IikpLmpvaW4oIi4gIikgKyAiLiI7CgogICAgcmV0dXJuIHsKICAgICAgYzogYywgaGl0OiBoaXQsIG92ZXI6IG92ZXIsIG91dDogKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IGhvdmVyOiBudWxsIH0pLAogICAgICBoaWdobGlnaHQ6IGhpZ2hsaWdodCwgbWVkYWxzOiBtZWRhbHMsIGFyaWFIb3VzZTogYXJpYUhvdXNlLAoKICAgICAgcHJvZ3Jlc3NMYWJlbDogbiA9PT0gMCA/ICJWb2PDqiBhaW5kYSBuw6NvIHJlc3BvbmRldSIgOiBuICsgIiBkZSAxMCByZXNwb25kaWRhcyIsCiAgICAgIHByb2dyZXNzSGludDogYWxsID8gIlByb250byDCtyBzdWFzIHN1Z2VzdMO1ZXMgZXN0w6NvIGFiYWl4byIgOiAiRmFsdGFtICIgKyAoMTAgLSBuKSwKICAgICAgcHJvZ3Jlc3NQY3Q6IChuIC8gRE9NQUlOUy5sZW5ndGggKiAxMDApICsgIiUiLAoKICAgICAgdGlsZXM6IERPTUFJTlMubWFwKGQgPT4gewogICAgICAgIGNvbnN0IHYgPSB2c1tkLmlkXSwgaXNIb3ZlciA9IGhvdmVyID09PSBkLmtleTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgcm9vbTogZC5yb29tLCBuYW1lOiBkLm5hbWUsIGRlc2M6IGQuZGVzYywgcXVlc3Rpb246IGQucXVlc3Rpb24sIGhpbnQ6IGQuaGludCwKICAgICAgICAgIGxvdzogZC5sb3csIGhpZ2g6IGQuaGlnaCwgcmVmOiB0aGlzLmNhcmRSZWZzW2QuaWRdLAogICAgICAgICAgYW5zd2VyZWQ6IHYgIT0gbnVsbCAmJiAoYWxsIHx8IHRoaXMuc3RhdGUuc2hvd1RpcHMpLCBiYWRnZTogdiA9PSBudWxsID8gIuKAlCIgOiB2ICsgIi81IiwKICAgICAgICAgIGFjY2VudDogdiA9PSBudWxsID8gIiM5QUEyOUEiIDogc29saWQodiksCiAgICAgICAgICBzdGF0ZTogdiA9PSBudWxsID8gIiIgOiBTVEFURVNbdl0sIHRpcDogdiA9PSBudWxsID8gIiIgOiB0aXBGb3IoZCwgdiksCiAgICAgICAgICBib3JkZXI6IGlzSG92ZXIgPyAiI0I0MDA2QSIgOiAiIzE0MjYxQyIsCiAgICAgICAgICBzaGFkb3c6IGlzSG92ZXIgPyAiMCAwIDAgNHB4IHJnYmEoMTgwLDAsMTA2LC4xNikiIDogIm5vbmUiLAogICAgICAgICAgb25FbnRlcjogKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IGhvdmVyOiBkLmtleSB9KSwKICAgICAgICAgIG9uTGVhdmU6ICgpID0+IHRoaXMuc2V0U3RhdGUoeyBob3ZlcjogbnVsbCB9KSwKICAgICAgICAgIG9wdHM6IFsxLDIsMyw0LDVdLm1hcChubiA9PiAoewogICAgICAgICAgICBuOiBubiwgYWN0aXZlOiB2ID09PSBubiwgYXJpYTogZC5uYW1lICsgIjogIiArIG5uICsgIiBkZSA1IiwKICAgICAgICAgICAgYmc6IHYgPT09IG5uID8gc29saWQobm4pIDogIiNGRkZGRkYiLCBmZzogdiA9PT0gbm4gPyAiI0ZGRkZGRiIgOiAiIzE0MjYxQyIsCiAgICAgICAgICAgIG9uUGljazogKCkgPT4gdGhpcy5zZXRWYWx1ZShkLmlkLCBubikKICAgICAgICAgIH0pKQogICAgICAgIH07CiAgICAgIH0pLAoKICAgICAgaGFzU3RhdHM6IG4gPj0gMiwKICAgICAgaG90dGVzdDogc3QgPyBET01BSU5TW3N0LmhpXS5uYW1lICsgIiAoIiArIHZzW3N0LmhpXSArICIpIiA6ICLigJQiLAogICAgICBjb2xkZXN0OiBzdCA/IERPTUFJTlNbc3QubG9dLm5hbWUgKyAiICgiICsgdnNbc3QubG9dICsgIikiIDogIuKAlCIsCiAgICAgIGdhcExhYmVsOiBzdCA/IHN0LmdhcCArIChzdC5nYXAgPT09IDEgPyAiIHBvbnRvIiA6ICIgcG9udG9zIikgOiAi4oCUIiwKICAgICAgZ2FwTm90ZTogc3QgPyAoc3QuZ2FwID49IDMgPyAiU3VhIGNhc2EgZXN0w6EgZGVzZXF1aWxpYnJhZGE6IGjDoSBlc3Bhw6dvcyBtdWl0byBhcXVlY2lkb3MgYW8gbGFkbyBkZSBvdXRyb3MgbXVpdG8gZnJpb3MuIiA6ICJTdWEgY2FzYSBlc3TDoSBiYXN0YW50ZSBlcXVpbGlicmFkYSBlbnRyZSBvcyBkaWZlcmVudGVzIGVzcGHDp29zLiIpIDogIiIsCiAgICAgIGF0dGVudGlvbkxhYmVsOiBzdCA/IHN0Lmxvdy5sZW5ndGggKyAoc3QubG93Lmxlbmd0aCA9PT0gMSA/ICIgw6FyZWEiIDogIiDDoXJlYXMiKSA6ICLigJQiLAogICAgICBhdHRlbnRpb25Ob3RlOiBzdCA/IChzdC5sb3cubGVuZ3RoID8gc3QubG93Lm1hcChpID0+IERPTUFJTlNbaV0ubmFtZSkuam9pbigiLCAiKSA6ICJOZW5odW1hIMOhcmVhIGZpY291IGNvbSAxIG91IDIuIikgOiAiIiwKCiAgICAgIGFsbEFuc3dlcmVkOiBhbGwsCiAgICAgIGNvbW1pdFByb21wdDogc3QgPyAiVW1hIMO6bmljYSBhw6fDo28sIGVtIHVtYSDDum5pY2Egw6FyZWEuIFN1Z2VzdMOjbzogIiArIERPTUFJTlNbc3QubG9dLm5hbWUgKyAiLCBzZXUgZXNwYcOnbyBtYWlzIGZyaW8uIiA6ICIiLAogICAgICBjb21taXRBcmVhOiB0aGlzLnN0YXRlLmNvbW1pdC5hcmVhID09IG51bGwgPyAoc3QgPyBTdHJpbmcoc3QubG8pIDogIjAiKSA6IFN0cmluZyh0aGlzLnN0YXRlLmNvbW1pdC5hcmVhKSwKICAgICAgY29tbWl0VGV4dDogdGhpcy5zdGF0ZS5jb21taXQudGV4dCB8fCAiIiwKICAgICAgY29tbWl0RGF0ZTogdGhpcy5zdGF0ZS5jb21taXQuZGF0ZSB8fCAiIiwKICAgICAgYXJlYU9wdGlvbnM6IERPTUFJTlMubWFwKGQgPT4gKHsgdmFsdWU6IFN0cmluZyhkLmlkKSwgbGFiZWw6IGQubmFtZSB9KSksCiAgICAgIGN0eENpdHk6IHRoaXMuc3RhdGUuY3R4LmNpdHksIGN0eEpvYjogdGhpcy5zdGF0ZS5jdHguam9iLAogICAgICBvbkN0eENpdHk6IGUgPT4gdGhpcy5zYXZlQ3R4KHsgY2l0eTogZS50YXJnZXQudmFsdWUgfSksCiAgICAgIG9uQ3R4Sm9iOiBlID0+IHRoaXMuc2F2ZUN0eCh7IGpvYjogZS50YXJnZXQudmFsdWUgfSksCiAgICAgIGFnZU9wdGlvbnM6IEFHRV9PUFRTLm1hcChsYWJlbCA9PiAoewogICAgICAgIGxhYmVsOiBsYWJlbCwgYWN0aXZlOiB0aGlzLnN0YXRlLmN0eC5hZ2UgPT09IGxhYmVsLAogICAgICAgIGJnOiB0aGlzLnN0YXRlLmN0eC5hZ2UgPT09IGxhYmVsID8gIiNCNDAwNkEiIDogIiNGRkZGRkYiLAogICAgICAgIGZnOiB0aGlzLnN0YXRlLmN0eC5hZ2UgPT09IGxhYmVsID8gIiNGRkZGRkYiIDogIiMxNDI2MUMiLAogICAgICAgIG9uUGljazogKCkgPT4gdGhpcy5zYXZlQ3R4KHsgYWdlOiB0aGlzLnN0YXRlLmN0eC5hZ2UgPT09IGxhYmVsID8gbnVsbCA6IGxhYmVsIH0pCiAgICAgIH0pKSwKICAgICAgb25Db21taXRBcmVhOiBlID0+IHRoaXMuc2F2ZUNvbW1pdCh7IGFyZWE6IHBhcnNlSW50KGUudGFyZ2V0LnZhbHVlLCAxMCkgfSksCiAgICAgIG9uQ29tbWl0VGV4dDogZSA9PiB0aGlzLnNhdmVDb21taXQoeyB0ZXh0OiBlLnRhcmdldC52YWx1ZSB9KSwKICAgICAgb25Db21taXREYXRlOiBlID0+IHRoaXMuc2F2ZUNvbW1pdCh7IGRhdGU6IGUudGFyZ2V0LnZhbHVlIH0pLAogICAgICBjb21taXRTdGF0dXM6ICh0aGlzLnN0YXRlLmNvbW1pdC50ZXh0IHx8ICIiKS50cmltKCkgPyAiUHJvbnRvLiBTZXUgY29tcHJvbWlzc28gYXBhcmVjZXLDoSBuYSBpbWFnZW0gcXVlIHZvY8OqIGJhaXhhci4iIDogIk8gcXVlIHZvY8OqIGVzY3JldmVyIGFxdWkgYXBhcmVjZXLDoSBuYSBpbWFnZW0gcXVlIHZvY8OqIHBvZGVyw6EgYmFpeGFyLiIsCgogICAgICBzaG93UmVmbGVjdGlvbjogdGhpcy5wcm9wcy5zaG93UmVmbGVjdGlvbiAhPT0gZmFsc2UsCgogICAgICBleHBvcnREaXNhYmxlZDogIWFsbCB8fCB0aGlzLnN0YXRlLmJ1c3ksCiAgICAgIGV4cG9ydExhYmVsOiB0aGlzLnN0YXRlLmJ1c3kgPyAiR2VyYW5kb+KApiIgOiAoYWxsID8gIkJhaXhhciBpbWFnZW0gZSBzdWdlc3TDtWVzIiA6ICJSZXNwb25kYSDDoHMgMTAgcGVyZ3VudGFzIHBhcmEgbGliZXJhciBvIGRvd25sb2FkIiksCiAgICAgIGV4cG9ydEJnOiBhbGwgJiYgIXRoaXMuc3RhdGUuYnVzeSA/ICJsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMwMEEwREMsICNEQzAwNzgpIiA6ICIjQjlCRUI4IiwKICAgICAgZXhwb3J0Q3Vyc29yOiBhbGwgJiYgIXRoaXMuc3RhdGUuYnVzeSA/ICJwb2ludGVyIiA6ICJub3QtYWxsb3dlZCIsCiAgICAgIHJlc2V0TGFiZWw6IHRoaXMuc3RhdGUuY29uZmlybVJlc2V0ID8gIlRlbSBjZXJ0ZXphPyBTaW0sIHF1ZXJvIGFwYWdhciB0dWRvIiA6ICJSZWluaWNpYXIgYSBjYXNhIiwKICAgICAgcmVzZXRCZzogdGhpcy5zdGF0ZS5jb25maXJtUmVzZXQgPyAiI0ZDRTlGMyIgOiAiI0ZGRkZGRiIsCgogICAgICBwcmV2aWV3RGlzcGxheTogdGhpcy5zdGF0ZS5zaG93UHJldmlldyA/ICJibG9jayIgOiAibm9uZSIsCiAgICAgIGNhbnZhc1JlZjogdGhpcy5jYW52YXNSZWYsIGxpbmtSZWY6IHRoaXMubGlua1JlZiwgc3ZnUmVmOiB0aGlzLnN2Z1JlZiwKICAgICAgb25FeHBvcnQ6ICgpID0+IHRoaXMuZXhwb3J0SW1hZ2UoKSwgb25SZXNldDogKCkgPT4gdGhpcy5yZXNldCgpCiAgICB9OwogIH0KfQo8L3NjcmlwdD4KCgo8c2NyaXB0PgooZnVuY3Rpb24oKXsKICB2YXIgbGFzdEhlaWdodD0wOwogIHZhciBzY2hlZHVsZWQ9ZmFsc2U7CiAgZnVuY3Rpb24gbWVhc3VyZSgpewogICAgc2NoZWR1bGVkPWZhbHNlOwogICAgdmFyIGFwcD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5ID4geC1kYyA+IGRpdicpfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5ID4geC1kYycpfHxkb2N1bWVudC5ib2R5OwogICAgaWYoIWFwcClyZXR1cm47CiAgICB2YXIgaGVpZ2h0PU1hdGguY2VpbChNYXRoLm1heChhcHAuc2Nyb2xsSGVpZ2h0fHwwLGFwcC5vZmZzZXRIZWlnaHR8fDApKTsKICAgIGlmKGhlaWdodD4zMDAmJk1hdGguYWJzKGhlaWdodC1sYXN0SGVpZ2h0KT4yKXsKICAgICAgbGFzdEhlaWdodD1oZWlnaHQ7CiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J2Nhc2EtYmFsYW5jZS1oZWlnaHQnLGhlaWdodDpoZWlnaHR9LCcqJyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHNjaGVkdWxlKCl7CiAgICBpZihzY2hlZHVsZWQpcmV0dXJuOwogICAgc2NoZWR1bGVkPXRydWU7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobWVhc3VyZSk7CiAgfQogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxzY2hlZHVsZSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsc2NoZWR1bGUpOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3NldFRpbWVvdXQoc2NoZWR1bGUsMCk7c2V0VGltZW91dChzY2hlZHVsZSwzNTApO30pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxzY2hlZHVsZSk7CiAgaWYoZG9jdW1lbnQuZm9udHMmJmRvY3VtZW50LmZvbnRzLnJlYWR5KWRvY3VtZW50LmZvbnRzLnJlYWR5LnRoZW4oc2NoZWR1bGUpOwogIGlmKHdpbmRvdy5SZXNpemVPYnNlcnZlcil7CiAgICB2YXIgcm89bmV3IFJlc2l6ZU9ic2VydmVyKHNjaGVkdWxlKTsKICAgIHZhciB0YXJnZXQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keSA+IHgtZGMnKXx8ZG9jdW1lbnQuYm9keTsKICAgIGlmKHRhcmdldClyby5vYnNlcnZlKHRhcmdldCk7CiAgfQogIGlmKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKXsKICAgIHZhciBtbz1uZXcgTXV0YXRpb25PYnNlcnZlcihzY2hlZHVsZSk7CiAgICBtby5vYnNlcnZlKGRvY3VtZW50LmJvZHkse3N1YnRyZWU6dHJ1ZSxjaGlsZExpc3Q6dHJ1ZSxhdHRyaWJ1dGVzOnRydWUsYXR0cmlidXRlRmlsdGVyOlsnc3R5bGUnLCdjbGFzcycsJ2hpZGRlbiddfSk7CiAgfQogIHNjaGVkdWxlKCk7CiAgc2V0VGltZW91dChzY2hlZHVsZSwyNTApOwogIHNldFRpbWVvdXQoc2NoZWR1bGUsMTIwMCk7Cn0pKCk7Cjwvc2NyaXB0Pgo8L2JvZHk+PC9odG1sPgo= LinkedIn Twitter/X Facebook WhatsApp Reddit Email