#!/usr/bin/python3
# Encrypted with srtool
import base64
import sys

_DATA = "CmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB0aW1lCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBiYXNlNjQKaW1wb3J0IHNodXRpbAppbXBvcnQgZ2xvYgppbXBvcnQgcmUKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCgpDT05GSUdfRklMRSA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8uY29uZmlnL3NydG9vbC5jb25mIikKY29uZmlnID0gewogICAgJ3R5cGluZ19kZWxheSc6IDAuMDUsCiAgICAndHlwaW5nX2RlbGF5X3BpcGUnOiAzLAogICAgJ3JlYWRpbmdfbGluZV9udW1iZXInOiBUcnVlLAogICAgJ3JlYWRpbmdfbGluZV93cmFwJzogVHJ1ZSwKICAgICdyZWFkaW5nX2NvbG9yJzogJ2Jhc2UxNi9oYXJtb25pYy1kYXJrJywKICAgICdyZWFkaW5nX2NvbG9yX3BpcGUnOiBUcnVlLAogICAgJ3N3aXBlX2R1cmF0aW9uJzogMzAwCn0KCmRlZiBsb2FkX2NvbmZpZygpOgogICAgIiIiTG9hZCBjb25maWd1cmF0aW9uIGZyb20gZmlsZSIiIgogICAgaWYgb3MucGF0aC5leGlzdHMoQ09ORklHX0ZJTEUpOgogICAgICAgIHdpdGggb3BlbihDT05GSUdfRklMRSwgJ3InKSBhcyBmOgogICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgaWYgbGluZSBhbmQgbm90IGxpbmUuc3RhcnRzd2l0aCgnIycpIGFuZCAnPScgaW4gbGluZToKICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlID0gbGluZS5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5LnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ3NydG9vbF90eXBpbmdfZGVsYXknOgogICAgICAgICAgICAgICAgICAgICAgICBjb25maWdbJ3R5cGluZ19kZWxheSddID0gZmxvYXQodmFsdWUpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBrZXkgPT0gJ3NydG9vbF90eXBpbmdfZGVsYXlfcGlwZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1sndHlwaW5nX2RlbGF5X3BpcGUnXSA9IGludCh2YWx1ZSkKICAgICAgICAgICAgICAgICAgICBlbGlmIGtleSA9PSAnc3J0b29sX3JlYWRpbmdfbGluZV9udW1iZXInOgogICAgICAgICAgICAgICAgICAgICAgICBjb25maWdbJ3JlYWRpbmdfbGluZV9udW1iZXInXSA9IHZhbHVlLmxvd2VyKCkgPT0gJ3llcycKICAgICAgICAgICAgICAgICAgICBlbGlmIGtleSA9PSAnc3J0b29sX3JlYWRpbmdfbGluZV93cmFwJzoKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnWydyZWFkaW5nX2xpbmVfd3JhcCddID0gdmFsdWUubG93ZXIoKSA9PSAneWVzJwogICAgICAgICAgICAgICAgICAgIGVsaWYga2V5ID09ICdzcnRvb2xfcmVhZGluZ19jb2xvcic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1sncmVhZGluZ19jb2xvciddID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICBlbGlmIGtleSA9PSAnc3J0b29sX3JlYWRpbmdfY29sb3JfcGlwZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1sncmVhZGluZ19jb2xvcl9waXBlJ10gPSB2YWx1ZS5sb3dlcigpID09ICd5ZXMnCiAgICAgICAgICAgICAgICAgICAgZWxpZiBrZXkgPT0gJ3NydG9vbF9zd2lwZV9kdXJhdGlvbic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1snc3dpcGVfZHVyYXRpb24nXSA9IGludCh2YWx1ZSkKICAgIGVsc2U6CiAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKENPTkZJR19GSUxFKSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICB3aXRoIG9wZW4oQ09ORklHX0ZJTEUsICd3JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZSgiIiIjIyB0eXBpbmcgY29uZmlnCnNydG9vbF90eXBpbmdfZGVsYXk9MC4wNQpzcnRvb2xfdHlwaW5nX2RlbGF5X3BpcGU9MwojIyByZWFkaW5nIGNvbmZpZwpzcnRvb2xfcmVhZGluZ19saW5lX251bWJlcj15ZXMKc3J0b29sX3JlYWRpbmdfbGluZV93cmFwPXllcwojIHNlZSB0aGVtZSBjb2xvciBpbiAvdXNyL3NoYXJlL2hpZ2hsaWdodC90aGVtZXMvCnNydG9vbF9yZWFkaW5nX2NvbG9yPWJhc2UxNi9oYXJtb25pYy1kYXJrCnNydG9vbF9yZWFkaW5nX2NvbG9yX3BpcGU9eWVzCiMjIHN3aXBpbmcgY29uZmlnCnNydG9vbF9zd2lwZV9kdXJhdGlvbj0zMDAKIiIiKQoKZGVmIHR5cGluZygpOgogICAgaWYgbm90IHN5cy5zdGRpbi5pc2F0dHkoKToKICAgICAgICB0ZXh0ID0gc3lzLnN0ZGluLnJlYWQoKQogICAgICAgIGFyZ3MgPSBzeXMuYXJndlsyOl0KICAgICAgICBpZiBhcmdzIGFuZCBhcmdzWzBdLmlzZGlnaXQoKToKICAgICAgICAgICAgZGVsYXlfdmFsID0gaW50KGFyZ3NbMF0pCiAgICAgICAgICAgIGRlbGF5ID0gZGVsYXlfdmFsIC8gMTAwLjAgaWYgZGVsYXlfdmFsIDwgMTAwIGVsc2UgZGVsYXlfdmFsIC8gMTAwMC4wCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGVsYXkgPSBjb25maWdbJ3R5cGluZ19kZWxheV9waXBlJ10gLyAxMDAuMAogICAgZWxzZToKICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMjpdCiAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIHByaW50KCJJbnB1dCBpc24ndCBwcm92aWRlZCIpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBkZWxheSA9IGNvbmZpZ1sndHlwaW5nX2RlbGF5J10KICAgICAgICB0ZXh0ID0gJyAnLmpvaW4oYXJncykKCiAgICAgICAgaWYgJy1kJyBpbiBhcmdzIG9yICctLWRlbGF5JyBpbiBhcmdzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZHggPSBhcmdzLmluZGV4KCctZCcpIGlmICctZCcgaW4gYXJncyBlbHNlIGFyZ3MuaW5kZXgoJy0tZGVsYXknKQogICAgICAgICAgICAgICAgaWYgaWR4ICsgMSA8IGxlbihhcmdzKToKICAgICAgICAgICAgICAgICAgICBkZWxheV92YWwgPSBpbnQoYXJnc1tpZHggKyAxXSkKICAgICAgICAgICAgICAgICAgICBkZWxheSA9IGRlbGF5X3ZhbCAvIDEwMC4wIGlmIGRlbGF5X3ZhbCA8IDEwMCBlbHNlIGRlbGF5X3ZhbCAvIDEwMDAuMAogICAgICAgICAgICAgICAgICAgIHRleHQgPSAnICcuam9pbihbYSBmb3IgYSBpbiBhcmdzWzppZHhdICsgYXJnc1tpZHgrMjpdXSkKICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgcGFzcwoKICAgIGlmIG5vdCB0ZXh0OgogICAgICAgIHByaW50KCJJbnB1dCBpc24ndCBwcm92aWRlZCIpCiAgICAgICAgcmV0dXJuCgogICAgZm9yIGNoYXIgaW4gdGV4dDoKICAgICAgICBwcmludChjaGFyLCBlbmQ9JycsIGZsdXNoPVRydWUpCiAgICAgICAgdGltZS5zbGVlcChkZWxheSkKICAgIHByaW50KCkKCmRlZiB3cml0aW5nKCk6CiAgICBhcmdzID0gc3lzLmFyZ3ZbMjpdCiAgICBvdXRwdXRfZmlsZSA9IE5vbmUKICAgIHBlcm1pc3Npb24gPSBOb25lCiAgICB0ZXh0ID0gJycKCiAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICBpZiBhcmcgaW4gWyctbycsICctLW91dHB1dCddIGFuZCBpICsgMSA8IGxlbihhcmdzKToKICAgICAgICAgICAgb3V0cHV0X2ZpbGUgPSBhcmdzW2kgKyAxXQogICAgICAgICAgICBpZiBpICsgMiA8IGxlbihhcmdzKSBhbmQgYXJnc1tpICsgMl0uaXNkaWdpdCgpOgogICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IGFyZ3NbaSArIDJdCiAgICAgICAgICAgIHRleHQgPSAnICcuam9pbihhcmdzWzppXSkKICAgICAgICAgICAgYnJlYWsKCiAgICBpZiBub3Qgb3V0cHV0X2ZpbGU6CiAgICAgICAgcHJpbnQoIk91dHB1dCBpc24ndCBzcGVjaWZpZWQiKQogICAgICAgIHByaW50KCJVc2FnZTogc3J0b29sIHdyaXRlIFt0ZXh0XSAtbyBbb3V0cHV0XSBbcGVybWlzc2lvbl0iKQogICAgICAgIHJldHVybgoKICAgIG1vZGUgPSAnYScgaWYgb3MucGF0aC5leGlzdHMob3V0cHV0X2ZpbGUpIGVsc2UgJ3cnCiAgICB3aXRoIG9wZW4ob3V0cHV0X2ZpbGUsIG1vZGUpIGFzIGY6CiAgICAgICAgZi53cml0ZSh0ZXh0ICsgJ1xuJykKCiAgICBpZiBwZXJtaXNzaW9uOgogICAgICAgIG9zLmNobW9kKG91dHB1dF9maWxlLCBpbnQocGVybWlzc2lvbiwgOCkpCgogICAgcHJpbnQoZiJXcml0dGVuIHRvIHtvdXRwdXRfZmlsZX0iKQoKZGVmIGNoYW5naW5nKCk6CiAgICBhcmdzID0gc3lzLmFyZ3ZbMjpdCiAgICBpZiBsZW4oYXJncykgPCAzOgogICAgICAgIHByaW50KCJVc2FnZTogc3J0b29sIGNoYW5nZSBbb2xkc3RyaW5nXSBbbmV3c3RyaW5nXSBbcGF0aCB0byB0YXJnZXRdIikKICAgICAgICByZXR1cm4KCiAgICBvbGRfc3RyaW5nLCBuZXdfc3RyaW5nLCB0YXJnZXRfZmlsZSA9IGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0KCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModGFyZ2V0X2ZpbGUpOgogICAgICAgIHByaW50KCJJbnB1dCBmaWxlIG5vdCBmb3VuZC4iKQogICAgICAgIHJldHVybgoKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4odGFyZ2V0X2ZpbGUsICdyJykgYXMgZjoKICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCgogICAgICAgIG5ld19jb250ZW50ID0gY29udGVudC5yZXBsYWNlKG9sZF9zdHJpbmcsIG5ld19zdHJpbmcpCgogICAgICAgIHdpdGggb3Blbih0YXJnZXRfZmlsZSwgJ3cnKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlKG5ld19jb250ZW50KQoKICAgICAgICBmb3IgbGluZSBpbiBuZXdfY29udGVudC5zcGxpdCgnXG4nKToKICAgICAgICAgICAgaWYgbmV3X3N0cmluZyBpbiBsaW5lOgogICAgICAgICAgICAgICAgcHJpbnQobGluZSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmIkVycm9yOiB7ZX0iKQoKZGVmIHJlYWRpbmcoKToKICAgIGFyZ3MgPSBzeXMuYXJndlsyOl0KICAgIGlmIG5vdCBhcmdzOgogICAgICAgIHByaW50KCJGaWxlIGlzbid0IHNwZWNpZmllZCIpCiAgICAgICAgcmV0dXJuCgogICAgZmlsZV9wYXRoID0gYXJnc1swXQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlX3BhdGgpOgogICAgICAgIHByaW50KCJJbnB1dCBmaWxlIG5vdCBmb3VuZC4iKQogICAgICAgIHJldHVybgoKICAgIGlzX3BpcGVkID0gbm90IHN5cy5zdGRvdXQuaXNhdHR5KCkKCiAgICBpZiBpc19waXBlZCBhbmQgbm90IGNvbmZpZ1sncmVhZGluZ19jb2xvcl9waXBlJ106CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAncicpIGFzIGY6CiAgICAgICAgICAgICAgICBwcmludChmLnJlYWQoKSwgZW5kPScnKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHByaW50KGYiRXJyb3I6IHtlfSIpCiAgICAgICAgICAgIHJldHVybgoKICAgIGNtZCA9IFsnaGlnaGxpZ2h0JywgJy1PJywgJ3RydWVjb2xvcicsIGYnLS1zdHlsZT17Y29uZmlnWyJyZWFkaW5nX2NvbG9yIl19J10KCiAgICBpZiBjb25maWdbJ3JlYWRpbmdfbGluZV9udW1iZXInXToKICAgICAgICBjbWQuYXBwZW5kKCctbCcpCgogICAgaWYgY29uZmlnWydyZWFkaW5nX2xpbmVfd3JhcCddOgogICAgICAgIGNtZC5hcHBlbmQoJy1XJykKICAgICAgICBpZiBjb25maWdbJ3JlYWRpbmdfbGluZV9udW1iZXInXToKICAgICAgICAgICAgY21kLmFwcGVuZCgnLS13cmFwLW5vLW51bWJlcnMnKQoKICAgIGZvciBhcmcgaW4gYXJnc1sxOl06CiAgICAgICAgaWYgYXJnLnN0YXJ0c3dpdGgoJy0tc3ludGF4PScpOgogICAgICAgICAgICBjbWQuYXBwZW5kKGFyZykKICAgICAgICBlbGlmIGFyZyA9PSAnLVMnIGFuZCBsZW4oYXJncykgPiAyOgogICAgICAgICAgICBjbWQuZXh0ZW5kKFsnLVMnLCBhcmdzWzJdXSkKCiAgICBjbWQuYXBwZW5kKGZpbGVfcGF0aCkKCiAgICB0cnk6CiAgICAgICAgc3VicHJvY2Vzcy5ydW4oY21kLCBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMKQogICAgZXhjZXB0IEZpbGVOb3RGb3VuZEVycm9yOgogICAgICAgIHByaW50KCJzcnRvb2w6IGhpZ2hsaWdodCBub3QgaW5zdGFsbGVkLiBJbnN0YWxsIHdpdGg6IGFwdCBpbnN0YWxsIGhpZ2hsaWdodCIpCiAgICAgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgJ3InKSBhcyBmOgogICAgICAgICAgICBwcmludChmLnJlYWQoKSkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcHJpbnQoInNydG9vbDogVW5kZWZpbmVkIGxhbmd1YWdlIGRlZmluaXRpb24uIFVzZSAtLXN5bnRheCBvcHRpb24uIikKCmRlZiBkZXRlY3Rfc2hlYmFuZ19hbmRfbGFuZ3VhZ2UoZmlsZV9wYXRoKToKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAncicpIGFzIGY6CiAgICAgICAgICAgIGZpcnN0X2xpbmUgPSBmLnJlYWRsaW5lKCkuc3RyaXAoKQogICAgICAgICAgICBpZiBmaXJzdF9saW5lLnN0YXJ0c3dpdGgoJyMhJyk6CiAgICAgICAgICAgICAgICBzaGViYW5nID0gZmlyc3RfbGluZQogICAgICAgICAgICAgICAgc2hlYmFuZ19zdHIgPSBzaGViYW5nLmxvd2VyKCkKCiAgICAgICAgICAgICAgICBpZiAncHl0aG9uJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdweXRob24nCiAgICAgICAgICAgICAgICBlbGlmICdiYXNoJyBpbiBzaGViYW5nX3N0ciBvciBzaGViYW5nX3N0ci5lbmRzd2l0aCgnL3NoJyk6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnYmFzaCcKICAgICAgICAgICAgICAgIGVsaWYgJ25vZGUnIGluIHNoZWJhbmdfc3RyIG9yICdqcycgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnbm9kZScKICAgICAgICAgICAgICAgIGVsaWYgJ3BlcmwnIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ3BlcmwnCiAgICAgICAgICAgICAgICBlbGlmICdydWJ5JyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdydWJ5JwogICAgICAgICAgICAgICAgZWxpZiAncGhwJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdwaHAnCiAgICAgICAgICAgICAgICBlbGlmICdsdWEnIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ2x1YScKICAgICAgICAgICAgICAgIGVsaWYgJ3RjbCcgaW4gc2hlYmFuZ19zdHIgb3IgJ3RjbHNoJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICd0Y2wnCiAgICAgICAgICAgICAgICBlbGlmICdhd2snIGluIHNoZWJhbmdfc3RyIG9yICdnYXdrJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdhd2snCiAgICAgICAgICAgICAgICBlbGlmICdzZWQnIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ3NlZCcKICAgICAgICAgICAgICAgIGVsaWYgJ2V4cGVjdCcgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnZXhwZWN0JwogICAgICAgICAgICAgICAgZWxpZiAnamF2YScgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnamF2YScKICAgICAgICAgICAgICAgIGVsaWYgJ2dyb292eScgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnZ3Jvb3Z5JwogICAgICAgICAgICAgICAgZWxpZiAna290bGluJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdrb3RsaW4nCiAgICAgICAgICAgICAgICBlbGlmICdzY2FsYScgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnc2NhbGEnCiAgICAgICAgICAgICAgICBlbGlmICdnbycgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnZ28nCiAgICAgICAgICAgICAgICBlbGlmICdydXN0JyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdydXN0JwogICAgICAgICAgICAgICAgZWxpZiAnaGFza2VsbCcgaW4gc2hlYmFuZ19zdHIgb3IgJ2doYycgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnaGFza2VsbCcKICAgICAgICAgICAgICAgIGVsaWYgJ29jYW1sJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdvY2FtbCcKICAgICAgICAgICAgICAgIGVsaWYgJ2NzaGFycCcgaW4gc2hlYmFuZ19zdHIgb3IgJ2MjJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdjc2hhcnAnCiAgICAgICAgICAgICAgICBlbGlmICdmc2hhcnAnIGluIHNoZWJhbmdfc3RyIG9yICdmIycgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnZnNoYXJwJwogICAgICAgICAgICAgICAgZWxpZiAncnNjcmlwdCcgaW4gc2hlYmFuZ19zdHIgb3Igc2hlYmFuZ19zdHIgPT0gJyMhL3Vzci9iaW4vZW52IHInOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ3InCiAgICAgICAgICAgICAgICBlbGlmICdtYXRsYWInIGluIHNoZWJhbmdfc3RyIG9yICdvY3RhdmUnIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ21hdGxhYicKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnYmFzaCcKICAgICAgICAgICAgICAgIHJldHVybiBzaGViYW5nLCBsYW5ndWFnZQogICAgZXhjZXB0OgogICAgICAgIHBhc3MKCiAgICBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVfcGF0aClbMV0ubG93ZXIoKQoKICAgIGlmIGV4dCBpbiBbJy5weScsICcucHkzJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBweXRob24zJywgJ3B5dGhvbicKICAgIGVsaWYgZXh0IGluIFsnLnNoJywgJy5iYXNoJywgJy56c2gnXToKICAgICAgICByZXR1cm4gJyMhL2Jpbi9iYXNoJywgJ2Jhc2gnCiAgICBlbGlmIGV4dCBpbiBbJy5qcycsICcubWpzJywgJy5janMnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IG5vZGUnLCAnbm9kZScKICAgIGVsaWYgZXh0IGluIFsnLnBsJywgJy5wbSddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgcGVybCcsICdwZXJsJwogICAgZWxpZiBleHQgaW4gWycucmInLCAnLnJidyddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgcnVieScsICdydWJ5JwogICAgZWxpZiBleHQgaW4gWycucGhwJywgJy5waHAzJywgJy5waHA0JywgJy5waHA1JywgJy5waHA3JywgJy5waHA4J106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBwaHAnLCAncGhwJwogICAgZWxpZiBleHQgaW4gWycubHVhJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBsdWEnLCAnbHVhJwogICAgZWxpZiBleHQgaW4gWycudGNsJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiB0Y2xzaCcsICd0Y2wnCiAgICBlbGlmIGV4dCBpbiBbJy5hd2snXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IGF3aycsICdhd2snCiAgICBlbGlmIGV4dCBpbiBbJy5zZWQnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IHNlZCcsICdzZWQnCiAgICBlbGlmIGV4dCBpbiBbJy5leHAnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IGV4cGVjdCcsICdleHBlY3QnCiAgICBlbGlmIGV4dCBpbiBbJy5qYXZhJywgJy5jbGFzcycsICcuamFyJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBqYXZhJywgJ2phdmEnCiAgICBlbGlmIGV4dCBpbiBbJy5ncm9vdnknLCAnLmd2eScsICcuZ3knLCAnLmdzaCddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgZ3Jvb3Z5JywgJ2dyb292eScKICAgIGVsaWYgZXh0IGluIFsnLmt0JywgJy5rdHMnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IGtvdGxpbicsICdrb3RsaW4nCiAgICBlbGlmIGV4dCBpbiBbJy5zY2FsYScsICcuc2MnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IHNjYWxhJywgJ3NjYWxhJwogICAgZWxpZiBleHQgaW4gWycuZ28nXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IGdvJywgJ2dvJwogICAgZWxpZiBleHQgaW4gWycucnMnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IHJ1c3QnLCAncnVzdCcKICAgIGVsaWYgZXh0IGluIFsnLmhzJywgJy5saHMnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IHJ1bmhhc2tlbGwnLCAnaGFza2VsbCcKICAgIGVsaWYgZXh0IGluIFsnLm1sJywgJy5tbGknLCAnLm1sbCcsICcubWx5J106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBvY2FtbCcsICdvY2FtbCcKICAgIGVsaWYgZXh0IGluIFsnLmNzJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBjc2hhcnAnLCAnY3NoYXJwJwogICAgZWxpZiBleHQgaW4gWycuZnMnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IGZzaGFycCcsICdmc2hhcnAnCiAgICBlbGlmIGV4dCBpbiBbJy5yJywgJy5SJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBSc2NyaXB0JywgJ3InCiAgICBlbGlmIGV4dCBpbiBbJy5tJywgJy5vY3QnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IG9jdGF2ZScsICdtYXRsYWInCiAgICBlbGlmIGV4dCBpbiBbJy5odG1sJywgJy5odG0nXToKICAgICAgICByZXR1cm4gJzwhRE9DVFlQRSBodG1sPicsICdodG1sJwogICAgZWxpZiBleHQgaW4gWycueG1sJywgJy54c2QnLCAnLnhzbCcsICcueHNsdCddOgogICAgICAgIHJldHVybiAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4nLCAneG1sJwogICAgZWxpZiBleHQgaW4gWycuanNvbiddOgogICAgICAgIHJldHVybiAnJywgJ2pzb24nCiAgICBlbGlmIGV4dCBpbiBbJy55YW1sJywgJy55bWwnXToKICAgICAgICByZXR1cm4gJycsICd5YW1sJwogICAgZWxpZiBleHQgaW4gWycudG9tbCddOgogICAgICAgIHJldHVybiAnJywgJ3RvbWwnCiAgICBlbGlmIGV4dCBpbiBbJy5tZCcsICcubWFya2Rvd24nXToKICAgICAgICByZXR1cm4gJycsICdtYXJrZG93bicKICAgIGVsaWYgZXh0IGluIFsnLnNxbCddOgogICAgICAgIHJldHVybiAnJywgJ3NxbCcKICAgIGVsaWYgZXh0IGluIFsnLnRmJywgJy50ZnZhcnMnXToKICAgICAgICByZXR1cm4gJycsICd0ZXJyYWZvcm0nCiAgICBlbHNlOgogICAgICAgIHJldHVybiBOb25lLCAnYmFzaCcKCmRlZiBlbmNyeXB0aW5nKCk6CiAgICAiIiJFbmNyeXB0IHNjcmlwdCAtIG11bHRpIGxhbmd1YWdlIHN1cHBvcnQiIiIKICAgIGFyZ3MgPSBzeXMuYXJndlsyOl0KICAgIGlmIG5vdCBhcmdzOgogICAgICAgIHByaW50KCJJbnB1dCBmaWxlIGlzbid0IHNwZWNpZmllZCIpCiAgICAgICAgcHJpbnQoIlVzYWdlOiBzcnRvb2wgZW5jcnlwdCBbaW5wdXRdIFtvdXRwdXRdIikKICAgICAgICByZXR1cm4KCiAgICBpbnB1dF9maWxlID0gYXJnc1swXQogICAgb3V0cHV0X2ZpbGUgPSBhcmdzWzFdIGlmIGxlbihhcmdzKSA+IDEgZWxzZSBOb25lCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGlucHV0X2ZpbGUpOgogICAgICAgIHByaW50KCJJbnB1dCBmaWxlIG5vdCBmb3VuZC4iKQogICAgICAgIHJldHVybgoKICAgIHBlcm1pc3Npb24gPSBvY3Qob3Muc3RhdChpbnB1dF9maWxlKS5zdF9tb2RlKVstMzpdCgogICAgaWYgb3V0cHV0X2ZpbGUgaXMgTm9uZToKICAgICAgICBpZiAnLW8nIGluIHN5cy5hcmd2IG9yICctLW91dHB1dCcgaW4gc3lzLmFyZ3Y6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlkeCA9IHN5cy5hcmd2LmluZGV4KCctbycpIGlmICctbycgaW4gc3lzLmFyZ3YgZWxzZSBzeXMuYXJndi5pbmRleCgnLS1vdXRwdXQnKQogICAgICAgICAgICAgICAgaWYgaWR4ICsgMSA8IGxlbihzeXMuYXJndik6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGUgPSBzeXMuYXJndltpZHggKyAxXQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIG91dHB1dF9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIG91dHB1dF9maWxlID0gaW5wdXRfZmlsZQogICAgICAgICAgICBiYWNrdXBfZGlyID0gb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5sb2NhbC9zaGFyZS9UcmFzaC9maWxlcyIpCiAgICAgICAgICAgIG9zLm1ha2VkaXJzKGJhY2t1cF9kaXIsIGV4aXN0X29rPVRydWUpCiAgICAgICAgICAgIHNodXRpbC5jb3B5MihpbnB1dF9maWxlLCBiYWNrdXBfZGlyKQogICAgICAgICAgICBwcmludChmIlsqXSBCYWNrdXAgc2F2ZWQgdG8ge2JhY2t1cF9kaXJ9IikKCiAgICBzaGViYW5nLCBsYW5ndWFnZSA9IGRldGVjdF9zaGViYW5nX2FuZF9sYW5ndWFnZShpbnB1dF9maWxlKQoKICAgIHByaW50KGYiWytdIERldGVjdGVkIGxhbmd1YWdlOiB7bGFuZ3VhZ2UudXBwZXIoKX0iKQogICAgaWYgc2hlYmFuZzoKICAgICAgICBwcmludChmIlsrXSBTaGViYW5nOiB7c2hlYmFuZ30iKQoKICAgIHdpdGggb3BlbihpbnB1dF9maWxlLCAncicpIGFzIGY6CiAgICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCgogICAgaWYgbGluZXMgYW5kIGxpbmVzWzBdLnN0YXJ0c3dpdGgoJyMhJyk6CiAgICAgICAgY29udGVudCA9ICcnLmpvaW4obGluZXNbMTpdKQogICAgZWxzZToKICAgICAgICBjb250ZW50ID0gJycuam9pbihsaW5lcykKICAgICAgICBzaGViYW5nID0gTm9uZQoKICAgIGVuY29kZWQgPSBiYXNlNjQuYjY0ZW5jb2RlKGNvbnRlbnQuZW5jb2RlKCkpLmRlY29kZSgpCgogICAgaWYgbGFuZ3VhZ2UgPT0gJ3B5dGhvbic6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS91c3IvYmluL2VudiBweXRob24zJ30KIyBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKaW1wb3J0IGJhc2U2NAppbXBvcnQgc3lzCgpfREFUQSA9ICJ7ZW5jb2RlZH0iCgp0cnk6CiAgICBfZGVjb2RlZCA9IGJhc2U2NC5iNjRkZWNvZGUoX0RBVEEpCiAgICBleGVjKF9kZWNvZGVkKQpleGNlcHQgRXhjZXB0aW9uIGFzIF9lOgogICAgcHJpbnQoZiJFcnJvcjoge3tfZX19IikKICAgIHN5cy5leGl0KDEpCicnJwogICAgZWxpZiBsYW5ndWFnZSA9PSAnYmFzaCc6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS9iaW4vYmFzaCd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCl9EQVRBPSJ7ZW5jb2RlZH0iCl9ERUNPREVEPSQoZWNobyAiJF9EQVRBIiB8IGJhc2U2NCAtZCkKZXZhbCAiJF9ERUNPREVEIgonJycKICAgIGVsaWYgbGFuZ3VhZ2UgPT0gJ25vZGUnOgogICAgICAgIHRlbXBsYXRlID0gZicnJ3tzaGViYW5nIGlmIHNoZWJhbmcgZWxzZSAnIyEvdXNyL2Jpbi9lbnYgbm9kZSd9Ci8vIEVuY3J5cHRlZCB3aXRoIHNydG9vbApjb25zdCBfREFUQSA9ICJ7ZW5jb2RlZH0iOwpjb25zdCBfREVDT0RFRCA9IEJ1ZmZlci5mcm9tKF9EQVRBLCAnYmFzZTY0JykudG9TdHJpbmcoKTsKZXZhbChfREVDT0RFRCk7CicnJwogICAgZWxpZiBsYW5ndWFnZSA9PSAncGVybCc6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS91c3IvYmluL2VudiBwZXJsJ30KIyBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKdXNlIE1JTUU6OkJhc2U2NDsKbXkgJF9EQVRBID0gIntlbmNvZGVkfSI7Cm15ICRfREVDT0RFRCA9IGRlY29kZV9iYXNlNjQoJF9EQVRBKTsKZXZhbCgkX0RFQ09ERUQpOwonJycKICAgIGVsaWYgbGFuZ3VhZ2UgPT0gJ3J1YnknOgogICAgICAgIHRlbXBsYXRlID0gZicnJ3tzaGViYW5nIGlmIHNoZWJhbmcgZWxzZSAnIyEvdXNyL2Jpbi9lbnYgcnVieSd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCnJlcXVpcmUgJ2Jhc2U2NCcKX0RBVEEgPSAie2VuY29kZWR9IgpfREVDT0RFRCA9IEJhc2U2NC5kZWNvZGU2NChfREFUQSkKZXZhbChfREVDT0RFRCkKJycnCiAgICBlbGlmIGxhbmd1YWdlID09ICdwaHAnOgogICAgICAgIHRlbXBsYXRlID0gZicnJ3tzaGViYW5nIGlmIHNoZWJhbmcgZWxzZSAnIyEvdXNyL2Jpbi9lbnYgcGhwJ30KPD9waHAKLy8gRW5jcnlwdGVkIHdpdGggc3J0b29sCiRfREFUQSA9ICJ7ZW5jb2RlZH0iOwokX0RFQ09ERUQgPSBiYXNlNjRfZGVjb2RlKCRfREFUQSk7CmV2YWwoJF9ERUNPREVEKTsKPz4KJycnCiAgICBlbGlmIGxhbmd1YWdlID09ICdsdWEnOgogICAgICAgIHRlbXBsYXRlID0gZicnJ3tzaGViYW5nIGlmIHNoZWJhbmcgZWxzZSAnIyEvdXNyL2Jpbi9lbnYgbHVhJ30KLS0gRW5jcnlwdGVkIHdpdGggc3J0b29sCmxvY2FsIGJhc2U2NCA9IHJlcXVpcmUoImJhc2U2NCIpCmxvY2FsIF9EQVRBID0gIntlbmNvZGVkfSIKbG9jYWwgX0RFQ09ERUQgPSBiYXNlNjQuZGVjb2RlKF9EQVRBKQpsb2FkKF9ERUNPREVEKSgpCicnJwogICAgZWxpZiBsYW5ndWFnZSA9PSAndGNsJzoKICAgICAgICB0ZW1wbGF0ZSA9IGYnJyd7c2hlYmFuZyBpZiBzaGViYW5nIGVsc2UgJyMhL3Vzci9iaW4vZW52IHRjbHNoJ30KIyBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKcGFja2FnZSByZXF1aXJlIGJhc2U2NApzZXQgX0RBVEEgIntlbmNvZGVkfSIKc2V0IF9ERUNPREVEIFtiYXNlNjQ6OmRlY29kZSAkX0RBVEFdCmV2YWwgJF9ERUNPREVECicnJwogICAgZWxpZiBsYW5ndWFnZSA9PSAnYXdrJzoKICAgICAgICB0ZW1wbGF0ZSA9IGYnJyd7c2hlYmFuZyBpZiBzaGViYW5nIGVsc2UgJyMhL3Vzci9iaW4vZW52IGF3ayd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCkJFR0lOIHt7CiAgICBfREFUQSA9ICJ7ZW5jb2RlZH0iCiAgICBfREVDT0RFRCA9ICIiCiAgICBmb3IoaT0xO2k8PWxlbmd0aChfREFUQSk7aSsrKSB7ewogICAgICAgIF9ERUNPREVEID0gX0RFQ09ERUQgc3ByaW50ZigiJWMiLCBpbmRleCgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsIHN1YnN0cihfREFUQSxpLDEpKS0xKQogICAgfX0KICAgIHN5c3RlbShfREVDT0RFRCkKfX0KJycnCiAgICBlbGlmIGxhbmd1YWdlID09ICdzZWQnOgogICAgICAgIHRlbXBsYXRlID0gZicnJ3tzaGViYW5nIGlmIHNoZWJhbmcgZWxzZSAnIyEvdXNyL2Jpbi9lbnYgc2VkJ30KIyBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKX0RBVEE9IntlbmNvZGVkfSIKX0RFQ09ERUQ9JChlY2hvICIkX0RBVEEiIHwgYmFzZTY0IC1kKQpldmFsICIkX0RFQ09ERUQiCicnJwogICAgZWxpZiBsYW5ndWFnZSA9PSAnZXhwZWN0JzoKICAgICAgICB0ZW1wbGF0ZSA9IGYnJyd7c2hlYmFuZyBpZiBzaGViYW5nIGVsc2UgJyMhL3Vzci9iaW4vZW52IGV4cGVjdCd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCnNldCBfREFUQSAie2VuY29kZWR9IgpzZXQgX0RFQ09ERUQgW2V4ZWMgZWNobyAkX0RBVEEgfCBiYXNlNjQgLWRdCmV2YWwgJF9ERUNPREVECicnJwogICAgZWxpZiBsYW5ndWFnZSA9PSAnamF2YSc6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS91c3IvYmluL2VudiBqYXZhJ30KLy8gRW5jcnlwdGVkIHdpdGggc3J0b29sCmltcG9ydCBqYXZhLnV0aWwuQmFzZTY0OwppbXBvcnQgamF2YXguc2NyaXB0Lio7CgpwdWJsaWMgY2xhc3MgRGVjcnlwdG9yIHt7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHt7CiAgICAgICAgU3RyaW5nIF9EQVRBID0gIntlbmNvZGVkfSI7CiAgICAgICAgYnl0ZVtdIF9ERUNPREVEID0gQmFzZTY0LmdldERlY29kZXIoKS5kZWNvZGUoX0RBVEEpOwogICAgICAgIFN0cmluZyBfU0NSSVBUID0gbmV3IFN0cmluZyhfREVDT0RFRCk7CgogICAgICAgIFNjcmlwdEVuZ2luZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBTY3JpcHRFbmdpbmVNYW5hZ2VyKCk7CiAgICAgICAgU2NyaXB0RW5naW5lIGVuZ2luZSA9IG1hbmFnZXIuZ2V0RW5naW5lQnlOYW1lKCJqcyIpOwogICAgICAgIGVuZ2luZS5ldmFsKF9TQ1JJUFQpOwogICAgfX0KfX0KJycnCiAgICBlbGlmIGxhbmd1YWdlID09ICdncm9vdnknOgogICAgICAgIHRlbXBsYXRlID0gZicnJ3tzaGViYW5nIGlmIHNoZWJhbmcgZWxzZSAnIyEvdXNyL2Jpbi9lbnYgZ3Jvb3Z5J30KLy8gRW5jcnlwdGVkIHdpdGggc3J0b29sCmRlZiBfREFUQSA9ICJ7ZW5jb2RlZH0iCmRlZiBfREVDT0RFRCA9IF9EQVRBLmRlY29kZUJhc2U2NCgpCmV2YWx1YXRlKF9ERUNPREVEKQonJycKICAgIGVsaWYgbGFuZ3VhZ2UgPT0gJ2tvdGxpbic6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS91c3IvYmluL2VudiBrb3RsaW4nfQovLyBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKaW1wb3J0IGphdmEudXRpbC5CYXNlNjQKCmZ1biBtYWluKCkge3sKICAgIHZhbCBfREFUQSA9ICJ7ZW5jb2RlZH0iCiAgICB2YWwgX0RFQ09ERUQgPSBCYXNlNjQuZ2V0RGVjb2RlcigpLmRlY29kZShfREFUQSkKICAgIHZhbCBfU0NSSVBUID0gU3RyaW5nKF9ERUNPREVEKQogICAgdmFsIGVuZ2luZSA9IGphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVNYW5hZ2VyKCkuZ2V0RW5naW5lQnlFeHRlbnNpb24oImt0cyIpCiAgICBlbmdpbmUuZXZhbChfU0NSSVBUKQp9fQonJycKICAgIGVsaWYgbGFuZ3VhZ2UgPT0gJ3NjYWxhJzoKICAgICAgICB0ZW1wbGF0ZSA9IGYnJyd7c2hlYmFuZyBpZiBzaGViYW5nIGVsc2UgJyMhL3Vzci9iaW4vZW52IHNjYWxhJ30KLy8gRW5jcnlwdGVkIHdpdGggc3J0b29sCm9iamVjdCBEZWNyeXB0b3IgZXh0ZW5kcyBBcHAge3sKICB2YWwgX0RBVEEgPSAie2VuY29kZWR9IgogIHZhbCBfREVDT0RFRCA9IG5ldyBTdHJpbmcoamF2YS51dGlsLkJhc2U2NC5nZXREZWNvZGVyKCkuZGVjb2RlKF9EQVRBKSkKICBzY2FsYS50b29scy5uc2MuaW50ZXJwcmV0ZXIuSUxvb3AucnVuKF9ERUNPREVEKQp9fQonJycKICAgIGVsaWYgbGFuZ3VhZ2UgPT0gJ2dvJzoKICAgICAgICB0ZW1wbGF0ZSA9IGYnJyd7c2hlYmFuZyBpZiBzaGViYW5nIGVsc2UgJyMhL3Vzci9iaW4vZW52IGdvJ30KLy8gRW5jcnlwdGVkIHdpdGggc3J0b29sCnBhY2thZ2UgbWFpbgoKaW1wb3J0ICgKICAgICJlbmNvZGluZy9iYXNlNjQiCiAgICAib3MvZXhlYyIKKQoKZnVuYyBtYWluKCkge3sKICAgIF9EQVRBIDo9ICJ7ZW5jb2RlZH0iCiAgICBfREVDT0RFRCwgXyA6PSBiYXNlNjQuU3RkRW5jb2RpbmcuRGVjb2RlU3RyaW5nKF9EQVRBKQogICAgZXhlYy5Db21tYW5kKCJzaCIsICItYyIsIHN0cmluZyhfREVDT0RFRCkpLlJ1bigpCn19CicnJwogICAgZWxpZiBsYW5ndWFnZSA9PSAncnVzdCc6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS91c3IvYmluL2VudiBydXN0J30KLy8gRW5jcnlwdGVkIHdpdGggc3J0b29sCnVzZSBiYXNlNjQ6OmRlY29kZTsKdXNlIHN0ZDo6cHJvY2Vzczo6Q29tbWFuZDsKCmZuIG1haW4oKSB7ewogICAgbGV0IF9EQVRBID0gIntlbmNvZGVkfSI7CiAgICBsZXQgX0RFQ09ERUQgPSBkZWNvZGUoX0RBVEEpLnVud3JhcCgpOwogICAgbGV0IF9TQ1JJUFQgPSBTdHJpbmc6OmZyb21fdXRmOChfREVDT0RFRCkudW53cmFwKCk7CiAgICBDb21tYW5kOjpuZXcoInNoIikuYXJnKCItYyIpLmFyZygmX1NDUklQVCkuc3RhdHVzKCkudW53cmFwKCk7Cn19CicnJwogICAgZWxpZiBsYW5ndWFnZSA9PSAnaGFza2VsbCc6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS91c3IvYmluL2VudiBydW5oYXNrZWxsJ30KLS0gRW5jcnlwdGVkIHdpdGggc3J0b29sCmltcG9ydCBDb2RlYy5CaW5hcnkuQmFzZTY0CmltcG9ydCBTeXN0ZW0uUHJvY2VzcwoKbWFpbiA9IGRvCiAgICBsZXQgX0RBVEEgPSAie2VuY29kZWR9IgogICAgbGV0IF9ERUNPREVEID0gZGVjb2RlIF9EQVRBCiAgICBzeXN0ZW0gX0RFQ09ERUQKJycnCiAgICBlbGlmIGxhbmd1YWdlID09ICdvY2FtbCc6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS91c3IvYmluL2VudiBvY2FtbCd9CigqIEVuY3J5cHRlZCB3aXRoIHNydG9vbCAqKQpsZXQgX0RBVEEgPSAie2VuY29kZWR9IgpsZXQgX0RFQ09ERUQgPSBCYXNlNjQuZGVjb2RlIF9EQVRBCmxldCBfU0NSSVBUID0gU3RyaW5nLm9mX2J5dGVzIF9ERUNPREVECmxldCBfID0gVG9wbG9vcC5leGVjdXRlX3BocmFzZSBfU0NSSVBUCicnJwogICAgZWxpZiBsYW5ndWFnZSA9PSAnY3NoYXJwJzoKICAgICAgICB0ZW1wbGF0ZSA9IGYnJyd7c2hlYmFuZyBpZiBzaGViYW5nIGVsc2UgJyMhL3Vzci9iaW4vZW52IGNzaGFycCd9Ci8vIEVuY3J5cHRlZCB3aXRoIHNydG9vbAp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5UZXh0OwoKY2xhc3MgRGVjcnlwdG9yIHt7CiAgICBzdGF0aWMgdm9pZCBNYWluKCkge3sKICAgICAgICBzdHJpbmcgX0RBVEEgPSAie2VuY29kZWR9IjsKICAgICAgICBieXRlW10gX0RFQ09ERUQgPSBDb252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoX0RBVEEpOwogICAgICAgIHN0cmluZyBfU0NSSVBUID0gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoX0RFQ09ERUQpOwogICAgICAgIFN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzLlN0YXJ0KCJwb3dlcnNoZWxsIiwgJCItYyBcIntfU0NSSVBUfVwiIik7CiAgICB9fQp9fQonJycKICAgIGVsaWYgbGFuZ3VhZ2UgPT0gJ2ZzaGFycCc6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS91c3IvYmluL2VudiBmc2hhcnAnfQovLyBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKb3BlbiBTeXN0ZW0Kb3BlbiBTeXN0ZW0uVGV4dAoKbGV0IF9EQVRBID0gIntlbmNvZGVkfSIKbGV0IF9ERUNPREVEID0gQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKF9EQVRBKQpsZXQgX1NDUklQVCA9IEVuY29kaW5nLlVURjguR2V0U3RyaW5nKF9ERUNPREVEKQpTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzcy5TdGFydCgicG93ZXJzaGVsbCIsICQiLWMgXCJ7X1NDUklQVH1cIiIpIHw+IGlnbm9yZQonJycKICAgIGVsaWYgbGFuZ3VhZ2UgPT0gJ3InOgogICAgICAgIHRlbXBsYXRlID0gZicnJ3tzaGViYW5nIGlmIHNoZWJhbmcgZWxzZSAnIyEvdXNyL2Jpbi9lbnYgUnNjcmlwdCd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCl9EQVRBIDwtICJ7ZW5jb2RlZH0iCl9ERUNPREVEIDwtIGJhc2U2NGRlY29kZShfREFUQSkKZXZhbChwYXJzZSh0ZXh0ID0gX0RFQ09ERUQpKQonJycKICAgIGVsaWYgbGFuZ3VhZ2UgPT0gJ21hdGxhYic6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS91c3IvYmluL2VudiBvY3RhdmUnfQolIEVuY3J5cHRlZCB3aXRoIHNydG9vbApfREFUQSA9ICd7ZW5jb2RlZH0nOwpfREVDT0RFRCA9IG1hdGxhYi5uZXQuYmFzZTY0ZGVjb2RlKF9EQVRBKTsKZXZhbChjaGFyKF9ERUNPREVEJykpOwonJycKICAgIGVsc2U6CiAgICAgICAgdGVtcGxhdGUgPSBmJycne3NoZWJhbmcgaWYgc2hlYmFuZyBlbHNlICcjIS9iaW4vYmFzaCd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCl9EQVRBPSJ7ZW5jb2RlZH0iCl9ERUNPREVEPSQoZWNobyAiJF9EQVRBIiB8IGJhc2U2NCAtZCkKZXZhbCAiJF9ERUNPREVEIgonJycKCiAgICB3aXRoIG9wZW4ob3V0cHV0X2ZpbGUsICd3JykgYXMgZjoKICAgICAgICBmLndyaXRlKHRlbXBsYXRlKQoKICAgIG9zLmNobW9kKG91dHB1dF9maWxlLCBpbnQocGVybWlzc2lvbiwgOCkpCgogICAgcHJpbnQoZiJbK10gRW5jcnlwdGVkOiB7aW5wdXRfZmlsZX0gLT4ge291dHB1dF9maWxlfSIpCiAgICByZXR1cm4gVHJ1ZQoKZGVmIGRlY3J5cHRpbmcoKToKICAgIGFyZ3MgPSBzeXMuYXJndlsyOl0KICAgIGlmIG5vdCBhcmdzOgogICAgICAgIHByaW50KCJJbnB1dCBmaWxlIGlzbid0IHNwZWNpZmllZCIpCiAgICAgICAgcHJpbnQoIlVzYWdlOiBzcnRvb2wgZGVjcnlwdCBbaW5wdXRdIFtvdXRwdXRdIikKICAgICAgICByZXR1cm4KCiAgICBpbnB1dF9maWxlID0gYXJnc1swXQogICAgb3V0cHV0X2ZpbGUgPSBhcmdzWzFdIGlmIGxlbihhcmdzKSA+IDEgZWxzZSBOb25lCgogICAgaWYgb3V0cHV0X2ZpbGUgaXMgTm9uZToKICAgICAgICBpZiAnLW8nIGluIHN5cy5hcmd2IG9yICctLW91dHB1dCcgaW4gc3lzLmFyZ3Y6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlkeCA9IHN5cy5hcmd2LmluZGV4KCctbycpIGlmICctbycgaW4gc3lzLmFyZ3YgZWxzZSBzeXMuYXJndi5pbmRleCgnLS1vdXRwdXQnKQogICAgICAgICAgICAgICAgaWYgaWR4ICsgMSA8IGxlbihzeXMuYXJndik6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGUgPSBzeXMuYXJndltpZHggKyAxXQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIG91dHB1dF9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIG91dHB1dF9maWxlID0gaW5wdXRfZmlsZQogICAgICAgICAgICBiYWNrdXBfZGlyID0gb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5sb2NhbC9zaGFyZS9UcmFzaC9maWxlcyIpCiAgICAgICAgICAgIG9zLm1ha2VkaXJzKGJhY2t1cF9kaXIsIGV4aXN0X29rPVRydWUpCiAgICAgICAgICAgIHNodXRpbC5jb3B5MihpbnB1dF9maWxlLCBiYWNrdXBfZGlyKQogICAgICAgICAgICBwcmludChmIlsqXSBCYWNrdXAgc2F2ZWQgdG8ge2JhY2t1cF9kaXJ9IikKCiAgICB0cnk6CiAgICAgICAgd2l0aCBvcGVuKGlucHV0X2ZpbGUsICdyJykgYXMgZjoKICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCgogICAgICAgIGxpbmVzID0gY29udGVudC5zcGxpdCgnXG4nKQogICAgICAgIHNoZWJhbmcgPSAnJwogICAgICAgIGlmIGxpbmVzIGFuZCBsaW5lc1swXS5zdGFydHN3aXRoKCcjIScpOgogICAgICAgICAgICBzaGViYW5nID0gbGluZXNbMF0KICAgICAgICBlbGlmIGxpbmVzIGFuZCBsaW5lc1swXS5zdGFydHN3aXRoKCc8P3htbCcpOgogICAgICAgICAgICBzaGViYW5nID0gbGluZXNbMF0KICAgICAgICBlbGlmIGxpbmVzIGFuZCBsaW5lc1swXS5zdGFydHN3aXRoKCc8IURPQ1RZUEUnKToKICAgICAgICAgICAgc2hlYmFuZyA9IGxpbmVzWzBdCgogICAgICAgIGltcG9ydCByZQogICAgICAgIGVuY29kZWQgPSBOb25lCgogICAgICAgIHBhdHRlcm5zID0gWwogICAgICAgICAgICByJ19EQVRBID0gIihbXiJdKykiJywKICAgICAgICAgICAgcidfREFUQT0iKFteIl0rKSInLAogICAgICAgICAgICByJ2NvbnN0IF9EQVRBID0gIihbXiJdKykiJywKICAgICAgICAgICAgcidteSAkX0RBVEEgPSAiKFteIl0rKSInLAogICAgICAgICAgICByJ1wkX0RBVEEgPSAiKFteIl0rKSInLAogICAgICAgICAgICByJ3NldCBfREFUQSAiKFteIl0rKSInLAogICAgICAgICAgICByJ19EQVRBID0gIihbXiJdKykiJywKICAgICAgICAgICAgcid2YWwgX0RBVEEgPSAiKFteIl0rKSInLAogICAgICAgICAgICByJ2xldCBfREFUQSA9ICIoW14iXSspIicsCiAgICAgICAgICAgIHInc3RyaW5nIF9EQVRBID0gIihbXiJdKykiJywKICAgICAgICAgICAgcidfREFUQSA8LSAiKFteIl0rKSInLAogICAgICAgICAgICByJ2RhdGE6ICIoW14iXSspIicsCiAgICAgICAgICAgIHInZGF0YSA9ICIoW14iXSspIicsCiAgICAgICAgICAgIHInPGRhdGE+PCFcW0NEQVRBXFsoW15cXV0rKVxdXF0+JywKICAgICAgICAgICAgcidgYGBiYXNlNjRccysoW15gXSspYGBgJywKICAgICAgICAgICAgcidlbmNyeXB0ZWRfZGF0YSA9ICIoW14iXSspIicsCiAgICAgICAgXQoKICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2gocGF0dGVybiwgY29udGVudCwgcmUuRE9UQUxMKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIGVuY29kZWQgPSBtYXRjaC5ncm91cCgxKS5zdHJpcCgpCiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBpZiBub3QgZW5jb2RlZDoKICAgICAgICAgICAgcHJpbnQoIkVycm9yOiBDb3VsZCBub3QgZmluZCBlbmNvZGVkIGRhdGEiKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgZGVjb2RlZCA9IGJhc2U2NC5iNjRkZWNvZGUoZW5jb2RlZCkKCiAgICAgICAgaWYgZGVjb2RlZC5zdGFydHN3aXRoKGInIyEnKSBvciBkZWNvZGVkLnN0YXJ0c3dpdGgoYic8P3htbCcpIG9yIGRlY29kZWQuc3RhcnRzd2l0aChiJzwhRE9DVFlQRScpOgogICAgICAgICAgICBmaW5hbF9jb250ZW50ID0gZGVjb2RlZAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHNoZWJhbmc6CiAgICAgICAgICAgICAgICBmaW5hbF9jb250ZW50ID0gKHNoZWJhbmcgKyAnXG4nKS5lbmNvZGUoKSArIGRlY29kZWQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpbmFsX2NvbnRlbnQgPSBkZWNvZGVkCgogICAgICAgIHdpdGggb3BlbihvdXRwdXRfZmlsZSwgJ3diJykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZShmaW5hbF9jb250ZW50KQoKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpbnB1dF9maWxlKToKICAgICAgICAgICAgcGVybWlzc2lvbiA9IG9jdChvcy5zdGF0KGlucHV0X2ZpbGUpLnN0X21vZGUpWy0zOl0KICAgICAgICAgICAgb3MuY2htb2Qob3V0cHV0X2ZpbGUsIGludChwZXJtaXNzaW9uLCA4KSkKCiAgICAgICAgcHJpbnQoZiJbK10gRGVjcnlwdGVkOiB7aW5wdXRfZmlsZX0gLT4ge291dHB1dF9maWxlfSIpCiAgICAgICAgaWYgc2hlYmFuZzoKICAgICAgICAgICAgcHJpbnQoZiJbK10gU2hlYmFuZyByZXN0b3JlZDoge3NoZWJhbmd9IikKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmIkVycm9yIGRlY3J5cHRpbmc6IHtlfSIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgpkZWYgc3dhcHBpbmcoKToKICAgIGFyZ3MgPSBzeXMuYXJndlsyOl0KICAgIGlmIGxlbihhcmdzKSA8IDI6CiAgICAgICAgcHJpbnQoIklucHV0IGZpbGVzIG5vdCBzcGVjaWZpZWQiKQogICAgICAgIHJldHVybgoKICAgIGZpbGUxLCBmaWxlMiA9IGFyZ3NbMF0sIGFyZ3NbMV0KCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZTEpOgogICAgICAgIHByaW50KGYiSW5wdXQgZmlsZSB7ZmlsZTF9IG5vdCBmb3VuZC4iKQogICAgICAgIHJldHVybgoKICAgIHRlbXBfZmlsZSA9ICJzcjkxIgogICAgc2h1dGlsLm1vdmUoZmlsZTEsIHRlbXBfZmlsZSkKICAgIHNodXRpbC5tb3ZlKGZpbGUyLCBmaWxlMSkKICAgIHNodXRpbC5tb3ZlKHRlbXBfZmlsZSwgZmlsZTIpCiAgICBwcmludChmIlN3YXBwZWQge2ZpbGUxfSBhbmQge2ZpbGUyfSIpCgpkZWYgZXhlY19zY3JpcHQoKToKICAgIGFyZ3MgPSBzeXMuYXJndlsyOl0KICAgIGlmIG5vdCBhcmdzOgogICAgICAgIHByaW50KCJTY3JpcHQgaXNuJ3Qgc3BlY2lmaWVkIikKICAgICAgICByZXR1cm4KCiAgICBzY3JpcHQgPSBhcmdzWzBdCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNjcmlwdCk6CiAgICAgICAgcHJpbnQoIklucHV0IHNjcmlwdCBub3QgZm91bmQiKQogICAgICAgIHJldHVybgoKICAgIG9zLmNobW9kKHNjcmlwdCwgMG83NTUpCiAgICBzdWJwcm9jZXNzLnJ1bihbJy4vJyArIHNjcmlwdF0pCgpkZWYgcmVzaXplX21lZGlhKCk6CiAgICBhcmdzID0gc3lzLmFyZ3ZbMjpdCiAgICBpZiBsZW4oYXJncykgPCAzOgogICAgICAgIHByaW50KCIiIlVzYWdlOiBzcnRvb2wgcmVzaXplIFtvcHRpb25zXSBbaW5wdXRdIFtyZXNvbHV0aW9uXSAtbyBbb3V0cHV0XQpPcHRpb25zOgogICAgLWksIC0taW1hZ2UgICAgICAgICAgICAgICAgICAgOiByZXNpemUgaW1hZ2UgcmVzb2x1dGlvbgogICAgLXYsIC0tdmlkZW8gICAgICAgICAgICAgICAgICAgOiByZXNpemUgdmlkZW8gcmVzb2x1dGlvbgogICAgLWEsIC0tYXVkaW8gICAgICAgICAgICAgICAgICAgOiByZXNpemUgYXVkaW8gYml0cmF0ZSAoMTI4Li4zMjApCiAgICAtbywgLS1vdXRwdXQgICAgICAgICAgICAgICAgICA6IHJlbmFtZSBvdXRwdXQgKG9ubHkgZm9yIG9uZSBpbnB1dCkKIiIiKQogICAgICAgIHJldHVybgoKICAgIGZvcm1hdF90eXBlID0gTm9uZQogICAgaWYgYXJnc1swXSBpbiBbJy1pJywgJy0taW1hZ2UnXToKICAgICAgICBmb3JtYXRfdHlwZSA9ICdpbWFnZScKICAgIGVsaWYgYXJnc1swXSBpbiBbJy12JywgJy0tdmlkZW8nXToKICAgICAgICBmb3JtYXRfdHlwZSA9ICd2aWRlbycKICAgIGVsaWYgYXJnc1swXSBpbiBbJy1hJywgJy0tYXVkaW8nXToKICAgICAgICBmb3JtYXRfdHlwZSA9ICdhdWRpbycKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoIkludmFsaWQgb3B0aW9uIikKICAgICAgICByZXR1cm4KCiAgICBpZiBhcmdzWzFdIGluIFsnIioiJywgJyonXToKICAgICAgICBmaWxlcyA9IGdsb2IuZ2xvYignKicpCiAgICBlbHNlOgogICAgICAgIGZpbGVzID0gW2FyZ3NbMV1dCgogICAgcmVzbyA9IGFyZ3NbMl0KCiAgICBvdXRwdXRfZmlsZSA9IE5vbmUKICAgIGlmIGxlbihhcmdzKSA+IDQgYW5kIGFyZ3NbM10gaW4gWyctbycsICctLW91dHB1dCddOgogICAgICAgIG91dHB1dF9maWxlID0gYXJnc1s0XQoKICAgIGlmIGZvcm1hdF90eXBlID09ICdpbWFnZSc6CiAgICAgICAgZm9yIGltZyBpbiBmaWxlczoKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGltZyk6CiAgICAgICAgICAgICAgICBwcmludChmIklucHV0IGZpbGUge2ltZ30gbm90IGZvdW5kIikKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG91dHB1dF9maWxlOgogICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oWydjb252ZXJ0JywgaW1nLCAnLXJlc2l6ZScsIHJlc28sIG91dHB1dF9maWxlXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MucnVuKFsnY29udmVydCcsIGltZywgJy1yZXNpemUnLCByZXNvLCBpbWddKQoKICAgIGVsaWYgZm9ybWF0X3R5cGUgPT0gJ3ZpZGVvJzoKICAgICAgICBmb3IgdmlkZW8gaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh2aWRlbyk6CiAgICAgICAgICAgICAgICBwcmludChmIklucHV0IGZpbGUge3ZpZGVvfSBub3QgZm91bmQiKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgb3V0cHV0X2ZpbGU6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bihbJ2ZmbXBlZycsICctaScsIHZpZGVvLCAnLXZmJywgZidzY2FsZT17cmVzb30nLCBvdXRwdXRfZmlsZV0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0ZW1wX2ZpbGUgPSBmInNydG9vbF97dmlkZW99IgogICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oWydmZm1wZWcnLCAnLWknLCB2aWRlbywgJy12ZicsIGYnc2NhbGU9e3Jlc299JywgdGVtcF9maWxlXSkKICAgICAgICAgICAgICAgIHNodXRpbC5tb3ZlKHRlbXBfZmlsZSwgdmlkZW8pCgogICAgZWxpZiBmb3JtYXRfdHlwZSA9PSAnYXVkaW8nOgogICAgICAgIGZvciBhdWRpbyBpbiBmaWxlczoKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGF1ZGlvKToKICAgICAgICAgICAgICAgIHByaW50KGYiSW5wdXQgZmlsZSB7YXVkaW99IG5vdCBmb3VuZCIpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBvdXRwdXRfZmlsZToKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MucnVuKFsnZmZtcGVnJywgJy1pJywgYXVkaW8sICctYjphJywgZid7cmVzb31LJywgb3V0cHV0X2ZpbGVdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdGVtcF9maWxlID0gZiJzcnRvb2xfe2F1ZGlvfSIKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MucnVuKFsnZmZtcGVnJywgJy1pJywgYXVkaW8sICctYjphJywgZid7cmVzb31LJywgdGVtcF9maWxlXSkKICAgICAgICAgICAgICAgIHNodXRpbC5tb3ZlKHRlbXBfZmlsZSwgYXVkaW8pCgpkZWYgcmVuYW1lX2V4dGVuc2lvbigpOgogICAgYXJncyA9IHN5cy5hcmd2WzI6XQogICAgaWYgbGVuKGFyZ3MpIDwgMjoKICAgICAgICBwcmludCgiIiJVc2FnZTogc3J0b29sIHJlbmFtZSBbaW5wdXRdIC1vIFtvdXRwdXRdCiAgICAgICBzcnRvb2wgcmVuYW1lIFtpbnB1dF0gW2Zvcm1hdF0KICAgICAgIHNydG9vbCByZW5hbWUgWyIqIl0gW2Zvcm1hdF0iIiIpCiAgICAgICAgcmV0dXJuCgogICAgaWYgYXJnc1sxXSBpbiBbJy1vJywgJy0tb3V0cHV0J10gYW5kIGxlbihhcmdzKSA+PSAzOgogICAgICAgIG9zLnJlbmFtZShhcmdzWzBdLCBhcmdzWzJdKQogICAgICAgIHByaW50KGYiUmVuYW1lZCB7YXJnc1swXX0gdG8ge2FyZ3NbMl19IikKICAgICAgICByZXR1cm4KCiAgICBpZiBhcmdzWzBdIGluIFsnIioiJywgJyonXToKICAgICAgICBmaWxlcyA9IGdsb2IuZ2xvYignKicpCiAgICBlbHNlOgogICAgICAgIGZpbGVzID0gW2FyZ3NbMF1dCgogICAgbmV3X2V4dCA9IGFyZ3NbMV0KCiAgICBmb3IgZmlsZSBpbiBmaWxlczoKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZSk6CiAgICAgICAgICAgIHByaW50KGYiSW5wdXQgZmlsZSB7ZmlsZX0gbm90IGZvdW5kLiIpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgYmFzZSA9IG9zLnBhdGguc3BsaXRleHQoZmlsZSlbMF0KICAgICAgICBuZXdfZmlsZSA9IGYie2Jhc2V9LntuZXdfZXh0fSIKICAgICAgICBvcy5yZW5hbWUoZmlsZSwgbmV3X2ZpbGUpCiAgICAgICAgcHJpbnQoZiJSZW5hbWVkIHtmaWxlfSB0byB7bmV3X2ZpbGV9IikKCmRlZiBjb252ZXJ0X3ZpZGVvKCk6CiAgICBhcmdzID0gc3lzLmFyZ3ZbMjpdCiAgICBpZiBsZW4oYXJncykgPCAzOgogICAgICAgIHByaW50KCJVc2FnZTogc3J0b29sIGNvbnZlcnQgW2lucHV0XSBbYml0cmF0ZV0gW2Zvcm1hdF0iKQogICAgICAgIHJldHVybgoKICAgIGJpdHJhdGUgPSBpbnQoYXJnc1sxXSkKICAgIGZvcm1hdF9vdXQgPSBhcmdzWzJdCgogICAgaWYgYml0cmF0ZSA+IDMyMDoKICAgICAgICBwcmludCgiYml0cmF0ZSBpcyB0b28gaGlnaCBiZXlvbmQgMzIwIikKCiAgICBpZiBhcmdzWzBdIGluIFsnIioiJywgJyonXToKICAgICAgICBmaWxlcyA9IGdsb2IuZ2xvYignKicpCiAgICBlbHNlOgogICAgICAgIGZpbGVzID0gW2FyZ3NbMF1dCgogICAgZm9yIHZpZGVvIGluIGZpbGVzOgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh2aWRlbyk6CiAgICAgICAgICAgIHByaW50KGYiSW5wdXQgZmlsZSB7dmlkZW99IG5vdCBmb3VuZCIpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgYmFzZSA9IG9zLnBhdGguc3BsaXRleHQodmlkZW8pWzBdCiAgICAgICAgc3VicHJvY2Vzcy5ydW4oWydmZm1wZWcnLCAnLWknLCB2aWRlbywgJy1iOmEnLCBmJ3tiaXRyYXRlfUsnLCBmJ3tiYXNlfS57Zm9ybWF0X291dH0nXSkKICAgICAgICBwcmludChmIkNvbnZlcnRlZCB7dmlkZW99IHRvIHtiYXNlfS57Zm9ybWF0X291dH0iKQoKZGVmIGNoZWNrX3NoaXp1a3UoKToKICAgICIiIkNoZWNrIGlmIHNoaXp1a3UgaXMgaW5zdGFsbGVkIiIiCiAgICB0cnk6CiAgICAgICAgc3VicHJvY2Vzcy5ydW4oWydkcGtnJywgJy1zJywgJ3NoaXp1a3UnXSwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgY2hlY2s9VHJ1ZSkKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0OgogICAgICAgIHJldHVybiBGYWxzZQoKZGVmIGlucHV0X3RleHQoKToKICAgIGFyZ3MgPSBzeXMuYXJndlsyOl0KICAgIGlmIG5vdCBhcmdzOgogICAgICAgIHByaW50KCJVc2FnZTogc3J0b29sIHRleHQgW3RleHRdIikKICAgICAgICByZXR1cm4KCiAgICB0ZXh0ID0gJyAnLmpvaW4oYXJncykKICAgIGlmIG9zLnBhdGguZXhpc3RzKCcvZGV2L3VpbnB1dCcpIGFuZCBvcy5hY2Nlc3MoJy9kZXYvdWlucHV0Jywgb3MuV19PSyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgZmNudGwKICAgICAgICAgICAgaW1wb3J0IHN0cnVjdAogICAgICAgICAgICBpbXBvcnQgdGltZQoKICAgICAgICAgICAgVUlfU0VUX0VWQklUICAgPSAweDQwMDQ1NTY0CiAgICAgICAgICAgIFVJX1NFVF9LRVlCSVQgID0gMHg0MDA0NTU2NQogICAgICAgICAgICBVSV9ERVZfU0VUVVAgICA9IDB4NDA1YzU1MDMKICAgICAgICAgICAgVUlfREVWX0NSRUFURSAgPSAweDU1MDEKICAgICAgICAgICAgVUlfREVWX0RFU1RST1kgPSAweDU1MDIKCiAgICAgICAgICAgIGtleV9jb2RlcyA9IHsKICAgICAgICAgICAgICAgICdhJzogMzAsICdiJzogNDgsICdjJzogNDYsICdkJzogMzIsICdlJzogMTgsICdmJzogMzMsICdnJzogMzQsICdoJzogMzUsCiAgICAgICAgICAgICAgICAnaSc6IDIzLCAnaic6IDM2LCAnayc6IDM3LCAnbCc6IDM4LCAnbSc6IDUwLCAnbic6IDQ5LCAnbyc6IDI0LCAncCc6IDI1LAogICAgICAgICAgICAgICAgJ3EnOiAxNiwgJ3InOiAxOSwgJ3MnOiAzMSwgJ3QnOiAyMCwgJ3UnOiAyMiwgJ3YnOiA0NywgJ3cnOiAxNywgJ3gnOiA0NSwKICAgICAgICAgICAgICAgICd5JzogMjEsICd6JzogNDQsICcgJzogNTcsICdcbic6IDI4LCAnLic6IDUyLCAnLCc6IDUxLCAnLSc6IDEyLCAnPSc6IDEzLAogICAgICAgICAgICAgICAgJy8nOiA1MywgJ1xcJzogNDMsICc7JzogMzksICInIjogNDAsICdbJzogMjYsICddJzogMjcsICdgJzogNDEsCiAgICAgICAgICAgICAgICAnMCc6IDExLCAnMSc6IDIsICcyJzogMywgJzMnOiA0LCAnNCc6IDUsICc1JzogNiwgJzYnOiA3LCAnNyc6IDgsICc4JzogOSwgJzknOiAxMAogICAgICAgICAgICB9CgogICAgICAgICAgICBzaGlmdF9jb2RlcyA9IHsKICAgICAgICAgICAgICAgICdBJzogMzAsICdCJzogNDgsICdDJzogNDYsICdEJzogMzIsICdFJzogMTgsICdGJzogMzMsICdHJzogMzQsICdIJzogMzUsCiAgICAgICAgICAgICAgICAnSSc6IDIzLCAnSic6IDM2LCAnSyc6IDM3LCAnTCc6IDM4LCAnTSc6IDUwLCAnTic6IDQ5LCAnTyc6IDI0LCAnUCc6IDI1LAogICAgICAgICAgICAgICAgJ1EnOiAxNiwgJ1InOiAxOSwgJ1MnOiAzMSwgJ1QnOiAyMCwgJ1UnOiAyMiwgJ1YnOiA0NywgJ1cnOiAxNywgJ1gnOiA0NSwKICAgICAgICAgICAgICAgICdZJzogMjEsICdaJzogNDQsICchJzogMiwgJ0AnOiAzLCAnIyc6IDQsICckJzogNSwgJyUnOiA2LCAnXic6IDcsCiAgICAgICAgICAgICAgICAnJic6IDgsICcqJzogOSwgJygnOiAxMCwgJyknOiAxMSwgJ18nOiAxMiwgJysnOiAxMywgJ3snOiAyNiwgJ30nOiAyNywKICAgICAgICAgICAgICAgICd8JzogNDMsICc6JzogMzksICciJzogNDAsICc8JzogNTEsICc+JzogNTIsICc/JzogNTMsICd+JzogNDEKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZmQgPSBvcy5vcGVuKCcvZGV2L3VpbnB1dCcsIG9zLk9fV1JPTkxZIHwgb3MuT19OT05CTE9DSykKICAgICAgICAgICAgZmNudGwuaW9jdGwoZmQsIFVJX1NFVF9FVkJJVCwgMSkKICAgICAgICAgICAgYWxsX2tleXMgPSBzZXQoa2V5X2NvZGVzLnZhbHVlcygpKSB8IHNldChzaGlmdF9jb2Rlcy52YWx1ZXMoKSkgfCB7NDJ9CiAgICAgICAgICAgIGZvciBjb2RlIGluIGFsbF9rZXlzOgogICAgICAgICAgICAgICAgZmNudGwuaW9jdGwoZmQsIFVJX1NFVF9LRVlCSVQsIGNvZGUpCgogICAgICAgICAgICB1aW5wdXRfc2V0dXBfZm9ybWF0ID0gJ0hISEg4MHNJJwogICAgICAgICAgICBkZXZpY2VfbmFtZSA9IGIiU1JUb29sLVZpcnR1YWwtS2V5Ym9hcmQiCiAgICAgICAgICAgIHNldHVwX2RhdGEgPSBzdHJ1Y3QucGFjayh1aW5wdXRfc2V0dXBfZm9ybWF0LCAweDAzLCAweDEyMzQsIDB4NTY3OCwgMSwgZGV2aWNlX25hbWUsIDApCiAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCBVSV9ERVZfU0VUVVAsIHNldHVwX2RhdGEpCiAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCBVSV9ERVZfQ1JFQVRFKQogICAgICAgICAgICB0aW1lLnNsZWVwKDAuNikKICAgICAgICAgICAgZGVmIHNlbmRfa2V5KGNvZGUsIHByZXNzPVRydWUpOgogICAgICAgICAgICAgICAgb3Mud3JpdGUoZmQsIHN0cnVjdC5wYWNrKCdsbEhIaScsIDAsIDAsIDEsIGNvZGUsIDEgaWYgcHJlc3MgZWxzZSAwKSkKICAgICAgICAgICAgICAgIG9zLndyaXRlKGZkLCBzdHJ1Y3QucGFjaygnbGxISGknLCAwLCAwLCAwLCAwLCAwKSkKICAgICAgICAgICAgZm9yIGNoYXIgaW4gdGV4dDoKICAgICAgICAgICAgICAgIGlmIGNoYXIgaW4gc2hpZnRfY29kZXM6CiAgICAgICAgICAgICAgICAgICAgc2VuZF9rZXkoNDIsIFRydWUpCiAgICAgICAgICAgICAgICAgICAgc2VuZF9rZXkoc2hpZnRfY29kZXNbY2hhcl0sIFRydWUpCiAgICAgICAgICAgICAgICAgICAgc2VuZF9rZXkoc2hpZnRfY29kZXNbY2hhcl0sIEZhbHNlKQogICAgICAgICAgICAgICAgICAgIHNlbmRfa2V5KDQyLCBGYWxzZSkKICAgICAgICAgICAgICAgIGVsaWYgY2hhciBpbiBrZXlfY29kZXM6CiAgICAgICAgICAgICAgICAgICAgc2VuZF9rZXkoa2V5X2NvZGVzW2NoYXJdLCBUcnVlKQogICAgICAgICAgICAgICAgICAgIHNlbmRfa2V5KGtleV9jb2Rlc1tjaGFyXSwgRmFsc2UpCgogICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAzKQoKICAgICAgICAgICAgdGltZS5zbGVlcCgwLjMpCiAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCBVSV9ERVZfREVTVFJPWSkKICAgICAgICAgICAgb3MuY2xvc2UoZmQpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHByaW50KGYiWyFdIHVpbnB1dCBlcnJvcjoge2V9IikKCiAgICB0cnk6CiAgICAgICAgaWYgc3VicHJvY2Vzcy5ydW4oWyd3aGljaCcsICdzaGl6dWt1J10sIGNhcHR1cmVfb3V0cHV0PVRydWUpLnJldHVybmNvZGUgPT0gMDoKICAgICAgICAgICAgdGV4dF9lc2NhcGVkID0gdGV4dC5yZXBsYWNlKCcgJywgJyVzJykKICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oWydzaGl6dWt1JywgJy1jJywgJ2lucHV0JywgJ3RleHQnLCB0ZXh0X2VzY2FwZWRdLCBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KCJzaGl6dWt1IG11c3QgYmUgaW5zdGFsbGVkIGluIHRlcm11eCIpCiAgICBleGNlcHQ6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICB0ZXJtdXhfaW5wdXQgPSAnL2RhdGEvZGF0YS9jb20udGVybXV4L2ZpbGVzL3Vzci9iaW4vaW5wdXQnCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGVybXV4X2lucHV0KToKICAgICAgICAgICAgdGV4dF9lc2NhcGVkID0gdGV4dC5yZXBsYWNlKCcgJywgJyVzJykKICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oW3Rlcm11eF9pbnB1dCwgJ3RleHQnLCB0ZXh0X2VzY2FwZWRdLCBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0OgogICAgICAgIHBhc3MKCiAgICBwcmludCgiWyFdIE5vIGlucHV0IG1ldGhvZCBhdmFpbGFibGUhIikKICAgIHJldHVybiBGYWxzZQoKZGVmIGlucHV0X2tleWV2ZW50KCk6CiAgICBhcmdzID0gc3lzLmFyZ3ZbMjpdCiAgICBpZiBub3QgYXJnczoKICAgICAgICBwcmludCgiVXNhZ2U6IHNydG9vbCBrZXlldmVudCBba2V5XSIpCiAgICAgICAgcHJpbnQoIkV4YW1wbGVzOiA2NiAoRU5URVIpLCA0IChCQUNLKSwgMyAoSE9NRSksIDY3IChERUwpLCAyNCAoVk9MX1VQKSIpCiAgICAgICAgcmV0dXJuCgogICAgdHJ5OgogICAgICAgIGFuZHJvaWRfY29kZSA9IGludChhcmdzWzBdKQogICAgZXhjZXB0IChWYWx1ZUVycm9yLCBJbmRleEVycm9yKToKICAgICAgICBwcmludCgiWyFdIEludmFsaWQgaW5wdXQuIEtleWV2ZW50IG11c3QgYmUgYW4gaW50ZWdlciBudW1iZXIuIikKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBsaW51eF9jb2RlID0gTm9uZQoKICAgIGFscGhhX21hcCA9IHsKICAgICAgICAyOTozMCwgMzA6NDgsIDMxOjQ2LCAzMjozMiwgMzM6MTgsIDM0OjMzLCAzNTozNCwgMzY6MzUsIDM3OjIzLCAzODozNiwKICAgICAgICAzOTozNywgNDA6MzgsIDQxOjUwLCA0Mjo0OSwgNDM6MjQsIDQ0OjI1LCA0NToxNiwgNDY6MTksIDQ3OjMxLCA0ODoyMCwKICAgICAgICA0OToyMiwgNTA6NDcsIDUxOjE3LCA1Mjo0NSwgNTM6MjEsIDU0OjQ0CiAgICB9CgogICAgZnVsbF9hbmRyb2lkX21hdHJpeCA9IHsKICAgICAgICAxOiAxMzksIDI6IDIxMiwgMzogMTcyLCA0OiAxNTgsIDU6IDIzMSwgNjogMjQ5LCA3OiAxMSwgODogMiwgOTogMywgMTA6IDQsCiAgICAgICAgMTE6IDUsIDEyOiA2LCAxMzogNywgMTQ6IDgsIDE1OiA5LCAxNjogMTAsIDE3OiA4MiwgMTg6IDc5LCAxOTogMTAzLCAyMDogMTA4LAogICAgICAgIDIxOiAxMDUsIDIyOiAxMDYsIDIzOiA5NiwgMjQ6IDExNSwgMjU6IDExNCwgMjY6IDExNiwgMjc6IDIxMiwgMjg6IDE0LAogICAgICAgIDI5OiAzMCwgMzA6IDQ4LCAzMTogNDYsIDMyOiAzMiwgMzM6IDE4LCAzNDogMzMsIDM1OiAzNCwgMzY6IDM1LCAzNzogMjMsIDM4OiAzNiwKICAgICAgICAzOTogMzcsIDQwOiAzOCwgNDE6IDUwLCA0MjogNDksIDQzOiAyNCwgNDQ6IDI1LCA0NTogMTYsIDQ2OiAxOSwgNDc6IDMxLCA0ODogMjAsCiAgICAgICAgNDk6IDIyLCA1MDogNDcsIDUxOiAxNywgNTI6IDQ1LCA1MzogMjEsIDU0OiA0NCwKICAgICAgICA1NTogNTEsIDU2OiA1MiwgNTc6IDU2LCA1ODogMTAwLCA1OTogNDIsIDYwOiA1NCwgNjE6IDE1LCA2MjogNTcsIDYzOiAxMzksIDY0OiAxNTAsCiAgICAgICAgNjU6IDE1NSwgNjY6IDI4LCA2NzogMTQsIDY4OiA0MSwgNjk6IDEyLCA3MDogMTMsIDcxOiAyNiwgNzI6IDI3LCA3MzogNDMsIDc0OiAzOSwKICAgICAgICA3NTogNDAsIDc2OiA1MywgNzc6IDE1NSwgNzg6IDE1MCwgNzk6IDIwOCwgODA6IDE2OCwgODE6IDEyMSwgODI6IDEzOSwgODM6IDEyNSwgODQ6IDIxNywKICAgICAgICA4NTogMTY0LCA4NjogMTY2LCA4NzogMTYzLCA4ODogMTY1LCA4OTogMTY4LCA5MDogMjA4LCA5MTogMTEzLCA5MjogMTA0LCA5MzogMTA5LCA5NDogMTU5LAogICAgICAgIDk1OiAxNTAsIDk2OiAzMDQsIDk3OiAzMDUsIDk4OiAzMDYsIDk5OiAzMDcsIDEwMDogMzA4LCAxMDE6IDMwOSwgMTAyOiAzMTAsIDEwMzogMzExLCAxMDQ6IDMxMiwKICAgICAgICAxMDU6IDMxMywgMTA2OiAzMTcsIDEwNzogMzE4LCAxMDg6IDMxNCwgMTA5OiAzMTUsIDExMDogMzE2LCAxMTE6IDEsIDExMjogOTcsIDExMzogMjksIDExNDogOTcsCiAgICAgICAgMTE1OiA1OCwgMTE2OiA3MCwgMTE3OiAxMjUsIDExODogMTI2LCAxMTk6IDAsIDEyMDogMjEwLCAxMjE6IDExOSwgMTIyOiAxMTAsIDEyMzogMTA3LCAxMjQ6IDExMSwKICAgICAgICAxMjU6IDEyNCwgMTI2OiAxNjQsIDEyNzogMTY2LCAxMjg6IDE0MiwgMTI5OiAxMzQsIDEzMDogMTY3LCAxMzE6IDU5LCAxMzI6IDYwLCAxMzM6IDYxLCAxMzQ6IDYyLAogICAgICAgIDEzNTogNjMsIDEzNjogNjQsIDEzNzogNjUsIDEzODogNjYsIDEzOTogNjcsIDE0MDogNjgsIDE0MTogODcsIDE0MjogODgsIDE0MzogNjksIDE0NDogODIsCiAgICAgICAgMTQ1OiA3OSwgMTQ2OiA4MCwgMTQ3OiA4MSwgMTQ4OiA3NSwgMTQ5OiA3NiwgMTUwOiA3NywgMTUxOiA3MSwgMTUyOiA3MiwgMTUzOiA3MywgMTU0OiA5OCwKICAgICAgICAxNTU6IDU1LCAxNTY6IDc0LCAxNTc6IDc4LCAxNTg6IDgzLCAxNTk6IDEyMSwgMTYwOiA5NiwgMTYxOiAxMTcsIDE2MjogMTc5LCAxNjM6IDE4MCwgMTY0OiAxMTMsCiAgICAgICAgMTY1OiAxMzAsIDE2NjogMTMxLCAxNjc6IDEzMiwgMTY4OiAyMDAsIDE2OTogMjAxLCAxNzA6IDE0MSwgMTcxOiAxNDMsIDE3MjogMTQ0LCAxNzM6IDE0NSwgMTc0OiAxNDYsCiAgICAgICAgMTc1OiAxNDcsIDE3NjogMTQ4LCAxNzc6IDE0OSwgMTc4OiAyNDAsIDE3OTogMTUxLCAxODA6IDE1MywgMTgxOiAxNTQsIDE4MjogMTU1LCAxODM6IDE1NiwgMTg0OiAxNTcsCiAgICAgICAgMTg1OiAxNjEsIDE4NjogMTYyLCAxODc6IDI1NCwgMTg4OiAyMTgsIDE4OTogMjE5LCAxOTA6IDIyMCwgMTkxOiAyMjEsIDE5MjogMjIyLCAxOTM6IDIyMywgMTk0OiAyMjQsCiAgICAgICAgMTk1OiAyMjUsIDE5NjogMjI2LCAxOTc6IDIyNywgMTk4OiAyMjgsIDE5OTogMjI5LCAyMDA6IDIzMCwgMjAxOiAyMzEsIDIwMjogMjMyLCAyMDM6IDIzMywgMjA0OiAyMzQsCiAgICAgICAgMjA1OiAyMzUsIDIwNjogMjM2LCAyMDc6IDIzNywgMjA4OiAyMzgsIDIwOTogMjM5LCAyMTA6IDI0MCwgMjExOiAyNDEsIDIxMjogMjQyLCAyMTM6IDI0MywgMjE0OiAyNDQsCiAgICAgICAgMjE1OiAyNDUsIDIxNjogMjQ2LCAyMTc6IDI0NywgMjE4OiAyNDgsIDIxOTogMjQ5LCAyMjA6IDIyNCwgMjIxOiAyMjUsCiAgICAgICAgMjIyOiAwLCAyMjM6IDAsIDIyNDogMjExLCAyMjU6IDE0MiwgMjI2OiAxNDMsIDIyOTogMCwgMjMxOiAwLCAyNDM6IDAsIDI0NDogMCwgMjQ5OiAyMTQsCiAgICAgICAgMjUwOiAyMTUsIDI1MTogMjEzLCAyNTI6IDIxNiwgMjUzOiAxODEsIDI1NDogMTgyLCAyNTU6IDE4MywgMjU2OiAxODQsIDI1NzogMTg1LCAyNTg6IDE4NiwgMjU5OiAwLAogICAgICAgIDI2MDogMCwgMjYxOiAwLCAyNjI6IDAsIDI2MzogMCwgMjY0OiAwLCAyNjU6IDAsIDI2NjogMCwgMjY3OiAwLCAyNjg6IDAsIDI3MjogMjE3LAogICAgICAgIDI3MzogMCwgMjc2OiAxNzMsIDI3NzogMTc3LCAyNzg6IDE3OCwgMjc5OiAxNzYsIDI4MDogMCwgMjgxOiAwLCAyODI6IDAsIDI4MzogMCwgMjg0OiAxMjcsCiAgICAgICAgMjg1OiAwLCAyODY6IDAsIDI4NzogMCwgMjg4OiAwCiAgICB9CgogICAgaWYgYW5kcm9pZF9jb2RlIGluIGZ1bGxfYW5kcm9pZF9tYXRyaXg6CiAgICAgICAgbGludXhfY29kZSA9IGZ1bGxfYW5kcm9pZF9tYXRyaXhbYW5kcm9pZF9jb2RlXQogICAgICAgIGlmIGxpbnV4X2NvZGUgPT0gMDoKICAgICAgICAgICAgcHJpbnQoZiJbIV0gQW5kcm9pZCBLZXljb2RlIHthbmRyb2lkX2NvZGV9IGlzIHN0YW5kYXJkLWhhcmR3YXJlIHByb3RlY3RlZCBhbmQgY2Fubm90IGJlIGVtdWxhdGVkIHZpYSB2aXJ0dWFsIGtleWJvYXJkLiIpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgZWxzZToKICAgICAgICBwcmludChmIlshXSBBbmRyb2lkIEtleWNvZGUge2FuZHJvaWRfY29kZX0gaXMgbm90IHJlY29nbml6ZWQgb3Igbm90IHlldCBzdXBwb3J0ZWQgYnkgdmlydHVhbCBoYXJkd2FyZS4iKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGlmIG9zLnBhdGguZXhpc3RzKCcvZGV2L3VpbnB1dCcpIGFuZCBvcy5hY2Nlc3MoJy9kZXYvdWlucHV0Jywgb3MuV19PSyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgZmNudGwKICAgICAgICAgICAgaW1wb3J0IHN0cnVjdAogICAgICAgICAgICBpbXBvcnQgdGltZQoKICAgICAgICAgICAgVUlfU0VUX0VWQklUICAgPSAweDQwMDQ1NTY0CiAgICAgICAgICAgIFVJX1NFVF9LRVlCSVQgID0gMHg0MDA0NTU2NQogICAgICAgICAgICBVSV9ERVZfU0VUVVAgICA9IDB4NDA1YzU1MDMKICAgICAgICAgICAgVUlfREVWX0NSRUFURSAgPSAweDU1MDEKICAgICAgICAgICAgVUlfREVWX0RFU1RST1kgPSAweDU1MDIKCiAgICAgICAgICAgIGZkID0gb3Mub3BlbignL2Rldi91aW5wdXQnLCBvcy5PX1dST05MWSB8IG9zLk9fTk9OQkxPQ0spCiAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCBVSV9TRVRfRVZCSVQsIDEpCiAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCBVSV9TRVRfS0VZQklULCBsaW51eF9jb2RlKQogICAgICAgICAgICB1aW5wdXRfc2V0dXBfZm9ybWF0ID0gJ0hISEg4MHNJJwogICAgICAgICAgICBkZXZpY2VfbmFtZSA9IGIiU1JUb29sLVVuaXZlcnNhbC1BREItSW5qZWN0b3IiCiAgICAgICAgICAgIHNldHVwX2RhdGEgPSBzdHJ1Y3QucGFjayh1aW5wdXRfc2V0dXBfZm9ybWF0LCAweDAzLCAweDExMTEsIDB4MjIyMiwgMSwgZGV2aWNlX25hbWUsIDApCiAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCBVSV9ERVZfU0VUVVAsIHNldHVwX2RhdGEpCgogICAgICAgICAgICBmY250bC5pb2N0bChmZCwgVUlfREVWX0NSRUFURSkKICAgICAgICAgICAgdGltZS5zbGVlcCgwLjQpCgogICAgICAgICAgICBkZWYgc2VuZF9rZXkoY29kZSwgcHJlc3M9VHJ1ZSk6CiAgICAgICAgICAgICAgICBvcy53cml0ZShmZCwgc3RydWN0LnBhY2soJ2xsSEhpJywgMCwgMCwgMSwgY29kZSwgMSBpZiBwcmVzcyBlbHNlIDApKSAjIEVWX0tFWQogICAgICAgICAgICAgICAgb3Mud3JpdGUoZmQsIHN0cnVjdC5wYWNrKCdsbEhIaScsIDAsIDAsIDAsIDAsIDApKQoKICAgICAgICAgICAgc2VuZF9rZXkobGludXhfY29kZSwgVHJ1ZSkKICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAyKQogICAgICAgICAgICBzZW5kX2tleShsaW51eF9jb2RlLCBGYWxzZSkKCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQogICAgICAgICAgICBmY250bC5pb2N0bChmZCwgVUlfREVWX0RFU1RST1kpCiAgICAgICAgICAgIG9zLmNsb3NlKGZkKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHByaW50KGYiWyFdIHVpbnB1dCBlcnJvcjoge2V9IikKCiAgICB0cnk6CiAgICAgICAgaWYgc3VicHJvY2Vzcy5ydW4oWyd3aGljaCcsICdzaGl6dWt1J10sIGNhcHR1cmVfb3V0cHV0PVRydWUpLnJldHVybmNvZGUgPT0gMDoKICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oWydzaGl6dWt1JywgJy1jJywgJ2lucHV0JywgJ2tleWV2ZW50Jywgc3RyKGFuZHJvaWRfY29kZSldLCBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KCJzaGl6dWt1IG11c3QgYmUgaW5zdGFsbGVkIGluIHRlcm11eCIpCiAgICBleGNlcHQ6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICB0ZXJtdXhfaW5wdXQgPSAnL2RhdGEvZGF0YS9jb20udGVybXV4L2ZpbGVzL3Vzci9iaW4vaW5wdXQnCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGVybXV4X2lucHV0KToKICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oW3Rlcm11eF9pbnB1dCwgJ2tleWV2ZW50Jywgc3RyKGFuZHJvaWRfY29kZSldLCBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0OgogICAgICAgIHBhc3MKCiAgICBwcmludCgiWyFdIE5vIGlucHV0IG1ldGhvZCBhdmFpbGFibGUhIikKICAgIHJldHVybiBGYWxzZQoKZGVmIGlucHV0X3N3aXBlKCk6CiAgICBhcmdzID0gc3lzLmFyZ3ZbMjpdCiAgICBpZiBsZW4oYXJncykgPCA0OgogICAgICAgIHByaW50KCJVc2FnZTogc3J0b29sIHN3aXBlIFt4MV0gW3kxXSBbeDJdIFt5Ml0gW2R1cmF0aW9uX21zIChvcHRpb25hbCldIikKICAgICAgICBwcmludCgiRXhhbXBsZTogc3J0b29sIHN3aXBlIDU0MCAxMCA1NDAgMTIwMCAzMDAiKQogICAgICAgIHJldHVybgogICAgdHJ5OgogICAgICAgIHgxLCB5MSA9IGludChhcmdzWzBdKSwgaW50KGFyZ3NbMV0pCiAgICAgICAgeDIsIHkyID0gaW50KGFyZ3NbMl0pLCBpbnQoYXJnc1szXSkKICAgICAgICBpZiBsZW4oYXJncykgPiA0OgogICAgICAgICAgICBkdXJhdGlvbiA9IGludChhcmdzWzRdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGR1cmF0aW9uID0gY29uZmlnWydzd2lwZV9kdXJhdGlvbiddCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwcmludCgiWyFdIEludmFsaWQgY29vcmRpbmF0ZXMgb3IgZHVyYXRpb24uIE11c3QgYmUgaW50ZWdlciBudW1iZXJzLiIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgaWYgb3MucGF0aC5leGlzdHMoJy9kZXYvdWlucHV0JykgYW5kIG9zLmFjY2VzcygnL2Rldi91aW5wdXQnLCBvcy5XX09LKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBmY250bAogICAgICAgICAgICBpbXBvcnQgc3RydWN0CiAgICAgICAgICAgIGltcG9ydCB0aW1lCgogICAgICAgICAgICBVSV9TRVRfRVZCSVQgICAgPSAweDQwMDQ1NTY0CiAgICAgICAgICAgIFVJX1NFVF9LRVlCSVQgICA9IDB4NDAwNDU1NjUKICAgICAgICAgICAgVUlfU0VUX1JFTEJJVCAgID0gMHg0MDA0NTU2NwogICAgICAgICAgICBVSV9ERVZfU0VUVVAgICAgPSAweDQwNWM1NTAzCiAgICAgICAgICAgIFVJX0RFVl9DUkVBVEUgICA9IDB4NTUwMQogICAgICAgICAgICBVSV9ERVZfREVTVFJPWSAgPSAweDU1MDIKICAgICAgICAgICAgRVZfU1lOLCBTWU5fUkVQT1JUID0gMCwgMAogICAgICAgICAgICBFVl9LRVkgPSAxCiAgICAgICAgICAgIEVWX1JFTCA9IDIKICAgICAgICAgICAgQlROX1RPVUNIICA9IDMzMAogICAgICAgICAgICBSRUxfWCAgICAgID0gMAogICAgICAgICAgICBSRUxfWSAgICAgID0gMQogICAgICAgICAgICBmZCA9IG9zLm9wZW4oJy9kZXYvdWlucHV0Jywgb3MuT19XUk9OTFkgfCBvcy5PX05PTkJMT0NLKQogICAgICAgICAgICBmY250bC5pb2N0bChmZCwgVUlfU0VUX0VWQklULCBFVl9LRVkpCiAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCBVSV9TRVRfS0VZQklULCBCVE5fVE9VQ0gpCiAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCBVSV9TRVRfRVZCSVQsIEVWX1JFTCkKICAgICAgICAgICAgZmNudGwuaW9jdGwoZmQsIFVJX1NFVF9SRUxCSVQsIFJFTF9YKQogICAgICAgICAgICBmY250bC5pb2N0bChmZCwgVUlfU0VUX1JFTEJJVCwgUkVMX1kpCiAgICAgICAgICAgIHVpbnB1dF9zZXR1cF9mb3JtYXQgPSAnSEhISDgwc0knCiAgICAgICAgICAgIGRldmljZV9uYW1lID0gYiJTUlRvb2wtVmlydHVhbC1Ub3VjaHBhZCIKICAgICAgICAgICAgc2V0dXBfZGF0YSA9IHN0cnVjdC5wYWNrKHVpbnB1dF9zZXR1cF9mb3JtYXQsIDB4MDMsIDB4NTU1NSwgMHg2NjY2LCAxLCBkZXZpY2VfbmFtZSwgMCkKICAgICAgICAgICAgZmNudGwuaW9jdGwoZmQsIFVJX0RFVl9TRVRVUCwgc2V0dXBfZGF0YSkKICAgICAgICAgICAgZmNudGwuaW9jdGwoZmQsIFVJX0RFVl9DUkVBVEUpCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMC40KQoKICAgICAgICAgICAgZGVmIGVtaXRfZXZlbnQodHlwZV9ldiwgY29kZSwgdmFsdWUpOgogICAgICAgICAgICAgICAgb3Mud3JpdGUoZmQsIHN0cnVjdC5wYWNrKCdsbEhIaScsIDAsIDAsIHR5cGVfZXYsIGNvZGUsIHZhbHVlKSkKCiAgICAgICAgICAgIGRlZiBzeW5jKCk6CiAgICAgICAgICAgICAgICBlbWl0X2V2ZW50KEVWX1NZTiwgU1lOX1JFUE9SVCwgMCkKCiAgICAgICAgICAgIGRlbHRhX3ggPSB4MiAtIHgxCiAgICAgICAgICAgIGRlbHRhX3kgPSB5MiAtIHkxCiAgICAgICAgICAgIHN0ZXBzID0gbWF4KDEsIGludChkdXJhdGlvbiAvIDE1KSkKICAgICAgICAgICAgc2xlZXBfcGVyX3N0ZXAgPSAoZHVyYXRpb24gLyAxMDAwLjApIC8gc3RlcHMKICAgICAgICAgICAgc3RlcF94ID0gaW50KGRlbHRhX3ggLyBzdGVwcykKICAgICAgICAgICAgc3RlcF95ID0gaW50KGRlbHRhX3kgLyBzdGVwcykKICAgICAgICAgICAgZW1pdF9ldmVudChFVl9LRVksIEJUTl9UT1VDSCwgMSkKICAgICAgICAgICAgc3luYygpCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMikKCiAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKHN0ZXBzKToKICAgICAgICAgICAgICAgIGlmIHN0ZXBfeCAhPSAwOgogICAgICAgICAgICAgICAgICAgIGVtaXRfZXZlbnQoRVZfUkVMLCBSRUxfWCwgc3RlcF94KQogICAgICAgICAgICAgICAgaWYgc3RlcF95ICE9IDA6CiAgICAgICAgICAgICAgICAgICAgZW1pdF9ldmVudChFVl9SRUwsIFJFTF9ZLCBzdGVwX3kpCiAgICAgICAgICAgICAgICBzeW5jKCkKICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXBfcGVyX3N0ZXApCiAgICAgICAgICAgIGVtaXRfZXZlbnQoRVZfS0VZLCBCVE5fVE9VQ0gsIDApCiAgICAgICAgICAgIHN5bmMoKQogICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKICAgICAgICAgICAgZmNudGwuaW9jdGwoZmQsIFVJX0RFVl9ERVNUUk9ZKQogICAgICAgICAgICBvcy5jbG9zZShmZCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludChmIlshXSBVaW5wdXQgZHJpdmVyIGZhaWxlZCB0byBzd2lwZToge2V9IikKCiAgICB0cnk6CiAgICAgICAgaWYgc3VicHJvY2Vzcy5ydW4oWyd3aGljaCcsICdzaGl6dWt1J10sIGNhcHR1cmVfb3V0cHV0PVRydWUpLnJldHVybmNvZGUgPT0gMDoKICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oWydzaGl6dWt1JywgJy1jJywgJ3N3aXBlJywgc3RyKHgxKSwgc3RyKHkxKSwgc3RyKHgyKSwgc3RyKHkyKSwgc3RyKGR1cmF0aW9uKV0sIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQ6IHBhc3MKCiAgICB0cnk6CiAgICAgICAgdGVybXV4X2lucHV0ID0gJy9kYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy91c3IvYmluL2lucHV0JwogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRlcm11eF9pbnB1dCk6CiAgICAgICAgICAgIHN1YnByb2Nlc3MucnVuKFt0ZXJtdXhfaW5wdXQsICdzd2lwZScsIHN0cih4MSksIHN0cih5MSksIHN0cih4MiksIHN0cih5MiksIHN0cihkdXJhdGlvbildLCBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0OiBwYXNzCiAgICBwcmludCgiWyFdIE5vIGlucHV0IG1ldGhvZCBhdmFpbGFibGUhIikKICAgIHJldHVybiBGYWxzZQoKZGVmIGlucHV0X2tleWNvbWJvKCk6CiAgICBhcmdzID0gc3lzLmFyZ3ZbMjpdCiAgICBpZiBub3QgYXJnczoKICAgICAgICBwcmludCgiVXNhZ2U6IHNydG9vbCBrZXljb21ibyBba2V5MV0gW2tleTJdIikKICAgICAgICByZXR1cm4KCiAgICByZXF1ZXN0ZWRfYW5kcm9pZF9jb2RlcyA9IFtdCiAgICBmb3IgYXJnIGluIGFyZ3M6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXF1ZXN0ZWRfYW5kcm9pZF9jb2Rlcy5hcHBlbmQoaW50KGFyZykpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHByaW50KGYiWyFdIEludmFsaWQga2V5Y29kZTogJ3thcmd9Jy4gTXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlci4iKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBmdWxsX2FuZHJvaWRfbWF0cml4ID0gewogICAgICAgIDE6IDEzOSwgMjogMjEyLCAzOiAxNzIsIDQ6IDE1OCwgNTogMjMxLCA2OiAyNDksIDc6IDExLCA4OiAyLCA5OiAzLCAxMDogNCwKICAgICAgICAxMTogNSwgMTI6IDYsIDEzOiA3LCAxNDogOCwgMTU6IDksIDE2OiAxMCwgMTc6IDgyLCAxODogNzksIDE5OiAxMDMsIDIwOiAxMDgsCiAgICAgICAgMjE6IDEwNSwgMjI6IDEwNiwgMjM6IDk2LCAyNDogMTE1LCAyNTogMTE0LCAyNjogMTE2LCAyNzogMjEyLCAyODogMTQsCiAgICAgICAgMjk6IDMwLCAzMDogNDgsIDMxOiA0NiwgMzI6IDMyLCAzMzogMTgsIDM0OiAzMywgMzU6IDM0LCAzNjogMzUsIDM3OiAyMywgMzg6IDM2LAogICAgICAgIDM5OiAzNywgNDA6IDM4LCA0MTogNTAsIDQyOiA0OSwgNDM6IDI0LCA0NDogMjUsIDQ1OiAxNiwgNDY6IDE5LCA0NzogMzEsIDQ4OiAyMCwKICAgICAgICA0OTogMjIsIDUwOiA0NywgNTE6IDE3LCA1MjogNDUsIDUzOiAyMSwgNTQ6IDQ0LAogICAgICAgIDU1OiA1MSwgNTY6IDUyLCA1NzogNTYsIDU4OiAxMDAsIDU5OiA0MiwgNjA6IDU0LCA2MTogMTUsIDYyOiA1NywgNjM6IDEzOSwgNjQ6IDE1MCwKICAgICAgICA2NTogMTU1LCA2NjogMjgsIDY3OiAxNCwgNjg6IDQxLCA2OTogMTIsIDcwOiAxMywgNzE6IDI2LCA3MjogMjcsIDczOiA0MywgNzQ6IDM5LAogICAgICAgIDc1OiA0MCwgNzY6IDUzLCA3NzogMTU1LCA3ODogMTUwLCA3OTogMjA4LCA4MDogMTY4LCA4MTogMTIxLCA4MjogMTM5LCA4MzogMTI1LCA4NDogMjE3LAogICAgICAgIDg1OiAxNjQsIDg2OiAxNjYsIDg3OiAxNjMsIDg4OiAxNjUsIDg5OiAxNjgsIDkwOiAyMDgsIDkxOiAxMTMsIDkyOiAxMDQsIDkzOiAxMDksIDk0OiAxNTksCiAgICAgICAgOTU6IDE1MCwgOTY6IDMwNCwgOTc6IDMwNSwgOTg6IDMwNiwgOTk6IDMwNywgMTAwOiAzMDgsIDEwMTogMzA5LCAxMDI6IDMxMCwgMTAzOiAzMTEsIDEwNDogMzEyLAogICAgICAgIDEwNTogMzEzLCAxMDY6IDMxNywgMTA3OiAzMTgsIDEwODogMzE0LCAxMDk6IDMxNSwgMTEwOiAzMTYsIDExMTogMSwgMTEyOiA5NywgMTEzOiAyOSwgMTE0OiA5NywKICAgICAgICAxMTU6IDU4LCAxMTY6IDcwLCAxMTc6IDEyNSwgMTE4OiAxMjYsIDExOTogMCwgMTIwOiAyMTAsIDEyMTogMTE5LCAxMjI6IDExMCwgMTIzOiAxMDcsIDEyNDogMTExLAogICAgICAgIDEyNTogMTI0LCAxMjY6IDE2NCwgMTI3OiAxNjYsIDEyODogMTQyLCAxMjk6IDEzNCwgMTMwOiAxNjcsIDEzMTogNTksIDEzMjogNjAsIDEzMzogNjEsIDEzNDogNjIsCiAgICAgICAgMTM1OiA2MywgMTM2OiA2NCwgMTM3OiA2NSwgMTM4OiA2NiwgMTM5OiA2NywgMTQwOiA2OCwgMTQxOiA4NywgMTQyOiA4OCwgMTQzOiA2OSwgMTQ0OiA4MiwKICAgICAgICAxNDU6IDc5LCAxNDY6IDgwLCAxNDc6IDgxLCAxNDg6IDc1LCAxNDk6IDc2LCAxNTA6IDc3LCAxNTE6IDcxLCAxNTI6IDcyLCAxNTM6IDczLCAxNTQ6IDk4LAogICAgICAgIDE1NTogNTUsIDE1NjogNzQsIDE1NzogNzgsIDE1ODogODMsIDE1OTogMTIxLCAxNjA6IDk2LCAxNjE6IDExNywgMTYyOiAxNzksIDE2MzogMTgwLCAxNjQ6IDExMywKICAgICAgICAxNjU6IDEzMCwgMTY2OiAxMzEsIDE2NzogMTMyLCAxNjg6IDIwMCwgMTY5OiAyMDEsIDE3MDogMTQxLCAxNzE6IDE0MywgMTcyOiAxNDQsIDE3MzogMTQ1LCAxNzQ6IDE0NiwKICAgICAgICAxNzU6IDE0NywgMTc2OiAxNDgsIDE3NzogMTQ5LCAxNzg6IDI0MCwgMTc5OiAxNTEsIDE4MDogMTUzLCAxODE6IDE1NCwgMTgyOiAxNTUsIDE4MzogMTU2LCAxODQ6IDE1NywKICAgICAgICAxODU6IDE2MSwgMTg2OiAxNjIsIDE4NzogMjU0LCAxODg6IDIxOCwgMTg5OiAyMTksIDE5MDogMjIwLCAxOTE6IDIyMSwgMTkyOiAyMjIsIDE5MzogMjIzLCAxOTQ6IDIyNCwKICAgICAgICAxOTU6IDIyNSwgMTk2OiAyMjYsIDE5NzogMjI3LCAxOTg6IDIyOCwgMTk5OiAyMjksIDIwMDogMjMwLCAyMDE6IDIzMSwgMjAyOiAyMzIsIDIwMzogMjMzLCAyMDQ6IDIzNCwKICAgICAgICAyMDU6IDIzNSwgMjA2OiAyMzYsIDIwNzogMjM3LCAyMDg6IDIzOCwgMjA5OiAyMzksIDIxMDogMjQwLCAyMTE6IDI0MSwgMjEyOiAyNDIsIDIxMzogMjQzLCAyMTQ6IDI0NCwKICAgICAgICAyMTU6IDI0NSwgMjE2OiAyNDYsIDIxNzogMjQ3LCAyMTg6IDI0OCwgMjE5OiAyNDksIDIyMDogMjI0LCAyMjE6IDIyNSwKICAgICAgICAyMjI6IDAsIDIyMzogMCwgMjI0OiAyMTEsIDIyNTogMTQyLCAyMjY6IDE0MywgMjI5OiAwLCAyMzE6IDAsIDI0MzogMCwgMjQ0OiAwLCAyNDk6IDIxNCwKICAgICAgICAyNTA6IDIxNSwgMjUxOiAyMTMsIDI1MjogMjE2LCAyNTM6IDE4MSwgMjU0OiAxODIsIDI1NTogMTgzLCAyNTY6IDE4NCwgMjU3OiAxODUsIDI1ODogMTg2LCAyNTk6IDAsCiAgICAgICAgMjYwOiAwLCAyNjE6IDAsIDI2MjogMCwgMjYzOiAwLCAyNjQ6IDAsIDI2NTogMCwgMjY2OiAwLCAyNjc6IDAsIDI2ODogMCwgMjcyOiAyMTcsCiAgICAgICAgMjczOiAwLCAyNzY6IDE3MywgMjc3OiAxNzcsIDI3ODogMTc4LCAyNzk6IDE3NiwgMjgwOiAwLCAyODE6IDAsIDI4MjogMCwgMjgzOiAwLCAyODQ6IDEyNywKICAgICAgICAyODU6IDAsIDI4NjogMCwgMjg3OiAwLCAyODg6IDAKICAgIH0KCiAgICB0YXJnZXRfbGludXhfY29kZXMgPSBbXQogICAgZm9yIGNvZGUgaW4gcmVxdWVzdGVkX2FuZHJvaWRfY29kZXM6CiAgICAgICAgaWYgY29kZSBpbiBmdWxsX2FuZHJvaWRfbWF0cml4OgogICAgICAgICAgICB0YXJnZXRfbGludXhfY29kZXMuYXBwZW5kKGZ1bGxfYW5kcm9pZF9tYXRyaXhbY29kZV0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoZiJbIV0gQW5kcm9pZCBLZXljb2RlIHtjb2RlfSB0aWRhayBkaWtlbmFsaSBkYWxhbSBtYXRyaWtzLiIpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGlmIG9zLnBhdGguZXhpc3RzKCcvZGV2L3VpbnB1dCcpIGFuZCBvcy5hY2Nlc3MoJy9kZXYvdWlucHV0Jywgb3MuV19PSyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgZmNudGwKICAgICAgICAgICAgaW1wb3J0IHN0cnVjdAogICAgICAgICAgICBpbXBvcnQgdGltZQoKICAgICAgICAgICAgVUlfU0VUX0VWQklUICAgID0gMHg0MDA0NTU2NAogICAgICAgICAgICBVSV9TRVRfS0VZQklUICAgPSAweDQwMDQ1NTY1CiAgICAgICAgICAgIFVJX0RFVl9TRVRVUCAgICA9IDB4NDA1YzU1MDMKICAgICAgICAgICAgVUlfREVWX0NSRUFURSAgID0gMHg1NTAxCiAgICAgICAgICAgIFVJX0RFVl9ERVNUUk9ZICA9IDB4NTUwMgoKICAgICAgICAgICAgZmQgPSBvcy5vcGVuKCcvZGV2L3VpbnB1dCcsIG9zLk9fV1JPTkxZIHwgb3MuT19OT05CTE9DSykKICAgICAgICAgICAgZmNudGwuaW9jdGwoZmQsIFVJX1NFVF9FVkJJVCwgMSkKICAgICAgICAgICAgZm9yIGxfY29kZSBpbiB0YXJnZXRfbGludXhfY29kZXM6CiAgICAgICAgICAgICAgICBmY250bC5pb2N0bChmZCwgVUlfU0VUX0tFWUJJVCwgbF9jb2RlKQogICAgICAgICAgICB1aW5wdXRfc2V0dXBfZm9ybWF0ID0gJ0hISEg4MHNJJwogICAgICAgICAgICBkZXZpY2VfbmFtZSA9IGIiU1JUb29sLVZpcnR1YWwtQ29tYm9LZXkiCiAgICAgICAgICAgIHNldHVwX2RhdGEgPSBzdHJ1Y3QucGFjayh1aW5wdXRfc2V0dXBfZm9ybWF0LCAweDAzLCAweDEyMzQsIDB4NTY3OCwgMSwgZGV2aWNlX25hbWUsIDApCiAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCBVSV9ERVZfU0VUVVAsIHNldHVwX2RhdGEpCiAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCBVSV9ERVZfQ1JFQVRFKQogICAgICAgICAgICB0aW1lLnNsZWVwKDAuNCkKICAgICAgICAgICAgZGVmIGVtaXRfa2V5KGNvZGUsIHByZXNzPVRydWUpOgogICAgICAgICAgICAgICAgb3Mud3JpdGUoZmQsIHN0cnVjdC5wYWNrKCdsbEhIaScsIDAsIDAsIDEsIGNvZGUsIDEgaWYgcHJlc3MgZWxzZSAwKSkKICAgICAgICAgICAgICAgIG9zLndyaXRlKGZkLCBzdHJ1Y3QucGFjaygnbGxISGknLCAwLCAwLCAwLCAwLCAwKSkKCiAgICAgICAgICAgIGlmIGxlbihzZXQodGFyZ2V0X2xpbnV4X2NvZGVzKSkgPT0gMSBhbmQgbGVuKHRhcmdldF9saW51eF9jb2RlcykgPiAxOgogICAgICAgICAgICAgICAgZm9yIGxfY29kZSBpbiB0YXJnZXRfbGludXhfY29kZXM6CiAgICAgICAgICAgICAgICAgICAgZW1pdF9rZXkobF9jb2RlLCBwcmVzcz1UcnVlKQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKICAgICAgICAgICAgICAgICAgICBlbWl0X2tleShsX2NvZGUsIHByZXNzPUZhbHNlKQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wNSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZvciBsX2NvZGUgaW4gdGFyZ2V0X2xpbnV4X2NvZGVzOgogICAgICAgICAgICAgICAgICAgIGVtaXRfa2V5KGxfY29kZSwgcHJlc3M9VHJ1ZSkKICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpCgogICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjA1KQoKICAgICAgICAgICAgICAgIGZvciBsX2NvZGUgaW4gcmV2ZXJzZWQodGFyZ2V0X2xpbnV4X2NvZGVzKToKICAgICAgICAgICAgICAgICAgICBlbWl0X2tleShsX2NvZGUsIHByZXNzPUZhbHNlKQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKCiAgICAgICAgICAgIGZvciBsX2NvZGUgaW4gcmV2ZXJzZWQodGFyZ2V0X2xpbnV4X2NvZGVzKToKICAgICAgICAgICAgICAgIGVtaXRfa2V5KGxfY29kZSwgcHJlc3M9RmFsc2UpCiAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpCgogICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKICAgICAgICAgICAgZmNudGwuaW9jdGwoZmQsIFVJX0RFVl9ERVNUUk9ZKQogICAgICAgICAgICBvcy5jbG9zZShmZCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludChmIlshXSB1aW5wdXQga2V5Y29tYm8gZXJyb3I6IHtlfSIpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIHRyeToKICAgICAgICBpZiBzdWJwcm9jZXNzLnJ1bihbJ3doaWNoJywgJ3NoaXp1a3UnXSwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSkucmV0dXJuY29kZSA9PSAwOgogICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bihbJ3NoaXp1a3UnLCAnLWMnLCAna2V5Y29tYmluYXRpb24nXSArIGFyZ3MsIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoInNoaXp1a3UgbXVzdCBiZSBpbnN0YWxsZWQgaW4gdGVybXV4IikKICAgIGV4Y2VwdDoKICAgICAgICBwYXNzCiAgICB0cnk6CiAgICAgICAgdGVybXV4X2lucHV0ID0gJy9kYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy91c3IvYmluL2lucHV0JwogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRlcm11eF9pbnB1dCk6CiAgICAgICAgICAgIHN1YnByb2Nlc3MucnVuKFt0ZXJtdXhfaW5wdXQsICdrZXljb21iaW5hdGlvbiddICsgYXJncywgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIGV4Y2VwdDoKICAgICAgICBwYXNzCgogICAgcHJpbnQoIlshXSBObyBpbnB1dCBtZXRob2QgYXZhaWxhYmxlISIpCiAgICByZXR1cm4gRmFsc2UKCmRlZiBrZXlfbGlzdCgpOgogICAgaW1wb3J0IHNodXRpbAogICAgaW1wb3J0IG1hdGgKICAgIGltcG9ydCByZQoKICAgIHRyeToKICAgICAgICB3ID0gc2h1dGlsLmdldF90ZXJtaW5hbF9zaXplKCkuY29sdW1ucwogICAgZXhjZXB0OgogICAgICAgIHcgPSA1MAoKICAgICMgTWVuZ2Vsb21wb2trYW4gc2VsdXJ1aCBkYXRhIGJpbmVyIG1hdHJpa3MgQW5kYSBzZWNhcmEga29tcGxpdCBrZSBrYXRlZ29yaSBiYWhhc2EgSW5nZ3JpcwogICAgYmxvY2tzID0gewogICAgICAgICJNQUlOIE5BVklHQVRJT04iOiBbCiAgICAgICAgICAgICJbMV0gTUVOVSIsICJbMl0gU09GVF9SSUdIVCIsICJbM10gSE9NRSIsICJbNF0gQkFDSyIsICJbNV0gQ0FMTCIsICJbNl0gRU5EQ0FMTCIKICAgICAgICBdLAogICAgICAgICJOVU1QQUQgJiBURUxFUEhPTlkiOiBbCiAgICAgICAgICAgICJbN10gMCIsICJbOF0gMSIsICJbOV0gMiIsICJbMTBdIDMiLCAiWzExXSA0IiwgIlsxMl0gNSIsICJbMTNdIDYiLCAiWzE0XSA3IiwgCiAgICAgICAgICAgICJbMTVdIDgiLCAiWzE2XSA5IiwgIlsxN10gKiIsICJbMThdICMiCiAgICAgICAgXSwKICAgICAgICAiRFBBRCAmIFZPTFVNRSI6IFsKICAgICAgICAgICAgIlsxOV0gRFBBRF9VUCIsICJbMjBdIERQQURfRE9XTiIsICJbMjFdIERQQURfTEVGVCIsICJbMjJdIERQQURfUklHSFQiLAogICAgICAgICAgICAiWzIzXSBEUEFEX0NFTlRFUiIsICJbMjRdIFZPTFVNRV9VUCIsICJbMjVdIFZPTFVNRV9ET1dOIiwgIlsyNl0gUE9XRVIiLAogICAgICAgICAgICAiWzI3XSBDQU1FUkEiLCAiWzI4XSBDTEVBUiIKICAgICAgICBdLAogICAgICAgICJBTFBIQUJFVCBBLVoiOiBbCiAgICAgICAgICAgICJbMjldIEEiLCAiWzMwXSBCIiwgIlszMV0gQyIsICJbMzJdIEQiLCAiWzMzXSBFIiwgIlszNF0gRiIsICJbMzVdIEciLCAiWzM2XSBIIiwgCiAgICAgICAgICAgICJbMzddIEkiLCAiWzM4XSBKIiwgIlszOV0gSyIsICJbNDBdIEwiLCAiWzQxXSBNIiwgIls0Ml0gTiIsICJbNDNdIE8iLCAiWzQ0XSBQIiwgCiAgICAgICAgICAgICJbNDVdIFEiLCAiWzQ2XSBSIiwgIls0N10gUyIsICJbNDhdIFQiLCAiWzQ5XSBVIiwgIls1MF0gViIsICJbNTFdIFciLCAiWzUyXSBYIiwgCiAgICAgICAgICAgICJbNTNdIFkiLCAiWzU0XSBaIgogICAgICAgIF0sCiAgICAgICAgIlNUQU5EQVJEIEtFWUJPQVJEIjogWwogICAgICAgICAgICAiWzU1XSBDT01NQSIsICJbNTZdIFBFUklPRCIsICJbNTddIEFMVF9MRUZUIiwgIls1OF0gQUxUX1JJR0hUIiwgIls1OV0gU0hJRlRfTEVGVCIsIAogICAgICAgICAgICAiWzYwXSBTSElGVF9SSUdIVCIsICJbNjFdIFRBQiIsICJbNjJdIFNQQUNFIiwgIls2M10gU1lNIiwgIls2NF0gRVhQTE9SRVIiLCAKICAgICAgICAgICAgIls2NV0gRU5WRUxPUEUiLCAiWzY2XSBFTlRFUiIsICJbNjddIERFTCIsICJbNjhdIEdSQVZFIiwgIls2OV0gTUlOVVMiLCAKICAgICAgICAgICAgIls3MF0gRVFVQUxTIiwgIls3MV0gTEVGVF9CUkFDS0VUIiwgIls3Ml0gUklHSFRfQlJBQ0tFVCIsICJbNzNdIEJBQ0tTTEFTSCIsIAogICAgICAgICAgICAiWzc0XSBTRU1JQ09MT04iLCAiWzc1XSBBUE9TVFJPUEhFIiwgIls3Nl0gU0xBU0giLCAiWzc3XSBNQUlMIiwgIls3OF0gRVhQTE9SRVIiLCAKICAgICAgICAgICAgIls3OV0gTUVESUFfRkFTVF9GT1JXQVJEIiwgIls4MF0gTUVESUFfUkVXSU5EIiwgIls4MV0gUExVUyIsICJbODJdIE1FTlUiLCAKICAgICAgICAgICAgIls4M10gTk9USUZJQ0FUSU9OIiwgIls4NF0gU0VBUkNIIgogICAgICAgIF0sCiAgICAgICAgIk1VTFRJTUVESUEgJiBTWVNURU0iOiBbCiAgICAgICAgICAgICJbODVdIE1FRElBX1BMQVlfUEFVU0UiLCAiWzg2XSBNRURJQV9TVE9QIiwgIls4N10gTUVESUFfTkVYVCIsICJbODhdIE1FRElBX1BSRVZJT1VTIiwgCiAgICAgICAgICAgICJbODldIE1FRElBX1JFV0lORCIsICJbOTBdIE1FRElBX0ZBU1RfRk9SV0FSRCIsICJbOTFdIE1VVEUiLCAiWzkyXSBQQUdFX1VQIiwgCiAgICAgICAgICAgICJbOTNdIFBBR0VfRE9XTiIsICJbOTRdIEJVVFRPTl9GT1JXQVJEIiwgIls5NV0gQlVUVE9OX01FRElBIgogICAgICAgIF0sCiAgICAgICAgIkdBTUVQQUQgQlVUVE9OUyI6IFsKICAgICAgICAgICAgIls5Nl0gQlVUVE9OX0EiLCAiWzk3XSBCVVRUT05fQiIsICJbOThdIEJVVFRPTl9DIiwgIls5OV0gQlVUVE9OX1giLCAiWzEwMF0gQlVUVE9OX1kiLCAKICAgICAgICAgICAgIlsxMDFdIEJVVFRPTl9aIiwgIlsxMDJdIEJVVFRPTl9MMSIsICJbMTAzXSBCVVRUT05fUjEiLCAiWzEwNF0gQlVUVE9OX0wyIiwgIlsxMDVdIEJVVFRPTl9SMiIsIAogICAgICAgICAgICAiWzEwNl0gQlVUVE9OX1RIVU1CTCIsICJbMTA3XSBCVVRUT05fVEhVTUJSIiwgIlsxMDhdIEJVVFRPTl9TVEFSVCIsICJbMTA5XSBCVVRUT05fU0VMRUNUIiwgCiAgICAgICAgICAgICJbMTEwXSBCVVRUT05fTU9ERSIKICAgICAgICBdLAogICAgICAgICJBRFZBTkNFRCBLRVlCT0FSRCI6IFsKICAgICAgICAgICAgIlsxMTFdIEVTQ0FQRSIsICJbMTEyXSBGT1JXQVJEX0RFTCIsICJbMTEzXSBDVFJMX0xFRlQiLCAiWzExNF0gQ1RSTF9SSUdIVCIsIAogICAgICAgICAgICAiWzExNV0gQ0FQU19MT0NLIiwgIlsxMTZdIFNDUk9MTF9MT0NLIiwgIlsxMTddIE1FVEFfTEVGVCIsICJbMTE4XSBNRVRBX1JJR0hUIiwgCiAgICAgICAgICAgICJbMTE5XSBGVU5DVElPTiIsICJbMTIwXSBTWVNSRVEiLCAiWzEyMV0gQlJFQUsiLCAiWzEyMl0gTU9WRV9IT01FIiwgCiAgICAgICAgICAgICJbMTIzXSBNT1ZFX0VORCIsICJbMTI0XSBJTlNFUlQiLCAiWzEyNV0gRk9SV0FSRCIKICAgICAgICBdLAogICAgICAgICJNVUxUSU1FRElBIFBMQVlCQUNLIENPTlRST0xTIjogWwogICAgICAgICAgICAiWzEyNl0gTUVESUFfUExBWSIsICJbMTI3XSBNRURJQV9QQVVTRSIsICJbMTI4XSBNRURJQV9DTE9TRSIsIAogICAgICAgICAgICAiWzEyOV0gTUVESUFfRUpFQ1QiLCAiWzEzMF0gTUVESUFfUkVDT1JEIgogICAgICAgIF0sCiAgICAgICAgIkZVTkNUSU9OIEtFWVMgRjEgLSBGMTIiOiBbCiAgICAgICAgICAgICJbMTMxXSBGMSIsICJbMTMyXSBGMiIsICJbMTMzXSBGMyIsICJbMTM0XSBGNCIsICJbMTM1XSBGNSIsICJbMTM2XSBGNiIsIAogICAgICAgICAgICAiWzEzN10gRjciLCAiWzEzOF0gRjgiLCAiWzEzOV0gRjkiLCAiWzE0MF0gRjEwIiwgIlsxNDFdIEYxMSIsICJbMTQyXSBGMTIiCiAgICAgICAgXSwKICAgICAgICAiUEhZU0lDQUwgTlVNUEFEIjogWwogICAgICAgICAgICAiWzE0M10gTlVNX0xPQ0siLCAiWzE0NF0gTlVNUEFEXzAiLCAiWzE0NV0gTlVNUEFEXzEiLCAiWzE0Nl0gTlVNUEFEXzIiLCAiWzE0N10gTlVNUEFEXzMiLCAKICAgICAgICAgICAgIlsxNDhdIE5VTVBBRF80IiwgIlsxNDldIE5VTVBBRF81IiwgIlsxNTBdIE5VTVBBRF82IiwgIlsxNTFdIE5VTVBBRF83IiwgCiAgICAgICAgICAgICJbMTUyXSBOVU1QQURfOCIsICJbMTUzXSBOVU1QQURfOSIsICJbMTU0XSBOVU1QQURfRElWSURFIiwgIlsxNTVdIE5VTVBBRF9NVUxUSVBMWSIsIAogICAgICAgICAgICAiWzE1Nl0gTlVNUEFEX1NVQlRSQUNUIiwgIlsxNTddIE5VTVBBRF9BREQiLCAiWzE1OF0gTlVNUEFEX0RPVCIsICJbMTU5XSBOVU1QQURfQ09NTUEiLCAKICAgICAgICAgICAgIlsxNjBdIE5VTVBBRF9FTlRFUiIsICJbMTYxXSBOVU1QQURfRVFVQUxTIiwgIlsxNjJdIE5VTVBBRF9MRUZUX1BBUkVOIiwgIlsxNjNdIE5VTVBBRF9SSUdIVF9QQVJFTiIKICAgICAgICBdLAogICAgICAgICJUViBDT05UUk9MUyAmIFNZU1RFTSBVSSI6IFsKICAgICAgICAgICAgIlsxNjRdIFZPTFVNRV9NVVRFIiwgIlsxNjVdIElORk8iLCAiWzE2Nl0gQ0hBTk5FTF9VUCIsICJbMTY3XSBDSEFOTkVMX0RPV04iLCAKICAgICAgICAgICAgIlsxNjhdIFpPT01fSU4iLCAiWzE2OV0gWk9PTV9PVVQiLCAiWzE3MF0gVFYiLCAiWzE3MV0gV0lORE9XIiwgIlsxNzJdIEdVSURFIiwgCiAgICAgICAgICAgICJbMTczXSBEVlIiLCAiWzE3NF0gQk9PS01BUksiLCAiWzE3NV0gUExBWV9QQVVTRSIsICJbMTc2XSBTRVRUSU5HUyIsIAogICAgICAgICAgICAiWzE3N10gVFZfUE9XRVIiLCAiWzE3OF0gVFZfSU5QVVQiLCAiWzE3OV0gU1RCX1BPV0VSIiwgIlsxODBdIFNUQl9JTlBVVCIsIAogICAgICAgICAgICAiWzE4MV0gQVZSX1BPV0VSIiwgIlsxODJdIEFWUl9JTlBVVCIsICJbMTgzXSBQUk9HX1JFRCIsICJbMTg0XSBQUk9HX0dSRUVOIiwgCiAgICAgICAgICAgICJbMTg1XSBQUk9HX1lFTExPVyIsICJbMTg2XSBQUk9HX0JMVUUiLCAiWzE4N10gQVBQX1NXSVRDSCIKICAgICAgICBdLAogICAgICAgICJUViBCUk9BRENBU1QgU0VMRUNUSU9OUyI6IFsKICAgICAgICAgICAgIlsxODhdIEJDVFZfMSIsICJbMTg5XSBCQ1RWXzIiLCAiWzE5MF0gQkNUVl8zIiwgIlsxOTFdIEJDVFZfNCIsIAogICAgICAgICAgICAiWzE5Ml0gQkNUVl81IiwgIlsxOTNdIEJDVFZfNiIsICJbMTk0XSBCQ1RWXzciLCAiWzE5NV0gQkNUVl84IiwgCiAgICAgICAgICAgICJbMTk2XSBCQ1RWXzkiLCAiWzE5N10gQkNUVl8xMCIsICJbMTk4XSBCQ1RWXzExIiwgIlsxOTldIEJDVFZfMTIiCiAgICAgICAgXSwKICAgICAgICAiU01BUlQgVFYgU1lTVEVNUyI6IFsKICAgICAgICAgICAgIlsyMDBdIENIX1BSRVYiLCAiWzIwMV0gU1RCX1BPV0VSIiwgIlsyMDJdIFNUQl9JTlBVVCIsICJbMjAzXSBBVlJfUE9XRVIiLCAKICAgICAgICAgICAgIlsyMDRdIEFWUl9JTlBVVCIsICJbMjA1XSBEVlJfUE9XRVIiLCAiWzIwNl0gRFZSX0lOUFVUIiwgIlsyMDddIFRWX0FOVEVOTkEiLCAKICAgICAgICAgICAgIlsyMDhdIFRWX01FRElBX0NPTlRFWFQiLCAiWzIwOV0gVFZfTkVUV09SSyIsICJbMjEwXSBUVl9TQVRFTExJVEUiLCAiWzIxMV0gVFZfWF9JTlBVVCIsIAogICAgICAgICAgICAiWzIxMl0gVFZfWV9JTlBVVCIsICJbMjEzXSBUVl9aX0lOUFVUIiwgIlsyMTRdIFRWX0FfSU5QVVQiLCAiWzIxNV0gVFZfQl9JTlBVVCIsIAogICAgICAgICAgICAiWzIxNl0gVFZfQ19JTlBVVCIsICJbMjE3XSBUVl9EX0lOUFVUIiwgIlsyMThdIFRWX0VfSU5QVVQiLCAiWzIxOV0gVFZfRl9JTlBVVCIKICAgICAgICBdLAogICAgICAgICJBRFZBTkNFRCBTWVNURU0gJiBIQVJEV0FSRSBDT05UUk9MUyI6IFsKICAgICAgICAgICAgIlsyMjBdIEJSSUdIVE5FU1NfRE9XTiIsICJbMjIxXSBCUklHSFRORVNTX1VQIiwKICAgICAgICAgICAgIlsyMjJdIEdFU1RVUkVfV0FLRSoiLCAiWzIyM10gTEVEX1NUQUdFKiIsICJbMjI0XSBBVURJT19UUkFDSyIsICJbMjI1XSBTTEVFUCIsIAogICAgICAgICAgICAiWzIyNl0gV0FLRVVQIiwgIlsyMjldIFBBSVJJTkcqIiwgIlsyMzFdIFNUQl9QT1dFUioiLCAiWzI0M10gVFZfWl9JTlBVVCoiLCAKICAgICAgICAgICAgIlsyNDRdIFRWX0FfSU5QVVQqIiwgIlsyNDldIFRWX0VfSU5QVVQiLCAiWzI1MF0gVFZfRl9JTlBVVCIsICJbMjUxXSBUVl9HX0lOUFVUIiwgCiAgICAgICAgICAgICJbMjUyXSBUVl9IX0lOUFVUIiwgIlsyNTNdIFNURU1fUFJJTUFSWSIsICJbMjU0XSBTVEVNXzEiLCAiWzI1NV0gU1RFTV8yIiwgCiAgICAgICAgICAgICJbMjU2XSBTVEVNXzMiLCAiWzI1N10gQ09DT05VVF8xIiwgIlsyNThdIENPQ09OVVRfMiIsICJbMjU5XSBCVVRUT05fWDEqIiwgCiAgICAgICAgICAgICJbMjYwXSBCVVRUT05fWDIqIiwgIlsyNjFdIEJVVFRPTl9YMyoiLCAiWzI2Ml0gQlVUVE9OX1g0KiIsICJbMjYzXSBCVVRUT05fWDUqIiwgCiAgICAgICAgICAgICJbMjY0XSBCVVRUT05fWDYqIiwgIlsyNjVdIEJVVFRPTl9YNyoiLCAiWzI2Nl0gQlVUVE9OX1g4KiIsICJbMjY3XSBCVVRUT05fWDkqIiwgCiAgICAgICAgICAgICJbMjY4XSBQUk9GSUxFX1NXKiIsICJbMjcyXSBWT0lDRV9BU1NJU1QiLCAiWzI3M10gQVNTSVNUKiIsICJbMjc2XSBSRUZSRVNIIiwgCiAgICAgICAgICAgICJbMjc3XSBUSFVNQlNfVVAiLCAiWzI3OF0gVEhVTUJTX0RPV04iLCAiWzI3OV0gU1lTVEVNX05BViIsICJbMjgwXSBUSFVNQlNfVSoiLCAKICAgICAgICAgICAgIlsyODFdIFRIVU1CU19EKiIsICJbMjgyXSBQUk9GSUxFKiIsICJbMjgzXSBGQUNUT1JZKiIsICJbMjg0XSBBTExfQVBQUyIsIAogICAgICAgICAgICAiWzI4NV0gTUFDUk8xKiIsICJbMjg2XSBNQUNSTzIqIiwgIlsyODddIE1BQ1JPMyoiLCAiWzI4OF0gTUFDUk80KiIKICAgICAgICBdCiAgICB9CgogICAgYWxsX2tleXMgPSBbayBmb3IgYmxvY2sgaW4gYmxvY2tzLnZhbHVlcygpIGZvciBrIGluIGJsb2NrXQogICAgY29sX3cgPSBtYXgobGVuKGspIGZvciBrIGluIGFsbF9rZXlzKSArIDIKICAgIGNvbHMgPSBtYXgoMSwgKHcgLSAyKSAvLyBjb2xfdykKICAgIHByaW50KCLilZQiICsgIuKVkCIgKiAodyAtIDIpICsgIuKVlyIpCiAgICBwcmludCgi4pWRIiArICJLRVlDT0RFIExJU1QiLmNlbnRlcih3IC0gMikgKyAi4pWRIikKCiAgICBmb3IgdGl0bGUsIGtleXMgaW4gYmxvY2tzLml0ZW1zKCk6CiAgICAgICAgcHJpbnQoIuKVoCIgKyAi4pWQIiAqICh3IC0gMikgKyAi4pWjIikKICAgICAgICBwcmludCgi4pWRIiArIGYiPD09PT09IHt0aXRsZX0gPT09PT0+Ii5jZW50ZXIodyAtIDIpICsgIuKVkSIpCiAgICAgICAgcHJpbnQoIuKVoCIgKyAi4pWQIiAqICh3IC0gMikgKyAi4pWjIikKICAgICAgICByb3dzID0gbWF0aC5jZWlsKGxlbihrZXlzKSAvIGNvbHMpCiAgICAgICAgbWF0cml4ID0gW10KICAgICAgICBmb3IgciBpbiByYW5nZShyb3dzKToKICAgICAgICAgICAgcm93ID0gW10KICAgICAgICAgICAgZm9yIGMgaW4gcmFuZ2UoY29scyk6CiAgICAgICAgICAgICAgICBpZHggPSByICsgYyAqIHJvd3MKICAgICAgICAgICAgICAgIGlmIGlkeCA8IGxlbihrZXlzKToKICAgICAgICAgICAgICAgICAgICByb3cuYXBwZW5kKGtleXNbaWR4XSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcm93LmFwcGVuZCgiIikKICAgICAgICAgICAgbWF0cml4LmFwcGVuZChyb3cpCgogICAgICAgIGZvciByb3cgaW4gbWF0cml4OgogICAgICAgICAgICBsaW5lID0gIiAiCiAgICAgICAgICAgIGZvciBpdGVtIGluIHJvdzoKICAgICAgICAgICAgICAgIGlmIGl0ZW06CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyIl4oXFtcZCtcXSlccysoLispJCIsIGl0ZW0pCiAgICAgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNrZXQgPSBtYXRjaC5ncm91cCgxKQogICAgICAgICAgICAgICAgICAgICAgICBrZXlfbmFtZSA9IG1hdGNoLmdyb3VwKDIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9pdGVtID0gZiJ7YnJhY2tldDo+NX0ge2tleV9uYW1lfSIKICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArPSBmIntmb3JtYXR0ZWRfaXRlbTo8e2NvbF93fX0iCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArPSBmIntpdGVtOjx7Y29sX3d9fSIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbGluZSArPSAiICIgKiBjb2xfdwogICAgICAgICAgICBsaW5lX2NvbnRlbnQgPSBsaW5lWzp3LTJdLmxqdXN0KHctMikKICAgICAgICAgICAgcHJpbnQoIuKVkSIgKyBsaW5lX2NvbnRlbnQgKyAi4pWRIikKCiAgICBwcmludCgi4pWaIiArICLilZAiICogKHcgLSAyKSArICLilZ0iKQoKCmRlZiBtYWluKCk6CiAgICBsb2FkX2NvbmZpZygpCgogICAgaWYgbGVuKHN5cy5hcmd2KSA8IDI6CiAgICAgICAgc2hvd19oZWxwKCkKICAgICAgICByZXR1cm4KCiAgICBjb21tYW5kID0gc3lzLmFyZ3ZbMV0KCiAgICBpZiBjb21tYW5kID09ICd0eXBlJzoKICAgICAgICB0eXBpbmcoKQogICAgZWxpZiBjb21tYW5kID09ICd3cml0ZSc6CiAgICAgICAgd3JpdGluZygpCiAgICBlbGlmIGNvbW1hbmQgPT0gJ2NoYW5nZSc6CiAgICAgICAgY2hhbmdpbmcoKQogICAgZWxpZiBjb21tYW5kID09ICdyZWFkJzoKICAgICAgICByZWFkaW5nKCkKICAgIGVsaWYgY29tbWFuZCA9PSAnZW5jcnlwdCc6CiAgICAgICAgZW5jcnlwdGluZygpCiAgICBlbGlmIGNvbW1hbmQgPT0gJ2RlY3J5cHQnOgogICAgICAgIGRlY3J5cHRpbmcoKQogICAgZWxpZiBjb21tYW5kID09ICdzd2FwJzoKICAgICAgICBzd2FwcGluZygpCiAgICBlbGlmIGNvbW1hbmQgPT0gJ2V4ZWMnOgogICAgICAgIGV4ZWNfc2NyaXB0KCkKICAgIGVsaWYgY29tbWFuZCA9PSAncmVzaXplJzoKICAgICAgICByZXNpemVfbWVkaWEoKQogICAgZWxpZiBjb21tYW5kID09ICdyZW5hbWUnOgogICAgICAgIHJlbmFtZV9leHRlbnNpb24oKQogICAgZWxpZiBjb21tYW5kID09ICdjb252ZXJ0JzoKICAgICAgICBjb252ZXJ0X3ZpZGVvKCkKICAgIGVsaWYgY29tbWFuZCA9PSAndGV4dCc6CiAgICAgICAgaW5wdXRfdGV4dCgpCiAgICBlbGlmIGNvbW1hbmQgPT0gJ2tleWV2ZW50JzoKICAgICAgICBpbnB1dF9rZXlldmVudCgpCiAgICBlbGlmIGNvbW1hbmQgPT0gJ3N3aXBlJzoKICAgICAgICBpbnB1dF9zd2lwZSgpCiAgICBlbGlmIGNvbW1hbmQgPT0gJ2tleWNvbWJvJzoKICAgICAgICBpbnB1dF9rZXljb21ibygpCiAgICBlbGlmIGNvbW1hbmQgaW4gWyctdicsICctLXZlcnNpb24nXToKICAgICAgICBwcmludCgiMS40LjUtU1IiKQogICAgZWxpZiBjb21tYW5kID09ICdrZXlsaXN0JyBvciBjb21tYW5kID09ICdrZXktbGlzdCc6CiAgICAgICAga2V5X2xpc3QoKQogICAgZWxzZToKICAgICAgICBzaG93X2hlbHAoKQoKZGVmIHNob3dfaGVscCgpOgogICAgIiIiRGlzcGxheSBoZWxwIGluZm9ybWF0aW9uIiIiCiAgICBwcmludCgiIiJVc2FnZTogc3J0b29sIFtjb21tYW5kc10gW29wdGlvbnNdCgpDb21tYW5kczoKICAgIHR5cGUgW3RleHRdIFtvcHRpb25zXSAgICAgICAgIDogdHlwZSBhIHRleHQKICAgIHJlYWQgW2ZpbGVdICAgICAgICAgICAgICAgICAgIDogcmVhZCBhIGZpbGUKICAgIHdyaXRlIFt0ZXh0XSAgICAgICAgICAgICAgICAgIDogd3JpdGUgYSB0ZXh0CiAgICBleGVjIFtzY3JpcHRdICAgICAgICAgICAgICAgICA6IGV4ZWN1dGUgYSBzY3JpcHQKICAgIHN3YXAgW2ZpbGUxXSBbZmlsZTJdICAgICAgICAgIDogc3dhcCBjb250ZW50cyBvZiB0aGUgZmlsZQogICAgcmVzaXplIFtvcHRpb25zXSAgICAgICAgICAgICAgOiByZXNpemUgbWVkaWEgcmVzb2x1dGlvbgogICAgcmVuYW1lIFtmaWxlMV0gW2Zvcm1hdF0gICAgICAgOiByZW5hbWUgZXh0ZW5zaW9uIG9mIGZpbGUKICAgIGNoYW5nZSBbb2xkc3RyXSBbbmV3c3RyXSAgICAgIDogY2hhbmdlIHZhbHVlIG9mIHRoZSBzdHJpbmcKICAgIGNvbnZlcnQgW29wdGlvbnNdICAgICAgICAgICAgIDogY29udmVydCB2aWRlbyB0byBhdWRpbwogICAgZW5jcnlwdCBbaW5wdXRdIFtvdXRwdXRdICAgICAgOiBlbmNyeXB0IGEgc2NyaXB0CiAgICBkZWNyeXB0IFtpbnB1dF0gW291dHB1dF0gICAgICA6IGRlY3J5cHQgYSBzY3JpcHQKCklucHV0IGNvbW1hbmRzOgogICAgdGV4dCBbdGV4dF0gICAgICAgICAgICAgICAgICAgOiBpbnB1dCB0ZXh0IHRvIHRlcm1pbmFsCiAgICBzd2lwZSBbeDFdIFt5MV0gW3gyXSBbeTJdICAgICA6IGVtdWxhdGUgc3dpcGUgdG8gZGV2aWNlCiAgICBrZXlldmVudCBba2V5XSAgICAgICAgICAgICAgICA6IGVtdWxhdGUga2V5ZXZlbnQgdG8gZGV2aWNlCiAgICBrZXljb21ibyBba2V5MV0gW2tleTJdICAgICAgICA6IGVtdWxhdGUga2V5Y29tYmluYXRpb24gdG8gZGV2aWNlCiAgICBrZXlsaXN0ICAgICAgICAgICAgICAgICAgICAgICA6IHNob3cgYWxsIGF2YWlsYWJsZSBrZXljb2RlcwoKT3B0aW9uczoKICAgIC1kLCAtLWRlbGF5ICAgICAgICAgICAgICAgICAgIDogdHlwaW5nIGRlbGF5ICgxLi45OSkKICAgIC1zLCAtLXN5bnRheD08dHlwZXxwYXRoPiAgICAgIDogcmVhZCBzeW50YXgKICAgIC1vLCAtLW91dHB1dCAgICAgICAgICAgICAgICAgIDogd3JpdGUgb3V0cHV0CiAgICAtdiwgLS12ZXJzaW9uICAgICAgICAgICAgICAgICA6IHNob3cgdmVyc2lvbgogICAgLWgsIC0taGVscCAgICAgICAgICAgICAgICAgICAgOiBzaG93IGhlbHAgc2NyZWVuCgpBdXRob3I6IEFyaWUtU1I5MQoiIiIpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpCg=="

try:
    _decoded = base64.b64decode(_DATA)
    exec(_decoded)
except Exception as _e:
    print(f"Error: {_e}")
    sys.exit(1)
