ZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL2Jhc2VodHRwLnB5IGIvTGliL2Rvcy04eDMvYmFzZWh0dHAucHkKaW5kZXggZWE1MDk1YS4uNDlmODk4NCAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvYmFzZWh0dHAucHkKKysrIGIvTGliL2Rvcy04eDMvYmFzZWh0dHAucHkKQEAgLTkzLDE5ICs5Myw3IEBACiAgICAgICAgICIiIk92ZXJyaWRlIHNlcnZlcl9iaW5kIHRvIHN0b3JlIHRoZSBzZXJ2ZXIgbmFtZS4iIiIKICAgICAgICAgU29ja2V0U2VydmVyLlRDUFNlcnZlci5zZXJ2ZXJfYmluZChzZWxmKQogICAgICAgICBob3N0LCBwb3J0ID0gc2VsZi5zb2NrZXQuZ2V0c29ja25hbWUoKQotICAgICAgICBpZiBub3QgaG9zdCBvciBob3N0ID09ICcwLjAuMC4wJzoKLSAgICAgICAgICAgIGhvc3QgPSBzb2NrZXQuZ2V0aG9zdG5hbWUoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBob3N0bmFtZSwgaG9zdG5hbWVzLCBob3N0YWRkcnMgPSBzb2NrZXQuZ2V0aG9zdGJ5YWRkcihob3N0KQotICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgotICAgICAgICAgICAgaG9zdG5hbWUgPSBob3N0Ci0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpZiAnLicgbm90IGluIGhvc3RuYW1lOgotICAgICAgICAgICAgICAgIGZvciBob3N0IGluIGhvc3RuYW1lczoKLSAgICAgICAgICAgICAgICAgICAgaWYgJy4nIGluIGhvc3Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSA9IGhvc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIHNlbGYuc2VydmVyX25hbWUgPSBob3N0bmFtZQorICAgICAgICBzZWxmLnNlcnZlcl9uYW1lID0gc29ja2V0LmdldGZxZG4oaG9zdCkKICAgICAgICAgc2VsZi5zZXJ2ZXJfcG9ydCA9IHBvcnQKIAogCkBAIC00MTgsMTYgKzQwNiw4IEBACiAKICAgICAgICAgIiIiCiAKLSAgICAgICAgKGhvc3QsIHBvcnQpID0gc2VsZi5jbGllbnRfYWRkcmVzcwotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBuYW1lLCBuYW1lcywgYWRkcmVzc2VzID0gc29ja2V0LmdldGhvc3RieWFkZHIoaG9zdCkKLSAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgbXNnOgotICAgICAgICAgICAgcmV0dXJuIGhvc3QKLSAgICAgICAgbmFtZXMuaW5zZXJ0KDAsIG5hbWUpCi0gICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgotICAgICAgICAgICAgaWYgJy4nIGluIG5hbWU6IHJldHVybiBuYW1lCi0gICAgICAgIHJldHVybiBuYW1lc1swXQotCisgICAgICAgIGhvc3QsIHBvcnQgPSBzZWxmLmNsaWVudF9hZGRyZXNzCisgICAgICAgIHJldHVybiBzb2NrZXQuZ2V0ZnFkbihob3N0KQogCiAgICAgIyBFc3NlbnRpYWxseSBzdGF0aWMgY2xhc3MgdmFyaWFibGVzCiAKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL2NnaWh0dHBzLnB5IGIvTGliL2Rvcy04eDMvY2dpaHR0cHMucHkKaW5kZXggZmEzMGNiZC4uNmEyNTlhMyAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvY2dpaHR0cHMucHkKKysrIGIvTGliL2Rvcy04eDMvY2dpaHR0cHMucHkKQEAgLTM1LDYgKzM1LDEwIEBACiAKICAgICAiIiIKIAorICAgICMgTWFrZSByZmlsZSB1bmJ1ZmZlcmVkIC0tIHdlIG5lZWQgdG8gcmVhZCBvbmUgbGluZSBhbmQgdGhlbiBwYXNzCisgICAgIyB0aGUgcmVzdCB0byBhIHN1YnByb2Nlc3MsIHNvIHdlIGNhbid0IHVzZSBidWZmZXJlZCBpbnB1dC4KKyAgICByYnVmc2l6ZSA9IDAKKwogICAgIGRlZiBkb19QT1NUKHNlbGYpOgogICAgICAgICAiIiJTZXJ2ZSBhIFBPU1QgcmVxdWVzdC4KIApkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvY29uZmlncGEucHkgYi9MaWIvZG9zLTh4My9jb25maWdwYS5weQppbmRleCAzOGE4NWY0Li5lNzYzNmI5IDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My9jb25maWdwYS5weQorKysgYi9MaWIvZG9zLTh4My9jb25maWdwYS5weQpAQCAtMzYsNiArMzYsOSBAQAogICAgIGhhc19zZWN0aW9uKHNlY3Rpb24pCiAgICAgICAgIHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBzZWN0aW9uIGV4aXN0cwogCisgICAgaGFzX29wdGlvbihzZWN0aW9uLCBvcHRpb24pCisgICAgICAgIHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvcHRpb24gZXhpc3RzIGluIHRoZSBnaXZlbiBzZWN0aW9uCisKICAgICBvcHRpb25zKHNlY3Rpb24pCiAgICAgICAgIHJldHVybiBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG5hbWVkIHNlY3Rpb24KIApAQCAtNjgsNiArNzEsMTggQEAKICAgICBnZXRib29sZWFuKHNlY3Rpb24sIG9wdGlvbnMpCiAgICAgICAgIGxpa2UgZ2V0KCksIGJ1dCBjb252ZXJ0IHZhbHVlIHRvIGEgYm9vbGVhbiAoY3VycmVudGx5IGRlZmluZWQgYXMgMCBvcgogICAgICAgICAxLCBvbmx5KQorCisgICAgcmVtb3ZlX3NlY3Rpb24oc2VjdGlvbikKKwlyZW1vdmUgdGhlIGdpdmVuIGZpbGUgc2VjdGlvbiBhbmQgYWxsIGl0cyBvcHRpb25zCisKKyAgICByZW1vdmVfb3B0aW9uKHNlY3Rpb24sIG9wdGlvbikKKwlyZW1vdmUgdGhlIGdpdmVuIG9wdGlvbiBmcm9tIHRoZSBnaXZlbiBzZWN0aW9uCisKKyAgICBzZXQoc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSkKKyAgICAgICAgc2V0IHRoZSBnaXZlbiBvcHRpb24KKworICAgIHdyaXRlKGZwKQorCXdyaXRlIHRoZSBjb25maWd1cmF0aW9uIHN0YXRlIGluIC5pbmkgZm9ybWF0CiAiIiIKIAogaW1wb3J0IHN5cwpAQCAtMjg2LDYgKzMwMSw2NCBAQAogICAgIGRlZiBvcHRpb254Zm9ybShzZWxmLCBvcHRpb25zdHIpOgogICAgICAgICByZXR1cm4gc3RyaW5nLmxvd2VyKG9wdGlvbnN0cikKIAorICAgIGRlZiBoYXNfb3B0aW9uKHNlbGYsIHNlY3Rpb24sIG9wdGlvbik6CisgICAgICAgICIiIkNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgZ2l2ZW4gb3B0aW9uIGluIGEgZ2l2ZW4gc2VjdGlvbi4iIiIKKyAgICAgICAgaWYgbm90IHNlY3Rpb24gb3Igc2VjdGlvbiA9PSAiREVGQVVMVCI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlZmF1bHRzLmhhc19rZXkob3B0aW9uKQorICAgICAgICBlbGlmIG5vdCBzZWxmLmhhc19zZWN0aW9uKHNlY3Rpb24pOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fc2VjdGlvbnNbc2VjdGlvbl0uaGFzX2tleShvcHRpb24pCisKKyAgICBkZWYgc2V0KHNlbGYsIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpOgorICAgICAgICAiIiJTZXQgYW4gb3B0aW9uLiIiIgorICAgICAgICBpZiBub3Qgc2VjdGlvbiBvciBzZWN0aW9uID09ICJERUZBVUxUIjoKKyAgICAgICAgICAgIHNlY3RkaWN0ID0gc2VsZi5fX2RlZmF1bHRzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VjdGRpY3QgPSBzZWxmLl9fc2VjdGlvbnNbc2VjdGlvbl0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBOb1NlY3Rpb25FcnJvcihzZWN0aW9uKQorICAgICAgICBzZWN0ZGljdFtvcHRpb25dID0gdmFsdWUKKworICAgIGRlZiB3cml0ZShzZWxmLCBmcCk6CisgICAgICAgICIiIldyaXRlIGFuIC5pbmktZm9ybWF0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIHN0YXRlLiIiIgorICAgICAgICBpZiBzZWxmLl9fZGVmYXVsdHM6CisgICAgICAgICAgICBmcC53cml0ZSgiW0RFRkFVTFRdXG4iKQorICAgICAgICAgICAgZm9yIChrZXksIHZhbHVlKSBpbiBzZWxmLl9fZGVmYXVsdHMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBmcC53cml0ZSgiJXMgPSAlc1xuIiAlIChrZXksIHZhbHVlKSkKKyAgICAgICAgICAgIGZwLndyaXRlKCJcbiIpCisgICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuc2VjdGlvbnMoKToKKyAgICAgICAgICAgIGZwLndyaXRlKCJbIiArIHNlY3Rpb24gKyAiXVxuIikKKyAgICAgICAgICAgIHNlY3RkaWN0ID0gc2VsZi5fX3NlY3Rpb25zW3NlY3Rpb25dCisgICAgICAgICAgICBmb3IgKGtleSwgdmFsdWUpIGluIHNlY3RkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYga2V5ID09ICJfX25hbWVfXyI6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZnAud3JpdGUoIiVzID0gJXNcbiIgJSAoa2V5LCB2YWx1ZSkpCisgICAgICAgICAgICBmcC53cml0ZSgiXG4iKQorCisgICAgZGVmIHJlbW92ZV9vcHRpb24oc2VsZiwgc2VjdGlvbiwgb3B0aW9uKToKKyAgICAgICAgIiIiUmVtb3ZlIGFuIG9wdGlvbi4iIiIKKyAgICAgICAgaWYgbm90IHNlY3Rpb24gb3Igc2VjdGlvbiA9PSAiREVGQVVMVCI6CisgICAgICAgICAgICBzZWN0ZGljdCA9IHNlbGYuX19kZWZhdWx0cworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlY3RkaWN0ID0gc2VsZi5fX3NlY3Rpb25zW3NlY3Rpb25dCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgTm9TZWN0aW9uRXJyb3Ioc2VjdGlvbikKKyAgICAgICAgZXhpc3RlZCA9IHNlY3RkaWN0Lmhhc19rZXkoa2V5KQorICAgICAgICBpZiBleGlzdGVkOgorICAgICAgICAgICAgZGVsIHNlY3RkaWN0W2tleV0KKyAgICAgICAgcmV0dXJuIGV4aXN0ZWQKKworICAgIGRlZiByZW1vdmVfc2VjdGlvbihzZWxmLCBzZWN0aW9uKToKKyAgICAgICAgIiIiUmVtb3ZlIGEgZmlsZSBzZWN0aW9uLiIiIgorICAgICAgICBpZiBzZWxmLl9fc2VjdGlvbnMuaGFzX2tleShzZWN0aW9uKToKKyAgICAgICAgICAgIGRlbCBzZWxmLl9fc2VjdGlvbnNbc2VjdGlvbl0KKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gMAorCiAgICAgIwogICAgICMgUmVndWxhciBleHByZXNzaW9ucyBmb3IgcGFyc2luZyBzZWN0aW9uIGhlYWRlcnMgYW5kIG9wdGlvbnMuICBOb3RlIGEKICAgICAjIHNsaWdodCBzZW1hbnRpYyBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgdmVyc2lvbiwgYmVjYXVzZSBvZiB0aGUgdXNlCkBAIC0zNTcsNyArNDMwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgbW8gPSBzZWxmLk9QVENSRS5tYXRjaChsaW5lKQogICAgICAgICAgICAgICAgICAgICBpZiBtbzoKICAgICAgICAgICAgICAgICAgICAgICAgIG9wdG5hbWUsIHZpLCBvcHR2YWwgPSBtby5ncm91cCgnb3B0aW9uJywgJ3ZpJywgJ3ZhbHVlJykKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdG5hbWUgPSBzdHJpbmcubG93ZXIob3B0bmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZpIGluICgnPScsICc6JykgYW5kICc7JyBpbiBvcHR2YWw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAnOycgaXMgYSBjb21tZW50IGRlbGltaXRlciBvbmx5IGlmIGl0IGZvbGxvd3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGEgc3BhY2luZyBjaGFyYWN0ZXIKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL211bHRpZmlsLnB5IGIvTGliL2Rvcy04eDMvbXVsdGlmaWwucHkKaW5kZXggY2M4ZjQzYy4uZTQzZDMzMSAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvbXVsdGlmaWwucHkKKysrIGIvTGliL2Rvcy04eDMvbXVsdGlmaWwucHkKQEAgLTMwLDcgKzMwLDggQEAKIGltcG9ydCBzeXMKIGltcG9ydCBzdHJpbmcKIAotRXJyb3IgPSAnbXVsdGlmaWxlLkVycm9yJworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKwlwYXNzCiAKIGNsYXNzIE11bHRpRmlsZToKIApkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvcG9zaXhmaWwucHkgYi9MaWIvZG9zLTh4My9wb3NpeGZpbC5weQppbmRleCAyZGIzN2UwLi5kMzU4ZGM0IDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My9wb3NpeGZpbC5weQorKysgYi9MaWIvZG9zLTh4My9wb3NpeGZpbC5weQpAQCAtMTc2LDcgKzE3Niw3IEBACiAgICAgICAgIGltcG9ydCBzeXMsIG9zCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ25ldGJzZDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcGVuYnNkMicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2QyJywgJ2ZyZWVic2QzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJlZWJzZDInLCAnZnJlZWJzZDMnLCAnZnJlZWJzZDQnLCAnZnJlZWJzZDUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdic2RvczInLCAnYnNkb3MzJywgJ2JzZG9zNCcpOgogICAgICAgICAgICAgZmxvY2sgPSBzdHJ1Y3QucGFjaygnbHh4eHhseHh4eGxoaCcsIFwKICAgICAgICAgICAgICAgICAgIGxfc3RhcnQsIGxfbGVuLCBvcy5nZXRwaWQoKSwgbF90eXBlLCBsX3doZW5jZSkgCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgaWYgJz8nIGluIGhvdzoKICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ25ldGJzZDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BlbmJzZDInLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJlZWJzZDInLCAnZnJlZWJzZDMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJlZWJzZDInLCAnZnJlZWJzZDMnLCAnZnJlZWJzZDQnLCAnZnJlZWJzZDUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnNkb3MyJywgJ2JzZG9zMycsICdic2RvczQnKToKICAgICAgICAgICAgICAgICBsX3N0YXJ0LCBsX2xlbiwgbF9waWQsIGxfdHlwZSwgbF93aGVuY2UgPSBcCiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC51bnBhY2soJ2x4eHh4bHh4eHhsaGgnLCBmbG9jaykKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Bvc2l4cGF0LnB5IGIvTGliL2Rvcy04eDMvcG9zaXhwYXQucHkKaW5kZXggMTRiOTI3MC4uZjdlMDE2MSAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvcG9zaXhwYXQucHkKKysrIGIvTGliL2Rvcy04eDMvcG9zaXhwYXQucHkKQEAgLTM0MiwzMCArMzQyLDI1IEBACiAKIGRlZiBub3JtcGF0aChwYXRoKToKICAgICAiIiJOb3JtYWxpemUgcGF0aCwgZWxpbWluYXRpbmcgZG91YmxlIHNsYXNoZXMsIGV0Yy4iIiIKKyAgICBpZiBwYXRoID09ICcnOgorICAgICAgICByZXR1cm4gJy4nCiAgICAgaW1wb3J0IHN0cmluZwotICAgICMgVHJlYXQgaW5pdGlhbCBzbGFzaGVzIHNwZWNpYWxseQotICAgIHNsYXNoZXMgPSAnJwotICAgIHdoaWxlIHBhdGhbOjFdID09ICcvJzoKLSAgICAgICAgc2xhc2hlcyA9IHNsYXNoZXMgKyAnLycKLSAgICAgICAgcGF0aCA9IHBhdGhbMTpdCi0gICAgY29tcHMgPSBzdHJpbmcuc3BsaXRmaWVsZHMocGF0aCwgJy8nKQotICAgIGkgPSAwCi0gICAgd2hpbGUgaSA8IGxlbihjb21wcyk6Ci0gICAgICAgIGlmIGNvbXBzW2ldID09ICcuJzoKLSAgICAgICAgICAgIGRlbCBjb21wc1tpXQotICAgICAgICAgICAgd2hpbGUgaSA8IGxlbihjb21wcykgYW5kIGNvbXBzW2ldID09ICcnOgotICAgICAgICAgICAgICAgIGRlbCBjb21wc1tpXQotICAgICAgICBlbGlmIGNvbXBzW2ldID09ICcuLicgYW5kIGkgPiAwIGFuZCBjb21wc1tpLTFdIG5vdCBpbiAoJycsICcuLicpOgotICAgICAgICAgICAgZGVsIGNvbXBzW2ktMTppKzFdCi0gICAgICAgICAgICBpID0gaS0xCi0gICAgICAgIGVsaWYgY29tcHNbaV0gPT0gJycgYW5kIGkgPiAwIGFuZCBjb21wc1tpLTFdIDw+ICcnOgotICAgICAgICAgICAgZGVsIGNvbXBzW2ldCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpID0gaSsxCi0gICAgIyBJZiB0aGUgcGF0aCBpcyBub3cgZW1wdHksIHN1YnN0aXR1dGUgJy4nCi0gICAgaWYgbm90IGNvbXBzIGFuZCBub3Qgc2xhc2hlczoKLSAgICAgICAgY29tcHMuYXBwZW5kKCcuJykKLSAgICByZXR1cm4gc2xhc2hlcyArIHN0cmluZy5qb2luZmllbGRzKGNvbXBzLCAnLycpCisgICAgaW5pdGlhbF9zbGFzaCA9IChwYXRoWzBdID09ICcvJykKKyAgICBjb21wcyA9IHN0cmluZy5zcGxpdChwYXRoLCAnLycpCisgICAgbmV3X2NvbXBzID0gW10KKyAgICBmb3IgY29tcCBpbiBjb21wczoKKyAgICAgICAgaWYgY29tcCBpbiAoJycsICcuJyk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiAoY29tcCAhPSAnLi4nIG9yIChub3QgaW5pdGlhbF9zbGFzaCBhbmQgbm90IG5ld19jb21wcykgb3IgCisgICAgICAgICAgICAgKG5ld19jb21wcyBhbmQgbmV3X2NvbXBzWy0xXSA9PSAnLi4nKSk6CisgICAgICAgICAgICBuZXdfY29tcHMuYXBwZW5kKGNvbXApCisgICAgICAgIGVsaWYgbmV3X2NvbXBzOgorICAgICAgICAgICAgbmV3X2NvbXBzLnBvcCgpCisgICAgY29tcHMgPSBuZXdfY29tcHMKKyAgICBwYXRoID0gc3RyaW5nLmpvaW4oY29tcHMsICcvJykKKyAgICBpZiBpbml0aWFsX3NsYXNoOgorICAgICAgICBwYXRoID0gJy8nICsgcGF0aAorICAgIHJldHVybiBwYXRoIG9yICcuJwogCiAKIGRlZiBhYnNwYXRoKHBhdGgpOgpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvc2ltcGxlaHQucHkgYi9MaWIvZG9zLTh4My9zaW1wbGVodC5weQppbmRleCA3MTI1NDEzLi44YTc3NzU4IDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My9zaW1wbGVodC5weQorKysgYi9MaWIvZG9zLTh4My9zaW1wbGVodC5weQpAQCAtMTUsNiArMTUsNyBAQAogaW1wb3J0IEJhc2VIVFRQU2VydmVyCiBpbXBvcnQgdXJsbGliCiBpbXBvcnQgY2dpCitpbXBvcnQgc2h1dGlsCiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCiAKQEAgLTE1MSwxMiArMTUyLDcgQEAKICAgICAgICAgdG8gY29weSBiaW5hcnkgZGF0YSBhcyB3ZWxsLgogCiAgICAgICAgICIiIgotCi0gICAgICAgIEJMT0NLU0laRSA9IDgxOTIKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIGRhdGEgPSBzb3VyY2UucmVhZChCTE9DS1NJWkUpCi0gICAgICAgICAgICBpZiBub3QgZGF0YTogYnJlYWsKLSAgICAgICAgICAgIG91dHB1dGZpbGUud3JpdGUoZGF0YSkKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKHNvdXJjZSwgb3V0cHV0ZmlsZSkKIAogICAgIGRlZiBndWVzc190eXBlKHNlbGYsIHBhdGgpOgogICAgICAgICAiIiJHdWVzcyB0aGUgdHlwZSBvZiBhIGZpbGUuCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9zb2NrZXRzZS5weSBiL0xpYi9kb3MtOHgzL3NvY2tldHNlLnB5CmluZGV4IDU1NjJmYjAuLmEyNjNmOGUgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3NvY2tldHNlLnB5CisrKyBiL0xpYi9kb3MtOHgzL3NvY2tldHNlLnB5CkBAIC00MTIsMTAgKzQxMiwyMCBAQAogCiAgICAgIiIiRGVmaW5lIHNlbGYucmZpbGUgYW5kIHNlbGYud2ZpbGUgZm9yIHN0cmVhbSBzb2NrZXRzLiIiIgogCisgICAgIyBEZWZhdWx0IGJ1ZmZlciBzaXplcyBmb3IgcmZpbGUsIHdmaWxlLgorICAgICMgV2UgZGVmYXVsdCByZmlsZSB0byBidWZmZXJlZCBiZWNhdXNlIG90aGVyd2lzZSBpdCBjb3VsZCBiZQorICAgICMgcmVhbGx5IHNsb3cgZm9yIGxhcmdlIGRhdGEgKGEgZ2V0YygpIGNhbGwgcGVyIGJ5dGUpOyB3ZSBtYWtlCisgICAgIyB3ZmlsZSB1bmJ1ZmZlcmVkIGJlY2F1c2UgKGEpIG9mdGVuIGFmdGVyIGEgd3JpdGUoKSB3ZSB3YW50IHRvCisgICAgIyByZWFkIGFuZCB3ZSBuZWVkIHRvIGZsdXNoIHRoZSBsaW5lOyAoYikgYmlnIHdyaXRlcyB0byB1bmJ1ZmZlcmVkCisgICAgIyBmaWxlcyBhcmUgdHlwaWNhbGx5IG9wdGltaXplZCBieSBzdGRpbyBldmVuIHdoZW4gYmlnIHJlYWRzCisgICAgIyBhcmVuJ3QuCisgICAgcmJ1ZnNpemUgPSAtMQorICAgIHdidWZzaXplID0gMAorCiAgICAgZGVmIHNldHVwKHNlbGYpOgogICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBzZWxmLnJlcXVlc3QKLSAgICAgICAgc2VsZi5yZmlsZSA9IHNlbGYuY29ubmVjdGlvbi5tYWtlZmlsZSgncmInLCAwKQotICAgICAgICBzZWxmLndmaWxlID0gc2VsZi5jb25uZWN0aW9uLm1ha2VmaWxlKCd3YicsIDApCisgICAgICAgIHNlbGYucmZpbGUgPSBzZWxmLmNvbm5lY3Rpb24ubWFrZWZpbGUoJ3JiJywgc2VsZi5yYnVmc2l6ZSkKKyAgICAgICAgc2VsZi53ZmlsZSA9IHNlbGYuY29ubmVjdGlvbi5tYWtlZmlsZSgnd2InLCBzZWxmLndidWZzaXplKQogCiAgICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICAgc2VsZi53ZmlsZS5mbHVzaCgpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9zcmVfY29tcC5weSBiL0xpYi9kb3MtOHgzL3NyZV9jb21wLnB5CmluZGV4IGZhMGNmMzcuLjk3YTU3ZTIgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3NyZV9jb21wLnB5CisrKyBiL0xpYi9kb3MtOHgzL3NyZV9jb21wLnB5CkBAIC01LDIyICs1LDE0IEBACiAjCiAjIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIGJ5IFNlY3JldCBMYWJzIEFCLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMKLSMgUG9ydGlvbnMgb2YgdGhpcyBlbmdpbmUgaGF2ZSBiZWVuIGRldmVsb3BlZCBpbiBjb29wZXJhdGlvbiB3aXRoCi0jIENOUkkuICBIZXdsZXR0LVBhY2thcmQgcHJvdmlkZWQgZnVuZGluZyBmb3IgMS42IGludGVncmF0aW9uIGFuZAotIyBvdGhlciBjb21wYXRpYmlsaXR5IHdvcmsuCisjIFNlZSB0aGUgc3JlLnB5IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbi4KICMKIAotaW1wb3J0IGFycmF5CiBpbXBvcnQgX3NyZQogCiBmcm9tIHNyZV9jb25zdGFudHMgaW1wb3J0ICoKIAotIyBmaW5kIGFuIGFycmF5IHR5cGUgY29kZSB0aGF0IG1hdGNoZXMgdGhlIGVuZ2luZSdzIGNvZGUgc2l6ZQotZm9yIFdPUkRTSVpFIGluICJCSGlsIjoKLSAgICBpZiBsZW4oYXJyYXkuYXJyYXkoV09SRFNJWkUsIFswXSkudG9zdHJpbmcoKSkgPT0gX3NyZS5nZXRjb2Rlc2l6ZSgpOgotICAgICAgICBicmVhawotZWxzZToKLSAgICByYWlzZSBSdW50aW1lRXJyb3IsICJjYW5ub3QgZmluZCBhIHVzYWJsZSBhcnJheSB0eXBlIgorTUFYQ09ERSA9IDY1NTM1CiAKIGRlZiBfY29tcGlsZShjb2RlLCBwYXR0ZXJuLCBmbGFncyk6CiAgICAgIyBpbnRlcm5hbDogY29tcGlsZSBhIChzdWIpcGF0dGVybgpAQCAtNDEsMzQgKzMzLDE2IEBACiAgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW29wXSkKICAgICAgICAgICAgICAgICBmaXh1cCA9IGxhbWJkYSB4OiB4CiAgICAgICAgICAgICBza2lwID0gbGVuKGNvZGUpOyBlbWl0KDApCi0gICAgICAgICAgICBmb3Igb3AsIGF2IGluIGF2OgotICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCi0gICAgICAgICAgICAgICAgaWYgb3AgaXMgTkVHQVRFOgotICAgICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICAgICAgZWxpZiBvcCBpcyBMSVRFUkFMOgotICAgICAgICAgICAgICAgICAgICBlbWl0KGZpeHVwKGF2KSkKLSAgICAgICAgICAgICAgICBlbGlmIG9wIGlzIFJBTkdFOgotICAgICAgICAgICAgICAgICAgICBlbWl0KGZpeHVwKGF2WzBdKSkKLSAgICAgICAgICAgICAgICAgICAgZW1pdChmaXh1cChhdlsxXSkpCi0gICAgICAgICAgICAgICAgZWxpZiBvcCBpcyBDQVRFR09SWToKLSAgICAgICAgICAgICAgICAgICAgaWYgZmxhZ3MgJiBTUkVfRkxBR19MT0NBTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbWl0KENIQ09ERVNbQ0hfTE9DQUxFW2F2XV0pCi0gICAgICAgICAgICAgICAgICAgIGVsaWYgZmxhZ3MgJiBTUkVfRkxBR19VTklDT0RFOgotICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChDSENPREVTW0NIX1VOSUNPREVbYXZdXSkKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoQ0hDT0RFU1thdl0pCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJpbnRlcm5hbDogdW5zdXBwb3J0ZWQgc2V0IG9wZXJhdG9yIgotICAgICAgICAgICAgZW1pdChPUENPREVTW0ZBSUxVUkVdKQorICAgICAgICAgICAgX2NvbXBpbGVfY2hhcnNldChhdiwgZmxhZ3MsIGNvZGUsIGZpeHVwKQogICAgICAgICAgICAgY29kZVtza2lwXSA9IGxlbihjb2RlKSAtIHNraXAKICAgICAgICAgZWxpZiBvcCBpcyBBTlk6CiAgICAgICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0RPVEFMTDoKLSAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbb3BdKQorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tBTllfQUxMXSkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgZW1pdChPUENPREVTW0NBVEVHT1JZXSkKLSAgICAgICAgICAgICAgICBlbWl0KENIQ09ERVNbQ0FURUdPUllfTk9UX0xJTkVCUkVBS10pCisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW0FOWV0pCiAgICAgICAgIGVsaWYgb3AgaW4gKFJFUEVBVCwgTUlOX1JFUEVBVCwgTUFYX1JFUEVBVCk6CiAgICAgICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX1RFTVBMQVRFOgorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiaW50ZXJuYWw6IHVuc3VwcG9ydGVkIHRlbXBsYXRlIG9wZXJhdG9yIgogICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tSRVBFQVRdKQogICAgICAgICAgICAgICAgIHNraXAgPSBsZW4oY29kZSk7IGVtaXQoMCkKICAgICAgICAgICAgICAgICBlbWl0KGF2WzBdKQpAQCAtNzYsNDAgKzUwLDUwIEBACiAgICAgICAgICAgICAgICAgX2NvbXBpbGUoY29kZSwgYXZbMl0sIGZsYWdzKQogICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tTVUNDRVNTXSkKICAgICAgICAgICAgICAgICBjb2RlW3NraXBdID0gbGVuKGNvZGUpIC0gc2tpcAorICAgICAgICAgICAgZWxpZiBfc2ltcGxlKGF2KSBhbmQgb3AgPT0gTUFYX1JFUEVBVDoKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbUkVQRUFUX09ORV0pCisgICAgICAgICAgICAgICAgc2tpcCA9IGxlbihjb2RlKTsgZW1pdCgwKQorICAgICAgICAgICAgICAgIGVtaXQoYXZbMF0pCisgICAgICAgICAgICAgICAgZW1pdChhdlsxXSkKKyAgICAgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdlsyXSwgZmxhZ3MpCisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW1NVQ0NFU1NdKQorICAgICAgICAgICAgICAgIGNvZGVbc2tpcF0gPSBsZW4oY29kZSkgLSBza2lwCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGxvLCBoaSA9IGF2WzJdLmdldHdpZHRoKCkKLSAgICAgICAgICAgICAgICBpZiBsbyA9PSAwOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgIm5vdGhpbmcgdG8gcmVwZWF0IgotICAgICAgICAgICAgICAgIGlmIDAgYW5kIGxvID09IGhpID09IDEgYW5kIG9wIGlzIE1BWF9SRVBFQVQ6Ci0gICAgICAgICAgICAgICAgICAgICMgRklYTUU6IDxmbD4gbmVlZCBhIGJldHRlciB3YXkgdG8gZmlndXJlIG91dCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICMgaXQncyBzYWZlIHRvIHVzZSB0aGlzIG9uZSAoaW4gdGhlIHBhcnNlciwgcHJvYmFibHkpCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tNQVhfUkVQRUFUX09ORV0pCi0gICAgICAgICAgICAgICAgICAgIHNraXAgPSBsZW4oY29kZSk7IGVtaXQoMCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdChhdlswXSkKLSAgICAgICAgICAgICAgICAgICAgZW1pdChhdlsxXSkKLSAgICAgICAgICAgICAgICAgICAgX2NvbXBpbGUoY29kZSwgYXZbMl0sIGZsYWdzKQotICAgICAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbU1VDQ0VTU10pCi0gICAgICAgICAgICAgICAgICAgIGNvZGVbc2tpcF0gPSBsZW4oY29kZSkgLSBza2lwCisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW1JFUEVBVF0pCisgICAgICAgICAgICAgICAgc2tpcCA9IGxlbihjb2RlKTsgZW1pdCgwKQorICAgICAgICAgICAgICAgIGVtaXQoYXZbMF0pCisgICAgICAgICAgICAgICAgZW1pdChhdlsxXSkKKyAgICAgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdlsyXSwgZmxhZ3MpCisgICAgICAgICAgICAgICAgY29kZVtza2lwXSA9IGxlbihjb2RlKSAtIHNraXAKKyAgICAgICAgICAgICAgICBpZiBvcCA9PSBNQVhfUkVQRUFUOgorICAgICAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbTUFYX1VOVElMXSkKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbb3BdKQotICAgICAgICAgICAgICAgICAgICBza2lwID0gbGVuKGNvZGUpOyBlbWl0KDApCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoYXZbMF0pCi0gICAgICAgICAgICAgICAgICAgIGVtaXQoYXZbMV0pCi0gICAgICAgICAgICAgICAgICAgIF9jb21waWxlKGNvZGUsIGF2WzJdLCBmbGFncykKLSAgICAgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW1NVQ0NFU1NdKQotICAgICAgICAgICAgICAgICAgICBjb2RlW3NraXBdID0gbGVuKGNvZGUpIC0gc2tpcAorICAgICAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbTUlOX1VOVElMXSkKICAgICAgICAgZWxpZiBvcCBpcyBTVUJQQVRURVJOOgotICAgICAgICAgICAgZ3JvdXAgPSBhdlswXQotICAgICAgICAgICAgaWYgZ3JvdXA6CisgICAgICAgICAgICBpZiBhdlswXToKICAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbTUFSS10pCi0gICAgICAgICAgICAgICAgZW1pdCgoZ3JvdXAtMSkqMikKKyAgICAgICAgICAgICAgICBlbWl0KChhdlswXS0xKSoyKQorICAgICAgICAgICAgIyBfY29tcGlsZV9pbmZvKGNvZGUsIGF2WzFdLCBmbGFncykKICAgICAgICAgICAgIF9jb21waWxlKGNvZGUsIGF2WzFdLCBmbGFncykKLSAgICAgICAgICAgIGlmIGdyb3VwOgorICAgICAgICAgICAgaWYgYXZbMF06CiAgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW01BUktdKQotICAgICAgICAgICAgICAgIGVtaXQoKGdyb3VwLTEpKjIrMSkKKyAgICAgICAgICAgICAgICBlbWl0KChhdlswXS0xKSoyKzEpCiAgICAgICAgIGVsaWYgb3AgaW4gKFNVQ0NFU1MsIEZBSUxVUkUpOgogICAgICAgICAgICAgZW1pdChPUENPREVTW29wXSkKLSAgICAgICAgZWxpZiBvcCBpbiAoQVNTRVJULCBBU1NFUlRfTk9ULCBDQUxMKToKKyAgICAgICAgZWxpZiBvcCBpbiAoQVNTRVJULCBBU1NFUlRfTk9UKToKKyAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgICAgICBza2lwID0gbGVuKGNvZGUpOyBlbWl0KDApCisgICAgICAgICAgICBpZiBhdlswXSA+PSAwOgorICAgICAgICAgICAgICAgIGVtaXQoMCkgIyBsb29rIGFoZWFkCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvLCBoaSA9IGF2WzFdLmdldHdpZHRoKCkKKyAgICAgICAgICAgICAgICBpZiBsbyAhPSBoaToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJsb29rLWJlaGluZCByZXF1aXJlcyBmaXhlZC13aWR0aCBwYXR0ZXJuIgorICAgICAgICAgICAgICAgIGVtaXQobG8pICMgbG9vayBiZWhpbmQKKyAgICAgICAgICAgIF9jb21waWxlKGNvZGUsIGF2WzFdLCBmbGFncykKKyAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tTVUNDRVNTXSkKKyAgICAgICAgICAgIGNvZGVbc2tpcF0gPSBsZW4oY29kZSkgLSBza2lwCisgICAgICAgIGVsaWYgb3AgaXMgQ0FMTDoKICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCiAgICAgICAgICAgICBza2lwID0gbGVuKGNvZGUpOyBlbWl0KDApCiAgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdiwgZmxhZ3MpCkBAIC0xMjYsNiArMTEwLDcgQEAKICAgICAgICAgICAgIHRhaWwgPSBbXQogICAgICAgICAgICAgZm9yIGF2IGluIGF2WzFdOgogICAgICAgICAgICAgICAgIHNraXAgPSBsZW4oY29kZSk7IGVtaXQoMCkKKyAgICAgICAgICAgICAgICAjIF9jb21waWxlX2luZm8oY29kZSwgYXYsIGZsYWdzKQogICAgICAgICAgICAgICAgIF9jb21waWxlKGNvZGUsIGF2LCBmbGFncykKICAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbSlVNUF0pCiAgICAgICAgICAgICAgICAgdGFpbC5hcHBlbmQobGVuKGNvZGUpKTsgZW1pdCgwKQpAQCAtMTQxLDUxICsxMjYsMTk2IEBACiAgICAgICAgICAgICAgICAgZW1pdChDSENPREVTW0NIX1VOSUNPREVbYXZdXSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgZW1pdChDSENPREVTW2F2XSkKLSAgICAgICAgZWxpZiBvcCBpcyBHUk9VUDoKKyAgICAgICAgZWxpZiBvcCBpcyBHUk9VUFJFRjoKICAgICAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfSUdOT1JFQ0FTRToKICAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbT1BfSUdOT1JFW29wXV0pCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCiAgICAgICAgICAgICBlbWl0KGF2LTEpCi0gICAgICAgIGVsaWYgb3AgaXMgTUFSSzoKLSAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCi0gICAgICAgICAgICBlbWl0KGF2KQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgKCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUiLCBvcCkKIAorZGVmIF9jb21waWxlX2NoYXJzZXQoY2hhcnNldCwgZmxhZ3MsIGNvZGUsIGZpeHVwPU5vbmUpOgorICAgICMgY29tcGlsZSBjaGFyc2V0IHN1YnByb2dyYW0KKyAgICBlbWl0ID0gY29kZS5hcHBlbmQKKyAgICBpZiBub3QgZml4dXA6CisgICAgICAgIGZpeHVwID0gbGFtYmRhIHg6IHgKKyAgICBmb3Igb3AsIGF2IGluIF9vcHRpbWl6ZV9jaGFyc2V0KGNoYXJzZXQsIGZpeHVwKToKKyAgICAgICAgZW1pdChPUENPREVTW29wXSkKKyAgICAgICAgaWYgb3AgaXMgTkVHQVRFOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICBlbWl0KGZpeHVwKGF2KSkKKyAgICAgICAgZWxpZiBvcCBpcyBSQU5HRToKKyAgICAgICAgICAgIGVtaXQoZml4dXAoYXZbMF0pKQorICAgICAgICAgICAgZW1pdChmaXh1cChhdlsxXSkpCisgICAgICAgIGVsaWYgb3AgaXMgQ0hBUlNFVDoKKyAgICAgICAgICAgIGNvZGUuZXh0ZW5kKGF2KQorICAgICAgICBlbGlmIG9wIGlzIENBVEVHT1JZOgorICAgICAgICAgICAgaWYgZmxhZ3MgJiBTUkVfRkxBR19MT0NBTEU6CisgICAgICAgICAgICAgICAgZW1pdChDSENPREVTW0NIX0xPQ0FMRVthdl1dKQorICAgICAgICAgICAgZWxpZiBmbGFncyAmIFNSRV9GTEFHX1VOSUNPREU6CisgICAgICAgICAgICAgICAgZW1pdChDSENPREVTW0NIX1VOSUNPREVbYXZdXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW1pdChDSENPREVTW2F2XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiaW50ZXJuYWw6IHVuc3VwcG9ydGVkIHNldCBvcGVyYXRvciIKKyAgICBlbWl0KE9QQ09ERVNbRkFJTFVSRV0pCisKK2RlZiBfb3B0aW1pemVfY2hhcnNldChjaGFyc2V0LCBmaXh1cCk6CisgICAgIyBpbnRlcm5hbDogb3B0aW1pemUgY2hhcmFjdGVyIHNldAorICAgIG91dCA9IFtdCisgICAgY2hhcm1hcCA9IFswXSoyNTYKKyAgICB0cnk6CisgICAgICAgIGZvciBvcCwgYXYgaW4gY2hhcnNldDoKKyAgICAgICAgICAgIGlmIG9wIGlzIE5FR0FURToKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKChvcCwgYXYpKQorICAgICAgICAgICAgZWxpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgIGNoYXJtYXBbZml4dXAoYXYpXSA9IDEKKyAgICAgICAgICAgIGVsaWYgb3AgaXMgUkFOR0U6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZml4dXAoYXZbMF0pLCBmaXh1cChhdlsxXSkrMSk6CisgICAgICAgICAgICAgICAgICAgIGNoYXJtYXBbaV0gPSAxCisgICAgICAgICAgICBlbGlmIG9wIGlzIENBVEVHT1JZOgorICAgICAgICAgICAgICAgICMgRklYTUU6IGNvdWxkIGFwcGVuZCB0byBjaGFybWFwIHRhaWwKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhcnNldCAjIGNhbm5vdCBjb21wcmVzcworICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAjIGNoYXJhY3RlciBzZXQgY29udGFpbnMgdW5pY29kZSBjaGFyYWN0ZXJzCisgICAgICAgIHJldHVybiBjaGFyc2V0CisgICAgIyBjb21wcmVzcyBjaGFyYWN0ZXIgbWFwCisgICAgaSA9IHAgPSBuID0gMAorICAgIHJ1bnMgPSBbXQorICAgIGZvciBjIGluIGNoYXJtYXA6CisgICAgICAgIGlmIGM6CisgICAgICAgICAgICBpZiBuID09IDA6CisgICAgICAgICAgICAgICAgcCA9IGkKKyAgICAgICAgICAgIG4gPSBuICsgMQorICAgICAgICBlbGlmIG46CisgICAgICAgICAgICBydW5zLmFwcGVuZCgocCwgbikpCisgICAgICAgICAgICBuID0gMAorICAgICAgICBpID0gaSArIDEKKyAgICBpZiBuOgorICAgICAgICBydW5zLmFwcGVuZCgocCwgbikpCisgICAgaWYgbGVuKHJ1bnMpIDw9IDI6CisgICAgICAgICMgdXNlIGxpdGVyYWwvcmFuZ2UKKyAgICAgICAgZm9yIHAsIG4gaW4gcnVuczoKKyAgICAgICAgICAgIGlmIG4gPT0gMToKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKChMSVRFUkFMLCBwKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgoUkFOR0UsIChwLCBwK24tMSkpKQorICAgICAgICBpZiBsZW4ob3V0KSA8IGxlbihjaGFyc2V0KToKKyAgICAgICAgICAgIHJldHVybiBvdXQKKyAgICBlbHNlOgorICAgICAgICAjIHVzZSBiaXRtYXAKKyAgICAgICAgZGF0YSA9IFtdCisgICAgICAgIG0gPSAxOyB2ID0gMAorICAgICAgICBmb3IgYyBpbiBjaGFybWFwOgorICAgICAgICAgICAgaWYgYzoKKyAgICAgICAgICAgICAgICB2ID0gdiArIG0KKyAgICAgICAgICAgIG0gPSBtIDw8IDEKKyAgICAgICAgICAgIGlmIG0gPiBNQVhDT0RFOgorICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKHYpCisgICAgICAgICAgICAgICAgbSA9IDE7IHYgPSAwCisgICAgICAgIG91dC5hcHBlbmQoKENIQVJTRVQsIGRhdGEpKQorICAgICAgICByZXR1cm4gb3V0CisgICAgcmV0dXJuIGNoYXJzZXQKKworZGVmIF9zaW1wbGUoYXYpOgorICAgICMgY2hlY2sgaWYgYXYgaXMgYSAic2ltcGxlIiBvcGVyYXRvcgorICAgIGxvLCBoaSA9IGF2WzJdLmdldHdpZHRoKCkKKyAgICBpZiBsbyA9PSAwOgorICAgICAgICByYWlzZSBlcnJvciwgIm5vdGhpbmcgdG8gcmVwZWF0IgorICAgIHJldHVybiBsbyA9PSBoaSA9PSAxIGFuZCBhdlsyXVswXVswXSAhPSBTVUJQQVRURVJOCisKIGRlZiBfY29tcGlsZV9pbmZvKGNvZGUsIHBhdHRlcm4sIGZsYWdzKToKICAgICAjIGludGVybmFsOiBjb21waWxlIGFuIGluZm8gYmxvY2suICBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLAotICAgICMgdGhpcyBjb250YWlucyBtaW4vbWF4IHBhdHRlcm4gd2lkdGggYW5kIGEgbGl0ZXJhbCBwcmVmaXgsCi0gICAgIyBpZiBhbnkKKyAgICAjIHRoaXMgY29udGFpbnMgbWluL21heCBwYXR0ZXJuIHdpZHRoLCBhbmQgYW4gb3B0aW9uYWwgbGl0ZXJhbAorICAgICMgcHJlZml4IG9yIGEgY2hhcmFjdGVyIG1hcAogICAgIGxvLCBoaSA9IHBhdHRlcm4uZ2V0d2lkdGgoKQogICAgIGlmIGxvID09IDA6CiAgICAgICAgIHJldHVybiAjIG5vdCB3b3J0aCBpdAogICAgICMgbG9vayBmb3IgYSBsaXRlcmFsIHByZWZpeAogICAgIHByZWZpeCA9IFtdCisgICAgcHJlZml4X3NraXAgPSAwCisgICAgY2hhcnNldCA9IFtdICMgbm90IHVzZWQKICAgICBpZiBub3QgKGZsYWdzICYgU1JFX0ZMQUdfSUdOT1JFQ0FTRSk6CisgICAgICAgICMgbG9vayBmb3IgbGl0ZXJhbCBwcmVmaXgKICAgICAgICAgZm9yIG9wLCBhdiBpbiBwYXR0ZXJuLmRhdGE6CiAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgIGlmIGxlbihwcmVmaXgpID09IHByZWZpeF9za2lwOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXhfc2tpcCA9IHByZWZpeF9za2lwICsgMQogICAgICAgICAgICAgICAgIHByZWZpeC5hcHBlbmQoYXYpCisgICAgICAgICAgICBlbGlmIG9wIGlzIFNVQlBBVFRFUk4gYW5kIGxlbihhdlsxXSkgPT0gMToKKyAgICAgICAgICAgICAgICBvcCwgYXYgPSBhdlsxXVswXQorICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgICAgIHByZWZpeC5hcHBlbmQoYXYpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgIyBpZiBubyBwcmVmaXgsIGxvb2sgZm9yIGNoYXJzZXQgcHJlZml4CisgICAgICAgIGlmIG5vdCBwcmVmaXggYW5kIHBhdHRlcm4uZGF0YToKKyAgICAgICAgICAgIG9wLCBhdiA9IHBhdHRlcm4uZGF0YVswXQorICAgICAgICAgICAgaWYgb3AgaXMgU1VCUEFUVEVSTiBhbmQgYXZbMV06CisgICAgICAgICAgICAgICAgb3AsIGF2ID0gYXZbMV1bMF0KKyAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgICAgICBjaGFyc2V0LmFwcGVuZCgob3AsIGF2KSkKKyAgICAgICAgICAgICAgICBlbGlmIG9wIGlzIEJSQU5DSDoKKyAgICAgICAgICAgICAgICAgICAgYyA9IFtdCisgICAgICAgICAgICAgICAgICAgIGZvciBwIGluIGF2WzFdOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wLCBhdiA9IHBbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5hcHBlbmQoKG9wLCBhdikpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYworICAgICAgICAgICAgZWxpZiBvcCBpcyBCUkFOQ0g6CisgICAgICAgICAgICAgICAgYyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIHAgaW4gYXZbMV06CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgb3AsIGF2ID0gcFswXQorICAgICAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgICAgICAgICAgYy5hcHBlbmQoKG9wLCBhdikpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjCisgICAgICAgICAgICBlbGlmIG9wIGlzIElOOgorICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBhdgorIyMgICAgIGlmIHByZWZpeDoKKyMjICAgICAgICAgcHJpbnQgIioqKiBQUkVGSVgiLCBwcmVmaXgsIHByZWZpeF9za2lwCisjIyAgICAgaWYgY2hhcnNldDoKKyMjICAgICAgICAgcHJpbnQgIioqKiBDSEFSU0VUIiwgY2hhcnNldAogICAgICMgYWRkIGFuIGluZm8gYmxvY2sKICAgICBlbWl0ID0gY29kZS5hcHBlbmQKICAgICBlbWl0KE9QQ09ERVNbSU5GT10pCiAgICAgc2tpcCA9IGxlbihjb2RlKTsgZW1pdCgwKQogICAgICMgbGl0ZXJhbCBmbGFnCiAgICAgbWFzayA9IDAKLSAgICBpZiBsZW4ocHJlZml4KSA9PSBsZW4ocGF0dGVybi5kYXRhKToKLSAgICAgICAgbWFzayA9IDEKKyAgICBpZiBwcmVmaXg6CisgICAgICAgIG1hc2sgPSBTUkVfSU5GT19QUkVGSVgKKyAgICAgICAgaWYgbGVuKHByZWZpeCkgPT0gcHJlZml4X3NraXAgPT0gbGVuKHBhdHRlcm4uZGF0YSk6CisgICAgICAgICAgICBtYXNrID0gbWFzayArIFNSRV9JTkZPX0xJVEVSQUwKKyAgICBlbGlmIGNoYXJzZXQ6CisgICAgICAgIG1hc2sgPSBtYXNrICsgU1JFX0lORk9fQ0hBUlNFVAogICAgIGVtaXQobWFzaykKICAgICAjIHBhdHRlcm4gbGVuZ3RoCi0gICAgZW1pdChsbykKLSAgICBpZiBoaSA8IDMyNzY4OgorICAgIGlmIGxvIDwgTUFYQ09ERToKKyAgICAgICAgZW1pdChsbykKKyAgICBlbHNlOgorICAgICAgICBlbWl0KE1BWENPREUpCisgICAgICAgIHByZWZpeCA9IHByZWZpeFs6TUFYQ09ERV0KKyAgICBpZiBoaSA8IE1BWENPREU6CiAgICAgICAgIGVtaXQoaGkpCiAgICAgZWxzZToKICAgICAgICAgZW1pdCgwKQogICAgICMgYWRkIGxpdGVyYWwgcHJlZml4Ci0gICAgZW1pdChsZW4ocHJlZml4KSkKICAgICBpZiBwcmVmaXg6CisgICAgICAgIGVtaXQobGVuKHByZWZpeCkpICMgbGVuZ3RoCisgICAgICAgIGVtaXQocHJlZml4X3NraXApICMgc2tpcAogICAgICAgICBjb2RlLmV4dGVuZChwcmVmaXgpCiAgICAgICAgICMgZ2VuZXJhdGUgb3ZlcmxhcCB0YWJsZQogICAgICAgICB0YWJsZSA9IFstMV0gKyAoWzBdKmxlbihwcmVmaXgpKQpAQCAtMTk0LDE4ICszMjQsMTggQEAKICAgICAgICAgICAgIHdoaWxlIHRhYmxlW2krMV0gPiAwIGFuZCBwcmVmaXhbaV0gIT0gcHJlZml4W3RhYmxlW2krMV0tMV06CiAgICAgICAgICAgICAgICAgdGFibGVbaSsxXSA9IHRhYmxlW3RhYmxlW2krMV0tMV0rMQogICAgICAgICBjb2RlLmV4dGVuZCh0YWJsZVsxOl0pICMgZG9uJ3Qgc3RvcmUgZmlyc3QgZW50cnkKKyAgICBlbGlmIGNoYXJzZXQ6CisgICAgICAgIF9jb21waWxlX2NoYXJzZXQoY2hhcnNldCwgMCwgY29kZSkKICAgICBjb2RlW3NraXBdID0gbGVuKGNvZGUpIC0gc2tpcAogCi1kZWYgY29tcGlsZShwLCBmbGFncz0wKToKLSAgICAjIGludGVybmFsOiBjb252ZXJ0IHBhdHRlcm4gbGlzdCB0byBpbnRlcm5hbCBmb3JtYXQKK1NUUklOR19UWVBFUyA9IFt0eXBlKCIiKV0KIAotICAgICMgY29tcGlsZSwgYXMgbmVjZXNzYXJ5Ci0gICAgaWYgdHlwZShwKSBpbiAodHlwZSgiIiksIHR5cGUodSIiKSk6Ci0gICAgICAgIGltcG9ydCBzcmVfcGFyc2UKLSAgICAgICAgcGF0dGVybiA9IHAKLSAgICAgICAgcCA9IHNyZV9wYXJzZS5wYXJzZShwLCBmbGFncykKLSAgICBlbHNlOgotICAgICAgICBwYXR0ZXJuID0gTm9uZQordHJ5OgorICAgIFNUUklOR19UWVBFUy5hcHBlbmQodHlwZSh1bmljb2RlKCIiKSkpCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKKworZGVmIF9jb2RlKHAsIGZsYWdzKToKIAogICAgIGZsYWdzID0gcC5wYXR0ZXJuLmZsYWdzIHwgZmxhZ3MKICAgICBjb2RlID0gW10KQEAgLTIxOCwxMiArMzQ4LDM0IEBACiAKICAgICBjb2RlLmFwcGVuZChPUENPREVTW1NVQ0NFU1NdKQogCisgICAgcmV0dXJuIGNvZGUKKworZGVmIGNvbXBpbGUocCwgZmxhZ3M9MCk6CisgICAgIyBpbnRlcm5hbDogY29udmVydCBwYXR0ZXJuIGxpc3QgdG8gaW50ZXJuYWwgZm9ybWF0CisKKyAgICBpZiB0eXBlKHApIGluIFNUUklOR19UWVBFUzoKKyAgICAgICAgaW1wb3J0IHNyZV9wYXJzZQorICAgICAgICBwYXR0ZXJuID0gcAorICAgICAgICBwID0gc3JlX3BhcnNlLnBhcnNlKHAsIGZsYWdzKQorICAgIGVsc2U6CisgICAgICAgIHBhdHRlcm4gPSBOb25lCisKKyAgICBjb2RlID0gX2NvZGUocCwgZmxhZ3MpCisKKyAgICAjIHByaW50IGNvZGUKKwogICAgICMgRklYTUU6IDxmbD4gZ2V0IHJpZCBvZiB0aGlzIGxpbWl0YXRpb24hCiAgICAgYXNzZXJ0IHAucGF0dGVybi5ncm91cHMgPD0gMTAwLFwKICAgICAgICAgICAgInNvcnJ5LCBidXQgdGhpcyB2ZXJzaW9uIG9ubHkgc3VwcG9ydHMgMTAwIG5hbWVkIGdyb3VwcyIKIAorICAgICMgbWFwIGluIGVpdGhlciBkaXJlY3Rpb24KKyAgICBncm91cGluZGV4ID0gcC5wYXR0ZXJuLmdyb3VwZGljdAorICAgIGluZGV4Z3JvdXAgPSBbTm9uZV0gKiBwLnBhdHRlcm4uZ3JvdXBzCisgICAgZm9yIGssIGkgaW4gZ3JvdXBpbmRleC5pdGVtcygpOgorICAgICAgICBpbmRleGdyb3VwW2ldID0gaworCiAgICAgcmV0dXJuIF9zcmUuY29tcGlsZSgKLSAgICAgICAgcGF0dGVybiwgZmxhZ3MsCi0gICAgICAgIGFycmF5LmFycmF5KFdPUkRTSVpFLCBjb2RlKS50b3N0cmluZygpLAotICAgICAgICBwLnBhdHRlcm4uZ3JvdXBzLTEsIHAucGF0dGVybi5ncm91cGRpY3QKKyAgICAgICAgcGF0dGVybiwgZmxhZ3MsIGNvZGUsCisgICAgICAgIHAucGF0dGVybi5ncm91cHMtMSwKKyAgICAgICAgZ3JvdXBpbmRleCwgaW5kZXhncm91cAogICAgICAgICApCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My9zcmVfY29ucy5weSBiL0xpYi9kb3MtOHgzL3NyZV9jb25zLnB5CmluZGV4IDQ1ZjRmNDguLjVhMjA5MzAgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3NyZV9jb25zLnB5CisrKyBiL0xpYi9kb3MtOHgzL3NyZV9jb25zLnB5CkBAIC02LDkgKzYsNyBAQAogIwogIyBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBieSBTZWNyZXQgTGFicyBBQi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjCi0jIFBvcnRpb25zIG9mIHRoaXMgZW5naW5lIGhhdmUgYmVlbiBkZXZlbG9wZWQgaW4gY29vcGVyYXRpb24gd2l0aAotIyBDTlJJLiAgSGV3bGV0dC1QYWNrYXJkIHByb3ZpZGVkIGZ1bmRpbmcgZm9yIDEuNiBpbnRlZ3JhdGlvbiBhbmQKLSMgb3RoZXIgY29tcGF0aWJpbGl0eSB3b3JrLgorIyBTZWUgdGhlIHNyZS5weSBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24uCiAjCiAKICMgc2hvdWxkIHRoaXMgcmVhbGx5IGJlIGhlcmU/CkBAIC0yMiwxNCArMjAsMTYgQEAKIFNVQ0NFU1MgPSAic3VjY2VzcyIKIAogQU5ZID0gImFueSIKK0FOWV9BTEwgPSAiYW55X2FsbCIKIEFTU0VSVCA9ICJhc3NlcnQiCiBBU1NFUlRfTk9UID0gImFzc2VydF9ub3QiCiBBVCA9ICJhdCIKIEJSQU5DSCA9ICJicmFuY2giCiBDQUxMID0gImNhbGwiCiBDQVRFR09SWSA9ICJjYXRlZ29yeSIKLUdST1VQID0gImdyb3VwIgotR1JPVVBfSUdOT1JFID0gImdyb3VwX2lnbm9yZSIKK0NIQVJTRVQgPSAiY2hhcnNldCIKK0dST1VQUkVGID0gImdyb3VwcmVmIgorR1JPVVBSRUZfSUdOT1JFID0gImdyb3VwcmVmX2lnbm9yZSIKIElOID0gImluIgogSU5fSUdOT1JFID0gImluX2lnbm9yZSIKIElORk8gPSAiaW5mbyIKQEAgLTM4LDggKzM4LDkgQEAKIExJVEVSQUxfSUdOT1JFID0gImxpdGVyYWxfaWdub3JlIgogTUFSSyA9ICJtYXJrIgogTUFYX1JFUEVBVCA9ICJtYXhfcmVwZWF0IgotTUFYX1JFUEVBVF9PTkUgPSAibWF4X3JlcGVhdF9vbmUiCitNQVhfVU5USUwgPSAibWF4X3VudGlsIgogTUlOX1JFUEVBVCA9ICJtaW5fcmVwZWF0IgorTUlOX1VOVElMID0gIm1pbl91bnRpbCIKIE5FR0FURSA9ICJuZWdhdGUiCiBOT1RfTElURVJBTCA9ICJub3RfbGl0ZXJhbCIKIE5PVF9MSVRFUkFMX0lHTk9SRSA9ICJub3RfbGl0ZXJhbF9pZ25vcmUiCkBAIC04MSwyNSArODIsMjcgQEAKICAgICAjIGZhaWx1cmU9MCBzdWNjZXNzPTEgKGp1c3QgYmVjYXVzZSBpdCBsb29rcyBiZXR0ZXIgdGhhdCB3YXkgOi0pCiAgICAgRkFJTFVSRSwgU1VDQ0VTUywKIAotICAgIEFOWSwKKyAgICBBTlksIEFOWV9BTEwsCiAgICAgQVNTRVJULCBBU1NFUlRfTk9ULAogICAgIEFULAogICAgIEJSQU5DSCwKICAgICBDQUxMLAogICAgIENBVEVHT1JZLAotICAgIEdST1VQLCBHUk9VUF9JR05PUkUsCisgICAgQ0hBUlNFVCwKKyAgICBHUk9VUFJFRiwgR1JPVVBSRUZfSUdOT1JFLAogICAgIElOLCBJTl9JR05PUkUsCiAgICAgSU5GTywKICAgICBKVU1QLAogICAgIExJVEVSQUwsIExJVEVSQUxfSUdOT1JFLAogICAgIE1BUkssCi0gICAgTUFYX1JFUEVBVCwKLSAgICBNQVhfUkVQRUFUX09ORSwKLSAgICBNSU5fUkVQRUFULAorICAgIE1BWF9VTlRJTCwKKyAgICBNSU5fVU5USUwsCiAgICAgTk9UX0xJVEVSQUwsIE5PVF9MSVRFUkFMX0lHTk9SRSwKICAgICBORUdBVEUsCiAgICAgUkFOR0UsCi0gICAgUkVQRUFUCisgICAgUkVQRUFULAorICAgIFJFUEVBVF9PTkUsCisgICAgU1VCUEFUVEVSTgogCiBdCiAKQEAgLTEzMiw3ICsxMzUsNyBAQAogCiAjIHJlcGxhY2VtZW50IG9wZXJhdGlvbnMgZm9yICJpZ25vcmUgY2FzZSIgbW9kZQogT1BfSUdOT1JFID0gewotICAgIEdST1VQOiBHUk9VUF9JR05PUkUsCisgICAgR1JPVVBSRUY6IEdST1VQUkVGX0lHTk9SRSwKICAgICBJTjogSU5fSUdOT1JFLAogICAgIExJVEVSQUw6IExJVEVSQUxfSUdOT1JFLAogICAgIE5PVF9MSVRFUkFMOiBOT1RfTElURVJBTF9JR05PUkUKQEAgLTE2NiwxMyArMTY5LDE4IEBACiB9CiAKICMgZmxhZ3MKLVNSRV9GTEFHX1RFTVBMQVRFID0gMQotU1JFX0ZMQUdfSUdOT1JFQ0FTRSA9IDIKLVNSRV9GTEFHX0xPQ0FMRSA9IDQKLVNSRV9GTEFHX01VTFRJTElORSA9IDgKLVNSRV9GTEFHX0RPVEFMTCA9IDE2Ci1TUkVfRkxBR19VTklDT0RFID0gMzIKLVNSRV9GTEFHX1ZFUkJPU0UgPSA2NAorU1JFX0ZMQUdfVEVNUExBVEUgPSAxICMgdGVtcGxhdGUgbW9kZSAoZGlzYWJsZSBiYWNrdHJhY2tpbmcpCitTUkVfRkxBR19JR05PUkVDQVNFID0gMiAjIGNhc2UgaW5zZW5zaXRpdmUKK1NSRV9GTEFHX0xPQ0FMRSA9IDQgIyBob25vdXIgc3lzdGVtIGxvY2FsZQorU1JFX0ZMQUdfTVVMVElMSU5FID0gOCAjIHRyZWF0IHRhcmdldCBhcyBtdWx0aWxpbmUgc3RyaW5nCitTUkVfRkxBR19ET1RBTEwgPSAxNiAjIHRyZWF0IHRhcmdldCBhcyBhIHNpbmdsZSBzdHJpbmcKK1NSRV9GTEFHX1VOSUNPREUgPSAzMiAjIHVzZSB1bmljb2RlIGxvY2FsZQorU1JFX0ZMQUdfVkVSQk9TRSA9IDY0ICMgaWdub3JlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzCisKKyMgZmxhZ3MgZm9yIElORk8gcHJpbWl0aXZlCitTUkVfSU5GT19QUkVGSVggPSAxICMgaGFzIHByZWZpeAorU1JFX0lORk9fTElURVJBTCA9IDIgIyBlbnRpcmUgcGF0dGVybiBpcyBsaXRlcmFsIChnaXZlbiBieSBwcmVmaXgpCitTUkVfSU5GT19DSEFSU0VUID0gNCAjIHBhdHRlcm4gc3RhcnRzIHdpdGggY2hhcmFjdGVyIGZyb20gZ2l2ZW4gc2V0CiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHN0cmluZwpAQCAtMjAxLDYgKzIwOSw3IEBACiAgICAgZHVtcChmLCBPUENPREVTLCAiU1JFX09QIikKICAgICBkdW1wKGYsIEFUQ09ERVMsICJTUkUiKQogICAgIGR1bXAoZiwgQ0hDT0RFUywgIlNSRSIpCisKICAgICBmLndyaXRlKCIjZGVmaW5lIFNSRV9GTEFHX1RFTVBMQVRFICVkXG4iICUgU1JFX0ZMQUdfVEVNUExBVEUpCiAgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19JR05PUkVDQVNFICVkXG4iICUgU1JFX0ZMQUdfSUdOT1JFQ0FTRSkKICAgICBmLndyaXRlKCIjZGVmaW5lIFNSRV9GTEFHX0xPQ0FMRSAlZFxuIiAlIFNSRV9GTEFHX0xPQ0FMRSkKQEAgLTIwOCw1ICsyMTcsMTAgQEAKICAgICBmLndyaXRlKCIjZGVmaW5lIFNSRV9GTEFHX0RPVEFMTCAlZFxuIiAlIFNSRV9GTEFHX0RPVEFMTCkKICAgICBmLndyaXRlKCIjZGVmaW5lIFNSRV9GTEFHX1VOSUNPREUgJWRcbiIgJSBTUkVfRkxBR19VTklDT0RFKQogICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0ZMQUdfVkVSQk9TRSAlZFxuIiAlIFNSRV9GTEFHX1ZFUkJPU0UpCisKKyAgICBmLndyaXRlKCIjZGVmaW5lIFNSRV9JTkZPX1BSRUZJWCAlZFxuIiAlIFNSRV9JTkZPX1BSRUZJWCkKKyAgICBmLndyaXRlKCIjZGVmaW5lIFNSRV9JTkZPX0xJVEVSQUwgJWRcbiIgJSBTUkVfSU5GT19MSVRFUkFMKQorICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0lORk9fQ0hBUlNFVCAlZFxuIiAlIFNSRV9JTkZPX0NIQVJTRVQpCisKICAgICBmLmNsb3NlKCkKICAgICBwcmludCAiZG9uZSIKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3NyZV9wYXJzLnB5IGIvTGliL2Rvcy04eDMvc3JlX3BhcnMucHkKaW5kZXggNTM2MTZmNi4uYTUwMTkxZSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvc3JlX3BhcnMucHkKKysrIGIvTGliL2Rvcy04eDMvc3JlX3BhcnMucHkKQEAgLTUsMzMgKzUsMjQgQEAKICMKICMgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgYnkgU2VjcmV0IExhYnMgQUIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogIwotIyBQb3J0aW9ucyBvZiB0aGlzIGVuZ2luZSBoYXZlIGJlZW4gZGV2ZWxvcGVkIGluIGNvb3BlcmF0aW9uIHdpdGgKLSMgQ05SSS4gIEhld2xldHQtUGFja2FyZCBwcm92aWRlZCBmdW5kaW5nIGZvciAxLjYgaW50ZWdyYXRpb24gYW5kCi0jIG90aGVyIGNvbXBhdGliaWxpdHkgd29yay4KKyMgU2VlIHRoZSBzcmUucHkgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uLgogIwogCiBpbXBvcnQgc3RyaW5nLCBzeXMKIAotaW1wb3J0IF9zcmUKLQogZnJvbSBzcmVfY29uc3RhbnRzIGltcG9ydCAqCiAKLSMgRklYTUU6IHNob3VsZCBiZSA2NTUzNSwgYnV0IHRoZSBhcnJheW1vZHVsZSBpcyBzdGlsbCBicm9rZW4KLU1BWFJFUEVBVCA9IDMyNzY3Ci0KLSMgRklYTUU6IG1pZ2h0IGNoYW5nZSBpbiAyLjAgZmluYWwuICBidXQgZm9yIG5vdywgdGhpcyBzZWVtcwotIyB0byBiZSB0aGUgYmVzdCB3YXkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIDEuNS4yCi1DSEFSTUFTSyA9IDB4ZmYKK01BWFJFUEVBVCA9IDY1NTM1CiAKIFNQRUNJQUxfQ0hBUlMgPSAiLlxcW3soKSorP14kfCIKIFJFUEVBVF9DSEFSUyAgPSAiKis/eyIKIAotRElHSVRTID0gdHVwbGUoc3RyaW5nLmRpZ2l0cykKK0RJR0lUUyA9IHR1cGxlKCIwMTIzNDU2ODkiKQogCiBPQ1RESUdJVFMgPSB0dXBsZSgiMDEyMzQ1NjciKQogSEVYRElHSVRTID0gdHVwbGUoIjAxMjM0NTY3ODlhYmNkZWZBQkNERUYiKQogCi1XSElURVNQQUNFID0gdHVwbGUoc3RyaW5nLndoaXRlc3BhY2UpCitXSElURVNQQUNFID0gdHVwbGUoIiBcdFxuXHJcdlxmIikKIAogRVNDQVBFUyA9IHsKICAgICByIlxhIjogKExJVEVSQUwsIDcpLApAQCAtNjksNyArNjAsOCBAQAogICAgICJ1IjogU1JFX0ZMQUdfVU5JQ09ERSwKIH0KIAotY2xhc3MgU3RhdGU6CitjbGFzcyBQYXR0ZXJuOgorICAgICMgbWFzdGVyIHBhdHRlcm4gb2JqZWN0LiAga2VlcHMgdHJhY2sgb2YgZ2xvYmFsIGF0dHJpYnV0ZXMKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHNlbGYuZmxhZ3MgPSAwCiAgICAgICAgIHNlbGYuZ3JvdXBzID0gMQpAQCAtODksNiArODEsMzMgQEAKICAgICAgICAgICAgIGRhdGEgPSBbXQogICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCiAgICAgICAgIHNlbGYud2lkdGggPSBOb25lCisgICAgZGVmIGR1bXAoc2VsZiwgbGV2ZWw9MCk6CisgICAgICAgIG5sID0gMQorICAgICAgICBmb3Igb3AsIGF2IGluIHNlbGYuZGF0YToKKyAgICAgICAgICAgIHByaW50IGxldmVsKiIgICIgKyBvcCw7IG5sID0gMAorICAgICAgICAgICAgaWYgb3AgPT0gImluIjoKKyAgICAgICAgICAgICAgICAjIG1lbWJlciBzdWJsYW5ndWFnZQorICAgICAgICAgICAgICAgIHByaW50OyBubCA9IDEKKyAgICAgICAgICAgICAgICBmb3Igb3AsIGEgaW4gYXY6CisgICAgICAgICAgICAgICAgICAgIHByaW50IChsZXZlbCsxKSoiICAiICsgb3AsIGEKKyAgICAgICAgICAgIGVsaWYgb3AgPT0gImJyYW5jaCI6CisgICAgICAgICAgICAgICAgcHJpbnQ7IG5sID0gMQorICAgICAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICAgICAgZm9yIGEgaW4gYXZbMV06CisgICAgICAgICAgICAgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgbGV2ZWwqIiAgIiArICJvciIKKyAgICAgICAgICAgICAgICAgICAgYS5kdW1wKGxldmVsKzEpOyBubCA9IDEKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgICAgICBlbGlmIHR5cGUoYXYpIGluICh0eXBlKCgpKSwgdHlwZShbXSkpOgorICAgICAgICAgICAgICAgIGZvciBhIGluIGF2OgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGEsIFN1YlBhdHRlcm4pOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG5sOiBwcmludAorICAgICAgICAgICAgICAgICAgICAgICAgYS5kdW1wKGxldmVsKzEpOyBubCA9IDEKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IGEsIDsgbmwgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50IGF2LCA7IG5sID0gMAorICAgICAgICAgICAgaWYgbm90IG5sOiBwcmludAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi5kYXRhKQogICAgIGRlZiBfX2xlbl9fKHNlbGYpOgpAQCAtMTEyLDEyICsxMzEsMTIgQEAKICAgICAgICAgbG8gPSBoaSA9IDBMCiAgICAgICAgIGZvciBvcCwgYXYgaW4gc2VsZi5kYXRhOgogICAgICAgICAgICAgaWYgb3AgaXMgQlJBTkNIOgotICAgICAgICAgICAgICAgIGwgPSBzeXMubWF4aW50Ci0gICAgICAgICAgICAgICAgaCA9IDAKKyAgICAgICAgICAgICAgICBpID0gc3lzLm1heGludAorICAgICAgICAgICAgICAgIGogPSAwCiAgICAgICAgICAgICAgICAgZm9yIGF2IGluIGF2WzFdOgotICAgICAgICAgICAgICAgICAgICBpLCBqID0gYXYuZ2V0d2lkdGgoKQotICAgICAgICAgICAgICAgICAgICBsID0gbWluKGwsIGkpCi0gICAgICAgICAgICAgICAgICAgIGggPSBtaW4oaCwgaikKKyAgICAgICAgICAgICAgICAgICAgbCwgaCA9IGF2LmdldHdpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgaSA9IG1pbihpLCBsKQorICAgICAgICAgICAgICAgICAgICBqID0gbWF4KGosIGgpCiAgICAgICAgICAgICAgICAgbG8gPSBsbyArIGkKICAgICAgICAgICAgICAgICBoaSA9IGhpICsgagogICAgICAgICAgICAgZWxpZiBvcCBpcyBDQUxMOgpAQCAtMTQyLDEyICsxNjEsMTMgQEAKIAogY2xhc3MgVG9rZW5pemVyOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpbmcpOgotICAgICAgICBzZWxmLmluZGV4ID0gMAogICAgICAgICBzZWxmLnN0cmluZyA9IHN0cmluZwotICAgICAgICBzZWxmLm5leHQgPSBzZWxmLl9fbmV4dCgpCisgICAgICAgIHNlbGYuaW5kZXggPSAwCisgICAgICAgIHNlbGYuX19uZXh0KCkKICAgICBkZWYgX19uZXh0KHNlbGYpOgogICAgICAgICBpZiBzZWxmLmluZGV4ID49IGxlbihzZWxmLnN0cmluZyk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgc2VsZi5uZXh0ID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGNoYXIgPSBzZWxmLnN0cmluZ1tzZWxmLmluZGV4XQogICAgICAgICBpZiBjaGFyWzBdID09ICJcXCI6CiAgICAgICAgICAgICB0cnk6CkBAIC0xNTYsMjEgKzE3NiwyMSBAQAogICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgZXNjYXBlIgogICAgICAgICAgICAgY2hhciA9IGNoYXIgKyBjCiAgICAgICAgIHNlbGYuaW5kZXggPSBzZWxmLmluZGV4ICsgbGVuKGNoYXIpCi0gICAgICAgIHJldHVybiBjaGFyCi0gICAgZGVmIG1hdGNoKHNlbGYsIGNoYXIpOgorICAgICAgICBzZWxmLm5leHQgPSBjaGFyCisgICAgZGVmIG1hdGNoKHNlbGYsIGNoYXIsIHNraXA9MSk6CiAgICAgICAgIGlmIGNoYXIgPT0gc2VsZi5uZXh0OgotICAgICAgICAgICAgc2VsZi5uZXh0ID0gc2VsZi5fX25leHQoKQotICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgcmV0dXJuIDAKLSAgICBkZWYgbWF0Y2hfc2V0KHNlbGYsIHNldCk6Ci0gICAgICAgIGlmIHNlbGYubmV4dCBhbmQgc2VsZi5uZXh0IGluIHNldDoKLSAgICAgICAgICAgIHNlbGYubmV4dCA9IHNlbGYuX19uZXh0KCkKKyAgICAgICAgICAgIGlmIHNraXA6CisgICAgICAgICAgICAgICAgc2VsZi5fX25leHQoKQogICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgcmV0dXJuIDAKICAgICBkZWYgZ2V0KHNlbGYpOgogICAgICAgICB0aGlzID0gc2VsZi5uZXh0Ci0gICAgICAgIHNlbGYubmV4dCA9IHNlbGYuX19uZXh0KCkKKyAgICAgICAgc2VsZi5fX25leHQoKQogICAgICAgICByZXR1cm4gdGhpcworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbmRleCwgc2VsZi5uZXh0CisgICAgZGVmIHNlZWsoc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLmluZGV4LCBzZWxmLm5leHQgPSBpbmRleAogCiBkZWYgaXNpZGVudChjaGFyKToKICAgICByZXR1cm4gImEiIDw9IGNoYXIgPD0gInoiIG9yICJBIiA8PSBjaGFyIDw9ICJaIiBvciBjaGFyID09ICJfIgpAQCAtMjA3LDE1ICsyMjcsMTkgQEAKICAgICAgICAgcmV0dXJuIGNvZGUKICAgICB0cnk6CiAgICAgICAgIGlmIGVzY2FwZVsxOjJdID09ICJ4IjoKLSAgICAgICAgICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIEhFWERJR0lUUzoKKyAgICAgICAgICAgICMgaGV4YWRlY2ltYWwgZXNjYXBlIChleGFjdGx5IHR3byBkaWdpdHMpCisgICAgICAgICAgICB3aGlsZSBzb3VyY2UubmV4dCBpbiBIRVhESUdJVFMgYW5kIGxlbihlc2NhcGUpIDwgNDoKICAgICAgICAgICAgICAgICBlc2NhcGUgPSBlc2NhcGUgKyBzb3VyY2UuZ2V0KCkKICAgICAgICAgICAgIGVzY2FwZSA9IGVzY2FwZVsyOl0KLSAgICAgICAgICAgIHJldHVybiBMSVRFUkFMLCBpbnQoZXNjYXBlWy00Ol0sIDE2KSAmIENIQVJNQVNLCisgICAgICAgICAgICBpZiBsZW4oZXNjYXBlKSAhPSAyOgorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgZXNjYXBlOiAlcyIgJSByZXByKCJcXCIgKyBlc2NhcGUpCisgICAgICAgICAgICByZXR1cm4gTElURVJBTCwgaW50KGVzY2FwZSwgMTYpICYgMHhmZgogICAgICAgICBlbGlmIHN0cihlc2NhcGVbMToyXSkgaW4gT0NURElHSVRTOgotICAgICAgICAgICAgd2hpbGUgc291cmNlLm5leHQgaW4gT0NURElHSVRTOgorICAgICAgICAgICAgIyBvY3RhbCBlc2NhcGUgKHVwIHRvIHRocmVlIGRpZ2l0cykKKyAgICAgICAgICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIE9DVERJR0lUUyBhbmQgbGVuKGVzY2FwZSkgPCA1OgogICAgICAgICAgICAgICAgIGVzY2FwZSA9IGVzY2FwZSArIHNvdXJjZS5nZXQoKQogICAgICAgICAgICAgZXNjYXBlID0gZXNjYXBlWzE6XQotICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIGludChlc2NhcGVbLTY6XSwgOCkgJiBDSEFSTUFTSworICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIGludChlc2NhcGUsIDgpICYgMHhmZgogICAgICAgICBpZiBsZW4oZXNjYXBlKSA9PSAyOgogICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIG9yZChlc2NhcGVbMV0pCiAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CkBAIC0yMzIsMzQgKzI1Niw1NyBAQAogICAgICAgICByZXR1cm4gY29kZQogICAgIHRyeToKICAgICAgICAgaWYgZXNjYXBlWzE6Ml0gPT0gIngiOgotICAgICAgICAgICAgd2hpbGUgc291cmNlLm5leHQgaW4gSEVYRElHSVRTOgorICAgICAgICAgICAgIyBoZXhhZGVjaW1hbCBlc2NhcGUKKyAgICAgICAgICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIEhFWERJR0lUUyBhbmQgbGVuKGVzY2FwZSkgPCA0OgogICAgICAgICAgICAgICAgIGVzY2FwZSA9IGVzY2FwZSArIHNvdXJjZS5nZXQoKQogICAgICAgICAgICAgZXNjYXBlID0gZXNjYXBlWzI6XQotICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIGludChlc2NhcGVbLTQ6XSwgMTYpICYgQ0hBUk1BU0sKKyAgICAgICAgICAgIGlmIGxlbihlc2NhcGUpICE9IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJib2d1cyBlc2NhcGU6ICVzIiAlIHJlcHIoIlxcIiArIGVzY2FwZSkKKyAgICAgICAgICAgIHJldHVybiBMSVRFUkFMLCBpbnQoZXNjYXBlLCAxNikgJiAweGZmCisgICAgICAgIGVsaWYgZXNjYXBlWzE6Ml0gPT0gIjAiOgorICAgICAgICAgICAgIyBvY3RhbCBlc2NhcGUKKyAgICAgICAgICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIE9DVERJR0lUUyBhbmQgbGVuKGVzY2FwZSkgPCA1OgorICAgICAgICAgICAgICAgIGVzY2FwZSA9IGVzY2FwZSArIHNvdXJjZS5nZXQoKQorICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIGludChlc2NhcGVbMTpdLCA4KSAmIDB4ZmYKICAgICAgICAgZWxpZiBlc2NhcGVbMToyXSBpbiBESUdJVFM6Ci0gICAgICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgICAgIGdyb3VwID0gX2dyb3VwKGVzY2FwZSwgc3RhdGUuZ3JvdXBzKQotICAgICAgICAgICAgICAgIGlmIGdyb3VwOgotICAgICAgICAgICAgICAgICAgICBpZiAobm90IHNvdXJjZS5uZXh0IG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgX2dyb3VwKGVzY2FwZSArIHNvdXJjZS5uZXh0LCBzdGF0ZS5ncm91cHMpKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHUk9VUCwgZ3JvdXAKKyAgICAgICAgICAgICMgb2N0YWwgZXNjYXBlICpvciogZGVjaW1hbCBncm91cCByZWZlcmVuY2UgKHNpZ2gpCisgICAgICAgICAgICBoZXJlID0gc291cmNlLnRlbGwoKQorICAgICAgICAgICAgaWYgc291cmNlLm5leHQgaW4gRElHSVRTOgorICAgICAgICAgICAgICAgIGVzY2FwZSA9IGVzY2FwZSArIHNvdXJjZS5nZXQoKQorICAgICAgICAgICAgICAgIGlmIGVzY2FwZVsyXSBpbiBPQ1RESUdJVFMgYW5kIHNvdXJjZS5uZXh0IGluIE9DVERJR0lUUzoKKyAgICAgICAgICAgICAgICAgICAgIyBnb3QgdGhyZWUgb2N0YWwgZGlnaXRzOyB0aGlzIGlzIGFuIG9jdGFsIGVzY2FwZQogICAgICAgICAgICAgICAgICAgICBlc2NhcGUgPSBlc2NhcGUgKyBzb3VyY2UuZ2V0KCkKLSAgICAgICAgICAgICAgICBlbGlmIHNvdXJjZS5uZXh0IGluIE9DVERJR0lUUzoKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlID0gZXNjYXBlICsgc291cmNlLmdldCgpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVzY2FwZSA9IGVzY2FwZVsxOl0KLSAgICAgICAgICAgIHJldHVybiBMSVRFUkFMLCBpbnQoZXNjYXBlWy02Ol0sIDgpICYgQ0hBUk1BU0sKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIGludChlc2NhcGVbMTpdLCA4KSAmIDB4ZmYKKyAgICAgICAgICAgICMgZ290IGF0IGxlYXN0IG9uZSBkZWNpbWFsIGRpZ2l0OyB0aGlzIGlzIGEgZ3JvdXAgcmVmZXJlbmNlCisgICAgICAgICAgICBncm91cCA9IF9ncm91cChlc2NhcGUsIHN0YXRlLmdyb3VwcykKKyAgICAgICAgICAgIGlmIGdyb3VwOgorICAgICAgICAgICAgICAgIHJldHVybiBHUk9VUFJFRiwgZ3JvdXAKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgZXNjYXBlOiAlcyIgJSByZXByKGVzY2FwZSkKICAgICAgICAgaWYgbGVuKGVzY2FwZSkgPT0gMjoKICAgICAgICAgICAgIHJldHVybiBMSVRFUkFMLCBvcmQoZXNjYXBlWzFdKQogICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICBwYXNzCiAgICAgcmFpc2UgZXJyb3IsICJib2d1cyBlc2NhcGU6ICVzIiAlIHJlcHIoZXNjYXBlKQogCi1kZWYgX2JyYW5jaChwYXR0ZXJuLCBpdGVtcyk6Ci0gICAgIyBmb3JtIGEgYnJhbmNoIG9wZXJhdG9yIGZyb20gYSBzZXQgb2YgaXRlbXMKK2RlZiBfcGFyc2Vfc3ViKHNvdXJjZSwgc3RhdGUsIG5lc3RlZD0xKToKKyAgICAjIHBhcnNlIGFuIGFsdGVybmF0aW9uOiBhfGJ8YwogCi0gICAgc3VicGF0dGVybiA9IFN1YlBhdHRlcm4ocGF0dGVybikKKyAgICBpdGVtcyA9IFtdCisgICAgd2hpbGUgMToKKyAgICAgICAgaXRlbXMuYXBwZW5kKF9wYXJzZShzb3VyY2UsIHN0YXRlKSkKKyAgICAgICAgaWYgc291cmNlLm1hdGNoKCJ8Iik6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBub3QgbmVzdGVkOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbm90IHNvdXJjZS5uZXh0IG9yIHNvdXJjZS5tYXRjaCgiKSIsIDApOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAicGF0dGVybiBub3QgcHJvcGVybHkgY2xvc2VkIgorCisgICAgaWYgbGVuKGl0ZW1zKSA9PSAxOgorICAgICAgICByZXR1cm4gaXRlbXNbMF0KKworICAgIHN1YnBhdHRlcm4gPSBTdWJQYXR0ZXJuKHN0YXRlKQogCiAgICAgIyBjaGVjayBpZiBhbGwgaXRlbXMgc2hhcmUgYSBjb21tb24gcHJlZml4CiAgICAgd2hpbGUgMToKQEAgLTI4Niw3ICszMzMsNyBAQAogICAgICAgICAgICAgYnJlYWsKICAgICBlbHNlOgogICAgICAgICAjIHdlIGNhbiBzdG9yZSB0aGlzIGFzIGEgY2hhcmFjdGVyIHNldCBpbnN0ZWFkIG9mIGEKLSAgICAgICAgIyBicmFuY2ggKEZJWE1FOiB1c2UgYSByYW5nZSBpZiBwb3NzaWJsZSkKKyAgICAgICAgIyBicmFuY2ggKHRoZSBjb21waWxlciBtYXkgb3B0aW1pemUgdGhpcyBldmVuIG1vcmUpCiAgICAgICAgIHNldCA9IFtdCiAgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgogICAgICAgICAgICAgc2V0LmFwcGVuZChpdGVtWzBdKQpAQCAtMjk3LDggKzM0NCw3IEBACiAgICAgcmV0dXJuIHN1YnBhdHRlcm4KIAogZGVmIF9wYXJzZShzb3VyY2UsIHN0YXRlKToKLQotICAgICMgcGFyc2UgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gaW50byBhbiBvcGVyYXRvciBsaXN0LgorICAgICMgcGFyc2UgYSBzaW1wbGUgcGF0dGVybgogCiAgICAgc3VicGF0dGVybiA9IFN1YlBhdHRlcm4oc3RhdGUpCiAKQEAgLTM1Nyw3ICs0MDMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlMiA9IExJVEVSQUwsIG9yZCh0aGlzKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29kZTFbMF0gIT0gTElURVJBTCBvciBjb2RlMlswXSAhPSBMSVRFUkFMOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiaWxsZWdhbCByYW5nZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldC5hcHBlbmQoKFJBTkdFLCAoY29kZTFbMV0sIGNvZGUyWzFdKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBsbyA9IGNvZGUxWzFdCisgICAgICAgICAgICAgICAgICAgICAgICBoaSA9IGNvZGUyWzFdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBoaSA8IGxvOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiaWxsZWdhbCByYW5nZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldC5hcHBlbmQoKFJBTkdFLCAobG8sIGhpKSkpCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgaWYgY29kZTFbMF0gaXMgSU46CiAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUxWzFdWzBdCkBAIC0zODEsNiArNDMxLDcgQEAKICAgICAgICAgICAgIGVsaWYgdGhpcyA9PSAiKyI6CiAgICAgICAgICAgICAgICAgbWluLCBtYXggPSAxLCBNQVhSRVBFQVQKICAgICAgICAgICAgIGVsaWYgdGhpcyA9PSAieyI6CisgICAgICAgICAgICAgICAgaGVyZSA9IHNvdXJjZS50ZWxsKCkKICAgICAgICAgICAgICAgICBtaW4sIG1heCA9IDAsIE1BWFJFUEVBVAogICAgICAgICAgICAgICAgIGxvID0gaGkgPSAiIgogICAgICAgICAgICAgICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIERJR0lUUzoKQEAgLTM5MSw3ICs0NDIsOSBAQAogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIGhpID0gbG8KICAgICAgICAgICAgICAgICBpZiBub3Qgc291cmNlLm1hdGNoKCJ9Iik6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgcmFuZ2UiCisgICAgICAgICAgICAgICAgICAgIHN1YnBhdHRlcm4uYXBwZW5kKChMSVRFUkFMLCBvcmQodGhpcykpKQorICAgICAgICAgICAgICAgICAgICBzb3VyY2Uuc2VlayhoZXJlKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIGlmIGxvOgogICAgICAgICAgICAgICAgICAgICBtaW4gPSBpbnQobG8pCiAgICAgICAgICAgICAgICAgaWYgaGk6CkBAIC00NDgsNyArNTAxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGdpZCA9IHN0YXRlLmdyb3VwZGljdC5nZXQobmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGdpZCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5rbm93biBncm91cCBuYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgc3VicGF0dGVybi5hcHBlbmQoKEdST1VQLCBnaWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3VicGF0dGVybi5hcHBlbmQoKEdST1VQUkVGLCBnaWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgPSBzb3VyY2UuZ2V0KCkKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgaXMgTm9uZToKQEAgLTQ2Myw0OSArNTE3LDQxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzb3VyY2UubmV4dCBpcyBOb25lIG9yIHNvdXJjZS5uZXh0ID09ICIpIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldCgpCi0gICAgICAgICAgICAgICAgZWxpZiBzb3VyY2UubmV4dCBpbiAoIj0iLCAiISIpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc291cmNlLm1hdGNoKCIpIik6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVuYmFsYW5jZWQgcGFyZW50aGVzaXMiCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiBzb3VyY2UubmV4dCBpbiAoIj0iLCAiISIsICI8Iik6CiAgICAgICAgICAgICAgICAgICAgICMgbG9va2FoZWFkIGFzc2VydGlvbnMKICAgICAgICAgICAgICAgICAgICAgY2hhciA9IHNvdXJjZS5nZXQoKQotICAgICAgICAgICAgICAgICAgICBiID0gW10KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBfcGFyc2Uoc291cmNlLCBzdGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNvdXJjZS5uZXh0ID09ICIpIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBiOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZChwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gX2JyYW5jaChzdGF0ZSwgYikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGFyID09ICI9IjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGF0dGVybi5hcHBlbmQoKEFTU0VSVCwgcCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGF0dGVybi5hcHBlbmQoKEFTU0VSVF9OT1QsIHApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHNvdXJjZS5tYXRjaCgifCIpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKHApCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAicGF0dGVybiBub3QgcHJvcGVybHkgY2xvc2VkIgorICAgICAgICAgICAgICAgICAgICBkaXIgPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgPT0gIjwiOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc291cmNlLm5leHQgbm90IGluICgiPSIsICIhIik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJzeW50YXggZXJyb3IiCisgICAgICAgICAgICAgICAgICAgICAgICBkaXIgPSAtMSAjIGxvb2tiZWhpbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgPSBzb3VyY2UuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgcCA9IF9wYXJzZV9zdWIoc291cmNlLCBzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNvdXJjZS5tYXRjaCgiKSIpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIgorICAgICAgICAgICAgICAgICAgICBpZiBjaGFyID09ICI9IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhdHRlcm4uYXBwZW5kKChBU1NFUlQsIChkaXIsIHApKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhdHRlcm4uYXBwZW5kKChBU1NFUlRfTk9ULCAoZGlyLCBwKSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgIyBmbGFncwogICAgICAgICAgICAgICAgICAgICB3aGlsZSBGTEFHUy5oYXNfa2V5KHNvdXJjZS5uZXh0KToKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZsYWdzID0gc3RhdGUuZmxhZ3MgfCBGTEFHU1tzb3VyY2UuZ2V0KCldCiAgICAgICAgICAgICBpZiBncm91cDoKICAgICAgICAgICAgICAgICAjIHBhcnNlIGdyb3VwIGNvbnRlbnRzCi0gICAgICAgICAgICAgICAgYiA9IFtdCiAgICAgICAgICAgICAgICAgaWYgZ3JvdXAgPT0gMjoKICAgICAgICAgICAgICAgICAgICAgIyBhbm9ueW1vdXMgZ3JvdXAKICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBOb25lCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzdGF0ZS5nZXRncm91cChuYW1lKQotICAgICAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHAgPSBfcGFyc2Uoc291cmNlLCBzdGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgaWYgc291cmNlLm1hdGNoKCIpIik6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBiOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKHApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IF9icmFuY2goc3RhdGUsIGIpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuLmFwcGVuZCgoU1VCUEFUVEVSTiwgKGdyb3VwLCBwKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICBlbGlmIHNvdXJjZS5tYXRjaCgifCIpOgotICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQocCkKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiZ3JvdXAgbm90IHByb3Blcmx5IGNsb3NlZCIKKyAgICAgICAgICAgICAgICBwID0gX3BhcnNlX3N1Yihzb3VyY2UsIHN0YXRlKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzb3VyY2UubWF0Y2goIikiKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIgorICAgICAgICAgICAgICAgIHN1YnBhdHRlcm4uYXBwZW5kKChTVUJQQVRURVJOLCAoZ3JvdXAsIHApKSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgICAgICAgICAgY2hhciA9IHNvdXJjZS5nZXQoKQpAQCAtNTI4LDI2ICs1NzQsMjUgQEAKIAogICAgIHJldHVybiBzdWJwYXR0ZXJuCiAKLWRlZiBwYXJzZShwYXR0ZXJuLCBmbGFncz0wKToKK2RlZiBwYXJzZShzdHIsIGZsYWdzPTAsIHBhdHRlcm49Tm9uZSk6CiAgICAgIyBwYXJzZSAncmUnIHBhdHRlcm4gaW50byBsaXN0IG9mIChvcGNvZGUsIGFyZ3VtZW50KSB0dXBsZXMKLSAgICBzb3VyY2UgPSBUb2tlbml6ZXIocGF0dGVybikKLSAgICBzdGF0ZSA9IFN0YXRlKCkKLSAgICBzdGF0ZS5mbGFncyA9IGZsYWdzCi0gICAgYiA9IFtdCi0gICAgd2hpbGUgMToKLSAgICAgICAgcCA9IF9wYXJzZShzb3VyY2UsIHN0YXRlKQotICAgICAgICB0YWlsID0gc291cmNlLmdldCgpCi0gICAgICAgIGlmIHRhaWwgPT0gInwiOgotICAgICAgICAgICAgYi5hcHBlbmQocCkKLSAgICAgICAgZWxpZiB0YWlsID09ICIpIjoKLSAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyIKLSAgICAgICAgZWxpZiB0YWlsIGlzIE5vbmU6Ci0gICAgICAgICAgICBpZiBiOgotICAgICAgICAgICAgICAgIGIuYXBwZW5kKHApCi0gICAgICAgICAgICAgICAgcCA9IF9icmFuY2goc3RhdGUsIGIpCi0gICAgICAgICAgICBicmVhawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJib2d1cyBjaGFyYWN0ZXJzIGF0IGVuZCBvZiByZWd1bGFyIGV4cHJlc3Npb24iCisKKyAgICBzb3VyY2UgPSBUb2tlbml6ZXIoc3RyKQorCisgICAgaWYgcGF0dGVybiBpcyBOb25lOgorICAgICAgICBwYXR0ZXJuID0gUGF0dGVybigpCisgICAgcGF0dGVybi5mbGFncyA9IGZsYWdzCisKKyAgICBwID0gX3BhcnNlX3N1Yihzb3VyY2UsIHBhdHRlcm4sIDApCisKKyAgICB0YWlsID0gc291cmNlLmdldCgpCisgICAgaWYgdGFpbCA9PSAiKSI6CisgICAgICAgIHJhaXNlIGVycm9yLCAidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyIKKyAgICBlbGlmIHRhaWw6CisgICAgICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgY2hhcmFjdGVycyBhdCBlbmQgb2YgcmVndWxhciBleHByZXNzaW9uIgorCisgICAgIyBwLmR1bXAoKQorCiAgICAgcmV0dXJuIHAKIAogZGVmIHBhcnNlX3RlbXBsYXRlKHNvdXJjZSwgcGF0dGVybik6CkBAIC01OTksNyArNjQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgaWYgbm90IGNvZGU6CiAgICAgICAgICAgICAgICAgICAgIHRoaXMgPSB0aGlzWzE6XQotICAgICAgICAgICAgICAgICAgICBjb2RlID0gTElURVJBTCwgaW50KHRoaXNbLTY6XSwgOCkgJiBDSEFSTUFTSworICAgICAgICAgICAgICAgICAgICBjb2RlID0gTElURVJBTCwgaW50KHRoaXNbLTY6XSwgOCkgJiAweGZmCiAgICAgICAgICAgICAgICAgYShjb2RlKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB0cnk6CkBAIC02MjksNCArNjc0LDQgQEAKICAgICAgICAgICAgIGlmIHMgaXMgTm9uZToKICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgImVtcHR5IGdyb3VwIgogICAgICAgICAgICAgYShzKQotICAgIHJldHVybiBzZXAuam9pbihwKQorICAgIHJldHVybiBzdHJpbmcuam9pbihwLCBzZXApCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X2Fyci5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfYXJyLnB5CmluZGV4IGE4MmFjZTUuLmQzZmU3ZTkgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfYXJyLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfYXJyLnB5CkBAIC0xMDUsNiArMTA1LDI2IEBACiAgICAgICAgICAgICBhWzE6LTFdID0gYQogICAgICAgICAgICAgaWYgYSAhPSBhcnJheS5hcnJheSh0eXBlLCAiYWFiY2RlZSIpOgogICAgICAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICJhcnJheSglcykgc2VsZi1zbGljZS1hc3NpZ24gKGNudHIpIiAlIGB0eXBlYAorICAgICAgICAgICAgaWYgYS5pbmRleCgiZSIpICE9IDU6CisgICAgICAgICAgICAJcmFpc2UgVGVzdEZhaWxlZCwgImFycmF5KCVzKSBpbmRleC10ZXN0IiAlIGB0eXBlYAorICAgICAgICAgICAgaWYgYS5jb3VudCgiYSIpICE9IDI6CisgICAgICAgICAgICAJcmFpc2UgVGVzdEZhaWxlZCwgImFycmF5KCVzKSBjb3VudC10ZXN0IiAlIGB0eXBlYAorICAgICAgICAgICAgYS5yZW1vdmUoImUiKQorICAgICAgICAgICAgaWYgYSAhPSBhcnJheS5hcnJheSh0eXBlLCAiYWFiY2RlIik6CisgICAgICAgICAgICAJcmFpc2UgVGVzdEZhaWxlZCwgImFycmF5KCVzKSByZW1vdmUtdGVzdCIgJSBgdHlwZWAKKyAgICAgICAgICAgIGlmIGEucG9wKDApICE9ICJhIjoKKyAgICAgICAgICAgIAlyYWlzZSBUZXN0RmFpbGVkLCAiYXJyYXkoJXMpIHBvcC10ZXN0IiAlIGB0eXBlYAorICAgICAgICAgICAgaWYgYS5wb3AoMSkgIT0gImIiOgorICAgICAgICAgICAgCXJhaXNlIFRlc3RGYWlsZWQsICJhcnJheSglcykgcG9wLXRlc3QiICUgYHR5cGVgCisgICAgICAgICAgICBhLmV4dGVuZChhcnJheS5hcnJheSh0eXBlLCAieHl6IikpCisgICAgICAgICAgICBpZiBhICE9IGFycmF5LmFycmF5KHR5cGUsICJhY2RleHl6Iik6CisgICAgICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgImFycmF5KCVzKSBleHRlbmQtdGVzdCIgJSBgdHlwZWAKKyAgICAgICAgICAgIGEucG9wKCkKKyAgICAgICAgICAgIGEucG9wKCkKKyAgICAgICAgICAgIGEucG9wKCkKKyAgICAgICAgICAgIGEucG9wKCkKKyAgICAgICAgICAgIGlmIGEgIT0gYXJyYXkuYXJyYXkodHlwZSwgImFjZCIpOgorICAgICAgICAgICAgCXJhaXNlIFRlc3RGYWlsZWQsICJhcnJheSglcykgcG9wLXRlc3QiICUgYHR5cGVgCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBhID0gYXJyYXkuYXJyYXkodHlwZSwgWzEsIDIsIDMsIDQsIDVdKQogICAgICAgICAgICAgYVs6LTFdID0gYQpAQCAtMTE4LDYgKzEzOCwyNiBAQAogICAgICAgICAgICAgYVsxOi0xXSA9IGEKICAgICAgICAgICAgIGlmIGEgIT0gYXJyYXkuYXJyYXkodHlwZSwgWzEsIDEsIDIsIDMsIDQsIDUsIDVdKToKICAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiYXJyYXkoJXMpIHNlbGYtc2xpY2UtYXNzaWduIChjbnRyKSIgJSBgdHlwZWAKKyAgICAgICAgICAgIGlmIGEuaW5kZXgoNSkgIT0gNToKKyAgICAgICAgICAgIAlyYWlzZSBUZXN0RmFpbGVkLCAiYXJyYXkoJXMpIGluZGV4LXRlc3QiICUgYHR5cGVgCisgICAgICAgICAgICBpZiBhLmNvdW50KDEpICE9IDI6CisgICAgICAgICAgICAJcmFpc2UgVGVzdEZhaWxlZCwgImFycmF5KCVzKSBjb3VudC10ZXN0IiAlIGB0eXBlYAorICAgICAgICAgICAgYS5yZW1vdmUoNSkKKyAgICAgICAgICAgIGlmIGEgIT0gYXJyYXkuYXJyYXkodHlwZSwgWzEsIDEsIDIsIDMsIDQsIDVdKToKKyAgICAgICAgICAgIAlyYWlzZSBUZXN0RmFpbGVkLCAiYXJyYXkoJXMpIHJlbW92ZS10ZXN0IiAlIGB0eXBlYAorICAgICAgICAgICAgaWYgYS5wb3AoMCkgIT0gMToKKyAgICAgICAgICAgIAlyYWlzZSBUZXN0RmFpbGVkLCAiYXJyYXkoJXMpIHBvcC10ZXN0IiAlIGB0eXBlYAorICAgICAgICAgICAgaWYgYS5wb3AoMSkgIT0gMjoKKyAgICAgICAgICAgIAlyYWlzZSBUZXN0RmFpbGVkLCAiYXJyYXkoJXMpIHBvcC10ZXN0IiAlIGB0eXBlYAorICAgICAgICAgICAgYS5leHRlbmQoYXJyYXkuYXJyYXkodHlwZSwgWzcsIDgsIDldKSkKKyAgICAgICAgICAgIGlmIGEgIT0gYXJyYXkuYXJyYXkodHlwZSwgWzEsIDMsIDQsIDUsIDcsIDgsIDldKToKKyAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiYXJyYXkoJXMpIGV4dGVuZC10ZXN0IiAlIGB0eXBlYAorICAgICAgICAgICAgYS5wb3AoKQorICAgICAgICAgICAgYS5wb3AoKQorICAgICAgICAgICAgYS5wb3AoKQorICAgICAgICAgICAgYS5wb3AoKQorICAgICAgICAgICAgaWYgYSAhPSBhcnJheS5hcnJheSh0eXBlLCBbMSwgMywgNF0pOgorICAgICAgICAgICAgCXJhaXNlIFRlc3RGYWlsZWQsICJhcnJheSglcykgcG9wLXRlc3QiICUgYHR5cGVgCiAKICAgICAgICAgIyB0ZXN0IHRoYXQgb3ZlcmZsb3cgZXhjZXB0aW9ucyBhcmUgcmFpc2VkIGFzIGV4cGVjdGVkIGZvciBhc3NpZ25tZW50CiAgICAgICAgICMgdG8gYXJyYXkgb2Ygc3BlY2lmaWMgaW50ZWdyYWwgdHlwZXMKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfYmluLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9iaW4ucHkKaW5kZXggNTM0ZmE3My4uNTJmODE3YiAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9iaW4ucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9iaW4ucHkKQEAgLTEsNDYgKzEsMTEyIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0iIiJUZXN0IHNjcmlwdCBmb3IgdGhlIGJpbmhleCBDIG1vZHVsZQorIiIiVGVzdCB0aGUgYmluYXNjaWkgQyBtb2R1bGUuIiIiCiAKLSAgIFVzZXMgdGhlIG1lY2hhbmlzbSBvZiB0aGUgcHl0aG9uIGJpbmhleCBtb2R1bGUKLSAgIFJvZ2VyIEUuIE1hc3NlCi0iIiIKLWltcG9ydCBiaW5oZXgKLWltcG9ydCB0ZW1wZmlsZQogZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UKK2ltcG9ydCBiaW5hc2NpaQogCi1kZWYgdGVzdCgpOgorIyBTaG93IG1vZHVsZSBkb2Mgc3RyaW5nCitwcmludCBiaW5hc2NpaS5fX2RvY19fCiAKLSAgICB0cnk6Ci0gICAgICAgIGZuYW1lMSA9IHRlbXBmaWxlLm1rdGVtcCgpCi0gICAgICAgIGZuYW1lMiA9IHRlbXBmaWxlLm1rdGVtcCgpCi0gICAgICAgIGYgPSBvcGVuKGZuYW1lMSwgJ3cnKQotICAgIGV4Y2VwdDoKLSAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJDYW5ub3QgdGVzdCBiaW5oZXggd2l0aG91dCBhIHRlbXAgZmlsZSIKKyMgU2hvdyBtb2R1bGUgZXhjZXB0aW9ucworcHJpbnQgYmluYXNjaWkuRXJyb3IKK3ByaW50IGJpbmFzY2lpLkluY29tcGxldGUKIAotICAgIHN0YXJ0ID0gJ0phY2sgaXMgbXkgaGVybycKLSAgICBmLndyaXRlKHN0YXJ0KQotICAgIGYuY2xvc2UoKQotICAgIAotICAgIGJpbmhleC5iaW5oZXgoZm5hbWUxLCBmbmFtZTIpCi0gICAgaWYgdmVyYm9zZToKLSAgICAgICAgcHJpbnQgJ2JpbmhleCcKKyMgQ2hlY2sgcHJlc2VuY2UgYW5kIGRpc3BsYXkgZG9jIHN0cmluZ3Mgb2YgYWxsIGZ1bmN0aW9ucworZnVuY3MgPSBbXQorZm9yIHN1ZmZpeCBpbiAiYmFzZTY0IiwgImhxeCIsICJ1dSI6CisgICAgcHJlZml4ZXMgPSBbImEyYl8iLCAiYjJhXyJdCisgICAgaWYgc3VmZml4ID09ICJocXgiOgorICAgICAgICBwcmVmaXhlcy5leHRlbmQoWyJjcmNfIiwgInJsZWNvZGVfIiwgInJsZWRlY29kZV8iXSkKKyAgICBmb3IgcHJlZml4IGluIHByZWZpeGVzOgorICAgICAgICBuYW1lID0gcHJlZml4ICsgc3VmZml4CisgICAgICAgIGZ1bmNzLmFwcGVuZChnZXRhdHRyKGJpbmFzY2lpLCBuYW1lKSkKK2ZvciBmdW5jIGluIGZ1bmNzOgorICAgIHByaW50ICIlLTE1czogJXMiICUgKGZ1bmMuX19uYW1lX18sIGZ1bmMuX19kb2NfXykKIAotICAgIGJpbmhleC5oZXhiaW4oZm5hbWUyLCBmbmFtZTEpCi0gICAgaWYgdmVyYm9zZToKLSAgICAgICAgcHJpbnQgJ2hleGJpbicKKyMgQ3JlYXRlIGJpbmFyeSB0ZXN0IGRhdGEKK3Rlc3RkYXRhID0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuXHJcbiIKK2ZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgIyBCZSBzbG93IHNvIHdlIGRvbid0IGRlcGVuZCBvbiBvdGhlciBtb2R1bGVzCisgICAgdGVzdGRhdGEgPSB0ZXN0ZGF0YSArIGNocihpKQordGVzdGRhdGEgPSB0ZXN0ZGF0YSArICJcclxuSGVsbG8gd29ybGQuXG4iCiAKLSAgICBmID0gb3BlbihmbmFtZTEsICdyJykKLSAgICBmaW5pc2ggPSBmLnJlYWRsaW5lKCkKKyMgVGVzdCBiYXNlNjQgd2l0aCB2YWxpZCBkYXRhCitwcmludCAiYmFzZTY0IHRlc3QiCitNQVhfQkFTRTY0ID0gNTcKK2xpbmVzID0gW10KK2ZvciBpIGluIHJhbmdlKDAsIGxlbih0ZXN0ZGF0YSksIE1BWF9CQVNFNjQpOgorICAgIGIgPSB0ZXN0ZGF0YVtpOmkrTUFYX0JBU0U2NF0KKyAgICBhID0gYmluYXNjaWkuYjJhX2Jhc2U2NChiKQorICAgIGxpbmVzLmFwcGVuZChhKQorICAgIHByaW50IGEsCityZXMgPSAiIgorZm9yIGxpbmUgaW4gbGluZXM6CisgICAgYiA9IGJpbmFzY2lpLmEyYl9iYXNlNjQobGluZSkKKyAgICByZXMgPSByZXMgKyBiCithc3NlcnQgcmVzID09IHRlc3RkYXRhCiAKLSAgICBpZiBzdGFydCA8PiBmaW5pc2g6Ci0gICAgICAgIHByaW50ICdFcnJvcjogYmluaGV4IDw+IGhleGJpbicKLSAgICBlbGlmIHZlcmJvc2U6Ci0gICAgICAgIHByaW50ICdiaW5oZXggPT0gaGV4YmluJworIyBUZXN0IGJhc2U2NCB3aXRoIHJhbmRvbSBpbnZhbGlkIGNoYXJhY3RlcnMgc3ByaW5rbGVkIHRocm91Z2hvdXQKKyMgKFRoaXMgcmVxdWlyZXMgYSBuZXcgdmVyc2lvbiBvZiBiaW5hc2NpaS4pCitmaWxsZXJzID0gIiIKK3ZhbGlkID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5Ky8iCitmb3IgaSBpbiByYW5nZSgyNTYpOgorICAgIGMgPSBjaHIoaSkKKyAgICBpZiBjIG5vdCBpbiB2YWxpZDoKKyAgICAgICAgZmlsbGVycyA9IGZpbGxlcnMgKyBjCitkZWYgYWRkbm9pc2UobGluZSk6CisgICAgbm9pc2UgPSBmaWxsZXJzCisgICAgcmF0aW8gPSBsZW4obGluZSkgLyBsZW4obm9pc2UpCisgICAgcmVzID0gIiIKKyAgICB3aGlsZSBsaW5lIGFuZCBub2lzZToKKyAgICAgICAgaWYgbGVuKGxpbmUpIC8gbGVuKG5vaXNlKSA+IHJhdGlvOgorICAgICAgICAgICAgYywgbGluZSA9IGxpbmVbMF0sIGxpbmVbMTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjLCBub2lzZSA9IG5vaXNlWzBdLCBub2lzZVsxOl0KKyAgICAgICAgcmVzID0gcmVzICsgYworICAgIHJldHVybiByZXMgKyBub2lzZSArIGxpbmUKK3JlcyA9ICIiCitmb3IgbGluZSBpbiBtYXAoYWRkbm9pc2UsIGxpbmVzKToKKyAgICBiID0gYmluYXNjaWkuYTJiX2Jhc2U2NChsaW5lKQorICAgIHJlcyA9IHJlcyArIGIKK2Fzc2VydCByZXMgPT0gdGVzdGRhdGEKIAotICAgIHRyeToKLSAgICAgICAgaW1wb3J0IG9zCi0gICAgICAgIG9zLnVubGluayhmbmFtZTEpCi0gICAgICAgIG9zLnVubGluayhmbmFtZTIpCi0gICAgZXhjZXB0OgotICAgICAgICBwYXNzCi10ZXN0KCkKKyMgVGVzdCB1dQorcHJpbnQgInV1IHRlc3QiCitNQVhfVVUgPSA0NQorbGluZXMgPSBbXQorZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHRlc3RkYXRhKSwgTUFYX1VVKToKKyAgICBiID0gdGVzdGRhdGFbaTppK01BWF9VVV0KKyAgICBhID0gYmluYXNjaWkuYjJhX3V1KGIpCisgICAgbGluZXMuYXBwZW5kKGEpCisgICAgcHJpbnQgYSwKK3JlcyA9ICIiCitmb3IgbGluZSBpbiBsaW5lczoKKyAgICBiID0gYmluYXNjaWkuYTJiX3V1KGxpbmUpCisgICAgcmVzID0gcmVzICsgYgorYXNzZXJ0IHJlcyA9PSB0ZXN0ZGF0YQorCisjIFRlc3QgY3JjMzIoKQorY3JjID0gYmluYXNjaWkuY3JjMzIoIlRlc3QgdGhlIENSQy0zMiBvZiIpCitjcmMgPSBiaW5hc2NpaS5jcmMzMigiIHRoaXMgc3RyaW5nLiIsIGNyYykKK2lmIGNyYyAhPSAxNTcxMjIwMzMwOgorICAgIHByaW50ICJiaW5hc2NpaS5jcmMzMigpIGZhaWxlZC4iCisKKyMgVGhlIGhxeCB0ZXN0IGlzIGluIHRlc3RfYmluaGV4LnB5CisKKyMgdGVzdCBoZXhsaWZpY2F0aW9uCitzID0gJ3tzXDAwNVwwMDBcMDAwXDAwMHdvcmxkaVwwMDJcMDAwXDAwMFwwMDBzXDAwNVwwMDBcMDAwXDAwMGhlbGxvaVwwMDFcMDAwXDAwMFwwMDAwJwordCA9IGJpbmFzY2lpLmIyYV9oZXgocykKK3UgPSBiaW5hc2NpaS5hMmJfaGV4KHQpCitpZiBzIDw+IHU6CisgICAgcHJpbnQgJ2JpbmFzY2lpIGhleGxpZmljYXRpb24gZmFpbGVkJwordHJ5OgorICAgIGJpbmFzY2lpLmEyYl9oZXgodFs6LTFdKQorZXhjZXB0IFR5cGVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIHByaW50ICdleHBlY3RlZCBUeXBlRXJyb3Igbm90IHJhaXNlZCcKK3RyeToKKyAgICBiaW5hc2NpaS5hMmJfaGV4KHRbOi0xXSArICdxJykKK2V4Y2VwdCBUeXBlRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBwcmludCAnZXhwZWN0ZWQgVHlwZUVycm9yIG5vdCByYWlzZWQnCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X2V4Yy5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfZXhjLnB5CmluZGV4IDdiYzUxNWMuLjdlZTIwM2MgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfZXhjLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfZXhjLnB5CkBAIC0xOSw3ICsxOSw3IEBACiAKIGRlZiByKHRoaW5nKToKICAgICB0ZXN0X3JhaXNlX2NhdGNoKHRoaW5nKQotICAgIGlmIHR5cGUodGhpbmcpID09IENsYXNzVHlwZToKKyAgICBpZiBpc2luc3RhbmNlKHRoaW5nLCBDbGFzc1R5cGUpOgogICAgICAgICBwcmludCB0aGluZy5fX25hbWVfXwogICAgIGVsc2U6CiAgICAgICAgIHByaW50IHRoaW5nCkBAIC04Niw2ICs4NiwxNCBAQAogdHJ5OiBleGVjICcvXG4nCiBleGNlcHQgU3ludGF4RXJyb3I6IHBhc3MKIAorcihJbmRlbnRhdGlvbkVycm9yKQorCityKFRhYkVycm9yKQorIyBjYW4gb25seSBiZSB0ZXN0ZWQgdW5kZXIgLXR0LCBhbmQgaXMgdGhlIG9ubHkgdGVzdCBmb3IgLXR0CisjdHJ5OiBjb21waWxlKCJ0cnk6XG5cdDEvMFxuICAgIFx0MS8wXG5maW5hbGx5OlxuIHBhc3NcbiIsICc8c3RyaW5nPicsICdleGVjJykKKyNleGNlcHQgVGFiRXJyb3I6IHBhc3MKKyNlbHNlOiByYWlzZSBUZXN0RmFpbGVkCisKIHIoU3lzdGVtRXJyb3IpCiBwcmludCAnKGhhcmQgdG8gcmVwcm9kdWNlKScKIApkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9leHQucHkgYi9MaWIvZG9zLTh4My90ZXN0X2V4dC5weQppbmRleCA2Y2NhMTk5Li5kZTIzMTJiIDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X2V4dC5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X2V4dC5weQpAQCAtODUsMTAgKzg1LDEzIEBACiAKICMgd2hhdCBhYm91dCB3aWxsZnVsIG1pc2NvbmR1Y3Q/CiBkZWYgc2Fib3RldXIoKiprdyk6Ci0gICAga3dbJ3gnXSA9IGxvY2FscygpCisgICAga3dbJ3gnXSA9IGxvY2FscygpICMgeWllbGRzIGEgY3ljbGljIGt3CisgICAgcmV0dXJuIGt3CiBkID0ge30KLXNhYm90ZXVyKGE9MSwgKipkKQora3cgPSBzYWJvdGV1cihhPTEsICoqZCkKIGFzc2VydCBkID09IHt9CisjIGJyZWFrIHRoZSBjeWNsZQorZGVsIGt3Wyd4J10KICAgICAgICAgCiB0cnk6CiAgICAgZygxLCAyLCAzLCAqKnsneCc6NCwgJ3knOjV9KQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9mY24ucHkgYi9MaWIvZG9zLTh4My90ZXN0X2Zjbi5weQppbmRleCBiNTllZmRhLi4zYzFiZTg4IDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X2Zjbi5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X2Zjbi5weQpAQCAtMTcsNyArMTcsNyBAQAogICAgIHByaW50ICdTdGF0dXMgZnJvbSBmbmN0bCB3aXRoIE9fTk9OQkxPQ0s6ICcsIHJ2CiAgICAgCiBpZiBzeXMucGxhdGZvcm0gaW4gKCduZXRic2QxJywKLSAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2QyJywgJ2ZyZWVic2QzJywKKyAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2QyJywgJ2ZyZWVic2QzJywgJ2ZyZWVic2Q0JywgJ2ZyZWVic2Q1JywKICAgICAgICAgICAgICAgICAgICAgJ2JzZG9zMicsICdic2RvczMnLCAnYnNkb3M0JywKICAgICAgICAgICAgICAgICAgICAgJ29wZW5ic2QnLCAnb3BlbmJzZDInKToKICAgICBsb2NrZGF0YSA9IHN0cnVjdC5wYWNrKCdseHh4eGx4eHh4bGhoJywgMCwgMCwgMCwgRkNOVEwuRl9XUkxDSywgMCkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfZm9yLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9mb3IucHkKaW5kZXggNjdlMzBkZi4uNGZkMjY2MiAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9mb3IucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9mb3IucHkKQEAgLTYsMTQgKzYsMjQgQEAKIE9uIHNvbWUgc3lzdGVtcyAoZS5nLiBTb2xhcmlzIHdpdGhvdXQgcG9zaXggdGhyZWFkcykgd2UgZmluZCB0aGF0IGFsbAogYWN0aXZlIHRocmVhZHMgc3Vydml2ZSBpbiB0aGUgY2hpbGQgYWZ0ZXIgYSBmb3JrKCk7IHRoaXMgaXMgYW4gZXJyb3IuCiAKK09uIEJlT1MsIHlvdSBDQU5OT1QgbWl4IHRocmVhZHMgYW5kIGZvcmsoKSwgdGhlIGJlaGF2aW91ciBpcyB1bmRlZmluZWQuCitUaGF0J3MgT0ssIGZvcmsoKSBpcyBhIGdyb3Rlc3F1ZSBoYWNrIGFueXdheS4gOy0pIFtjamhdCisKICIiIgogCiBpbXBvcnQgb3MsIHN5cywgdGltZSwgdGhyZWFkCitmcm9tIHRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQKKwordHJ5OgorICAgIGlmIG9zLnVuYW1lKClbMF0gPT0gIkJlT1MiOgorICAgICAgICByYWlzZSBUZXN0U2tpcHBlZCwgImNhbid0IG1peCBvcy5mb3JrIHdpdGggdGhyZWFkcyBvbiBCZU9TIgorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIHBhc3MKIAogdHJ5OgogICAgIG9zLmZvcmsKIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICByYWlzZSBJbXBvcnRFcnJvciwgIm9zLmZvcmsgbm90IGRlZmluZWQgLS0gc2tpcHBpbmcgdGVzdF9mb3JrMSIKKyAgICByYWlzZSBUZXN0U2tpcHBlZCwgIm9zLmZvcmsgbm90IGRlZmluZWQgLS0gc2tpcHBpbmcgdGVzdF9mb3JrMSIKIAogTE9OR1NMRUVQID0gMgogCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X2dyYS5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfZ3JhLnB5CmluZGV4IGZhMDllOGMuLmVmN2MwOWIgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfZ3JhLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfZ3JhLnB5CkBAIC0yNjAsNiArMjYwLDUwIEBACiBwcmludCAwIG9yIDEsIDAgb3IgMSwKIHByaW50IDAgb3IgMQogCitwcmludCAnZXh0ZW5kZWQgcHJpbnRfc3RtdCcgIyAncHJpbnQnICc+PicgdGVzdCAnLCcKK2ltcG9ydCBzeXMKK3ByaW50ID4+IHN5cy5zdGRvdXQsIDEsIDIsIDMKK3ByaW50ID4+IHN5cy5zdGRvdXQsIDEsIDIsIDMsCitwcmludCA+PiBzeXMuc3Rkb3V0CitwcmludCA+PiBzeXMuc3Rkb3V0LCAwIG9yIDEsIDAgb3IgMSwKK3ByaW50ID4+IHN5cy5zdGRvdXQsIDAgb3IgMQorCisjIHRlc3QgcHJpbnQgPj4gTm9uZQorY2xhc3MgR3VscDoKKwlkZWYgd3JpdGUoc2VsZiwgbXNnKTogcGFzcworCitkZWYgZHJpdmVyKCk6CisJb2xkc3Rkb3V0ID0gc3lzLnN0ZG91dAorCXN5cy5zdGRvdXQgPSBHdWxwKCkKKwl0cnk6CisJCXRlbGxtZShHdWxwKCkpCisJCXRlbGxtZSgpCisJZmluYWxseToKKwkJc3lzLnN0ZG91dCA9IG9sZHN0ZG91dAorCisjIHdlIHNob3VsZCBzZWUgdGhpcyBvbmNlCitkZWYgdGVsbG1lKGZpbGU9c3lzLnN0ZG91dCk6CisJcHJpbnQgPj4gZmlsZSwgJ2hlbGxvIHdvcmxkJworCitkcml2ZXIoKQorCisjIHdlIHNob3VsZCBub3Qgc2VlIHRoaXMgYXQgYWxsCitkZWYgdGVsbG1lKGZpbGU9Tm9uZSk6CisJcHJpbnQgPj4gZmlsZSwgJ2dvb2RieWUgdW5pdmVyc2UnCisKK2RyaXZlcigpCisKKyMgc3ludGF4IGVycm9ycworZGVmIGNoZWNrX3N5bnRheChzdGF0ZW1lbnQpOgorCXRyeToKKwkJY29tcGlsZShzdGF0ZW1lbnQsICc8c3RyaW5nPicsICdleGVjJykKKwlleGNlcHQgU3ludGF4RXJyb3I6CisJCXBhc3MKKwllbHNlOgorCQlwcmludCAnTWlzc2luZyBTeW50YXhFcnJvcjogIiVzIicgJSBzdGF0ZW1lbnQKK2NoZWNrX3N5bnRheCgncHJpbnQgLCcpCitjaGVja19zeW50YXgoJ3ByaW50ID4+IHgsJykKKwogcHJpbnQgJ2RlbF9zdG10JyAjICdkZWwnIGV4cHJsaXN0CiBkZWwgYWJjCiBkZWwgeCwgeSwgKHosIHh5eikKQEAgLTU0MiwzICs1ODYsNDkgQEAKIAlkZWYgbWV0aDEoc2VsZik6IHBhc3MKIAlkZWYgbWV0aDIoc2VsZiwgYXJnKTogcGFzcwogCWRlZiBtZXRoMyhzZWxmLCBhMSwgYTIpOiBwYXNzCisKKyMgbGlzdCBjb21wcmVoZW5zaW9uIHRlc3RzCitudW1zID0gWzEsIDIsIDMsIDQsIDVdCitzdHJzID0gWyJBcHBsZSIsICJCYW5hbmEiLCAiQ29jb251dCJdCitzcGNzID0gWyIgIEFwcGxlIiwgIiBCYW5hbmEgIiwgIkNvY28gIG51dCAgIl0KKworcHJpbnQgW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGNzXQorcHJpbnQgWzMgKiB4IGZvciB4IGluIG51bXNdCitwcmludCBbeCBmb3IgeCBpbiBudW1zIGlmIHggPiAyXQorcHJpbnQgWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIHN0cnNdCitwcmludCBbKGksIHMpIGZvciBpIGluIG51bXMgZm9yIHMgaW4gW2YgZm9yIGYgaW4gc3RycyBpZiAibiIgaW4gZl1dCit0cnk6CisgICAgZXZhbCgiW2ksIHMgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXSIpCisgICAgcHJpbnQgIkZBSUw6IHNob3VsZCBoYXZlIHJhaXNlZCBhIFN5bnRheEVycm9yISIKK2V4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICBwcmludCAiZ29vZDogZ290IGEgU3ludGF4RXJyb3IgYXMgZXhwZWN0ZWQiCisKK3RyeToKKyAgICBldmFsKCJbeCBpZiB5XSIpCisgICAgcHJpbnQgIkZBSUw6IHNob3VsZCBoYXZlIHJhaXNlZCBhIFN5bnRheEVycm9yISIKK2V4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgcHJpbnQgImdvb2Q6IGdvdCBhIFN5bnRheEVycm9yIGFzIGV4cGVjdGVkIgorCitzdXBwbGllcnMgPSBbCisgICgxLCAiQm9laW5nIiksCisgICgyLCAiRm9yZCIpLAorICAoMywgIk1hY2RvbmFsZHMiKQorXQorCitwYXJ0cyA9IFsKKyAgKDEwLCAiQWlybGluZXIiKSwKKyAgKDIwLCAiRW5naW5lIiksCisgICgzMCwgIkNoZWVzZWJ1cmdlciIpCitdCisKK3N1cHBhcnQgPSBbCisgICgxLCAxMCksICgxLCAyMCksICgyLCAyMCksICgzLCAzMCkKK10KKworcHJpbnQgWworICAoc25hbWUsIHBuYW1lKQorICAgIGZvciAoc25vLCBzbmFtZSkgaW4gc3VwcGxpZXJzCisgICAgICBmb3IgKHBubywgcG5hbWUpIGluIHBhcnRzCisgICAgICAgIGZvciAoc3Bfc25vLCBzcF9wbm8pIGluIHN1cHBhcnQKKyAgICAgICAgICBpZiBzbm8gPT0gc3Bfc25vIGFuZCBwbm8gPT0gc3BfcG5vCitdCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X2d6aS5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfZ3ppLnB5CmluZGV4IDNlYTJiYTkuLjIzNjZkMDIgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfZ3ppLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfZ3ppLnB5CkBAIC0xNiwxNSArMTYsMzkgQEAKIC8qIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsIGZvciBXaW5kb3dzICovCiAiIiIKIAotZiA9IGd6aXAuR3ppcEZpbGUoZmlsZW5hbWUsICd3YicpIDsgZi53cml0ZShkYXRhMSkgOyBmLmNsb3NlKCkKK2YgPSBnemlwLkd6aXBGaWxlKGZpbGVuYW1lLCAnd2InKSA7IGYud3JpdGUoZGF0YTEgKiA1MCkgOyBmLmNsb3NlKCkKIAogZiA9IGd6aXAuR3ppcEZpbGUoZmlsZW5hbWUsICdyYicpIDsgZCA9IGYucmVhZCgpIDsgZi5jbG9zZSgpCi1hc3NlcnQgZCA9PSBkYXRhMQorYXNzZXJ0IGQgPT0gZGF0YTEqNTAKIAogIyBBcHBlbmQgdG8gdGhlIHByZXZpb3VzIGZpbGUKLWYgPSBnemlwLkd6aXBGaWxlKGZpbGVuYW1lLCAnYWInKSA7IGYud3JpdGUoZGF0YTIpIDsgZi5jbG9zZSgpCitmID0gZ3ppcC5HemlwRmlsZShmaWxlbmFtZSwgJ2FiJykgOyBmLndyaXRlKGRhdGEyICogMTUpIDsgZi5jbG9zZSgpCiAKIGYgPSBnemlwLkd6aXBGaWxlKGZpbGVuYW1lLCAncmInKSA7IGQgPSBmLnJlYWQoKSA7IGYuY2xvc2UoKQotYXNzZXJ0IGQgPT0gZGF0YTErZGF0YTIKK2Fzc2VydCBkID09IChkYXRhMSo1MCkgKyAoZGF0YTIqMTUpCisKKyMgVHJ5IC5yZWFkbGluZSgpIHdpdGggdmFyeWluZyBsaW5lIGxlbmd0aHMKKworZiA9IGd6aXAuR3ppcEZpbGUoZmlsZW5hbWUsICdyYicpCitsaW5lX2xlbmd0aCA9IDAKK3doaWxlIDE6CisgICAgTCA9IGYucmVhZGxpbmUoIGxpbmVfbGVuZ3RoICkKKyAgICBpZiBMID09ICIiIGFuZCBsaW5lX2xlbmd0aCAhPSAwOiBicmVhaworICAgIGFzc2VydCBsZW4oTCkgPD0gbGluZV9sZW5ndGgKKyAgICBsaW5lX2xlbmd0aCA9IChsaW5lX2xlbmd0aCArIDEpICUgNTAKK2YuY2xvc2UoKQorCisjIFRyeSAucmVhZGxpbmVzKCkgCisKK2YgPSBnemlwLkd6aXBGaWxlKGZpbGVuYW1lLCAncmInKQorTCA9IGYucmVhZGxpbmVzKCkKK2YuY2xvc2UoKQorCitmID0gZ3ppcC5HemlwRmlsZShmaWxlbmFtZSwgJ3JiJykKK3doaWxlIDE6CisgICAgTCA9IGYucmVhZGxpbmVzKDE1MCkKKyAgICBpZiBMID09IFtdOiBicmVhayAgICAKK2YuY2xvc2UoKQorCiAKIG9zLnVubGluayggZmlsZW5hbWUgKQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9saW4ucHkgYi9MaWIvZG9zLTh4My90ZXN0X2xpbi5weQppbmRleCA0YjYxMmE3Li40ZmFhYWIxIDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X2xpbi5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X2xpbi5weQpAQCAtMSw1ICsxLDYgQEAKLWZyb20gdGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBmaW5kZmlsZSwgVGVzdEZhaWxlZAorZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIGZpbmRmaWxlLCBUZXN0RmFpbGVkLCBUZXN0U2tpcHBlZAogaW1wb3J0IGxpbnV4YXVkaW9kZXYKK2ltcG9ydCBlcnJubwogaW1wb3J0IG9zCiAKIGRlZiBwbGF5X3NvdW5kX2ZpbGUocGF0aCk6CkBAIC05LDYgKzEwLDggQEAKICAgICB0cnk6CiAgICAgICAgIGEgPSBsaW51eGF1ZGlvZGV2Lm9wZW4oJ3cnKQogICAgIGV4Y2VwdCBsaW51eGF1ZGlvZGV2LmVycm9yLCBtc2c6CisgICAgICAgIGlmIG1zZ1swXSBpbiAoZXJybm8uRUFDQ0VTLCBlcnJuby5FTk9ERVYpOgorICAgICAgICAgICAgcmFpc2UgVGVzdFNraXBwZWQsIG1zZwogICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCBtc2cKICAgICBlbHNlOgogICAgICAgICBhLndyaXRlKGRhdGEpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X21hdC5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfbWF0LnB5CmluZGV4IDVjOGVmYzYuLjZkNmJjNDQgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfbWF0LnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfbWF0LnB5CkBAIC0xMjksMTggKzEyOSw2IEBACiB0ZXN0aXQoJ3BvdygyLDEpJywgbWF0aC5wb3coMiwxKSwgMikKIHRlc3RpdCgncG93KDIsLTEpJywgbWF0aC5wb3coMiwtMSksIDAuNSkKIAotcHJpbnQgJ3JpbnQnCi10cnk6Ci0JbWF0aC5yaW50Ci1leGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0JIyB0aGlzIHBsYXRmb3JtIGRvZXMgbm90IGhhdmUgcmludCwgdGhhdCBpcyBmaW5lLCBza2lwIHRoZSB0ZXN0Ci0JcGFzcwotZWxzZToKLQl0ZXN0aXQoJ3JpbnQoMC43KScsIG1hdGgucmludCgwLjcpLCAxKQotCXRlc3RpdCgncmludCgtMC4zKScsIG1hdGgucmludCgtMC4zKSwgMCkKLQl0ZXN0aXQoJ3JpbnQoMi41KScsIG1hdGgucmludCgyLjUpLCAyKQotCXRlc3RpdCgncmludCgzLjUpJywgbWF0aC5yaW50KDMuNSksIDQpIAotCiBwcmludCAnc2luJwogdGVzdGl0KCdzaW4oMCknLCBtYXRoLnNpbigwKSwgMCkKIHRlc3RpdCgnc2luKHBpLzIpJywgbWF0aC5zaW4obWF0aC5waS8yKSwgMSkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfbW1hLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9tbWEucHkKaW5kZXggYzNjYWZjYS4uNzNjMWExNSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9tbWEucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9tbWEucHkKQEAgLTY5LDcgKzY5LDcgQEAKICAgICBtLnNlZWsoMCwyKQogICAgIHByaW50ICcgIFNlZWsgdG8gbGFzdCBieXRlJwogICAgIGFzc2VydCBtLnRlbGwoKSA9PSBsZW4obSkKLQkKKwogICAgIHByaW50ICcgIFRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHBvc2l0aW9uLi4uJwogICAgIHRyeToKICAgICAgICAgbS5zZWVrKC0xKQpAQCAtOTQsNiArOTQsMjYgQEAKICAgICBlbHNlOgogICAgICAgICBhc3NlcnQgMCwgJ2V4cGVjdGVkIGEgVmFsdWVFcnJvciBidXQgZGlkIG5vdCBnZXQgaXQnCiAKKyAgICAjIFRyeSByZXNpemluZyBtYXAKKyAgICBwcmludCAnICBBdHRlbXB0aW5nIHJlc2l6ZSgpJworICAgIHRyeToKKyAgICAgICAgbS5yZXNpemUoIDUxMiApCisgICAgZXhjZXB0IFN5c3RlbUVycm9yOgorICAgICAgICAjIHJlc2l6ZSgpIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgIyBObyBtZXNzYWdlcyBhcmUgcHJpbnRlZCwgc2luY2UgdGhlIG91dHB1dCBvZiB0aGlzIHRlc3Qgc3VpdGUKKyAgICAgICAgIyB3b3VsZCB0aGVuIGJlIGRpZmZlcmVudCBhY3Jvc3MgcGxhdGZvcm1zLgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgIyByZXNpemUoKSBpcyBzdXBwb3J0ZWQKKyAgICAgICAgYXNzZXJ0IGxlbihtKSA9PSA1MTIsICJsZW4obSkgaXMgJWQsIGJ1dCBleHBlY3RpbmcgNTEyIiAlIChsZW4obSksKQorICAgICAgICAjIENoZWNrIHRoYXQgd2UgY2FuIG5vIGxvbmdlciBzZWVrIGJleW9uZCB0aGUgbmV3IHNpemUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG0uc2Vlayg1MTMsMCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgMCwgJ0NvdWxkIHNlZWsgYmV5b25kIHRoZSBuZXcgc2l6ZScKKyAgICAKICAgICBtLmNsb3NlKCkKICAgICBvcy51bmxpbmsoImZvbyIpCiAgICAgcHJpbnQgJyBUZXN0IHBhc3NlZCcKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfbnRwLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9udHAucHkKaW5kZXggMWY4MjRhNS4uMTFmMmY0NCAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9udHAucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9udHAucHkKQEAgLTEsNSArMSw2IEBACiBpbXBvcnQgbnRwYXRoCiBpbXBvcnQgc3RyaW5nCitpbXBvcnQgb3MKIAogZXJyb3JzID0gMAogCkBAIC0zNCw2ICszNSwxNSBAQAogdGVzdGVyKCdudHBhdGguaXNhYnMoIlxcZm9vIiknLCAxKQogdGVzdGVyKCdudHBhdGguaXNhYnMoIlxcZm9vXFxiYXIiKScsIDEpCiAKK3Rlc3RlcignbnRwYXRoLmFic3BhdGgoIkM6XFwiKScsICJDOlxcIikKKwordGVzdGVyKCdudHBhdGguY29tbW9ucHJlZml4KFsiL2hvbWUvc3dlbnNvbi9zcGFtIiwgIi9ob21lL3N3ZW4vc3BhbSJdKScsCisgICAgICAgIi9ob21lL3N3ZW4iKQordGVzdGVyKCdudHBhdGguY29tbW9ucHJlZml4KFsiXFxob21lXFxzd2VuXFxzcGFtIiwgIlxcaG9tZVxcc3dlblxcZWdncyJdKScsCisgICAgICAgIlxcaG9tZVxcc3dlblxcIikKK3Rlc3RlcignbnRwYXRoLmNvbW1vbnByZWZpeChbIi9ob21lL3N3ZW4vc3BhbSIsICIvaG9tZS9zd2VuL3NwYW0iXSknLAorICAgICAgICIvaG9tZS9zd2VuL3NwYW0iKQorCiBpZiBlcnJvcnM6CiAJcHJpbnQgc3RyKGVycm9ycykgKyAiIGVycm9ycy4iCiBlbHNlOgpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9vcGUucHkgYi9MaWIvZG9zLTh4My90ZXN0X29wZS5weQppbmRleCA4ZDM4NjRjLi43MjNlNTdjIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My90ZXN0X29wZS5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X29wZS5weQpAQCAtMSw3NyArMSwyMiBAQAotaW1wb3J0IG9wZXJhdG9yCi1pbXBvcnQgc3lzCisjIFRlc3QgdG8gc2VlIGlmIG9wZW5wdHkgd29ya3MuIChCdXQgZG9uJ3Qgd29ycnkgaWYgaXQgaXNuJ3QgYXZhaWxhYmxlLikKIAotZGVmIHRlc3QobmFtZSwgaW5wdXQsIG91dHB1dCwgKmFyZ3MpOgotICAgIHByaW50ICd0ZXN0aW5nOicsIG5hbWUKLSAgICBmID0gZ2V0YXR0cihvcGVyYXRvciwgbmFtZSkKLSAgICBwYXJhbXMgPSAoaW5wdXQsKSArIGFyZ3MKLSAgICB0cnk6Ci0gICAgICAgIHZhbCA9IGFwcGx5KGYsIHBhcmFtcykKLSAgICBleGNlcHQ6Ci0gICAgICAgIHZhbCA9IHN5cy5leGNfdHlwZQotICAgIGlmIHZhbCA8PiBvdXRwdXQ6Ci0gICAgICAgIHByaW50ICclcyVzID0gJXM6ICVzIGV4cGVjdGVkJyAlIChmLl9fbmFtZV9fLCBwYXJhbXMsIGB2YWxgLCBgb3V0cHV0YCkKK2ltcG9ydCBvcworZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRlc3RGYWlsZWQsIFRlc3RTa2lwcGVkCiAKLXRlc3QoJ2FicycsIC0xLCAxKQotdGVzdCgnYWRkJywgMywgNywgNCkKLXRlc3QoJ2FuZF8nLCAweGYsIDB4YSwgMHhhKQotdGVzdCgnY29uY2F0JywgJ3B5JywgJ3B5dGhvbicsICd0aG9uJykKK3RyeToKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAiQ2FsbGluZyBvcy5vcGVucHR5KCkiCisgICAgbWFzdGVyLCBzbGF2ZSA9IG9zLm9wZW5wdHkoKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICIobWFzdGVyLCBzbGF2ZSkgPSAoJWQsICVkKSIlKG1hc3Rlciwgc2xhdmUpCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQsICJObyBvcGVucHR5KCkgYXZhaWxhYmxlLiIKIAotdGVzdCgnY291bnRPZicsIFsxLCAyLCAxLCAzLCAxLCA0XSwgMSwgMykKK2lmIG5vdCBvcy5pc2F0dHkobWFzdGVyKToKKyAgICByYWlzZSBUZXN0RmFpbGVkLCAiTWFzdGVyLWVuZCBvZiBwdHkgaXMgbm90IGEgdGVybWluYWwuIgoraWYgbm90IG9zLmlzYXR0eShzbGF2ZSk6CisgICAgcmFpc2UgVGVzdEZhaWxlZCwgIlNsYXZlLWVuZCBvZiBwdHkgaXMgbm90IGEgdGVybWluYWwuIgogCi1hID0gWzQsIDMsIDIsIDFdCi10ZXN0KCdkZWxpdGVtJywgYSwgTm9uZSwgMSkKLWlmIGEgPD4gWzQsIDIsIDFdOgotICAgIHByaW50ICdkZWxpdGVtKCkgZmFpbGVkJworb3Mud3JpdGUoc2xhdmUsICdQaW5nIScpCitwcmludCBvcy5yZWFkKG1hc3RlciwgMTAyNCkKIAotYSA9IHJhbmdlKDEwKQotdGVzdCgnZGVsc2xpY2UnLCBhLCBOb25lLCAyLCA4KQotaWYgYSA8PiBbMCwgMSwgOCwgOV06Ci0gICAgcHJpbnQgJ2RlbHNsaWNlKCkgZmFpbGVkJwotCi1hID0gcmFuZ2UoMTApCi10ZXN0KCdkaXYnLCA1LCAyLCAyKQotdGVzdCgnZ2V0aXRlbScsIGEsIDIsIDIpCi10ZXN0KCdnZXRzbGljZScsIGEsIFs0LCA1XSwgNCwgNikKLXRlc3QoJ2luZGV4T2YnLCBbNCwgMywgMiwgMV0sIDEsIDMpCi10ZXN0KCdpbnYnLCA0LCAtNSkKLXRlc3QoJ2lzQ2FsbGFibGUnLCA0LCAwKQotdGVzdCgnaXNDYWxsYWJsZScsIG9wZXJhdG9yLmlzQ2FsbGFibGUsIDEpCi10ZXN0KCdpc01hcHBpbmdUeXBlJywgb3BlcmF0b3IuaXNNYXBwaW5nVHlwZSwgMCkKLXRlc3QoJ2lzTWFwcGluZ1R5cGUnLCBvcGVyYXRvci5fX2RpY3RfXywgMSkKLXRlc3QoJ2lzTnVtYmVyVHlwZScsIDguMywgMSkKLXRlc3QoJ2lzTnVtYmVyVHlwZScsIGRpcigpLCAwKQotdGVzdCgnaXNTZXF1ZW5jZVR5cGUnLCBkaXIoKSwgMSkKLXRlc3QoJ2lzU2VxdWVuY2VUeXBlJywgJ3llYWhidWRkeScsIDEpCi10ZXN0KCdpc1NlcXVlbmNlVHlwZScsIDMsIDApCi10ZXN0KCdsc2hpZnQnLCA1LCAxMCwgMSkKLXRlc3QoJ21vZCcsIDUsIDEsIDIpCi10ZXN0KCdtdWwnLCA1LCAxMCwgMikKLXRlc3QoJ25lZycsIDUsIC01KQotdGVzdCgnb3JfJywgMHhhLCAweGYsIDB4NSkKLXRlc3QoJ3BvcycsIC01LCAtNSkKLQotYSA9IHJhbmdlKDMpCi10ZXN0KCdyZXBlYXQnLCBhLCBhK2EsIDIpCi10ZXN0KCdyc2hpZnQnLCA1LCAyLCAxKQotCi10ZXN0KCdzZXF1ZW5jZUluY2x1ZGVzJywgcmFuZ2UoNCksIDEsIDIpCi10ZXN0KCdzZXF1ZW5jZUluY2x1ZGVzJywgcmFuZ2UoNCksIDAsIDUpCi0KLXRlc3QoJ3NldGl0ZW0nLCBhLCBOb25lLCAwLCAyKQotaWYgYSA8PiBbMiwgMSwgMl06Ci0gICAgcHJpbnQgJ3NldGl0ZW0oKSBmYWlsZWQnCi0KLWEgPSByYW5nZSg0KQotdGVzdCgnc2V0c2xpY2UnLCBhLCBOb25lLCAxLCAzLCBbMiwgMV0pCi1pZiBhIDw+IFswLCAyLCAxLCAzXToKLSAgICBwcmludCAnc2V0c2xpY2UoKSBmYWlsZWQ6JywgYQotCi10ZXN0KCdzdWInLCA1LCAyLCAzKQotdGVzdCgndHJ1dGgnLCA1LCAxKQotdGVzdCgndHJ1dGgnLCBbXSwgMCkKLXRlc3QoJ3hvcicsIDB4YiwgMHg3LCAweGMpCi0KLQotIyBzb21lIG5lZ2F0aXZlIHRlc3RzCi10ZXN0KCdpbmRleE9mJywgWzQsIDMsIDIsIDFdLCBWYWx1ZUVycm9yLCA5KQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9wb3AucHkgYi9MaWIvZG9zLTh4My90ZXN0X3BvcC5weQppbmRleCBiZTc5ZjNjLi4yNmVmOWQ5IDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X3BvcC5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X3BvcC5weQpAQCAtMywxNSArMyw1NCBAQAogICAgQ2hyaXN0aWFuIFRpc21lcgogIiIiCiAKK2ltcG9ydCBvcworCiAjIHBvcGVuMiBjb250YWlucyBpdHMgb3duIHRlc3Rpbmcgcm91dGluZQogIyB3aGljaCBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB0byBzZWUgaWYgb3BlbiBmaWxlcwotIyBsaWtlIHN0ZGluIGNhbiBiZSByZWFkIHN1Y2Nlc3NmdWxseSBieSBhIGZvcmtlZCAKKyMgbGlrZSBzdGRpbiBjYW4gYmUgcmVhZCBzdWNjZXNzZnVsbHkgYnkgYSBmb3JrZWQKICMgc3VicHJvY2Vzcy4KIAogZGVmIG1haW4oKToKLSAgICBmcm9tIG9zIGltcG9ydCBmb3JrICMgc2tpcHMgdGVzdCB0aHJvdWdoIEltcG9ydEVycm9yCisgICAgcHJpbnQgIlRlc3QgcG9wZW4yIG1vZHVsZToiCisgICAgdHJ5OgorICAgICAgICBmcm9tIG9zIGltcG9ydCBwb3BlbgorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgIyBpZiB3ZSBkb24ndCBoYXZlIG9zLnBvcGVuLCBjaGVjayB0aGF0CisgICAgICAgICMgd2UgaGF2ZSBvcy5mb3JrLiAgaWYgbm90LCBza2lwIHRoZSB0ZXN0CisgICAgICAgICMgKGJ5IHJhaXNpbmcgYW4gSW1wb3J0RXJyb3IpCisgICAgICAgIGZyb20gb3MgaW1wb3J0IGZvcmsKICAgICBpbXBvcnQgcG9wZW4yCiAgICAgcG9wZW4yLl90ZXN0KCkKIAotbWFpbigpCiAKK2RlZiBfdGVzdCgpOgorICAgICMgc2FtZSB0ZXN0IGFzIHBvcGVuMi5fdGVzdCgpLCBidXQgdXNpbmcgdGhlIG9zLnBvcGVuKigpIEFQSQorICAgIHByaW50ICJUZXN0aW5nIG9zIG1vZHVsZToiCisgICAgaW1wb3J0IHBvcGVuMgorICAgIGNtZCAgPSAiY2F0IgorICAgIHRlc3RzdHIgPSAiYWJjXG4iCisgICAgcmVzdWx0c3RyID0gdGVzdHN0cgorICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgY21kID0gIm1vcmUiCisgICAgICAgIHJlc3VsdHN0ciA9ICJcbiIgKyByZXN1bHRzdHIKKyAgICBwcmludCAidGVzdGluZyBwb3BlbjIuLi4iCisgICAgdywgciA9IG9zLnBvcGVuMihjbWQpCisgICAgdy53cml0ZSh0ZXN0c3RyKQorICAgIHcuY2xvc2UoKQorICAgIGFzc2VydCByLnJlYWQoKSA9PSByZXN1bHRzdHIKKyAgICBwcmludCAidGVzdGluZyBwb3BlbjMuLi4iCisgICAgdHJ5OgorICAgICAgICB3LCByLCBlID0gb3MucG9wZW4zKFtjbWRdKQorICAgIGV4Y2VwdDoKKyAgICAgICAgdywgciwgZSA9IG9zLnBvcGVuMyhjbWQpCisgICAgdy53cml0ZSh0ZXN0c3RyKQorICAgIHcuY2xvc2UoKQorICAgIGFzc2VydCByLnJlYWQoKSA9PSByZXN1bHRzdHIKKyAgICBhc3NlcnQgZS5yZWFkKCkgPT0gIiIKKyAgICBmb3IgaW5zdCBpbiBwb3BlbjIuX2FjdGl2ZVs6XToKKyAgICAgICAgaW5zdC53YWl0KCkKKyAgICBhc3NlcnQgbm90IHBvcGVuMi5fYWN0aXZlCisgICAgcHJpbnQgIkFsbCBPSyIKKworbWFpbigpCitfdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X3JnYi5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfcmdiLnB5CmluZGV4IDM4YmNkZjUuLjFmYTIwMWQgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfcmdiLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfcmdiLnB5CkBAIC00LDcgKzQsOCBAQAogCiBmcm9tIHRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgdW5saW5rLCBmaW5kZmlsZQogCi1lcnJvciA9ICd0ZXN0X3JnYmltZy5lcnJvcicKK2NsYXNzIGVycm9yKEV4Y2VwdGlvbik6CisgICAgICAgIHBhc3MKIAogcHJpbnQgJ1JHQmltZyB0ZXN0IHN1aXRlOicKIApkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9zZWwucHkgYi9MaWIvZG9zLTh4My90ZXN0X3NlbC5weQppbmRleCA2MGRlMzYwLi5iMTk4Y2YxIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My90ZXN0X3NlbC5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X3NlbC5weQpAQCAtNDUsNyArNDUsNiBAQAogICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAndGltZW91dCA9JywgdG91dAogICAgICAgICAgICAgICAgIHJmZCwgd2ZkLCB4ZmQgPSBzZWxlY3Quc2VsZWN0KFtwXSwgW10sIFtdLCB0b3V0KQotIyMgICAgICAgICAgICAgIHByaW50IHJmZCwgd2ZkLCB4ZmQKICAgICAgICAgICAgICAgICBpZiAocmZkLCB3ZmQsIHhmZCkgPT0gKFtdLCBbXSwgW10pOgogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBpZiAocmZkLCB3ZmQsIHhmZCkgPT0gKFtwXSwgW10sIFtdKToKQEAgLTU3LDcgKzU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnRU9GJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBwcmludCAnSGVoPycKKyAgICAgICAgICAgICAgICBwcmludCAnVW5leHBlY3RlZCByZXR1cm4gdmFsdWVzIGZyb20gc2VsZWN0KCk6JywgcmZkLCB3ZmQsIHhmZAogICAgICAgICBwLmNsb3NlKCkKIAogdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X3NpZy5weSBiL0xpYi9kb3MtOHgzL3Rlc3Rfc2lnLnB5CmluZGV4IDJkMzM2MzUuLjAyYjVkYzMgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3Rfc2lnLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3Rfc2lnLnB5CkBAIC0xLDExICsxLDExIEBACiAjIFRlc3QgdGhlIHNpZ25hbCBtb2R1bGUKLWZyb20gdGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlCitmcm9tIHRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgVGVzdFNraXBwZWQKIGltcG9ydCBzaWduYWwKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogCiBpZiBzeXMucGxhdGZvcm1bOjNdIGluICgnd2luJywgJ29zMicpOgotICAgIHJhaXNlIEltcG9ydEVycm9yLCAiQ2FuJ3QgdGVzdCBzaWduYWwgb24gJXMiICUgc3lzLnBsYXRmb3JtWzozXQorICAgIHJhaXNlIFRlc3RTa2lwcGVkLCAiQ2FuJ3QgdGVzdCBzaWduYWwgb24gJXMiICUgc3lzLnBsYXRmb3JtWzozXQogCiBpZiB2ZXJib3NlOgogCXggPSAnLXgnCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X3N0ci5weSBiL0xpYi9kb3MtOHgzL3Rlc3Rfc3RyLnB5CmluZGV4IGVjNTdjMjYuLmM3MTNkMDUgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3Rfc3RyLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3Rfc3RyLnB5CkBAIC0xLDE4NSArMSwxMzQgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIyBTYW5pdHkgY2hlY2tlciBmb3IgdGltZS5zdHJmdGltZQorCitpbXBvcnQgdGltZSwgY2FsZW5kYXIsIHN5cywgc3RyaW5nLCBvcywgcmUKIGZyb20gdGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlCi1pbXBvcnQgc3RyaW5nLCBzeXMKIAotIyBYWFg6IGtsdWRnZS4uLiBzaG9ydCBjaXJjdWl0IGlmIHN0cmluZ3MgZG9uJ3QgaGF2ZSBtZXRob2RzCi10cnk6Ci0gICAgJycuam9pbgotZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgIHJhaXNlIEltcG9ydEVycm9yCitkZWYgbWFpbigpOgorICAgIGdsb2JhbCB2ZXJib3NlCisgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICBzdHJmdGVzdChub3cpCisgICAgdmVyYm9zZSA9IDAKKyAgICAjIFRyeSBhIGJ1bmNoIG9mIGRhdGVzIGFuZCB0aW1lcywgIGNob3NlbiB0byB2YXJ5IHRocm91Z2ggdGltZSBvZgorICAgICMgZGF5IGFuZCBkYXlsaWdodCBzYXZpbmcgdGltZQorICAgIGZvciBqIGluIHJhbmdlKC01LCA1KToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjUpOgorICAgICAgICAgICAgc3RyZnRlc3Qobm93ICsgKGkgKyBqKjEwMCkqMjMqMzYwMykKIAotZGVmIHRlc3QobmFtZSwgaW5wdXQsIG91dHB1dCwgKmFyZ3MpOgorZGVmIHN0cmZ0ZXN0KG5vdyk6CiAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgcHJpbnQgJ3N0cmluZy4lcyVzID0/ICVzLi4uICcgJSAobmFtZSwgKGlucHV0LCkgKyBhcmdzLCBvdXRwdXQpLAorICAgICAgICBwcmludCAic3RyZnRpbWUgdGVzdCBmb3IiLCB0aW1lLmN0aW1lKG5vdykKKyAgICBub3dzZWNzID0gc3RyKGxvbmcobm93KSlbOi0xXQorICAgIGdtdCA9IHRpbWUuZ210aW1lKG5vdykKKyAgICBub3cgPSB0aW1lLmxvY2FsdGltZShub3cpCisKKyAgICBpZiBub3dbM10gPCAxMjogYW1wbT0nQU0nCisgICAgZWxzZTogYW1wbT0nUE0nCisKKyAgICBqYW4xID0gdGltZS5sb2NhbHRpbWUodGltZS5ta3RpbWUoKG5vd1swXSwgMSwgMSkgKyAoMCwpKjYpKQorCiAgICAgdHJ5OgotICAgICAgICAjIFByZWZlciBzdHJpbmcgbWV0aG9kcyBvdmVyIHN0cmluZyBtb2R1bGUgZnVuY3Rpb25zCisgICAgICAgIGlmIG5vd1s4XTogdHogPSB0aW1lLnR6bmFtZVsxXQorICAgICAgICBlbHNlOiB0eiA9IHRpbWUudHpuYW1lWzBdCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICB0eiA9ICcnCisKKyAgICBpZiBub3dbM10gPiAxMjogY2xvY2sxMiA9IG5vd1szXSAtIDEyCisgICAgZWxpZiBub3dbM10gPiAwOiBjbG9jazEyID0gbm93WzNdCisgICAgZWxzZTogY2xvY2sxMiA9IDEyCisKKyAgICBleHBlY3RhdGlvbnMgPSAoCisgICAgICAgICgnJWEnLCBjYWxlbmRhci5kYXlfYWJicltub3dbNl1dLCAnYWJicmV2aWF0ZWQgd2Vla2RheSBuYW1lJyksCisgICAgICAgICgnJUEnLCBjYWxlbmRhci5kYXlfbmFtZVtub3dbNl1dLCAnZnVsbCB3ZWVrZGF5IG5hbWUnKSwKKyAgICAgICAgKCclYicsIGNhbGVuZGFyLm1vbnRoX2FiYnJbbm93WzFdXSwgJ2FiYnJldmlhdGVkIG1vbnRoIG5hbWUnKSwKKyAgICAgICAgKCclQicsIGNhbGVuZGFyLm1vbnRoX25hbWVbbm93WzFdXSwgJ2Z1bGwgbW9udGggbmFtZScpLAorICAgICAgICAjICVjIHNlZSBiZWxvdworICAgICAgICAoJyVkJywgJyUwMmQnICUgbm93WzJdLCAnZGF5IG9mIG1vbnRoIGFzIG51bWJlciAoMDAtMzEpJyksCisgICAgICAgICgnJUgnLCAnJTAyZCcgJSBub3dbM10sICdob3VyICgwMC0yMyknKSwKKyAgICAgICAgKCclSScsICclMDJkJyAlIGNsb2NrMTIsICdob3VyICgwMS0xMiknKSwKKyAgICAgICAgKCclaicsICclMDNkJyAlIG5vd1s3XSwgJ2p1bGlhbiBkYXkgKDAwMS0zNjYpJyksCisgICAgICAgICgnJW0nLCAnJTAyZCcgJSBub3dbMV0sICdtb250aCBhcyBudW1iZXIgKDAxLTEyKScpLAorICAgICAgICAoJyVNJywgJyUwMmQnICUgbm93WzRdLCAnbWludXRlLCAoMDAtNTkpJyksCisgICAgICAgICgnJXAnLCBhbXBtLCAnQU0gb3IgUE0gYXMgYXBwcm9wcmlhdGUnKSwKKyAgICAgICAgKCclUycsICclMDJkJyAlIG5vd1s1XSwgJ3NlY29uZHMgb2YgY3VycmVudCB0aW1lICgwMC02MCknKSwKKyAgICAgICAgKCclVScsICclMDJkJyAlICgobm93WzddICsgamFuMVs2XSkvNyksCisgICAgICAgICAnd2VlayBudW1iZXIgb2YgdGhlIHllYXIgKFN1biAxc3QpJyksCisgICAgICAgICgnJXcnLCAnMD8lZCcgJSAoKDErbm93WzZdKSAlIDcpLCAnd2Vla2RheSBhcyBhIG51bWJlciAoU3VuIDFzdCknKSwKKyAgICAgICAgKCclVycsICclMDJkJyAlICgobm93WzddICsgKGphbjFbNl0gLSAxKSU3KS83KSwKKyAgICAgICAgICd3ZWVrIG51bWJlciBvZiB0aGUgeWVhciAoTW9uIDFzdCknKSwKKyAgICAgICAgIyAleCBzZWUgYmVsb3cKKyAgICAgICAgKCclWCcsICclMDJkOiUwMmQ6JTAyZCcgJSAobm93WzNdLCBub3dbNF0sIG5vd1s1XSksICclSDolTTolUycpLAorICAgICAgICAoJyV5JywgJyUwMmQnICUgKG5vd1swXSUxMDApLCAneWVhciB3aXRob3V0IGNlbnR1cnknKSwKKyAgICAgICAgKCclWScsICclZCcgJSBub3dbMF0sICd5ZWFyIHdpdGggY2VudHVyeScpLAorICAgICAgICAjICVaIHNlZSBiZWxvdworICAgICAgICAoJyUlJywgJyUnLCAnc2luZ2xlIHBlcmNlbnQgc2lnbicpLAorICAgICAgICApCisKKyAgICBub25zdGFuZGFyZF9leHBlY3RhdGlvbnMgPSAoCisgICAgICAgICMgVGhlc2UgYXJlIHN0YW5kYXJkIGJ1dCBkb24ndCBoYXZlIHByZWRpY3RhYmxlIG91dHB1dAorICAgICAgICAoJyVjJywgZml4YXNjdGltZSh0aW1lLmFzY3RpbWUobm93KSksICduZWFyLWFzY3RpbWUoKSBmb3JtYXQnKSwKKyAgICAgICAgKCcleCcsICclMDJkLyUwMmQvJTAyZCcgJSAobm93WzFdLCBub3dbMl0sIChub3dbMF0lMTAwKSksCisgICAgICAgICAnJW0vJWQvJXkgJUg6JU06JVMnKSwKKyAgICAgICAgKCclWicsICclcycgJSB0eiwgJ3RpbWUgem9uZSBuYW1lJyksCisKKyAgICAgICAgIyBUaGVzZSBhcmUgc29tZSBwbGF0Zm9ybSBzcGVjaWZpYyBleHRlbnNpb25zCisgICAgICAgICgnJUQnLCAnJTAyZC8lMDJkLyUwMmQnICUgKG5vd1sxXSwgbm93WzJdLCAobm93WzBdJTEwMCkpLCAnbW0vZGQveXknKSwKKyAgICAgICAgKCclZScsICclMmQnICUgbm93WzJdLCAnZGF5IG9mIG1vbnRoIGFzIG51bWJlciwgYmxhbmsgcGFkZGVkICggMC0zMSknKSwKKyAgICAgICAgKCclaCcsIGNhbGVuZGFyLm1vbnRoX2FiYnJbbm93WzFdXSwgJ2FiYnJldmlhdGVkIG1vbnRoIG5hbWUnKSwKKyAgICAgICAgKCclaycsICclMmQnICUgbm93WzNdLCAnaG91ciwgYmxhbmsgcGFkZGVkICggMC0yMyknKSwKKyAgICAgICAgKCclbicsICdcbicsICduZXdsaW5lIGNoYXJhY3RlcicpLAorICAgICAgICAoJyVyJywgJyUwMmQ6JTAyZDolMDJkICVzJyAlIChjbG9jazEyLCBub3dbNF0sIG5vd1s1XSwgYW1wbSksCisgICAgICAgICAnJUk6JU06JVMgJXAnKSwKKyAgICAgICAgKCclUicsICclMDJkOiUwMmQnICUgKG5vd1szXSwgbm93WzRdKSwgJyVIOiVNJyksCisgICAgICAgICgnJXMnLCBub3dzZWNzLCAnc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2ggaW4gVUNUJyksCisgICAgICAgICgnJXQnLCAnXHQnLCAndGFiIGNoYXJhY3RlcicpLAorICAgICAgICAoJyVUJywgJyUwMmQ6JTAyZDolMDJkJyAlIChub3dbM10sIG5vd1s0XSwgbm93WzVdKSwgJyVIOiVNOiVTJyksCisgICAgICAgICgnJTN5JywgJyUwM2QnICUgKG5vd1swXSUxMDApLAorICAgICAgICAgJ3llYXIgd2l0aG91dCBjZW50dXJ5IHJlbmRlcmVkIHVzaW5nIGZpZWxkd2lkdGgnKSwKKyAgICAgICAgKQorCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgIlN0cmZ0aW1lIHRlc3QsIHBsYXRmb3JtOiAlcywgUHl0aG9uIHZlcnNpb246ICVzIiAlIFwKKyAgICAgICAgICAgICAgKHN5cy5wbGF0Zm9ybSwgc3RyaW5nLnNwbGl0KHN5cy52ZXJzaW9uKVswXSkKKworICAgIGZvciBlIGluIGV4cGVjdGF0aW9uczoKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgZiA9IGdldGF0dHIoaW5wdXQsIG5hbWUpCi0gICAgICAgICAgICB2YWx1ZSA9IGFwcGx5KGYsIGFyZ3MpCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIGYgPSBnZXRhdHRyKHN0cmluZywgbmFtZSkKLSAgICAgICAgICAgIHZhbHVlID0gYXBwbHkoZiwgKGlucHV0LCkgKyBhcmdzKQotICAgIGV4Y2VwdDoKLSAgICAgICAgIHZhbHVlID0gc3lzLmV4Y190eXBlCi0gICAgaWYgdmFsdWUgIT0gb3V0cHV0OgotICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgcHJpbnQgJ25vJwotICAgICAgICBwcmludCBmLCBgaW5wdXRgLCBgb3V0cHV0YCwgYHZhbHVlYAotICAgIGVsc2U6Ci0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCAneWVzJworICAgICAgICAgICAgcmVzdWx0ID0gdGltZS5zdHJmdGltZShlWzBdLCBub3cpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlcnJvcjoKKyAgICAgICAgICAgIHByaW50ICJTdGFuZGFyZCAnJXMnIGZvcm1hdCBnYXZlIGVycm9yOiIgJSBlWzBdLCBlcnJvcgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgcmUubWF0Y2goZVsxXSwgcmVzdWx0KTogY29udGludWUKKyAgICAgICAgaWYgbm90IHJlc3VsdCBvciByZXN1bHRbMF0gPT0gJyUnOgorICAgICAgICAgICAgcHJpbnQgIkRvZXMgbm90IHN1cHBvcnQgc3RhbmRhcmQgJyVzJyBmb3JtYXQgKCVzKSIgJSAoZVswXSwgZVsyXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJDb25mbGljdCBmb3IgJXMgKCVzKToiICUgKGVbMF0sIGVbMl0pCisgICAgICAgICAgICBwcmludCAiICBFeHBlY3RlZCAlcywgYnV0IGdvdCAlcyIgJSAoZVsxXSwgcmVzdWx0KQogCi10ZXN0KCdhdG9pJywgIiAxICIsIDEpCi10ZXN0KCdhdG9pJywgIiAxeCIsIFZhbHVlRXJyb3IpCi10ZXN0KCdhdG9pJywgIiB4MSAiLCBWYWx1ZUVycm9yKQotdGVzdCgnYXRvbCcsICIgIDEgICIsIDFMKQotdGVzdCgnYXRvbCcsICIgIDF4ICIsIFZhbHVlRXJyb3IpCi10ZXN0KCdhdG9sJywgIiAgeDEgIiwgVmFsdWVFcnJvcikKLXRlc3QoJ2F0b2YnLCAiICAxICAiLCAxLjApCi10ZXN0KCdhdG9mJywgIiAgMXggIiwgVmFsdWVFcnJvcikKLXRlc3QoJ2F0b2YnLCAiICB4MSAiLCBWYWx1ZUVycm9yKQorICAgIGZvciBlIGluIG5vbnN0YW5kYXJkX2V4cGVjdGF0aW9uczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gdGltZS5zdHJmdGltZShlWzBdLCBub3cpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCByZXN1bHQ6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJFcnJvciBmb3Igbm9uc3RhbmRhcmQgJyVzJyBmb3JtYXQgKCVzKTogJXMiICUgXAorICAgICAgICAgICAgICAgICAgICAgIChlWzBdLCBlWzJdLCBzdHIocmVzdWx0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHJlLm1hdGNoKGVbMV0sIHJlc3VsdCk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJTdXBwb3J0cyBub25zdGFuZGFyZCAnJXMnIGZvcm1hdCAoJXMpIiAlIChlWzBdLCBlWzJdKQorICAgICAgICBlbGlmIG5vdCByZXN1bHQgb3IgcmVzdWx0WzBdID09ICclJzoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIkRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0ICclcycgZm9ybWF0ICglcykiICUgKGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbMl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJDb25mbGljdCBmb3Igbm9uc3RhbmRhcmQgJyVzJyBmb3JtYXQgKCVzKToiICUgKGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVsyXSkKKyAgICAgICAgICAgICAgICBwcmludCAiICBFeHBlY3RlZCAlcywgYnV0IGdvdCAlcyIgJSAoZVsxXSwgcmVzdWx0KQogCi10ZXN0KCdjYXBpdGFsaXplJywgJyBoZWxsbyAnLCAnIGhlbGxvICcpCi10ZXN0KCdjYXBpdGFsaXplJywgJ2hlbGxvICcsICdIZWxsbyAnKQotdGVzdCgnZmluZCcsICdhYmNkZWZnaGlhYmMnLCAwLCAnYWJjJykKLXRlc3QoJ2ZpbmQnLCAnYWJjZGVmZ2hpYWJjJywgOSwgJ2FiYycsIDEpCi10ZXN0KCdmaW5kJywgJ2FiY2RlZmdoaWFiYycsIC0xLCAnZGVmJywgNCkKLXRlc3QoJ3JmaW5kJywgJ2FiY2RlZmdoaWFiYycsIDksICdhYmMnKQotdGVzdCgnbG93ZXInLCAnSGVMTG8nLCAnaGVsbG8nKQotdGVzdCgnbG93ZXInLCAnaGVsbG8nLCAnaGVsbG8nKQotdGVzdCgndXBwZXInLCAnSGVMTG8nLCAnSEVMTE8nKQotdGVzdCgndXBwZXInLCAnSEVMTE8nLCAnSEVMTE8nKQorZGVmIGZpeGFzY3RpbWUocyk6CisgICAgaWYgc1s4XSA9PSAnICc6CisgICAgICAgIHMgPSBzWzo4XSArICcwJyArIHNbOTpdCisgICAgcmV0dXJuIHMKIAotdGVzdCgndGl0bGUnLCAnIGhlbGxvICcsICcgSGVsbG8gJykKLXRlc3QoJ3RpdGxlJywgJ2hlbGxvICcsICdIZWxsbyAnKQotdGVzdCgndGl0bGUnLCAiZk9yTWFUIHRoSXMgYVMgdGl0TGUgU3RyaW5nIiwgJ0Zvcm1hdCBUaGlzIEFzIFRpdGxlIFN0cmluZycpCi10ZXN0KCd0aXRsZScsICJmT3JNYVQsdGhJcy1hUyp0aXRMZTtTdHJpbmciLCAnRm9ybWF0LFRoaXMtQXMqVGl0bGU7U3RyaW5nJykKLXRlc3QoJ3RpdGxlJywgImdldEludCIsICdHZXRpbnQnKQotCi10ZXN0KCdleHBhbmR0YWJzJywgJ2FiY1xyYWJcdGRlZlxuZ1x0aGknLCAnYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScpCi10ZXN0KCdleHBhbmR0YWJzJywgJ2FiY1xyYWJcdGRlZlxuZ1x0aGknLCAnYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScsIDgpCi10ZXN0KCdleHBhbmR0YWJzJywgJ2FiY1xyYWJcdGRlZlxuZ1x0aGknLCAnYWJjXHJhYiAgZGVmXG5nICAgaGknLCA0KQotdGVzdCgnZXhwYW5kdGFicycsICdhYmNcclxuYWJcdGRlZlxuZ1x0aGknLCAnYWJjXHJcbmFiICBkZWZcbmcgICBoaScsIDQpCi0KLXRlc3QoJ2lzbG93ZXInLCAnYScsIDEpCi10ZXN0KCdpc2xvd2VyJywgJ0EnLCAwKQotdGVzdCgnaXNsb3dlcicsICdcbicsIDApCi10ZXN0KCdpc2xvd2VyJywgJ2FiYycsIDEpCi10ZXN0KCdpc2xvd2VyJywgJ2FCYycsIDApCi10ZXN0KCdpc2xvd2VyJywgJ2FiY1xuJywgMSkKLQotdGVzdCgnaXN1cHBlcicsICdhJywgMCkKLXRlc3QoJ2lzdXBwZXInLCAnQScsIDEpCi10ZXN0KCdpc3VwcGVyJywgJ1xuJywgMCkKLXRlc3QoJ2lzdXBwZXInLCAnQUJDJywgMSkKLXRlc3QoJ2lzdXBwZXInLCAnQWJDJywgMCkKLXRlc3QoJ2lzdXBwZXInLCAnQUJDXG4nLCAxKQotCi10ZXN0KCdpc3RpdGxlJywgJ2EnLCAwKQotdGVzdCgnaXN0aXRsZScsICdBJywgMSkKLXRlc3QoJ2lzdGl0bGUnLCAnXG4nLCAwKQotdGVzdCgnaXN0aXRsZScsICdBIFRpdGxlY2FzZWQgTGluZScsIDEpCi10ZXN0KCdpc3RpdGxlJywgJ0FcblRpdGxlY2FzZWQgTGluZScsIDEpCi10ZXN0KCdpc3RpdGxlJywgJ0EgVGl0bGVjYXNlZCwgTGluZScsIDEpCi10ZXN0KCdpc3RpdGxlJywgJ05vdCBhIGNhcGl0YWxpemVkIFN0cmluZycsIDApCi10ZXN0KCdpc3RpdGxlJywgJ05vdFx0YSBUaXRsZWNhc2UgU3RyaW5nJywgMCkKLXRlc3QoJ2lzdGl0bGUnLCAnTm90LS1hIFRpdGxlY2FzZSBTdHJpbmcnLCAwKQotCi10ZXN0KCdzcGxpdGxpbmVzJywgImFiY1xuZGVmXG5ccmdoaSIsIFsnYWJjJywgJ2RlZicsICcnLCAnZ2hpJ10pCi10ZXN0KCdzcGxpdGxpbmVzJywgImFiY1xuZGVmXG5cclxuZ2hpIiwgWydhYmMnLCAnZGVmJywgJycsICdnaGknXSkKLXRlc3QoJ3NwbGl0bGluZXMnLCAiYWJjXG5kZWZcclxuZ2hpIiwgWydhYmMnLCAnZGVmJywgJ2doaSddKQotdGVzdCgnc3BsaXRsaW5lcycsICJhYmNcbmRlZlxyXG5naGlcbiIsIFsnYWJjJywgJ2RlZicsICdnaGknXSkKLXRlc3QoJ3NwbGl0bGluZXMnLCAiYWJjXG5kZWZcclxuZ2hpXG5cciIsIFsnYWJjJywgJ2RlZicsICdnaGknLCAnJ10pCi10ZXN0KCdzcGxpdGxpbmVzJywgIlxuYWJjXG5kZWZcclxuZ2hpXG5cciIsIFsnJywgJ2FiYycsICdkZWYnLCAnZ2hpJywgJyddKQotdGVzdCgnc3BsaXRsaW5lcycsICJcbmFiY1xuZGVmXHJcbmdoaVxuXHIiLCBbJ1xuJywgJ2FiY1xuJywgJ2RlZlxyXG4nLCAnZ2hpXG4nLCAnXHInXSwgMSkKLQotdHJhbnN0YWJsZSA9ICdcMDAwXDAwMVwwMDJcMDAzXDAwNFwwMDVcMDA2XDAwN1wwMTBcMDExXDAxMlwwMTNcMDE0XDAxNVwwMTZcMDE3XDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyAhIiMkJSZcJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXF1eX2B4eXpkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cMTc3XDIwMFwyMDFcMjAyXDIwM1wyMDRcMjA1XDIwNlwyMDdcMjEwXDIxMVwyMTJcMjEzXDIxNFwyMTVcMjE2XDIxN1wyMjBcMjIxXDIyMlwyMjNcMjI0XDIyNVwyMjZcMjI3XDIzMFwyMzFcMjMyXDIzM1wyMzRcMjM1XDIzNlwyMzdcMjQwXDI0MVwyNDJcMjQzXDI0NFwyNDVcMjQ2XDI0N1wyNTBcMjUxXDI1MlwyNTNcMjU0XDI1NVwyNTZcMjU3XDI2MFwyNjFcMjYyXDI2M1wyNjRcMjY1XDI2NlwyNjdcMjcwXDI3MVwyNzJcMjczXDI3NFwyNzVcMjc2XDI3N1wzMDBcMzAxXDMwMlwzMDNcMzA0XDMwNVwzMDZcMzA3XDMxMFwzMTFcMzEyXDMxM1wzMTRcMzE1XDMxNlwzMTdcMzIwXDMyMVwzMjJcMzIzXDMyNFwzMjVcMzI2XDMyN1wzMzBcMzMxXDMzMlwzMzNcMzM0XDMzNVwzMzZcMzM3XDM0MFwzNDFcMzQyXDM0M1wzNDRcMzQ1XDM0NlwzNDdcMzUwXDM1MVwzNTJcMzUzXDM1NFwzNTVcMzU2XDM1N1wzNjBcMzYxXDM2MlwzNjNcMzY0XDM2NVwzNjZcMzY3XDM3MFwzNzFcMzcyXDM3M1wzNzRcMzc1XDM3NlwzNzcnCi0KLXRlc3QoJ21ha2V0cmFucycsICdhYmMnLCB0cmFuc3RhYmxlLCAneHl6JykKLXRlc3QoJ21ha2V0cmFucycsICdhYmMnLCBWYWx1ZUVycm9yLCAneHl6cScpCi0KLXRlc3QoJ3NwbGl0JywgJ3RoaXMgaXMgdGhlIHNwbGl0IGZ1bmN0aW9uJywKLSAgICAgWyd0aGlzJywgJ2lzJywgJ3RoZScsICdzcGxpdCcsICdmdW5jdGlvbiddKQotdGVzdCgnc3BsaXQnLCAnYXxifGN8ZCcsIFsnYScsICdiJywgJ2MnLCAnZCddLCAnfCcpCi10ZXN0KCdzcGxpdCcsICdhfGJ8Y3xkJywgWydhJywgJ2InLCAnY3xkJ10sICd8JywgMikKLXRlc3QoJ3NwbGl0JywgJ2EgYiBjIGQnLCBbJ2EnLCAnYiBjIGQnXSwgTm9uZSwgMSkKLXRlc3QoJ3NwbGl0JywgJ2EgYiBjIGQnLCBbJ2EnLCAnYicsICdjIGQnXSwgTm9uZSwgMikKLXRlc3QoJ3NwbGl0JywgJ2EgYiBjIGQnLCBbJ2EnLCAnYicsICdjJywgJ2QnXSwgTm9uZSwgMykKLXRlc3QoJ3NwbGl0JywgJ2EgYiBjIGQnLCBbJ2EnLCAnYicsICdjJywgJ2QnXSwgTm9uZSwgNCkKLXRlc3QoJ3NwbGl0JywgJ2EgYiBjIGQnLCBbJ2EgYiBjIGQnXSwgTm9uZSwgMCkKLXRlc3QoJ3NwbGl0JywgJ2EgIGIgIGMgIGQnLCBbJ2EnLCAnYicsICdjICBkJ10sIE5vbmUsIDIpCi10ZXN0KCdzcGxpdCcsICdhIGIgYyBkICcsIFsnYScsICdiJywgJ2MnLCAnZCddKQotCi0jIGpvaW4gbm93IHdvcmtzIHdpdGggYW55IHNlcXVlbmNlIHR5cGUKLWNsYXNzIFNlcXVlbmNlOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKTogc2VsZi5zZXEgPSAnd3h5eicKLSAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLnNlcSkKLSAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6IHJldHVybiBzZWxmLnNlcVtpXQotCi10ZXN0KCdqb2luJywgWydhJywgJ2InLCAnYycsICdkJ10sICdhIGIgYyBkJykKLXRlc3QoJ2pvaW4nLCAoJ2EnLCAnYicsICdjJywgJ2QnKSwgJ2FiY2QnLCAnJykKLXRlc3QoJ2pvaW4nLCBTZXF1ZW5jZSgpLCAndyB4IHkgeicpCi10ZXN0KCdqb2luJywgNywgVHlwZUVycm9yKQotCi1jbGFzcyBCYWRTZXEoU2VxdWVuY2UpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKTogc2VsZi5zZXEgPSBbNywgJ2hlbGxvJywgMTIzTF0KLQotdGVzdCgnam9pbicsIEJhZFNlcSgpLCBUeXBlRXJyb3IpCi0KLSMgdHJ5IGEgZmV3IGxvbmcgb25lcwotcHJpbnQgc3RyaW5nLmpvaW4oWyd4JyAqIDEwMF0gKiAxMDAsICc6JykKLXByaW50IHN0cmluZy5qb2luKCgneCcgKiAxMDAsKSAqIDEwMCwgJzonKQotCi10ZXN0KCdzdHJpcCcsICcgICBoZWxsbyAgICcsICdoZWxsbycpCi10ZXN0KCdsc3RyaXAnLCAnICAgaGVsbG8gICAnLCAnaGVsbG8gICAnKQotdGVzdCgncnN0cmlwJywgJyAgIGhlbGxvICAgJywgJyAgIGhlbGxvJykKLXRlc3QoJ3N0cmlwJywgJ2hlbGxvJywgJ2hlbGxvJykKLQotdGVzdCgnc3dhcGNhc2UnLCAnSGVMTG8gY09tcFV0ZVJzJywgJ2hFbGxPIENvTVB1VEVyUycpCi10ZXN0KCd0cmFuc2xhdGUnLCAneHl6YWJjZGVmJywgJ3h5enh5eicsIHRyYW5zdGFibGUsICdkZWYnKQotCi10YWJsZSA9IHN0cmluZy5tYWtldHJhbnMoJ2EnLCAnQScpCi10ZXN0KCd0cmFuc2xhdGUnLCAnYWJjJywgJ0FiYycsIHRhYmxlKQotdGVzdCgndHJhbnNsYXRlJywgJ3h5eicsICd4eXonLCB0YWJsZSkKLQotdGVzdCgncmVwbGFjZScsICdvbmUhdHdvIXRocmVlIScsICdvbmVAdHdvIXRocmVlIScsICchJywgJ0AnLCAxKQotdGVzdCgncmVwbGFjZScsICdvbmUhdHdvIXRocmVlIScsICdvbmV0d290aHJlZScsICchJywgJycpCi10ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJ29uZUB0d29AdGhyZWUhJywgJyEnLCAnQCcsIDIpCi10ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJ29uZUB0d29AdGhyZWVAJywgJyEnLCAnQCcsIDMpCi10ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJ29uZUB0d29AdGhyZWVAJywgJyEnLCAnQCcsIDQpCi10ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJyEnLCAnQCcsIDApCi10ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJ29uZUB0d29AdGhyZWVAJywgJyEnLCAnQCcpCi10ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJ3gnLCAnQCcpCi10ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJ3gnLCAnQCcsIDIpCi0KLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAxLCAnaGUnKQotdGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsIDEsICdoZWxsbycpCi10ZXN0KCdzdGFydHN3aXRoJywgJ2hlbGxvJywgMCwgJ2hlbGxvIHdvcmxkJykKLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAxLCAnJykKLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAwLCAnZWxsbycpCi10ZXN0KCdzdGFydHN3aXRoJywgJ2hlbGxvJywgMSwgJ2VsbG8nLCAxKQotdGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsIDEsICdvJywgNCkKLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAwLCAnbycsIDUpCi10ZXN0KCdzdGFydHN3aXRoJywgJ2hlbGxvJywgMSwgJycsIDUpCi10ZXN0KCdzdGFydHN3aXRoJywgJ2hlbGxvJywgMCwgJ2xvJywgNikKLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG93b3JsZCcsIDEsICdsb3dvJywgMykKLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG93b3JsZCcsIDEsICdsb3dvJywgMywgNykKLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG93b3JsZCcsIDAsICdsb3dvJywgMywgNikKLQotdGVzdCgnZW5kc3dpdGgnLCAnaGVsbG8nLCAxLCAnbG8nKQotdGVzdCgnZW5kc3dpdGgnLCAnaGVsbG8nLCAwLCAnaGUnKQotdGVzdCgnZW5kc3dpdGgnLCAnaGVsbG8nLCAxLCAnJykKLXRlc3QoJ2VuZHN3aXRoJywgJ2hlbGxvJywgMCwgJ2hlbGxvIHdvcmxkJykKLXRlc3QoJ2VuZHN3aXRoJywgJ2hlbGxvd29ybGQnLCAwLCAnd29ybCcpCi10ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgMSwgJ3dvcmwnLCAzLCA5KQotdGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsIDEsICd3b3JsZCcsIDMsIDEyKQotdGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsIDEsICdsb3dvJywgMSwgNykKLXRlc3QoJ2VuZHN3aXRoJywgJ2hlbGxvd29ybGQnLCAxLCAnbG93bycsIDIsIDcpCi10ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgMSwgJ2xvd28nLCAzLCA3KQotdGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsIDAsICdsb3dvJywgNCwgNykKLXRlc3QoJ2VuZHN3aXRoJywgJ2hlbGxvd29ybGQnLCAwLCAnbG93bycsIDMsIDgpCi10ZXN0KCdlbmRzd2l0aCcsICdhYicsIDAsICdhYicsIDAsIDEpCi10ZXN0KCdlbmRzd2l0aCcsICdhYicsIDAsICdhYicsIDAsIDApCi0KLXN0cmluZy53aGl0ZXNwYWNlCi1zdHJpbmcubG93ZXJjYXNlCi1zdHJpbmcudXBwZXJjYXNlCittYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3Rfc3VwLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9zdXAucHkKaW5kZXggMzgzOWM3OS4uOTliYWNkYSAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9zdXAucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9zdXAucHkKQEAgLTEsOCArMSwyNiBAQAotIyBQeXRob24gdGVzdCBzZXQgLS0gc3VwcG9ydGluZyBkZWZpbml0aW9ucy4KKyIiIlN1cHBvcnRpbmcgZGVmaW5pdGlvbnMgZm9yIHRoZSBQeXRob24gcmVncmVzc2lvbiB0ZXN0LiIiIgogCi1UZXN0RmFpbGVkID0gJ3Rlc3Rfc3VwcG9ydCAtLSB0ZXN0IGZhaWxlZCcJIyBFeGNlcHRpb24KKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICAgICAgIiIiQmFzZSBjbGFzcyBmb3IgcmVncmVzc2lvbiB0ZXN0IGV4Y2VwdGlvbnMuIiIiCisKK2NsYXNzIFRlc3RGYWlsZWQoRXJyb3IpOgorICAgICAgICAiIiJUZXN0IGZhaWxlZC4iIiIKKworY2xhc3MgVGVzdFNraXBwZWQoRXJyb3IpOgorICAgICAgICAiIiJUZXN0IHNraXBwZWQuCisKKyAgICAgICAgVGhpcyBjYW4gYmUgcmFpc2VkIHRvIGluZGljYXRlIHRoYXQgYSB0ZXN0IHdhcyBkZWxpYmVyYXRseQorICAgICAgICBza2lwcGVkLCBidXQgbm90IGJlY2F1c2UgYSBmZWF0dXJlIHdhc24ndCBhdmFpbGFibGUuICBGb3IKKyAgICAgICAgZXhhbXBsZSwgaWYgc29tZSByZXNvdXJjZSBjYW4ndCBiZSB1c2VkLCBzdWNoIGFzIHRoZSBuZXR3b3JrCisgICAgICAgIGFwcGVhcnMgdG8gYmUgdW5hdmFpbGFibGUsIHRoaXMgc2hvdWxkIGJlIHJhaXNlZCBpbnN0ZWFkIG9mCisgICAgICAgIFRlc3RGYWlsZWQuCisKKyAgICAgICAgIiIiCisKIAogdmVyYm9zZSA9IDEJCQkJIyBGbGFnIHNldCB0byAwIGJ5IHJlZ3J0ZXN0LnB5Cit1c2VfbGFyZ2VfcmVzb3VyY2VzID0gMSAjIEZsYWcgc2V0IHRvIDAgYnkgcmVncnRlc3QucHkKIAogZGVmIHVubG9hZChuYW1lKToKIAlpbXBvcnQgc3lzCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X3RpbS5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfdGltLnB5CmluZGV4IDVkYmM4OTUuLjAzZDA4MWUgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfdGltLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfdGltLnB5CkBAIC0xLDIxICsxLDM5IEBACi1mcm9tIHRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZQotaW1wb3J0IHRpbWluZworaW1wb3J0IHRpbWUKIAotciA9IHJhbmdlKDEwMDAwMCkKLWlmIHZlcmJvc2U6Ci0gICAgcHJpbnQgJ3N0YXJ0aW5nLi4uJwotdGltaW5nLnN0YXJ0KCkKLWZvciBpIGluIHI6Cit0aW1lLmFsdHpvbmUKK3RpbWUuY2xvY2soKQordCA9IHRpbWUudGltZSgpCit0aW1lLmFzY3RpbWUodGltZS5nbXRpbWUodCkpCitpZiB0aW1lLmN0aW1lKHQpIDw+IHRpbWUuYXNjdGltZSh0aW1lLmxvY2FsdGltZSh0KSk6CisgICAgcHJpbnQgJ3RpbWUuY3RpbWUodCkgPD4gdGltZS5hc2N0aW1lKHRpbWUubG9jYWx0aW1lKHQpKScKKwordGltZS5kYXlsaWdodAoraWYgbG9uZyh0aW1lLm1rdGltZSh0aW1lLmxvY2FsdGltZSh0KSkpIDw+IGxvbmcodCk6CisgICAgcHJpbnQgJ3RpbWUubWt0aW1lKHRpbWUubG9jYWx0aW1lKHQpKSA8PiB0JworCit0aW1lLnNsZWVwKDEuMikKK3R0ID0gdGltZS5nbXRpbWUodCkKK2ZvciBkaXJlY3RpdmUgaW4gKCdhJywgJ0EnLCAnYicsICdCJywgJ2MnLCAnZCcsICdIJywgJ0knLAorICAgICAgICAgICAgICAgICAgJ2onLCAnbScsICdNJywgJ3AnLCAnUycsCisgICAgICAgICAgICAgICAgICAnVScsICd3JywgJ1cnLCAneCcsICdYJywgJ3knLCAnWScsICdaJywgJyUnKToKKyAgICBmb3JtYXQgPSAnICUnICsgZGlyZWN0aXZlCisgICAgdHJ5OgorICAgICAgICB0aW1lLnN0cmZ0aW1lKGZvcm1hdCwgdHQpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHByaW50ICdjb252ZXJzaW9uIHNwZWNpZmllcjonLCBmb3JtYXQsICcgZmFpbGVkLicKKwordGltZS50aW1lem9uZQordGltZS50em5hbWUKKworIyBleHBlY3RlZCBlcnJvcnMKK3RyeToKKyAgICB0aW1lLmFzY3RpbWUoMCkKK2V4Y2VwdCBUeXBlRXJyb3I6CiAgICAgcGFzcwotdGltaW5nLmZpbmlzaCgpCi1pZiB2ZXJib3NlOgotICAgIHByaW50ICdmaW5pc2hlZCcKIAotc2VjcyA9IHRpbWluZy5zZWNvbmRzKCkKLW1pbGxpID0gdGltaW5nLm1pbGxpKCkKLW1pY3JvID0gdGltaW5nLm1pY3JvKCkKLQotaWYgdmVyYm9zZToKLSAgICBwcmludCAnc2Vjb25kczonLCBzZWNzCi0gICAgcHJpbnQgJ21pbGxpICA6JywgbWlsbGkKLSAgICBwcmludCAnbWljcm8gIDonLCBtaWNybwordHJ5OgorICAgIHRpbWUubWt0aW1lKCg5OTk5OTksIDk5OTk5OSwgOTk5OTk5LCA5OTk5OTksCisgICAgICAgICAgICAgICAgIDk5OTk5OSwgOTk5OTk5LCA5OTk5OTksIDk5OTk5OSwKKyAgICAgICAgICAgICAgICAgOTk5OTk5KSkKK2V4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfdHlwLnB5IGIvTGliL2Rvcy04eDMvdGVzdF90eXAucHkKaW5kZXggZTIyYjBlMi4uZTNhNTFmMCAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF90eXAucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF90eXAucHkKQEAgLTI1MywzICsyNTMsMTUgQEAKIGlmIGQuZ2V0KCdjJywgMykgIT0gMzogcmFpc2UgVGVzdEZhaWxlZCwgJ21pc3NpbmcgZGljdCBnZXQsIHcvIDJuZCBhcmcnCiBpZiBkLmdldCgnYScpICE9IDE6IHJhaXNlIFRlc3RGYWlsZWQsICdwcmVzZW50IGRpY3QgZ2V0LCBubyAybmQgYXJnJwogaWYgZC5nZXQoJ2EnLCAzKSAhPSAxOiByYWlzZSBUZXN0RmFpbGVkLCAncHJlc2VudCBkaWN0IGdldCwgdy8gMm5kIGFyZycKKyMgZGljdC5zZXRkZWZhdWx0KCkKK2QgPSB7fQoraWYgZC5zZXRkZWZhdWx0KCdrZXkwJykgPD4gTm9uZToKKwlyYWlzZSBUZXN0RmFpbGVkLCAnbWlzc2luZyB7fSBzZXRkZWZhdWx0LCBubyAybmQgYXJnJworaWYgZC5zZXRkZWZhdWx0KCdrZXkwJykgPD4gTm9uZToKKwlyYWlzZSBUZXN0RmFpbGVkLCAncHJlc2VudCB7fSBzZXRkZWZhdWx0LCBubyAybmQgYXJnJworZC5zZXRkZWZhdWx0KCdrZXknLCBbXSkuYXBwZW5kKDMpCitpZiBkWydrZXknXVswXSA8PiAzOgorCXJhaXNlIFRlc3RGYWlsZWQsICdtaXNzaW5nIHt9IHNldGRlZmF1bHQsIHcvIDJuZCBhcmcnCitkLnNldGRlZmF1bHQoJ2tleScsIFtdKS5hcHBlbmQoNCkKK2lmIGxlbihkWydrZXknXSkgPD4gMjoKKwlyYWlzZSBUZXN0RmFpbGVkLCAncHJlc2VudCB7fSBzZXRkZWZhdWx0LCB3LyAybmQgYXJnJwpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF91bmkucHkgYi9MaWIvZG9zLTh4My90ZXN0X3VuaS5weQppbmRleCA2ZGRkMDc3Li44NDc5YzIwIDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X3VuaS5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X3VuaS5weQpAQCAtMSw1MCArMSw1MTcgQEAKLSIiIiBUZXN0IHNjcmlwdCBmb3IgdGhlIHVuaWNvZGVkYXRhIG1vZHVsZS4KKyIiIiBUZXN0IHNjcmlwdCBmb3IgdGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24uCiAKIFdyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgogCiAoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgogCi0iIiIjIgorIiIiCiBmcm9tIHRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZQogaW1wb3J0IHN5cwogCi0jIFRlc3QgVW5pY29kZSBkYXRhYmFzZSBBUElzCi1pbXBvcnQgdW5pY29kZWRhdGEKK2RlZiB0ZXN0KG1ldGhvZCwgaW5wdXQsIG91dHB1dCwgKmFyZ3MpOgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICclcy4lcyVzID0/ICVzLi4uICcgJSAocmVwcihpbnB1dCksIG1ldGhvZCwgYXJncywgb3V0cHV0KSwKKyAgICB0cnk6CisgICAgICAgIGYgPSBnZXRhdHRyKGlucHV0LCBtZXRob2QpCisgICAgICAgIHZhbHVlID0gYXBwbHkoZiwgYXJncykKKyAgICBleGNlcHQ6CisgICAgICAgIHZhbHVlID0gc3lzLmV4Y190eXBlCisgICAgICAgIGV4YyA9IHN5cy5leGNfaW5mbygpWzoyXQorICAgIGVsc2U6CisgICAgICAgIGV4YyA9IE5vbmUKKyAgICBpZiB2YWx1ZSAhPSBvdXRwdXQ6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnbm8nCisgICAgICAgIHByaW50ICcqJyxmLCBgaW5wdXRgLCBgb3V0cHV0YCwgYHZhbHVlYAorICAgICAgICBpZiBleGM6CisgICAgICAgICAgICBwcmludCAnICB2YWx1ZSA9PSAlczogJXMnICUgKGV4YykKKyAgICBlbHNlOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3llcycKIAotcHJpbnQgJ1Rlc3RpbmcgdW5pY29kZWRhdGEgbW9kdWxlLi4uJywKK3Rlc3QoJ2NhcGl0YWxpemUnLCB1JyBoZWxsbyAnLCB1JyBoZWxsbyAnKQordGVzdCgnY2FwaXRhbGl6ZScsIHUnaGVsbG8gJywgdSdIZWxsbyAnKQogCi1hc3NlcnQgdW5pY29kZWRhdGEuZGlnaXQodSdBJyxOb25lKSBpcyBOb25lCi1hc3NlcnQgdW5pY29kZWRhdGEuZGlnaXQodSc5JykgPT0gOQotYXNzZXJ0IHVuaWNvZGVkYXRhLmRpZ2l0KHUnXHUyMTViJyxOb25lKSBpcyBOb25lCi1hc3NlcnQgdW5pY29kZWRhdGEuZGlnaXQodSdcdTI0NjgnKSA9PSA5Cit0ZXN0KCd0aXRsZScsIHUnIGhlbGxvICcsIHUnIEhlbGxvICcpCit0ZXN0KCd0aXRsZScsIHUnaGVsbG8gJywgdSdIZWxsbyAnKQordGVzdCgndGl0bGUnLCB1ImZPck1hVCB0aElzIGFTIHRpdExlIFN0cmluZyIsIHUnRm9ybWF0IFRoaXMgQXMgVGl0bGUgU3RyaW5nJykKK3Rlc3QoJ3RpdGxlJywgdSJmT3JNYVQsdGhJcy1hUyp0aXRMZTtTdHJpbmciLCB1J0Zvcm1hdCxUaGlzLUFzKlRpdGxlO1N0cmluZycpCit0ZXN0KCd0aXRsZScsIHUiZ2V0SW50IiwgdSdHZXRpbnQnKQogCi1hc3NlcnQgdW5pY29kZWRhdGEubnVtZXJpYyh1J0EnLE5vbmUpIGlzIE5vbmUKLWFzc2VydCB1bmljb2RlZGF0YS5udW1lcmljKHUnOScpID09IDkKLWFzc2VydCB1bmljb2RlZGF0YS5udW1lcmljKHUnXHUyMTViJykgPT0gMC4xMjUKLWFzc2VydCB1bmljb2RlZGF0YS5udW1lcmljKHUnXHUyNDY4JykgPT0gOS4wCit0ZXN0KCdmaW5kJywgdSdhYmNkZWZnaGlhYmMnLCAwLCB1J2FiYycpCit0ZXN0KCdmaW5kJywgdSdhYmNkZWZnaGlhYmMnLCA5LCB1J2FiYycsIDEpCit0ZXN0KCdmaW5kJywgdSdhYmNkZWZnaGlhYmMnLCAtMSwgdSdkZWYnLCA0KQogCi1hc3NlcnQgdW5pY29kZWRhdGEuZGVjaW1hbCh1J0EnLE5vbmUpIGlzIE5vbmUKLWFzc2VydCB1bmljb2RlZGF0YS5kZWNpbWFsKHUnOScpID09IDkKLWFzc2VydCB1bmljb2RlZGF0YS5kZWNpbWFsKHUnXHUyMTViJyxOb25lKSBpcyBOb25lCi1hc3NlcnQgdW5pY29kZWRhdGEuZGVjaW1hbCh1J1x1MjQ2OCcsTm9uZSkgaXMgTm9uZQordGVzdCgncmZpbmQnLCB1J2FiY2RlZmdoaWFiYycsIDksIHUnYWJjJykKIAotYXNzZXJ0IHVuaWNvZGVkYXRhLmNhdGVnb3J5KHUnXHVGRkZFJykgPT0gJ0NuJwotYXNzZXJ0IHVuaWNvZGVkYXRhLmNhdGVnb3J5KHUnYScpID09ICdMbCcKLWFzc2VydCB1bmljb2RlZGF0YS5jYXRlZ29yeSh1J0EnKSA9PSAnTHUnCit0ZXN0KCdsb3dlcicsIHUnSGVMTG8nLCB1J2hlbGxvJykKK3Rlc3QoJ2xvd2VyJywgdSdoZWxsbycsIHUnaGVsbG8nKQogCi1hc3NlcnQgdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbCh1J1x1RkZGRScpID09ICcnCi1hc3NlcnQgdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbCh1JyAnKSA9PSAnV1MnCi1hc3NlcnQgdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbCh1J0EnKSA9PSAnTCcKK3Rlc3QoJ3VwcGVyJywgdSdIZUxMbycsIHUnSEVMTE8nKQordGVzdCgndXBwZXInLCB1J0hFTExPJywgdSdIRUxMTycpCiAKLWFzc2VydCB1bmljb2RlZGF0YS5kZWNvbXBvc2l0aW9uKHUnXHVGRkZFJykgPT0gJycKLWFzc2VydCB1bmljb2RlZGF0YS5kZWNvbXBvc2l0aW9uKHUnXHUwMGJjJykgPT0gJzxmcmFjdGlvbj4gMDAzMSAyMDQ0IDAwMzQnCitpZiAwOgorICAgIHRyYW5zdGFibGUgPSAnXDAwMFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDAxN1wwMjBcMDIxXDAyMlwwMjNcMDI0XDAyNVwwMjZcMDI3XDAzMFwwMzFcMDMyXDAzM1wwMzRcMDM1XDAzNlwwMzcgISIjJCUmXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9geHl6ZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+XDE3N1wyMDBcMjAxXDIwMlwyMDNcMjA0XDIwNVwyMDZcMjA3XDIxMFwyMTFcMjEyXDIxM1wyMTRcMjE1XDIxNlwyMTdcMjIwXDIyMVwyMjJcMjIzXDIyNFwyMjVcMjI2XDIyN1wyMzBcMjMxXDIzMlwyMzNcMjM0XDIzNVwyMzZcMjM3XDI0MFwyNDFcMjQyXDI0M1wyNDRcMjQ1XDI0NlwyNDdcMjUwXDI1MVwyNTJcMjUzXDI1NFwyNTVcMjU2XDI1N1wyNjBcMjYxXDI2MlwyNjNcMjY0XDI2NVwyNjZcMjY3XDI3MFwyNzFcMjcyXDI3M1wyNzRcMjc1XDI3NlwyNzdcMzAwXDMwMVwzMDJcMzAzXDMwNFwzMDVcMzA2XDMwN1wzMTBcMzExXDMxMlwzMTNcMzE0XDMxNVwzMTZcMzE3XDMyMFwzMjFcMzIyXDMyM1wzMjRcMzI1XDMyNlwzMjdcMzMwXDMzMVwzMzJcMzMzXDMzNFwzMzVcMzM2XDMzN1wzNDBcMzQxXDM0MlwzNDNcMzQ0XDM0NVwzNDZcMzQ3XDM1MFwzNTFcMzUyXDM1M1wzNTRcMzU1XDM1NlwzNTdcMzYwXDM2MVwzNjJcMzYzXDM2NFwzNjVcMzY2XDM2N1wzNzBcMzcxXDM3MlwzNzNcMzc0XDM3NVwzNzZcMzc3JwogCi1hc3NlcnQgdW5pY29kZWRhdGEubWlycm9yZWQodSdcdUZGRkUnKSA9PSAwCi1hc3NlcnQgdW5pY29kZWRhdGEubWlycm9yZWQodSdhJykgPT0gMAotYXNzZXJ0IHVuaWNvZGVkYXRhLm1pcnJvcmVkKHUnXHUyMjAxJykgPT0gMQorICAgIHRlc3QoJ21ha2V0cmFucycsIHUnYWJjJywgdHJhbnN0YWJsZSwgdSd4eXonKQorICAgIHRlc3QoJ21ha2V0cmFucycsIHUnYWJjJywgVmFsdWVFcnJvciwgdSd4eXpxJykKIAotYXNzZXJ0IHVuaWNvZGVkYXRhLmNvbWJpbmluZyh1J1x1RkZGRScpID09IDAKLWFzc2VydCB1bmljb2RlZGF0YS5jb21iaW5pbmcodSdhJykgPT0gMAotYXNzZXJ0IHVuaWNvZGVkYXRhLmNvbWJpbmluZyh1J1x1MjBlMScpID09IDIzMAordGVzdCgnc3BsaXQnLCB1J3RoaXMgaXMgdGhlIHNwbGl0IGZ1bmN0aW9uJywKKyAgICAgW3UndGhpcycsIHUnaXMnLCB1J3RoZScsIHUnc3BsaXQnLCB1J2Z1bmN0aW9uJ10pCit0ZXN0KCdzcGxpdCcsIHUnYXxifGN8ZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgdSd8JykKK3Rlc3QoJ3NwbGl0JywgdSdhfGJ8Y3xkJywgW3UnYScsIHUnYicsIHUnY3xkJ10sIHUnfCcsIDIpCit0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2IgYyBkJ10sIE5vbmUsIDEpCit0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MgZCddLCBOb25lLCAyKQordGVzdCgnc3BsaXQnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sIE5vbmUsIDMpCit0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgTm9uZSwgNCkKK3Rlc3QoJ3NwbGl0JywgdSdhIGIgYyBkJywgW3UnYSBiIGMgZCddLCBOb25lLCAwKQordGVzdCgnc3BsaXQnLCB1J2EgIGIgIGMgIGQnLCBbdSdhJywgdSdiJywgdSdjICBkJ10sIE5vbmUsIDIpCit0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCAnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10pCisKKyMgam9pbiBub3cgd29ya3Mgd2l0aCBhbnkgc2VxdWVuY2UgdHlwZQorY2xhc3MgU2VxdWVuY2U6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9ICd3eHl6JworICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc2VxKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKTogcmV0dXJuIHNlbGYuc2VxW2ldCisKK3Rlc3QoJ2pvaW4nLCB1JyAnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10pCit0ZXN0KCdqb2luJywgdScnLCB1J2FiY2QnLCAodSdhJywgdSdiJywgdSdjJywgdSdkJykpCit0ZXN0KCdqb2luJywgdScgJywgdSd3IHggeSB6JywgU2VxdWVuY2UoKSkKK3Rlc3QoJ2pvaW4nLCB1JyAnLCBUeXBlRXJyb3IsIDcpCisKK2NsYXNzIEJhZFNlcShTZXF1ZW5jZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9IFs3LCB1J2hlbGxvJywgMTIzTF0KKwordGVzdCgnam9pbicsIHUnICcsIFR5cGVFcnJvciwgQmFkU2VxKCkpCisKK3Jlc3VsdCA9IHUnJworZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgIGlmIGkgPiAwOgorICAgICAgICByZXN1bHQgPSByZXN1bHQgKyB1JzonCisgICAgcmVzdWx0ID0gcmVzdWx0ICsgdSd4JyoxMAordGVzdCgnam9pbicsIHUnOicsIHJlc3VsdCwgW3UneCcgKiAxMF0gKiAxMCkKK3Rlc3QoJ2pvaW4nLCB1JzonLCByZXN1bHQsICh1J3gnICogMTAsKSAqIDEwKQorCit0ZXN0KCdzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1J2hlbGxvJykKK3Rlc3QoJ2xzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1J2hlbGxvICAgJykKK3Rlc3QoJ3JzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1JyAgIGhlbGxvJykKK3Rlc3QoJ3N0cmlwJywgdSdoZWxsbycsIHUnaGVsbG8nKQorCit0ZXN0KCdzd2FwY2FzZScsIHUnSGVMTG8gY09tcFV0ZVJzJywgdSdoRWxsTyBDb01QdVRFclMnKQorCitpZiAwOgorICAgIHRlc3QoJ3RyYW5zbGF0ZScsIHUneHl6YWJjZGVmJywgdSd4eXp4eXonLCB0cmFuc3RhYmxlLCB1J2RlZicpCisKKyAgICB0YWJsZSA9IHN0cmluZy5tYWtldHJhbnMoJ2EnLCB1J0EnKQorICAgIHRlc3QoJ3RyYW5zbGF0ZScsIHUnYWJjJywgdSdBYmMnLCB0YWJsZSkKKyAgICB0ZXN0KCd0cmFuc2xhdGUnLCB1J3h5eicsIHUneHl6JywgdGFibGUpCisKK3Rlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvIXRocmVlIScsIHUnIScsIHUnQCcsIDEpCit0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25ldHdvdGhyZWUnLCAnIScsICcnKQordGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZUB0d29AdGhyZWUhJywgdSchJywgdSdAJywgMikKK3Rlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvQHRocmVlQCcsIHUnIScsIHUnQCcsIDMpCit0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lQHR3b0B0aHJlZUAnLCB1JyEnLCB1J0AnLCA0KQordGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZSF0d28hdGhyZWUhJywgdSchJywgdSdAJywgMCkKK3Rlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvQHRocmVlQCcsIHUnIScsIHUnQCcpCit0ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lIXR3byF0aHJlZSEnLCB1J3gnLCB1J0AnKQordGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZSF0d28hdGhyZWUhJywgdSd4JywgdSdAJywgMikKKwordGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1J2hlJykKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMSwgdSdoZWxsbycpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnaGVsbG8gd29ybGQnKQordGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1JycpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnZWxsbycpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnZWxsbycsIDEpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnbycsIDQpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnbycsIDUpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnJywgNSkKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMCwgdSdsbycsIDYpCit0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSdsb3dvJywgMykKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAzLCA3KQordGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIDAsIHUnbG93bycsIDMsIDYpCisKK3Rlc3QoJ2VuZHN3aXRoJywgdSdoZWxsbycsIDEsIHUnbG8nKQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvJywgMCwgdSdoZScpCit0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1JycpCit0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG8nLCAwLCB1J2hlbGxvIHdvcmxkJykKK3Rlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMCwgdSd3b3JsJykKK3Rlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSd3b3JsJywgMywgOSkKK3Rlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSd3b3JsZCcsIDMsIDEyKQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAxLCA3KQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAyLCA3KQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAzLCA3KQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAwLCB1J2xvd28nLCA0LCA3KQordGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAwLCB1J2xvd28nLCAzLCA4KQordGVzdCgnZW5kc3dpdGgnLCB1J2FiJywgMCwgdSdhYicsIDAsIDEpCit0ZXN0KCdlbmRzd2l0aCcsIHUnYWInLCAwLCB1J2FiJywgMCwgMCkKKwordGVzdCgnZXhwYW5kdGFicycsIHUnYWJjXHJhYlx0ZGVmXG5nXHRoaScsIHUnYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScpCit0ZXN0KCdleHBhbmR0YWJzJywgdSdhYmNccmFiXHRkZWZcbmdcdGhpJywgdSdhYmNccmFiICAgICAgZGVmXG5nICAgICAgIGhpJywgOCkKK3Rlc3QoJ2V4cGFuZHRhYnMnLCB1J2FiY1xyYWJcdGRlZlxuZ1x0aGknLCB1J2FiY1xyYWIgIGRlZlxuZyAgIGhpJywgNCkKK3Rlc3QoJ2V4cGFuZHRhYnMnLCB1J2FiY1xyXG5hYlx0ZGVmXG5nXHRoaScsIHUnYWJjXHJcbmFiICBkZWZcbmcgICBoaScsIDQpCisKK2lmIDA6CisgICAgdGVzdCgnY2Fwd29yZHMnLCB1J2FiYyBkZWYgZ2hpJywgdSdBYmMgRGVmIEdoaScpCisgICAgdGVzdCgnY2Fwd29yZHMnLCB1J2FiY1x0ZGVmXG5naGknLCB1J0FiYyBEZWYgR2hpJykKKyAgICB0ZXN0KCdjYXB3b3JkcycsIHUnYWJjXHQgICBkZWYgIFxuZ2hpJywgdSdBYmMgRGVmIEdoaScpCisKKyMgQ29tcGFyaXNvbnM6CitwcmludCAnVGVzdGluZyBVbmljb2RlIGNvbXBhcmlzb25zLi4uJywKK2Fzc2VydCB1J2FiYycgPT0gJ2FiYycKK2Fzc2VydCAnYWJjJyA9PSB1J2FiYycKK2Fzc2VydCB1J2FiYycgPT0gdSdhYmMnCithc3NlcnQgdSdhYmNkJyA+ICdhYmMnCithc3NlcnQgJ2FiY2QnID4gdSdhYmMnCithc3NlcnQgdSdhYmNkJyA+IHUnYWJjJworYXNzZXJ0IHUnYWJjJyA8ICdhYmNkJworYXNzZXJ0ICdhYmMnIDwgdSdhYmNkJworYXNzZXJ0IHUnYWJjJyA8IHUnYWJjZCcKK3ByaW50ICdkb25lLicKKworaWYgMDoKKyAgICAjIE1vdmUgdGhlc2UgdGVzdHMgdG8gYSBVbmljb2RlIGNvbGxhdGlvbiBtb2R1bGUgdGVzdC4uLgorCisgICAgcHJpbnQgJ1Rlc3RpbmcgVVRGLTE2IGNvZGUgcG9pbnQgb3JkZXIgY29tcGFyaXNvbnMuLi4nLAorICAgICNObyBzdXJyb2dhdGVzLCBubyBmaXh1cCByZXF1aXJlZC4KKyAgICBhc3NlcnQgdSdcdTAwNjEnIDwgdSdcdTIwYWMnCisgICAgIyBOb24gc3Vycm9nYXRlIGJlbG93IHN1cnJvZ2F0ZSB2YWx1ZSwgbm8gZml4dXAgcmVxdWlyZWQKKyAgICBhc3NlcnQgdSdcdTAwNjEnIDwgdSdcdWQ4MDBcdWRjMDInCisKKyAgICAjIE5vbiBzdXJyb2dhdGUgYWJvdmUgc3Vycm9nYXRlIHZhbHVlLCBmaXh1cCByZXF1aXJlZAorICAgIGRlZiB0ZXN0X2xlY21wKHMsIHMyKToKKyAgICAgIGFzc2VydCBzIDwgIHMyICwgImNvbXBhcmlzb24gZmFpbGVkIG9uICVzIDwgJXMiICUgKHMsIHMyKQorCisgICAgZGVmIHRlc3RfZml4dXAocyk6CisgICAgICBzMiA9IHUnXHVkODAwXHVkYzAxJworICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgIHMyID0gdSdcdWQ5MDBcdWRjMDEnCisgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgczIgPSB1J1x1ZGEwMFx1ZGMwMScKKyAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICBzMiA9IHUnXHVkYjAwXHVkYzAxJworICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgIHMyID0gdSdcdWQ4MDBcdWRkMDEnCisgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgczIgPSB1J1x1ZDkwMFx1ZGQwMScKKyAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICBzMiA9IHUnXHVkYTAwXHVkZDAxJworICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgIHMyID0gdSdcdWRiMDBcdWRkMDEnCisgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgczIgPSB1J1x1ZDgwMFx1ZGUwMScKKyAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICBzMiA9IHUnXHVkOTAwXHVkZTAxJworICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgIHMyID0gdSdcdWRhMDBcdWRlMDEnCisgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgczIgPSB1J1x1ZGIwMFx1ZGUwMScKKyAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICBzMiA9IHUnXHVkODAwXHVkZmZmJworICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgIHMyID0gdSdcdWQ5MDBcdWRmZmYnCisgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgczIgPSB1J1x1ZGEwMFx1ZGZmZicKKyAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICBzMiA9IHUnXHVkYjAwXHVkZmZmJworICAgICAgdGVzdF9sZWNtcChzLCBzMikKKworICAgIHRlc3RfZml4dXAodSdcdWUwMDAnKQorICAgIHRlc3RfZml4dXAodSdcdWZmNjEnKQorCisgICAgIyBTdXJyb2dhdGVzIG9uIGJvdGggc2lkZXMsIG5vIGZpeHVwIHJlcXVpcmVkCisgICAgYXNzZXJ0IHUnXHVkODAwXHVkYzAyJyA8IHUnXHVkODRkXHVkYzU2JworICAgIHByaW50ICdkb25lLicKKwordGVzdCgnbGp1c3QnLCB1J2FiYycsICB1J2FiYyAgICAgICAnLCAxMCkKK3Rlc3QoJ3JqdXN0JywgdSdhYmMnLCAgdScgICAgICAgYWJjJywgMTApCit0ZXN0KCdjZW50ZXInLCB1J2FiYycsIHUnICAgYWJjICAgICcsIDEwKQordGVzdCgnbGp1c3QnLCB1J2FiYycsICB1J2FiYyAgICcsIDYpCit0ZXN0KCdyanVzdCcsIHUnYWJjJywgIHUnICAgYWJjJywgNikKK3Rlc3QoJ2NlbnRlcicsIHUnYWJjJywgdScgYWJjICAnLCA2KQordGVzdCgnbGp1c3QnLCB1J2FiYycsIHUnYWJjJywgMikKK3Rlc3QoJ3JqdXN0JywgdSdhYmMnLCB1J2FiYycsIDIpCit0ZXN0KCdjZW50ZXInLCB1J2FiYycsIHUnYWJjJywgMikKKwordGVzdCgnaXNsb3dlcicsIHUnYScsIDEpCit0ZXN0KCdpc2xvd2VyJywgdSdBJywgMCkKK3Rlc3QoJ2lzbG93ZXInLCB1J1xuJywgMCkKK3Rlc3QoJ2lzbG93ZXInLCB1J1x1MUZGYycsIDApCit0ZXN0KCdpc2xvd2VyJywgdSdhYmMnLCAxKQordGVzdCgnaXNsb3dlcicsIHUnYUJjJywgMCkKK3Rlc3QoJ2lzbG93ZXInLCB1J2FiY1xuJywgMSkKKwordGVzdCgnaXN1cHBlcicsIHUnYScsIDApCit0ZXN0KCdpc3VwcGVyJywgdSdBJywgMSkKK3Rlc3QoJ2lzdXBwZXInLCB1J1xuJywgMCkKK3Rlc3QoJ2lzdXBwZXInLCB1J1x1MUZGYycsIDApCit0ZXN0KCdpc3VwcGVyJywgdSdBQkMnLCAxKQordGVzdCgnaXN1cHBlcicsIHUnQWJDJywgMCkKK3Rlc3QoJ2lzdXBwZXInLCB1J0FCQ1xuJywgMSkKKwordGVzdCgnaXN0aXRsZScsIHUnYScsIDApCit0ZXN0KCdpc3RpdGxlJywgdSdBJywgMSkKK3Rlc3QoJ2lzdGl0bGUnLCB1J1xuJywgMCkKK3Rlc3QoJ2lzdGl0bGUnLCB1J1x1MUZGYycsIDEpCit0ZXN0KCdpc3RpdGxlJywgdSdBIFRpdGxlY2FzZWQgTGluZScsIDEpCit0ZXN0KCdpc3RpdGxlJywgdSdBXG5UaXRsZWNhc2VkIExpbmUnLCAxKQordGVzdCgnaXN0aXRsZScsIHUnQSBUaXRsZWNhc2VkLCBMaW5lJywgMSkKK3Rlc3QoJ2lzdGl0bGUnLCB1J0dyZWVrIFx1MUZGY2l0bGVjYXNlcyAuLi4nLCAxKQordGVzdCgnaXN0aXRsZScsIHUnTm90IGEgY2FwaXRhbGl6ZWQgU3RyaW5nJywgMCkKK3Rlc3QoJ2lzdGl0bGUnLCB1J05vdFx0YSBUaXRsZWNhc2UgU3RyaW5nJywgMCkKK3Rlc3QoJ2lzdGl0bGUnLCB1J05vdC0tYSBUaXRsZWNhc2UgU3RyaW5nJywgMCkKKwordGVzdCgnaXNhbHBoYScsIHUnYScsIDEpCit0ZXN0KCdpc2FscGhhJywgdSdBJywgMSkKK3Rlc3QoJ2lzYWxwaGEnLCB1J1xuJywgMCkKK3Rlc3QoJ2lzYWxwaGEnLCB1J1x1MUZGYycsIDEpCit0ZXN0KCdpc2FscGhhJywgdSdhYmMnLCAxKQordGVzdCgnaXNhbHBoYScsIHUnYUJjMTIzJywgMCkKK3Rlc3QoJ2lzYWxwaGEnLCB1J2FiY1xuJywgMCkKKwordGVzdCgnaXNhbG51bScsIHUnYScsIDEpCit0ZXN0KCdpc2FsbnVtJywgdSdBJywgMSkKK3Rlc3QoJ2lzYWxudW0nLCB1J1xuJywgMCkKK3Rlc3QoJ2lzYWxudW0nLCB1JzEyM2FiYzQ1NicsIDEpCit0ZXN0KCdpc2FsbnVtJywgdSdhMWIzYycsIDEpCit0ZXN0KCdpc2FsbnVtJywgdSdhQmMwMDAgJywgMCkKK3Rlc3QoJ2lzYWxudW0nLCB1J2FiY1xuJywgMCkKKwordGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcblxyZ2hpIiwgW3UnYWJjJywgdSdkZWYnLCB1JycsIHUnZ2hpJ10pCit0ZXN0KCdzcGxpdGxpbmVzJywgdSJhYmNcbmRlZlxuXHJcbmdoaSIsIFt1J2FiYycsIHUnZGVmJywgdScnLCB1J2doaSddKQordGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcclxuZ2hpIiwgW3UnYWJjJywgdSdkZWYnLCB1J2doaSddKQordGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcclxuZ2hpXG4iLCBbdSdhYmMnLCB1J2RlZicsIHUnZ2hpJ10pCit0ZXN0KCdzcGxpdGxpbmVzJywgdSJhYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnYWJjJywgdSdkZWYnLCB1J2doaScsIHUnJ10pCit0ZXN0KCdzcGxpdGxpbmVzJywgdSJcbmFiY1xuZGVmXHJcbmdoaVxuXHIiLCBbdScnLCB1J2FiYycsIHUnZGVmJywgdSdnaGknLCB1JyddKQordGVzdCgnc3BsaXRsaW5lcycsIHUiXG5hYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnXG4nLCB1J2FiY1xuJywgdSdkZWZcclxuJywgdSdnaGlcbicsIHUnXHInXSwgMSkKKwordGVzdCgndHJhbnNsYXRlJywgdSJhYmFiYWJjIiwgdSdiYmJjJywge29yZCgnYScpOk5vbmV9KQordGVzdCgndHJhbnNsYXRlJywgdSJhYmFiYWJjIiwgdSdpaWljJywge29yZCgnYScpOk5vbmUsIG9yZCgnYicpOm9yZCgnaScpfSkKK3Rlc3QoJ3RyYW5zbGF0ZScsIHUiYWJhYmFiYyIsIHUnaWlpeCcsIHtvcmQoJ2EnKTpOb25lLCBvcmQoJ2InKTpvcmQoJ2knKSwgb3JkKCdjJyk6dSd4J30pCisKKyMgQ29udGFpbnM6CitwcmludCAnVGVzdGluZyBVbmljb2RlIGNvbnRhaW5zIG1ldGhvZC4uLicsCithc3NlcnQgKCdhJyBpbiB1J2FiZGInKSA9PSAxCithc3NlcnQgKCdhJyBpbiB1J2JkYWInKSA9PSAxCithc3NlcnQgKCdhJyBpbiB1J2JkYWJhJykgPT0gMQorYXNzZXJ0ICgnYScgaW4gdSdiZGJhJykgPT0gMQorYXNzZXJ0ICgnYScgaW4gdSdiZGJhJykgPT0gMQorYXNzZXJ0ICh1J2EnIGluIHUnYmRiYScpID09IDEKK2Fzc2VydCAodSdhJyBpbiB1J2JkYicpID09IDAKK2Fzc2VydCAodSdhJyBpbiAnYmRiJykgPT0gMAorYXNzZXJ0ICh1J2EnIGluICdiZGJhJykgPT0gMQorYXNzZXJ0ICh1J2EnIGluICgnYScsMSxOb25lKSkgPT0gMQorYXNzZXJ0ICh1J2EnIGluICgxLE5vbmUsJ2EnKSkgPT0gMQorYXNzZXJ0ICh1J2EnIGluICgxLE5vbmUsdSdhJykpID09IDEKK2Fzc2VydCAoJ2EnIGluICgnYScsMSxOb25lKSkgPT0gMQorYXNzZXJ0ICgnYScgaW4gKDEsTm9uZSwnYScpKSA9PSAxCithc3NlcnQgKCdhJyBpbiAoMSxOb25lLHUnYScpKSA9PSAxCithc3NlcnQgKCdhJyBpbiAoJ3gnLDEsdSd5JykpID09IDAKK2Fzc2VydCAoJ2EnIGluICgneCcsMSxOb25lKSkgPT0gMAorcHJpbnQgJ2RvbmUuJworCisjIEZvcm1hdHRpbmc6CitwcmludCAnVGVzdGluZyBVbmljb2RlIGZvcm1hdHRpbmcgc3RyaW5ncy4uLicsCithc3NlcnQgdSIlcywgJXMiICUgKHUiYWJjIiwgImFiYyIpID09IHUnYWJjLCBhYmMnCithc3NlcnQgdSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIDEsIDIsIDMpID09IHUnYWJjLCBhYmMsIDEsIDIuMDAwMDAwLCAgMy4wMCcKK2Fzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgMSwgLTIsIDMpID09IHUnYWJjLCBhYmMsIDEsIC0yLjAwMDAwMCwgIDMuMDAnCithc3NlcnQgdSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIC0xLCAtMiwgMy41KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41MCcKK2Fzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41NycKK2Fzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAxMDAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAxMDAzLjU3JworYXNzZXJ0IHUiJWMiICUgKHUiYSIsKSA9PSB1J2EnCithc3NlcnQgdSIlYyIgJSAoImEiLCkgPT0gdSdhJworYXNzZXJ0IHUiJWMiICUgKDM0LCkgPT0gdSciJworYXNzZXJ0IHUiJWMiICUgKDM2LCkgPT0gdSckJwordmFsdWUgPSB1IiVyLCAlciIgJSAodSJhYmMiLCAiYWJjIikgCitpZiB2YWx1ZSAhPSB1InUnYWJjJywgJ2FiYyciOgorICAgIHByaW50ICcqKiogZm9ybWF0dGluZyBmYWlsZWQgZm9yICIlcyInICUgJ3UiJXIsICVyIiAlICh1ImFiYyIsICJhYmMiKScKKworYXNzZXJ0IHUiJSh4KXMsICUoeSlzIiAlIHsneCc6dSJhYmMiLCAneSc6ImRlZiJ9ID09IHUnYWJjLCBkZWYnCit0cnk6CisgICAgdmFsdWUgPSB1IiUoeClzLCAlKOQpcyIgJSB7J3gnOnUiYWJjIiwgdSfkJy5lbmNvZGUoJ3V0Zi04Jyk6ImRlZiJ9IAorZXhjZXB0IEtleUVycm9yOgorICAgIHByaW50ICcqKiogZm9ybWF0dGluZyBmYWlsZWQgZm9yICIlcyInICUgInUnYWJjLCBkZWYnIgorZWxzZToKKyAgICBhc3NlcnQgdmFsdWUgPT0gdSdhYmMsIGRlZicKKworIyBmb3JtYXR0aW5nIGpvYnMgZGVsZWdhdGVkIGZyb20gdGhlIHN0cmluZyBpbXBsZW1lbnRhdGlvbjoKK2Fzc2VydCAnLi4uJShmb28pcy4uLicgJSB7J2Zvbyc6dSJhYmMifSA9PSB1Jy4uLmFiYy4uLicKK2Fzc2VydCAnLi4uJShmb28pcy4uLicgJSB7J2Zvbyc6ImFiYyJ9ID09ICcuLi5hYmMuLi4nCithc3NlcnQgJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzoiYWJjIn0gPT0gJy4uLmFiYy4uLicKK2Fzc2VydCAnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOnUiYWJjIn0gPT0gdScuLi5hYmMuLi4nCithc3NlcnQgJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzp1ImFiYyIsJ2RlZic6MTIzfSA9PSAgdScuLi5hYmMuLi4nCithc3NlcnQgJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzp1ImFiYyIsdSdkZWYnOjEyM30gPT0gdScuLi5hYmMuLi4nCithc3NlcnQgJy4uLiVzLi4uJXMuLi4lcy4uLiVzLi4uJyAlICgxLDIsMyx1ImFiYyIpID09IHUnLi4uMS4uLjIuLi4zLi4uYWJjLi4uJworYXNzZXJ0ICcuLi4lcy4uLicgJSB1ImFiYyIgPT0gdScuLi5hYmMuLi4nCitwcmludCAnZG9uZS4nCisKKyMgVGVzdCBidWlsdGluIGNvZGVjcworcHJpbnQgJ1Rlc3RpbmcgYnVpbHRpbiBjb2RlY3MuLi4nLAorCisjIFVURi04IHNwZWNpZmljIGVuY29kaW5nIHRlc3RzOgorYXNzZXJ0IHUnXHUyMGFjJy5lbmNvZGUoJ3V0Zi04JykgPT0gXAorICAgICAgICcnLmpvaW4oKGNocigweGUyKSwgY2hyKDB4ODIpLCBjaHIoMHhhYykpKQorYXNzZXJ0IHUnXHVkODAwXHVkYzAyJy5lbmNvZGUoJ3V0Zi04JykgPT0gXAorICAgICAgICcnLmpvaW4oKGNocigweGYwKSwgY2hyKDB4OTApLCBjaHIoMHg4MCksIGNocigweDgyKSkpCithc3NlcnQgdSdcdWQ4NGRcdWRjNTYnLmVuY29kZSgndXRmLTgnKSA9PSBcCisgICAgICAgJycuam9pbigoY2hyKDB4ZjApLCBjaHIoMHhhMyksIGNocigweDkxKSwgY2hyKDB4OTYpKSkKKyMgVVRGLTggc3BlY2lmaWMgZGVjb2RpbmcgdGVzdHMKK2Fzc2VydCB1bmljb2RlKCcnLmpvaW4oKGNocigweGYwKSwgY2hyKDB4YTMpLCBjaHIoMHg5MSksIGNocigweDk2KSkpLAorICAgICAgICAgICAgICAgJ3V0Zi04JykgPT0gdSdcdWQ4NGRcdWRjNTYnCithc3NlcnQgdW5pY29kZSgnJy5qb2luKChjaHIoMHhmMCksIGNocigweDkwKSwgY2hyKDB4ODApLCBjaHIoMHg4MikpKSwKKyAgICAgICAgICAgICAgICd1dGYtOCcpID09IHUnXHVkODAwXHVkYzAyJworYXNzZXJ0IHVuaWNvZGUoJycuam9pbigoY2hyKDB4ZTIpLCBjaHIoMHg4MiksIGNocigweGFjKSkpLAorICAgICAgICAgICAgICAgJ3V0Zi04JykgPT0gdSdcdTIwYWMnCisKKyMgT3RoZXIgcG9zc2libGUgdXRmLTggdGVzdCBjYXNlczoKKyMgKiBzdHJpY3QgZGVjb2RpbmcgdGVzdGluZyBmb3IgYWxsIG9mIHRoZQorIyAgIFVURjhfRVJST1IgY2FzZXMgaW4gUHlVbmljb2RlX0RlY29kZVVURjgKKworCisKK2Fzc2VydCB1bmljb2RlKCdoZWxsbycsJ2FzY2lpJykgPT0gdSdoZWxsbycKK2Fzc2VydCB1bmljb2RlKCdoZWxsbycsJ3V0Zi04JykgPT0gdSdoZWxsbycKK2Fzc2VydCB1bmljb2RlKCdoZWxsbycsJ3V0ZjgnKSA9PSB1J2hlbGxvJworYXNzZXJ0IHVuaWNvZGUoJ2hlbGxvJywnbGF0aW4tMScpID09IHUnaGVsbG8nCisKK2NsYXNzIFN0cmluZzoKKyAgICB4ID0gJycKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYueAorCitvID0gU3RyaW5nKCkKKworby54ID0gJ2FiYycKK2Fzc2VydCB1bmljb2RlKG8pID09IHUnYWJjJworYXNzZXJ0IHN0cihvKSA9PSAnYWJjJworCitvLnggPSB1J2FiYycKK2Fzc2VydCB1bmljb2RlKG8pID09IHUnYWJjJworYXNzZXJ0IHN0cihvKSA9PSAnYWJjJworCit0cnk6CisgICAgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJykKKyAgICB1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknLCdzdHJpY3QnKQorZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgInUnQW5kclwyMDInLmVuY29kZSgnYXNjaWknKSBmYWlsZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIgorYXNzZXJ0IHUnQW5kclwyMDIgeCcuZW5jb2RlKCdhc2NpaScsJ2lnbm9yZScpID09ICJBbmRyIHgiCithc3NlcnQgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJywncmVwbGFjZScpID09ICJBbmRyPyB4IgorCit0cnk6CisgICAgdW5pY29kZSgnQW5kclwyMDIgeCcsJ2FzY2lpJykKKyAgICB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdzdHJpY3QnKQorZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgInVuaWNvZGUoJ0FuZHJcMjAyJykgZmFpbGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiIKK2Fzc2VydCB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdpZ25vcmUnKSA9PSB1IkFuZHIgeCIKK2Fzc2VydCB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdyZXBsYWNlJykgPT0gdSdBbmRyXHVGRkZEIHgnCisKK2Fzc2VydCB1J2hlbGxvJy5lbmNvZGUoJ2FzY2lpJykgPT0gJ2hlbGxvJworYXNzZXJ0IHUnaGVsbG8nLmVuY29kZSgndXRmLTgnKSA9PSAnaGVsbG8nCithc3NlcnQgdSdoZWxsbycuZW5jb2RlKCd1dGY4JykgPT0gJ2hlbGxvJworYXNzZXJ0IHUnaGVsbG8nLmVuY29kZSgndXRmLTE2LWxlJykgPT0gJ2hcMDAwZVwwMDBsXDAwMGxcMDAwb1wwMDAnCithc3NlcnQgdSdoZWxsbycuZW5jb2RlKCd1dGYtMTYtYmUnKSA9PSAnXDAwMGhcMDAwZVwwMDBsXDAwMGxcMDAwbycKK2Fzc2VydCB1J2hlbGxvJy5lbmNvZGUoJ2xhdGluLTEnKSA9PSAnaGVsbG8nCisKK3UgPSB1Jycuam9pbihtYXAodW5pY2hyLCByYW5nZSgxMDI0KSkpCitmb3IgZW5jb2RpbmcgaW4gKCd1dGYtOCcsICd1dGYtMTYnLCAndXRmLTE2LWxlJywgJ3V0Zi0xNi1iZScsCisgICAgICAgICAgICAgICAgICdyYXdfdW5pY29kZV9lc2NhcGUnLCAndW5pY29kZV9lc2NhcGUnLCAndW5pY29kZV9pbnRlcm5hbCcpOgorICAgIGFzc2VydCB1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZykgPT0gdQorCit1ID0gdScnLmpvaW4obWFwKHVuaWNociwgcmFuZ2UoMjU2KSkpCitmb3IgZW5jb2RpbmcgaW4gKAorICAgICdsYXRpbi0xJywKKyAgICApOgorICAgIHRyeToKKyAgICAgICAgYXNzZXJ0IHVuaWNvZGUodS5lbmNvZGUoZW5jb2RpbmcpLGVuY29kaW5nKSA9PSB1CisgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yOgorICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKKyAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6CisgICAgICAgIHByaW50ICcqKiogY29kZWMgZm9yICIlcyIgZmFpbGVkOiAlcycgJSAoZW5jb2RpbmcsIHdoeSkKKwordSA9IHUnJy5qb2luKG1hcCh1bmljaHIsIHJhbmdlKDEyOCkpKQorZm9yIGVuY29kaW5nIGluICgKKyAgICAnYXNjaWknLAorICAgICk6CisgICAgdHJ5OgorICAgICAgICBhc3NlcnQgdW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpID09IHUKKyAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3I6CisgICAgICAgIHByaW50ICcqKiogY29kZWMgIiVzIiBmYWlsZWQgcm91bmQtdHJpcCcgJSBlbmNvZGluZworICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKKyAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyBmb3IgIiVzIiBmYWlsZWQ6ICVzJyAlIChlbmNvZGluZywgd2h5KQogCiBwcmludCAnZG9uZS4nCisKK3ByaW50ICdUZXN0aW5nIHN0YW5kYXJkIG1hcHBpbmcgY29kZWNzLi4uJywKKworcHJpbnQgJzAtMTI3Li4uJywKK3MgPSAnJy5qb2luKG1hcChjaHIsIHJhbmdlKDEyOCkpKQorZm9yIGVuY29kaW5nIGluICgKKyAgICAnY3AwMzcnLCAnY3AxMDI2JywKKyAgICAnY3A0MzcnLCAnY3A1MDAnLCAnY3A3MzcnLCAnY3A3NzUnLCAnY3A4NTAnLAorICAgICdjcDg1MicsICdjcDg1NScsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCisgICAgJ2NwODYzJywgJ2NwODY1JywgJ2NwODY2JywgCisgICAgJ2lzbzg4NTlfMTAnLCAnaXNvODg1OV8xMycsICdpc284ODU5XzE0JywgJ2lzbzg4NTlfMTUnLAorICAgICdpc284ODU5XzInLCAnaXNvODg1OV8zJywgJ2lzbzg4NTlfNCcsICdpc284ODU5XzUnLCAnaXNvODg1OV82JywKKyAgICAnaXNvODg1OV83JywgJ2lzbzg4NTlfOScsICdrb2k4X3InLCAnbGF0aW5fMScsCisgICAgJ21hY19jeXJpbGxpYycsICdtYWNfbGF0aW4yJywKKworICAgICdjcDEyNTAnLCAnY3AxMjUxJywgJ2NwMTI1MicsICdjcDEyNTMnLCAnY3AxMjU0JywgJ2NwMTI1NScsCisgICAgJ2NwMTI1NicsICdjcDEyNTcnLCAnY3AxMjU4JywKKyAgICAnY3A4NTYnLCAnY3A4NTcnLCAnY3A4NjQnLCAnY3A4NjknLCAnY3A4NzQnLAorCisgICAgJ21hY19ncmVlaycsICdtYWNfaWNlbGFuZCcsJ21hY19yb21hbicsICdtYWNfdHVya2lzaCcsCisgICAgJ2NwMTAwNicsICdjcDg3NScsICdpc284ODU5XzgnLAorICAgIAorICAgICMjIyBUaGVzZSBoYXZlIHVuZGVmaW5lZCBtYXBwaW5nczoKKyAgICAjJ2NwNDI0JywKKyAgICAKKyAgICApOgorICAgIHRyeToKKyAgICAgICAgYXNzZXJ0IHVuaWNvZGUocyxlbmNvZGluZykuZW5jb2RlKGVuY29kaW5nKSA9PSBzCisgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yOgorICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKKyAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6CisgICAgICAgIHByaW50ICcqKiogY29kZWMgZm9yICIlcyIgZmFpbGVkOiAlcycgJSAoZW5jb2RpbmcsIHdoeSkKKworcHJpbnQgJzEyOC0yNTUuLi4nLAorcyA9ICcnLmpvaW4obWFwKGNociwgcmFuZ2UoMTI4LDI1NikpKQorZm9yIGVuY29kaW5nIGluICgKKyAgICAnY3AwMzcnLCAnY3AxMDI2JywKKyAgICAnY3A0MzcnLCAnY3A1MDAnLCAnY3A3MzcnLCAnY3A3NzUnLCAnY3A4NTAnLAorICAgICdjcDg1MicsICdjcDg1NScsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCisgICAgJ2NwODYzJywgJ2NwODY1JywgJ2NwODY2JywgCisgICAgJ2lzbzg4NTlfMTAnLCAnaXNvODg1OV8xMycsICdpc284ODU5XzE0JywgJ2lzbzg4NTlfMTUnLAorICAgICdpc284ODU5XzInLCAnaXNvODg1OV8zJywgJ2lzbzg4NTlfNCcsICdpc284ODU5XzUnLCAnaXNvODg1OV82JywKKyAgICAnaXNvODg1OV83JywgJ2lzbzg4NTlfOScsICdrb2k4X3InLCAnbGF0aW5fMScsCisgICAgJ21hY19jeXJpbGxpYycsICdtYWNfbGF0aW4yJywKKyAgICAKKyAgICAjIyMgVGhlc2UgaGF2ZSB1bmRlZmluZWQgbWFwcGluZ3M6CisgICAgIydjcDEyNTAnLCAnY3AxMjUxJywgJ2NwMTI1MicsICdjcDEyNTMnLCAnY3AxMjU0JywgJ2NwMTI1NScsCisgICAgIydjcDEyNTYnLCAnY3AxMjU3JywgJ2NwMTI1OCcsCisgICAgIydjcDQyNCcsICdjcDg1NicsICdjcDg1NycsICdjcDg2NCcsICdjcDg2OScsICdjcDg3NCcsCisgICAgIydtYWNfZ3JlZWsnLCAnbWFjX2ljZWxhbmQnLCdtYWNfcm9tYW4nLCAnbWFjX3R1cmtpc2gnLAorICAgIAorICAgICMjIyBUaGVzZSBmYWlsIHRoZSByb3VuZC10cmlwOgorICAgICMnY3AxMDA2JywgJ2NwODc1JywgJ2lzbzg4NTlfOCcsCisgICAgCisgICAgKToKKyAgICB0cnk6CisgICAgICAgIGFzc2VydCB1bmljb2RlKHMsZW5jb2RpbmcpLmVuY29kZShlbmNvZGluZykgPT0gcworICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvcjoKKyAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyAiJXMiIGZhaWxlZCByb3VuZC10cmlwJyAlIGVuY29kaW5nCisgICAgZXhjZXB0IFZhbHVlRXJyb3Isd2h5OgorICAgICAgICBwcmludCAnKioqIGNvZGVjIGZvciAiJXMiIGZhaWxlZDogJXMnICUgKGVuY29kaW5nLCB3aHkpCisKK3ByaW50ICdkb25lLicKKworcHJpbnQgJ1Rlc3RpbmcgVW5pY29kZSBzdHJpbmcgY29uY2F0ZW5hdGlvbi4uLicsCithc3NlcnQgKHUiYWJjIiB1ImRlZiIpID09IHUiYWJjZGVmIgorYXNzZXJ0ICgiYWJjIiB1ImRlZiIpID09IHUiYWJjZGVmIgorYXNzZXJ0ICh1ImFiYyIgImRlZiIpID09IHUiYWJjZGVmIgorYXNzZXJ0ICh1ImFiYyIgdSJkZWYiICJnaGkiKSA9PSB1ImFiY2RlZmdoaSIKK2Fzc2VydCAoImFiYyIgImRlZiIgdSJnaGkiKSA9PSB1ImFiY2RlZmdoaSIKK3ByaW50ICdkb25lLicKKwpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF91bnAucHkgYi9MaWIvZG9zLTh4My90ZXN0X3VucC5weQppbmRleCAxYmZkNDc4Li4yNTMyNGMwIDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X3VucC5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X3VucC5weQpAQCAtMTAwLDcgKzEwMCw4IEBACiAKICMgdW5wYWNraW5nIGEgc2VxdWVuY2Ugd2hlcmUgdGhlIHRlc3QgZm9yIHRvbyBsb25nIHJhaXNlcyBhIGRpZmZlcmVudAogIyBraW5kIG9mIGVycm9yCi1Cb3pvRXJyb3IgPSAnQm96b0Vycm9yJworY2xhc3MgQm96b0Vycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcwogCiBjbGFzcyBCYWRTZXE6CiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF91c2UucHkgYi9MaWIvZG9zLTh4My90ZXN0X3VzZS5weQppbmRleCBjMTJmMWUyLi42MzYzMmY3IDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X3VzZS5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X3VzZS5weQpAQCAtMSwyMjcgKzEsMTAxIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLWltcG9ydCBzeXMsIHN0cmluZwotZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UKLSMgVXNlclN0cmluZyBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBuYXRpdmUgYnVpbHRpbiBzdHJpbmcgdHlwZS4KLSMgVXNlclN0cmluZyBpbnN0YW5jZXMgc2hvdWxkIGJlaGF2ZSBzaW1pbGFyIHRvIGJ1aWx0aW4gc3RyaW5nIG9iamVjdHMuCi0jIFRoZSB0ZXN0IGNhc2VzIHdlcmUgaW4gcGFydCBkZXJpdmVkIGZyb20gJ3Rlc3Rfc3RyaW5nLnB5Jy4KLWZyb20gVXNlclN0cmluZyBpbXBvcnQgVXNlclN0cmluZworIyBDaGVjayBldmVyeSBwYXRoIHRocm91Z2ggZXZlcnkgbWV0aG9kIG9mIFVzZXJEaWN0CiAKLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgdmVyYm9zZSA9IDAKK2Zyb20gVXNlckRpY3QgaW1wb3J0IFVzZXJEaWN0CiAKLXRlc3RlZF9tZXRob2RzID0ge30KK2QwID0ge30KK2QxID0geyJvbmUiOiAxfQorZDIgPSB7Im9uZSI6IDEsICJ0d28iOiAyfQogCi1kZWYgdGVzdChtZXRob2RuYW1lLCBpbnB1dCwgKmFyZ3MpOgotICAgIGdsb2JhbCB0ZXN0ZWRfbWV0aG9kcwotICAgIHRlc3RlZF9tZXRob2RzW21ldGhvZG5hbWVdID0gMQotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHByaW50ICclcy4lcyglcykgJyAlIChpbnB1dCwgbWV0aG9kbmFtZSwgYXJncyksCi0gICAgdSA9IFVzZXJTdHJpbmcoaW5wdXQpCi0gICAgb2JqZWN0cyA9IFtpbnB1dCwgdSwgVXNlclN0cmluZyh1KV0KLSAgICByZXMgPSBbIiJdICogMwotICAgIGZvciBpIGluIHJhbmdlKDMpOgotICAgICAgICBvYmplY3QgPSBvYmplY3RzW2ldCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYgPSBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSkKLSAgICAgICAgICAgIHJlc1tpXSA9IGFwcGx5KGYsIGFyZ3MpCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHJlc1tpXSA9IHN5cy5leGNfdHlwZQotICAgIGlmIHJlc1swXSAhPSByZXNbMV06Ci0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCAnbm8nCi0gICAgICAgIHByaW50IGBpbnB1dGAsIGYsIGByZXNbMF1gLCAiPD4iLCBgcmVzWzFdYAotICAgIGVsc2U6Ci0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCAneWVzJwotICAgIGlmIHJlc1sxXSAhPSByZXNbMl06Ci0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCAnbm8nCi0gICAgICAgIHByaW50IGBpbnB1dGAsIGYsIGByZXNbMV1gLCAiPD4iLCBgcmVzWzJdYAotICAgIGVsc2U6Ci0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCAneWVzJworIyBUZXN0IGNvbnN0cnVjdG9ycwogCi10ZXN0KCdjYXBpdGFsaXplJywgJyBoZWxsbyAnKQotdGVzdCgnY2FwaXRhbGl6ZScsICdoZWxsbyAnKQordSA9IFVzZXJEaWN0KCkKK3UwID0gVXNlckRpY3QoZDApCit1MSA9IFVzZXJEaWN0KGQxKQordTIgPSBVc2VyRGljdChkMikKIAotdGVzdCgnY2VudGVyJywgJ2ZvbycsIDApCi10ZXN0KCdjZW50ZXInLCAnZm9vJywgMykKLXRlc3QoJ2NlbnRlcicsICdmb28nLCAxNikKK3V1ID0gVXNlckRpY3QodSkKK3V1MCA9IFVzZXJEaWN0KHUwKQordXUxID0gVXNlckRpY3QodTEpCit1dTIgPSBVc2VyRGljdCh1MikKIAotdGVzdCgnbGp1c3QnLCAnZm9vJywgMCkKLXRlc3QoJ2xqdXN0JywgJ2ZvbycsIDMpCi10ZXN0KCdsanVzdCcsICdmb28nLCAxNikKKyMgVGVzdCBfX3JlcHJfXwogCi10ZXN0KCdyanVzdCcsICdmb28nLCAwKQotdGVzdCgncmp1c3QnLCAnZm9vJywgMykKLXRlc3QoJ3JqdXN0JywgJ2ZvbycsIDE2KQorYXNzZXJ0IHN0cih1MCkgPT0gc3RyKGQwKQorYXNzZXJ0IHJlcHIodTEpID09IHJlcHIoZDEpCithc3NlcnQgYHUyYCA9PSBgZDJgCiAKLXRlc3QoJ2NvdW50JywgJ2FiY2FiY2FiYycsICdhYmMnKQotdGVzdCgnY291bnQnLCAnYWJjYWJjYWJjJywgJ2FiYycsIDEpCi10ZXN0KCdjb3VudCcsICdhYmNhYmNhYmMnLCAnYWJjJywgLTEpCi10ZXN0KCdjb3VudCcsICdhYmNhYmNhYmMnLCAnYWJjJywgNykKLXRlc3QoJ2NvdW50JywgJ2FiY2FiY2FiYycsICdhYmMnLCAwLCAzKQotdGVzdCgnY291bnQnLCAnYWJjYWJjYWJjJywgJ2FiYycsIDAsIDMzMykKKyMgVGVzdCBfX2NtcF9fIGFuZCBfX2xlbl9fCiAKLXRlc3QoJ2ZpbmQnLCAnYWJjZGVmZ2hpYWJjJywgJ2FiYycpCi10ZXN0KCdmaW5kJywgJ2FiY2RlZmdoaWFiYycsICdhYmMnLCAxKQotdGVzdCgnZmluZCcsICdhYmNkZWZnaGlhYmMnLCAnZGVmJywgNCkKLXRlc3QoJ3JmaW5kJywgJ2FiY2RlZmdoaWFiYycsICdhYmMnKQorYWxsID0gW2QwLCBkMSwgZDIsIHUsIHUwLCB1MSwgdTIsIHV1LCB1dTAsIHV1MSwgdXUyXQorZm9yIGEgaW4gYWxsOgorICAgIGZvciBiIGluIGFsbDoKKyAgICAgICAgYXNzZXJ0IGNtcChhLCBiKSA9PSBjbXAobGVuKGEpLCBsZW4oYikpCiAKLXRlc3QoJ2luZGV4JywgJ2FiY2FiY2FiYycsICdhYmMnKQotdGVzdCgnaW5kZXgnLCAnYWJjYWJjYWJjJywgJ2FiYycsIDEpCi10ZXN0KCdpbmRleCcsICdhYmNhYmNhYmMnLCAnYWJjJywgLTEpCi10ZXN0KCdpbmRleCcsICdhYmNhYmNhYmMnLCAnYWJjJywgNykKLXRlc3QoJ2luZGV4JywgJ2FiY2FiY2FiYycsICdhYmMnLCAwLCAzKQotdGVzdCgnaW5kZXgnLCAnYWJjYWJjYWJjJywgJ2FiYycsIDAsIDMzMykKKyMgVGVzdCBfX2dldGl0ZW1fXwogCi10ZXN0KCdyaW5kZXgnLCAnYWJjYWJjYWJjJywgJ2FiYycpCi10ZXN0KCdyaW5kZXgnLCAnYWJjYWJjYWJjJywgJ2FiYycsIDEpCi10ZXN0KCdyaW5kZXgnLCAnYWJjYWJjYWJjJywgJ2FiYycsIC0xKQotdGVzdCgncmluZGV4JywgJ2FiY2FiY2FiYycsICdhYmMnLCA3KQotdGVzdCgncmluZGV4JywgJ2FiY2FiY2FiYycsICdhYmMnLCAwLCAzKQotdGVzdCgncmluZGV4JywgJ2FiY2FiY2FiYycsICdhYmMnLCAwLCAzMzMpCithc3NlcnQgdTJbIm9uZSJdID09IDEKK3RyeToKKyAgICB1MVsidHdvIl0KK2V4Y2VwdCBLZXlFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGFzc2VydCAwLCAidTFbJ3R3byddIHNob3VsZG4ndCBleGlzdCIKIAorIyBUZXN0IF9fc2V0aXRlbV9fCiAKLXRlc3QoJ2xvd2VyJywgJ0hlTExvJykKLXRlc3QoJ2xvd2VyJywgJ2hlbGxvJykKLXRlc3QoJ3VwcGVyJywgJ0hlTExvJykKLXRlc3QoJ3VwcGVyJywgJ0hFTExPJykKK3UzID0gVXNlckRpY3QodTIpCit1M1sidHdvIl0gPSAyCit1M1sidGhyZWUiXSA9IDMKIAotdGVzdCgndGl0bGUnLCAnIGhlbGxvICcpCi10ZXN0KCd0aXRsZScsICdoZWxsbyAnKQotdGVzdCgndGl0bGUnLCAiZk9yTWFUIHRoSXMgYVMgdGl0TGUgU3RyaW5nIikKLXRlc3QoJ3RpdGxlJywgImZPck1hVCx0aElzLWFTKnRpdExlO1N0cmluZyIpCi10ZXN0KCd0aXRsZScsICJnZXRJbnQiKQorIyBUZXN0IF9fZGVsaXRlbV9fCiAKLXRlc3QoJ2V4cGFuZHRhYnMnLCAnYWJjXHJhYlx0ZGVmXG5nXHRoaScpCi10ZXN0KCdleHBhbmR0YWJzJywgJ2FiY1xyYWJcdGRlZlxuZ1x0aGknLCA4KQotdGVzdCgnZXhwYW5kdGFicycsICdhYmNccmFiXHRkZWZcbmdcdGhpJywgNCkKLXRlc3QoJ2V4cGFuZHRhYnMnLCAnYWJjXHJcbmFiXHRkZWZcbmdcdGhpJywgNCkKK2RlbCB1M1sidGhyZWUiXQordHJ5OgorICAgIGRlbCB1M1sidGhyZWUiXQorZXhjZXB0IEtleUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgYXNzZXJ0IDAsICJ1M1sndGhyZWUnXSBzaG91bGRuJ3QgZXhpc3QiCiAKLXRlc3QoJ2lzbG93ZXInLCAnYScpCi10ZXN0KCdpc2xvd2VyJywgJ0EnKQotdGVzdCgnaXNsb3dlcicsICdcbicpCi10ZXN0KCdpc2xvd2VyJywgJ2FiYycpCi10ZXN0KCdpc2xvd2VyJywgJ2FCYycpCi10ZXN0KCdpc2xvd2VyJywgJ2FiY1xuJykKKyMgVGVzdCBjbGVhcgogCi10ZXN0KCdpc3VwcGVyJywgJ2EnKQotdGVzdCgnaXN1cHBlcicsICdBJykKLXRlc3QoJ2lzdXBwZXInLCAnXG4nKQotdGVzdCgnaXN1cHBlcicsICdBQkMnKQotdGVzdCgnaXN1cHBlcicsICdBYkMnKQotdGVzdCgnaXN1cHBlcicsICdBQkNcbicpCit1My5jbGVhcigpCithc3NlcnQgdTMgPT0ge30KIAotdGVzdCgnaXNkaWdpdCcsICcgIDAxMjM0NTY3ODknKQotdGVzdCgnaXNkaWdpdCcsICc1Njc4OScpCi10ZXN0KCdpc2RpZ2l0JywgJzU2Ny44OScpCi10ZXN0KCdpc2RpZ2l0JywgJzAxMjM0NTY3ODlhYmMnKQorIyBUZXN0IGNvcHkoKQogCi10ZXN0KCdpc3NwYWNlJywgJycpCi10ZXN0KCdpc3NwYWNlJywgJyAnKQotdGVzdCgnaXNzcGFjZScsICcgXHQnKQotdGVzdCgnaXNzcGFjZScsICcgXHRcZlxuJykKK3UyYSA9IHUyLmNvcHkoKQorYXNzZXJ0IHUyYSA9PSB1MgogCi10ZXN0KCdpc3RpdGxlJywgJ2EnKQotdGVzdCgnaXN0aXRsZScsICdBJykKLXRlc3QoJ2lzdGl0bGUnLCAnXG4nKQotdGVzdCgnaXN0aXRsZScsICdBIFRpdGxlY2FzZWQgTGluZScpCi10ZXN0KCdpc3RpdGxlJywgJ0FcblRpdGxlY2FzZWQgTGluZScpCi10ZXN0KCdpc3RpdGxlJywgJ0EgVGl0bGVjYXNlZCwgTGluZScpCi10ZXN0KCdpc3RpdGxlJywgJ05vdCBhIGNhcGl0YWxpemVkIFN0cmluZycpCi10ZXN0KCdpc3RpdGxlJywgJ05vdFx0YSBUaXRsZWNhc2UgU3RyaW5nJykKLXRlc3QoJ2lzdGl0bGUnLCAnTm90LS1hIFRpdGxlY2FzZSBTdHJpbmcnKQorY2xhc3MgTXlVc2VyRGljdChVc2VyRGljdCk6CisgICAgZGVmIGRpc3BsYXkoc2VsZik6IHByaW50IHNlbGYKIAotdGVzdCgnc3BsaXRsaW5lcycsICJhYmNcbmRlZlxuXHJnaGkiKQotdGVzdCgnc3BsaXRsaW5lcycsICJhYmNcbmRlZlxuXHJcbmdoaSIpCi10ZXN0KCdzcGxpdGxpbmVzJywgImFiY1xuZGVmXHJcbmdoaSIpCi10ZXN0KCdzcGxpdGxpbmVzJywgImFiY1xuZGVmXHJcbmdoaVxuIikKLXRlc3QoJ3NwbGl0bGluZXMnLCAiYWJjXG5kZWZcclxuZ2hpXG5cciIpCi10ZXN0KCdzcGxpdGxpbmVzJywgIlxuYWJjXG5kZWZcclxuZ2hpXG5cciIpCi10ZXN0KCdzcGxpdGxpbmVzJywgIlxuYWJjXG5kZWZcclxuZ2hpXG5cciIpCi10ZXN0KCdzcGxpdGxpbmVzJywgIlxuYWJjXG5kZWZcclxuZ2hpXG5cciIpCittMiA9IE15VXNlckRpY3QodTIpCittMmEgPSBtMi5jb3B5KCkKK2Fzc2VydCBtMmEgPT0gbTIKIAotdGVzdCgnc3BsaXQnLCAndGhpcyBpcyB0aGUgc3BsaXQgZnVuY3Rpb24nKQotdGVzdCgnc3BsaXQnLCAnYXxifGN8ZCcsICd8JykKLXRlc3QoJ3NwbGl0JywgJ2F8YnxjfGQnLCAnfCcsIDIpCi10ZXN0KCdzcGxpdCcsICdhIGIgYyBkJywgTm9uZSwgMSkKLXRlc3QoJ3NwbGl0JywgJ2EgYiBjIGQnLCBOb25lLCAyKQotdGVzdCgnc3BsaXQnLCAnYSBiIGMgZCcsIE5vbmUsIDMpCi10ZXN0KCdzcGxpdCcsICdhIGIgYyBkJywgTm9uZSwgNCkKLXRlc3QoJ3NwbGl0JywgJ2EgYiBjIGQnLCBOb25lLCAwKQotdGVzdCgnc3BsaXQnLCAnYSAgYiAgYyAgZCcsIE5vbmUsIDIpCi10ZXN0KCdzcGxpdCcsICdhIGIgYyBkICcpCisjIFRlc3Qga2V5cywgaXRlbXMsIHZhbHVlcwogCi0jIGpvaW4gbm93IHdvcmtzIHdpdGggYW55IHNlcXVlbmNlIHR5cGUKLWNsYXNzIFNlcXVlbmNlOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKTogc2VsZi5zZXEgPSAnd3h5eicKLSAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLnNlcSkKLSAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6IHJldHVybiBzZWxmLnNlcVtpXQorYXNzZXJ0IHUyLmtleXMoKSA9PSBkMi5rZXlzKCkKK2Fzc2VydCB1Mi5pdGVtcygpID09IGQyLml0ZW1zKCkKK2Fzc2VydCB1Mi52YWx1ZXMoKSA9PSBkMi52YWx1ZXMoKQogCi10ZXN0KCdqb2luJywgJycsICgnYScsICdiJywgJ2MnLCAnZCcpKQotdGVzdCgnam9pbicsICcnLCBTZXF1ZW5jZSgpKQotdGVzdCgnam9pbicsICcnLCA3KQorIyBUZXN0IGhhc19rZXkKIAotY2xhc3MgQmFkU2VxKFNlcXVlbmNlKToKLSAgICBkZWYgX19pbml0X18oc2VsZik6IHNlbGYuc2VxID0gWzcsICdoZWxsbycsIDEyM0xdCitmb3IgaSBpbiB1Mi5rZXlzKCk6CisgICAgYXNzZXJ0IHUyLmhhc19rZXkoaSkgPT0gMQorICAgIGFzc2VydCB1MS5oYXNfa2V5KGkpID09IGQxLmhhc19rZXkoaSkKKyAgICBhc3NlcnQgdTAuaGFzX2tleShpKSA9PSBkMC5oYXNfa2V5KGkpCiAKLXRlc3QoJ2pvaW4nLCAnJywgQmFkU2VxKCkpCisjIFRlc3QgdXBkYXRlCiAKLXRlc3QoJ3N0cmlwJywgJyAgIGhlbGxvICAgJykKLXRlc3QoJ2xzdHJpcCcsICcgICBoZWxsbyAgICcpCi10ZXN0KCdyc3RyaXAnLCAnICAgaGVsbG8gICAnKQotdGVzdCgnc3RyaXAnLCAnaGVsbG8nKQordCA9IFVzZXJEaWN0KCkKK3QudXBkYXRlKHUyKQorYXNzZXJ0IHQgPT0gdTIKIAotdGVzdCgnc3dhcGNhc2UnLCAnSGVMTG8gY09tcFV0ZVJzJykKLXRyYW5zdGFibGUgPSBzdHJpbmcubWFrZXRyYW5zKCJhYmMiLCAieHl6IikKLXRlc3QoJ3RyYW5zbGF0ZScsICd4eXphYmNkZWYnLCB0cmFuc3RhYmxlLCAnZGVmJykKKyMgVGVzdCBnZXQKIAotdHJhbnN0YWJsZSA9IHN0cmluZy5tYWtldHJhbnMoJ2EnLCAnQScpCi10ZXN0KCd0cmFuc2xhdGUnLCAnYWJjJywgdHJhbnN0YWJsZSkKLXRlc3QoJ3RyYW5zbGF0ZScsICd4eXonLCB0cmFuc3RhYmxlKQotCi10ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJyEnLCAnQCcsIDEpCi10ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJyEnLCAnJykKLXRlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnIScsICdAJywgMikKLXRlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnIScsICdAJywgMykKLXRlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnIScsICdAJywgNCkKLXRlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnIScsICdAJywgMCkKLXRlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnIScsICdAJykKLXRlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAneCcsICdAJykKLXRlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAneCcsICdAJywgMikKLQotdGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsICdoZScpCi10ZXN0KCdzdGFydHN3aXRoJywgJ2hlbGxvJywgJ2hlbGxvJykKLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAnaGVsbG8gd29ybGQnKQotdGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsICcnKQotdGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsICdlbGxvJykKLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAnZWxsbycsIDEpCi10ZXN0KCdzdGFydHN3aXRoJywgJ2hlbGxvJywgJ28nLCA0KQotdGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsICdvJywgNSkKLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAnJywgNSkKLXRlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAnbG8nLCA2KQotdGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ2xvd28nLCAzKQotdGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ2xvd28nLCAzLCA3KQotdGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ2xvd28nLCAzLCA2KQotCi10ZXN0KCdlbmRzd2l0aCcsICdoZWxsbycsICdsbycpCi10ZXN0KCdlbmRzd2l0aCcsICdoZWxsbycsICdoZScpCi10ZXN0KCdlbmRzd2l0aCcsICdoZWxsbycsICcnKQotdGVzdCgnZW5kc3dpdGgnLCAnaGVsbG8nLCAnaGVsbG8gd29ybGQnKQotdGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsICd3b3JsJykKLXRlc3QoJ2VuZHN3aXRoJywgJ2hlbGxvd29ybGQnLCAnd29ybCcsIDMsIDkpCi10ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ3dvcmxkJywgMywgMTIpCi10ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ2xvd28nLCAxLCA3KQotdGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsICdsb3dvJywgMiwgNykKLXRlc3QoJ2VuZHN3aXRoJywgJ2hlbGxvd29ybGQnLCAnbG93bycsIDMsIDcpCi10ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ2xvd28nLCA0LCA3KQotdGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsICdsb3dvJywgMywgOCkKLXRlc3QoJ2VuZHN3aXRoJywgJ2FiJywgJ2FiJywgMCwgMSkKLXRlc3QoJ2VuZHN3aXRoJywgJ2FiJywgJ2FiJywgMCwgMCkKLQotIyBUT0RPOiB0ZXN0IGNhc2VzIGZvcjogaW50LCBsb25nLCBmbG9hdCwgY29tcGxleCwgKywgKiBhbmQgY21wCi1zID0gIiIKLWZvciBidWlsdGluX21ldGhvZCBpbiBkaXIocyk6Ci0gICAgaWYgbm90IHRlc3RlZF9tZXRob2RzLmhhc19rZXkoYnVpbHRpbl9tZXRob2QpOgotICAgICAgICBwcmludCAibm8gcmVncmVzc2lvbiB0ZXN0IGNhc2UgZm9yIG1ldGhvZCAnIitidWlsdGluX21ldGhvZCsiJyIKK2ZvciBpIGluIHUyLmtleXMoKToKKyAgICBhc3NlcnQgdTIuZ2V0KGkpID09IHUyW2ldCisgICAgYXNzZXJ0IHUxLmdldChpKSA9PSBkMS5nZXQoaSkKKyAgICBhc3NlcnQgdTAuZ2V0KGkpID09IGQwLmdldChpKQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGhyZWFkaW4ucHkgYi9MaWIvZG9zLTh4My90aHJlYWRpbi5weQppbmRleCBmYjJlYjIxLi40OTIxZjBlIDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90aHJlYWRpbi5weQorKysgYi9MaWIvZG9zLTh4My90aHJlYWRpbi5weQpAQCAtNDYyLDExICs0NjIsOCBAQAogICAgICAgICBfYWN0aXZlX2xpbWJvX2xvY2suYWNxdWlyZSgpCiAgICAgICAgIF9hY3RpdmVbX2dldF9pZGVudCgpXSA9IHNlbGYKICAgICAgICAgX2FjdGl2ZV9saW1ib19sb2NrLnJlbGVhc2UoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLl9fb2xkZXhpdGZ1bmMgPSBfc3lzLmV4aXRmdW5jCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIHNlbGYuX19vbGRleGl0ZnVuYyA9IE5vbmUKLSAgICAgICAgX3N5cy5leGl0ZnVuYyA9IHNlbGYuX19leGl0ZnVuYworICAgICAgICBpbXBvcnQgYXRleGl0CisgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLl9fZXhpdGZ1bmMpCiAKICAgICBkZWYgX3NldF9kYWVtb24oc2VsZik6CiAgICAgICAgIHJldHVybiAwCkBAIC00ODAsMTAgKzQ3Nyw2IEBACiAgICAgICAgIHdoaWxlIHQ6CiAgICAgICAgICAgICB0LmpvaW4oKQogICAgICAgICAgICAgdCA9IF9waWNrU29tZU5vbkRhZW1vblRocmVhZCgpCi0gICAgICAgIGlmIHNlbGYuX19vbGRleGl0ZnVuYzoKLSAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKLSAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlczogY2FsbGluZyBleGl0IGhhbmRsZXIiLCBzZWxmKQotICAgICAgICAgICAgc2VsZi5fX29sZGV4aXRmdW5jKCkKICAgICAgICAgaWYgX19kZWJ1Z19fOgogICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXM6IGV4aXRpbmciLCBzZWxmKQogICAgICAgICBzZWxmLl9UaHJlYWRfX2RlbGV0ZSgpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90cmFjZWJhYy5weSBiL0xpYi9kb3MtOHgzL3RyYWNlYmFjLnB5CmluZGV4IGQyMTkzNDAuLmI3MzM1OTggMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3RyYWNlYmFjLnB5CisrKyBiL0xpYi9kb3MtOHgzL3RyYWNlYmFjLnB5CkBAIC0xNjYsOSArMTY2LDE1IEBACiAJCQkJCQlzID0gcyArICcgJwogCQkJCWxpc3QuYXBwZW5kKCclc15cbicgJSBzKQogCQkJCXZhbHVlID0gbXNnCi0JCWxpc3QuYXBwZW5kKCclczogJXNcbicgJSAoc3RyKHN0eXBlKSwgc3RyKHZhbHVlKSkpCisJCWxpc3QuYXBwZW5kKCclczogJXNcbicgJSAoc3RyKHN0eXBlKSwgX3NvbWVfc3RyKHZhbHVlKSkpCiAJcmV0dXJuIGxpc3QKIAorZGVmIF9zb21lX3N0cih2YWx1ZSk6CisJdHJ5OgorCQlyZXR1cm4gc3RyKHZhbHVlKQorCWV4Y2VwdDoKKwkJcmV0dXJuICc8dW5wcmludGFibGUgJXMgb2JqZWN0PicgJSB0eXBlKHZhbHVlKS5fX25hbWVfXworCiAKIGRlZiBwcmludF9leGMobGltaXQ9Tm9uZSwgZmlsZT1Ob25lKToKIAkiIiJUaGlzIGlzIGEgc2hvcnRoYW5kIGZvciAncHJpbnRfZXhjZXB0aW9uKHN5cy5leGNfdHlwZSwKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3VzZXJkaWN0LnB5IGIvTGliL2Rvcy04eDMvdXNlcmRpY3QucHkKaW5kZXggM2M0ODQxNS4uOWI2ZTczYiAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvdXNlcmRpY3QucHkKKysrIGIvTGliL2Rvcy04eDMvdXNlcmRpY3QucHkKQEAgLTM0LDMgKzM0LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmRhdGFba10gPSB2CiAgICAgZGVmIGdldChzZWxmLCBrZXksIGZhaWxvYmo9Tm9uZSk6CiAgICAgICAgIHJldHVybiBzZWxmLmRhdGEuZ2V0KGtleSwgZmFpbG9iaikKKyAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGZhaWxvYmo9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmRhdGEuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgc2VsZi5kYXRhW2tleV0gPSBmYWlsb2JqCisgICAgICAgIHJldHVybiBzZWxmLmRhdGFba2V5XQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdXNlcmxpc3QucHkgYi9MaWIvZG9zLTh4My91c2VybGlzdC5weQppbmRleCBkNGE4ZDJmLi4xMTQ2MDYwIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My91c2VybGlzdC5weQorKysgYi9MaWIvZG9zLTh4My91c2VybGlzdC5weQpAQCAtNTEsOSArNTEsMjAgQEAKICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhvdGhlciArIHNlbGYuZGF0YSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhsaXN0KG90aGVyKSArIHNlbGYuZGF0YSkKKyAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBVc2VyTGlzdCk6CisgICAgICAgICAgICBzZWxmLmRhdGEgKz0gb3RoZXIuZGF0YQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR5cGUoc2VsZi5kYXRhKSk6CisgICAgICAgICAgICBzZWxmLmRhdGEgKz0gb3RoZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSArPSBsaXN0KG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZgogICAgIGRlZiBfX211bF9fKHNlbGYsIG4pOgogICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhKm4pCiAgICAgX19ybXVsX18gPSBfX211bF9fCisgICAgZGVmIF9faW11bF9fKHNlbGYsIG4pOgorICAgICAgICBzZWxmLmRhdGEgKj0gbgorICAgICAgICByZXR1cm4gc2VsZgogICAgIGRlZiBhcHBlbmQoc2VsZiwgaXRlbSk6IHNlbGYuZGF0YS5hcHBlbmQoaXRlbSkKICAgICBkZWYgaW5zZXJ0KHNlbGYsIGksIGl0ZW0pOiBzZWxmLmRhdGEuaW5zZXJ0KGksIGl0ZW0pCiAgICAgZGVmIHBvcChzZWxmLCBpPS0xKTogcmV0dXJuIHNlbGYuZGF0YS5wb3AoaSkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3VzZXJzdHJpLnB5IGIvTGliL2Rvcy04eDMvdXNlcnN0cmkucHkKaW5kZXggNTI4MDY1ZS4uZWEzZDUxNSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdXNlcnN0cmkucHkKKysrIGIvTGliL2Rvcy04eDMvdXNlcnN0cmkucHkKQEAgLTUwLDkgKzUwLDIwIEBACiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18ob3RoZXIgKyBzZWxmLmRhdGEpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc3RyKG90aGVyKSArIHNlbGYuZGF0YSkKKyAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBVc2VyU3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYuZGF0YSArPSBvdGhlci5kYXRhCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgU3RyaW5nVHlwZSkgb3IgaXNpbnN0YW5jZShvdGhlciwgVW5pY29kZVR5cGUpOgorICAgICAgICAgICAgc2VsZi5kYXRhICs9IG90aGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGEgKz0gc3RyKG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZgogICAgIGRlZiBfX211bF9fKHNlbGYsIG4pOgogICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhKm4pCiAgICAgX19ybXVsX18gPSBfX211bF9fCisgICAgZGVmIF9faW11bGxfXyhzZWxmLCBuKToKKyAgICAgICAgc2VsZi5kYXRhICs9IG4KKyAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgICMgdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIGFscGhhYmV0aWNhbCBvcmRlcjoKICAgICBkZWYgY2FwaXRhbGl6ZShzZWxmKTogcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5jYXBpdGFsaXplKCkpCkBAIC03NSw2ICs4Niw4IEBACiAgICAgICAgIHJldHVybiBzZWxmLmRhdGEuZmluZChzdWIsIHN0YXJ0LCBlbmQpCiAgICAgZGVmIGluZGV4KHNlbGYsIHN1Yiwgc3RhcnQ9MCwgZW5kPXN5cy5tYXhpbnQpOiAKICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pbmRleChzdWIsIHN0YXJ0LCBlbmQpCisgICAgZGVmIGlzYWxwaGEoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXNhbHBoYSgpCisgICAgZGVmIGlzYWxudW0oc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXNhbG51bSgpCiAgICAgZGVmIGlzZGVjaW1hbChzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pc2RlY2ltYWwoKQogICAgIGRlZiBpc2RpZ2l0KHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmlzZGlnaXQoKQogICAgIGRlZiBpc2xvd2VyKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmlzbG93ZXIoKQpAQCAtMTAyLDggKzExNSw4IEBACiAgICAgZGVmIHN0cmlwKHNlbGYpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnN0cmlwKCkpCiAgICAgZGVmIHN3YXBjYXNlKHNlbGYpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnN3YXBjYXNlKCkpCiAgICAgZGVmIHRpdGxlKHNlbGYpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnRpdGxlKCkpCi0gICAgZGVmIHRyYW5zbGF0ZShzZWxmLCB0YWJsZSwgZGVsZXRlY2hhcnM9IiIpOiAKLSAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS50cmFuc2xhdGUodGFibGUsIGRlbGV0ZWNoYXJzKSkKKyAgICBkZWYgdHJhbnNsYXRlKHNlbGYsICphcmdzKTogCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEudHJhbnNsYXRlKCphcmdzKSkKICAgICBkZWYgdXBwZXIoc2VsZik6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEudXBwZXIoKSkKIAogY2xhc3MgTXV0YWJsZVN0cmluZyhVc2VyU3RyaW5nKToK