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

_DATA = "CmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBkYXRldGltZQppbXBvcnQgaGFzaGxpYgppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgZ2xvYgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IHRocmVhZGluZwppbXBvcnQgcmFuZG9tCmltcG9ydCB0aW1lCmltcG9ydCBkYXRldGltZQpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKCnRyeToKICAgIGltcG9ydCBkaWFsb2cKICAgIERJQUxPR19BVkFJTEFCTEUgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIERJQUxPR19BVkFJTEFCTEUgPSBGYWxzZQp0cnk6CiAgICBpbXBvcnQgdGtpbnRlciBhcyB0awogICAgZnJvbSB0a2ludGVyIGltcG9ydCB0dGssIG1lc3NhZ2Vib3gsIHNjcm9sbGVkdGV4dCwgZmlsZWRpYWxvZwogICAgVEtJTlRFUl9BVkFJTEFCTEUgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIFRLSU5URVJfQVZBSUxBQkxFID0gRmFsc2UKCkhPTUUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4iKQpQUk9KRUNUX1BBVEggPSBvcy5wYXRoLmpvaW4oSE9NRSwgIlByb2plY3QiKQpERUJJQU5fUEFUSCA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsICJkZWJpYW4iKQpURVJNVVhfUEFUSCA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsICJ0ZXJtdXgiKQpURVJNVVhfREVCX1BBVEggPSBvcy5wYXRoLmpvaW4oUFJPSkVDVF9QQVRILCAidGVybXV4LWRlYiIpCkRFQklBTl9ERUJfUEFUSCA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsICJkZWJpYW4tZGViIikKQ09ORklHX0ZJTEUgPSBvcy5wYXRoLmpvaW4oSE9NRSwgIi5jb25maWciLCAiZ2l0LXJlcG8uY29uZiIpCgpTVVBQT1JURURfQVJDSEVTID0gWydhbGwnLCAnYXJtaGYnLCAnYXJtNjQnLCAnYW1kNjQnLCAnYXJtZWwnLCAnaTM4NicsICdhcm0nLCAnYWFyY2g2NCcsICdpNjg2JywgJ3g4Nl82NCddCkhBU0hFUyA9IFsnbWQ1JywgJ3NoYTEnLCAnc2hhMjU2JywgJ3NoYTUxMiddCgpkZWYgY3JlYXRlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIk1lbWJ1YXQgZGlyZWt0b3JpIGppa2EgYmVsdW0gYWRhIiIiCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKCmRlZiBydW5fc2hlbGxfY29tbWFuZChjbWQpOgogICAgIiIiTWVuamFsYW5rYW4gcGVyaW50YWggc2hlbGwgZGFuIG1lbmdlbWJhbGlrYW4gb3V0cHV0IiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFtjbWRdLCBzaGVsbD1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCkuc3RyaXAoKQogICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgogICAgICAgIHJldHVybiBOb25lCgpkZWYgZW5zdXJlX2RpcmVjdG9yaWVzKCk6CiAgICAiIiJNZW1hc3Rpa2FuIHNlbXVhIGRpcmVrdG9yaSB5YW5nIGRpcGVybHVrYW4gYWRhIiIiCiAgICBjcmVhdGVfZGlyZWN0b3J5KERFQklBTl9QQVRIKQogICAgY3JlYXRlX2RpcmVjdG9yeShURVJNVVhfUEFUSCkKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoVEVSTVVYX0RFQl9QQVRIKToKICAgICAgICBjcmVhdGVfZGlyZWN0b3J5KFRFUk1VWF9ERUJfUEFUSCkKICAgIGVsc2U6CiAgICAgICAgY3JlYXRlX2RpcmVjdG9yeShvcy5wYXRoLmpvaW4oVEVSTVVYX0RFQl9QQVRILCAibWFpbiIpKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhERUJJQU5fREVCX1BBVEgpOgogICAgICAgIGNyZWF0ZV9kaXJlY3RvcnkoREVCSUFOX0RFQl9QQVRIKQogICAgZWxzZToKICAgICAgICBjcmVhdGVfZGlyZWN0b3J5KG9zLnBhdGguam9pbihERUJJQU5fREVCX1BBVEgsICJtYWluIikpCgp0cnk6CiAgICBpbXBvcnQgcmVhZGxpbmUKICAgIFJFQURMSU5FX0FWQUlMQUJMRSA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgUkVBRExJTkVfQVZBSUxBQkxFID0gRmFsc2UKICAgIHByaW50KCJbIV0gcmVhZGxpbmUgbm90IGF2YWlsYWJsZSwgdXNpbmcgYmFzaWMgaW5wdXQiKQoKZGVmIGlucHV0X3dpdGhfZWRpdGFibGVfZGVmYXVsdChwcm9tcHQsIGRlZmF1bHRfdGV4dD0iIik6CiAgICAiIiIKICAgIElucHV0IGZ1bmN0aW9uIHdpdGggZWRpdGFibGUgZGVmYXVsdCB0ZXh0IHVzaW5nIHJlYWRsaW5lLgogICAgVXNlciBjYW4gZWRpdCB0aGUgZGVmYXVsdCB0ZXh0IHVzaW5nIGFycm93IGtleXMsIGJhY2tzcGFjZSwgZXRjLgogICAgIiIiCiAgICBpZiBub3QgUkVBRExJTkVfQVZBSUxBQkxFIG9yIG5vdCBkZWZhdWx0X3RleHQ6CiAgICAgICAgaWYgZGVmYXVsdF90ZXh0OgogICAgICAgICAgICByZXR1cm4gaW5wdXQoZiJ7cHJvbXB0fSBbe2RlZmF1bHRfdGV4dH1dOiAiKS5zdHJpcCgpIG9yIGRlZmF1bHRfdGV4dAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBpbnB1dChmIntwcm9tcHR9OiAiKS5zdHJpcCgpCgogICAgb2xkX2hpc3RvcnkgPSBbXQogICAgdHJ5OgogICAgICAgIGhpc3RvcnlfZmlsZSA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8ucHl0aG9uX2hpc3RvcnkiKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGhpc3RvcnlfZmlsZSk6CiAgICAgICAgICAgIHJlYWRsaW5lLnJlYWRfaGlzdG9yeV9maWxlKGhpc3RvcnlfZmlsZSkKICAgICAgICAgICAgb2xkX2hpc3RvcnkgPSBbcmVhZGxpbmUuZ2V0X2hpc3RvcnlfaXRlbShpKzEpIGZvciBpIGluIHJhbmdlKHJlYWRsaW5lLmdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoKCkpXQogICAgZXhjZXB0OgogICAgICAgIHBhc3MKCiAgICBkZWYgcHJlZmlsbF9pbnB1dCgpOgogICAgICAgIHJlYWRsaW5lLmluc2VydF90ZXh0KGRlZmF1bHRfdGV4dCkKICAgICAgICByZWFkbGluZS5zZXRfc3RhcnR1cF9ob29rKE5vbmUpCgogICAgb2xkX3N0YXJ0dXBfaG9vayA9IE5vbmUKICAgIHRyeToKICAgICAgICBvbGRfc3RhcnR1cF9ob29rID0gcmVhZGxpbmUuZ2V0X3N0YXJ0dXBfaG9vaygpCiAgICBleGNlcHQ6CiAgICAgICAgcGFzcwoKICAgIHJlYWRsaW5lLnNldF9zdGFydHVwX2hvb2socHJlZmlsbF9pbnB1dCkKCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gaW5wdXQoZiJ7cHJvbXB0fTogIikgCiAgICBmaW5hbGx5OgogICAgICAgIHJlYWRsaW5lLnNldF9zdGFydHVwX2hvb2sob2xkX3N0YXJ0dXBfaG9vaykKCiAgICB0cnk6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaGlzdG9yeV9maWxlKToKICAgICAgICAgICAgcmVhZGxpbmUuY2xlYXJfaGlzdG9yeSgpCiAgICAgICAgICAgIGZvciBpdGVtIGluIG9sZF9oaXN0b3J5OgogICAgICAgICAgICAgICAgaWYgaXRlbToKICAgICAgICAgICAgICAgICAgICByZWFkbGluZS5hZGRfaGlzdG9yeShpdGVtKQogICAgZXhjZXB0OgogICAgICAgIHBhc3MKCiAgICByZXR1cm4gcmVzdWx0LnN0cmlwKCkgaWYgcmVzdWx0LnN0cmlwKCkgZWxzZSBkZWZhdWx0X3RleHQKCmRlZiBhdXRvX2luY3JlbWVudF92ZXJzaW9uKHZlcnNpb24pOgogICAgaW1wb3J0IHJlCiAgICBzdWZmaXhfbWF0Y2ggPSByZS5zZWFyY2gocicoLS4rKSQnLCB2ZXJzaW9uKQogICAgc3VmZml4ID0gc3VmZml4X21hdGNoLmdyb3VwKDEpIGlmIHN1ZmZpeF9tYXRjaCBlbHNlICcnCiAgICBudW1lcmljX3BhcnQgPSB2ZXJzaW9uLnJlcGxhY2Uoc3VmZml4LCAnJykKICAgIHBhcnRzID0gbnVtZXJpY19wYXJ0LnNwbGl0KCcuJykKICAgIGlmIGxlbihwYXJ0cykgPj0gMzoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBhcnRzWy0xXSA9IHN0cihpbnQocGFydHNbLTFdKSArIDEpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnMScpCiAgICBlbGlmIGxlbihwYXJ0cykgPT0gMjoKICAgICAgICBwYXJ0cy5hcHBlbmQoJzEnKQogICAgZWxpZiBsZW4ocGFydHMpID09IDE6CiAgICAgICAgcGFydHMuZXh0ZW5kKFsnMCcsICcxJ10pCiAgICBlbHNlOgogICAgICAgIHBhcnRzID0gWycxJywgJzAnLCAnMCddCiAgICBuZXdfbnVtZXJpYyA9ICcuJy5qb2luKHBhcnRzKQogICAgbmV3X3ZlcnNpb24gPSBuZXdfbnVtZXJpYyArIHN1ZmZpeAogICAgcmV0dXJuIG5ld192ZXJzaW9uCgpkZWYgZ2V0X25ld192ZXJzaW9uX2lucHV0KHByb21wdCwgZGVmYXVsdF92ZXJzaW9uPSIyLjEuOSIpOgogICAgc3VnZ2VzdGVkX3ZlcnNpb24gPSBkZWZhdWx0X3ZlcnNpb24KICAgIHByaW50KGYiXG57cHJvbXB0fSIpCiAgICBwcmludChmIiAgU3VnZ2VzdGVkOiB7ZGVmYXVsdF92ZXJzaW9ufSIpCiAgICB1c2Vfc3VnZ2VzdGVkID0gaW5wdXQoIlVzZSBzdWdnZXN0ZWQgdmVyc2lvbj8gW1kvbi9lIHRvIGVkaXRdOiAiKS5zdHJpcCgpLmxvd2VyKCkKICAgIGlmIHVzZV9zdWdnZXN0ZWQgaW4gWycnLCAneScsICd5ZXMnXToKICAgICAgICByZXR1cm4gc3VnZ2VzdGVkX3ZlcnNpb24KICAgIGVsaWYgdXNlX3N1Z2dlc3RlZCBpbiBbJ2UnLCAnZWRpdCddOgogICAgICAgIHJldHVybiBpbnB1dF93aXRoX2VkaXRhYmxlX2RlZmF1bHQoIkVudGVyIHZlcnNpb24iLCBzdWdnZXN0ZWRfdmVyc2lvbikKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIGlucHV0X3dpdGhfZWRpdGFibGVfZGVmYXVsdCgiRW50ZXIgdmVyc2lvbiIsIHN1Z2dlc3RlZF92ZXJzaW9uKQoKZGVmIGdldF91cGRhdGVfdmVyc2lvbl9pbnB1dChwcm9tcHQsIGN1cnJlbnRfdmVyc2lvbik6CiAgICBzdWdnZXN0ZWRfdmVyc2lvbiA9IGF1dG9faW5jcmVtZW50X3ZlcnNpb24oY3VycmVudF92ZXJzaW9uKQogICAgcHJpbnQoZiJcbntwcm9tcHR9IikKICAgIHByaW50KGYiICBDdXJyZW50OiB7Y3VycmVudF92ZXJzaW9ufSIpCiAgICBwcmludChmIiAgU3VnZ2VzdGVkOiB7c3VnZ2VzdGVkX3ZlcnNpb259IikKICAgIHVzZV9zdWdnZXN0ZWQgPSBpbnB1dCgiVXNlIHN1Z2dlc3RlZCB2ZXJzaW9uPyBbWS9uL2UgdG8gZWRpdF06ICIpLnN0cmlwKCkubG93ZXIoKQogICAgaWYgdXNlX3N1Z2dlc3RlZCBpbiBbJycsICd5JywgJ3llcyddOgogICAgICAgIHJldHVybiBzdWdnZXN0ZWRfdmVyc2lvbgogICAgZWxpZiB1c2Vfc3VnZ2VzdGVkIGluIFsnZScsICdlZGl0J106CiAgICAgICAgcmV0dXJuIGlucHV0X3dpdGhfZWRpdGFibGVfZGVmYXVsdCgiRW50ZXIgdmVyc2lvbiIsIHN1Z2dlc3RlZF92ZXJzaW9uKQogICAgZWxzZToKICAgICAgICByZXR1cm4gaW5wdXRfd2l0aF9lZGl0YWJsZV9kZWZhdWx0KCJFbnRlciB2ZXJzaW9uIiwgY3VycmVudF92ZXJzaW9uKQoKZGVmIGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKHByb21wdCwgZGVmYXVsdF92YWx1ZT0iIik6CiAgICBpZiBSRUFETElORV9BVkFJTEFCTEUgYW5kIGRlZmF1bHRfdmFsdWU6CiAgICAgICAgcmV0dXJuIGlucHV0X3dpdGhfZWRpdGFibGVfZGVmYXVsdChwcm9tcHQsIGRlZmF1bHRfdmFsdWUpCiAgICBlbGlmIGRlZmF1bHRfdmFsdWU6CiAgICAgICAgcmV0dXJuIGlucHV0KGYie3Byb21wdH0gW3tkZWZhdWx0X3ZhbHVlfV06ICIpLnN0cmlwKCkgb3IgZGVmYXVsdF92YWx1ZQogICAgZWxzZToKICAgICAgICByZXR1cm4gaW5wdXQoZiJ7cHJvbXB0fTogIikuc3RyaXAoKQoKZGVmIGdldF9yYW5kb21fb3N0eXBlKCk6CiAgICByZXR1cm4gcmFuZG9tLmNob2ljZShbJ3Rlcm11eCcsICdkZWJpYW4nXSkKCmRlZiBjb250cm9sX2ZpbGVfY29udGVudHMoZGViZmlsZSk6CiAgICBmaWxlX2xpc3QgPSBydW5fc2hlbGxfY29tbWFuZCgiYXIgdCB7fSIuZm9ybWF0KGRlYmZpbGUpKQogICAgaWYgZmlsZV9saXN0IGlzIE5vbmU6CiAgICAgICAgc3lzLmV4aXQoIkVycm9yIGxpc3RpbmcgY29udGVudHMgb2YgJ3t9JyIuZm9ybWF0KGRlYmZpbGUpKQoKICAgIGZpbGVfbGlzdCA9IGZpbGVfbGlzdC5zcGxpdCgiXG4iKQoKICAgIGlmICJjb250cm9sLnRhci5neiIgaW4gZmlsZV9saXN0OgogICAgICAgIGNvbnRyb2xfZmlsZW5hbWUgPSAiY29udHJvbC50YXIuZ3oiCiAgICAgICAgdGFyX2FyZ3MgPSAiLXoiCiAgICBlbGlmICJjb250cm9sLnRhci54eiIgaW4gZmlsZV9saXN0OgogICAgICAgIGNvbnRyb2xfZmlsZW5hbWUgPSAiY29udHJvbC50YXIueHoiCiAgICAgICAgdGFyX2FyZ3MgPSAiLUoiCiAgICBlbHNlOgogICAgICAgIHN5cy5leGl0KCJGYWlsZWQgdG8gZmluZCBjb250cm9sIGZpbGUgaW4gJ3t9JyIuZm9ybWF0KGRlYmZpbGUpKQoKICAgIGNtZF9mbXQgPSAiYXIgcCB7fSB7fSB8IHRhciAtTyB7fSAteGYgLSAuL2NvbnRyb2wiCiAgICBjbWQgPSBjbWRfZm10LmZvcm1hdChkZWJmaWxlLCBjb250cm9sX2ZpbGVuYW1lLCB0YXJfYXJncykKICAgIGNvbnRlbnRzID0gcnVuX3NoZWxsX2NvbW1hbmQoY21kKQogICAgaWYgY29udGVudHMgaXMgTm9uZToKICAgICAgICBzeXMuZXhpdCgiRXJyb3IgZXh0cmFjdGluZyBjb250cm9sIGZpbGUgZnJvbSAne30nIi5mb3JtYXQoZGViZmlsZSkpCgogICAgcmV0dXJuIGNvbnRlbnRzCgpkZWYgbGlzdF9wYWNrYWdlX2ZpbGVzKGRlYmZpbGUpOgogICAgIiIiTWVuZGFmdGFyIGZpbGUtZmlsZSBkYWxhbSBwYWNrYWdlIGRlYiIiIgogICAgYWxsX2NvbnRlbnQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCgKICAgICAgICBbImFyIHAgIiArIGRlYmZpbGUgKyAiIGRhdGEudGFyLnh6IHwgdGFyIC10SiJdLAogICAgICAgIHNoZWxsPVRydWUsCiAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCiAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTAogICAgKQogICAgcmV0dXJuIFtmaWxlcy5zdHJpcCgiLi8iKSBmb3IgZmlsZXMgaW4gYWxsX2NvbnRlbnQuc3BsaXRsaW5lcygpIGlmIG5vdCBmaWxlc1stMV0gPT0gIi8iXQoKZGVmIGdldF9wYWNrYWdlX25hbWUoZmlsZW5hbWUpOgogICAgcmV0dXJuIGZpbGVuYW1lLnNwbGl0KCdfJylbMF0KCmRlZiBhZGRfZGViKGRlYl90b19hZGRfcGF0aCwgY29tcG9uZW50LCBkaXN0cmlidXRpb25fcGF0aCwgdXNlX2hhcmRfbGlua3MpOgogICAgZGViX3RvX2FkZF9jb250cm9sX2ZpbGUgPSBjb250cm9sX2ZpbGVfY29udGVudHMoZGViX3RvX2FkZF9wYXRoKQogICAgZGViX3RvX2FkZF9wa2dfbmFtZSA9IHJlLnNlYXJjaCgnUGFja2FnZTogKC4qKScsIGRlYl90b19hZGRfY29udHJvbF9maWxlKS5ncm91cCgxKQogICAgZGViX2FyY2ggPSByZS5zZWFyY2goJ0FyY2hpdGVjdHVyZTogKC4qKScsIGRlYl90b19hZGRfY29udHJvbF9maWxlKS5ncm91cCgxKQoKICAgIGlmIGRlYl9hcmNoIG5vdCBpbiBTVVBQT1JURURfQVJDSEVTOgogICAgICAgIHN5cy5leGl0KCdVbnN1cHBvcnRlZCBhcmNoICInICsgZGViX2FyY2ggKyAnIiBpbiAnICsgb3MucGF0aC5iYXNlbmFtZShkZWJfdG9fYWRkX3BhdGgpKQoKICAgIGFyY2hfZGlyX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGNvbXBvbmVudCwgJ2JpbmFyeS0nICsgZGViX2FyY2gpCgogICAgaWYgbm90IG9zLnBhdGguaXNkaXIoYXJjaF9kaXJfcGF0aCk6CiAgICAgICAgb3MubWFrZWRpcnMoYXJjaF9kaXJfcGF0aCkKCiAgICBwcmludCgnQWRkaW5nIGRlYiBmaWxlOiAnICsgb3MucGF0aC5iYXNlbmFtZShkZWJfdG9fYWRkX3BhdGgpICsgJy4uLicpCiAgICBkZXN0X2RlYl9kaXJfcGF0aCA9IG9zLnBhdGguam9pbihkaXN0cmlidXRpb25fcGF0aCwgY29tcG9uZW50LCAnYmluYXJ5LScgKyBkZWJfYXJjaCkKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRlc3RfZGViX2Rpcl9wYXRoKToKICAgICAgICBvcy5tYWtlZGlycyhkZXN0X2RlYl9kaXJfcGF0aCkKICAgIGRlc3RpbmF0aW9uX2RlYl9maWxlID0gb3MucGF0aC5qb2luKGRlc3RfZGViX2Rpcl9wYXRoLCBvcy5wYXRoLmJhc2VuYW1lKGRlYl90b19hZGRfcGF0aCkpCgogICAgaWYgdXNlX2hhcmRfbGlua3M6CiAgICAgICAgb3MubGluayhkZWJfdG9fYWRkX3BhdGgsIGRlc3RpbmF0aW9uX2RlYl9maWxlKQogICAgZWxzZToKICAgICAgICBzaHV0aWwuY29weTIoZGViX3RvX2FkZF9wYXRoLCBkZXN0aW5hdGlvbl9kZWJfZmlsZSkKCiAgICBjb250ZW50c19maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGNvbXBvbmVudCwgJ0NvbnRlbnRzLScgKyBkZWJfYXJjaCkKICAgIHdpdGggb3Blbihjb250ZW50c19maWxlX3BhdGgsICdhJykgYXMgY29udGVudHNfZmlsZToKICAgICAgICBmb3IgZiBpbiBsaXN0X3BhY2thZ2VfZmlsZXMoZGVzdGluYXRpb25fZGViX2ZpbGUpOgogICAgICAgICAgICBwcmludCgiJS04MHMgJXMiICUgKGYsIGRlYl90b19hZGRfcGtnX25hbWUpLCBmaWxlPWNvbnRlbnRzX2ZpbGUpCgpkZWYgYnVpbGRfc291cmNlKCk6CiAgICBwcmludCgiXG5bK10gQ3JlYXRpbmcgbmV3IHNvdXJjZSBwYWNrYWdlIikKCiAgICBsaW51eHR5cGUgPSBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZSgiT1MgVHlwZSIsZ2V0X3JhbmRvbV9vc3R5cGUoKSkKICAgIHBrZ25hbWUgPSBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZSgiUGFja2FnZSBOYW1lIiwgIm15dG9vbHMiKQogICAgdmVyc2lvbmRlYiA9IGdldF9uZXdfdmVyc2lvbl9pbnB1dCgiVmVyc2lvbiIsICIxLjAuMCIpCiAgICBhcmNodHlwZSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJBcmNoaXRlY3R1cmUiLCAiYWxsIikKICAgIGRlcGVuZCA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJEZXBlbmRzIiwgIiIpCiAgICByZWNvbW1lbmQgPSBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZSgiUmVjb21tZW5kcyIsICIiKQogICAgaW5zdGFsbHNpemUgPSBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZSgiSW5zdGFsbGVkIFNpemUiLCAiMTAyNCIpCiAgICBkZXNjcmlwdGlvbiA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJEZXNjcmlwdGlvbnMiLCAiQSBncmVhdCB0b29scyIpCiAgICB1c2VybmFtZSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJVc2VybmFtZSIsIG9zLmVudmlyb24uZ2V0KCdVU0VSJywgJ3VzZXInKSkKICAgIHVzZXJlbWFpbCA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJFbWFpbCIsIGYie29zLmVudmlyb24uZ2V0KCdVU0VSJywgJ3VzZXInKX1AZXhhbXBsZS5jb20iKQogICAgaG9tZXBhZ2UgPSBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZSgiSG9tZSBQYWdlIiwgImh0dHBzOi8vZXhhbXBsZS5jb20iKQogICAgcGFja2FnZV9kaXIgPSBvcy5wYXRoLmpvaW4oUFJPSkVDVF9QQVRILCBsaW51eHR5cGUsIGYie3BrZ25hbWV9X3t2ZXJzaW9uZGVifV97YXJjaHR5cGV9IikKICAgIGRlYmlhbl9kaXIgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICJERUJJQU4iKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkZWJpYW5fZGlyKToKICAgICAgICBvcy5tYWtlZGlycyhkZWJpYW5fZGlyKQogICAgZWxzZToKICAgICAgICBwcmludChmIkRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czoge3BhY2thZ2VfZGlyfSIpCiAgICAgICAgcmV0dXJuCgogICAgVEVSTVVYX1NIRUJBTkcgPSAiIyEvZGF0YS9kYXRhL2NvbS50ZXJtdXgvZmlsZXMvdXNyL2Jpbi9iYXNoIgogICAgREVCSUFOX1NIRUJBTkcgPSAiIyEvYmluL2Jhc2giCgogICAgaWYgbGludXh0eXBlID09ICJ0ZXJtdXgiOgogICAgICAgIGJpbl9kaXIgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICJkYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy91c3IvYmluIikKICAgICAgICBvcy5tYWtlZGlycyhiaW5fZGlyLCBleGlzdF9vaz1UcnVlKQoKICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRlYmlhbl9kaXIsICJwb3N0aW5zdCIpLCAndycpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoVEVSTVVYX1NIRUJBTkcgKyAiXG4iKQogICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGViaWFuX2RpciwgInByZXJtIiksICd3JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZShURVJNVVhfU0hFQkFORyArICJcbiIpCiAgICBlbHNlOgogICAgICAgIGJpbl9kaXIgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICJ1c3IvbG9jYWwvYmluIikKICAgICAgICBvcy5tYWtlZGlycyhiaW5fZGlyLCBleGlzdF9vaz1UcnVlKQoKICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRlYmlhbl9kaXIsICJwb3N0aW5zdCIpLCAndycpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoREVCSUFOX1NIRUJBTkcgKyAiXG4iKQogICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGViaWFuX2RpciwgInByZXJtIiksICd3JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZShERUJJQU5fU0hFQkFORyArICJcbiIpCgogICAgY29udHJvbF9jb250ZW50ID0gZiIiIlBhY2thZ2U6IHtwa2duYW1lfQpWZXJzaW9uOiB7dmVyc2lvbmRlYn0KQXJjaGl0ZWN0dXJlOiB7YXJjaHR5cGV9Ck1haW50YWluZXI6IHt1c2VybmFtZX0gPHt1c2VyZW1haWx9PgpEZXBlbmRzOiB7ZGVwZW5kfQpSZWNvbW1lbmRzOiB7cmVjb21tZW5kfQpJbnN0YWxsZWQtU2l6ZToge2luc3RhbGxzaXplfQpIb21lcGFnZToge2hvbWVwYWdlfQpEZXNjcmlwdGlvbjoge2Rlc2NyaXB0aW9ufSIiIgoKICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGViaWFuX2RpciwgImNvbnRyb2wiKSwgJ3cnKSBhcyBmOgogICAgICAgIGYud3JpdGUoY29udHJvbF9jb250ZW50KQoKICAgIHN1YnByb2Nlc3MucnVuKFsnY2htb2QnLCAnNzU1JywgZGViaWFuX2RpciwgJy1SJ10pCgogICAgcHJpbnQoZiJcblsrXSBTb3VyY2UgcGFja2FnZSBjcmVhdGVkIGF0OiB7cGFja2FnZV9kaXJ9IikKICAgIHByaW50KGYiWytdIE1vdmUgeW91ciBiaW5hcnkgZmlsZXMgdG86IHtiaW5fZGlyfSIpCgpkZWYgdXBkYXRlX3NvdXJjZSgpOgogICAgIiIiVXBkYXRlIHNvdXJjZSBwYWNrYWdlIiIiCiAgICBwcmludCgiXG5bK10gVXBkYXRpbmcgc291cmNlIHBhY2thZ2UiKQogICAgbGludXh0eXBlID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIk9TIFR5cGUiLGdldF9yYW5kb21fb3N0eXBlKCkpCiAgICBzb3VyY2VfZGlyID0gb3MucGF0aC5qb2luKFBST0pFQ1RfUEFUSCwgbGludXh0eXBlKQogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNvdXJjZV9kaXIpOgogICAgICAgIHByaW50KGYiU291cmNlIGRpcmVjdG9yeSBub3QgZm91bmQ6IHtzb3VyY2VfZGlyfSIpCiAgICAgICAgcmV0dXJuCiAgICBmaWxlcyA9IFtkIGZvciBkIGluIG9zLmxpc3RkaXIoc291cmNlX2RpcikgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgZCkpXQogICAgaWYgbm90IGZpbGVzOgogICAgICAgIHByaW50KCJObyBzb3VyY2UgcGFja2FnZXMgZm91bmQiKQogICAgICAgIHJldHVybgogICAgaWYgbGVuKGZpbGVzKSA9PSAxOgogICAgICAgIHNlbGVjdGVkID0gZmlsZXNbMF0KICAgICAgICBwcmludChmIlxuQXV0by1zZWxlY3Rpbmc6IHtzZWxlY3RlZH0iKQogICAgZWxzZToKICAgICAgICBwcmludCgiXG5BdmFpbGFibGUgcGFja2FnZXM6IikKICAgICAgICBmb3IgaSwgZiBpbiBlbnVtZXJhdGUoZmlsZXMsIDEpOgogICAgICAgICAgICBwcmludChmIiAge2l9LiB7Zn0iKQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNob2ljZSA9IGlucHV0KCJTZWxlY3QgcGFja2FnZSAobnVtYmVyKTogIikuc3RyaXAoKQogICAgICAgICAgICAgICAgaWR4ID0gaW50KGNob2ljZSkgLSAxCiAgICAgICAgICAgICAgICBpZiAwIDw9IGlkeCA8IGxlbihmaWxlcyk6CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBmaWxlc1tpZHhdCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiJJbnZhbGlkIHNlbGVjdGlvbi4gUGxlYXNlIGVudGVyIDEte2xlbihmaWxlcyl9IikKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBwcmludCgiUGxlYXNlIGVudGVyIGEgdmFsaWQgbnVtYmVyIikKCiAgICBwYWNrYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2Rpciwgc2VsZWN0ZWQpCiAgICBjb250cm9sX3BhdGggPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9wYXRoLCAiREVCSUFOIiwgImNvbnRyb2wiKQogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGNvbnRyb2xfcGF0aCk6CiAgICAgICAgcHJpbnQoIkludmFsaWQgc291cmNlIHBhY2thZ2UiKQogICAgICAgIHJldHVybgogICAgd2l0aCBvcGVuKGNvbnRyb2xfcGF0aCwgJ3InKSBhcyBmOgogICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQogICAgcGtnX25hbWUgPSByZS5zZWFyY2gocidQYWNrYWdlOiAoLiopJywgY29udGVudCkuZ3JvdXAoMSkKICAgIHBrZ192ZXJzaW9uID0gcmUuc2VhcmNoKHInVmVyc2lvbjogKC4qKScsIGNvbnRlbnQpLmdyb3VwKDEpCiAgICBwa2dfYXJjaCA9IHJlLnNlYXJjaChyJ0FyY2hpdGVjdHVyZTogKC4qKScsIGNvbnRlbnQpLmdyb3VwKDEpCgogICAgcHJpbnQoZiJcblsrXSBDdXJyZW50IHBhY2thZ2UgaW5mbzoiKQogICAgcHJpbnQoZiIgICAgUGFja2FnZToge3BrZ19uYW1lfSIpCiAgICBwcmludChmIiAgICBWZXJzaW9uOiB7cGtnX3ZlcnNpb259IikKICAgIHByaW50KGYiICAgIEFyY2hpdGVjdHVyZToge3BrZ19hcmNofSIpCgogICAgbmV3X25hbWUgPSBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZSgiTmV3IHBhY2thZ2UgbmFtZSIsIHBrZ19uYW1lKQogICAgbmV3X3ZlcnNpb24gPSBnZXRfdXBkYXRlX3ZlcnNpb25faW5wdXQoIlZlcnNpb24iLCBwa2dfdmVyc2lvbikKICAgIG5ld19hcmNoID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIk5ldyBhcmNoaXRlY3R1cmUiLCBwa2dfYXJjaCkKICAgIHJlbmFtZSA9IGlucHV0KCJSZW5hbWUgc291cmNlIGZvbGRlcj8gW1kvbl06ICIpLnN0cmlwKCkubG93ZXIoKQogICAgbmV3X2Rpcl9uYW1lID0gZiJ7bmV3X25hbWV9X3tuZXdfdmVyc2lvbn1fe25ld19hcmNofSIKICAgIG5ld19wYWNrYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgbmV3X2Rpcl9uYW1lKQoKICAgIGlmIHJlbmFtZSBpbiBbJycsICd5JywgJ3llcyddOgogICAgICAgIG9zLnJlbmFtZShwYWNrYWdlX3BhdGgsIG5ld19wYWNrYWdlX3BhdGgpCiAgICAgICAgcHJpbnQoZiJbK10gUmVuYW1lZDoge3NlbGVjdGVkfSAtPiB7bmV3X2Rpcl9uYW1lfSIpCiAgICBlbHNlOgogICAgICAgIHNodXRpbC5jb3B5dHJlZShwYWNrYWdlX3BhdGgsIG5ld19wYWNrYWdlX3BhdGgpCiAgICAgICAgcHJpbnQoZiJbK10gQ29waWVkOiB7c2VsZWN0ZWR9IC0+IHtuZXdfZGlyX25hbWV9IikKCiAgICBjb250cm9sX3BhdGhfbmV3ID0gb3MucGF0aC5qb2luKG5ld19wYWNrYWdlX3BhdGgsICJERUJJQU4iLCAiY29udHJvbCIpCiAgICB3aXRoIG9wZW4oY29udHJvbF9wYXRoX25ldywgJ3InKSBhcyBmOgogICAgICAgIG5ld19jb250ZW50ID0gZi5yZWFkKCkKCiAgICBuZXdfY29udGVudCA9IHJlLnN1YihyJ1BhY2thZ2U6IC4qJywgZidQYWNrYWdlOiB7bmV3X25hbWV9JywgbmV3X2NvbnRlbnQpCiAgICBuZXdfY29udGVudCA9IHJlLnN1YihyJ1ZlcnNpb246IC4qJywgZidWZXJzaW9uOiB7bmV3X3ZlcnNpb259JywgbmV3X2NvbnRlbnQpCiAgICBuZXdfY29udGVudCA9IHJlLnN1YihyJ0FyY2hpdGVjdHVyZTogLionLCBmJ0FyY2hpdGVjdHVyZToge25ld19hcmNofScsIG5ld19jb250ZW50KQoKICAgIHdpdGggb3Blbihjb250cm9sX3BhdGhfbmV3LCAndycpIGFzIGY6CiAgICAgICAgZi53cml0ZShuZXdfY29udGVudCkKCiAgICBpZiBsaW51eHR5cGUgPT0gInRlcm11eCI6CiAgICAgICAgYmluX2RpciA9IG9zLnBhdGguam9pbihuZXdfcGFja2FnZV9wYXRoLCAiZGF0YS9kYXRhL2NvbS50ZXJtdXgvZmlsZXMvdXNyL2JpbiIpCiAgICBlbHNlOgogICAgICAgIGJpbl9kaXIgPSBvcy5wYXRoLmpvaW4obmV3X3BhY2thZ2VfcGF0aCwgInVzci9sb2NhbC9iaW4iKQoKICAgIGlmIG9zLnBhdGguZXhpc3RzKGJpbl9kaXIpOgogICAgICAgIGZvciBiaW5fZmlsZSBpbiBvcy5saXN0ZGlyKGJpbl9kaXIpOgogICAgICAgICAgICBiaW5fcGF0aCA9IG9zLnBhdGguam9pbihiaW5fZGlyLCBiaW5fZmlsZSkKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoYmluX3BhdGgpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihiaW5fcGF0aCwgJ3InKSBhcyBmOgogICAgICAgICAgICAgICAgICAgICAgICBiaW5fY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgaWYgcGtnX3ZlcnNpb24gaW4gYmluX2NvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGJpbl9jb250ZW50ID0gYmluX2NvbnRlbnQucmVwbGFjZShwa2dfdmVyc2lvbiwgbmV3X3ZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihiaW5fcGF0aCwgJ3cnKSBhcyBmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZShiaW5fY29udGVudCkKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiJbK10gVXBkYXRlZCB2ZXJzaW9uIGluOiB7YmluX2ZpbGV9IikKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgICAgICBwcmludChmIlstXSBDb3VsZCBub3QgdXBkYXRlIHtiaW5fZmlsZX06IHtlfSIpCgogICAgc3VicHJvY2Vzcy5ydW4oWydjaG1vZCcsICc3NTUnLCBvcy5wYXRoLmpvaW4obmV3X3BhY2thZ2VfcGF0aCwgIkRFQklBTiIpLCAnLVInXSkKCiAgICBwcmludChmIlxuWytdIFBhY2thZ2UgdXBkYXRlZCBzdWNjZXNzZnVsbHkhIikKICAgIHByaW50KGYiICAgIExvY2F0aW9uOiB7bmV3X3BhY2thZ2VfcGF0aH0iKQogICAgcHJpbnQoZiIgICAgTmV3IHZlcnNpb246IHtuZXdfdmVyc2lvbn0iKQoKZGVmIGJ1aWxkX2RlYigpOgogICAgIiIiTWVtYmFuZ3VuIGRlYiBkYXJpIHNvdXJjZSIiIgogICAgcHJpbnQoIlxuWytdIEJ1aWxkaW5nIGRlYiBwYWNrYWdlIikKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoUFJPSkVDVF9QQVRIKToKICAgICAgICBwcmludCgiUHJvamVjdCBmb2xkZXIgbm90IGZvdW5kLiBSdW4gJ3JlcG8tbWFuYWdlciAtLXNvdXJjZScgZmlyc3QiKQogICAgICAgIHJldHVybgoKICAgIGxpbnV4dHlwZSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJPUyBUeXBlIixnZXRfcmFuZG9tX29zdHlwZSgpKQogICAgc291cmNlX2RpciA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsIGxpbnV4dHlwZSkKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlX2Rpcik6CiAgICAgICAgcHJpbnQoZiJTb3VyY2UgZGlyZWN0b3J5IG5vdCBmb3VuZDoge3NvdXJjZV9kaXJ9IikKICAgICAgICByZXR1cm4KCiAgICBmaWxlcyA9IFtkIGZvciBkIGluIG9zLmxpc3RkaXIoc291cmNlX2RpcikgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgZCkpXQogICAgZmlsZXMuc29ydCgpCgogICAgaWYgbm90IGZpbGVzOgogICAgICAgIHByaW50KCJObyBzb3VyY2UgcGFja2FnZXMgZm91bmQiKQogICAgICAgIHJldHVybgoKICAgIHByaW50KCJcbkF2YWlsYWJsZSBwYWNrYWdlczoiKQogICAgZm9yIGksIGYgaW4gZW51bWVyYXRlKGZpbGVzLCAxKToKICAgICAgICBwcmludChmIiAge2l9LiB7Zn0iKQoKICAgIGNob2ljZSA9IGlucHV0KCJTZWxlY3QgcGFja2FnZSAobnVtYmVyKTogIikuc3RyaXAoKQogICAgdHJ5OgogICAgICAgIGlkeCA9IGludChjaG9pY2UpIC0gMQogICAgICAgIGlmIDAgPD0gaWR4IDwgbGVuKGZpbGVzKToKICAgICAgICAgICAgc2VsZWN0ZWQgPSBmaWxlc1tpZHhdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoIkludmFsaWQgc2VsZWN0aW9uIikKICAgICAgICAgICAgcmV0dXJuCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwcmludCgiSW52YWxpZCBpbnB1dCIpCiAgICAgICAgcmV0dXJuCgogICAgcGFja2FnZV9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIHNlbGVjdGVkKQogICAgZGViaWFuX2RpciA9IG9zLnBhdGguam9pbihwYWNrYWdlX3BhdGgsICJERUJJQU4iKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkZWJpYW5fZGlyKToKICAgICAgICBwcmludChmIkRFQklBTiBkaXJlY3Rvcnkgbm90IGZvdW5kIGluIHtzZWxlY3RlZH0iKQogICAgICAgIHByaW50KCJUaGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgc291cmNlIHBhY2thZ2UiKQogICAgICAgIHJldHVybgoKICAgIGNvbmZpZyA9IGxvYWRfcmVwb19jb25maWcoKQogICAgY29tcGZvbGQgPSBjb25maWcuZ2V0KCdDT01QT05FTlQnKSBvciAibWFpbiIKICAgIGNvbmZpZ1snQ09NUE9ORU5UJ10gPSBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZSgiQ29tcG9uZW50IGZvbGRlciIsIGNvbXBmb2xkKQoKICAgIGlmIGxpbnV4dHlwZSA9PSAidGVybXV4IjoKICAgICAgICBkZWJmb2xkID0gVEVSTVVYX0RFQl9QQVRICiAgICBlbHNlOgogICAgICAgIGRlYmZvbGQgPSBERUJJQU5fREVCX1BBVEgKCiAgICBjb21wb25lbnRfZGlyID0gb3MucGF0aC5qb2luKGRlYmZvbGQsIGNvbXBmb2xkKQogICAgY3JlYXRlX2RpcmVjdG9yeShjb21wb25lbnRfZGlyKQoKICAgIHN1YnByb2Nlc3MucnVuKFsnY2htb2QnLCAnNzU1JywgZGViaWFuX2RpciwgJy1SJ10pCiAgICBzdWJwcm9jZXNzLnJ1bihbJ2Rwa2ctZGViJywgJy0tYnVpbGQnLCAnLVp4eicsIHBhY2thZ2VfcGF0aF0pCgogICAgZGViX2ZpbGUgPSBwYWNrYWdlX3BhdGggKyAiLmRlYiIKICAgIGlmIG9zLnBhdGguZXhpc3RzKGRlYl9maWxlKToKICAgICAgICBzaHV0aWwubW92ZShkZWJfZmlsZSwgb3MucGF0aC5qb2luKGNvbXBvbmVudF9kaXIsIG9zLnBhdGguYmFzZW5hbWUoZGViX2ZpbGUpKSkKICAgICAgICBwcmludChmIlsrXSBEZWIgYnVpbHQgc3VjY2Vzc2Z1bGx5OiB7b3MucGF0aC5qb2luKGNvbXBvbmVudF9kaXIsIG9zLnBhdGguYmFzZW5hbWUoZGViX2ZpbGUpKX0iKQogICAgZWxzZToKICAgICAgICBwcmludCgiWy1dIEZhaWxlZCB0byBidWlsZCBkZWIiKQoKZGVmIGxvYWRfcmVwb19jb25maWcoKToKICAgICIiIkxvYWQga29uZmlndXJhc2kgcmVwb3NpdG9yeSIiIgogICAgY29uZmlnID0gewogICAgICAgICdVU0VSTkFNRSc6ICcnLAogICAgICAgICdSRVBPU0lUT1JZJzogJycsCiAgICAgICAgJ09TVFlQRSc6ICcnLAogICAgICAgICdDT0RFTkFNRSc6ICcnLAogICAgICAgICdDT01QT05FTlQnOiAnJwogICAgfQoKICAgIGlmIG9zLnBhdGguZXhpc3RzKENPTkZJR19GSUxFKToKICAgICAgICB3aXRoIG9wZW4oQ09ORklHX0ZJTEUsICdyJykgYXMgZjoKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIGlmICc9JyBpbiBsaW5lOgogICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUgPSBsaW5lLnN0cmlwKCkuc3BsaXQoJz0nLCAxKQogICAgICAgICAgICAgICAgICAgIGlmIGtleSBpbiBjb25maWc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1trZXldID0gdmFsdWUKCiAgICByZXR1cm4gY29uZmlnCgpkZWYgc2F2ZV9yZXBvX2NvbmZpZyhjb25maWcpOgogICAgIiIiU2F2ZSBrb25maWd1cmFzaSByZXBvc2l0b3J5IiIiCiAgICBjcmVhdGVfZGlyZWN0b3J5KG9zLnBhdGguZGlybmFtZShDT05GSUdfRklMRSkpCiAgICB3aXRoIG9wZW4oQ09ORklHX0ZJTEUsICd3JykgYXMgZjoKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBjb25maWcuaXRlbXMoKToKICAgICAgICAgICAgaWYgdmFsdWU6CiAgICAgICAgICAgICAgICBmLndyaXRlKGYie2tleX09e3ZhbHVlfVxuIikKCmRlZiBnZW5lcmF0ZV9yZXBvX2NvbmZpZygpOgogICAgIiIiR2VuZXJhdGUga29uZmlndXJhc2kgcmVwb3NpdG9yeSIiIgogICAgY29uZmlnID0gbG9hZF9yZXBvX2NvbmZpZygpCgogICAgcHJpbnQoIlxuWytdIFJlcG9zaXRvcnkgQ29uZmlndXJhdGlvblxuIikKCiAgICBnaXRfdXNlciA9IHN1YnByb2Nlc3MucnVuKFsnZ2l0JywgJ2NvbmZpZycsICd1c2VyLm5hbWUnXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgdGV4dD1UcnVlKS5zdGRvdXQuc3RyaXAoKQoKICAgIGRlZmF1bHRfdXNlcm5hbWUgPSBjb25maWcuZ2V0KCdVU0VSTkFNRScpIG9yIGdpdF91c2VyIG9yICJ1c2VybmFtZSIKICAgIGNvbmZpZ1snVVNFUk5BTUUnXSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJHaXQgdXNlcm5hbWUiLCBkZWZhdWx0X3VzZXJuYW1lKQoKICAgIGN1cnJlbnRfZGlyID0gb3MucGF0aC5iYXNlbmFtZShvcy5nZXRjd2QoKSkKICAgIGRlZmF1bHRfcmVwbyA9IGNvbmZpZy5nZXQoJ1JFUE9TSVRPUlknKSBvciBjdXJyZW50X2RpcgogICAgY29uZmlnWydSRVBPU0lUT1JZJ10gPSBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZSgiR2l0IHJlcG8iLCBkZWZhdWx0X3JlcG8pCgogICAgZGVmYXVsdF9vc3R5cGUgPSBjb25maWcuZ2V0KCdPU1RZUEUnKSBvciAiZGViaWFuIgogICAgY29uZmlnWydPU1RZUEUnXSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJPUyB0eXBlIiwgZGVmYXVsdF9vc3R5cGUpCgogICAgZGVmYXVsdF9jb2RlbmFtZSA9IGNvbmZpZy5nZXQoJ0NPREVOQU1FJykgb3IgInN0YWJsZSIKICAgIGNvbmZpZ1snQ09ERU5BTUUnXSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJDb2RlIG5hbWUiLCBkZWZhdWx0X2NvZGVuYW1lKQoKICAgIGRlZmF1bHRfY29tcG9uZW50ID0gY29uZmlnLmdldCgnQ09NUE9ORU5UJykgb3IgIm1haW4iCiAgICBjb25maWdbJ0NPTVBPTkVOVCddID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIkNvbXBvbmVudCIsIGRlZmF1bHRfY29tcG9uZW50KQoKICAgIHNhdmVfcmVwb19jb25maWcoY29uZmlnKQoKICAgIHJlcG9fdXJsID0gZiJkZWIgaHR0cHM6Ly97Y29uZmlnWydVU0VSTkFNRSddfS5naXRodWIuaW8ve2NvbmZpZ1snUkVQT1NJVE9SWSddfS97Y29uZmlnWydPU1RZUEUnXX0ge2NvbmZpZ1snQ09ERU5BTUUnXX0ge2NvbmZpZ1snQ09NUE9ORU5UJ119IgoKICAgIHByaW50KGYiXG5bK10gUmVwb3NpdG9yeSBVUkw6IHtyZXBvX3VybH0iKQogICAgcHJpbnQoIlsrXSBDb25maWcgc2F2ZWQgdG8gfi8uY29uZmlnL2dpdC1yZXBvLmNvbmYiKQoKICAgIHJldHVybiBjb25maWcKCmRlZiBidWlsZF9yZXBvc2l0b3J5KCk6CiAgICBwcmludCgiXG5bK10gQnVpbGRpbmcgcmVwb3NpdG9yeSIpCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKCIuZ2l0Iik6CiAgICAgICAgcHJpbnQoIk5vdCBpbiBhIGdpdCByZXBvc2l0b3J5LiBQbGVhc2UgcnVuIHRoaXMgY29tbWFuZCBmcm9tIHlvdXIgcmVwb3NpdG9yeSBmb2xkZXIiKQogICAgICAgIHByaW50KCJPciBpbml0aWFsaXplIGdpdCB3aXRoOiBnaXQgaW5pdCIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgY29uZmlnID0gZ2VuZXJhdGVfcmVwb19jb25maWcoKQoKICAgIGlmIGNvbmZpZ1snT1NUWVBFJ10gPT0gInRlcm11eCI6CiAgICAgICAgZGViX3BhdGggPSBURVJNVVhfREVCX1BBVEgKICAgIGVsc2U6CiAgICAgICAgZGViX3BhdGggPSBERUJJQU5fREVCX1BBVEgKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGViX3BhdGgpOgogICAgICAgIHByaW50KGYiRGViIGZvbGRlciBub3QgZm91bmQ6IHtkZWJfcGF0aH0iKQogICAgICAgIHByaW50KCJCdWlsZCBzb21lIGRlYnMgZmlyc3Qgd2l0aCAncmVwby1tYW5hZ2VyIC0tZGViJyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBydW5fYnVpbGRfcmVwbyhkZWJfcGF0aCwgY29uZmlnWydPU1RZUEUnXSwgY29uZmlnWydDT0RFTkFNRSddLCBjb25maWdbJ0NPTVBPTkVOVCddLCBzaWduPVRydWUpCiAgICByZXR1cm4gVHJ1ZQoKZGVmIHJ1bl9idWlsZF9yZXBvKGlucHV0X3BhdGgsIG91dHB1dF9wYXRoLCBkaXN0cmlidXRpb24sIGNvbXBvbmVudCwgc2lnbj1GYWxzZSk6CgogICAgQ09NUE9ORU5UUyA9IFtdCiAgICBlbmNvdW50ZXJlZF9hcmNoZXMgPSBzZXQoKQoKICAgIGRpc3RyaWJ1dGlvbl9wYXRoID0gb3MucGF0aC5qb2luKG91dHB1dF9wYXRoLCAnZGlzdHMnLCBkaXN0cmlidXRpb24pCgogICAgaWYgbm90IG9zLnBhdGguaXNkaXIoaW5wdXRfcGF0aCk6CiAgICAgICAgc3lzLmV4aXQoZiIne2lucHV0X3BhdGh9JyBkb2VzIG5vdCBleGlzdCIpCgogICAgZGVic19pbl9wYXRoID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihpbnB1dF9wYXRoLCAiKi5kZWIiKSkKICAgIGRlYnNfaW5fcGF0aCArPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGlucHV0X3BhdGgsICIqLyouZGViIikpCgogICAgaWYgbm90IGRlYnNfaW5fcGF0aDoKICAgICAgICBzeXMuZXhpdCgnTm8gLmRlYiBmaWxlIGZvdW5kIGluICcgKyBpbnB1dF9wYXRoKQoKICAgIGZvciBkZWJfcGF0aCBpbiBzb3J0ZWQoZGVic19pbl9wYXRoKToKICAgICAgICBjb21wID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVscGF0aChkZWJfcGF0aCwgaW5wdXRfcGF0aCkpCiAgICAgICAgaWYgbm90IGNvbXA6CiAgICAgICAgICAgIGNvbXAgPSBjb21wb25lbnQKICAgICAgICBpZiBjb21wIG5vdCBpbiBDT01QT05FTlRTOgogICAgICAgICAgICBDT01QT05FTlRTLmFwcGVuZChjb21wKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihkaXN0cmlidXRpb25fcGF0aCwgY29tcCkpOgogICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGNvbXApKQogICAgICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGNvbXApKQoKICAgICAgICBkZWJfdG9fYWRkX2NvbnRyb2xfZmlsZSA9IGNvbnRyb2xfZmlsZV9jb250ZW50cyhkZWJfcGF0aCkKICAgICAgICBkZWJfYXJjaCA9IHJlLnNlYXJjaCgnQXJjaGl0ZWN0dXJlOiAoLiopJywgZGViX3RvX2FkZF9jb250cm9sX2ZpbGUpLmdyb3VwKDEpCgogICAgICAgIGlmIGRlYl9hcmNoIG5vdCBpbiBTVVBQT1JURURfQVJDSEVTOgogICAgICAgICAgICBzeXMuZXhpdChmJ1Vuc3VwcG9ydGVkIGFyY2ggIntkZWJfYXJjaH0iIGluIHtvcy5wYXRoLmJhc2VuYW1lKGRlYl9wYXRoKX0nKQogICAgICAgIGVuY291bnRlcmVkX2FyY2hlcy5hZGQoZGViX2FyY2gpCgogICAgICAgIGFyY2hfZGlyX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGNvbXAsICdiaW5hcnktJyArIGRlYl9hcmNoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGFyY2hfZGlyX3BhdGgpOgogICAgICAgICAgICBvcy5tYWtlZGlycyhhcmNoX2Rpcl9wYXRoKQoKICAgICAgICBwcmludChmJ0FkZGluZyBkZWIgZmlsZToge29zLnBhdGguYmFzZW5hbWUoZGViX3BhdGgpfS4uLicpCiAgICAgICAgZGVzdF9kZWJfZmlsZSA9IG9zLnBhdGguam9pbihhcmNoX2Rpcl9wYXRoLCBvcy5wYXRoLmJhc2VuYW1lKGRlYl9wYXRoKSkKICAgICAgICBzaHV0aWwuY29weTIoZGViX3BhdGgsIGRlc3RfZGViX2ZpbGUpCgogICAgICAgIHBhY2thZ2VfbmFtZSA9IGdldF9wYWNrYWdlX25hbWUob3MucGF0aC5iYXNlbmFtZShkZWJfcGF0aCkpCiAgICAgICAgY29udGVudHNfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKGRpc3RyaWJ1dGlvbl9wYXRoLCBjb21wLCAnQ29udGVudHMtJyArIGRlYl9hcmNoKQogICAgICAgIHdpdGggb3Blbihjb250ZW50c19maWxlX3BhdGgsICdhJykgYXMgY29udGVudHNfZmlsZToKICAgICAgICAgICAgZm9yIGYgaW4gbGlzdF9wYWNrYWdlX2ZpbGVzKGRlc3RfZGViX2ZpbGUpOgogICAgICAgICAgICAgICAgcHJpbnQoIiUtODBzICVzIiAlIChmLCBwYWNrYWdlX25hbWUpLCBmaWxlPWNvbnRlbnRzX2ZpbGUpCgogICAgcmVsZWFzZV9maWxlX3BhdGggPSBkaXN0cmlidXRpb25fcGF0aCArICcvUmVsZWFzZScKICAgIHdpdGggb3BlbihyZWxlYXNlX2ZpbGVfcGF0aCwgJ3cnKSBhcyByZWxlYXNlX2ZpbGU6CiAgICAgICAgcHJpbnQoIkNvZGVuYW1lOiAiICsgZGlzdHJpYnV0aW9uLCBmaWxlPXJlbGVhc2VfZmlsZSkKICAgICAgICBwcmludCgiVmVyc2lvbjogMSIsIGZpbGU9cmVsZWFzZV9maWxlKQogICAgICAgIHByaW50KCJBcmNoaXRlY3R1cmVzOiAiICsgJyAnLmpvaW4oZW5jb3VudGVyZWRfYXJjaGVzKSwgZmlsZT1yZWxlYXNlX2ZpbGUpCiAgICAgICAgcHJpbnQoIkRlc2NyaXB0aW9uOiAiICsgZGlzdHJpYnV0aW9uICsgIiByZXBvc2l0b3J5IiwgZmlsZT1yZWxlYXNlX2ZpbGUpCiAgICAgICAgcHJpbnQoIlN1aXRlOiAiICsgZGlzdHJpYnV0aW9uLCBmaWxlPXJlbGVhc2VfZmlsZSkKICAgICAgICBwcmludCgiRGF0ZTogIiArIGRhdGV0aW1lLmRhdGV0aW1lLm5vdyhkYXRldGltZS5VVEMpLnN0cmZ0aW1lKCclYSwgJWQgJWIgJVkgJUg6JU06JVMgVVRDJyksIGZpbGU9cmVsZWFzZV9maWxlKQoKICAgICAgICBmb3IgY29tcCBpbiBDT01QT05FTlRTOgogICAgICAgICAgICBmb3IgYXJjaF9kaXJfcGF0aCBpbiBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGRpc3RyaWJ1dGlvbl9wYXRoLCBjb21wLCAnYmluYXJ5LSonKSk6CiAgICAgICAgICAgICAgICBhcmNoID0gb3MucGF0aC5iYXNlbmFtZShhcmNoX2Rpcl9wYXRoKS5zcGxpdCgnLScpWzFdCiAgICAgICAgICAgICAgICBwcmludChmJ0NyZWF0aW5nIHBhY2thZ2UgZmlsZSBmb3Ige2NvbXB9IGFuZCB7YXJjaH0uLi4nKQogICAgICAgICAgICAgICAgcGFja2FnZXNfZmlsZV9wYXRoID0gYXJjaF9kaXJfcGF0aCArICcvUGFja2FnZXMnCiAgICAgICAgICAgICAgICBiaW5hcnlfcGF0aCA9ICdiaW5hcnktJyArIGFyY2gKCiAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocGFja2FnZXNfZmlsZV9wYXRoLCAndycpIGFzIHBhY2thZ2VzX2ZpbGU6CiAgICAgICAgICAgICAgICAgICAgZm9yIGRlYl90b19yZWFkX3BhdGggaW4gc29ydGVkKGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oYXJjaF9kaXJfcGF0aCwgIiouZGViIikpKToKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbnBhY2thZ2VzX291dHB1dCA9IGNvbnRyb2xfZmlsZV9jb250ZW50cyhkZWJfdG9fcmVhZF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBzY2FucGFja2FnZXNfb3V0cHV0ICs9ICdcbkZpbGVuYW1lOiAnICsgb3MucGF0aC5qb2luKCdkaXN0cycsIGRpc3RyaWJ1dGlvbiwgY29tcCwgYmluYXJ5X3BhdGgsIG9zLnBhdGguYmFzZW5hbWUoZGViX3RvX3JlYWRfcGF0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5wYWNrYWdlc19vdXRwdXQgKz0gJ1xuU2l6ZTogJyArIHN0cihvcy5zdGF0KGRlYl90b19yZWFkX3BhdGgpLnN0X3NpemUpCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgaGFzaF90eXBlIGluIEhBU0hFUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2hfdHlwZSA9PSAibWQ1IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX3N0cmluZyA9IGhhc2hfdHlwZS51cHBlcigpICsgJ1N1bScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9zdHJpbmcgPSBoYXNoX3R5cGUudXBwZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGRlYl90b19yZWFkX3BhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9vYmogPSBnZXRhdHRyKGhhc2hsaWIsIGhhc2hfdHlwZSkoZi5yZWFkKCkpLmhleGRpZ2VzdCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FucGFja2FnZXNfb3V0cHV0ICs9ICdcbicgKyBoYXNoX3N0cmluZyArICc6ICcgKyBoYXNoX29iagoKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoc2NhbnBhY2thZ2VzX291dHB1dCwgZmlsZT1wYWNrYWdlc19maWxlKQogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnJywgZmlsZT1wYWNrYWdlc19maWxlKQoKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbJ3h6IC05IC0ta2VlcCAnICsgcGFja2FnZXNfZmlsZV9wYXRoXSwgc2hlbGw9VHJ1ZSwgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUpCgogICAgICAgICAgICBmb3IgY29udGVudHNfZmlsZSBpbiBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGRpc3RyaWJ1dGlvbl9wYXRoLCBjb21wLCAnQ29udGVudHMtKicpKToKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbJ3h6IC05IC0ta2VlcCAnICsgY29udGVudHNfZmlsZV0sIHNoZWxsPVRydWUsIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQoKICAgICAgICBDT01QT05FTlRTID0gW2QgZm9yIGQgaW4gb3MubGlzdGRpcihkaXN0cmlidXRpb25fcGF0aCkgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGQpKV0KCiAgICAgICAgZm9yIGhhc2hfdHlwZSBpbiBIQVNIRVM6CiAgICAgICAgICAgIGlmIGhhc2hfdHlwZSA9PSAnbWQ1JzoKICAgICAgICAgICAgICAgIGhhc2hfc3RyaW5nID0gaGFzaF90eXBlLnVwcGVyKCkgKyAnU3VtJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaGFzaF9zdHJpbmcgPSBoYXNoX3R5cGUudXBwZXIoKQogICAgICAgICAgICBwcmludChoYXNoX3N0cmluZyArICc6JywgZmlsZT1yZWxlYXNlX2ZpbGUpCgogICAgICAgICAgICBmb3IgY29tcCBpbiBDT01QT05FTlRTOgogICAgICAgICAgICAgICAgZm9yIGFyY2hfZGlyX3BhdGggaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihkaXN0cmlidXRpb25fcGF0aCwgY29tcCwgJ2JpbmFyeS0qJykpOgogICAgICAgICAgICAgICAgICAgIGZvciBmIGluIFsnUGFja2FnZXMnLCAnUGFja2FnZXMueHonXToKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKGFyY2hfZGlyX3BhdGgsIGYpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAncmInKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2hhc2ggPSBnZXRhdHRyKGhhc2hsaWIsIGhhc2hfdHlwZSkoZnAucmVhZCgpKS5oZXhkaWdlc3QoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gc3RyKG9zLnN0YXQoZmlsZV9wYXRoKS5zdF9zaXplKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3BhdGggPSBvcy5wYXRoLmpvaW4oY29tcCwgb3MucGF0aC5iYXNlbmFtZShhcmNoX2Rpcl9wYXRoKSwgZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCcgJyArICcgJy5qb2luKFtmaWxlX2hhc2gsIGZpbGVfc2l6ZSwgcmVsX3BhdGhdKSwgZmlsZT1yZWxlYXNlX2ZpbGUpCgogICAgICAgICAgICAgICAgZm9yIGNvbnRlbnRzX2ZpbGUgaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihkaXN0cmlidXRpb25fcGF0aCwgY29tcCwgJ0NvbnRlbnRzLSonKSk6CiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoY29udGVudHNfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3Blbihjb250ZW50c19maWxlLCAncmInKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaGFzaCA9IGdldGF0dHIoaGFzaGxpYiwgaGFzaF90eXBlKShmcC5yZWFkKCkpLmhleGRpZ2VzdCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc2l6ZSA9IHN0cihvcy5zdGF0KGNvbnRlbnRzX2ZpbGUpLnN0X3NpemUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9wYXRoID0gb3MucGF0aC5yZWxwYXRoKGNvbnRlbnRzX2ZpbGUsIGRpc3RyaWJ1dGlvbl9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnICcgKyAnICcuam9pbihbZmlsZV9oYXNoLCBmaWxlX3NpemUsIHJlbF9wYXRoXSksIGZpbGU9cmVsZWFzZV9maWxlKQoKICAgICAgICAgICAgICAgICAgICB4el9maWxlID0gY29udGVudHNfZmlsZSArICcueHonCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoeHpfZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3Blbih4el9maWxlLCAncmInKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaGFzaCA9IGdldGF0dHIoaGFzaGxpYiwgaGFzaF90eXBlKShmcC5yZWFkKCkpLmhleGRpZ2VzdCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc2l6ZSA9IHN0cihvcy5zdGF0KHh6X2ZpbGUpLnN0X3NpemUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9wYXRoID0gb3MucGF0aC5yZWxwYXRoKHh6X2ZpbGUsIGRpc3RyaWJ1dGlvbl9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnICcgKyAnICcuam9pbihbZmlsZV9oYXNoLCBmaWxlX3NpemUsIHJlbF9wYXRoXSksIGZpbGU9cmVsZWFzZV9maWxlKQoKICAgIHByaW50KCdcblsrXSBSZXBvc2l0b3J5IGJ1aWx0IHN1Y2Nlc3NmdWxseSEnKQogICAgcHJpbnQoZidbK10gTG9jYXRpb246IHtvdXRwdXRfcGF0aH0nKQogICAgcHJpbnQoJ1xuQ29udGFpbmluZzonKQogICAgZm9yIGNvbXAgaW4gQ09NUE9ORU5UUzoKICAgICAgICBwcmludChmJyAge2Rpc3RyaWJ1dGlvbn0ge2NvbXB9JykKCiAgICBpZiBzaWduOgogICAgICAgIHByaW50KCdcblNpZ25pbmcgd2l0aCBncGcuLi4nKQogICAgICAgIHRyeToKICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFsKICAgICAgICAgICAgICAgICdncGcnLCAnLS1jbGVhcnNpZ24nLCAnLW8nLAogICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX3BhdGggKyAnL0luUmVsZWFzZScsCiAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25fcGF0aCArICcvUmVsZWFzZScKICAgICAgICAgICAgXSkKICAgICAgICAgICAgcHJpbnQoJyAgW09LXSBJblJlbGVhc2UgY3JlYXRlZCcpCgogICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoWwogICAgICAgICAgICAgICAgJ2dwZycsICctYWJzJywgJy1vJywKICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbl9wYXRoICsgJy9SZWxlYXNlLmdwZycsCiAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25fcGF0aCArICcvUmVsZWFzZScKICAgICAgICAgICAgXSkKICAgICAgICAgICAgcHJpbnQoJyAgW09LXSBSZWxlYXNlLmdwZyBjcmVhdGVkJykKICAgICAgICAgICAgcHJpbnQoJ1srXSBSZXBvc2l0b3J5IHNpZ25lZCBzdWNjZXNzZnVsbHkhJykKICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZToKICAgICAgICAgICAgcHJpbnQoZidbLV0gR1BHIHNpZ25pbmcgZmFpbGVkOiB7ZX0nKQogICAgICAgICAgICBwcmludCgnICAgIE1ha2Ugc3VyZSB5b3UgaGF2ZSBhIEdQRyBrZXkgY29uZmlndXJlZCcpCgogICAgcm9vdF9yZXBvID0gb3MuZ2V0Y3dkKCkKICAgIGlmIG91dHB1dF9wYXRoIGFuZCBub3Qgb3MucGF0aC5pc2FicyhvdXRwdXRfcGF0aCk6CiAgICAgICAgb3V0cHV0X3BhdGhfYWJzID0gb3MucGF0aC5qb2luKHJvb3RfcmVwbywgb3V0cHV0X3BhdGgpCiAgICBlbHNlOgogICAgICAgIG91dHB1dF9wYXRoX2FicyA9IG91dHB1dF9wYXRoCgogICAgdHJ5OgogICAgICAgIGdlbmVyYXRlX2luZGV4X2h0bWwocm9vdF9yZXBvLCBvcy5wYXRoLmJhc2VuYW1lKHJvb3RfcmVwbyksIHJvb3RfZGlyPXJvb3RfcmVwbykKICAgICAgICBwcmludCgiICBbT0tdIGluZGV4Lmh0bWwgY3JlYXRlZCBpbiByb290IGRpcmVjdG9yeSIpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiIgIFshXSBXYXJuaW5nOiBmYWlsZWQgdG8gZ2VuZXJhdGUgcm9vdCBpbmRleC5odG1sOiB7ZX0iKQoKICAgIGlmIG91dHB1dF9wYXRoX2FicyBhbmQgbm90IG9zLnBhdGguZXhpc3RzKG91dHB1dF9wYXRoX2Ficyk6CiAgICAgICAgb3MubWFrZWRpcnMob3V0cHV0X3BhdGhfYWJzLCBleGlzdF9vaz1UcnVlKQogICAgICAgIHByaW50KGYiICBbKl0gQ3JlYXRlZCBvdXRwdXQgZGlyZWN0b3J5OiB7b3V0cHV0X3BhdGhfYWJzfSIpCgogICAgaWYgb3V0cHV0X3BhdGhfYWJzIGFuZCBvcy5wYXRoLmlzZGlyKG91dHB1dF9wYXRoX2Ficyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBnZW5lcmF0ZV9pbmRleF9odG1sKG91dHB1dF9wYXRoX2Ficywgb3MucGF0aC5iYXNlbmFtZShvdXRwdXRfcGF0aF9hYnMpLCByb290X2Rpcj1yb290X3JlcG8pCiAgICAgICAgICAgIHByaW50KGYiICBbT0tdIGluZGV4Lmh0bWwgY3JlYXRlZCBpbiB7b3V0cHV0X3BhdGhfYWJzfSIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludChmIiAgWyFdIEVycm9yIGNyZWF0aW5nIGluZGV4IGluIHtvdXRwdXRfcGF0aF9hYnN9OiB7ZX0iKQoKICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhvdXRwdXRfcGF0aF9hYnMpOgogICAgICAgICAgICBpZiByb290ID09IG91dHB1dF9wYXRoX2FiczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUocm9vdCkgPT0gJ3N0eWxlJzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJlbF90aXRsZSA9IG9zLnBhdGgucmVscGF0aChyb290LCByb290X3JlcG8pCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGdlbmVyYXRlX2luZGV4X2h0bWwocm9vdCwgcmVsX3RpdGxlLCByb290X2Rpcj1yb290X3JlcG8pCiAgICAgICAgICAgICAgICBwcmludChmIiAgW09LXSBpbmRleC5odG1sIGNyZWF0ZWQgaW4ge3Jvb3R9IikKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgcHJpbnQoZiIgIFshXSBFcnJvciBjcmVhdGluZyBpbmRleCBpbiB7cm9vdH06IHtlfSIpCgpkZWYgcHVzaF9yZXBvc2l0b3J5KCk6CiAgICAiIiJQdXNoIHJlcG9zaXRvcnkga2UgZ2l0aHViIiIiCiAgICBwcmludCgiXG5bK10gUHVzaGluZyByZXBvc2l0b3J5IHRvIEdpdEh1YiIpCgogICAgc3VicHJvY2Vzcy5ydW4oWydnaXQnLCAnYWRkJywgJy4nXSkKICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKFsnZ2l0JywgJ2NvbW1pdCcsICctbScsIGYiVXBkYXRlIGJ5IHtvcy5lbnZpcm9uLmdldCgnVVNFUicsICd1c2VyJyl9Il0sIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSkKCiAgICBpZiByZXN1bHQucmV0dXJuY29kZSAhPSAwIGFuZCAibm90aGluZyB0byBjb21taXQiIG5vdCBpbiByZXN1bHQuc3RkZXJyOgogICAgICAgIHByaW50KHJlc3VsdC5zdGRlcnIpCgogICAgYnJhbmNoX3Jlc3VsdCA9IHN1YnByb2Nlc3MucnVuKFsnZ2l0JywgJ2JyYW5jaCcsICctLXNob3ctY3VycmVudCddLCBjYXB0dXJlX291dHB1dD1UcnVlLCB0ZXh0PVRydWUpCiAgICBicmFuY2ggPSBicmFuY2hfcmVzdWx0LnN0ZG91dC5zdHJpcCgpCgogICAgaWYgYnJhbmNoOgogICAgICAgIHN1YnByb2Nlc3MucnVuKFsnZ2l0JywgJ3B1c2gnLCAnLXUnLCAnb3JpZ2luJywgYnJhbmNoXSkKICAgICAgICBwcmludCgiWytdIFJlcG9zaXRvcnkgcHVzaGVkIHN1Y2Nlc3NmdWxseSIpCiAgICBlbHNlOgogICAgICAgIHByaW50KCJbLV0gRmFpbGVkIHRvIGRldGVybWluZSBnaXQgYnJhbmNoIikKCmRlZiBlZGl0X2RlYihkZWJfZmlsZSk6CiAgICAiIiJFZGl0IGRlYiBwYWNrYWdlIiIiCiAgICBwcmludChmIlxuWytdIEVkaXRpbmcgZGViOiB7ZGViX2ZpbGV9IikKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGViX2ZpbGUpOgogICAgICAgIHByaW50KGYiRmlsZSBub3QgZm91bmQ6IHtkZWJfZmlsZX0iKQogICAgICAgIHJldHVybgoKICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShkZWJfZmlsZSkKICAgIHBhcnRzID0gYmFzZW5hbWUucmVwbGFjZSgnLmRlYicsICcnKS5zcGxpdCgnXycpCgogICAgaWYgbGVuKHBhcnRzKSA+PSAzOgogICAgICAgIGRlYm5hbWUgPSBwYXJ0c1swXQogICAgICAgIHZlcnNpb24gPSBwYXJ0c1sxXQogICAgICAgIGFyY2hpdGMgPSBwYXJ0c1syXQogICAgICAgIHBhY2thZ2VuYW1lID0gZiJ7ZGVibmFtZX1fe3ZlcnNpb259X3thcmNoaXRjfSIKICAgIGVsc2U6CiAgICAgICAgcGFja2FnZW5hbWUgPSBiYXNlbmFtZS5yZXBsYWNlKCcuZGViJywgJycpCgogICAgZXh0cmFjdF9kaXIgPSBwYWNrYWdlbmFtZQogICAgY3JlYXRlX2RpcmVjdG9yeShleHRyYWN0X2RpcikKCiAgICBvcy5jaGRpcihleHRyYWN0X2RpcikKCiAgICBzdWJwcm9jZXNzLnJ1bihbJ2FyJywgJ3gnLCBmIi4uL3tkZWJfZmlsZX0iXSwgY2hlY2s9RmFsc2UpCgogICAgY3JlYXRlX2RpcmVjdG9yeSgiREVCSUFOIikKCiAgICBpZiBvcy5wYXRoLmV4aXN0cygiY29udHJvbC50YXIueHoiKToKICAgICAgICBzdWJwcm9jZXNzLnJ1bihbJ3RhcicsICd4SnZmJywgJ2NvbnRyb2wudGFyLnh6JywgJy1DJywgJ0RFQklBTiddLCBjaGVjaz1GYWxzZSkKICAgIGVsaWYgb3MucGF0aC5leGlzdHMoImNvbnRyb2wudGFyLmd6Iik6CiAgICAgICAgc3VicHJvY2Vzcy5ydW4oWyd0YXInLCAneHp2ZicsICdjb250cm9sLnRhci5neicsICctQycsICdERUJJQU4nXSwgY2hlY2s9RmFsc2UpCgogICAgaWYgb3MucGF0aC5leGlzdHMoImRhdGEudGFyLnh6Iik6CiAgICAgICAgc3VicHJvY2Vzcy5ydW4oWyd0YXInLCAneEp2ZicsICdkYXRhLnRhci54eiddLCBjaGVjaz1GYWxzZSkKICAgIGVsaWYgb3MucGF0aC5leGlzdHMoImRhdGEudGFyLmd6Iik6CiAgICAgICAgc3VicHJvY2Vzcy5ydW4oWyd0YXInLCAneHp2ZicsICdkYXRhLnRhci5neiddLCBjaGVjaz1GYWxzZSkKCiAgICBmb3IgZiBpbiBbJ2RhdGEudGFyLnh6JywgJ2RhdGEudGFyLmd6JywgJ2NvbnRyb2wudGFyLnh6JywgJ2NvbnRyb2wudGFyLmd6JywgJ2RlYmlhbi1iaW5hcnknLCBmIi4uL3tkZWJfZmlsZX0iXToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmKToKICAgICAgICAgICAgb3MucmVtb3ZlKGYpCgogICAgcHJpbnQoZiJbK10gRGViIGV4dHJhY3RlZCB0bzoge29zLnBhdGguYWJzcGF0aChleHRyYWN0X2Rpcil9IikKICAgIHByaW50KCJbK10gWW91IGNhbiBub3cgZWRpdCB0aGUgZmlsZXMiKQogICAgcHJpbnQoIlsrXSBUbyByZWJ1aWxkOiBkcGtnLWRlYiAtLWJ1aWxkIC4iKQoKZGVmIHVwZGF0ZV9iaW5hcnlfZnJvbV9kZWIoKToKICAgICIiIlVwZGF0ZSBiaW5hcnkgaW4gZXh0cmFjdGVkIGRlYiIiIgogICAgY3VycmVudF9kaXIgPSBvcy5nZXRjd2QoKQoKICAgIGlmIG9zLnBhdGguZXhpc3RzKCJERUJJQU4iKSBhbmQgb3MucGF0aC5leGlzdHMoIkRFQklBTi9jb250cm9sIik6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoInVzci9sb2NhbC9iaW4iKToKICAgICAgICAgICAgYmluX2ZpbGVzID0gb3MubGlzdGRpcigidXNyL2xvY2FsL2JpbiIpCiAgICAgICAgICAgIGZvciBiaW5fZmlsZSBpbiBiaW5fZmlsZXM6CiAgICAgICAgICAgICAgICBzcmNfYmluID0gZiIvdXNyL2xvY2FsL2Jpbi97YmluX2ZpbGV9IgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc3JjX2Jpbik6CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkyKHNyY19iaW4sIGYidXNyL2xvY2FsL2Jpbi97YmluX2ZpbGV9IikKICAgICAgICAgICAgICAgICAgICBwcmludChmIlsrXSBVcGRhdGVkOiB7YmluX2ZpbGV9IikKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKCJkYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy91c3IvYmluIik6CiAgICAgICAgICAgIGJpbl9maWxlcyA9IG9zLmxpc3RkaXIoImRhdGEvZGF0YS9jb20udGVybXV4L2ZpbGVzL3Vzci9iaW4iKQogICAgICAgICAgICBmb3IgYmluX2ZpbGUgaW4gYmluX2ZpbGVzOgogICAgICAgICAgICAgICAgc3JjX2JpbiA9IGYiL3Vzci9sb2NhbC9iaW4ve2Jpbl9maWxlfSIKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNyY19iaW4pOgogICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5MihzcmNfYmluLCBmImRhdGEvZGF0YS9jb20udGVybXV4L2ZpbGVzL3Vzci9iaW4ve2Jpbl9maWxlfSIpCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiJbK10gVXBkYXRlZDoge2Jpbl9maWxlfSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoIk5vIGJpbmFyeSBkaXJlY3RvcnkgZm91bmQiKQogICAgZWxzZToKICAgICAgICBwcmludCgiTm90IGluIGFuIGV4dHJhY3RlZCBkZWIgZGlyZWN0b3J5LiBSdW4gJ3JlcG8tbWFuYWdlciAtLWVkaXQtZGViIGZpbGUuZGViJyBmaXJzdCIpCgojIFBvcnRlZCBmcm9tIG1lbnUKZGVmIGdlbmVyYXRlX2luZGV4X2h0bWwoZGlyZWN0b3J5LCB0aXRsZT1Ob25lLCByb290X2Rpcj1Ob25lKToKICAgIGlmIG5vdCBkaXJlY3Rvcnkgb3Igbm90IG9zLnBhdGguaXNkaXIoZGlyZWN0b3J5KToKICAgICAgICByZXR1cm4KICAgIGlmIHJvb3RfZGlyIGlzIE5vbmU6CiAgICAgICAgcm9vdF9kaXIgPSBvcy5nZXRjd2QoKQogICAgdHJ5OgogICAgICAgIHJlbCA9IG9zLnBhdGgucmVscGF0aChkaXJlY3RvcnksIHJvb3RfZGlyKQogICAgICAgIGlmIHJlbCA9PSAnLic6CiAgICAgICAgICAgIGRlcHRoID0gMAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRlcHRoID0gcmVsLmNvdW50KG9zLnNlcCkgKyAxCiAgICBleGNlcHQ6CiAgICAgICAgZGVwdGggPSAwCiAgICBzdHlsZV9wYXRoID0gJy4uLycgKiBkZXB0aCArICdzdHlsZS8nCiAgICBpbmRleF9wYXRoID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgImluZGV4Lmh0bWwiKQoKICAgIGZvbGRlcnMgPSBbXQogICAgZmlsZXMgPSBbXQoKICAgIGhpZGVuX2V4dGVuc2lvbnMgPSBbJy5tZCcsICcua2V5JywgJy5odG1sJ10KICAgIGZvciBpdGVtIGluIHNvcnRlZChvcy5saXN0ZGlyKGRpcmVjdG9yeSkpOgogICAgICAgIGlmIGl0ZW0uc3RhcnRzd2l0aCgnLicpIG9yIGl0ZW0gaW4gWyJpbmRleC5odG1sIiwgInN0eWxlIl06CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaXRlbV9sb3dlciA9IGl0ZW0ubG93ZXIoKQogICAgICAgIGlmIGFueShpdGVtX2xvd2VyLmVuZHN3aXRoKGV4dCkgZm9yIGV4dCBpbiBoaWRlbl9leHRlbnNpb25zKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpdGVtX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBpdGVtKQogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoaXRlbV9wYXRoKToKICAgICAgICAgICAgZm9sZGVycy5hcHBlbmQoaXRlbSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzaXplID0gb3MucGF0aC5nZXRzaXplKGl0ZW1fcGF0aCkKICAgICAgICAgICAgaWYgc2l6ZSA8IDEwMjQ6CiAgICAgICAgICAgICAgICBzaXplX3N0ciA9IGYie3NpemV9IEIiCiAgICAgICAgICAgIGVsaWYgc2l6ZSA8IDEwMjQgKiAxMDI0OgogICAgICAgICAgICAgICAgc2l6ZV9zdHIgPSBmIntzaXplIC8gMTAyNDouMWZ9IEtCIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2l6ZV9zdHIgPSBmIntzaXplIC8gKDEwMjQgKiAxMDI0KTouMWZ9IE1CIgogICAgICAgICAgICBtdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaXRlbV9wYXRoKQogICAgICAgICAgICBkYXRlX3N0ciA9IGRhdGV0aW1lLmRhdGV0aW1lLmZyb210aW1lc3RhbXAobXRpbWUpLnN0cmZ0aW1lKCIlZC0lYi0lWSAlSDolTSIpCiAgICAgICAgICAgIGZpbGVzLmFwcGVuZCgoaXRlbSwgc2l6ZV9zdHIsIGRhdGVfc3RyKSkKCiAgICBpZiB0aXRsZSBpcyBOb25lIG9yIHRpdGxlID09ICIiOgogICAgICAgIGRpc3BsYXlfdGl0bGUgPSBvcy5wYXRoLmJhc2VuYW1lKGRpcmVjdG9yeSkKICAgIGVsc2U6CiAgICAgICAgaWYgJy8nIGluIHRpdGxlOgogICAgICAgICAgICBkaXNwbGF5X3RpdGxlID0gdGl0bGUuc3BsaXQoJy8nKVstMV0KICAgICAgICBlbGlmIHRpdGxlLnN0YXJ0c3dpdGgoIkluZGV4IG9mICIpOgogICAgICAgICAgICBkaXNwbGF5X3RpdGxlID0gdGl0bGVbOTpdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlzcGxheV90aXRsZSA9IHRpdGxlCgogICAgaHRtbF9saW5lcyA9IFtdCiAgICBodG1sX2xpbmVzLmFwcGVuZCgnPCFET0NUWVBFIGh0bWw+JykKICAgIGh0bWxfbGluZXMuYXBwZW5kKCc8aHRtbCBsYW5nPSJlbiI+JykKICAgIGh0bWxfbGluZXMuYXBwZW5kKCc8aGVhZD4nKQogICAgaHRtbF9saW5lcy5hcHBlbmQoJyAgPHRpdGxlPnVzZXI5MS1yZXBvPC90aXRsZT4nKQogICAgaHRtbF9saW5lcy5hcHBlbmQoJyAgPG1ldGEgY2hhcnNldD0idXRmLTgiPicpCiAgICBodG1sX2xpbmVzLmFwcGVuZCgnICA8bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9ImFsbCI+JykKICAgIGh0bWxfbGluZXMuYXBwZW5kKCcgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4nKQogICAgaHRtbF9saW5lcy5hcHBlbmQoZicgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ie3N0eWxlX3BhdGh9bm9ybWFsaXplLm1pbi5jc3MiPicpCiAgICBodG1sX2xpbmVzLmFwcGVuZChmJyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7c3R5bGVfcGF0aH1zdHlsZS5taW4uY3NzIj4nKQogICAgaHRtbF9saW5lcy5hcHBlbmQoZicgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ie3N0eWxlX3BhdGh9aWNvbnMubWluLmNzcyI+JykKICAgIGh0bWxfbGluZXMuYXBwZW5kKGYnICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9IntzdHlsZV9wYXRofWljb25zL2Zhdmljb24uc3ZnIiB0eXBlPSJpbWFnZS9zdmcreG1sIiAvPicpCiAgICBodG1sX2xpbmVzLmFwcGVuZCgnPC9oZWFkPicpCiAgICBodG1sX2xpbmVzLmFwcGVuZCgnPGJvZHk+JykKICAgIGh0bWxfbGluZXMuYXBwZW5kKCcgIDxkaXYgaWQ9InBhZ2UiPicpCiAgICBodG1sX2xpbmVzLmFwcGVuZCgnICAgIDxkaXYgY2xhc3M9ImluZm8iPicpCiAgICBodG1sX2xpbmVzLmFwcGVuZChmJyAgICAgIDxpbWcgY2xhc3M9Im55Y3Vjc2l0TG9nbyIgc3JjPSJ7c3R5bGVfcGF0aH1pY29ucy9ueWN1Y3NpdC5zdmciIGFsdD0iIj4nKQogICAgaHRtbF9saW5lcy5hcHBlbmQoJyAgICAgIDxoMiBpZD0ibWlycm9yTmFtZSI+V2VsY29tZSB0byB1c2VyOTEtcmVwbyBzaXRlPC9oMj4nKQogICAgaHRtbF9saW5lcy5hcHBlbmQoJyAgICA8L2Rpdj4nKQogICAgcGFyZW50X3JlbCA9IG9zLnBhdGgucmVscGF0aChvcy5wYXRoLmRpcm5hbWUoZGlyZWN0b3J5KSwgZGlyZWN0b3J5KQogICAgaWYgcGFyZW50X3JlbCA9PSAnLic6CiAgICAgICAgcGFyZW50X3JlbCA9ICcuLicKICAgIGh0bWxfbGluZXMuYXBwZW5kKGYnICAgIDxoMT5JbmRleCBvZiB7ZGlzcGxheV90aXRsZX08L2gxPjxocj48cHJlPicpCiAgICBodG1sX2xpbmVzLmFwcGVuZChmJyAgICA8YSBocmVmPSJ7cGFyZW50X3JlbH0vIj4uLi88L2E+JykKICAgIGZvciBmb2xkZXIgaW4gZm9sZGVyczoKICAgICAgICBuYW1lID0gZm9sZGVyICsgJy8nCiAgICAgICAgcGFkZGluZyA9IDUwIC0gbGVuKG5hbWUpCiAgICAgICAgaWYgcGFkZGluZyA8IDA6CiAgICAgICAgICAgIHBhZGRpbmcgPSAwCiAgICAgICAgaHRtbF9saW5lcy5hcHBlbmQoZicgICAgPGEgaHJlZj0ie25hbWV9Ij57bmFtZX08L2E+eyIgIiAqIHBhZGRpbmd9IC0gICAnKQogICAgZm9yIG5hbWUsIHNpemVfc3RyLCBkYXRlX3N0ciBpbiBmaWxlczoKICAgICAgICBkaXNwbGF5X25hbWUgPSBuYW1lIGlmIGxlbihuYW1lKSA8PSA1MCBlbHNlIG5hbWVbOjQ3XSArICcuLi4nCiAgICAgICAgcGFkZGluZyA9IDUwIC0gbGVuKGRpc3BsYXlfbmFtZSkKICAgICAgICBpZiBwYWRkaW5nIDwgMDoKICAgICAgICAgICAgcGFkZGluZyA9IDAKICAgICAgICBodG1sX2xpbmVzLmFwcGVuZChmJyAgICA8YSBocmVmPSJ7bmFtZX0iPntkaXNwbGF5X25hbWV9PC9hPnsiICIgKiBwYWRkaW5nfXtkYXRlX3N0cn0gIHtzaXplX3N0cjo+OH0nKQogICAgaHRtbF9saW5lcy5hcHBlbmQoJyAgICA8L3ByZT48aHI+JykKICAgIGh0bWxfbGluZXMuYXBwZW5kKCcgICAgPGZvb3Rlcj4nKQogICAgaHRtbF9saW5lcy5hcHBlbmQoJyAgICAgIDxwPicpCiAgICBodG1sX2xpbmVzLmFwcGVuZCgnICAgICAgICBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zLCBwbGVhc2UgY29udGFjdCBhZG1pbmlzdHJhdG9yIHZpYScpCiAgICBodG1sX2xpbmVzLmFwcGVuZCgnICAgICAgICA8c3BhbiBjbGFzcz0iZW1haWwiPnN5YWhyaS5yYW1hZGhhbjIwMjJAZ21haWwuY29tPC9zcGFuPicpCiAgICBodG1sX2xpbmVzLmFwcGVuZCgnICAgICAgICAsIHRoYW5rIHlvdSB2ZXJ5IG11Y2ggOiknKQogICAgaHRtbF9saW5lcy5hcHBlbmQoJyAgICAgIDwvcD4nKQogICAgaHRtbF9saW5lcy5hcHBlbmQoJyAgICA8L2Zvb3Rlcj4nKQogICAgaHRtbF9saW5lcy5hcHBlbmQoJyAgPC9kaXY+JykKICAgIGh0bWxfbGluZXMuYXBwZW5kKCc8L2JvZHk+JykKICAgIGh0bWxfbGluZXMuYXBwZW5kKCc8L2h0bWw+JykKCiAgICB0cnk6CiAgICAgICAgd2l0aCBvcGVuKGluZGV4X3BhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4oaHRtbF9saW5lcykpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiIgIFshXSBFcnJvciB3cml0aW5nIHtpbmRleF9wYXRofToge2V9IikKCmRlZiBidWlsZF9zb3VyY2VfY29yZShvc190eXBlLCBwa2duYW1lLCB2ZXJzaW9uLCBhcmNoLCBkZXBlbmRzLCBkZXNjcmlwdGlvbiwgdXNlcm5hbWUsIGVtYWlsLCBob21lcGFnZSk6CiAgICAiIiJDb3JlIGZ1bmN0aW9uIHVudHVrIGJ1aWxkIHNvdXJjZSBwYWNrYWdlIiIiCiAgICBwYWNrYWdlX2RpciA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsIG9zX3R5cGUsIGYie3BrZ25hbWV9X3t2ZXJzaW9ufV97YXJjaH0iKQogICAgZGViaWFuX2RpciA9IG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwgIkRFQklBTiIpCiAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYWNrYWdlX2Rpcik6CiAgICAgICAgcmV0dXJuIEZhbHNlLCBmIkRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czoge3BhY2thZ2VfZGlyfSIKICAgIG9zLm1ha2VkaXJzKGRlYmlhbl9kaXIpCiAgICBpZiBvc190eXBlID09ICJ0ZXJtdXgiOgogICAgICAgIGJpbl9kaXIgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICJkYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy91c3IvYmluIikKICAgICAgICBzaGViYW5nID0gIiMhL2RhdGEvZGF0YS9jb20udGVybXV4L2ZpbGVzL3Vzci9iaW4vYmFzaCIKICAgIGVsc2U6CiAgICAgICAgYmluX2RpciA9IG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwgInVzci9sb2NhbC9iaW4iKQogICAgICAgIHNoZWJhbmcgPSAiIyEvYmluL2Jhc2giCiAgICBvcy5tYWtlZGlycyhiaW5fZGlyLCBleGlzdF9vaz1UcnVlKQogICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihkZWJpYW5fZGlyLCAicG9zdGluc3QiKSwgJ3cnKSBhcyBmOgogICAgICAgIGYud3JpdGUoc2hlYmFuZyArICJcbiIpCiAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRlYmlhbl9kaXIsICJwcmVybSIpLCAndycpIGFzIGY6CiAgICAgICAgZi53cml0ZShzaGViYW5nICsgIlxuIikKICAgIGNvbnRyb2xfY29udGVudCA9IGYiIiJQYWNrYWdlOiB7cGtnbmFtZX0KVmVyc2lvbjoge3ZlcnNpb259CkFyY2hpdGVjdHVyZToge2FyY2h9Ck1haW50YWluZXI6IHt1c2VybmFtZX0gPHtlbWFpbH0+CkRlcGVuZHM6IHtkZXBlbmRzfQpJbnN0YWxsZWQtU2l6ZTogMTAyNApIb21lcGFnZToge2hvbWVwYWdlfQpEZXNjcmlwdGlvbjoge2Rlc2NyaXB0aW9ufSIiIgogICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihkZWJpYW5fZGlyLCAiY29udHJvbCIpLCAndycpIGFzIGY6CiAgICAgICAgZi53cml0ZShjb250cm9sX2NvbnRlbnQpCiAgICBzdWJwcm9jZXNzLnJ1bihbJ2NobW9kJywgJzc1NScsIGRlYmlhbl9kaXIsICctUiddKQogICAgcmV0dXJuIFRydWUsIHBhY2thZ2VfZGlyCgpkZWYgYnVpbGRfZGViX2NvcmUob3NfdHlwZSwgcGFja2FnZV9uYW1lLCBjb21wb25lbnQpOgogICAgIiIiQ29yZSBmdW5jdGlvbiB1bnR1ayBidWlsZCBkZWIgcGFja2FnZSIiIgogICAgc291cmNlX2RpciA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsIG9zX3R5cGUpCiAgICBwYWNrYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgcGFja2FnZV9uYW1lKQogICAgZGViaWFuX2RpciA9IG9zLnBhdGguam9pbihwYWNrYWdlX3BhdGgsICJERUJJQU4iKQogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRlYmlhbl9kaXIpOgogICAgICAgIHJldHVybiBGYWxzZSwgIkludmFsaWQgc291cmNlIHBhY2thZ2U6IERFQklBTiBkaXJlY3Rvcnkgbm90IGZvdW5kIgogICAgaWYgb3NfdHlwZSA9PSAidGVybXV4IjoKICAgICAgICBkZWJmb2xkID0gVEVSTVVYX0RFQl9QQVRICiAgICBlbHNlOgogICAgICAgIGRlYmZvbGQgPSBERUJJQU5fREVCX1BBVEgKICAgIGNvbXBvbmVudF9kaXIgPSBvcy5wYXRoLmpvaW4oZGViZm9sZCwgY29tcG9uZW50KQogICAgY3JlYXRlX2RpcmVjdG9yeShjb21wb25lbnRfZGlyKQogICAgc3VicHJvY2Vzcy5ydW4oWydjaG1vZCcsICc3NTUnLCBkZWJpYW5fZGlyLCAnLVInXSkKICAgIHN1YnByb2Nlc3MucnVuKFsnZHBrZy1kZWInLCAnLS1idWlsZCcsICctWnh6JywgcGFja2FnZV9wYXRoXSwKICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5ERVZOVUxMLCBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMKQogICAgZGViX2ZpbGUgPSBwYWNrYWdlX3BhdGggKyAiLmRlYiIKICAgIGlmIG9zLnBhdGguZXhpc3RzKGRlYl9maWxlKToKICAgICAgICBkZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oY29tcG9uZW50X2Rpciwgb3MucGF0aC5iYXNlbmFtZShkZWJfZmlsZSkpCiAgICAgICAgc2h1dGlsLm1vdmUoZGViX2ZpbGUsIGRlc3RfZmlsZSkKICAgICAgICByZXR1cm4gVHJ1ZSwgZGVzdF9maWxlCiAgICBlbHNlOgogICAgICAgIHJldHVybiBGYWxzZSwgIkZhaWxlZCB0byBidWlsZCBkZWIiCgpkZWYgdXBkYXRlX3NvdXJjZV9jb3JlKG9zX3R5cGUsIHNlbGVjdGVkLCBuZXdfdmVyc2lvbiwgYWN0aW9uKToKICAgICIiIkNvcmUgZnVuY3Rpb24gdW50dWsgdXBkYXRlIHNvdXJjZSBwYWNrYWdlIiIiCiAgICBzb3VyY2VfZGlyID0gb3MucGF0aC5qb2luKFBST0pFQ1RfUEFUSCwgb3NfdHlwZSkKICAgIHBhY2thZ2VfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBzZWxlY3RlZCkKICAgIGNvbnRyb2xfcGF0aCA9IG9zLnBhdGguam9pbihwYWNrYWdlX3BhdGgsICJERUJJQU4iLCAiY29udHJvbCIpCiAgICB3aXRoIG9wZW4oY29udHJvbF9wYXRoLCAncicpIGFzIGY6CiAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICBwa2dfbmFtZSA9IHJlLnNlYXJjaChyJ1BhY2thZ2U6ICguKiknLCBjb250ZW50KS5ncm91cCgxKQogICAgcGtnX2FyY2ggPSByZS5zZWFyY2gocidBcmNoaXRlY3R1cmU6ICguKiknLCBjb250ZW50KS5ncm91cCgxKQogICAgbmV3X2Rpcl9uYW1lID0gZiJ7cGtnX25hbWV9X3tuZXdfdmVyc2lvbn1fe3BrZ19hcmNofSIKICAgIG5ld19wYWNrYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgbmV3X2Rpcl9uYW1lKQogICAgaWYgYWN0aW9uID09ICJyZW5hbWUiOgogICAgICAgIG9zLnJlbmFtZShwYWNrYWdlX3BhdGgsIG5ld19wYWNrYWdlX3BhdGgpCiAgICBlbHNlOgogICAgICAgIHNodXRpbC5jb3B5dHJlZShwYWNrYWdlX3BhdGgsIG5ld19wYWNrYWdlX3BhdGgpCiAgICBjb250cm9sX3BhdGhfbmV3ID0gb3MucGF0aC5qb2luKG5ld19wYWNrYWdlX3BhdGgsICJERUJJQU4iLCAiY29udHJvbCIpCiAgICB3aXRoIG9wZW4oY29udHJvbF9wYXRoX25ldywgJ3InKSBhcyBmOgogICAgICAgIG5ld19jb250ZW50ID0gZi5yZWFkKCkKICAgIG5ld19jb250ZW50ID0gcmUuc3ViKHInVmVyc2lvbjogLionLCBmJ1ZlcnNpb246IHtuZXdfdmVyc2lvbn0nLCBuZXdfY29udGVudCkKICAgIHdpdGggb3Blbihjb250cm9sX3BhdGhfbmV3LCAndycpIGFzIGY6CiAgICAgICAgZi53cml0ZShuZXdfY29udGVudCkKICAgIHJldHVybiBUcnVlLCBuZXdfcGFja2FnZV9wYXRoCgpjbGFzcyBEaWFsb2dNZW51OgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuZCA9IGRpYWxvZy5EaWFsb2coZGlhbG9nPSJkaWFsb2ciKQogICAgICAgIHNlbGYuZC5zZXRfYmFja2dyb3VuZF90aXRsZSgiUmVwb3NpdG9yeSBNYW5hZ2VyIE1lbnUgdjIuMS45LVNSIikKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgY29kZSwgdGFnID0gc2VsZi5kLm1lbnUoCiAgICAgICAgICAgICAgICAiUmVwb3NpdG9yeSBNYW5hZ2VyIC0gTWFpbiBNZW51IiwKICAgICAgICAgICAgICAgIGNob2ljZXM9WwogICAgICAgICAgICAgICAgICAgICgiMSIsICJDcmVhdGUgU291cmNlIFBhY2thZ2UiKSwKICAgICAgICAgICAgICAgICAgICAoIjIiLCAiQnVpbGQgREVCIFBhY2thZ2UiKSwKICAgICAgICAgICAgICAgICAgICAoIjMiLCAiVXBkYXRlIFNvdXJjZSBQYWNrYWdlIiksCiAgICAgICAgICAgICAgICAgICAgKCI0IiwgIkVkaXQgREVCIFBhY2thZ2UiKSwKICAgICAgICAgICAgICAgICAgICAoIjUiLCAiQ29uZmlndXJlIFJlcG9zaXRvcnkiKSwKICAgICAgICAgICAgICAgICAgICAoIjYiLCAiQnVpbGQgUmVwb3NpdG9yeSBbZ290byByZXBvIGRpcl0iKSwKICAgICAgICAgICAgICAgICAgICAoIjciLCAiUHVzaCBSZXBvc2l0b3J5ICBbZ290byByZXBvIGRpcl0iKSwKICAgICAgICAgICAgICAgICAgICAoIjgiLCAiQWJvdXQiKSwKICAgICAgICAgICAgICAgICAgICAoIjAiLCAiRXhpdCIpCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgd2lkdGg9NjAsCiAgICAgICAgICAgICAgICBoZWlnaHQ9MTYsCiAgICAgICAgICAgICAgICB0aXRsZT0iTWFpbiBNZW51IgogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGNvZGUgIT0gc2VsZi5kLk9LIG9yIHRhZyA9PSAiMCI6CiAgICAgICAgICAgICAgICBzZWxmLmQuaW5mb2JveCgiR29vZGJ5ZSEiLCB0aXRsZT0iRXhpdCIsIHdpZHRoPTMwLCBoZWlnaHQ9NSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIHRhZyA9PSAiMSI6CiAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3NvdXJjZV9kaWFsb2coKQogICAgICAgICAgICBlbGlmIHRhZyA9PSAiMiI6CiAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX2RlYl9kaWFsb2coKQogICAgICAgICAgICBlbGlmIHRhZyA9PSAiMyI6CiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9zb3VyY2VfZGlhbG9nKCkKICAgICAgICAgICAgZWxpZiB0YWcgPT0gIjQiOgogICAgICAgICAgICAgICAgc2VsZi5lZGl0X2RlYl9kaWFsb2coKQogICAgICAgICAgICBlbGlmIHRhZyA9PSAiNSI6CiAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9yZXBvX2RpYWxvZygpCiAgICAgICAgICAgIGVsaWYgdGFnID09ICI2IjoKICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRfcmVwb19kaWFsb2coKQogICAgICAgICAgICBlbGlmIHRhZyA9PSAiNyI6CiAgICAgICAgICAgICAgICBzZWxmLnB1c2hfcmVwb19kaWFsb2coKQogICAgICAgICAgICBlbGlmIHRhZyA9PSAiOCI6CiAgICAgICAgICAgICAgICBzZWxmLmQubXNnYm94KCJSZXBvc2l0b3J5IE1hbmFnZXIgTWVudVxuVmVyc2lvbjogMi4xLjktU1JcbkJ5OiBBcmllLVNSOTEiLCB0aXRsZT0iQWJvdXQiLCB3aWR0aD00MCwgaGVpZ2h0PTgpCgogICAgZGVmIGJ1aWxkX3NvdXJjZV9kaWFsb2coc2VsZik6CiAgICAgICAgY29kZSwgb3NfdHlwZSA9IHNlbGYuZC5tZW51KAogICAgICAgICAgICAiU2VsZWN0IE9TIFR5cGUiLAogICAgICAgICAgICBjaG9pY2VzPVsKICAgICAgICAgICAgICAgICgidGVybXV4IiwgIlRlcm11eCAoQW5kcm9pZCkiKSwKICAgICAgICAgICAgICAgICgiZGViaWFuIiwgIkRlYmlhbiAoTGludXgpIikKICAgICAgICAgICAgXSwKICAgICAgICAgICAgd2lkdGg9NTAsCiAgICAgICAgICAgIGhlaWdodD0xMiwKICAgICAgICAgICAgdGl0bGU9Ik9TIFR5cGUiCiAgICAgICAgKQogICAgICAgIGlmIGNvZGUgIT0gc2VsZi5kLk9LOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBjb2RlLCBwa2duYW1lID0gc2VsZi5kLmlucHV0Ym94KCJQYWNrYWdlIE5hbWU6IiwgaW5pdD0ibXl0b29scyIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSyBvciBub3QgcGtnbmFtZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29kZSwgdmVyc2lvbiA9IHNlbGYuZC5pbnB1dGJveCgiVmVyc2lvbjoiLCBpbml0PSIxLjAuMCIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSyBvciBub3QgdmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgYXJjaF9jaG9pY2VzID0gWygiYWxsIiwgImFsbCIpLCAoImFybTY0IiwgImFybTY0IiksICgiYW1kNjQiLCAiYW1kNjQiKSwgKCJhcm1oZiIsICJhcm1oZiIpLCAoImkzODYiLCAiaTM4NiIpXQogICAgICAgIGNvZGUsIGFyY2ggPSBzZWxmLmQubWVudSgiQXJjaGl0ZWN0dXJlOiIsIGNob2ljZXM9YXJjaF9jaG9pY2VzLCB3aWR0aD00MCwgaGVpZ2h0PTEwKQogICAgICAgIGlmIGNvZGUgIT0gc2VsZi5kLk9LOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBjb2RlLCBkZXBlbmRzID0gc2VsZi5kLmlucHV0Ym94KCJEZXBlbmRzOiIsIGluaXQ9IiIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgZGVwZW5kcyA9ICIiCiAgICAgICAgY29kZSwgZGVzY3JpcHRpb24gPSBzZWxmLmQuaW5wdXRib3goIkRlc2NyaXB0aW9uOiIsIGluaXQ9IkEgZ3JlYXQgdG9vbCIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiQSBncmVhdCB0b29sIgogICAgICAgIGNvZGUsIHVzZXJuYW1lID0gc2VsZi5kLmlucHV0Ym94KCJNYWludGFpbmVyOiIsIGluaXQ9b3MuZW52aXJvbi5nZXQoJ1VTRVInLCAndXNlcicpLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgaWYgY29kZSAhPSBzZWxmLmQuT0s6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvZGUsIGVtYWlsID0gc2VsZi5kLmlucHV0Ym94KCJFbWFpbDoiLCBpbml0PWYie3VzZXJuYW1lfUBleGFtcGxlLmNvbSIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29kZSwgaG9tZXBhZ2UgPSBzZWxmLmQuaW5wdXRib3goIkhvbWVwYWdlOiIsIGluaXQ9Imh0dHBzOi8vZXhhbXBsZS5jb20iLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgaWYgY29kZSAhPSBzZWxmLmQuT0s6CiAgICAgICAgICAgIGhvbWVwYWdlID0gImh0dHBzOi8vZXhhbXBsZS5jb20iCiAgICAgICAgc2VsZi5kLmluZm9ib3goIkJ1aWxkaW5nIHNvdXJjZSBwYWNrYWdlLi4uIiwgdGl0bGU9IlByb2Nlc3NpbmciLCB3aWR0aD00MCwgaGVpZ2h0PTUpCiAgICAgICAgc3VjY2VzcywgcmVzdWx0ID0gYnVpbGRfc291cmNlX2NvcmUob3NfdHlwZSwgcGtnbmFtZSwgdmVyc2lvbiwgYXJjaCwgZGVwZW5kcywgZGVzY3JpcHRpb24sIHVzZXJuYW1lLCBlbWFpbCwgaG9tZXBhZ2UpCiAgICAgICAgaWYgc3VjY2VzczoKICAgICAgICAgICAgc2VsZi5kLm1zZ2JveChmIlNvdXJjZSBwYWNrYWdlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IVxuTG9jYXRpb246IHtyZXN1bHR9IiwgdGl0bGU9IlN1Y2Nlc3MiLCB3aWR0aD02MCwgaGVpZ2h0PTEwKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZC5tc2dib3goZiJFcnJvcjoge3Jlc3VsdH0iLCB0aXRsZT0iRXJyb3IiLCB3aWR0aD02MCwgaGVpZ2h0PTEwKQoKICAgIGRlZiBidWlsZF9kZWJfZGlhbG9nKHNlbGYpOgogICAgICAgIGNvZGUsIG9zX3R5cGUgPSBzZWxmLmQubWVudSgKICAgICAgICAgICAgIlNlbGVjdCBPUyBUeXBlIiwKICAgICAgICAgICAgY2hvaWNlcz1bCiAgICAgICAgICAgICAgICAoInRlcm11eCIsICJUZXJtdXggKEFuZHJvaWQpIiksCiAgICAgICAgICAgICAgICAoImRlYmlhbiIsICJEZWJpYW4gKExpbnV4KSIpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHdpZHRoPTUwLAogICAgICAgICAgICBoZWlnaHQ9MTAsIHRpdGxlPSJPUyBUeXBlIgogICAgICAgICkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc291cmNlX2RpciA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsIG9zX3R5cGUpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNvdXJjZV9kaXIpOgogICAgICAgICAgICBzZWxmLmQubXNnYm94KGYiU291cmNlIGRpcmVjdG9yeSBub3QgZm91bmQ6IHtzb3VyY2VfZGlyfSIsIHRpdGxlPSJFcnJvciIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcGFja2FnZXMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHNvdXJjZV9kaXIpIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIGQpKV0KICAgICAgICBwYWNrYWdlcy5zb3J0KCkKICAgICAgICBpZiBub3QgcGFja2FnZXM6CiAgICAgICAgICAgIHNlbGYuZC5tc2dib3goIk5vIHNvdXJjZSBwYWNrYWdlcyBmb3VuZC4iLCB0aXRsZT0iRXJyb3IiLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHBrZ19jaG9pY2VzID0gWyhwa2csIHBrZywgRmFsc2UpIGZvciBwa2cgaW4gcGFja2FnZXNdCiAgICAgICAgY29kZSwgc2VsZWN0ZWRfcGtncyA9IHNlbGYuZC5jaGVja2xpc3QoCiAgICAgICAgICAgICJTZWxlY3QgUGFja2FnZShzKSB0byBCdWlsZCAoU3BhY2UgdG8gc2VsZWN0LCBFbnRlciB0byBjb25maXJtKToiLAogICAgICAgICAgICBjaG9pY2VzPXBrZ19jaG9pY2VzLAogICAgICAgICAgICB3aWR0aD03MCwKICAgICAgICAgICAgaGVpZ2h0PTIwLAogICAgICAgICAgICB0aXRsZT0iUGFja2FnZSBMaXN0IgogICAgICAgICkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSyBvciBub3Qgc2VsZWN0ZWRfcGtnczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29uZmlnID0gbG9hZF9yZXBvX2NvbmZpZygpCiAgICAgICAgZGVmYXVsdF9jb21wID0gY29uZmlnLmdldCgnQ09NUE9ORU5UJywgJ21haW4nKQogICAgICAgIGNvZGUsIGNvbXBvbmVudCA9IHNlbGYuZC5pbnB1dGJveCgiQ29tcG9uZW50OiIsIGluaXQ9ZGVmYXVsdF9jb21wLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgaWYgY29kZSAhPSBzZWxmLmQuT0s6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRvdGFsID0gbGVuKHNlbGVjdGVkX3BrZ3MpCiAgICAgICAgc3VjY2Vzc19jb3VudCA9IDAKICAgICAgICBmb3IgaWR4LCBwa2dfbmFtZSBpbiBlbnVtZXJhdGUoc2VsZWN0ZWRfcGtncyk6CiAgICAgICAgICAgIHNlbGYuZC5pbmZvYm94KGYiQnVpbGRpbmcgREVCIHBhY2thZ2Uge2lkeCsxfS97dG90YWx9OiB7cGtnX25hbWV9Li4uIiwgdGl0bGU9IlByb2Nlc3NpbmciLCB3aWR0aD02MCwgaGVpZ2h0PTUpCiAgICAgICAgICAgIHN1Y2Nlc3MsIHJlc3VsdCA9IGJ1aWxkX2RlYl9jb3JlKG9zX3R5cGUsIHBrZ19uYW1lLCBjb21wb25lbnQpCiAgICAgICAgICAgIGlmIHN1Y2Nlc3M6CiAgICAgICAgICAgICAgICBzdWNjZXNzX2NvdW50ICs9IDEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuZC5tc2dib3goZiJGYWlsZWQgdG8gYnVpbGQge3BrZ19uYW1lfTpcbntyZXN1bHR9IiwgdGl0bGU9IkVycm9yIiwgd2lkdGg9NjAsIGhlaWdodD0xMCkKICAgICAgICBzZWxmLmQubXNnYm94KGYiQnVpbGQgY29tcGxldGVkOiB7c3VjY2Vzc19jb3VudH0ve3RvdGFsfSBwYWNrYWdlcyBidWlsdCBzdWNjZXNzZnVsbHkuIiwgdGl0bGU9IlJlc3VsdCIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKCiAgICBkZWYgdXBkYXRlX3NvdXJjZV9kaWFsb2coc2VsZik6CiAgICAgICAgY29kZSwgb3NfdHlwZSA9IHNlbGYuZC5tZW51KAogICAgICAgICAgICAiU2VsZWN0IE9TIFR5cGUiLAogICAgICAgICAgICBjaG9pY2VzPVsKICAgICAgICAgICAgICAgICgidGVybXV4IiwgIlRlcm11eCAoQW5kcm9pZCkiKSwKICAgICAgICAgICAgICAgICgiZGViaWFuIiwgIkRlYmlhbiAoTGludXgpIikKICAgICAgICAgICAgXSwKICAgICAgICAgICAgd2lkdGg9NTAsCiAgICAgICAgICAgIGhlaWdodD0xMCwKICAgICAgICAgICAgdGl0bGU9Ik9TIFR5cGUiCiAgICAgICAgKQogICAgICAgIGlmIGNvZGUgIT0gc2VsZi5kLk9LOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzb3VyY2VfZGlyID0gb3MucGF0aC5qb2luKFBST0pFQ1RfUEFUSCwgb3NfdHlwZSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlX2Rpcik6CiAgICAgICAgICAgIHNlbGYuZC5tc2dib3goZiJTb3VyY2UgZGlyZWN0b3J5IG5vdCBmb3VuZDoge3NvdXJjZV9kaXJ9IiwgdGl0bGU9IkVycm9yIiwgd2lkdGg9NTAsIGhlaWdodD04KQogICAgICAgICAgICByZXR1cm4KICAgICAgICBwYWNrYWdlcyA9IFtkIGZvciBkIGluIG9zLmxpc3RkaXIoc291cmNlX2RpcikgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgZCkpXQogICAgICAgIHBhY2thZ2VzLnNvcnQoKQogICAgICAgIGlmIG5vdCBwYWNrYWdlczoKICAgICAgICAgICAgc2VsZi5kLm1zZ2JveCgiTm8gc291cmNlIHBhY2thZ2VzIGZvdW5kLiIsIHRpdGxlPSJFcnJvciIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcGtnX2luZm8gPSBbXQogICAgICAgIGZvciBwa2cgaW4gcGFja2FnZXM6CiAgICAgICAgICAgIGNvbnRyb2xfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBwa2csICJERUJJQU4iLCAiY29udHJvbCIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbnRyb2xfcGF0aCk6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY29udHJvbF9wYXRoLCAncicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gcmUuc2VhcmNoKHInVmVyc2lvbjogKC4qKScsIGNvbnRlbnQpCiAgICAgICAgICAgICAgICB2ZXJzaW9uX3N0ciA9IHZlcnNpb24uZ3JvdXAoMSkgaWYgdmVyc2lvbiBlbHNlICJ1bmtub3duIgogICAgICAgICAgICAgICAgcGtnX2luZm8uYXBwZW5kKChwa2csIGYie3BrZ30gKHZ7dmVyc2lvbl9zdHJ9KSIpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGtnX2luZm8uYXBwZW5kKChwa2csIHBrZykpCiAgICAgICAgY29kZSwgc2VsZWN0ZWQgPSBzZWxmLmQubWVudSgiU2VsZWN0IFBhY2thZ2U6IiwgY2hvaWNlcz1wa2dfaW5mbywgd2lkdGg9NzAsIGhlaWdodD0xNSkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29udHJvbF9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIHNlbGVjdGVkLCAiREVCSUFOIiwgImNvbnRyb2wiKQogICAgICAgIHdpdGggb3Blbihjb250cm9sX3BhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgY3VycmVudF92ZXJzaW9uID0gcmUuc2VhcmNoKHInVmVyc2lvbjogKC4qKScsIGNvbnRlbnQpLmdyb3VwKDEpCiAgICAgICAgc3VnZ2VzdGVkID0gYXV0b19pbmNyZW1lbnRfdmVyc2lvbihjdXJyZW50X3ZlcnNpb24pCiAgICAgICAgY29kZSwgbmV3X3ZlcnNpb24gPSBzZWxmLmQuaW5wdXRib3goIk5ldyBWZXJzaW9uOiIsIGluaXQ9c3VnZ2VzdGVkLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgaWYgY29kZSAhPSBzZWxmLmQuT0s6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvZGUsIGFjdGlvbiA9IHNlbGYuZC5tZW51KAogICAgICAgICAgICAiVXBkYXRlIE9wdGlvbjoiLAogICAgICAgICAgICBjaG9pY2VzPVsoInJlbmFtZSIsICJSZW5hbWUgKHVwZGF0ZSBpbiBwbGFjZSkiKSwgKCJjb3B5IiwgIkNvcHkgdG8gbmV3IGZvbGRlciIpXSwKICAgICAgICAgICAgd2lkdGg9NjAsCiAgICAgICAgICAgIGhlaWdodD0xMAogICAgICAgICkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5kLmluZm9ib3goIlVwZGF0aW5nIHBhY2thZ2UuLi4iLCB0aXRsZT0iUHJvY2Vzc2luZyIsIHdpZHRoPTQwLCBoZWlnaHQ9NSkKICAgICAgICBzdWNjZXNzLCByZXN1bHQgPSB1cGRhdGVfc291cmNlX2NvcmUob3NfdHlwZSwgc2VsZWN0ZWQsIG5ld192ZXJzaW9uLCBhY3Rpb24pCiAgICAgICAgaWYgc3VjY2VzczoKICAgICAgICAgICAgc2VsZi5kLm1zZ2JveChmIlBhY2thZ2UgdXBkYXRlZCBzdWNjZXNzZnVsbHkhXG5Mb2NhdGlvbjoge3Jlc3VsdH0iLCB0aXRsZT0iU3VjY2VzcyIsIHdpZHRoPTYwLCBoZWlnaHQ9MTApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5kLm1zZ2JveChmIkVycm9yOiB7cmVzdWx0fSIsIHRpdGxlPSJFcnJvciIsIHdpZHRoPTYwLCBoZWlnaHQ9MTApCgogICAgZGVmIGVkaXRfZGViX2RpYWxvZyhzZWxmKToKICAgICAgICBkZWJfZmlsZXMgPSBnbG9iLmdsb2IoIiouZGViIikKICAgICAgICBkZWJfZmlsZXMgKz0gZ2xvYi5nbG9iKCIqLyouZGViIikKICAgICAgICBkZWJfZmlsZXMgPSBsaXN0KHNldChkZWJfZmlsZXMpKQogICAgICAgIGRlYl9maWxlcy5zb3J0KCkKICAgICAgICBpZiBub3QgZGViX2ZpbGVzOgogICAgICAgICAgICBzZWxmLmQubXNnYm94KCJObyAuZGViIGZpbGVzIGZvdW5kLiIsIHRpdGxlPSJFcnJvciIsIHdpZHRoPTQwLCBoZWlnaHQ9NikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZGViX2Nob2ljZXMgPSBbKGRlYiwgb3MucGF0aC5iYXNlbmFtZShkZWIpLCBGYWxzZSkgZm9yIGRlYiBpbiBkZWJfZmlsZXNdCiAgICAgICAgY29kZSwgc2VsZWN0ZWRfZGVicyA9IHNlbGYuZC5jaGVja2xpc3QoCiAgICAgICAgICAgICJTZWxlY3QgREVCIEZpbGUocykgdG8gRXh0cmFjdCAoU3BhY2UgdG8gc2VsZWN0KToiLAogICAgICAgICAgICBjaG9pY2VzPWRlYl9jaG9pY2VzLAogICAgICAgICAgICB3aWR0aD04MCwKICAgICAgICAgICAgaGVpZ2h0PTIwLAogICAgICAgICAgICB0aXRsZT0iREVCIEZpbGVzIgogICAgICAgICkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSyBvciBub3Qgc2VsZWN0ZWRfZGViczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29kZSwgb3NfdHlwZSA9IHNlbGYuZC5tZW51KAogICAgICAgICAgICAiU2VsZWN0IE9TIFR5cGUgZm9yIGV4dHJhY3Rpb24gdGFyZ2V0OiIsCiAgICAgICAgICAgIGNob2ljZXM9WygidGVybXV4IiwgIlRlcm11eCAoQW5kcm9pZCkiKSwgKCJkZWJpYW4iLCAiRGViaWFuIChMaW51eCkiKV0sCiAgICAgICAgICAgIHdpZHRoPTUwLCBoZWlnaHQ9MTAsIHRpdGxlPSJPUyBUeXBlIgogICAgICAgICkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgb3NfdHlwZSA9PSAidGVybXV4IjoKICAgICAgICAgICAgYmFzZV90YXJnZXQgPSBURVJNVVhfUEFUSAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJhc2VfdGFyZ2V0ID0gREVCSUFOX1BBVEgKICAgICAgICBjcmVhdGVfZGlyZWN0b3J5KGJhc2VfdGFyZ2V0KQogICAgICAgIHRvdGFsID0gbGVuKHNlbGVjdGVkX2RlYnMpCiAgICAgICAgb3JpZ2luYWxfZGlyID0gb3MuZ2V0Y3dkKCkKICAgICAgICBmb3IgaWR4LCBzZWxlY3RlZCBpbiBlbnVtZXJhdGUoc2VsZWN0ZWRfZGVicyk6CiAgICAgICAgICAgIHNlbGYuZC5pbmZvYm94KGYiRXh0cmFjdGluZyB7aWR4KzF9L3t0b3RhbH06IHtvcy5wYXRoLmJhc2VuYW1lKHNlbGVjdGVkKX0uLi4iLCB0aXRsZT0iUHJvY2Vzc2luZyIsIHdpZHRoPTYwLCBoZWlnaHQ9NSkKICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGVjdGVkKQogICAgICAgICAgICBmb2xkZXJfbmFtZSA9IGJhc2VuYW1lLnJlcGxhY2UoJy5kZWInLCAnJykKICAgICAgICAgICAgdGFyZ2V0X2RpciA9IG9zLnBhdGguam9pbihiYXNlX3RhcmdldCwgZm9sZGVyX25hbWUpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldF9kaXIpOgogICAgICAgICAgICAgICAgY291bnRlciA9IDEKICAgICAgICAgICAgICAgIHdoaWxlIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihiYXNlX3RhcmdldCwgZiJ7Zm9sZGVyX25hbWV9X3tjb3VudGVyfSIpKToKICAgICAgICAgICAgICAgICAgICBjb3VudGVyICs9IDEKICAgICAgICAgICAgICAgIHRhcmdldF9kaXIgPSBvcy5wYXRoLmpvaW4oYmFzZV90YXJnZXQsIGYie2ZvbGRlcl9uYW1lfV97Y291bnRlcn0iKQogICAgICAgICAgICBjcmVhdGVfZGlyZWN0b3J5KHRhcmdldF9kaXIpCiAgICAgICAgICAgIGFic19kZWIgPSBvcy5wYXRoLmFic3BhdGgoc2VsZWN0ZWQpCiAgICAgICAgICAgIG9zLmNoZGlyKHRhcmdldF9kaXIpCiAgICAgICAgICAgIHN1YnByb2Nlc3MucnVuKAogICAgICAgICAgICAgICAgWydhcicsICd4JywgYWJzX2RlYl0sCiAgICAgICAgICAgICAgICBjaGVjaz1GYWxzZSwKICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsCiAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMCiAgICAgICAgICAgICkKICAgICAgICAgICAgY3JlYXRlX2RpcmVjdG9yeSgiREVCSUFOIikKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoImNvbnRyb2wudGFyLnh6Iik6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bigKICAgICAgICAgICAgICAgICAgICBbJ3RhcicsICd4SnZmJywgJ2NvbnRyb2wudGFyLnh6JywgJy1DJywgJ0RFQklBTiddLAogICAgICAgICAgICAgICAgICAgIGNoZWNrPUZhbHNlLAogICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsCiAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKCJjb250cm9sLnRhci5neiIpOgogICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oCiAgICAgICAgICAgICAgICAgICAgWyd0YXInLCAneHp2ZicsICdjb250cm9sLnRhci5neicsICctQycsICdERUJJQU4nXSwKICAgICAgICAgICAgICAgICAgICBjaGVjaz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5ERVZOVUxMLAogICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoImRhdGEudGFyLnh6Iik6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bigKICAgICAgICAgICAgICAgICAgICBbJ3RhcicsICd4SnZmJywgJ2RhdGEudGFyLnh6J10sCiAgICAgICAgICAgICAgICAgICAgY2hlY2s9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwKICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoImRhdGEudGFyLmd6Iik6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bigKICAgICAgICAgICAgICAgICAgICBbJ3RhcicsICd4enZmJywgJ2RhdGEudGFyLmd6J10sCiAgICAgICAgICAgICAgICAgICAgY2hlY2s9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwKICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGZvciBmIGluIFsnZGF0YS50YXIueHonLCAnZGF0YS50YXIuZ3onLCAnY29udHJvbC50YXIueHonLCAnY29udHJvbC50YXIuZ3onLCAnZGViaWFuLWJpbmFyeSddOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZik6CiAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGYpCiAgICAgICAgICAgIG9zLmNoZGlyKG9yaWdpbmFsX2RpcikKICAgICAgICBzZWxmLmQubXNnYm94KGYiRXh0cmFjdGlvbiBjb21wbGV0ZWQ6IHt0b3RhbH0gREVCIGZpbGUocykgZXh0cmFjdGVkIHRvIHtiYXNlX3RhcmdldH0uIiwgdGl0bGU9IlN1Y2Nlc3MiLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICBkZWYgY29uZmlndXJlX3JlcG9fZGlhbG9nKHNlbGYpOgogICAgICAgIGNvbmZpZyA9IGxvYWRfcmVwb19jb25maWcoKQogICAgICAgIGdpdF91c2VyID0gc3VicHJvY2Vzcy5ydW4oWydnaXQnLCAnY29uZmlnJywgJ3VzZXIubmFtZSddLCBjYXB0dXJlX291dHB1dD1UcnVlLCB0ZXh0PVRydWUpLnN0ZG91dC5zdHJpcCgpCiAgICAgICAgY29kZSwgdXNlcm5hbWUgPSBzZWxmLmQuaW5wdXRib3goIkdpdCBVc2VybmFtZToiLCBpbml0PWdpdF91c2VyIG9yIGNvbmZpZy5nZXQoJ1VTRVJOQU1FJywgJ3VzZXJuYW1lJyksIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlID09IHNlbGYuZC5PSzoKICAgICAgICAgICAgY29uZmlnWydVU0VSTkFNRSddID0gdXNlcm5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBjb2RlLCByZXBvID0gc2VsZi5kLmlucHV0Ym94KCJSZXBvc2l0b3J5IE5hbWU6IiwgaW5pdD1jb25maWcuZ2V0KCdSRVBPU0lUT1JZJywgb3MucGF0aC5iYXNlbmFtZShvcy5nZXRjd2QoKSkpLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgaWYgY29kZSA9PSBzZWxmLmQuT0s6CiAgICAgICAgICAgIGNvbmZpZ1snUkVQT1NJVE9SWSddID0gcmVwbwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvZGUsIG9zX3R5cGUgPSBzZWxmLmQuaW5wdXRib3goIk9TIFR5cGU6IiwgaW5pdD1jb25maWcuZ2V0KCdPU1RZUEUnLCBvcy5wYXRoLmJhc2VuYW1lKG9zLmdldGN3ZCgpKSksIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlID09IHNlbGYuZC5PSzoKICAgICAgICAgICAgY29uZmlnWydPU1RZUEUnXSA9IG9zX3R5cGUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBjb2RlLCBjb2RlbmFtZSA9IHNlbGYuZC5pbnB1dGJveCgiQ29kZW5hbWU6IiwgaW5pdD1jb25maWcuZ2V0KCdDT0RFTkFNRScsICdzdGFibGUnKSwgd2lkdGg9NTAsIGhlaWdodD04KQogICAgICAgIGlmIGNvZGUgPT0gc2VsZi5kLk9LOgogICAgICAgICAgICBjb25maWdbJ0NPREVOQU1FJ10gPSBjb2RlbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvZGUsIGNvbXBvbmVudCA9IHNlbGYuZC5pbnB1dGJveCgiQ29tcG9uZW50OiIsIGluaXQ9Y29uZmlnLmdldCgnQ09NUE9ORU5UJywgJ21haW4nKSwgd2lkdGg9NTAsIGhlaWdodD04KQogICAgICAgIGlmIGNvZGUgPT0gc2VsZi5kLk9LOgogICAgICAgICAgICBjb25maWdbJ0NPTVBPTkVOVCddID0gY29tcG9uZW50CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2F2ZV9yZXBvX2NvbmZpZyhjb25maWcpCiAgICAgICAgcmVwb191cmwgPSBmImRlYiBodHRwczovL3tjb25maWdbJ1VTRVJOQU1FJ119LmdpdGh1Yi5pby97Y29uZmlnWydSRVBPU0lUT1JZJ119L3tjb25maWdbJ09TVFlQRSddfSB7Y29uZmlnWydDT0RFTkFNRSddfSB7Y29uZmlnWydDT01QT05FTlQnXX0iCiAgICAgICAgc2VsZi5kLm1zZ2JveChmIkNvbmZpZ3VyYXRpb24gc2F2ZWQhXG5cblJlcG9zaXRvcnkgVVJMOlxue3JlcG9fdXJsfSIsIHRpdGxlPSJTdWNjZXNzIiwgd2lkdGg9NjAsIGhlaWdodD0xMikKCiAgICBkZWYgYnVpbGRfcmVwb19kaWFsb2coc2VsZik6CiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKCIuZ2l0Iik6CiAgICAgICAgICAgIHNlbGYuZC5tc2dib3goIk5vdCBpbiBhIGdpdCByZXBvc2l0b3J5LlxuUGxlYXNlIHJ1biB0aGlzIGNvbW1hbmQgZnJvbSB5b3VyIHJlcG9zaXRvcnkgZm9sZGVyLiIsIHRpdGxlPSJFcnJvciIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29uZmlnID0gbG9hZF9yZXBvX2NvbmZpZygpCiAgICAgICAgaWYgbm90IGNvbmZpZy5nZXQoJ1VTRVJOQU1FJyk6CiAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX3JlcG9fZGlhbG9nKCkKICAgICAgICAgICAgY29uZmlnID0gbG9hZF9yZXBvX2NvbmZpZygpCiAgICAgICAgICAgIGlmIG5vdCBjb25maWcuZ2V0KCdVU0VSTkFNRScpOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29kZSwgc2lnbiA9IHNlbGYuZC55ZXNubygiU2lnbiByZXBvc2l0b3J5IHdpdGggR1BHP1xuXG5SZXF1aXJlcyBHUEcga2V5IGNvbmZpZ3VyZWQuIiwgd2lkdGg9NTAsIGhlaWdodD04KQogICAgICAgIHNpZ25fcmVwbyA9IChjb2RlID09IHNlbGYuZC5PSykKICAgICAgICBzZWxmLmQuaW5mb2JveCgiQnVpbGRpbmcgcmVwb3NpdG9yeS4uLlxuUGxlYXNlIHdhaXQuIiwgdGl0bGU9IlByb2Nlc3NpbmciLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgc3VjY2VzcyA9IGJ1aWxkX3JlcG9zaXRvcnkoKQogICAgICAgIGlmIHN1Y2Nlc3M6CiAgICAgICAgICAgIHNlbGYuZC5tc2dib3goIlJlcG9zaXRvcnkgYnVpbHQgc3VjY2Vzc2Z1bGx5ISIsIHRpdGxlPSJTdWNjZXNzIiwgd2lkdGg9NTAsIGhlaWdodD04KQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZC5tc2dib3goIlJlcG9zaXRvcnkgYnVpbGQgZmFpbGVkISIsIHRpdGxlPSJFcnJvciIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKCiAgICBkZWYgcHVzaF9yZXBvX2RpYWxvZyhzZWxmKToKICAgICAgICBzZWxmLmQuaW5mb2JveCgiUHVzaGluZyB0byBHaXRIdWIuLi4iLCB0aXRsZT0iUHJvY2Vzc2luZyIsIHdpZHRoPTQwLCBoZWlnaHQ9NSkKICAgICAgICBwdXNoX3JlcG9zaXRvcnkoKQogICAgICAgIHNlbGYuZC5tc2dib3goIlB1c2ggdG8gR2l0SHViIGNvbXBsZXRlZCEiLCB0aXRsZT0iU3VjY2VzcyIsIHdpZHRoPTQwLCBoZWlnaHQ9OCkKCmNsYXNzIFJlcG9NYW5hZ2VyR1VJOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QpOgogICAgICAgIHNlbGYucm9vdCA9IHJvb3QKICAgICAgICBzZWxmLnJvb3QudGl0bGUoIlJlcG9zaXRvcnkgTWFuYWdlciBNZW51IHYyLjEuOS1TUiIpCiAgICAgICAgc2VsZi5yb290Lmdlb21ldHJ5KCI1MDB4NTUwIikKICAgICAgICBzZWxmLnJvb3QucmVzaXphYmxlKFRydWUsIFRydWUpCiAgICAgICAgc3R5bGUgPSB0dGsuU3R5bGUoKQogICAgICAgIHN0eWxlLnRoZW1lX3VzZSgnY2xhbScpCiAgICAgICAgbWFpbl9mcmFtZSA9IHR0ay5GcmFtZShyb290LCBwYWRkaW5nPSIxNSIpCiAgICAgICAgbWFpbl9mcmFtZS5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUpCiAgICAgICAgdGl0bGVfbGFiZWwgPSB0dGsuTGFiZWwobWFpbl9mcmFtZSwgdGV4dD0iUmVwb3NpdG9yeSBNYW5hZ2VyIE1lbnUiLCBmb250PSgnQXJpYWwnLCAxOCwgJ2JvbGQnKSkKICAgICAgICB0aXRsZV9sYWJlbC5wYWNrKHBhZHk9MTApCiAgICAgICAgc3VidGl0bGVfbGFiZWwgPSB0dGsuTGFiZWwobWFpbl9mcmFtZSwgdGV4dD0iYnkgQXJpZS1TUjkxIiwgZm9udD0oJ0FyaWFsJywgMTApKQogICAgICAgIHN1YnRpdGxlX2xhYmVsLnBhY2socGFkeT0oMCwgMjApKQogICAgICAgIHR0ay5TZXBhcmF0b3IobWFpbl9mcmFtZSwgb3JpZW50PSdob3Jpem9udGFsJykucGFjayhmaWxsPXRrLlgsIHBhZHk9NSkKICAgICAgICBidXR0b25fZnJhbWUgPSB0dGsuRnJhbWUobWFpbl9mcmFtZSkKICAgICAgICBidXR0b25fZnJhbWUucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlLCBwYWR5PTEwKQogICAgICAgIGJ1dHRvbnMgPSBbCiAgICAgICAgICAgICgi8J+TpiBDcmVhdGUgU291cmNlIFBhY2thZ2UiLCBzZWxmLmJ1aWxkX3NvdXJjZV9ndWkpLAogICAgICAgICAgICAoIvCflKggQnVpbGQgREVCIFBhY2thZ2UiLCBzZWxmLmJ1aWxkX2RlYl9ndWkpLAogICAgICAgICAgICAoIvCflIQgVXBkYXRlIFNvdXJjZSBQYWNrYWdlIiwgc2VsZi51cGRhdGVfc291cmNlX2d1aSksCiAgICAgICAgICAgICgi4pyP77iPIEVkaXQgREVCIFBhY2thZ2UiLCBzZWxmLmVkaXRfZGViX2d1aSksCiAgICAgICAgICAgICgi4pqZ77iPIENvbmZpZ3VyZSBSZXBvIiwgc2VsZi5jb25maWd1cmVfcmVwb19ndWkpLAogICAgICAgICAgICAoIvCfk6UgQnVpbGQgUmVwb3NpdG9yeSIsIHNlbGYuYnVpbGRfcmVwb19ndWkpLAogICAgICAgICAgICAoIvCfk6QgUHVzaCBSZXBvc2l0b3J5Iiwgc2VsZi5wdXNoX3JlcG9fZ3VpKSwKICAgICAgICAgICAgKCLihLnvuI8gQWJvdXQiLCBzZWxmLnNob3dfYWJvdXQpLAogICAgICAgICAgICAoIvCfmqogRXhpdCIsIHNlbGYuZXhpdF9hcHApCiAgICAgICAgXQogICAgICAgIGZvciBpLCAodGV4dCwgY29tbWFuZCkgaW4gZW51bWVyYXRlKGJ1dHRvbnMpOgogICAgICAgICAgICByb3cgPSBpIC8vIDIKICAgICAgICAgICAgY29sID0gaSAlIDIKICAgICAgICAgICAgYnRuID0gdHRrLkJ1dHRvbihidXR0b25fZnJhbWUsIHRleHQ9dGV4dCwgY29tbWFuZD1jb21tYW5kLCB3aWR0aD0yOCkKICAgICAgICAgICAgYnRuLmdyaWQocm93PXJvdywgY29sdW1uPWNvbCwgcGFkeD0xMCwgcGFkeT04LCBzdGlja3k9ImV3IikKICAgICAgICBidXR0b25fZnJhbWUuY29sdW1uY29uZmlndXJlKDAsIHdlaWdodD0xKQogICAgICAgIGJ1dHRvbl9mcmFtZS5jb2x1bW5jb25maWd1cmUoMSwgd2VpZ2h0PTEpCiAgICAgICAgc2VsZi5zdGF0dXNfdmFyID0gdGsuU3RyaW5nVmFyKCkKICAgICAgICBzZWxmLnN0YXR1c192YXIuc2V0KCJSZWFkeSIpCiAgICAgICAgc3RhdHVzX2JhciA9IHR0ay5MYWJlbChyb290LCB0ZXh0dmFyaWFibGU9c2VsZi5zdGF0dXNfdmFyLCByZWxpZWY9dGsuU1VOS0VOLCBhbmNob3I9dGsuVykKICAgICAgICBzdGF0dXNfYmFyLnBhY2soc2lkZT10ay5CT1RUT00sIGZpbGw9dGsuWCkKICAgICAgICBzZWxmLnByb2dyZXNzX3ZhciA9IHRrLkludFZhcigpCiAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIgPSB0dGsuUHJvZ3Jlc3NiYXIocm9vdCwgdmFyaWFibGU9c2VsZi5wcm9ncmVzc192YXIsIG1heGltdW09MTAwKQogICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnBhY2soc2lkZT10ay5CT1RUT00sIGZpbGw9dGsuWCkKICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5wYWNrX2ZvcmdldCgpCiAgICBkZWYgdXBkYXRlX3N0YXR1cyhzZWxmLCBtZXNzYWdlKToKICAgICAgICBzZWxmLnN0YXR1c192YXIuc2V0KG1lc3NhZ2UpCiAgICAgICAgc2VsZi5yb290LnVwZGF0ZV9pZGxldGFza3MoKQogICAgZGVmIHNob3dfcHJvZ3Jlc3Moc2VsZiwgc2hvdz1UcnVlLCB2YWx1ZT0wKToKICAgICAgICBpZiBzaG93OgogICAgICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5wYWNrKHNpZGU9dGsuQk9UVE9NLCBmaWxsPXRrLlgpCiAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3NfdmFyLnNldCh2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5wYWNrX2ZvcmdldCgpCiAgICAgICAgc2VsZi5yb290LnVwZGF0ZV9pZGxldGFza3MoKQogICAgZGVmIHJ1bl9pbl90aHJlYWQoc2VsZiwgZnVuYywgKmFyZ3MpOgogICAgICAgIGRlZiB3cmFwcGVyKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX3N0YXR1cygiUnVubmluZy4uLiIpCiAgICAgICAgICAgICAgICBzZWxmLnNob3dfcHJvZ3Jlc3MoVHJ1ZSwgMCkKICAgICAgICAgICAgICAgIGZ1bmMoKmFyZ3MpCiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9zdGF0dXMoIlJlYWR5IikKICAgICAgICAgICAgICAgIHNlbGYuc2hvd19wcm9ncmVzcyhGYWxzZSkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfc3RhdHVzKCJFcnJvciIpCiAgICAgICAgICAgICAgICBzZWxmLnNob3dfcHJvZ3Jlc3MoRmFsc2UpCiAgICAgICAgICAgICAgICBtZXNzYWdlYm94LnNob3dlcnJvcigiRXJyb3IiLCBzdHIoZSkpCiAgICAgICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9d3JhcHBlcikKICAgICAgICB0aHJlYWQuZGFlbW9uID0gVHJ1ZQogICAgICAgIHRocmVhZC5zdGFydCgpCiAgICBkZWYgZ2V0X2lucHV0KHNlbGYsIHRpdGxlLCBwcm9tcHQsIGRlZmF1bHQ9IiIpOgogICAgICAgIGRpYWxvZyA9IHRrLlRvcGxldmVsKHNlbGYucm9vdCkKICAgICAgICBkaWFsb2cudGl0bGUodGl0bGUpCiAgICAgICAgZGlhbG9nLmdlb21ldHJ5KCI0NTB4MTgwIikKICAgICAgICBkaWFsb2cudHJhbnNpZW50KHNlbGYucm9vdCkKICAgICAgICBkaWFsb2cuZ3JhYl9zZXQoKQogICAgICAgIHJlc3VsdCA9IHRrLlN0cmluZ1Zhcih2YWx1ZT1kZWZhdWx0KQogICAgICAgIHR0ay5MYWJlbChkaWFsb2csIHRleHQ9cHJvbXB0LCBmb250PSgnQXJpYWwnLCAxMCkpLnBhY2socGFkeT0xNSkKICAgICAgICBlbnRyeSA9IHR0ay5FbnRyeShkaWFsb2csIHRleHR2YXJpYWJsZT1yZXN1bHQsIHdpZHRoPTUwLCBmb250PSgnQXJpYWwnLCAxMCkpCiAgICAgICAgZW50cnkucGFjayhwYWR5PTEwLCBwYWR4PTIwLCBmaWxsPXRrLlgpCiAgICAgICAgZW50cnkuZm9jdXMoKQogICAgICAgIGVudHJ5LnNlbGVjdF9yYW5nZSgwLCB0ay5FTkQpCiAgICAgICAgZGVmIG9uX29rKCk6CiAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKICAgICAgICBkZWYgb25fY2FuY2VsKCk6CiAgICAgICAgICAgIHJlc3VsdC5zZXQoIiIpCiAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKICAgICAgICBidG5fZnJhbWUgPSB0dGsuRnJhbWUoZGlhbG9nKQogICAgICAgIGJ0bl9mcmFtZS5wYWNrKHBhZHk9MTUpCiAgICAgICAgdHRrLkJ1dHRvbihidG5fZnJhbWUsIHRleHQ9Ik9LIiwgY29tbWFuZD1vbl9vaywgd2lkdGg9MTApLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSJDYW5jZWwiLCBjb21tYW5kPW9uX2NhbmNlbCwgd2lkdGg9MTApLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIGRpYWxvZy5iaW5kKCc8UmV0dXJuPicsIGxhbWJkYSBlOiBvbl9vaygpKQogICAgICAgIGRpYWxvZy5iaW5kKCc8RXNjYXBlPicsIGxhbWJkYSBlOiBvbl9jYW5jZWwoKSkKICAgICAgICBkaWFsb2cud2FpdF93aW5kb3coKQogICAgICAgIHJldHVybiByZXN1bHQuZ2V0KCkKICAgIGRlZiBzZWxlY3Rfb3Moc2VsZik6CiAgICAgICAgZGlhbG9nID0gdGsuVG9wbGV2ZWwoc2VsZi5yb290KQogICAgICAgIGRpYWxvZy50aXRsZSgiU2VsZWN0IE9TIFR5cGUiKQogICAgICAgIGRpYWxvZy5nZW9tZXRyeSgiMzAweDIwMCIpCiAgICAgICAgZGlhbG9nLnRyYW5zaWVudChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLmdyYWJfc2V0KCkKICAgICAgICByZXN1bHQgPSB0ay5TdHJpbmdWYXIodmFsdWU9ImRlYmlhbiIpCiAgICAgICAgdHRrLkxhYmVsKGRpYWxvZywgdGV4dD0iU2VsZWN0IE9wZXJhdGluZyBTeXN0ZW06IiwgZm9udD0oJ0FyaWFsJywgMTEsICdib2xkJykpLnBhY2socGFkeT0yMCkKICAgICAgICB0dGsuUmFkaW9idXR0b24oZGlhbG9nLCB0ZXh0PSJEZWJpYW4gKExpbnV4KSIsIHZhcmlhYmxlPXJlc3VsdCwgdmFsdWU9ImRlYmlhbiIpLnBhY2socGFkeT01KQogICAgICAgIHR0ay5SYWRpb2J1dHRvbihkaWFsb2csIHRleHQ9IlRlcm11eCAoQW5kcm9pZCkiLCB2YXJpYWJsZT1yZXN1bHQsIHZhbHVlPSJ0ZXJtdXgiKS5wYWNrKHBhZHk9NSkKICAgICAgICBkZWYgb25fb2soKToKICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQogICAgICAgIHR0ay5CdXR0b24oZGlhbG9nLCB0ZXh0PSJPSyIsIGNvbW1hbmQ9b25fb2ssIHdpZHRoPTEwKS5wYWNrKHBhZHk9MjApCiAgICAgICAgZGlhbG9nLndhaXRfd2luZG93KCkKICAgICAgICByZXR1cm4gcmVzdWx0LmdldCgpCiAgICBkZWYgc2VsZWN0X3BhY2thZ2Uoc2VsZiwgcGFja2FnZXMsIHRpdGxlPSJTZWxlY3QgUGFja2FnZSIpOgogICAgICAgIGlmIG5vdCBwYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBkaWFsb2cgPSB0ay5Ub3BsZXZlbChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLnRpdGxlKHRpdGxlKQogICAgICAgIGRpYWxvZy5nZW9tZXRyeSgiNTAweDQwMCIpCiAgICAgICAgZGlhbG9nLnRyYW5zaWVudChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLmdyYWJfc2V0KCkKICAgICAgICByZXN1bHQgPSB0ay5TdHJpbmdWYXIoKQogICAgICAgIHR0ay5MYWJlbChkaWFsb2csIHRleHQ9dGl0bGUsIGZvbnQ9KCdBcmlhbCcsIDExLCAnYm9sZCcpKS5wYWNrKHBhZHk9MTApCiAgICAgICAgZnJhbWUgPSB0dGsuRnJhbWUoZGlhbG9nKQogICAgICAgIGZyYW1lLnBhY2soZmlsbD10ay5CT1RILCBleHBhbmQ9VHJ1ZSwgcGFkeD0yMCwgcGFkeT0xMCkKICAgICAgICBzY3JvbGxiYXIgPSB0dGsuU2Nyb2xsYmFyKGZyYW1lKQogICAgICAgIHNjcm9sbGJhci5wYWNrKHNpZGU9dGsuUklHSFQsIGZpbGw9dGsuWSkKICAgICAgICBsaXN0Ym94ID0gdGsuTGlzdGJveChmcmFtZSwgeXNjcm9sbGNvbW1hbmQ9c2Nyb2xsYmFyLnNldCwgZm9udD0oJ0FyaWFsJywgMTApKQogICAgICAgIGxpc3Rib3gucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlKQogICAgICAgIHNjcm9sbGJhci5jb25maWcoY29tbWFuZD1saXN0Ym94Lnl2aWV3KQogICAgICAgIGZvciBpLCBwa2cgaW4gZW51bWVyYXRlKHBhY2thZ2VzLCAxKToKICAgICAgICAgICAgbGlzdGJveC5pbnNlcnQodGsuRU5ELCBmIntpfS4ge3BrZ30iKQogICAgICAgIGRlZiBvbl9zZWxlY3QoKToKICAgICAgICAgICAgc2VsZWN0aW9uID0gbGlzdGJveC5jdXJzZWxlY3Rpb24oKQogICAgICAgICAgICBpZiBzZWxlY3Rpb246CiAgICAgICAgICAgICAgICByZXN1bHQuc2V0KHBhY2thZ2VzW3NlbGVjdGlvblswXV0pCiAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKICAgICAgICBkZWYgb25fZG91YmxlX2NsaWNrKGV2ZW50KToKICAgICAgICAgICAgb25fc2VsZWN0KCkKICAgICAgICBsaXN0Ym94LmJpbmQoJzxEb3VibGUtQnV0dG9uLTE+Jywgb25fZG91YmxlX2NsaWNrKQogICAgICAgIGJ0bl9mcmFtZSA9IHR0ay5GcmFtZShkaWFsb2cpCiAgICAgICAgYnRuX2ZyYW1lLnBhY2socGFkeT0xMCkKICAgICAgICB0dGsuQnV0dG9uKGJ0bl9mcmFtZSwgdGV4dD0iU2VsZWN0IiwgY29tbWFuZD1vbl9zZWxlY3QsIHdpZHRoPTEyKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0xMCkKICAgICAgICB0dGsuQnV0dG9uKGJ0bl9mcmFtZSwgdGV4dD0iQ2FuY2VsIiwgY29tbWFuZD1kaWFsb2cuZGVzdHJveSwgd2lkdGg9MTIpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIGRpYWxvZy53YWl0X3dpbmRvdygpCiAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXQoKQoKICAgIGRlZiBzZWxlY3RfbXVsdGlwbGUoc2VsZiwgaXRlbXMsIHRpdGxlPSJTZWxlY3QgSXRlbShzKSIpOgogICAgICAgIGlmIG5vdCBpdGVtczoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgZGlhbG9nID0gdGsuVG9wbGV2ZWwoc2VsZi5yb290KQogICAgICAgIGRpYWxvZy50aXRsZSh0aXRsZSkKICAgICAgICBkaWFsb2cuZ2VvbWV0cnkoIjYwMHg1MDAiKQogICAgICAgIGRpYWxvZy50cmFuc2llbnQoc2VsZi5yb290KQogICAgICAgIGRpYWxvZy5ncmFiX3NldCgpCiAgICAgICAgdHRrLkxhYmVsKGRpYWxvZywgdGV4dD10aXRsZSwgZm9udD0oJ0FyaWFsJywgMTEsICdib2xkJykpLnBhY2socGFkeT0xMCkKICAgICAgICBmcmFtZSA9IHR0ay5GcmFtZShkaWFsb2cpCiAgICAgICAgZnJhbWUucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlLCBwYWR4PTIwLCBwYWR5PTEwKQogICAgICAgIHNjcm9sbGJhciA9IHR0ay5TY3JvbGxiYXIoZnJhbWUpCiAgICAgICAgc2Nyb2xsYmFyLnBhY2soc2lkZT10ay5SSUdIVCwgZmlsbD10ay5ZKQogICAgICAgIGxpc3Rib3ggPSB0ay5MaXN0Ym94KGZyYW1lLCB5c2Nyb2xsY29tbWFuZD1zY3JvbGxiYXIuc2V0LCBmb250PSgnQXJpYWwnLCAxMCksIHNlbGVjdG1vZGU9dGsuTVVMVElQTEUpCiAgICAgICAgbGlzdGJveC5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUpCiAgICAgICAgc2Nyb2xsYmFyLmNvbmZpZyhjb21tYW5kPWxpc3Rib3gueXZpZXcpCiAgICAgICAgZm9yIGksIGl0ZW0gaW4gZW51bWVyYXRlKGl0ZW1zLCAxKToKICAgICAgICAgICAgbGlzdGJveC5pbnNlcnQodGsuRU5ELCBmIntpfS4ge2l0ZW19IikKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIGRlZiBvbl9zZWxlY3QoKToKICAgICAgICAgICAgc2VsZWN0aW9ucyA9IGxpc3Rib3guY3Vyc2VsZWN0aW9uKCkKICAgICAgICAgICAgZm9yIGlkeCBpbiBzZWxlY3Rpb25zOgogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtc1tpZHhdKQogICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCiAgICAgICAgZGVmIG9uX2NhbmNlbCgpOgogICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCiAgICAgICAgYnRuX2ZyYW1lID0gdHRrLkZyYW1lKGRpYWxvZykKICAgICAgICBidG5fZnJhbWUucGFjayhwYWR5PTEwKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSJTZWxlY3QiLCBjb21tYW5kPW9uX3NlbGVjdCwgd2lkdGg9MTIpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSJDYW5jZWwiLCBjb21tYW5kPW9uX2NhbmNlbCwgd2lkdGg9MTIpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIGRpYWxvZy53YWl0X3dpbmRvdygpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBidWlsZF9zb3VyY2VfZ3VpKHNlbGYpOgogICAgICAgICIiIkJ1aWxkIHNvdXJjZSBwYWNrYWdlIGRlbmdhbiBmb3JtIHdpbmRvdyBzZXBlcnRpIGNvbmZpZ3VyZSByZXBvIiIiCiAgICAgICAgZGlhbG9nID0gdGsuVG9wbGV2ZWwoc2VsZi5yb290KQogICAgICAgIGRpYWxvZy50aXRsZSgiQ3JlYXRlIFNvdXJjZSBQYWNrYWdlIikKICAgICAgICBkaWFsb2cuZ2VvbWV0cnkoIjUwMHg2MDAiKQogICAgICAgIGRpYWxvZy50cmFuc2llbnQoc2VsZi5yb290KQogICAgICAgIGRpYWxvZy5ncmFiX3NldCgpCiAgICAgICAgdHRrLkxhYmVsKGRpYWxvZywgdGV4dD0iQ3JlYXRlIFNvdXJjZSBQYWNrYWdlIiwgZm9udD0oJ0FyaWFsJywgMTQsICdib2xkJykpLnBhY2socGFkeT0xNSkKICAgICAgICBmcmFtZSA9IHR0ay5GcmFtZShkaWFsb2csIHBhZGRpbmc9IjIwIikKICAgICAgICBmcmFtZS5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUpCiAgICAgICAgdHRrLkxhYmVsKGZyYW1lLCB0ZXh0PSJPUyBUeXBlOiIpLmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIG9zX3ZhciA9IHRrLlN0cmluZ1Zhcih2YWx1ZT0iZGViaWFuIikKICAgICAgICBvc19mcmFtZSA9IHR0ay5GcmFtZShmcmFtZSkKICAgICAgICBvc19mcmFtZS5ncmlkKHJvdz0wLCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICB0dGsuUmFkaW9idXR0b24ob3NfZnJhbWUsIHRleHQ9IkRlYmlhbiAoTGludXgpIiwgdmFyaWFibGU9b3NfdmFyLCB2YWx1ZT0iZGViaWFuIikucGFjayhzaWRlPXRrLkxFRlQpCiAgICAgICAgdHRrLlJhZGlvYnV0dG9uKG9zX2ZyYW1lLCB0ZXh0PSJUZXJtdXggKEFuZHJvaWQpIiwgdmFyaWFibGU9b3NfdmFyLCB2YWx1ZT0idGVybXV4IikucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9MTApCiAgICAgICAgdHRrLkxhYmVsKGZyYW1lLCB0ZXh0PSJBcmNoaXRlY3R1cmU6IikuZ3JpZChyb3c9MSwgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgYXJjaF92YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9ImFsbCIpCiAgICAgICAgZGVmIHVwZGF0ZV9hcmNoX2xpc3QoKmFyZ3MpOgogICAgICAgICAgICBpZiBvc192YXIuZ2V0KCkgPT0gImRlYmlhbiI6CiAgICAgICAgICAgICAgICBhcmNoX3ZhbHVlcyA9IFsiYWxsIiwgImFtZDY0IiwgImFybTY0IiwgImFybWhmIiwgImkzODYiXQogICAgICAgICAgICAgICAgYXJjaF92YXIuc2V0KCJhbGwiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXJjaF92YWx1ZXMgPSBbImFsbCIsICJhYXJjaDY0IiwgImFybSIsICJpNjg2IiwgIng4Nl82NCJdCiAgICAgICAgICAgICAgICBhcmNoX3Zhci5zZXQoImFsbCIpCiAgICAgICAgICAgIGFyY2hfY29tYm9bJ3ZhbHVlcyddID0gYXJjaF92YWx1ZXMKICAgICAgICBhcmNoX2NvbWJvID0gdHRrLkNvbWJvYm94KGZyYW1lLCB0ZXh0dmFyaWFibGU9YXJjaF92YXIsIHZhbHVlcz1bImFsbCIsICJhbWQ2NCIsICJhcm02NCIsICJhcm1oZiIsICJpMzg2Il0sIHdpZHRoPTI3KQogICAgICAgIGFyY2hfY29tYm8uZ3JpZChyb3c9MSwgY29sdW1uPTEsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICBhcmNoX2NvbWJvLnN0YXRlKFsncmVhZG9ubHknXSkKICAgICAgICBvc192YXIudHJhY2VfYWRkKCd3cml0ZScsIHVwZGF0ZV9hcmNoX2xpc3QpCiAgICAgICAgdHRrLkxhYmVsKGZyYW1lLCB0ZXh0PSJQYWNrYWdlIE5hbWU6IikuZ3JpZChyb3c9MiwgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgcGtnbmFtZV92YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9Im15dG9vbHMiKQogICAgICAgIHR0ay5FbnRyeShmcmFtZSwgdGV4dHZhcmlhYmxlPXBrZ25hbWVfdmFyLCB3aWR0aD0zMCkuZ3JpZChyb3c9MiwgY29sdW1uPTEsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9IlZlcnNpb246IikuZ3JpZChyb3c9MywgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgdmVyc2lvbl92YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9IjEuMC4wIikKICAgICAgICB0dGsuRW50cnkoZnJhbWUsIHRleHR2YXJpYWJsZT12ZXJzaW9uX3Zhciwgd2lkdGg9MzApLmdyaWQocm93PTMsIGNvbHVtbj0xLCBwYWR5PTUsIHBhZHg9MTApCiAgICAgICAgdHRrLkxhYmVsKGZyYW1lLCB0ZXh0PSJEZXBlbmRzOiIpLmdyaWQocm93PTQsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIGRlcGVuZHNfdmFyID0gdGsuU3RyaW5nVmFyKHZhbHVlPSIiKQogICAgICAgIHR0ay5FbnRyeShmcmFtZSwgdGV4dHZhcmlhYmxlPWRlcGVuZHNfdmFyLCB3aWR0aD0zMCkuZ3JpZChyb3c9NCwgY29sdW1uPTEsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9IkRlc2NyaXB0aW9uOiIpLmdyaWQocm93PTUsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIGRlc2NfdmFyID0gdGsuU3RyaW5nVmFyKHZhbHVlPSJBIGdyZWF0IHRvb2wiKQogICAgICAgIHR0ay5FbnRyeShmcmFtZSwgdGV4dHZhcmlhYmxlPWRlc2NfdmFyLCB3aWR0aD0zMCkuZ3JpZChyb3c9NSwgY29sdW1uPTEsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9Ik1haW50YWluZXI6IikuZ3JpZChyb3c9NiwgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgdXNlcm5hbWVfdmFyID0gdGsuU3RyaW5nVmFyKHZhbHVlPW9zLmVudmlyb24uZ2V0KCdVU0VSJywgJ3VzZXInKSkKICAgICAgICB0dGsuRW50cnkoZnJhbWUsIHRleHR2YXJpYWJsZT11c2VybmFtZV92YXIsIHdpZHRoPTMwKS5ncmlkKHJvdz02LCBjb2x1bW49MSwgcGFkeT01LCBwYWR4PTEwKQogICAgICAgIHR0ay5MYWJlbChmcmFtZSwgdGV4dD0iRW1haWw6IikuZ3JpZChyb3c9NywgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgZW1haWxfdmFyID0gdGsuU3RyaW5nVmFyKHZhbHVlPWYie29zLmVudmlyb24uZ2V0KCdVU0VSJywgJ3VzZXInKX1AZXhhbXBsZS5jb20iKQogICAgICAgIHR0ay5FbnRyeShmcmFtZSwgdGV4dHZhcmlhYmxlPWVtYWlsX3Zhciwgd2lkdGg9MzApLmdyaWQocm93PTcsIGNvbHVtbj0xLCBwYWR5PTUsIHBhZHg9MTApCiAgICAgICAgdHRrLkxhYmVsKGZyYW1lLCB0ZXh0PSJIb21lcGFnZToiKS5ncmlkKHJvdz04LCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBob21lcGFnZV92YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9Imh0dHBzOi8vZXhhbXBsZS5jb20iKQogICAgICAgIHR0ay5FbnRyeShmcmFtZSwgdGV4dHZhcmlhYmxlPWhvbWVwYWdlX3Zhciwgd2lkdGg9MzApLmdyaWQocm93PTgsIGNvbHVtbj0xLCBwYWR5PTUsIHBhZHg9MTApCiAgICAgICAgcHJvZ3Jlc3NfdmFyID0gdGsuSW50VmFyKCkKICAgICAgICBwcm9ncmVzc19iYXIgPSB0dGsuUHJvZ3Jlc3NiYXIoZGlhbG9nLCB2YXJpYWJsZT1wcm9ncmVzc192YXIsIG1heGltdW09MTAwKQogICAgICAgIHByb2dyZXNzX2Jhci5wYWNrKHNpZGU9dGsuQk9UVE9NLCBmaWxsPXRrLlgsIHBhZHg9MjAsIHBhZHk9MTApCiAgICAgICAgcHJvZ3Jlc3NfYmFyLnBhY2tfZm9yZ2V0KCkKICAgICAgICBkZWYgdXBkYXRlX3Byb2dyZXNzKHZhbHVlKToKICAgICAgICAgICAgcHJvZ3Jlc3NfdmFyLnNldCh2YWx1ZSkKICAgICAgICAgICAgZGlhbG9nLnVwZGF0ZV9pZGxldGFza3MoKQogICAgICAgIGRlZiBkb19idWlsZCgpOgogICAgICAgICAgICBzYXZlX2J0bi5jb25maWcoc3RhdGU9dGsuRElTQUJMRUQpCiAgICAgICAgICAgIGNhbmNlbF9idG4uY29uZmlnKHN0YXRlPXRrLkRJU0FCTEVEKQogICAgICAgICAgICBwcm9ncmVzc19iYXIucGFjayhzaWRlPXRrLkJPVFRPTSwgZmlsbD10ay5YLCBwYWR4PTIwLCBwYWR5PTEwKQogICAgICAgICAgICB1cGRhdGVfcHJvZ3Jlc3MoMTApCiAgICAgICAgICAgIG9zX3R5cGUgPSBvc192YXIuZ2V0KCkKICAgICAgICAgICAgcGtnbmFtZSA9IHBrZ25hbWVfdmFyLmdldCgpCiAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uX3Zhci5nZXQoKQogICAgICAgICAgICBhcmNoID0gYXJjaF92YXIuZ2V0KCkKICAgICAgICAgICAgZGVwZW5kcyA9IGRlcGVuZHNfdmFyLmdldCgpCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY192YXIuZ2V0KCkKICAgICAgICAgICAgdXNlcm5hbWUgPSB1c2VybmFtZV92YXIuZ2V0KCkKICAgICAgICAgICAgZW1haWwgPSBlbWFpbF92YXIuZ2V0KCkKICAgICAgICAgICAgaG9tZXBhZ2UgPSBob21lcGFnZV92YXIuZ2V0KCkKICAgICAgICAgICAgaWYgbm90IHBrZ25hbWUgb3Igbm90IHZlcnNpb246CiAgICAgICAgICAgICAgICBtZXNzYWdlYm94LnNob3dlcnJvcigiRXJyb3IiLCAiUGFja2FnZSBOYW1lIGFuZCBWZXJzaW9uIGFyZSByZXF1aXJlZCEiKQogICAgICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIHVwZGF0ZV9wcm9ncmVzcygzMCkKICAgICAgICAgICAgZGVmIHJ1bl9idWlsZCgpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MsIHJlc3VsdCA9IGJ1aWxkX3NvdXJjZV9jb3JlKG9zX3R5cGUsIHBrZ25hbWUsIHZlcnNpb24sIGFyY2gsIGRlcGVuZHMsIGRlc2NyaXB0aW9uLCB1c2VybmFtZSwgZW1haWwsIGhvbWVwYWdlKQogICAgICAgICAgICAgICAgICAgIGRpYWxvZy5hZnRlcigwLCBsYW1iZGE6IHVwZGF0ZV9wcm9ncmVzcygxMDApKQogICAgICAgICAgICAgICAgICAgIGlmIHN1Y2Nlc3M6CiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5hZnRlcigwLCBsYW1iZGE6IG1lc3NhZ2Vib3guc2hvd2luZm8oIlN1Y2Nlc3MiLCBmIlNvdXJjZSBwYWNrYWdlIGNyZWF0ZWQhXG5Mb2NhdGlvbjoge3Jlc3VsdH0iKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuYWZ0ZXIoMCwgbGFtYmRhOiBtZXNzYWdlYm94LnNob3dlcnJvcigiRXJyb3IiLCByZXN1bHQpKQogICAgICAgICAgICAgICAgICAgIGRpYWxvZy5hZnRlcigwLCBkaWFsb2cuZGVzdHJveSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgICAgICBkaWFsb2cuYWZ0ZXIoMCwgbGFtYmRhOiBtZXNzYWdlYm94LnNob3dlcnJvcigiRXJyb3IiLCBzdHIoZSkpKQogICAgICAgICAgICAgICAgICAgIGRpYWxvZy5hZnRlcigwLCBkaWFsb2cuZGVzdHJveSkKICAgICAgICAgICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuX2J1aWxkKQogICAgICAgICAgICB0aHJlYWQuZGFlbW9uID0gVHJ1ZQogICAgICAgICAgICB0aHJlYWQuc3RhcnQoKQogICAgICAgIGRlZiBvbl9jYW5jZWwoKToKICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQogICAgICAgIGJ0bl9mcmFtZSA9IHR0ay5GcmFtZShkaWFsb2cpCiAgICAgICAgYnRuX2ZyYW1lLnBhY2socGFkeT0yMCkKICAgICAgICBzYXZlX2J0biA9IHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSJDcmVhdGUiLCBjb21tYW5kPWRvX2J1aWxkLCB3aWR0aD0xMikKICAgICAgICBzYXZlX2J0bi5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0xMCkKICAgICAgICBjYW5jZWxfYnRuID0gdHRrLkJ1dHRvbihidG5fZnJhbWUsIHRleHQ9IkNhbmNlbCIsIGNvbW1hbmQ9b25fY2FuY2VsLCB3aWR0aD0xMikKICAgICAgICBjYW5jZWxfYnRuLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIGRpYWxvZy5iaW5kKCc8UmV0dXJuPicsIGxhbWJkYSBlOiBkb19idWlsZCgpKQogICAgICAgIGRpYWxvZy5iaW5kKCc8RXNjYXBlPicsIGxhbWJkYSBlOiBvbl9jYW5jZWwoKSkKCiAgICBkZWYgYnVpbGRfZGViX2d1aShzZWxmKToKICAgICAgICBvc190eXBlID0gc2VsZi5zZWxlY3Rfb3MoKQogICAgICAgIGlmIG5vdCBvc190eXBlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzb3VyY2VfZGlyID0gb3MucGF0aC5qb2luKFBST0pFQ1RfUEFUSCwgb3NfdHlwZSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlX2Rpcik6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2Vycm9yKCJFcnJvciIsIGYiU291cmNlIGRpcmVjdG9yeSBub3QgZm91bmQ6IHtzb3VyY2VfZGlyfSIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHBhY2thZ2VzID0gW2QgZm9yIGQgaW4gb3MubGlzdGRpcihzb3VyY2VfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBkKSldCiAgICAgICAgcGFja2FnZXMuc29ydCgpCiAgICAgICAgaWYgbm90IHBhY2thZ2VzOgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dlcnJvcigiRXJyb3IiLCAiTm8gc291cmNlIHBhY2thZ2VzIGZvdW5kIikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZWN0ZWQgPSBzZWxmLnNlbGVjdF9tdWx0aXBsZShwYWNrYWdlcywgIlNlbGVjdCBQYWNrYWdlKHMpIHRvIEJ1aWxkIChDdHJsK0NsaWNrIGZvciBtdWx0aXBsZSkiKQogICAgICAgIGlmIG5vdCBzZWxlY3RlZDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29uZmlnID0gbG9hZF9yZXBvX2NvbmZpZygpCiAgICAgICAgY29tcG9uZW50ID0gc2VsZi5nZXRfaW5wdXQoIkNvbXBvbmVudCIsICJDb21wb25lbnQgZm9sZGVyOiIsIGNvbmZpZy5nZXQoJ0NPTVBPTkVOVCcsICdtYWluJykpCiAgICAgICAgc2VsZi5ydW5faW5fdGhyZWFkKHNlbGYuX2J1aWxkX2RlYl9tdWx0aSwgb3NfdHlwZSwgc2VsZWN0ZWQsIGNvbXBvbmVudCkKCiAgICBkZWYgX2J1aWxkX2RlYl9tdWx0aShzZWxmLCBvc190eXBlLCBwYWNrYWdlX25hbWVzLCBjb21wb25lbnQpOgogICAgICAgIHRvdGFsID0gbGVuKHBhY2thZ2VfbmFtZXMpCiAgICAgICAgc3VjY2Vzc19jb3VudCA9IDAKICAgICAgICBmb3IgaWR4LCBwa2cgaW4gZW51bWVyYXRlKHBhY2thZ2VfbmFtZXMpOgogICAgICAgICAgICBzZWxmLnVwZGF0ZV9zdGF0dXMoZiJCdWlsZGluZyB7aWR4KzF9L3t0b3RhbH06IHtwa2d9IikKICAgICAgICAgICAgc2VsZi5zaG93X3Byb2dyZXNzKFRydWUsIGludCgoaWR4KzEpL3RvdGFsKjEwMCkpCiAgICAgICAgICAgIHN1Y2Nlc3MsIF8gPSBidWlsZF9kZWJfY29yZShvc190eXBlLCBwa2csIGNvbXBvbmVudCkKICAgICAgICAgICAgaWYgc3VjY2VzczoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NfY291bnQgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoIkVycm9yIiwgZiJGYWlsZWQgdG8gYnVpbGQge3BrZ30iKQogICAgICAgIHNlbGYuc2hvd19wcm9ncmVzcyhGYWxzZSkKICAgICAgICBzZWxmLnVwZGF0ZV9zdGF0dXMoIlJlYWR5IikKICAgICAgICBtZXNzYWdlYm94LnNob3dpbmZvKCJSZXN1bHQiLCBmIkJ1aWx0IHtzdWNjZXNzX2NvdW50fS97dG90YWx9IHBhY2thZ2VzIHN1Y2Nlc3NmdWxseS4iKQoKICAgIGRlZiB1cGRhdGVfc291cmNlX2d1aShzZWxmKToKICAgICAgICBvc190eXBlID0gc2VsZi5zZWxlY3Rfb3MoKQogICAgICAgIGlmIG5vdCBvc190eXBlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzb3VyY2VfZGlyID0gb3MucGF0aC5qb2luKFBST0pFQ1RfUEFUSCwgb3NfdHlwZSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlX2Rpcik6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2Vycm9yKCJFcnJvciIsIGYiU291cmNlIGRpcmVjdG9yeSBub3QgZm91bmQ6IHtzb3VyY2VfZGlyfSIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHBhY2thZ2VzID0gW2QgZm9yIGQgaW4gb3MubGlzdGRpcihzb3VyY2VfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBkKSldCiAgICAgICAgcGFja2FnZXMuc29ydCgpCiAgICAgICAgaWYgbm90IHBhY2thZ2VzOgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dlcnJvcigiRXJyb3IiLCAiTm8gc291cmNlIHBhY2thZ2VzIGZvdW5kIikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZWN0ZWQgPSBzZWxmLnNlbGVjdF9wYWNrYWdlKHBhY2thZ2VzLCAiU2VsZWN0IFBhY2thZ2UgdG8gVXBkYXRlIikKICAgICAgICBpZiBub3Qgc2VsZWN0ZWQ6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvbnRyb2xfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBzZWxlY3RlZCwgIkRFQklBTiIsICJjb250cm9sIikKICAgICAgICB3aXRoIG9wZW4oY29udHJvbF9wYXRoLCAncicpIGFzIGY6CiAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQogICAgICAgIGN1cnJlbnRfdmVyc2lvbiA9IHJlLnNlYXJjaChyJ1ZlcnNpb246ICguKiknLCBjb250ZW50KS5ncm91cCgxKQogICAgICAgIHN1Z2dlc3RlZCA9IGF1dG9faW5jcmVtZW50X3ZlcnNpb24oY3VycmVudF92ZXJzaW9uKQogICAgICAgIG5ld192ZXJzaW9uID0gc2VsZi5nZXRfaW5wdXQoIk5ldyBWZXJzaW9uIiwgIkVudGVyIG5ldyB2ZXJzaW9uOiIsIHN1Z2dlc3RlZCkKICAgICAgICBpZiBub3QgbmV3X3ZlcnNpb246CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGFjdGlvbiA9ICJyZW5hbWUiIGlmIG1lc3NhZ2Vib3guYXNreWVzbm8oIlVwZGF0ZSBPcHRpb24iLCAiUmVuYW1lIHNvdXJjZSBmb2xkZXIgKHVwZGF0ZSBpbiBwbGFjZSk/IikgZWxzZSAiY29weSIKICAgICAgICBzZWxmLnJ1bl9pbl90aHJlYWQoc2VsZi5fdXBkYXRlX3NvdXJjZSwgb3NfdHlwZSwgc2VsZWN0ZWQsIG5ld192ZXJzaW9uLCBhY3Rpb24pCiAgICBkZWYgX3VwZGF0ZV9zb3VyY2Uoc2VsZiwgb3NfdHlwZSwgc2VsZWN0ZWQsIG5ld192ZXJzaW9uLCBhY3Rpb24pOgogICAgICAgIHN1Y2Nlc3MsIHJlc3VsdCA9IHVwZGF0ZV9zb3VyY2VfY29yZShvc190eXBlLCBzZWxlY3RlZCwgbmV3X3ZlcnNpb24sIGFjdGlvbikKICAgICAgICBpZiBzdWNjZXNzOgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dpbmZvKCJTdWNjZXNzIiwgZiJQYWNrYWdlIHVwZGF0ZWQhXG5Mb2NhdGlvbjoge3Jlc3VsdH0iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2Vycm9yKCJFcnJvciIsIHJlc3VsdCkKCiAgICBkZWYgZWRpdF9kZWJfZ3VpKHNlbGYpOgogICAgICAgIGRlYl9maWxlcyA9IGdsb2IuZ2xvYigiKi5kZWIiKQogICAgICAgIGRlYl9maWxlcyArPSBnbG9iLmdsb2IoIiovKi5kZWIiKQogICAgICAgIGRlYl9maWxlcyA9IGxpc3Qoc2V0KGRlYl9maWxlcykpCiAgICAgICAgZGViX2ZpbGVzLnNvcnQoKQogICAgICAgIGlmIG5vdCBkZWJfZmlsZXM6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2Vycm9yKCJFcnJvciIsICJObyAuZGViIGZpbGVzIGZvdW5kIikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZWN0ZWQgPSBzZWxmLnNlbGVjdF9tdWx0aXBsZShkZWJfZmlsZXMsICJTZWxlY3QgREVCIEZpbGUocykgdG8gRXh0cmFjdCIpCiAgICAgICAgaWYgbm90IHNlbGVjdGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBvc190eXBlID0gc2VsZi5zZWxlY3Rfb3MoKQogICAgICAgIGlmIG5vdCBvc190eXBlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBvc190eXBlID09ICJ0ZXJtdXgiOgogICAgICAgICAgICBiYXNlX3RhcmdldCA9IFRFUk1VWF9QQVRICiAgICAgICAgZWxzZToKICAgICAgICAgICAgYmFzZV90YXJnZXQgPSBERUJJQU5fUEFUSAogICAgICAgIGNyZWF0ZV9kaXJlY3RvcnkoYmFzZV90YXJnZXQpCiAgICAgICAgc2VsZi5ydW5faW5fdGhyZWFkKHNlbGYuX2VkaXRfZGViX211bHRpLCBzZWxlY3RlZCwgYmFzZV90YXJnZXQpCgogICAgZGVmIF9lZGl0X2RlYl9tdWx0aShzZWxmLCBkZWJfZmlsZXMsIGJhc2VfdGFyZ2V0KToKICAgICAgICBvcmlnaW5hbF9kaXIgPSBvcy5nZXRjd2QoKQogICAgICAgIHRvdGFsID0gbGVuKGRlYl9maWxlcykKICAgICAgICBmb3IgaWR4LCBkZWIgaW4gZW51bWVyYXRlKGRlYl9maWxlcyk6CiAgICAgICAgICAgIHNlbGYudXBkYXRlX3N0YXR1cyhmIkV4dHJhY3Rpbmcge2lkeCsxfS97dG90YWx9OiB7b3MucGF0aC5iYXNlbmFtZShkZWIpfSIpCiAgICAgICAgICAgIHNlbGYuc2hvd19wcm9ncmVzcyhUcnVlLCBpbnQoKGlkeCsxKS90b3RhbCoxMDApKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBhYnNfZGViID0gb3MucGF0aC5hYnNwYXRoKGRlYikKICAgICAgICAgICAgICAgIHByaW50KGYiREVCVUc6IGRlYiA9IHtkZWJ9IikKICAgICAgICAgICAgICAgIHByaW50KGYiREVCVUc6IGFic19kZWIgPSB7YWJzX2RlYn0iKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGFic19kZWIpOgogICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShkZWIpCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoYmFzZW5hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICBhYnNfZGViID0gb3MucGF0aC5hYnNwYXRoKGJhc2VuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBwcmludChmIkRFQlVHOiBGb3VuZCBhcyB7YWJzX2RlYn0iKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEZpbGVOb3RGb3VuZEVycm9yKGYiRmlsZSBub3QgZm91bmQ6IHtkZWJ9IikKICAgICAgICAgICAgICAgIGZvbGRlcl9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShkZWIpLnJlcGxhY2UoJy5kZWInLCAnJykKICAgICAgICAgICAgICAgIHRhcmdldF9kaXIgPSBvcy5wYXRoLmpvaW4oYmFzZV90YXJnZXQsIGZvbGRlcl9uYW1lKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGFyZ2V0X2Rpcik6CiAgICAgICAgICAgICAgICAgICAgY291bnRlciA9IDEKICAgICAgICAgICAgICAgICAgICB3aGlsZSBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oYmFzZV90YXJnZXQsIGYie2ZvbGRlcl9uYW1lfV97Y291bnRlcn0iKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMQogICAgICAgICAgICAgICAgICAgIHRhcmdldF9kaXIgPSBvcy5wYXRoLmpvaW4oYmFzZV90YXJnZXQsIGYie2ZvbGRlcl9uYW1lfV97Y291bnRlcn0iKQogICAgICAgICAgICAgICAgY3JlYXRlX2RpcmVjdG9yeSh0YXJnZXRfZGlyKQogICAgICAgICAgICAgICAgb3MuY2hkaXIodGFyZ2V0X2RpcikKICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MucnVuKFsnYXInLCAneCcsIGFic19kZWJdLCBjaGVjaz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwpCiAgICAgICAgICAgICAgICBjcmVhdGVfZGlyZWN0b3J5KCJERUJJQU4iKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoImNvbnRyb2wudGFyLnh6Iik6CiAgICAgICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oCiAgICAgICAgICAgICAgICAgICAgICAgIFsndGFyJywgJ3hKdmYnLCAnY29udHJvbC50YXIueHonLCAnLUMnLCAnREVCSUFOJ10sCiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5ERVZOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cygiY29udHJvbC50YXIuZ3oiKToKICAgICAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgWyd0YXInLCAneHp2ZicsICdjb250cm9sLnRhci5neicsICctQycsICdERUJJQU4nXSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygiZGF0YS50YXIueHoiKToKICAgICAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgWyd0YXInLCAneEp2ZicsICdkYXRhLnRhci54eiddLAogICAgICAgICAgICAgICAgICAgICAgICBjaGVjaz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoImRhdGEudGFyLmd6Iik6CiAgICAgICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oCiAgICAgICAgICAgICAgICAgICAgICAgIFsndGFyJywgJ3h6dmYnLCAnZGF0YS50YXIuZ3onXSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3IgY2xlYW51cCBpbiBbJ2RhdGEudGFyLnh6JywgJ2RhdGEudGFyLmd6JywgJ2NvbnRyb2wudGFyLnh6JywgJ2NvbnRyb2wudGFyLmd6JywgJ2RlYmlhbi1iaW5hcnknXToKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjbGVhbnVwKToKICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGNsZWFudXApCiAgICAgICAgICAgICAgICBvcy5jaGRpcihvcmlnaW5hbF9kaXIpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHByaW50KGYiRXh0cmFjdGlvbiB3YXJuaW5nIGZvciB7ZGVifToge2V9IikKICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9yaWdpbmFsX2RpcikKICAgICAgICBzZWxmLnNob3dfcHJvZ3Jlc3MoRmFsc2UpCiAgICAgICAgc2VsZi51cGRhdGVfc3RhdHVzKCJSZWFkeSIpCiAgICAgICAgbWVzc2FnZWJveC5zaG93aW5mbygiU3VjY2VzcyIsIGYiRXh0cmFjdGVkIHt0b3RhbH0gREVCIGZpbGUocykgdG8ge2Jhc2VfdGFyZ2V0fS4iKQoKICAgIGRlZiBjb25maWd1cmVfcmVwb19ndWkoc2VsZik6CiAgICAgICAgY29uZmlnID0gbG9hZF9yZXBvX2NvbmZpZygpCiAgICAgICAgZ2l0X3VzZXIgPSBzdWJwcm9jZXNzLnJ1bihbJ2dpdCcsICdjb25maWcnLCAndXNlci5uYW1lJ10sIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSkuc3Rkb3V0LnN0cmlwKCkKICAgICAgICBkaWFsb2cgPSB0ay5Ub3BsZXZlbChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLnRpdGxlKCJSZXBvc2l0b3J5IENvbmZpZ3VyYXRpb24iKQogICAgICAgIGRpYWxvZy5nZW9tZXRyeSgiNTAweDQ1MCIpCiAgICAgICAgZGlhbG9nLnRyYW5zaWVudChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLmdyYWJfc2V0KCkKICAgICAgICB0dGsuTGFiZWwoZGlhbG9nLCB0ZXh0PSJSZXBvc2l0b3J5IENvbmZpZ3VyYXRpb24iLCBmb250PSgnQXJpYWwnLCAxNCwgJ2JvbGQnKSkucGFjayhwYWR5PTE1KQogICAgICAgIGZyYW1lID0gdHRrLkZyYW1lKGRpYWxvZywgcGFkZGluZz0iMjAiKQogICAgICAgIGZyYW1lLnBhY2soZmlsbD10ay5CT1RILCBleHBhbmQ9VHJ1ZSkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9IkdpdCBVc2VybmFtZToiKS5ncmlkKHJvdz0wLCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICB1c2VybmFtZV92YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9Z2l0X3VzZXIgb3IgY29uZmlnLmdldCgnVVNFUk5BTUUnLCAndXNlcm5hbWUnKSkKICAgICAgICB0dGsuRW50cnkoZnJhbWUsIHRleHR2YXJpYWJsZT11c2VybmFtZV92YXIsIHdpZHRoPTMwKS5ncmlkKHJvdz0wLCBjb2x1bW49MSwgcGFkeT01LCBwYWR4PTEwKQogICAgICAgIHR0ay5MYWJlbChmcmFtZSwgdGV4dD0iUmVwb3NpdG9yeSBOYW1lOiIpLmdyaWQocm93PTEsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIHJlcG9fdmFyID0gdGsuU3RyaW5nVmFyKHZhbHVlPWNvbmZpZy5nZXQoJ1JFUE9TSVRPUlknLCBvcy5wYXRoLmJhc2VuYW1lKG9zLmdldGN3ZCgpKSkpCiAgICAgICAgdHRrLkVudHJ5KGZyYW1lLCB0ZXh0dmFyaWFibGU9cmVwb192YXIsIHdpZHRoPTMwKS5ncmlkKHJvdz0xLCBjb2x1bW49MSwgcGFkeT01LCBwYWR4PTEwKQogICAgICAgIHR0ay5MYWJlbChmcmFtZSwgdGV4dD0iT1MgVHlwZToiKS5ncmlkKHJvdz0yLCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBvc192YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9Y29uZmlnLmdldCgnT1NUWVBFJywgJ2RlYmlhbicpKQogICAgICAgIHR0ay5FbnRyeShmcmFtZSwgdGV4dHZhcmlhYmxlPW9zX3Zhciwgd2lkdGg9MzApLmdyaWQocm93PTIsIGNvbHVtbj0xLCBwYWR5PTUsIHBhZHg9MTApCiAgICAgICAgdHRrLkxhYmVsKGZyYW1lLCB0ZXh0PSJDb2RlbmFtZToiKS5ncmlkKHJvdz0zLCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBjb2RlbmFtZV92YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9Y29uZmlnLmdldCgnQ09ERU5BTUUnLCAnc3RhYmxlJykpCiAgICAgICAgdHRrLkVudHJ5KGZyYW1lLCB0ZXh0dmFyaWFibGU9Y29kZW5hbWVfdmFyLCB3aWR0aD0zMCkuZ3JpZChyb3c9MywgY29sdW1uPTEsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9IkNvbXBvbmVudDoiKS5ncmlkKHJvdz00LCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBjb21wb25lbnRfdmFyID0gdGsuU3RyaW5nVmFyKHZhbHVlPWNvbmZpZy5nZXQoJ0NPTVBPTkVOVCcsICdtYWluJykpCiAgICAgICAgdHRrLkVudHJ5KGZyYW1lLCB0ZXh0dmFyaWFibGU9Y29tcG9uZW50X3Zhciwgd2lkdGg9MzApLmdyaWQocm93PTQsIGNvbHVtbj0xLCBwYWR5PTUsIHBhZHg9MTApCiAgICAgICAgZGVmIHNhdmVfY29uZmlnKCk6CiAgICAgICAgICAgIGNvbmZpZ1snVVNFUk5BTUUnXSA9IHVzZXJuYW1lX3Zhci5nZXQoKQogICAgICAgICAgICBjb25maWdbJ1JFUE9TSVRPUlknXSA9IHJlcG9fdmFyLmdldCgpCiAgICAgICAgICAgIGNvbmZpZ1snT1NUWVBFJ10gPSBvc192YXIuZ2V0KCkKICAgICAgICAgICAgY29uZmlnWydDT0RFTkFNRSddID0gY29kZW5hbWVfdmFyLmdldCgpCiAgICAgICAgICAgIGNvbmZpZ1snQ09NUE9ORU5UJ10gPSBjb21wb25lbnRfdmFyLmdldCgpCiAgICAgICAgICAgIHNhdmVfcmVwb19jb25maWcoY29uZmlnKQogICAgICAgICAgICByZXBvX3VybCA9IGYiZGViIGh0dHBzOi8ve2NvbmZpZ1snVVNFUk5BTUUnXX0uZ2l0aHViLmlvL3tjb25maWdbJ1JFUE9TSVRPUlknXX0ve2NvbmZpZ1snT1NUWVBFJ119IHtjb25maWdbJ0NPREVOQU1FJ119IHtjb25maWdbJ0NPTVBPTkVOVCddfSIKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93aW5mbygiU3VjY2VzcyIsIGYiQ29uZmlndXJhdGlvbiBzYXZlZCFcblxuUmVwb3NpdG9yeSBVUkw6XG57cmVwb191cmx9IikKICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQogICAgICAgIGJ0bl9mcmFtZSA9IHR0ay5GcmFtZShkaWFsb2cpCiAgICAgICAgYnRuX2ZyYW1lLnBhY2socGFkeT0yMCkKICAgICAgICB0dGsuQnV0dG9uKGJ0bl9mcmFtZSwgdGV4dD0iU2F2ZSIsIGNvbW1hbmQ9c2F2ZV9jb25maWcsIHdpZHRoPTEyKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0xMCkKICAgICAgICB0dGsuQnV0dG9uKGJ0bl9mcmFtZSwgdGV4dD0iQ2FuY2VsIiwgY29tbWFuZD1kaWFsb2cuZGVzdHJveSwgd2lkdGg9MTIpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQoKICAgIGRlZiBidWlsZF9yZXBvX2d1aShzZWxmKToKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoIi5naXQiKToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoIkVycm9yIiwgIk5vdCBpbiBhIGdpdCByZXBvc2l0b3J5LlxuUGxlYXNlIHJ1biB0aGlzIGNvbW1hbmQgZnJvbSB5b3VyIHJlcG9zaXRvcnkgZm9sZGVyLiIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvbmZpZyA9IGxvYWRfcmVwb19jb25maWcoKQogICAgICAgIGlmIG5vdCBjb25maWcuZ2V0KCdVU0VSTkFNRScpOgogICAgICAgICAgICBpZiBtZXNzYWdlYm94LmFza3llc25vKCJDb25maWd1cmUiLCAiUmVwb3NpdG9yeSBub3QgY29uZmlndXJlZC4gQ29uZmlndXJlIG5vdz8iKToKICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX3JlcG9fZ3VpKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIHNpZ24gPSBtZXNzYWdlYm94LmFza3llc25vKCJHUEcgU2lnbmluZyIsICJTaWduIHJlcG9zaXRvcnkgd2l0aCBHUEc/IikKICAgICAgICBzZWxmLnJ1bl9pbl90aHJlYWQoc2VsZi5fYnVpbGRfcmVwbywgc2lnbikKCiAgICBkZWYgX2J1aWxkX3JlcG8oc2VsZiwgc2lnbik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnVwZGF0ZV9zdGF0dXMoIkJ1aWxkaW5nIHJlcG9zaXRvcnkuLi4iKQogICAgICAgICAgICBidWlsZF9yZXBvc2l0b3J5KCkKICAgICAgICAgICAgc2VsZi51cGRhdGVfc3RhdHVzKCJSZWFkeSIpCiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2luZm8oIlN1Y2Nlc3MiLCAiUmVwb3NpdG9yeSBidWlsdCBzdWNjZXNzZnVsbHkhIikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHNlbGYudXBkYXRlX3N0YXR1cygiRXJyb3IiKQogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dlcnJvcigiRXJyb3IiLCBzdHIoZSkpCiAgICBkZWYgcHVzaF9yZXBvX2d1aShzZWxmKToKICAgICAgICBzZWxmLnJ1bl9pbl90aHJlYWQoc2VsZi5fcHVzaF9yZXBvKQoKICAgIGRlZiBfcHVzaF9yZXBvKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi51cGRhdGVfc3RhdHVzKCJQdXNoaW5nIHRvIEdpdEh1Yi4uLiIpCiAgICAgICAgICAgIHB1c2hfcmVwb3NpdG9yeSgpCiAgICAgICAgICAgIHNlbGYudXBkYXRlX3N0YXR1cygiUmVhZHkiKQogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dpbmZvKCJTdWNjZXNzIiwgIlB1c2hlZCB0byBHaXRIdWIgc3VjY2Vzc2Z1bGx5ISIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBzZWxmLnVwZGF0ZV9zdGF0dXMoIkVycm9yIikKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoIkVycm9yIiwgc3RyKGUpKQoKICAgIGRlZiBzaG93X2Fib3V0KHNlbGYpOgogICAgICAgIG1lc3NhZ2Vib3guc2hvd2luZm8oIkFib3V0IiwgIlJlcG9zaXRvcnkgTWFuYWdlciBNZW51IHYyLjEuOS1TUlxuQnk6IEFyaWUtU1I5MSIpCiAgICBkZWYgZXhpdF9hcHAoc2VsZik6CiAgICAgICAgaWYgbWVzc2FnZWJveC5hc2t5ZXNubygiRXhpdCIsICJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZXhpdD8iKToKICAgICAgICAgICAgc2VsZi5yb290LmRlc3Ryb3koKQoKZGVmIHNob3dfaGVscCgpOgogICAgaGVscF90ZXh0ID0gIiIiClsrXSBSZXBvc2l0b3J5IE1hbmFnZXIgYnkgQXJpZS1TUjkxClshXSBHb3RvIHlvdXIgcmVwb3NpdG9yeSBmb2xkZXIgZm9yIHJ1biAtLXJlcG8gb3IgLS1wdXNoIGNvbW1hbmQsIGNhdXNlIHJlcG8gc3RydWN0dXJlIHdpbGwgYnVpbHQgaW4gY3VycmV0IGRpcmVjdG9yeS4KClVzYWdlOiByZXBvLW1hbmFnZXIgW29wdGlvbnNdCgpPcHRpb25zOgogICAgLXMsIC0tc291cmNlICAgICAgICAgICAgICAgICAgOiBidWlsZCBzb3VyY2Ugb2YgZGViCiAgICAtZCwgLS1kZWIgICAgICAgICAgICAgICAgICAgICA6IGJ1aWxkIGRlYiBmcm9tIHNvdXJjZQogICAgLXIsIC0tcmVwbyAgICAgICAgICAgICAgICAgICAgOiBidWlsZCByZXBvc2l0b3J5IHRyZWUKICAgIC1wLCAtLXB1c2ggICAgICAgICAgICAgICAgICAgIDogcHVzaCByZXBvc2l0b3J5IHRvIGdpdGh1YgogICAgLXUsIC0tdXBkYXRlICAgICAgICAgICAgICAgICAgOiB1cGRhdGUgc291cmNlIHBhY2thZ2UKICAgIC1lLCAtLWVkaXQtZGViIDxmaWxlPiAgICAgICAgIDogZWRpdCBleGlzdGluZyBkZWIgZmlsZQogICAgLWIsIC0tdXBkYXRlLWJpbiAgICAgICAgICAgICAgOiB1cGRhdGUgYmluYXJ5IGluIGV4dHJhY3RlZCBkZWIKICAgIC1nLCAtLWd1aSAgICAgICAgICAgICAgICAgICAgIDogR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlCiAgICAtbSwgLS1tZW51ICAgICAgICAgICAgICAgICAgICA6IERpYWxvZyBHVUkKICAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgICAgIDogc2hvdyB0aGlzIGhlbHAgc2NyZWVuCiAgICAtdiwgLS12ZXJzaW9uICAgICAgICAgICAgICAgICA6IHNob3cgdGhlIHZlcnNpb24KCmZvciBtb3JlIGluZm8gdmlzaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9BcmllU1I5MS91c2VyOTEtcmVwbwoiIiIKICAgIHByaW50KGhlbHBfdGV4dCkKCmRlZiBzaG93X3ZlcnNpb24oKToKICAgICIiIk1lbmFtcGlsa2FuIHZlcnNpIiIiCiAgICBwcmludCgiMi4xLjktU1IiKQoKZGVmIG1haW4oKToKICAgIGVuc3VyZV9kaXJlY3RvcmllcygpCiAgICBpZiBsZW4oc3lzLmFyZ3YpIDwgMjoKICAgICAgICBzaG93X2hlbHAoKQogICAgICAgIHJldHVybgoKICAgIG9wdGlvbiA9IHN5cy5hcmd2WzFdCgogICAgaWYgb3B0aW9uIGluIFsnLXMnLCAnLS1zb3VyY2UnXToKICAgICAgICBidWlsZF9zb3VyY2UoKQogICAgZWxpZiBvcHRpb24gaW4gWyctZCcsICctLWRlYiddOgogICAgICAgIGJ1aWxkX2RlYigpCiAgICBlbGlmIG9wdGlvbiBpbiBbJy1yJywgJy0tcmVwbyddOgogICAgICAgIGJ1aWxkX3JlcG9zaXRvcnkoKQogICAgZWxpZiBvcHRpb24gaW4gWyctcCcsICctLXB1c2gnXToKICAgICAgICBwdXNoX3JlcG9zaXRvcnkoKQogICAgZWxpZiBvcHRpb24gaW4gWyctdScsICctLXVwZGF0ZSddOgogICAgICAgIHVwZGF0ZV9zb3VyY2UoKQogICAgZWxpZiBvcHRpb24gaW4gWyctZScsICctLWVkaXQtZGViJ106CiAgICAgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDI6CiAgICAgICAgICAgIGVkaXRfZGViKHN5cy5hcmd2WzJdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KCJQbGVhc2Ugc3BlY2lmeSBhIGRlYiBmaWxlIikKICAgICAgICAgICAgcHJpbnQoIlVzYWdlOiByZXBvLW1hbmFnZXIgLS1lZGl0LWRlYiA8ZmlsZS5kZWI+IikKICAgIGVsaWYgb3B0aW9uIGluIFsnLWInLCAnLS11cGRhdGUtYmluJ106CiAgICAgICAgdXBkYXRlX2JpbmFyeV9mcm9tX2RlYigpCiAgICBlbGlmIG9wdGlvbiBpbiBbJy12JywgJy0tdmVyc2lvbiddOgogICAgICAgIHNob3dfdmVyc2lvbigpCiAgICBlbGlmIG9wdGlvbiBpbiBbJy1nJywgJy0tZ3VpJ106CiAgICAgICAgaWYgVEtJTlRFUl9BVkFJTEFCTEU6CiAgICAgICAgICAgIHJvb3QgPSB0ay5UaygpCiAgICAgICAgICAgIGFwcCA9IFJlcG9NYW5hZ2VyR1VJKHJvb3QpCiAgICAgICAgICAgIHJvb3QubWFpbmxvb3AoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KCJbIV0gVGtpbnRlciBub3QgYXZhaWxhYmxlLiBJbnN0YWxsIHdpdGg6IHN1ZG8gYXB0IGluc3RhbGwgcHl0aG9uMy10ayIpCiAgICAgICAgICAgIHByaW50KCJbK10gSWYgeW91IHVzaW5nIHRlcm11eCB0cnk6IGFwdCBpbnN0YWxsIHB5dGhvbi10a2ludGVyIikKICAgICAgICAgICAgcHJpbnQoIlsqXSBVc2luZyBkaWFsb2cgbW9kZSIpCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKICAgICAgICAgICAgaWYgbm90IG9zLmVudmlyb24uZ2V0KCJESVNQTEFZIikgYW5kIERJQUxPR19BVkFJTEFCTEU6CiAgICAgICAgICAgICAgICBkaWFsb2dfbWVudSA9IERpYWxvZ01lbnUoKQogICAgICAgICAgICAgICAgZGlhbG9nX21lbnUucnVuKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50KCJbIV0gTmVpdGhlciBHVUkgb3IgRGlhbG9nIGF2YWlsYWJsZS4gUGxlYXNlIGluc3RhbGwgcmVxdWlyZWQgcGFja2FnZXMuIikKICAgIGVsaWYgb3B0aW9uIGluIFsnLW0nLCAnLS1tZW51J106CiAgICAgICAgaWYgRElBTE9HX0FWQUlMQUJMRToKICAgICAgICAgICAgZGlhbG9nX21lbnUgPSBEaWFsb2dNZW51KCkKICAgICAgICAgICAgZGlhbG9nX21lbnUucnVuKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludCgiWyFdIERpYWxvZyBub3QgYXZhaWxhYmxlLiBJbnN0YWxsIHdpdGg6IHN1ZG8gYXB0IGluc3RhbGwgcHl0aG9uMy1kaWFsb2ciKQogICAgICAgICAgICBwcmludCgiWytdIElmIHlvdSB1c2luZyB0ZXJtdXggdHJ5OiBhcHQgaW5zdGFsbCBweXRob24tZGlhbG9nIikKICAgIGVsc2U6CiAgICAgICAgc2hvd19oZWxwKCkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0cnk6CiAgICAgICAgbWFpbigpCiAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgcHJpbnQoIlxuWyFdIFByb2dyYW0gY2FuY2VsZWQuIikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmIlxuWyFdIEVycm9yOiB7ZX0iKQo="

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