IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQojIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiMgY3N2IHBhY2thZ2UgdW5pdCB0ZXN0cwoKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHVuaXR0ZXN0CmZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgY3N2CmltcG9ydCBnYwppbXBvcnQgaW8KZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKCmNsYXNzIFRlc3RfQ3N2KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICIiIgogICAgVGVzdCB0aGUgdW5kZXJseWluZyBDIGNzdiBwYXJzZXIgaW4gd2F5cyB0aGF0IGFyZSBub3QgYXBwcm9wcmlhdGUKICAgIGZyb20gdGhlIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlLiBGdXJ0aGVyIHRlc3RzIG9mIHRoaXMgbmF0dXJlIGFyZSBkb25lCiAgICBpbiBUZXN0RGlhbGVjdFJlZ2lzdHJ5LgogICAgIiIiCiAgICBkZWYgX3Rlc3RfYXJnX3ZhbGlkKHNlbGYsIGN0b3IsIGFyZyk6CiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgTm9uZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgYmFkX2F0dHIgPSAwKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBkZWxpbWl0ZXIgPSAwKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBkZWxpbWl0ZXIgPSAnWFgnKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgY3RvciwgYXJnLCAnZm9vJykKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgZGVsaW1pdGVyPU5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsIGRlbGltaXRlcj0xKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBxdW90ZWNoYXI9MSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgbGluZXRlcm1pbmF0b3I9Tm9uZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgbGluZXRlcm1pbmF0b3I9MSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgcXVvdGluZz1Ob25lKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX0FMTCwgcXVvdGVjaGFyPScnKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX0FMTCwgcXVvdGVjaGFyPU5vbmUpCgogICAgZGVmIHRlc3RfcmVhZGVyX2FyZ192YWxpZChzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2FyZ192YWxpZChjc3YucmVhZGVyLCBbXSkKCiAgICBkZWYgdGVzdF93cml0ZXJfYXJnX3ZhbGlkKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfYXJnX3ZhbGlkKGNzdi53cml0ZXIsIFN0cmluZ0lPKCkpCgogICAgZGVmIF90ZXN0X2RlZmF1bHRfYXR0cnMoc2VsZiwgY3RvciwgKmFyZ3MpOgogICAgICAgIG9iaiA9IGN0b3IoKmFyZ3MpCiAgICAgICAgIyBDaGVjayBkZWZhdWx0cwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QuZGVsaW1pdGVyLCAnLCcpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kb3VibGVxdW90ZSwgVHJ1ZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmVzY2FwZWNoYXIsIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5saW5ldGVybWluYXRvciwgIlxyXG4iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QucXVvdGVjaGFyLCAnIicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5xdW90aW5nLCBjc3YuUVVPVEVfTUlOSU1BTCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnNraXBpbml0aWFsc3BhY2UsIEZhbHNlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc3RyaWN0LCBGYWxzZSkKICAgICAgICAjIFRyeSBkZWxldGluZyBvciBjaGFuZ2luZyBhdHRyaWJ1dGVzICh0aGV5IGFyZSByZWFkLW9ubHkpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZWxhdHRyLCBvYmouZGlhbGVjdCwgJ2RlbGltaXRlcicpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBvYmouZGlhbGVjdCwgJ2RlbGltaXRlcicsICc6JykKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZGVsYXR0ciwgb2JqLmRpYWxlY3QsICdxdW90aW5nJykKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgb2JqLmRpYWxlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1b3RpbmcnLCBOb25lKQoKICAgIGRlZiB0ZXN0X3JlYWRlcl9hdHRycyhzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2RlZmF1bHRfYXR0cnMoY3N2LnJlYWRlciwgW10pCgogICAgZGVmIHRlc3Rfd3JpdGVyX2F0dHJzKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfZGVmYXVsdF9hdHRycyhjc3Yud3JpdGVyLCBTdHJpbmdJTygpKQoKICAgIGRlZiBfdGVzdF9rd19hdHRycyhzZWxmLCBjdG9yLCAqYXJncyk6CiAgICAgICAgIyBOb3cgdHJ5IHdpdGggYWx0ZXJuYXRlIG9wdGlvbnMKICAgICAgICBrd2FyZ3MgPSBkaWN0KGRlbGltaXRlcj0nOicsIGRvdWJsZXF1b3RlPUZhbHNlLCBlc2NhcGVjaGFyPSdcXCcsCiAgICAgICAgICAgICAgICAgICAgICBsaW5ldGVybWluYXRvcj0nXHInLCBxdW90ZWNoYXI9JyonLAogICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9ORSwgc2tpcGluaXRpYWxzcGFjZT1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgc3RyaWN0PVRydWUpCiAgICAgICAgb2JqID0gY3RvcigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kZWxpbWl0ZXIsICc6JykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmRvdWJsZXF1b3RlLCBGYWxzZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmVzY2FwZWNoYXIsICdcXCcpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5saW5ldGVybWluYXRvciwgIlxyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnF1b3RlY2hhciwgJyonKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QucXVvdGluZywgY3N2LlFVT1RFX05PTkUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBUcnVlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc3RyaWN0LCBUcnVlKQoKICAgIGRlZiB0ZXN0X3JlYWRlcl9rd19hdHRycyhzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2t3X2F0dHJzKGNzdi5yZWFkZXIsIFtdKQoKICAgIGRlZiB0ZXN0X3dyaXRlcl9rd19hdHRycyhzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2t3X2F0dHJzKGNzdi53cml0ZXIsIFN0cmluZ0lPKCkpCgogICAgZGVmIF90ZXN0X2RpYWxlY3RfYXR0cnMoc2VsZiwgY3RvciwgKmFyZ3MpOgogICAgICAgICMgTm93IHRyeSB3aXRoIGRpYWxlY3QtZGVyaXZlZCBvcHRpb25zCiAgICAgICAgY2xhc3MgZGlhbGVjdDoKICAgICAgICAgICAgZGVsaW1pdGVyPSctJwogICAgICAgICAgICBkb3VibGVxdW90ZT1GYWxzZQogICAgICAgICAgICBlc2NhcGVjaGFyPSdeJwogICAgICAgICAgICBsaW5ldGVybWluYXRvcj0nJCcKICAgICAgICAgICAgcXVvdGVjaGFyPScjJwogICAgICAgICAgICBxdW90aW5nPWNzdi5RVU9URV9BTEwKICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZT1UcnVlCiAgICAgICAgICAgIHN0cmljdD1GYWxzZQogICAgICAgIGFyZ3MgPSBhcmdzICsgKGRpYWxlY3QsKQogICAgICAgIG9iaiA9IGN0b3IoKmFyZ3MpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kZWxpbWl0ZXIsICctJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmRvdWJsZXF1b3RlLCBGYWxzZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmVzY2FwZWNoYXIsICdeJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmxpbmV0ZXJtaW5hdG9yLCAiJCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5xdW90ZWNoYXIsICcjJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnF1b3RpbmcsIGNzdi5RVU9URV9BTEwpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBUcnVlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc3RyaWN0LCBGYWxzZSkKCiAgICBkZWYgdGVzdF9yZWFkZXJfZGlhbGVjdF9hdHRycyhzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2RpYWxlY3RfYXR0cnMoY3N2LnJlYWRlciwgW10pCgogICAgZGVmIHRlc3Rfd3JpdGVyX2RpYWxlY3RfYXR0cnMoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9kaWFsZWN0X2F0dHJzKGNzdi53cml0ZXIsIFN0cmluZ0lPKCkpCgoKICAgIGRlZiBfd3JpdGVfdGVzdChzZWxmLCBmaWVsZHMsIGV4cGVjdCwgKiprd2FyZ3MpOgogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosICoqa3dhcmdzKQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coZmllbGRzKQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QgKyB3cml0ZXIuZGlhbGVjdC5saW5ldGVybWluYXRvcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3Rfd3JpdGVfYXJnX3ZhbGlkKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fd3JpdGVfdGVzdCwgTm9uZSwgJycpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdCgoKSwgJycpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbTm9uZV0sICciIicpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl93cml0ZV90ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIFtOb25lXSwgTm9uZSwgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FKQogICAgICAgICMgQ2hlY2sgdGhhdCBleGNlcHRpb25zIGFyZSBwYXNzZWQgdXAgdGhlIGNoYWluCiAgICAgICAgY2xhc3MgQmFkTGlzdDoKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMTA7CiAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKICAgICAgICAgICAgICAgIGlmIGkgPiAyOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzZWxmLl93cml0ZV90ZXN0LCBCYWRMaXN0KCksICcnKQogICAgICAgIGNsYXNzIEJhZEl0ZW06CiAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHNlbGYuX3dyaXRlX3Rlc3QsIFtCYWRJdGVtKCldLCAnJykKCiAgICBkZWYgdGVzdF93cml0ZV9iaWdmaWVsZChzZWxmKToKICAgICAgICAjIFRoaXMgZXhlcmNpc2VzIHRoZSBidWZmZXIgcmVhbGxvYyBmdW5jdGlvbmFsaXR5CiAgICAgICAgYmlnc3RyaW5nID0gJ1gnICogNTAwMDAKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFtiaWdzdHJpbmcsYmlnc3RyaW5nXSwgJyVzLCVzJyAlIFwKICAgICAgICAgICAgICAgICAgICAgICAgIChiaWdzdHJpbmcsIGJpZ3N0cmluZykpCgogICAgZGVmIHRlc3Rfd3JpdGVfcXVvdGluZyhzZWxmKToKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCxxJ10sICdhLDEsInAscSInKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV90ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIFsnYScsMSwncCxxJ10sICdhLDEscCxxJywKICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2EnLDEsJ3AscSddLCAnYSwxLCJwLHEiJywKICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTUlOSU1BTCkKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCxxJ10sICciYSIsMSwicCxxIicsCiAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTk5VTUVSSUMpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2EnLDEsJ3AscSddLCAnImEiLCIxIiwicCxxIicsCiAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX0FMTCkKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYVxuYicsMV0sICciYVxuYiIsIjEiJywKICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfQUxMKQoKICAgIGRlZiB0ZXN0X3dyaXRlX2VzY2FwZShzZWxmKToKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCxxJ10sICdhLDEsInAscSInLAogICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV90ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIFsnYScsMSwncCwicSInXSwgJ2EsMSwicCxcXCJxXFwiIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj1Ob25lLCBkb3VibGVxdW90ZT1GYWxzZSkKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCwicSInXSwgJ2EsMSwicCxcXCJxXFwiIicsCiAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIGRvdWJsZXF1b3RlID0gRmFsc2UpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJyIiIiInLAogICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnLCBxdW90aW5nID0gY3N2LlFVT1RFX01JTklNQUwpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJ1xcIicsCiAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIHF1b3RpbmcgPSBjc3YuUVVPVEVfTUlOSU1BTCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gRmFsc2UpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJ1xcIicsCiAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORSkKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCxxJ10sICdhLDEscFxcLHEnLAogICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnLCBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpCgogICAgZGVmIHRlc3Rfd3JpdGVyb3dzKHNlbGYpOgogICAgICAgIGNsYXNzIEJyb2tlbkZpbGU6CiAgICAgICAgICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgogICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcgogICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoQnJva2VuRmlsZSgpKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHdyaXRlci53cml0ZXJvd3MsIFtbJ2EnXV0pCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaikKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3cml0ZXIud3JpdGVyb3dzLCBOb25lKQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3dzKFtbJ2EnLCdiJ10sWydjJywnZCddXSkKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICJhLGJcclxuYyxkXHJcbiIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiBfcmVhZF90ZXN0KHNlbGYsIGlucHV0LCBleHBlY3QsICoqa3dhcmdzKToKICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKGlucHV0LCAqKmt3YXJncykKICAgICAgICByZXN1bHQgPSBsaXN0KHJlYWRlcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0KQoKICAgIGRlZiB0ZXN0X3JlYWRfb2RkaW5wdXRzKHNlbGYpOgogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbXSwgW10pCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnJ10sIFtbXV0pCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyciYWIiYyddLCBOb25lLCBzdHJpY3QgPSAxKQogICAgICAgICMgY2Fubm90IGhhbmRsZSBudWxsIGJ5dGVzIGZvciB0aGUgbW9tZW50CiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydhYlwwYyddLCBOb25lLCBzdHJpY3QgPSAxKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJyJhYiJjJ10sIFtbJ2FiYyddXSwgZG91YmxlcXVvdGUgPSAwKQoKICAgIGRlZiB0ZXN0X3JlYWRfZW9sKHNlbGYpOgogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYiddLCBbWydhJywnYiddXSkKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLGJcbiddLCBbWydhJywnYiddXSkKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLGJcclxuJ10sIFtbJ2EnLCdiJ11dKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYlxyJ10sIFtbJ2EnLCdiJ11dKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LCBbJ2EsYlxyYyxkJ10sIFtdKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LCBbJ2EsYlxuYyxkJ10sIFtdKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LCBbJ2EsYlxyXG5jLGQnXSwgW10pCgogICAgZGVmIHRlc3RfcmVhZF9lc2NhcGUoc2VsZik6CiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSxcXGIsYyddLCBbWydhJywgJ2InLCAnYyddXSwgZXNjYXBlY2hhcj0nXFwnKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYlxcLGMnXSwgW1snYScsICdiLGMnXV0sIGVzY2FwZWNoYXI9J1xcJykKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCJiXFwsYyInXSwgW1snYScsICdiLGMnXV0sIGVzY2FwZWNoYXI9J1xcJykKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCJiLFxcYyInXSwgW1snYScsICdiLGMnXV0sIGVzY2FwZWNoYXI9J1xcJykKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCJiLGNcXCIiJ10sIFtbJ2EnLCAnYixjIiddXSwgZXNjYXBlY2hhcj0nXFwnKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsImIsYyJcXCddLCBbWydhJywgJ2IsY1xcJ11dLCBlc2NhcGVjaGFyPSdcXCcpCgogICAgZGVmIHRlc3RfcmVhZF9xdW90aW5nKHNlbGYpOgogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJzEsIiwzLCIsNSddLCBbWycxJywgJywzLCcsICc1J11dKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJzEsIiwzLCIsNSddLCBbWycxJywgJyInLCAnMycsICciJywgJzUnXV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlY2hhcj1Ob25lLCBlc2NhcGVjaGFyPSdcXCcpCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnMSwiLDMsIiw1J10sIFtbJzEnLCAnIicsICczJywgJyInLCAnNSddXSwKICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9ORSwgZXNjYXBlY2hhcj0nXFwnKQogICAgICAgICMgd2lsbCB0aGlzIGZhaWwgd2hlcmUgbG9jYWxlIHVzZXMgY29tbWEgZm9yIGRlY2ltYWxzPwogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJywzLCI1Iiw3LjMsIDknXSwgW1snJywgMywgJzUnLCA3LjMsIDldXSwKICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9OTlVNRVJJQykKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWyciYVxuYiIsIDcnXSwgW1snYVxuYicsICcgNyddXSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydhYmMsMyddLCBbW11dLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX05PTk5VTUVSSUMpCgogICAgZGVmIHRlc3RfcmVhZF9iaWdmaWVsZChzZWxmKToKICAgICAgICAjIFRoaXMgZXhlcmNpc2VzIHRoZSBidWZmZXIgcmVhbGxvYyBmdW5jdGlvbmFsaXR5IGFuZCBmaWVsZCBzaXplCiAgICAgICAgIyBsaW1pdHMuCiAgICAgICAgbGltaXQgPSBjc3YuZmllbGRfc2l6ZV9saW1pdCgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaXplID0gNTAwMDAKICAgICAgICAgICAgYmlnc3RyaW5nID0gJ1gnICogc2l6ZQogICAgICAgICAgICBiaWdsaW5lID0gJyVzLCVzJyAlIChiaWdzdHJpbmcsIGJpZ3N0cmluZykKICAgICAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFtiaWdsaW5lXSwgW1tiaWdzdHJpbmcsIGJpZ3N0cmluZ11dKQogICAgICAgICAgICBjc3YuZmllbGRfc2l6ZV9saW1pdChzaXplKQogICAgICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoW2JpZ2xpbmVdLCBbW2JpZ3N0cmluZywgYmlnc3RyaW5nXV0pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3N2LmZpZWxkX3NpemVfbGltaXQoKSwgc2l6ZSkKICAgICAgICAgICAgY3N2LmZpZWxkX3NpemVfbGltaXQoc2l6ZS0xKQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgW2JpZ2xpbmVdLCBbXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuZmllbGRfc2l6ZV9saW1pdCwgTm9uZSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuZmllbGRfc2l6ZV9saW1pdCwgMSwgTm9uZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjc3YuZmllbGRfc2l6ZV9saW1pdChsaW1pdCkKCiAgICBkZWYgdGVzdF9yZWFkX2xpbmVudW0oc2VsZik6CiAgICAgICAgZm9yIHIgaW4gKGNzdi5yZWFkZXIoWydsaW5lLDEnLCAnbGluZSwyJywgJ2xpbmUsMyddKSwKICAgICAgICAgICAgICAgICAgY3N2LkRpY3RSZWFkZXIoWydsaW5lLDEnLCAnbGluZSwyJywgJ2xpbmUsMyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPVsnYScsICdiJywgJ2MnXSkpOgogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubGluZV9udW0sIDApCiAgICAgICAgICAgIHIubmV4dCgpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5saW5lX251bSwgMSkKICAgICAgICAgICAgci5uZXh0KCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmxpbmVfbnVtLCAyKQogICAgICAgICAgICByLm5leHQoKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubGluZV9udW0sIDMpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHIubmV4dCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmxpbmVfbnVtLCAzKQoKICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9xdW90ZWVkX25ld2xpbmVzKHNlbGYpOgogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmopCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd3JpdGVyLndyaXRlcm93cywgTm9uZSkKICAgICAgICAgICAgcm93cyA9IFtbJ2FcbmInLCdiJ10sWydjJywneFxyXG5kJ11dCiAgICAgICAgICAgIHdyaXRlci53cml0ZXJvd3Mocm93cykKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIGZvciBpLCByb3cgaW4gZW51bWVyYXRlKGNzdi5yZWFkZXIoZmlsZW9iaikpOgogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3csIHJvd3NbaV0pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKY2xhc3MgVGVzdERpYWxlY3RSZWdpc3RyeSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgdGVzdF9yZWdpc3RyeV9iYWRhcmdzKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2Lmxpc3RfZGlhbGVjdHMsIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuZ2V0X2RpYWxlY3QpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBjc3YuZ2V0X2RpYWxlY3QsIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBjc3YuZ2V0X2RpYWxlY3QsICJub25lc3VjaCIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YudW5yZWdpc3Rlcl9kaWFsZWN0KQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgY3N2LnVucmVnaXN0ZXJfZGlhbGVjdCwgTm9uZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QsICJub25lc3VjaCIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgTm9uZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWdpc3Rlcl9kaWFsZWN0LCBOb25lLCBOb25lKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlZ2lzdGVyX2RpYWxlY3QsICJub25lc3VjaCIsIDAsIDApCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgIm5vbmVzdWNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRhcmd1bWVudD1Ob25lKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlZ2lzdGVyX2RpYWxlY3QsICJub25lc3VjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1Ob25lKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlZ2lzdGVyX2RpYWxlY3QsIFtdKQoKICAgIGRlZiB0ZXN0X3JlZ2lzdHJ5KHNlbGYpOgogICAgICAgIGNsYXNzIG15ZXhjZWx0c3YoY3N2LmV4Y2VsKToKICAgICAgICAgICAgZGVsaW1pdGVyID0gIlx0IgogICAgICAgIG5hbWUgPSAibXlleGNlbHRzdiIKICAgICAgICBleHBlY3RlZF9kaWFsZWN0cyA9IGNzdi5saXN0X2RpYWxlY3RzKCkgKyBbbmFtZV0KICAgICAgICBleHBlY3RlZF9kaWFsZWN0cy5zb3J0KCkKICAgICAgICBjc3YucmVnaXN0ZXJfZGlhbGVjdChuYW1lLCBteWV4Y2VsdHN2KQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzdi5nZXRfZGlhbGVjdChuYW1lKS5kZWxpbWl0ZXIsICdcdCcpCiAgICAgICAgICAgIGdvdF9kaWFsZWN0cyA9IGNzdi5saXN0X2RpYWxlY3RzKCkKICAgICAgICAgICAgZ290X2RpYWxlY3RzLnNvcnQoKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2RpYWxlY3RzLCBnb3RfZGlhbGVjdHMpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY3N2LnVucmVnaXN0ZXJfZGlhbGVjdChuYW1lKQoKICAgIGRlZiB0ZXN0X3JlZ2lzdGVyX2t3YXJncyhzZWxmKToKICAgICAgICBuYW1lID0gJ2ZlZGNiYScKICAgICAgICBjc3YucmVnaXN0ZXJfZGlhbGVjdChuYW1lLCBkZWxpbWl0ZXI9JzsnKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzdi5nZXRfZGlhbGVjdChuYW1lKS5kZWxpbWl0ZXIsICdcdCcpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaXN0KGNzdi5yZWFkZXIoJ1g7WTtaJywgbmFtZSkpLCBbJ1gnLCAnWScsICdaJ10pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgY3N2LnVucmVnaXN0ZXJfZGlhbGVjdChuYW1lKQoKICAgIGRlZiB0ZXN0X2luY29tcGxldGVfZGlhbGVjdChzZWxmKToKICAgICAgICBjbGFzcyBteWV4Y2VsdHN2KGNzdi5EaWFsZWN0KToKICAgICAgICAgICAgZGVsaW1pdGVyID0gIlx0IgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlleGNlbHRzdikKCiAgICBkZWYgdGVzdF9zcGFjZV9kaWFsZWN0KHNlbGYpOgogICAgICAgIGNsYXNzIHNwYWNlKGNzdi5leGNlbCk6CiAgICAgICAgICAgIGRlbGltaXRlciA9ICIgIgogICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUKICAgICAgICAgICAgZXNjYXBlY2hhciA9ICJcXCIKCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoImFiYyBkZWZcbmMxY2NjY2MxIGJlbnplbmVcbiIpCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICByZHIgPSBjc3YucmVhZGVyKGZpbGVvYmosIGRpYWxlY3Q9c3BhY2UoKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZHIubmV4dCgpLCBbImFiYyIsICJkZWYiXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZHIubmV4dCgpLCBbImMxY2NjY2MxIiwgImJlbnplbmUiXSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3RfZGlhbGVjdF9hcHBseShzZWxmKToKICAgICAgICBjbGFzcyB0ZXN0QShjc3YuZXhjZWwpOgogICAgICAgICAgICBkZWxpbWl0ZXIgPSAiXHQiCiAgICAgICAgY2xhc3MgdGVzdEIoY3N2LmV4Y2VsKToKICAgICAgICAgICAgZGVsaW1pdGVyID0gIjoiCiAgICAgICAgY2xhc3MgdGVzdEMoY3N2LmV4Y2VsKToKICAgICAgICAgICAgZGVsaW1pdGVyID0gInwiCgogICAgICAgIGNzdi5yZWdpc3Rlcl9kaWFsZWN0KCd0ZXN0QycsIHRlc3RDKQogICAgICAgIHRyeToKICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaikKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQogICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMSwyLDNcclxuIikKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCB0ZXN0QSkKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQogICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMVx0Mlx0M1xyXG4iKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICAgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIGRpYWxlY3Q9dGVzdEIoKSkKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQogICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMToyOjNcclxuIikKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PSd0ZXN0QycpCiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coWzEsMiwzXSkKICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgIjF8MnwzXHJcbiIpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD10ZXN0QSwgZGVsaW1pdGVyPSc7JykKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQogICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMTsyOzNcclxuIikKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QoJ3Rlc3RDJykKCiAgICBkZWYgdGVzdF9iYWRfZGlhbGVjdChzZWxmKToKICAgICAgICAjIFVua25vd24gcGFyYW1ldGVyCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgYmFkX2F0dHIgPSAwKQogICAgICAgICMgQmFkIHZhbHVlcwogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIGRlbGltaXRlciA9IE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgcXVvdGluZyA9IC0xKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIHF1b3RpbmcgPSAxMDApCgpjbGFzcyBUZXN0Q3N2QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgcmVhZGVyQXNzZXJ0RXF1YWwoc2VsZiwgaW5wdXQsIGV4cGVjdGVkX3Jlc3VsdCk6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoaW5wdXQpCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKGZpbGVvYmosIGRpYWxlY3QgPSBzZWxmLmRpYWxlY3QpCiAgICAgICAgICAgIGZpZWxkcyA9IGxpc3QocmVhZGVyKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpZWxkcywgZXhwZWN0ZWRfcmVzdWx0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICBkZWYgd3JpdGVyQXNzZXJ0RXF1YWwoc2VsZiwgaW5wdXQsIGV4cGVjdGVkX3Jlc3VsdCk6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdCA9IHNlbGYuZGlhbGVjdCkKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93cyhpbnB1dCkKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkX3Jlc3VsdCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgpjbGFzcyBUZXN0RGlhbGVjdEV4Y2VsKFRlc3RDc3ZCYXNlKToKICAgIGRpYWxlY3QgPSAnZXhjZWwnCgogICAgZGVmIHRlc3Rfc2luZ2xlKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJ2FiYycsIFtbJ2FiYyddXSkKCiAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnMSwyLDMsNCw1JywgW1snMScsJzInLCczJywnNCcsJzUnXV0pCgogICAgZGVmIHRlc3RfYmxhbmtsaW5lKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJycsIFtdKQoKICAgIGRlZiB0ZXN0X2VtcHR5X2ZpZWxkcyhzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcsJywgW1snJywgJyddXSkKCiAgICBkZWYgdGVzdF9zaW5nbGVxdW90ZWQoc2VsZik6CiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnIiInLCBbWycnXV0pCgogICAgZGVmIHRlc3Rfc2luZ2xlcXVvdGVkX2xlZnRfZW1wdHkoc2VsZik6CiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnIiIsJywgW1snJywnJ11dKQoKICAgIGRlZiB0ZXN0X3NpbmdsZXF1b3RlZF9yaWdodF9lbXB0eShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcsIiInLCBbWycnLCcnXV0pCgogICAgZGVmIHRlc3Rfc2luZ2xlX3F1b3RlZF9xdW90ZShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCciIiIiJywgW1snIiddXSkKCiAgICBkZWYgdGVzdF9xdW90ZWRfcXVvdGVzKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyIiIiIiIicsIFtbJyIiJ11dKQoKICAgIGRlZiB0ZXN0X2lubGluZV9xdW90ZShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCdhIiJiJywgW1snYSIiYiddXSkKCiAgICBkZWYgdGVzdF9pbmxpbmVfcXVvdGVzKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJ2EiYiJjJywgW1snYSJiImMnXV0pCgogICAgZGVmIHRlc3RfcXVvdGVzX2FuZF9tb3JlKHNlbGYpOgogICAgICAgICMgRXhjZWwgd291bGQgbmV2ZXIgd3JpdGUgYSBmaWVsZCBjb250YWluaW5nICciYSJiJywgYnV0IHdoZW4KICAgICAgICAjIHJlYWRpbmcgb25lLCBpdCB3aWxsIHJldHVybiAnYWInLgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyJhImInLCBbWydhYiddXSkKCiAgICBkZWYgdGVzdF9sb25lX3F1b3RlKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJ2EiYicsIFtbJ2EiYiddXSkKCiAgICBkZWYgdGVzdF9xdW90ZV9hbmRfcXVvdGUoc2VsZik6CiAgICAgICAgIyBFeGNlbCB3b3VsZCBuZXZlciB3cml0ZSBhIGZpZWxkIGNvbnRhaW5pbmcgJyJhIiAiYiInLCBidXQgd2hlbgogICAgICAgICMgcmVhZGluZyBvbmUsIGl0IHdpbGwgcmV0dXJuICdhICJiIicuCiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnImEiICJiIicsIFtbJ2EgImIiJ11dKQoKICAgIGRlZiB0ZXN0X3NwYWNlX2FuZF9xdW90ZShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcgImEiJywgW1snICJhIiddXSkKCiAgICBkZWYgdGVzdF9xdW90ZWQoc2VsZik6CiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnMSwyLDMsIkkgdGhpbmssIHRoZXJlZm9yZSBJIGFtIiw1LDYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1snMScsICcyJywgJzMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSSB0aGluaywgdGhlcmVmb3JlIEkgYW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNScsICc2J11dKQoKICAgIGRlZiB0ZXN0X3F1b3RlZF9xdW90ZShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcxLDIsMywiIiJJIHNlZSwiIiBzYWlkIHRoZSBibGluZCBtYW4iLCJhcyBoZSBwaWNrZWQgdXAgaGlzIGhhbW1lciBhbmQgc2F3IicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWycxJywgJzInLCAnMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciSSBzZWUsIiBzYWlkIHRoZSBibGluZCBtYW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXMgaGUgcGlja2VkIHVwIGhpcyBoYW1tZXIgYW5kIHNhdyddXSkKCiAgICBkZWYgdGVzdF9xdW90ZWRfbmwoc2VsZik6CiAgICAgICAgaW5wdXQgPSAnJydcCjEsMiwzLCIiIkkgc2VlLCIiCnNhaWQgdGhlIGJsaW5kIG1hbiIsImFzIGhlIHBpY2tlZCB1cCBoaXMKaGFtbWVyIGFuZCBzYXciCjksOCw3LDYnJycKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1snMScsICcyJywgJzMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciSSBzZWUsIlxuc2FpZCB0aGUgYmxpbmQgbWFuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXMgaGUgcGlja2VkIHVwIGhpc1xuaGFtbWVyIGFuZCBzYXcnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJzknLCc4JywnNycsJzYnXV0pCgogICAgZGVmIHRlc3RfZHViaW91c19xdW90ZShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcxMiwxMiwxIiwnLCBbWycxMicsICcxMicsICcxIicsICcnXV0pCgogICAgZGVmIHRlc3RfbnVsbChzZWxmKToKICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtdLCAnJykKCiAgICBkZWYgdGVzdF9zaW5nbGVfd3JpdGVyKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1snYWJjJ11dLCAnYWJjXHJcbicpCgogICAgZGVmIHRlc3Rfc2ltcGxlX3dyaXRlcihzZWxmKToKICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtbMSwgMiwgJ2FiYycsIDMsIDRdXSwgJzEsMixhYmMsMyw0XHJcbicpCgogICAgZGVmIHRlc3RfcXVvdGVzKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1sxLCAyLCAnYSJiYyInLCAzLCA0XV0sICcxLDIsImEiImJjIiIiLDMsNFxyXG4nKQoKICAgIGRlZiB0ZXN0X3F1b3RlX2ZpZWxkc2VwKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1snYWJjLGRlZiddXSwgJyJhYmMsZGVmIlxyXG4nKQoKICAgIGRlZiB0ZXN0X25ld2xpbmVzKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1sxLCAyLCAnYVxuYmMnLCAzLCA0XV0sICcxLDIsImFcbmJjIiwzLDRcclxuJykKCmNsYXNzIEVzY2FwZWRFeGNlbChjc3YuZXhjZWwpOgogICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCiAgICBlc2NhcGVjaGFyID0gJ1xcJwoKY2xhc3MgVGVzdEVzY2FwZWRFeGNlbChUZXN0Q3N2QmFzZSk6CiAgICBkaWFsZWN0ID0gRXNjYXBlZEV4Y2VsKCkKCiAgICBkZWYgdGVzdF9lc2NhcGVfZmllbGRzZXAoc2VsZik6CiAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWydhYmMsZGVmJ11dLCAnYWJjXFwsZGVmXHJcbicpCgogICAgZGVmIHRlc3RfcmVhZF9lc2NhcGVfZmllbGRzZXAoc2VsZik6CiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnYWJjXFwsZGVmXHJcbicsIFtbJ2FiYyxkZWYnXV0pCgpjbGFzcyBRdW90ZWRFc2NhcGVkRXhjZWwoY3N2LmV4Y2VsKToKICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9OTlVNRVJJQwogICAgZXNjYXBlY2hhciA9ICdcXCcKCmNsYXNzIFRlc3RRdW90ZWRFc2NhcGVkRXhjZWwoVGVzdENzdkJhc2UpOgogICAgZGlhbGVjdCA9IFF1b3RlZEVzY2FwZWRFeGNlbCgpCgogICAgZGVmIHRlc3Rfd3JpdGVfZXNjYXBlX2ZpZWxkc2VwKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1snYWJjLGRlZiddXSwgJyJhYmMsZGVmIlxyXG4nKQoKICAgIGRlZiB0ZXN0X3JlYWRfZXNjYXBlX2ZpZWxkc2VwKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyJhYmNcXCxkZWYiXHJcbicsIFtbJ2FiYyxkZWYnXV0pCgpjbGFzcyBUZXN0RGljdEZpZWxkcyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAjIyMgImxvbmciIG1lYW5zIHRoZSByb3cgaXMgbG9uZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBmaWVsZG5hbWVzCiAgICAjIyMgInNob3J0IiBtZWFucyB0aGVyZSBhcmUgZmV3ZXIgZWxlbWVudHMgaW4gdGhlIHJvdyB0aGFuIGZpZWxkbmFtZXMKICAgIGRlZiB0ZXN0X3dyaXRlX3NpbXBsZV9kaWN0KHNlbGYpOgogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IGlvLm9wZW4oZmQsICd3K2InKQogICAgICAgIHRyeToKICAgICAgICAgICAgd3JpdGVyID0gY3N2LkRpY3RXcml0ZXIoZmlsZW9iaiwgZmllbGRuYW1lcyA9IFsiZjEiLCAiZjIiLCAiZjMiXSkKICAgICAgICAgICAgd3JpdGVyLndyaXRlaGVhZGVyKCkKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkbGluZSgpLCAiZjEsZjIsZjNcclxuIikKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHsiZjEiOiAxMCwgImYzIjogImFiYyJ9KQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgZmlsZW9iai5yZWFkbGluZSgpICMgaGVhZGVyCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICIxMCwsYWJjXHJcbiIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiB0ZXN0X3dyaXRlX25vX2ZpZWxkcyhzZWxmKToKICAgICAgICBmaWxlb2JqID0gU3RyaW5nSU8oKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LkRpY3RXcml0ZXIsIGZpbGVvYmopCgogICAgZGVmIHRlc3RfcmVhZF9kaWN0X2ZpZWxkcyhzZWxmKToKICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiMSwyLGFiY1xyXG4iKQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZmlsZW9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz1bImYxIiwgImYyIiwgImYzIl0pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJmMSI6ICcxJywgImYyIjogJzInLCAiZjMiOiAnYWJjJ30pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiB0ZXN0X3JlYWRfZGljdF9ub19maWVsZG5hbWVzKHNlbGYpOgogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmaWxlb2JqLndyaXRlKCJmMSxmMixmM1xyXG4xLDIsYWJjXHJcbiIpCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmaWxlb2JqKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5maWVsZG5hbWVzLCBbImYxIiwgImYyIiwgImYzIl0pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJmMSI6ICcxJywgImYyIjogJzInLCAiZjMiOiAnYWJjJ30pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgICMgVHdvIHRlc3QgY2FzZXMgdG8gbWFrZSBzdXJlIGV4aXN0aW5nIHdheXMgb2YgaW1wbGljaXRseSBzZXR0aW5nCiAgICAjIGZpZWxkbmFtZXMgY29udGludWUgdG8gd29yay4gIEJvdGggYXJpc2UgZnJvbSBkaXNjdXNzaW9uIGluIGlzc3VlMzQzNi4KICAgIGRlZiB0ZXN0X3JlYWRfZGljdF9maWVsZG5hbWVzX2Zyb21fZmlsZShzZWxmKToKICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgIGYgPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQogICAgICAgIHRyeToKICAgICAgICAgICAgZi53cml0ZSgiZjEsZjIsZjNcclxuMSwyLGFiY1xyXG4iKQogICAgICAgICAgICBmLnNlZWsoMCkKICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZiwgZmllbGRuYW1lcz1jc3YucmVhZGVyKGYpLm5leHQoKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIuZmllbGRuYW1lcywgWyJmMSIsICJmMiIsICJmMyJdKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywgImYzIjogJ2FiYyd9KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICBkZWYgdGVzdF9yZWFkX2RpY3RfZmllbGRuYW1lc19jaGFpbihzZWxmKToKICAgICAgICBpbXBvcnQgaXRlcnRvb2xzCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGYud3JpdGUoImYxLGYyLGYzXHJcbjEsMixhYmNcclxuIikKICAgICAgICAgICAgZi5zZWVrKDApCiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGYpCiAgICAgICAgICAgIGZpcnN0ID0gbmV4dChyZWFkZXIpCiAgICAgICAgICAgIGZvciByb3cgaW4gaXRlcnRvb2xzLmNoYWluKFtmaXJzdF0sIHJlYWRlcik6CiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5maWVsZG5hbWVzLCBbImYxIiwgImYyIiwgImYzIl0pCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdywgeyJmMSI6ICcxJywgImYyIjogJzInLCAiZjMiOiAnYWJjJ30pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiB0ZXN0X3JlYWRfbG9uZyhzZWxmKToKICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiMSwyLGFiYyw0LDUsNlxyXG4iKQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZmlsZW9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz1bImYxIiwgImYyIl0pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJmMSI6ICcxJywgImYyIjogJzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lOiBbImFiYyIsICI0IiwgIjUiLCAiNiJdfSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3RfcmVhZF9sb25nX3dpdGhfcmVzdChzZWxmKToKICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiMSwyLGFiYyw0LDUsNlxyXG4iKQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZmlsZW9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz1bImYxIiwgImYyIl0sIHJlc3RrZXk9Il9yZXN0IikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImYxIjogJzEnLCAiZjIiOiAnMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfcmVzdCI6IFsiYWJjIiwgIjQiLCAiNSIsICI2Il19KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICBkZWYgdGVzdF9yZWFkX2xvbmdfd2l0aF9yZXN0X25vX2ZpZWxkbmFtZXMoc2VsZik6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoImYxLGYyXHJcbjEsMixhYmMsNCw1LDZcclxuIikKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosIHJlc3RrZXk9Il9yZXN0IikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIuZmllbGRuYW1lcywgWyJmMSIsICJmMiJdKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9yZXN0IjogWyJhYmMiLCAiNCIsICI1IiwgIjYiXX0pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiB0ZXN0X3JlYWRfc2hvcnQoc2VsZik6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoIjEsMixhYmMsNCw1LDZcclxuMSwyLGFiY1xyXG4iKQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZmlsZW9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz0iMSAyIDMgNCA1IDYiLnNwbGl0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3R2YWw9IkRFRkFVTFQiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiMSI6ICcxJywgIjIiOiAnMicsICIzIjogJ2FiYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiMSI6ICcxJywgIjIiOiAnMicsICIzIjogJ2FiYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJ0RFRkFVTFQnLCAiNSI6ICdERUZBVUxUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYiOiAnREVGQVVMVCd9KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICBkZWYgdGVzdF9yZWFkX211bHRpKHNlbGYpOgogICAgICAgIHNhbXBsZSA9IFsKICAgICAgICAgICAgJzIxNDc0ODM2NDgsNDMuMGUxMiwxNyxhYmMsZGVmXHJcbicsCiAgICAgICAgICAgICcxNDc0ODM2NDgsNDMuMGUyLDE3LGFiYyxkZWZcclxuJywKICAgICAgICAgICAgJzQ3NDgzNjQ4LDQzLjAsMTcwLGFiYyxkZWZcclxuJwogICAgICAgICAgICBdCgogICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKHNhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPSJpMSBmbG9hdCBpMiBzMSBzMiIuc3BsaXQoKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiaTEiOiAnMjE0NzQ4MzY0OCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IjogJzQzLjBlMTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMiI6ICcxNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInMxIjogJ2FiYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInMyIjogJ2RlZid9KQoKICAgIGRlZiB0ZXN0X3JlYWRfd2l0aF9ibGFua3Moc2VsZik6CiAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoWyIxLDIsYWJjLDQsNSw2XHJcbiIsIlxyXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSwyLGFiYyw0LDUsNlxyXG4iXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPSIxIDIgMyA0IDUgNiIuc3BsaXQoKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiMSI6ICcxJywgIjIiOiAnMicsICIzIjogJ2FiYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiOiAnNCcsICI1IjogJzUnLCAiNiI6ICc2J30pCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7IjEiOiAnMScsICIyIjogJzInLCAiMyI6ICdhYmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQoKICAgIGRlZiB0ZXN0X3JlYWRfc2VtaV9zZXAoc2VsZik6CiAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoWyIxOzI7YWJjOzQ7NTs2XHJcbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkbmFtZXM9IjEgMiAzIDQgNSA2Ii5zcGxpdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcj0nOycpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7IjEiOiAnMScsICIyIjogJzInLCAiMyI6ICdhYmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQoKY2xhc3MgVGVzdEFycmF5V3JpdGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2ludF93cml0ZShzZWxmKToKICAgICAgICBpbXBvcnQgYXJyYXkKICAgICAgICBjb250ZW50cyA9IFsoMjAtaSkgZm9yIGkgaW4gcmFuZ2UoMjApXQogICAgICAgIGEgPSBhcnJheS5hcnJheSgnaScsIGNvbnRlbnRzKQoKICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQogICAgICAgIHRyeToKICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PSJleGNlbCIpCiAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhhKQogICAgICAgICAgICBleHBlY3RlZCA9ICIsIi5qb2luKFtzdHIoaSkgZm9yIGkgaW4gYV0pKyJcclxuIgogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgZXhwZWN0ZWQpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiB0ZXN0X2RvdWJsZV93cml0ZShzZWxmKToKICAgICAgICBpbXBvcnQgYXJyYXkKICAgICAgICBjb250ZW50cyA9IFsoMjAtaSkqMC4xIGZvciBpIGluIHJhbmdlKDIwKV0KICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ2QnLCBjb250ZW50cykKICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQogICAgICAgIHRyeToKICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PSJleGNlbCIpCiAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhhKQogICAgICAgICAgICBleHBlY3RlZCA9ICIsIi5qb2luKFtzdHIoaSkgZm9yIGkgaW4gYV0pKyJcclxuIgogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgZXhwZWN0ZWQpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiB0ZXN0X2Zsb2F0X3dyaXRlKHNlbGYpOgogICAgICAgIGltcG9ydCBhcnJheQogICAgICAgIGNvbnRlbnRzID0gWygyMC1pKSowLjEgZm9yIGkgaW4gcmFuZ2UoMjApXQogICAgICAgIGEgPSBhcnJheS5hcnJheSgnZicsIGNvbnRlbnRzKQogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIGRpYWxlY3Q9ImV4Y2VsIikKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGEpCiAgICAgICAgICAgIGV4cGVjdGVkID0gIiwiLmpvaW4oW3N0cihpKSBmb3IgaSBpbiBhXSkrIlxyXG4iCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3RfY2hhcl93cml0ZShzZWxmKToKICAgICAgICBpbXBvcnQgYXJyYXksIHN0cmluZwogICAgICAgIGEgPSBhcnJheS5hcnJheSgnYycsIHN0cmluZy5sZXR0ZXJzKQogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIGRpYWxlY3Q9ImV4Y2VsIikKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGEpCiAgICAgICAgICAgIGV4cGVjdGVkID0gIiwiLmpvaW4oYSkrIlxyXG4iCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgpjbGFzcyBUZXN0RGlhbGVjdFZhbGlkaXR5KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X3F1b3Rpbmcoc2VsZik6CiAgICAgICAgY2xhc3MgbXlkaWFsZWN0KGNzdi5EaWFsZWN0KToKICAgICAgICAgICAgZGVsaW1pdGVyID0gIjsiCiAgICAgICAgICAgIGVzY2FwZWNoYXIgPSAnXFwnCiAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gRmFsc2UKICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IFRydWUKICAgICAgICAgICAgbGluZXRlcm1pbmF0b3IgPSAnXHJcbicKICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCiAgICAgICAgZCA9IG15ZGlhbGVjdCgpCgogICAgICAgIG15ZGlhbGVjdC5xdW90aW5nID0gTm9uZQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQoKICAgICAgICBteWRpYWxlY3QuZG91YmxlcXVvdGUgPSBUcnVlCiAgICAgICAgbXlkaWFsZWN0LnF1b3RpbmcgPSBjc3YuUVVPVEVfQUxMCiAgICAgICAgbXlkaWFsZWN0LnF1b3RlY2hhciA9ICciJwogICAgICAgIGQgPSBteWRpYWxlY3QoKQoKICAgICAgICBteWRpYWxlY3QucXVvdGVjaGFyID0gIicnIgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQoKICAgICAgICBteWRpYWxlY3QucXVvdGVjaGFyID0gNAogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQoKICAgIGRlZiB0ZXN0X2RlbGltaXRlcihzZWxmKToKICAgICAgICBjbGFzcyBteWRpYWxlY3QoY3N2LkRpYWxlY3QpOgogICAgICAgICAgICBkZWxpbWl0ZXIgPSAiOyIKICAgICAgICAgICAgZXNjYXBlY2hhciA9ICdcXCcKICAgICAgICAgICAgZG91YmxlcXVvdGUgPSBGYWxzZQogICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlID0gVHJ1ZQogICAgICAgICAgICBsaW5ldGVybWluYXRvciA9ICdcclxuJwogICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUKICAgICAgICBkID0gbXlkaWFsZWN0KCkKCiAgICAgICAgbXlkaWFsZWN0LmRlbGltaXRlciA9ICI6OjoiCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBteWRpYWxlY3QpCgogICAgICAgIG15ZGlhbGVjdC5kZWxpbWl0ZXIgPSA0CiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBteWRpYWxlY3QpCgogICAgZGVmIHRlc3RfbGluZXRlcm1pbmF0b3Ioc2VsZik6CiAgICAgICAgY2xhc3MgbXlkaWFsZWN0KGNzdi5EaWFsZWN0KToKICAgICAgICAgICAgZGVsaW1pdGVyID0gIjsiCiAgICAgICAgICAgIGVzY2FwZWNoYXIgPSAnXFwnCiAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gRmFsc2UKICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IFRydWUKICAgICAgICAgICAgbGluZXRlcm1pbmF0b3IgPSAnXHJcbicKICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCiAgICAgICAgZCA9IG15ZGlhbGVjdCgpCgogICAgICAgIG15ZGlhbGVjdC5saW5ldGVybWluYXRvciA9ICI6OjoiCiAgICAgICAgZCA9IG15ZGlhbGVjdCgpCgogICAgICAgIG15ZGlhbGVjdC5saW5ldGVybWluYXRvciA9IDQKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIG15ZGlhbGVjdCkKCgpjbGFzcyBUZXN0U25pZmZlcih1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBzYW1wbGUxID0gIiIiXApIYXJyeSdzLCBBcmxpbmd0b24gSGVpZ2h0cywgSUwsIDIvMS8wMywgS2ltaSBIYXllcwpTaGFyayBDaXR5LCBHbGVuZGFsZSBIZWlnaHRzLCBJTCwgMTIvMjgvMDIsIFByZXplbmNlClRvbW15J3MgUGxhY2UsIEJsdWUgSXNsYW5kLCBJTCwgMTIvMjgvMDIsIEJsdWUgU3VuZGF5L1doaXRlIENyb3cKU3RvbmVjdXR0ZXJzIFNlYWZvb2QgYW5kIENob3AgSG91c2UsIExlbW9udCwgSUwsIDEyLzE5LzAyLCBXZWVrIEJhY2sKIiIiCiAgICBzYW1wbGUyID0gIiIiXAonSGFycnknJ3MnOidBcmxpbmd0b24gSGVpZ2h0cyc6J0lMJzonMi8xLzAzJzonS2ltaSBIYXllcycKJ1NoYXJrIENpdHknOidHbGVuZGFsZSBIZWlnaHRzJzonSUwnOicxMi8yOC8wMic6J1ByZXplbmNlJwonVG9tbXknJ3MgUGxhY2UnOidCbHVlIElzbGFuZCc6J0lMJzonMTIvMjgvMDInOidCbHVlIFN1bmRheS9XaGl0ZSBDcm93JwonU3RvbmVjdXR0ZXJzICcnU2VhZm9vZCcnIGFuZCBDaG9wIEhvdXNlJzonTGVtb250JzonSUwnOicxMi8xOS8wMic6J1dlZWsgQmFjaycKIiIiCiAgICBoZWFkZXIgPSAnJydcCiJ2ZW51ZSIsImNpdHkiLCJzdGF0ZSIsImRhdGUiLCJwZXJmb3JtZXJzIgonJycKICAgIHNhbXBsZTMgPSAnJydcCjA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzCjA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzCjA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzCicnJwoKICAgIHNhbXBsZTQgPSAnJydcCjIxNDc0ODM2NDg7NDMuMGUxMjsxNzthYmM7ZGVmCjE0NzQ4MzY0ODs0My4wZTI7MTc7YWJjO2RlZgo0NzQ4MzY0ODs0My4wOzE3MDthYmM7ZGVmCicnJwoKICAgIHNhbXBsZTUgPSAiYWFhXHRiYmJcclxuQUFBXHRcclxuQkJCXHRcclxuIgogICAgc2FtcGxlNiA9ICJhfGJ8Y1xyXG5kfGV8ZlxyXG4iCiAgICBzYW1wbGU3ID0gIidhJ3wnYid8J2MnXHJcbidkJ3xlfGZcclxuIgoKICAgIGRlZiB0ZXN0X2hhc19oZWFkZXIoc2VsZik6CiAgICAgICAgc25pZmZlciA9IGNzdi5TbmlmZmVyKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuaWZmZXIuaGFzX2hlYWRlcihzZWxmLnNhbXBsZTEpLCBGYWxzZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuaWZmZXIuaGFzX2hlYWRlcihzZWxmLmhlYWRlcitzZWxmLnNhbXBsZTEpLCBUcnVlKQoKICAgIGRlZiB0ZXN0X3NuaWZmKHNlbGYpOgogICAgICAgIHNuaWZmZXIgPSBjc3YuU25pZmZlcigpCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUxKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICIsIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QucXVvdGVjaGFyLCAnIicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LnNraXBpbml0aWFsc3BhY2UsIFRydWUpCgogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlMikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiOiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LnF1b3RlY2hhciwgIiciKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBGYWxzZSkKCiAgICBkZWYgdGVzdF9kZWxpbWl0ZXJzKHNlbGYpOgogICAgICAgIHNuaWZmZXIgPSBjc3YuU25pZmZlcigpCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUzKQogICAgICAgICMgZ2l2ZW4gdGhhdCBhbGwgdGhyZWUgbGluZXMgaW4gc2FtcGxlMyBhcmUgZXF1YWwsCiAgICAgICAgIyBJIHRoaW5rIHRoYXQgYW55IGNoYXJhY3RlciBjb3VsZCBoYXZlIGJlZW4gJ2d1ZXNzZWQnIGFzIHRoZQogICAgICAgICMgZGVsaW1pdGVyLCBkZXBlbmRpbmcgb24gZGljdGlvbmFyeSBvcmRlcgogICAgICAgIHNlbGYuYXNzZXJ0SW4oZGlhbGVjdC5kZWxpbWl0ZXIsIHNlbGYuc2FtcGxlMykKICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTMsIGRlbGltaXRlcnM9Ij8sIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiPyIpCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUzLCBkZWxpbWl0ZXJzPSIvLCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgIi8iKQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlNCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiOyIpCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU1KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICJcdCIpCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU2KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICJ8IikKICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTcpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgInwiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5xdW90ZWNoYXIsICInIikKCiAgICBkZWYgdGVzdF9kb3VibGVxdW90ZShzZWxmKToKICAgICAgICBzbmlmZmVyID0gY3N2LlNuaWZmZXIoKQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuaGVhZGVyKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZGlhbGVjdC5kb3VibGVxdW90ZSkKICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxlY3QuZG91YmxlcXVvdGUpCgppZiBub3QgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CiAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZTogcHJpbnQgIioqKiBza2lwcGluZyBsZWFrYWdlIHRlc3RzICoqKiIKZWxzZToKICAgIGNsYXNzIE5VTDoKICAgICAgICBkZWYgd3JpdGUocywgKmFyZ3MpOgogICAgICAgICAgICBwYXNzCiAgICAgICAgd3JpdGVsaW5lcyA9IHdyaXRlCgogICAgY2xhc3MgVGVzdExlYWtzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICBkZWYgdGVzdF9jcmVhdGVfcmVhZChzZWxmKToKICAgICAgICAgICAgZGVsdGEgPSAwCiAgICAgICAgICAgIGxhc3RyYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToKICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5nYXJiYWdlLCBbXSkKICAgICAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQogICAgICAgICAgICAgICAgY3N2LnJlYWRlcihbImEsYixjXHJcbiJdKQogICAgICAgICAgICAgICAgY3N2LnJlYWRlcihbImEsYixjXHJcbiJdKQogICAgICAgICAgICAgICAgY3N2LnJlYWRlcihbImEsYixjXHJcbiJdKQogICAgICAgICAgICAgICAgZGVsdGEgPSByYy1sYXN0cmMKICAgICAgICAgICAgICAgIGxhc3RyYyA9IHJjCiAgICAgICAgICAgICMgaWYgY3N2LnJlYWRlcigpIGxlYWtzLCBsYXN0IGRlbHRhIHNob3VsZCBiZSAzIG9yIG1vcmUKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDMsIFRydWUpCgogICAgICAgIGRlZiB0ZXN0X2NyZWF0ZV93cml0ZShzZWxmKToKICAgICAgICAgICAgZGVsdGEgPSAwCiAgICAgICAgICAgIGxhc3RyYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKICAgICAgICAgICAgcyA9IE5VTCgpCiAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMCk6CiAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCiAgICAgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKICAgICAgICAgICAgICAgIGNzdi53cml0ZXIocykKICAgICAgICAgICAgICAgIGNzdi53cml0ZXIocykKICAgICAgICAgICAgICAgIGNzdi53cml0ZXIocykKICAgICAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCiAgICAgICAgICAgICAgICBsYXN0cmMgPSByYwogICAgICAgICAgICAjIGlmIGNzdi53cml0ZXIoKSBsZWFrcywgbGFzdCBkZWx0YSBzaG91bGQgYmUgMyBvciBtb3JlCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVsdGEgPCAzLCBUcnVlKQoKICAgICAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgogICAgICAgICAgICBkZWx0YSA9IDAKICAgICAgICAgICAgcm93cyA9IFsiYSxiLGNcclxuIl0qNQogICAgICAgICAgICBsYXN0cmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCiAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMCk6CiAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCiAgICAgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKICAgICAgICAgICAgICAgIHJkciA9IGNzdi5yZWFkZXIocm93cykKICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcmRyOgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCiAgICAgICAgICAgICAgICBsYXN0cmMgPSByYwogICAgICAgICAgICAjIGlmIHJlYWRlciBsZWFrcyBkdXJpbmcgcmVhZCwgZGVsdGEgc2hvdWxkIGJlIDUgb3IgbW9yZQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlbHRhIDwgNSwgVHJ1ZSkKCiAgICAgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CiAgICAgICAgICAgIGRlbHRhID0gMAogICAgICAgICAgICByb3dzID0gW1sxLDIsM11dKjUKICAgICAgICAgICAgcyA9IE5VTCgpCiAgICAgICAgICAgIGxhc3RyYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToKICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5nYXJiYWdlLCBbXSkKICAgICAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQogICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihzKQogICAgICAgICAgICAgICAgZm9yIHJvdyBpbiByb3dzOgogICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhyb3cpCiAgICAgICAgICAgICAgICBkZWx0YSA9IHJjLWxhc3RyYwogICAgICAgICAgICAgICAgbGFzdHJjID0gcmMKICAgICAgICAgICAgIyBpZiB3cml0ZXIgbGVha3MgZHVyaW5nIHdyaXRlLCBsYXN0IGRlbHRhIHNob3VsZCBiZSA1IG9yIG1vcmUKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDUsIFRydWUpCgojIGNvbW1lbnRlZCBvdXQgZm9yIG5vdyAtIGNzdiBtb2R1bGUgZG9lc24ndCB5ZXQgc3VwcG9ydCBVbmljb2RlCiMjIGNsYXNzIFRlc3RVbmljb2RlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIyMgICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVhZChzZWxmKToKIyMgICAgICAgICBpbXBvcnQgY29kZWNzCiMjICAgICAgICAgZiA9IGNvZGVjcy5FbmNvZGVkRmlsZShTdHJpbmdJTygiTWFydGluIHZvbiBM9ndpcywiCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFyYyBBbmRy6SBMZW1idXJnLCIKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHdWlkbyB2YW4gUm9zc3VtLCIKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFu529pcyBQaW5hcmRcclxuIiksCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2VuY29kaW5nPSdpc28tODg1OS0xJykKIyMgICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKGYpCiMjICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJlYWRlciksIFtbdSJNYXJ0aW4gdm9uIEz2d2lzIiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ik1hcmMgQW5kcukgTGVtYnVyZyIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSJHdWlkbyB2YW4gUm9zc3VtIiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1IkZyYW7nb2lzIFBpbmFyZG4iXV0pCgpkZWYgdGVzdF9tYWluKCk6CiAgICBtb2QgPSBzeXMubW9kdWxlc1tfX25hbWVfX10KICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCiAgICAgICAgKltnZXRhdHRyKG1vZCwgbmFtZSkgZm9yIG5hbWUgaW4gZGlyKG1vZCkgaWYgbmFtZS5zdGFydHN3aXRoKCdUZXN0JyldCiAgICApCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgdGVzdF9tYWluKCkK