# tru_tags v3.3 # Article tagging # Nathan Arthur # http://www.rainskit.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMTp7czoxNToiYWxsb3dfaHRtbF9oZWxwIjtpOjA7czo3OiJ2ZXJzaW9uIjtzOjM6IjMu MyI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjQ6Imh0dHA6Ly93d3cucmFpbnNraXQuY29tLyI7czoxMToiZGVzY3JpcHRpb24iO3M6 MTU6IkFydGljbGUgdGFnZ2luZyI7czo0OiJ0eXBlIjtpOjE7czo0OiJuYW1lIjtzOjg6InRy dV90YWdzIjtzOjQ6ImhlbHAiO3M6Njc1OiIJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVf dGFncywgY2hlY2sgb3V0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9i bG9nLzQ5My90cnV0YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuIj5pbnRy b2R1Y3RvcnkgYXJ0aWNsZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29t L3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMiPnJlbGVhc2VzIHBhZ2U8L2E+LCA8 YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3Mt ZmVhdHVyZS1saXN0Ij5mZWF0dXJlIGxpc3Q8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnJh aW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAiPnJvYWRtYXA8L2E+ LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5Ny90 cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+dXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPi48L3A+ CgoJPHA+SSYjODIxNzt2ZSB0YWtlbiB0aGUgZGV0YWlsZWQgaGVscCBvdXQgb2YgdGhlIHBs dWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRvbyBiaWcgYW5kIHRvbyBkaWZmaWN1bHQg dG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRlIGFuZCBpbiB0aGUgcGx1Z2luLjwvcD4i O3M6NDoiY29kZSI7czozOTQ4MzoiCiNDb3B5cmlnaHQgMjAwOCBOYXRoYW4gQXJ0aHVyCiNS ZWxlYXNlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBzZWUgaHR0cDovL3d3dy5v cGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAgZm9yIGRldGFpbHMKI1Ro aXMgd29yayBpcyBpbnNwaXJlZCBieSByYW5fdGFncyBieSBSYW4gQXJvdXNzaSwgb3JpZ2lu YWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20vYXJ0aWNsZS80NS90YWdnaW5nLXRl eHRwYXR0ZXJuCgoKIyMjIENPTkZJR1VSQVRJT04gIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMj IwoKIyBUVVJOIEJBQ0shICBDb25maWd1cmF0aW9uIGlzIG5vIGxvbmdlciBoYW5kbGVkIGJ5 IGVkaXRpbmcgdGhlIHBsdWdpbi4KIyBDaGVjayBvdXQgdGhlICdFeHRlbnNpb25zJyB0YWIg aW4gdGhlIFRleHRwYXR0ZXJuIGFkbWluIDopCgoKIyBDaGFuZ2luZyB0aGVzZSB3b24ndCBk byBhbnkgZ29vZC4gIFRoZXkncmUganVzdCBoZXJlIGFzIGEgY29udmVuaWVuY2UgZm9yIGRl dmVsb3BtZW50LgpkZWZpbmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRzJyk7CmRlZmlu ZSgnQ0xFQU5fVVJMUycsICdjbGVhbl91cmxzJyk7CmRlZmluZSgnVEFHX1NFQ1RJT04nLCAn dGFnX3NlY3Rpb24nKTsKZGVmaW5lKCdQQVJNX05BTUUnLCAncGFybScpOwpkZWZpbmUoJ1RB R1NfSU5fRkVFRF9DQVRFR09SSUVTJywgJ3RhZ3NfaW5fZmVlZF9jYXRlZ29yaWVzJyk7CmRl ZmluZSgnVEFHU19JTl9GRUVEX0JPRFknLCAndGFnc19pbl9mZWVkX2JvZHknKTsKZGVmaW5l KCdUQUdTX0lOX1dSSVRFX1RBQicsICd0YWdzX2luX3dyaXRlX3RhYicpOwoKZ2xvYmFsICR0 cnVfdGFnc19wcmVmczsKJHRydV90YWdzX3ByZWZzID0gdHJ1X3RhZ3NfbG9hZF9wcmVmcygp OwoKCiMjIyBQUklNQVJZIFRBRyBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFnc19oYW5kbGVyKCRhdHRzKSB7CgkkdGFnX3Bh cmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoKSwgZmFsc2UpOwoJaWYg KCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpIHsKCQlpZiAodHJ1X3RhZ3NfcmVkaXJlY3RfaWZf bmVlZGVkKCR0YWdfcGFyYW1ldGVyKSkgewoJCQlyZXR1cm4gJyc7CgkJfQoJCSRjbGVhbl9h dHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIp OwoJCSRyZXN1bHQgPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJCSNmdW5jdGlv biBpbiBUWFAgY29kZQoJCWlmICh0cmltKCRyZXN1bHQpID09ICcnKSB7CgkJCWlmIChpc3Nl dCgkYXR0c1snbm9hcnRpY2xlcyddKSkgewoJCQkJdHJ1X3RhZ3NfcmVkaXJlY3QoJGF0dHNb J25vYXJ0aWNsZXMnXSwgdHJ1ZSk7CgkJCX0gZWxzZSB7CgkJCQl0eHBfZGllKGdUeHQoJzQw NF9ub3RfZm91bmQnKSwgJzQwNCcpOwoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXN1 bHQ7CgkJfQoJfSBlbHNlIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpOwoJfQp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYXJjaGl2ZSgkYXR0cykgewoJZ2xvYmFsICR0cnVfdGFn c19jdXJyZW50X2FyY2hpdmVfdGFnOwoJJHRhZ3MgPSBhcnJheV91bmlxdWUodHJ1X3RhZ3Nf Y2xvdWRfcXVlcnkodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZh bHNlLCBmYWxzZSkpKTsKCXNvcnQoJHRhZ3MpOwoJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykg ewoJCSR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnID0gJHRhZzsKCQkkY2xlYW5fYXR0 cyA9IHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWcpOwoJCSRyZXN1bHRz W10gPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBpbiBUWFAg Y29kZQoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkcmVzdWx0cyk7Cn0KCgpmdW5jdGlvbiB0cnVf dGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKCRhdHRzKSB7CglnbG9iYWwgJHRydV90YWdzX2N1 cnJlbnRfYXJjaGl2ZV90YWc7CglleHRyYWN0KGxBdHRzKGFycmF5KCdsaW5rJyA9PiAnMCcp LCAgJGF0dHMsIDApKTsKCWlmICgkbGluaykgewoJCXJldHVybiAnPGEgaHJlZj0iJyAuIHRy dV90YWdzX2xpbmtpZnlfdGFnKCR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKSAuICci PicgLiAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZyAuICc8L2E+JzsKCX0gZWxzZSB7 CgkJcmV0dXJuICR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnOwoJfQp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpIHsKCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90 YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsKfQoK CmZ1bmN0aW9uIHRydV90YWdzX2xpc3QoJGF0dHMpIHsKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0 X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIHRydWUsIGZhbHNlKTsKCSRhbGxfdGFncyA9 IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsKCglyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVy X2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7Cn0KCgpmdW5jdGlvbiB0cnVf dGFnc19mcm9tX2FydGljbGUoJGF0dHMpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRy YWN0KCR0aGlzYXJ0aWNsZSk7CgoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9y X2FydGljbGUoJHRoaXNpZCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv dWRfYXR0cygkYXR0cywgZmFsc2UsIHRydWUpOwoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAk YWxsX3RhZ3M7CglpZiAoJGF0dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCSRhbGxfdGFn c19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJfQoKCXJldHVy biB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zv cl93ZWlnaHQpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMsICR0 aGluZykgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsK CgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoKCSRycyA9IHNhZmVfcm93KCR0YWdz X2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19maWVsZCA8 PiAnJyIpOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpIHsKCWV4dHJhY3Qo bEF0dHMoYXJyYXkoJ3RhZycgPT4gJycpLCAgJGF0dHMsIDApKTsKCgkkdGFnX3BhcmFtZXRl ciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gMSks IGZhbHNlKTsKCSRjb25kaXRpb24gPSAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgPyB0cnVl IDogZmFsc2U7CglpZiAoJGNvbmRpdGlvbiAmJiAhZW1wdHkoJHRhZykpIHsKCQkkY29uZGl0 aW9uID0gKCR0YWdfcGFyYW1ldGVyID09ICR0YWcpOwoJfQoJcmV0dXJuIHBhcnNlKEV2YWxF bHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3Bh cmFtZXRlcigkYXR0cywgJHNhZmVodG1sID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVfdGFnc19w cmVmczsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gJzAnLCAndXJs ZW5jb2RlJyA9PiAwKSwgICRhdHRzLCAwKSk7CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3RyaXBf dGFncyhncHMoJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlKSkpOwoJaWYgKCds b29rdXAnID09ICRzdHJpcGh5cGhlbnMpIHsKCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFu ZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNlLCBmYWxzZSk7CgkJJHRhZ19saXN0ID0g YXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7CgkJZm9yZWFjaCAo JHRhZ19saXN0IGFzICRjbG91ZF90YWcpIHsKCQkJaWYgKCRwYXJtID09IHN0cl9yZXBsYWNl KCcgJywgJy0nLCAkY2xvdWRfdGFnKSkgewoJCQkJJHBhcm0gPSAkY2xvdWRfdGFnOwoJCQkJ YnJlYWs7CgkJCX0KCQl9Cgl9IGVsc2UgaWYgKCRzdHJpcGh5cGhlbnMpIHsKCQkkcGFybSA9 IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkcGFybSk7Cgl9CglpZiAoJHVybGVuY29kZSkgewoJ CSRwYXJtID0gdXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkgewoJ CSRwYXJtID0gaHRtbHNwZWNpYWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJuICRwYXJtOwp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpIHsKCXRyaWdnZXJfZXJy b3IoZ1R4dCgnZGVwcmVjYXRlZF90YWcnKSwgRV9VU0VSX05PVElDRSk7CglyZXR1cm4gc3Ry aXBfdGFncyhncHMoJ3EnKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZWxhdGVkX3RhZ3Nf ZnJvbV9zZWFyY2goJGF0dHMpIHsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3Bh cmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CglleHRyYWN0KGxBdHRzKGFycmF5KCd0YWdfcGFy YW1ldGVyJyA9PiAkdGFnX3BhcmFtZXRlciksICAkYXR0cywgMCkpOwoJaWYgKCFlbXB0eSgk dGFnX3BhcmFtZXRlcikpIHsKICAgICAgICAkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxE OwoJCSRhbGxfdGFncyA9IGFycmF5KCk7CgoJCSRxdWVyeV9hdHRzID0gdHJ1X3RhZ3NfZml4 dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIpOwoJCSRycyA9IHRydV90YWdz X3JlZG9fYXJ0aWNsZV9zZWFyY2goJHF1ZXJ5X2F0dHMpOwoJCWlmICgkcnMpIHsKCQkJd2hp bGUgKCRhID0gbmV4dFJvdygkcnMpKSB7CgkJCQkkYXJ0aWNsZV90YWdzID0gYXJyYXkoKTsK CQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxkLCAkYSkpIHsKCQkJCQkkYXJ0 aWNsZV90YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigkYVsk dGFnc19maWVsZF0pKSk7CgkJCQl9CgkJCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJnZSgkYWxs X3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkYXJ0aWNsZV90YWdzKSk7CgkJCX0KCQl9CgoJ CSRhbHRfdGFnX3BhcmFtZXRlciA9IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkdGFnX3BhcmFt ZXRlcik7CgkJZm9yZWFjaCAoJGFsbF90YWdzIGFzICRrZXkgPT4gJHRhZykgewoJCQlpZiAo JHRhZyA9PSAkdGFnX3BhcmFtZXRlciB8fCAkdGFnID09ICRhbHRfdGFnX3BhcmFtZXRlcikg ewoJCQkJdW5zZXQoJGFsbF90YWdzWyRrZXldKTsKCQkJfQoJCX0KCgkJJGNsb3VkX2F0dHMg PSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNl KTsKCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9ICRhbGxfdGFnczsKCQlpZiAoJGNsb3VkX2F0 dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9IHRy dV90YWdzX2Nsb3VkX3F1ZXJ5KCRjbG91ZF9hdHRzKTsKCQl9CgoJCXJldHVybiB0cnVfdGFn c19yZW5kZXJfY2xvdWQoJGNsb3VkX2F0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93 ZWlnaHQpOwoJfSBlbHNlIHsKCQlyZXR1cm4gJyc7Cgl9Cn0KCgojIyMgQ0xPVUQgU1VQUE9S VCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0 aW9uIHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCAkaXNMaXN0LCAk aXNBcnRpY2xlKSB7CglyZXR1cm4gbEF0dHMoYXJyYXkoJ3dyYXB0YWcnCT0+ICgkaXNMaXN0 ID8gJ3VsJyA6ICcnKSwKCQkJJ2JyZWFrJwkJPT4gKCRpc0xpc3QgPyAnbGknIDogJywgJyks CgkJCSdjbGFzcycJCT0+ICcnLAoJCQknYnJlYWtjbGFzcycJPT4gJycsCgkJCSdzZWN0aW9u Jwk9PiAnJywKCQkJJ21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQknbWF4cGVyY2VudCcJPT4g KCRpc0xpc3QgfHwgJGlzQXJ0aWNsZSA/ICcxMDAnIDogJzIwMCcpLAoJCQknc2hvd2NvdW50 cycJPT4gJycsCgkJCSdjb3VudHdyYXBjaGFycycJPT4gJ1tdJywKCQkJJ3VzZXJlbHRhZycJ PT4gKCRpc0FydGljbGUgPyAnMScgOiAnJyksCgkJCSdnZW5lcmF0ZWxpbmtzJwk9PiAnMScs CgkJCSdtaW50YWdjb3VudCcJPT4gJzAnLAoJCQknbWF4dGFnY291bnQnCT0+ICcxMDAwJywK CQkJJ3NldHNpemVzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksCgkJCSd1c2Vub2Zv bGxvdycJPT4gJycsCgkJCSdzb3J0JwkJPT4gJ2FscGhhJywKCQkJJ3VzZW92ZXJhbGxjb3Vu dHMnCT0+ICcnLAoJCQknc2V0Y2xhc3NlcycJPT4gKCRpc0FydGljbGUgPyAnMCcgOiAnMScp LAoJCQkndGl0bGUnCQk9PiAnJywKCQkJJ2xpc3RsaW1pdCcJPT4gJycsCgkJCSdrZWVwJwkJ PT4gJ2xhcmdlc3QnLAoJCQknY3V0b2ZmJwk9PiAnY2h1bmsnLAoJCQkndGV4dHRyYW5zZm9y bScJPT4gJ25vbmUnLAoJCQknbGlua3BhdGgnCT0+ICcnLAoJCQknbGlua3BhdGh0YWlsJwk9 PiAnJywKCQkJJ2ZpbHRlcnNlYXJjaCcJPT4gJzEnLAoJCQknZXhjbHVkZXNlY3Rpb24nPT4g JycsCgkJCSdhY3RpdmVjbGFzcycJPT4gJ3RhZ0FjdGl2ZScsCgkJCSd0aW1lJwkJPT4gJ3Bh c3QnCgkJKSwkYXR0cywgMCk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZF9xdWVyeSgk YXR0cykgewoJZXh0cmFjdCgkYXR0cyk7CgoJJHNlY3Rpb25fY2xhdXNlID0gJyc7CglpZiAo JHNlY3Rpb24gPD4gJycpIHsKCQkka2V5cyA9IHNwbGl0KCcsJywgJHNlY3Rpb24pOwoJCWZv cmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKCQkJJGtleXBhcnRzW10gPSAiIFNlY3Rpb24gPSAn IiAuIHRyaW0oJGtleSkgLiAiJyI7CgkJfQoJCSRzZWN0aW9uX2NsYXVzZSA9ICIgQU5EICgi IC4gam9pbignIG9yICcsICRrZXlwYXJ0cykgLiAiKSI7Cgl9CgoJJHRhZ3NfZmllbGQgPSBU UlVfVEFHU19GSUVMRDsKCWluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJsaXNoL3NlYXJjaC5w aHAnOwoKCSRmaWx0ZXIgPSB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0 aW9uKTsKCSRmaWx0ZXIgLj0gKCRmaWx0ZXJzZWFyY2ggPyBmaWx0ZXJTZWFyY2goKSA6ICcn KTsKCglzd2l0Y2ggKCR0aW1lKSB7CgkJY2FzZSAnYW55JzoKCQkJJHRpbWUgPSAiIjsgYnJl YWs7CgkJY2FzZSAnZnV0dXJlJzoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPiBub3coKSI7 IGJyZWFrOwoJCWRlZmF1bHQ6CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkIDw9IG5vdygpIjsK CX0KCWdsb2JhbCAkcHJlZnM7CglleHRyYWN0KCRwcmVmcyk7CglpZiAoISRwdWJsaXNoX2V4 cGlyZWRfYXJ0aWNsZXMpIHsKCQkkdGltZSAuPSAiIGFuZCAobm93KCkgPD0gRXhwaXJlcyBv ciBFeHBpcmVzID0gIi5OVUxMREFURVRJTUUuIikiOwoJfQoKCSRhbGxfdGFncyA9IGFycmF5 KCk7CgkkcnMgPSBzYWZlX3Jvd3MoIiR0YWdzX2ZpZWxkIiwgInRleHRwYXR0ZXJuIiwgIiR0 YWdzX2ZpZWxkIDw+ICcnIiAuICRzZWN0aW9uX2NsYXVzZSAuICRmaWx0ZXIgLiAiIGFuZCBT dGF0dXMgPj0gJzQnIiAuICR0aW1lKTsKCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJJHRl bXBfYXJyYXkgPSBhcnJheSgpOwoJCWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxk LCAkcm93KSkgewoJCQkkdGVtcF9hcnJheSA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdz X3N0cnRvbG93ZXIoJHJvd1skdGFnc19maWVsZF0pKSk7CgkJfQoJCSRhbGxfdGFncyA9IGFy cmF5X21lcmdlKCRhbGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90YWdzKCR0ZW1wX2FycmF5KSk7 Cgl9CgoJcmV0dXJuICRhbGxfdGFnczsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2ZpbHRlcl9z ZWN0aW9ucygkZXhjbHVkZXNlY3Rpb24pIHsKCSRzZWN0aW9ucyA9IGV4cGxvZGUoJywnLCAk ZXhjbHVkZXNlY3Rpb24pOwoJJGZpbHRlcnMgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHNlY3Rp b25zIGFzICRzZWN0aW9uKSB7CgkJJGZpbHRlcnNbXSA9ICJhbmQgU2VjdGlvbiAhPSAnIi5k b1NsYXNoKCRzZWN0aW9uKS4iJyI7Cgl9CglyZXR1cm4gam9pbignICcsICRmaWx0ZXJzKTsK fQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAk YWxsX3RhZ3NfZm9yX3dlaWdodCkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWV4dHJh Y3QoJGF0dHMpOwoKCSR0YWdzX3dlaWdodCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3Rh Z3NfZm9yX3dlaWdodCk7CgoJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdl aWdodCkgewoJCWlmICghaW5fYXJyYXkoJHRhZywgJGFsbF90YWdzKQoJCSAgIHx8ICR0YWdz X3dlaWdodFskdGFnXSA8ICRtaW50YWdjb3VudAoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFn XSA+ICRtYXh0YWdjb3VudCkgewoJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOwoJCX0K CX0KCgkkc29ydF9ieV9jb3VudCA9IChzdHJwb3MoJHNvcnQsICdjb3VudCcpICE9PSBmYWxz ZSk7Cgkkc29ydF9hc2NlbmRpbmcgPSAoc3RycG9zKCRzb3J0LCAnYXNjJykgIT09IGZhbHNl KTsKCSR0YWdzX3dlaWdodCA9IHRydV90YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRz b3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRpbmcpOwoKCWlmICgkbGlzdGxpbWl0ID4gMCAm JiAkbGlzdGxpbWl0IDwgY291bnQoJHRhZ3Nfd2VpZ2h0KSkgewoJCSRyZXNvcnRlZF90YWdz ID0gYXJyYXkoKTsKCQlpZiAoJGtlZXAgPT0gJ2xhcmdlc3QnKSB7CgkJCSRyZXNvcnRlZF90 YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCB0cnVl LCBmYWxzZSkpOwoJCX0gZWxzZSB7CgkJCWlmICgka2VlcCA9PSAncmFuZG9tJykgewoJCQkJ Zm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCQkJCSRyZXNv cnRlZF90YWdzWyR0YWddID0gcmFuZCgwLCAkd2VpZ2h0KTsKCQkJCX0KCQkJCSRyZXNvcnRl ZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3RhZ3MoJHJlc29ydGVkX3RhZ3Ms IHRydWUsIGZhbHNlKSk7CgkJCX0gZWxzZSBpZiAoJGtlZXAgPT0gJ2FscGhhJykgewoJCQkJ JHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKCR0YWdzX3dlaWdodCk7CgkJCQluYXRjYXNl c29ydCgkcmVzb3J0ZWRfdGFncyk7CgkJCX0KCQkJJGN1dG9mZiA9ICdleGFjdCc7CgkJfQoK CQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAtIDE7CgkJaWYgKCRjdXRvZmYgPT0g J2NodW5rJykgeyAvL2FsdGVybmF0aXZlIGlzICdleGFjdCcKCQkJJGxhc3Rfd2VpZ2h0ID0g LTE7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRsaXN0bGltaXQgKyAxOyAkaSsrKSB7CgkJCQkk bmV3X3dlaWdodCA9ICR0YWdzX3dlaWdodFskcmVzb3J0ZWRfdGFnc1skaV1dOwoJCQkJaWYg KCRuZXdfd2VpZ2h0ICE9ICRsYXN0X3dlaWdodCkgewoJCQkJCSRsYXN0X2dvb2RfaW5kZXgg PSAkaSAtIDE7CgkJCQkJJGxhc3Rfd2VpZ2h0ID0gJG5ld193ZWlnaHQ7CgkJCQl9CgkJCX0K CQkJaWYgKCRsYXN0X2dvb2RfaW5kZXggPCAwKSB7CgkJCQkkbGFzdF9nb29kX2luZGV4ID0g JGxpc3RsaW1pdCAtIDE7CgkJCX0KCQl9CgoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfY2h1 bmsoJHJlc29ydGVkX3RhZ3MsICRsYXN0X2dvb2RfaW5kZXggKyAxKTsKCQkkcmVzb3J0ZWRf dGFncyA9ICRyZXNvcnRlZF90YWdzWzBdOwoKCQlmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMg JHRhZyA9PiAkd2VpZ2h0KSB7CgkJCWlmICghaW5fYXJyYXkoJHRhZywgJHJlc29ydGVkX3Rh Z3MpKSB7CgkJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOwoJCQl9CgkJfQoJfQoKCWlm ICgkZ2VuZXJhdGVsaW5rcykgewoJCWlmICgkbGlua3BhdGgpIHsKCQkJJHVybHByZWZpeCA9 ICRsaW5rcGF0aDsKCQkJJHVybHN1ZmZpeCA9ICRsaW5rcGF0aHRhaWw7CgkJfSBlbHNlIHsK CQkJaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkgewoJCQkJJHVybHByZWZpeCA9IGh1IC4g JHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUgLiAnLyc7CgkJCX0gZWxzZSB7 CgkJCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD VElPTl0tPnZhbHVlIC4gJyZhbXA7JyAuICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52 YWx1ZSAuICc9JzsKCQkJfQoJCQkkdXJsc3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3VybHMo KSA/ICcvJyA6ICcnKTsKCQl9CgoJCWlmICgkdXNlcmVsdGFnKSB7CgkJCWlmICgkdXNlbm9m b2xsb3cpIHsKCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0YWcgbm9mb2xsb3cnOwoJCQl9 IGVsc2UgewoJCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9InRhZyc7CgkJCX0KCQl9IGVsc2Ug aWYgKCR1c2Vub2ZvbGxvdykgewoJCQkkdXJsc3VmZml4IC49ICciIHJlbD0ibm9mb2xsb3cn OwoJCX0KCX0KCglpZiAoY291bnQoJHRhZ3Nfd2VpZ2h0KSA+IDApIHsKCQkkbWF4ID0gbWF4 KCR0YWdzX3dlaWdodCk7CgkJJG1pbiA9IG1pbigkdGFnc193ZWlnaHQpOwoJfSBlbHNlIHsK CQkkbWF4ID0gJG1pbiA9IDA7Cgl9Cgkkc3RlcHZhbHVlID0gKCRtYXggPT0gJG1pbikgPyAw IDogKCRtYXhwZXJjZW50IC0gJG1pbnBlcmNlbnQpIC8gKCRtYXggLSAkbWluKTsKCgkkdGFn c19odG1sID0gYXJyYXkoKTsKCSR0YWdfc2VhcmNoX3RhZyA9IHRydV90YWdzX3RhZ19wYXJh bWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gJzEnKSk7CgkkdGFnX3NlYXJjaF90YWcg PSBmdW5jdGlvbl9leGlzdHMoImh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlIikgPyBodG1sc3Bl Y2lhbGNoYXJzX2RlY29kZSgkdGFnX3NlYXJjaF90YWcpIDogaHRtbF9lbnRpdHlfZGVjb2Rl KCR0YWdfc2VhcmNoX3RhZyk7Cglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAk d2VpZ2h0KSB7CgkJJHRhZ193ZWlnaHQgPSBmbG9vcigkbWlucGVyY2VudCArICgkd2VpZ2h0 IC0gJG1pbikgKiAkc3RlcHZhbHVlKTsKCgkJJHN0eWxlID0gJyc7CgkJaWYgKCRzZXRzaXpl cykKCQkJJHN0eWxlID0gJyBzdHlsZT0iZm9udC1zaXplOiAnIC4gJHRhZ193ZWlnaHQgLiAn JTsiJzsKCgkJJHRhZ19jbGFzcyA9ICcnOwoJCWlmICgkc2V0Y2xhc3NlcykgewoJCQkkdGFn X2NsYXNzID0gJyBjbGFzcz0iJzsKCQkJaWYgKCR3ZWlnaHQgPT0gJG1pbikgewoJCQkJJHRh Z19jbGFzcyAuPSAidGFnU2l6ZVNtYWxsZXN0IjsKCQkJfSBlbHNlIGlmICgkd2VpZ2h0ID09 ICRtYXgpIHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVMYXJnZXN0IjsKCQkJfSBlbHNl IHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOwoJCQl9CgkJCSR0YWdfY2xh c3MgLj0gJyB0YWdTaXplJyAuICgkd2VpZ2h0ICsgMSAtICRtaW4pOwoJCQlpZiAoJHRhZyA9 PSAkdGFnX3NlYXJjaF90YWcpIHsKCQkJCSR0YWdfY2xhc3MgLj0gJyAnIC4gJGFjdGl2ZWNs YXNzOwoJCQl9CgkJCSR0YWdfY2xhc3MgLj0gJyInOwoJCX0KCgkJLy9hZGFwdGVkIGZyb20g Y29kZSBieSBnZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3Zp ZXd0b3BpYy5waHA/cGlkPTEwMjg3NSNwMTAyODc1CgkJJHRpdGxlY291bnQgPSAnJzsKCQlp ZiAoJHRpdGxlKQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAnIic7 CgkJJGRpc3BsYXljb3VudD0gJyc7CgkJJGNvdW50ID0gJGNvdW50d3JhcGNoYXJzezB9IC4g JHdlaWdodCAuICRjb3VudHdyYXBjaGFyc3sxfTsKCQlpZiAoJHNob3djb3VudHMgPT0gJ3Rp dGxlJyB8fCAkc2hvd2NvdW50cyA9PSAnYm90aCcpCgkJCSR0aXRsZWNvdW50ID0gJyB0aXRs ZT0iJyAuICR0aXRsZSAuICRjb3VudCAuICciJzsKCQlpZiAoJHNob3djb3VudHMgJiYgJHNo b3djb3VudHMgIT0gJ3RpdGxlJykKCQkJJGRpc3BsYXljb3VudCA9ICcgJyAuICRjb3VudDsK CgkJaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBpdGFsaXplJykgewoJCQkkdGFnID0gdWN3 b3JkcygkdGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICd1cHBlcmNhc2Un KSB7CgkJCSR0YWcgPSBzdHJ0b3VwcGVyKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFu c2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHsKCQkJJHRhZyA9IHN0cnRvbG93ZXIoJHRhZyk7CgkJ fSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwZmlyc3QnKSB7CgkJCSR0YWcgPSB1 Y2ZpcnN0KCR0YWcpOwoJCX0KCgkJaWYgKCRnZW5lcmF0ZWxpbmtzKSB7CgkJCSR3aG9sZXVy bCA9ICciJyAuICR1cmxwcmVmaXggLiB1cmxlbmNvZGUoc3RyX3JlcGxhY2UoJyAnLCAnLScs ICR0YWcpKSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVm PScgLiAkd2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAn PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsK CQl9IGVsc2UgaWYgKCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8ICR0aXRsZWNvdW50KSB7CgkJ CSR0YWdzX2h0bWxbXSA9ICc8c3BhbicgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxl Y291bnQgLiAnPicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvc3Bhbj4nIC4gJGRp c3BsYXljb3VudDsKCQl9IGVsc2UgewoJCQkkdGFnc19odG1sW10gPSBodG1sc3BlY2lhbGNo YXJzKCR0YWcpIC4gJGRpc3BsYXljb3VudDsKCQl9Cgl9CglyZXR1cm4gdHJ1X3RhZ3NfZG9f d3JhcCgkdGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNz KTsKfQoKCiMjIyBDTEVBTiBVUkwgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMKCmlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCXJlZ2lzdGVyX2NhbGxi YWNrKCd0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jyk7Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CglnbG9i YWwgJHRydV90YWdzX3ByZWZzOwoJJHN1YnBhdGggPSBwcmVnX3JlcGxhY2UoIi9odHRwcz86 XC9cLy4qKFwvLiopL1VpIiwiJDEiLGh1KTsKCSRyZWdzYWZlc3VicGF0aCA9IHByZWdfcXVv dGUoJHN1YnBhdGgsICcvJyk7CgkkcmVxID0gcHJlZ19yZXBsYWNlKCIvXiRyZWdzYWZlc3Vi cGF0aC9pIiwnLycsJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOwoKCSRxcyA9IHN0cnBvcygk cmVxLCAnPycpOwoJJHFhdHRzID0gKCRxcyA/ICcmJy5zdWJzdHIoJHJlcSwgJHFzICsgMSkg OiAnJyk7CglpZiAoJHFzKSAkcmVxID0gc3Vic3RyKCRyZXEsIDAsICRxcyk7CgoJJHBhcnRz ID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcihzcGxpdCgnLycsICRyZXEpKSk7CglpZiAo Y291bnQoJHBhcnRzKSA9PSAyICYmICRwYXJ0c1swXSA9PSAkdHJ1X3RhZ3NfcHJlZnNbVEFH X1NFQ1RJT05dLT52YWx1ZSkgewoJCSR0YWcgPSAkcGFydHNbMV07CgkJJF9TRVJWRVJbJ1FV RVJZX1NUUklORyddID0gJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0n IC4gJHRhZyAuICRxYXR0czsKCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICRzdWJwYXRo IC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUgLiAnLz8nIC4gJF9TRVJW RVJbJ1FVRVJZX1NUUklORyddOwoJCWlmIChjb3VudCgkX1BPU1QpID4gMCkgewoJCQkkX1BP U1RbJ3NlY3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOwoJ CQkkX1BPU1RbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7CgkJ fSBlbHNlIHsKCQkJJF9HRVRbJ3NlY3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD VElPTl0tPnZhbHVlOwoJCQkkX0dFVFskdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFs dWVdID0gJHRhZzsKCQl9Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbGVhbl91cmxzKCkg ewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCXJldHVybiAoJ2NsZWFuJyA9PSAkdHJ1X3Rh Z3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlKTsKfQoKCiMjIyBBRE1JTiBTSURFIEZVTkNU SU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaWYgKEB0eHBpbnRlcmZh Y2UgPT0gJ2FkbWluJykgewoJYWRkX3ByaXZzKCd0cnVfdGFncycsICcxLDInKTsKCXJlZ2lz dGVyX3RhYignZXh0ZW5zaW9ucycsICd0cnVfdGFncycsICd0cnVfdGFncycpOwoJcmVnaXN0 ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3RhYicsICd0cnVfdGFncycpOwoKCWlmICgk dHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSkgewoJCXJlZ2lzdGVy X2NhbGxiYWNrKCd0cnVfdGFnc19hZG1pbl93cml0ZV90YWJfaGFuZGxlcicsICdhcnRpY2xl Jyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl90YWIoJGV2ZW50LCAkc3RlcCkg ewoJcmVxdWlyZV9wcml2cygndHJ1X3RhZ3MnKTsKCgkkcmVzdWx0cyA9IHRydV90YWdzX2Fk bWluX3RhYl9oYW5kbGVfaW5wdXQoKTsKCgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFy ZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNlLCBmYWxzZSk7CgkkYWxsX3RhZ3MgPSB0cnVf dGFnc19jbG91ZF9xdWVyeSgkYXR0cyk7CgkkY2xvdWQgPSB0cnVfdGFnc19yZW5kZXJfY2xv dWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzKTsKCgkkcmVkaXJlY3RzID0gdHJ1X3Rh Z3NfbG9hZF9yZWRpcmVjdHMoKTsKCgl0cnVfdGFnc19hZG1pbl90YWJfcmVuZGVyX3BhZ2Uo JHJlc3VsdHMsICRjbG91ZCwgJHJlZGlyZWN0cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19h ZG1pbl90YWJfcmVuZGVyX3BhZ2UoJHJlc3VsdHMsICRjbG91ZCwgJHJlZGlyZWN0cykgewoJ Z2xvYmFsICRldmVudDsKCXBhZ2V0b3AoJ3RydV90YWdzJywgJycpOwoKCWluY2x1ZGUodHhw YXRoIC4gJy9pbmNsdWRlL3R4cF9wcmVmcy5waHAnKTsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJl ZnM7CgoJZWNobyBzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcxMHB4JykuJzx0cj48 dGQgc3R5bGU9ImJvcmRlci1yaWdodDoycHggc29saWQgZ3JheSI+Jy4gICMgSSBrbm93LCBJ IGtub3cuLi4KCQlzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcnLCAnMTBweCcpLic8 dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5Ij4nLgoJCQlzdGFy dFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4JykuCgkJCQl0cihoQ2VsbChnVHh0 KCdDdXJyZW50IHRhZ3MnKSkpLgoJCQkJdHIodGQoJGNsb3VkKSkuCgkJCWVuZFRhYmxlKCku CgkJJzwvdGQ+PC90cj48dHI+PHRkPicuCgkJCXN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycs ICcnLCAnMzAwcHgnKS4KCQkJCXRyKGhDZWxsKGdUeHQoJ3RydV90YWdzIFJlZmVyZW5jZScp KSkuCgkJCQl0cih0ZCgnPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJl bmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+VXNhZ2UgaW5zdHJ1Y3Rpb25z PC9hPicuCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20v dmlld3RvcGljLnBocD9pZD0xNTA4NCI+Rm9ydW0gcGFnZXM8L2E+Jy4KCQkJCSc8YnI+PGEg aHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzUzNy90cnVfdGFncy1y ZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8v d3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAiPlJlbGVh c2Ugcm9hZG1hcDwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0 LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0Ij5GZWF0dXJlIGxpc3Q8 L2E+Jy4KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Js b2cvNDkzL3RydXRhZ3MtYS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPnRydV90 YWdzPC9hPiwgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vIj5OYXRoYW4g QXJ0aHVyPC9hPicuCgkJCQknPGJyPjxicj4nLgoJCQkJJzxkaXYgaWQ9InBheXBhbCI+PGZv cm0gYWN0aW9uPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRo b2Q9InBvc3QiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhj bGljayIgLz48aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsLmNv bS9lbl9VUy9pL2J0bi94LWNsaWNrLWJ1dDA0LmdpZiIgbmFtZT0ic3VibWl0IiBhbHQ9Ik1h a2UgYSBkb25hdGlvbiB0byBOYXRoYW4gQXJ0aHVyIiAvPjxpbWcgYWx0PSIiIGJvcmRlcj0i MCIgc3JjPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvc2NyL3BpeGVsLmdpZiIg d2lkdGg9IjEiIGhlaWdodD0iMSIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJlbmNy eXB0ZWQiIHZhbHVlPSItLS0tLUJFR0lOIFBLQ1M3LS0tLS1NSUlIVHdZSktvWklodmNOQVFj RW9JSUhRRENDQnp3Q0FRRXhnZ0V3TUlJQkxBSUJBRENCbERDQmpqRUxNQWtHQTFVRUJoTUNW Vk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJR d0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBj ekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhC aGVYQmhiQzVqYjIwQ0FRQXdEUVlKS29aSWh2Y05BUUVCQlFBRWdZQzhpMVQyN2xqS2ZwTlRF UWkwd0tIY2RHdWx4eGtNcXdkQ01tYkd2czg3bi80VHNKdGlBc3FNbzJoeXM3WnNHeTVSRi9P N3MrQjJvUTc2elVsVDUyV1c3UWVYVUszR3AwbnIyY1AzaW9CU3ROdStSWjZqa2FtMkUwRkdM WHlWNitVTlZFT3doOGxtb0lTUm90dlN2SWdReVRMbkVlREhxRzlxdlV6cXZGM1NxakVMTUFr R0JTc09Bd0lhQlFBd2djd0dDU3FHU0liM0RRRUhBVEFVQmdncWhraUc5dzBEQndRSXBtUFpy bHJaZlptQWdhaWVQVmIrbjlzVmRzdWZnR3JtQXcyclhBelIzOWtZcVBVSjduMExpTkRtZEFx NzNKb1A1M2taeThnU3BvdnVjTDJTMGpDMXNYcmNwRUxBcExMOEJGU0hmZExpWm9aU1YvQ1lP cHBINStkeDJZcUZJZHlDQ2RqSVg3b09QZ1F5QXVnUmEyUXIzYit5dXR1RzBERnNkK0xBSkdi OGw0Q25ucmJtd2RZSzNOblZEQlBPbXhFT2psWFVnRXpsRkxYbUUzdzUrTW9QS1FjcDJuOGZk SkxzZ0cxNXhvVlBGekNkL0syZ2dnT0hNSUlEZ3pDQ0F1eWdBd0lCQWdJQkFEQU5CZ2txaGtp Rzl3MEJBUVVGQURDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdG QVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1 akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhj R2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwd0hoY05NRFF3TWpF ek1UQXhNekUxV2hjTk16VXdNakV6TVRBeE16RTFXakNCampFTE1Ba0dBMVVFQmhNQ1ZWTXhD ekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZ RFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJN QThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhC aGJDNWpiMjB3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU1GSFR0MzhS TXhMWEp5TzJTbVMrTmRsNzJUN29LSjR1NHV3KzZhd250QUxXaDAzUGV3bUlKdXpiQUxTY3NU UzRzWm9TMWZLY2lCR29oMTFnSWZIenlsdmtkTmUvaEpsNjYvUkdxcmo1ckZiMDhzQUFCTlR6 RFRpcXFOcEplQnNZcy9jMmFpR296cHRYMlJsbkJrdEgrU1VOcEFhalc3MjROdjJXdmhpZjZz RkFnTUJBQUdqZ2U0d2dlc3dIUVlEVlIwT0JCWUVGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFda SlJyTUlHN0JnTlZIU01FZ2JNd2diQ0FGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyb1lH VXBJR1JNSUdPTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZC QWNURFUxdmRXNTBZV2x1SUZacFpYY3hGREFTQmdOVkJBb1RDMUJoZVZCaGJDQkpibU11TVJN d0VRWURWUVFMRkFwc2FYWmxYMk5sY25Sek1SRXdEd1lEVlFRREZBaHNhWFpsWDJGd2FURWNN Qm9HQ1NxR1NJYjNEUUVKQVJZTmNtVkFjR0Y1Y0dGc0xtTnZiWUlCQURBTUJnTlZIUk1FQlRB REFRSC9NQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBSUZmT2xhYWdGcmw3MStqcTZPS2lkYldG U0UrUTRGcVJPdmRnSU9OdGgrOGtTSy8vWS80aWh1RTRZbXZ6bjVjZUUzUy9pQlNRUU1qeXZi K3MyVFdiUVlEd2NwMTI5T1BJYkQ5ZXBkcjR0Sk9VTmlTb2p3N0JId1lSaVBoNThTMXhHbEZn SEZYd3JFQmIzZGdOYk1VYSt1NHFlY3RzTUFYcFZIbkQ5d0l5Zm1ITVlJQm1qQ0NBWllDQVFF d2daUXdnWTR4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkRRVEVXTUJRR0ExVUVC eE1OVFc5MWJuUmhhVzRnVm1sbGR6RVVNQklHQTFVRUNoTUxVR0Y1VUdGc0lFbHVZeTR4RXpB UkJnTlZCQXNVQ214cGRtVmZZMlZ5ZEhNeEVUQVBCZ05WQkFNVUNHeHBkbVZmWVhCcE1Sd3dH Z1lKS29aSWh2Y05BUWtCRmcxeVpVQndZWGx3WVd3dVkyOXRBZ0VBTUFrR0JTc09Bd0lhQlFD Z1hUQVlCZ2txaGtpRzl3MEJDUU14Q3dZSktvWklodmNOQVFjQk1Cd0dDU3FHU0liM0RRRUpC VEVQRncwd09EQTNNRE13TkRFME1USmFNQ01HQ1NxR1NJYjNEUUVKQkRFV0JCVDB0a2o0ZFpM ZS9FNFF3YmliMjlYRWRIeEFZakFOQmdrcWhraUc5dzBCQVFFRkFBU0JnTDVKc1FIalE5U2c0 WTNlRFdLRE8xNnIrdGZFejRSWUFEdCs2aDk4MWZrVkN4Zk5IRkR4b2ZEY3h5elJNWXI3eTk1 Y2RuVmk0QU5Rd01VWTZ5Slc1am0vR0QxN3JqZ1N4Wk1FdnNBZTZZY0NTTEs1WmFwQ3cxcWx5 U3BQR1pCQTNNVHQ2T0Qrb3ZWb2EvMXY4Q05zRWNIcDdmNHRPeE9VU3c1UDRuSHlMUFdqLS0t LS1FTkQgUEtDUzctLS0tLSI+PC9mb3JtPjwvZGl2PicKCQkJCSkpLgoJCQllbmRUYWJsZSgp LgoJCSc8L3RkPjwvdHI+Jy5lbmRUYWJsZSgpLgoJJzwvdGQ+PHRkPicuCgkJc3RhcnRUYWJs ZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90 dG9tOjJweCBzb2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOwoKCQlpZiAoJHJlc3VsdHMpIHsK CQkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJCXRy KGhDZWxsKGdUeHQoJ1Jlc3VsdHMnKSkpLgoJCQkJdHIodGRhKCRyZXN1bHRzKSwgJyBzdHls ZT0iY29sb3I6cmVkIicpLgoJCQllbmRUYWJsZSgpOwoJCQllY2hvICc8L3RkPjwvdHI+PHRy Pjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCQl9CgoKCQll Y2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0YWco Z1R4dCgnQXJ0aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vuc2l0 aXZlJykuJyEpJywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4KCQkJdHIoCgkJCQlmb3JtKAoJ CQkJCXRkYShnVHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjpt aWRkbGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLgoJ CQkJCXRkYShnVHh0KCd0bycpLic6JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxl IicpLgoJCQkJCXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLgoJCQkJ CXRkKGZJbnB1dCgnc3VibWl0JywgJ3JlcGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gn KS5lSW5wdXQoJ3RydV90YWdzJykpLAoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdh cmVfeW91X3N1cmUnKSAuICdcJykiJwoJCQkJKQoJCQkpLgoJCQl0cigKCQkJCWZvcm0oCgkJ CQkJdGRhKGdUeHQoJ0RlbGV0ZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p ZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lucHV0KCdkZWxldGV0YWcnLCAnJywgJzE1JykpLgoJ CQkJCXRkY3MoJycsIDIpLgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdU eHQoJ1J1bicpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycsICcg dmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJCSku CgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVy LWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0Jywg JycsICcnLCAnJywgJzEwMCUnKS4KCQkJdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAn dGgnLCAnIGNvbHNwYW49IjQiJykpOwoJCQlmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0 dGFnID0+ICRyaWdodHRhZykgewoJCQkJZWNobyB0cigKCQkJCQl0ZGEoaHJlZigkbGVmdHRh ZywgdHJ1X3RhZ3NfbGlua2lmeV90YWcoJGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGln bjogY2VudGVyIicpLgoJCQkJCXRkYShodG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0eWxl PSJ0ZXh0LWFsaWduOiBjZW50ZXIiJykuCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVf dGFnc19saW5raWZ5X3RhZygkcmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2Vu dGVyIicpLgoJCQkJCXRkKCc8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1w O2RlbGV0ZV9yZWRpcmVjdD0nLnVybGVuY29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJl dHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4n KQoJCQkJKTsKCQkJfQoJCQllY2hvIHRyKAoJCQkJJzxmb3JtIG5hbWU9InJlZGlyZWN0IiBp ZD0icmVkaXJlY3QiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHA/ZXZlbnQ9dHJ1 X3RhZ3MiIG9uc3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUn KS4nXCcpIj4nLgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAn IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciInKS4KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFy cygnPT4nKSwgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2Vu dGVyIicpLgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdyaWdodHRhZycsICcnLCAnMTUnKSwgJyBz dHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiJykuCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNs aWNrPSJpZiAodmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVu dC5nZXRFbGVtZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7 Ij5BZGQgbmV3PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJ CQlmSW5wdXQoJ2hpZGRlbicsICdyZWRpcmVjdCcsICcxJykuCgkJCQknPC9mb3JtPicKCgkJ CSkuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZD4nOwoKCQllY2hv IHN0YXJ0VGFibGUoJ2xpc3QnKS4KCQkJdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0 aCcsICcgY29sc3Bhbj0iMiInKSkuCgkJCWZvcm0oCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgn VXNlIGNsZWFuIFVSTHMnKS4nICgnLmdUeHQoJ3NpdGUgZGVmYXVsdCBpcycpLicgJy4kdHJ1 X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPmRlZmF1bHRfdmFsdWUuJyk6ICcsICcgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZChyYWRpb19saXN0KENMRUFOX1VS TFMsCgkJCQkJCQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0 KCdtZXNzeScpKSwKCQkJCQkJCSR0cnVfdGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUp KQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdUYWcgc2VjdGlvbiBuYW1lJykuJyAo ZGVmYXVsdCBpcyAiJy4kdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT5kZWZhdWx0X3Zh bHVlLiciKTogJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRk KHRleHRfaW5wdXQoVEFHX1NFQ1RJT04sICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0t PnZhbHVlLCAnMTUnKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVVJMIHBhcmFt ZXRlciBmb3IgdGFnIHNlYXJjaCcpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZz W1BBUk1fTkFNRV0tPmRlZmF1bHRfdmFsdWUuJyIpOiAnLgoJCQkJCQknPGJyPih5b3Ugc2hv dWxkblwndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFy ZSBkb2luZyknLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQo dGV4dF9pbnB1dChQQVJNX05BTUUsICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1 ZSwgJzE1JykpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1B1dCB0YWdzIGludG8g UlNTL0F0b20gZmVlZHMsIGluICJDYXRlZ29yeSIgZWxlbWVudHMnKS4KCQkJCQkJJzogPGJy Pih5b3UgcHJvYmFibHkgd2FudCB0aGlzKScsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p ZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAk dHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkpCgkJCQkp LgoJCQkJdHIoCgkJCQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRoZSBib2R5IG9m IFJTUy9BdG9tIGZlZWRzLCAnLgoJCQkJCQknd2l0aCBsaW5rcywgYW5kIHdpdGggcmVsPSJ0 YWciOjxicj5JZiB0aGlzIGlzIHR1cm5lZCBvbiwnLgoJCQkJCQkneW91IGNhbiBkZWZpbmUg YSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19mZWVkX3RhZ3MgJy4KCQkJCQkJJ3RoYXQg d2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgdGFncyBpbiB0aGUgZmVlZC4nLAoJCQkJCQkn IHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhU QUdTX0lOX0ZFRURfQk9EWSwgJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXS0+ dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdTaG93IGEgY2xpY2thYmxl IGxpc3Qgb2YgdGFncyBvbiB0aGUgIldyaXRlIiBwYWdlJykuJzogJywKCQkJCQkJJyBzdHls ZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19J Tl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVl KSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZCgnJykuCgkJCQkJdGRhKGZJbnB1dCgnc3VibWl0 JywgJ3ByZWZzJywgZ1R4dCgnU2F2ZScpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3Mn KSwgJyBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCInKQoJCQkJKSwKCQkJCScnLCAnIHZlcmlm eShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJwoJCQkpLgoJCWVuZFRhYmxl KCkuJzwvdGQ+PC90cj4nLgoJCWVuZFRhYmxlKCk7CgoJZWNobyAnPC90ZD48L3RyPicuZW5k VGFibGUoKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3RhYl9oYW5kbGVfaW5wdXQo KSB7CglpZiAoZ3BzKCdwcmVmcycpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3VwZGF0 ZV9wcmVmcygpOwoJfSBlbHNlIGlmIChncHMoJ2RlbGV0ZScpKSB7CgkJcmV0dXJuIHRydV90 YWdzX2FkbWluX2RlbGV0ZV90YWcoZ3BzKCdkZWxldGV0YWcnKSk7Cgl9IGVsc2UgaWYgKGdw cygncmVwbGFjZScpKSB7CgkJJHJlc3VsdCA9IHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFn KGdwcygnbWF0Y2h0YWcnKSwgZ3BzKCdyZXBsYWNldGFnJyksIGZhbHNlKTsKCQlyZXR1cm4g JHJlc3VsdCAuICc8YnI+JyAuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21h dGNodGFnJyksIGdwcygncmVwbGFjZXRhZycpKTsKCX0gZWxzZSBpZiAoZ3BzKCdyZWRpcmVj dCcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ2xlZnR0 YWcnKSwgZ3BzKCdyaWdodHRhZycpKTsKCX0gZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJl Y3QnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9kZWxldGVfcmVkaXJlY3QoZ3BzKCdk ZWxldGVfcmVkaXJlY3QnKSk7Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCmZ1bmN0 aW9uIHRydV90YWdzX2FkbWluX3VwZGF0ZV9wcmVmcygpIHsKCWdsb2JhbCAkdHJ1X3RhZ3Nf cHJlZnM7CgkkcmVzdWx0cyA9IGFycmF5KCk7Cglmb3JlYWNoICgkdHJ1X3RhZ3NfcHJlZnMg YXMgJHByZWYpIHsKCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+dmFsaWRhdGVfdmFsdWUoZ3Bz KCRwcmVmLT5uYW1lKSk7CgkJaWYgKCR2YWxpZF92YWx1ZSAmJiAkdmFsaWRfdmFsdWUgPD4g Z3BzKCRwcmVmLT5uYW1lKSkgewoJCQlyZXR1cm4gJHZhbGlkX3ZhbHVlOyAgIyMjIHRoaXMg aXMgYSBzbmVha3kgd2F5IHRvIGhhbmRsZSB2YWxpZGF0aW9uIC0gc29ycnkgOykKCQl9CgkJ aWYgKCR2YWxpZF92YWx1ZSA8PiAkcHJlZi0+dmFsdWUpIHsKCQkJaWYgKCR2YWxpZF92YWx1 ZSA9PSAkcHJlZi0+ZGVmYXVsdF92YWx1ZSkgewoJCQkJJHJlc3VsdCA9IHRydV90YWdzX2Rl bGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQgPSB0cnVf dGFnc191cHNlcnRfcHJlZigkcHJlZi0+bmFtZSwgJHZhbGlkX3ZhbHVlKTsKCQkJfQoJCQlp ZiAoJHJlc3VsdCkgewoJCQkJJHJlc3VsdHNbXSA9ICdVcGRhdGVkICcgLiAkcHJlZi0+bmFt ZTsKCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSRy ZXN1bHRzW10gPSAnRXJyb3IgdXBkYXRpbmcgJyAuICRwcmVmLT5uYW1lOwoJCQl9CgkJfQoJ fQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAwKSB7CgkJcmV0dXJuICdObyByZWNvcmRzIG5l ZWQgdXBkYXRpbmcnOwoJfSBlbHNlIHsKCQlyZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRz KTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3Vwc2VydF9wcmVmKCRuYW1lLCAkdmFsdWUp IHsKCWlmICghc2FmZV9xdWVyeSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNh ZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpLgoJCScgKG5hbWUgdmFyY2hhcigyNTUpIHByaW1h cnkga2V5LCAnLgoJCSd2YWx1ZSB2YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsKCQlyZXR1 cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngo J3RydV90YWdzX3ByZWZzJykgLiAnIHRhYmxlLic7Cgl9CgoJcmV0dXJuIHNhZmVfdXBzZXJ0 KCd0cnVfdGFnc19wcmVmcycsICd2YWx1ZT0iJy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFt ZS4nIicpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZGVsZXRlX3ByZWYoJG5hbWUpIHsKCWlm IChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcHJlZnMnLCAnbmFtZT0iJy4kbmFtZS4nIicpKSB7 CgkJaWYgKHNhZmVfY291bnQoJ3RydV90YWdzX3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZl X3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsK CQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0gZWxzZSB7CgkJcmV0dXJu IGZhbHNlOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3RhZygkZGVs ZXRldGFnKSB7CglpZiAodHJpbSgkZGVsZXRldGFnKSkgewoJCXJldHVybiB0cnVfdGFnc19h ZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1ZSk7Cgl9IGVsc2UgewoJCXJl dHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf YWRtaW5fcmVwbGFjZV90YWcoJG1hdGNodGFnLCAkcmVwbGFjZXRhZywgJGFsbG93X2JsYW5r X3JlcGxhY2V0YWcpIHsKCSRtYXRjaHRhZyA9IHRyaW0oJG1hdGNodGFnKTsKCSRyZXBsYWNl dGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7CglpZiAoJG1hdGNodGFnICYmICgkYWxsb3dfYmxh bmtfcmVwbGFjZXRhZyB8fCAkcmVwbGFjZXRhZykpIHsKCQlpZiAoc2FmZV91cGRhdGUoJ3Rl eHRwYXR0ZXJuJywgVFJVX1RBR1NfRklFTEQuJz10cmltKGJvdGggXCcsXCcgZnJvbSByZXBs YWNlKGNvbmNhdCgiLCIsICcuVFJVX1RBR1NfRklFTEQuJywgIiwiKSwgY29uY2F0KCIsIiwg XCcnLmFkZHNsYXNoZXMoJG1hdGNodGFnKS4nXCcsICIsIiksIFwnLCcuYWRkc2xhc2hlcygk cmVwbGFjZXRhZykuJyxcJykpJywgJzEnKSkgewoJCQlyZXR1cm4gJ1VwZGF0ZWQgJy5teXNx bF9hZmZlY3RlZF9yb3dzKCkuJyByb3dzICgiJy5odG1sc3BlY2lhbGNoYXJzKCRtYXRjaHRh ZykuJyI9PiInLmh0bWxzcGVjaWFsY2hhcnMoJHJlcGxhY2V0YWcpLiciKSc7CgkJfSBlbHNl IHsKCQkJcmV0dXJuICdFcnJvcjogJyAuIG15c3FsX2Vycm9yKCk7CgkJfQoJfSBlbHNlIHsK CQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGluIGJvdGggZmllbGRzJzsKCX0KfQoK CmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZygkbGVmdHRhZywgJHJpZ2h0 dGFnKSB7CgkkbGVmdHRhZyA9IGFkZHNsYXNoZXModHJ1X3RhZ3Nfc3RydG9sb3dlcih0cmlt KCRsZWZ0dGFnKSkpOwoJJHJpZ2h0dGFnID0gYWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0b2xv d2VyKHRyaW0oJHJpZ2h0dGFnKSkpOwoJaWYgKCEkbGVmdHRhZyB8fCAhJHJpZ2h0dGFnKSB7 CgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBpbiBib3RoIGZpZWxkcyc7Cgl9CgoJ aWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUgdGFibGUgaWYgbm90IGV4aXN0cyAnIC4gc2FmZV9w ZngoJ3RydV90YWdzX3JlZGlyZWN0cycpLgoJCScgKGxlZnR0YWcgdmFyY2hhcigyNTUpIHBy aW1hcnkga2V5LCAnLgoJCSdyaWdodHRhZyB2YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsK CQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2Fm ZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpIC4gJyB0YWJsZS4nOwoJfQoKCWlmIChzYWZl X2luc2VydCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJ2xlZnR0YWc9IicuJGxlZnR0YWcuJyIs cmlnaHR0YWc9IicuJHJpZ2h0dGFnLiciJykpIHsKCQlyZXR1cm4gJ1JlZGlyZWN0IGFkZGVk ICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIj0+IicuaHRtbHNwZWNpYWxjaGFy cygkcmlnaHR0YWcpLiciKSAtIHBsZWFzZSB0ZXN0IGl0ISc7Cgl9IGVsc2UgewoJCXJldHVy biAnRXJyb3IgYWRkaW5nIHJlY29yZCAtIGRvZXMgaXQgYWxyZWFkeSBleGlzdD8nOwoJfQp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KCRsZWZ0dGFnKSB7 CglpZiAoc2FmZV9kZWxldGUoJ3RydV90YWdzX3JlZGlyZWN0cycsICdsZWZ0dGFnPSInLmFk ZHNsYXNoZXMoJGxlZnR0YWcpLiciJykpIHsKCQlpZiAoc2FmZV9jb3VudCgndHJ1X3RhZ3Nf cmVkaXJlY3RzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBz YWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykpKSB7CgkJCXJldHVybiAnUmVkaXJlY3Qg ZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3Rh Z3NfcmVkaXJlY3RzJyk7CgkJfQoJCXJldHVybiAnUmVkaXJlY3QgZGVsZXRlZCAoIicuaHRt bHNwZWNpYWxjaGFycygkbGVmdHRhZykuJyIpJzsKCX0gZWxzZSB7CgkJcmV0dXJuICdFcnJv ciBkZWxldGluZyByZWRpcmVjdCc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl93 cml0ZV90YWJfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CgkkYXR0cyA9IHRydV90YWdzX2dl dF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIHRydWUsIHRydWUpOwoJJGF0dHNbJ3Rp bWUnXSA9ICdhbnknOwoJJGNsb3VkID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1 ZXJ5KCRhdHRzKSk7Cglzb3J0KCRjbG91ZCk7CgoJJGlkID0gKGVtcHR5KCRHTE9CQUxTWydJ RCddKSA/IGdwcygnSUQnKSA6ICRHTE9CQUxTWydJRCddKTsKCSRhcnRpY2xlX3RhZ3MgPSAo ZW1wdHkoJGlkKSA/IGFycmF5KCkgOiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgk aWQpKTsKCgkkbGlua3MgPSBhcnJheSgpOwoJZm9yZWFjaCAoJGNsb3VkIGFzICR0YWcpIHsK CQkkc3R5bGUgPSAoaW5fYXJyYXkoJHRhZywgJGFydGljbGVfdGFncykgPyAnIGNsYXNzPSJ0 YWdfY2hvc2VuIicgOiAnJyk7CgkJJGxpbmtzW10gPSAnPGEgaHJlZj0iI2FkdmFuY2VkIicu JHN0eWxlLicgb25jbGljaz0idGhpcy5zZXRBdHRyaWJ1dGUoXFxcJ2NsYXNzXFxcJywgdG9n Z2xlVGFnKFxcXCcnLmFkZHNsYXNoZXMoYWRkc2xhc2hlcygkdGFnKSkuJ1xcXCcpKTsgcmV0 dXJuIGZhbHNlOyI+JyAuIGFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycygkdGFnKSkgLiAn PFwvYT4nOwoJfQoJJHRvX2luc2VydCA9IGpvaW4oJywgJywgJGxpbmtzKTsKCSR0b19pbnNl cnQgPSAiPHN0eWxlPmEudGFnX2Nob3NlbntiYWNrZ3JvdW5kLWNvbG9yOiAjRkVCOyBjb2xv cjogYmxhY2s7fTwvc3R5bGU+IiAuICR0b19pbnNlcnQ7CgoJJGpzID0gPDw8RU9GCgkJdmFy IGtleXdvcmRzRmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsK CQl2YXIgcGFyZW50ID0ga2V5d29yZHNGaWVsZC5wYXJlbnROb2RlOwoJCXBhcmVudC5hcHBl bmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKCQl2YXIgY2xvdWQgPSBk b2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CgkJY2xvdWQuc2V0QXR0cmlidXRlKCdj bGFzcycsICd0cnVfdGFnc19hZG1pbl90YWdzJyk7CgkJY2xvdWQuaW5uZXJIVE1MID0gJ3sk dG9faW5zZXJ0fSc7CgkJcGFyZW50LmFwcGVuZENoaWxkKGNsb3VkKTsKCgkJZnVuY3Rpb24g dG9nZ2xlVGFnKHRhZ05hbWUpIHsKCQkJdmFyIHJlZ2V4VGFnID0gdGFnTmFtZS5yZXBsYWNl KC8oW1xcXFxcXlxcJCorW1xcXT97fS49IToofCldKS9nLCJcXFxcJDEiKTsKCQkJdmFyIHRh Z1JlZ2V4ID0gbmV3IFJlZ0V4cCgiKChefCwpXFxccyopIiArIHJlZ2V4VGFnICsgIlxcXHMq KCxcXFxzKnwkKSIpOwoJCQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZCgna2V5d29yZHMnKTsKCQkJdmFyIGN1cnZhbCA9IHRleHRhcmVhLnZhbHVlLnJlcGxhY2Uo Lyw/XHMrJC8sICcnKTsKCQkJaWYgKCcnID09IGN1cnZhbCkgewoJCQkJdGV4dGFyZWEudmFs dWUgPSB0YWdOYW1lOwoJCQl9IGVsc2UgaWYgKGN1cnZhbC5tYXRjaCh0YWdSZWdleCkpIHsK CQkJCXRleHRhcmVhLnZhbHVlID0gY3VydmFsLnJlcGxhY2UodGFnUmVnZXgsICckMScpLnJl cGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJCXJldHVybiAnJzsKCQkJfSBlbHNlIGlmICgnLCcg PT0gY3VydmFsLmNoYXJBdChjdXJ2YWwubGVuZ3RoIC0gMSkpIHsKCQkJCXRleHRhcmVhLnZh bHVlICs9ICcgJyArIHRhZ05hbWU7CgkJCX0gZWxzZSB7CgkJCQl0ZXh0YXJlYS52YWx1ZSAr PSAnLCAnICsgdGFnTmFtZTsKCQkJfQoJCQlyZXR1cm4gJ3RhZ19jaG9zZW4nOwoJCX0KRU9G OwoKCWVjaG8gc2NyaXB0X2pzKCRqcyk7Cn0KCgojIyMgQVRPTS9SU1MgRkVFRCBGVU5DVElP TlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnJlZ2lzdGVyX2NhbGxi YWNrKCd0cnVfdGFnc19hdG9tX2hhbmRsZXInLCAnYXRvbV9lbnRyeScpOwpmdW5jdGlvbiB0 cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3Nf ZmVlZF9oYW5kbGVyKHRydWUpOyB9CnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19yc3Nf aGFuZGxlcicsICdyc3NfZW50cnknKTsKZnVuY3Rpb24gdHJ1X3RhZ3NfcnNzX2hhbmRsZXIo JGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKGZhbHNlKTsg fQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKCRhdG9tKSB7CglnbG9iYWwgJHRo aXNhcnRpY2xlLCAkdHJ1X3RhZ3NfcHJlZnM7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgoJ JHRhZ3MgPSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkdGhpc2lkKTsKCglpZiAo JHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXS0+dmFsdWUpIHsKCQkkZXh0cmFi b2R5ID0gJyc7CgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFnc19mZWVkX3RhZ3MnOwoJCWlmIChm ZXRjaCgnZm9ybScsICd0eHBfZm9ybScsICduYW1lJywgJEZPUk1fTkFNRSkpIHsKCQkJJGZv cm0gPSBmZXRjaF9mb3JtKCRGT1JNX05BTUUpOwoJCQkkZXh0cmFib2R5ID0gdHJpbShwYXJz ZSgkZm9ybSkpOwoJCX0gZWxzZSB7CgkJCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJk X2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIHRydWUpOwoJCQkkZXh0cmFib2R5ID0gJzxw PnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICR0YWdzLCAkdGFncykg LiAnPC9wPic7CgkJfQoJCWdsb2JhbCAkdGhpc2FydGljbGU7CgkJaWYgKHRyaW0oJHRoaXNh cnRpY2xlWydleGNlcnB0J10pKSB7CgkJCSR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddID0gdHJp bSgkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSkubi4kZXh0cmFib2R5Lm47CgkJfQoJCSR0aGlz YXJ0aWNsZVsnYm9keSddID0gdHJpbSgkdGhpc2FydGljbGVbJ2JvZHknXSkubi4kZXh0cmFi b2R5Lm47Cgl9CgoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklF U10tPnZhbHVlKSB7CgkJJG91dHB1dCA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJHRhZ3MgYXMg JHRhZykgewoJCQlpZiAoJGF0b20pIHsKCQkJCSRvdXRwdXRbXSA9ICc8Y2F0ZWdvcnkgdGVy bT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnIiAvPic7CgkJCX0gZWxzZSB7CgkJ CQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4g JzwvY2F0ZWdvcnk+JzsKCQkJfQoJCX0KCQlyZXR1cm4gbi5qb2luKG4sICRvdXRwdXQpLm47 Cgl9Cn0KCgojIyMgUFJFRlMgRlVOQ1RJT05TIC8gQ0xBU1NFUyAjIyMKIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjbGFzcyB0cnVfdGFnc19wcmVmIHsKCWZ1bmN0aW9u IHRydV90YWdzX3ByZWYoJG5hbWUsICRkZWZhdWx0X3ZhbHVlLCAkdHlwZSkgewoJCSR0aGlz LT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPnZhbHVlID0gJGRlZmF1bHRfdmFsdWU7CgkJJHRo aXMtPmRlZmF1bHRfdmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsKCQkkdGhpcy0+dHlwZSA9ICR0 eXBlOwoJfQoKCWZ1bmN0aW9uIHZhbGlkYXRlX3ZhbHVlKCR2YWx1ZSkgewoJCWlmICgkdmFs dWUpIHsKCQkJcmV0dXJuICR2YWx1ZTsKCQl9IGVsc2UgaWYgKCR0aGlzLT50eXBlID09ICdi b29sZWFuJykgewoJCQlyZXR1cm4gJzAnOwoJCX0gZWxzZSB7CgkJCXJldHVybiAnUGxlYXNl IGVudGVyIGEgdmFsdWUgZm9yICcgLiAkdGhpcy0+bmFtZTsKCQl9Cgl9Cn0KCmZ1bmN0aW9u IHRydV90YWdzX2xvYWRfcHJlZnMoKSB7CgkkcHJlZnMgPSBhcnJheSgpOwoKCWdsb2JhbCAk cGVybWxpbmtfbW9kZTsKCSRwcmVmc1tDTEVBTl9VUkxTXSA9IG5ldyB0cnVfdGFnc19wcmVm KENMRUFOX1VSTFMsICgkcGVybWxpbmtfbW9kZSAhPSAnbWVzc3knID8gJ2NsZWFuJyA6ICdt ZXNzeScpLCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHX1NFQ1RJT05dID0gbmV3IHRydV90YWdz X3ByZWYoVEFHX1NFQ1RJT04sICd0YWcnLCAnc3RyaW5nJyk7CgkkcHJlZnNbUEFSTV9OQU1F XSA9IG5ldyB0cnVfdGFnc19wcmVmKFBBUk1fTkFNRSwgJ3QnLCAnc3RyaW5nJyk7CgkkcHJl ZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdID0gbmV3IHRydV90YWdzX3ByZWYoVEFHU19J Tl9GRUVEX0NBVEVHT1JJRVMsICcxJywgJ2Jvb2xlYW4nKTsKCSRwcmVmc1tUQUdTX0lOX0ZF RURfQk9EWV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZFRURfQk9EWSwgJzAnLCAn Ym9vbGVhbicpOwoJJHByZWZzW1RBR1NfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19w cmVmKFRBR1NfSU5fV1JJVEVfVEFCLCAnMScsICdib29sZWFuJyk7CgoJaWYgKG15c3FsX3F1 ZXJ5KCJkZXNjcmliZSAiIC4gUEZYIC4gInRydV90YWdzX3ByZWZzIikpIHsKCQkkcnMgPSBz YWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3NfcHJlZnMnLCAnMScpOwoJCWZvcmVhY2ggKCRycyBh cyAkcm93KSB7CgkJCSRwcmVmc1skcm93WyduYW1lJ11dLT52YWx1ZSA9ICRyb3dbJ3ZhbHVl J107CgkJfQoJfQoKCXJldHVybiAkcHJlZnM7Cn0KCgojIyMgT1RIRVIgU1VQUE9SVCBGVU5D VElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRy dV90YWdzX3JlZGlyZWN0X2lmX25lZWRlZCgkdGFnX3BhcmFtZXRlcikgewoJJHJlZGlyZWN0 cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7Cglmb3JlYWNoICgkcmVkaXJlY3RzIGFz ICRsZWZ0dGFnID0+ICRyaWdodHRhZykgewoJCWlmICgkbGVmdHRhZyA9PSAkdGFnX3BhcmFt ZXRlciB8fCAkbGVmdHRhZyA9PSBzdHJfcmVwbGFjZSgnLScsICcgJywgJHRhZ19wYXJhbWV0 ZXIpKSB7CgkJCXRydV90YWdzX3JlZGlyZWN0KCRyaWdodHRhZywgZmFsc2UpOwoJCQlyZXR1 cm4gdHJ1ZTsKCQl9Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf bG9hZF9yZWRpcmVjdHMoKSB7CgkkcmVkaXJlY3RzID0gYXJyYXkoKTsKCWlmIChteXNxbF9x dWVyeSgiZGVzY3JpYmUgIiAuIFBGWCAuICJ0cnVfdGFnc19yZWRpcmVjdHMiKSkgewoJCSRy cyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMSBvcmRlciBieSBs ZWZ0dGFnJyk7CgkJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsKCQkJJHJlZGlyZWN0c1skcm93 WydsZWZ0dGFnJ11dID0gJHJvd1sncmlnaHR0YWcnXTsKCQl9Cgl9CglyZXR1cm4gJHJlZGly ZWN0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0KCRkZXN0aW5hdGlvbiwgJGlz X2Z1bGxfdXJsKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJaWYgKCRpc19mdWxsX3Vy bCkgewoJCSR1cmwgPSAkZGVzdGluYXRpb247CgkJJG1lc3NhZ2UgPSAnVGhlIHJlc291cmNl IHlvdSByZXF1ZXN0ZWQgaGFzIG1vdmVkIHRvICcgLiAkZGVzdGluYXRpb247Cgl9IGVsc2Ug ewoJCSR1cmwgPSB0cnVfdGFnc19saW5raWZ5X3RhZygkZGVzdGluYXRpb24sIGZhbHNlKTsK CQkkbWVzc2FnZSA9ICdUaGUgcmVxdWVzdGVkIHRhZyBoYXMgYmVlbiByZXBsYWNlZCBieSAn IC4gJGRlc3RpbmF0aW9uOwoJfQoKCWhlYWRlcignTG9jYXRpb246ICcgLiAkdXJsKTsKCXR4 cF9kaWUoJG1lc3NhZ2UsICczMDEnKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2xpbmtpZnlf dGFnKCR0YWcsICR1c2VfYW1wID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsK CWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1 X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsKCX0gZWxzZSB7CgkJJHVy bHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52 YWx1ZSAuICgkdXNlX2FtcCA/ICcmYW1wOycgOiAnJicpIC4gJHRydV90YWdzX3ByZWZzW1BB Uk1fTkFNRV0tPnZhbHVlIC4gJz0nOwoJfQoJJHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVh bl91cmxzKCkgPyAnLycgOiAnJyk7CglyZXR1cm4gJHVybHByZWZpeCAuIHVybGVuY29kZShz dHJfcmVwbGFjZSgnICcsICctJywgJHRhZykpIC4gJHVybHN1ZmZpeDsKfQoKCmZ1bmN0aW9u IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRhcnRpY2xlSUQpIHsKCSR0YWdzX2Zp ZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkkcnMgPSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRl eHRwYXR0ZXJuIiwgIklEPSckYXJ0aWNsZUlEJyBBTkQgJHRhZ3NfZmllbGQgPD4gJyciKTsK CSRhbGxfdGFncyA9IGFycmF5KCk7CglpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVs ZCwgJHJzKSkgewoJCSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0 cnRvbG93ZXIoJHJzWyR0YWdzX2ZpZWxkXSkpKTsKCX0KCglyZXR1cm4gdHJ1X3RhZ3NfdHJp bV90YWdzKCRhbGxfdGFncyk7Cn0KCgojIGZpeGVzIGJ1ZyB3aXRoIDQuMC40J3MgdmVyc2lv biBvZiBkb1dyYXAgdGhhdCBjYXVzZWQgc3BhY2VzIHRvIHNob3cgdXAgYmVmb3JlIHRoZSBj b21tYXMKZnVuY3Rpb24gdHJ1X3RhZ3NfZG9fd3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVh aywgJGNsYXNzLCAkYnJlYWtjbGFzcykgewoJaWYgKCEkd3JhcHRhZyAmJiAhcHJlZ19tYXRj aCgnL15cdyskLycsICRicmVhaykpIHsKCQlyZXR1cm4gam9pbigkYnJlYWsubiwgJGxpc3Qp OwoJfSBlbHNlIHsKCQlyZXR1cm4gZG9XcmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAk Y2xhc3MsICRicmVha2NsYXNzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3RyaW1fdGFn cygkdGFnX2FycmF5KSB7CgkkdHJpbW1lZCA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGFnX2Fy cmF5IGFzICR0YWcpIHsKCQlpZiAoIiIgIT0gdHJpbSgkdGFnKSkgewoJCQkkdHJpbW1lZFtd ID0gdHJpbSgkdGFnKTsKCQl9Cgl9CglyZXR1cm4gJHRyaW1tZWQ7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcikgewoJJGtl eXdvcmRzID0gZXhwbG9kZSgnLCcsICR0YWdfcGFyYW1ldGVyKTsKCWZvcmVhY2ggKCRrZXl3 b3JkcyBhcyAka2V5d29yZCkgewoJCWlmIChzdHJwb3MoJGtleXdvcmQsICctJykgIT09IGZh bHNlKSB7CgkJCSRrZXl3b3Jkc1tdID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICRrZXl3b3Jk KTsKCQl9Cgl9CgkkYXR0c1sna2V5d29yZHMnXSA9IGltcGxvZGUoJywnLCAka2V5d29yZHMp OwoKCWlmIChpc3NldCgkYXR0c1snc2VjdGlvbiddKSAmJiBzdHJwb3MoJGF0dHNbJ3NlY3Rp b24nXSwgJywnKSAhPT0gZmFsc2UpIHsKCQkkYXR0c1snc2VjdGlvbiddID0gJyc7Cgl9CgoJ aWYgKGlzc2V0KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkgewoJCXVuc2V0KCRhdHRzWydl eGNsdWRlc2VjdGlvbiddKTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ25vYXJ0aWNsZXMnXSkp IHsKCQl1bnNldCgkYXR0c1snbm9hcnRpY2xlcyddKTsKCX0KCglpZiAoIWlzc2V0KCRhdHRz WydsaW1pdCddKSkgewoJCSRhdHRzWydsaW1pdCddID0gJzEwMDAnOwoJfQoKCWlmICghaXNz ZXQoJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSkpIHsKCQkkYXR0c1snYWxsb3dvdmVycmlkZSdd ID0gdHJ1ZTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ3NlYXJjaGZvcm0nXSkgJiYgIWlzc2V0 KCRhdHRzWydsaXN0Zm9ybSddKSkgewoJCSRhdHRzWydsaXN0Zm9ybSddID0gJGF0dHNbJ3Nl YXJjaGZvcm0nXTsKCX0KCglyZXR1cm4gJGF0dHM7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19z dHJ0b2xvd2VyKCRzdHIpIHsKCWlmIChmdW5jdGlvbl9leGlzdHMoIm1iX3N0cnRvbG93ZXIi KSkgewoJCXJldHVybiBtYl9zdHJ0b2xvd2VyKCRzdHIsICJVVEYtOCIpOwoJfSBlbHNlIHsK CQlyZXR1cm4gc3RydG9sb3dlcigkc3RyKTsKCX0KfQoKCi8vdGhlc2UgbmV4dCB0d28gZnVu Y3Rpb25zIGFyZSBncm9zcywgYnV0IEkgY2FuJ3QgZmlndXJlIG91dCBhbm90aGVyIHdheSB0 byBkbyBpdApmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCAkc29y dF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKSB7CglnbG9iYWwgJHRydV90YWdzX3RhZ3Nf d2VpZ2h0LCAkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCwgJHRydV90YWdzX3NvcnRfYXNjZW5k aW5nOwoKCSR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0YWdzX3dlaWdodDsKCSR0cnVfdGFn c19zb3J0X2J5X2NvdW50ID0gJHNvcnRfYnlfY291bnQ7CgkkdHJ1X3RhZ3Nfc29ydF9hc2Nl bmRpbmcgPSAkc29ydF9hc2NlbmRpbmc7CgoJJHRlbXBfYXJyYXkgPSBhcnJheV9rZXlzKCR0 YWdzX3dlaWdodCk7Cgl1c29ydCgkdGVtcF9hcnJheSwgInRydV90YWdzX3NvcnRfdGFnc19j b21wYXJhdG9yIik7CgoJJHNvcnRlZF9hcnJheSA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGVt cF9hcnJheSBhcyAkdGFnKSB7CgkJJHNvcnRlZF9hcnJheVskdGFnXSA9ICR0YWdzX3dlaWdo dFskdGFnXTsKCX0KCglyZXR1cm4gJHNvcnRlZF9hcnJheTsKfQoKCmZ1bmN0aW9uIHRydV90 YWdzX3NvcnRfdGFnc19jb21wYXJhdG9yKCRsZWZ0LCAkcmlnaHQpIHsKCWdsb2JhbCAkdHJ1 X3RhZ3NfdGFnc193ZWlnaHQsICR0cnVfdGFnc19zb3J0X2J5X2NvdW50LCAkdHJ1X3RhZ3Nf c29ydF9hc2NlbmRpbmc7CgoJaWYgKCR0cnVfdGFnc19zb3J0X2J5X2NvdW50KSB7CgkJJGxl ZnRfd2VpZ2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRsZWZ0XTsKCQkkcmlnaHRfd2Vp Z2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRyaWdodF07CgkJaWYgKCRsZWZ0X3dlaWdo dCA9PSAkcmlnaHRfd2VpZ2h0KSB7CgkJCXJldHVybiBzdHJuYXRjYXNlY21wKCRsZWZ0LCAk cmlnaHQpOwoJCX0gZWxzZSBpZiAoJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nKSB7CgkJCXJl dHVybiAkbGVmdF93ZWlnaHQgLSAkcmlnaHRfd2VpZ2h0OwoJCX0gZWxzZSB7CgkJCXJldHVy biAkcmlnaHRfd2VpZ2h0IC0gJGxlZnRfd2VpZ2h0OwoJCX0KCX0gZWxzZSB7CgkJcmV0dXJu IHN0cm5hdGNhc2VjbXAoJGxlZnQsICRyaWdodCk7Cgl9Cn0KCgoKIyMjIEJBU1RBUkQgRlVO Q1RJT05TIFRIQVQgU0hPVUxETidUIEhBVkUgVE8gRVhJU1QgIyMjCiMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCmZ1bmN0aW9uIHRy dV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJGF0dHMpIHsKCSR0aGVBdHRzID0gbEF0dHMo YXJyYXkoJ2xpbWl0JyAgICAgPT4gMTAwMCwKCQkJCSdjYXRlZ29yeScgID0+ICcnLAoJCQkJ J3NlY3Rpb24nICAgPT4gJycsCgkJCQknZXhjZXJwdGVkJyA9PiAnJywKCQkJCSdhdXRob3In ICAgID0+ICcnLAoJCQkJJ3NvcnRieScgICAgPT4gJ1Bvc3RlZCcsCgkJCQknc29ydGRpcicg ICA9PiAnZGVzYycsCgkJCQknbW9udGgnICAgICA9PiAnJywKCQkJCSdrZXl3b3JkcycgID0+ ICcnLAoJCQkJJ2Zyb250cGFnZScgPT4gJycsCgkJCQknaWQnICAgICAgICA9PiAnJywKCQkJ CSd0aW1lJyAgICAgID0+ICdwYXN0JywKCQkJCSdzdGF0dXMnICAgID0+ICc0JywKCQkJCSdv ZmZzZXQnICAgID0+IDAKCQkJKSwkYXR0cywgMCk7CglleHRyYWN0KCR0aGVBdHRzKTsKCgkv L0J1aWxkaW5nIHF1ZXJ5IHBhcnRzCgkkZnJvbnRwYWdlID0gKCRmcm9udHBhZ2UpID8gZmls dGVyRnJvbnRQYWdlKCkgOiAnJzsKCSRjYXRlZ29yeSAgPSAoISRjYXRlZ29yeSkgID8gJycg OiAiIGFuZCAoKENhdGVnb3J5MT0nIi5kb3NsYXNoKCRjYXRlZ29yeSkuIicpIG9yIChDYXRl Z29yeTI9JyIuZG9TbGFzaCgkY2F0ZWdvcnkpLiInKSkgIjsKCSRzZWN0aW9uICAgPSAoISRz ZWN0aW9uKSAgID8gJycgOiAiIGFuZCBTZWN0aW9uID0gJyIuZG9zbGFzaCgkc2VjdGlvbiku IiciOwoJJGV4Y2VycHRlZCA9ICgkZXhjZXJwdGVkPT0neScpICA/ICIgYW5kIEV4Y2VycHQg IT0nJyIgOiAnJzsKCSRhdXRob3IgICAgPSAoISRhdXRob3IpICAgID8gJycgOiAiIGFuZCBB dXRob3JJRCA9ICciLmRvc2xhc2goJGF1dGhvcikuIiciOwoJJG1vbnRoICAgICA9ICghJG1v bnRoKSAgICAgPyAnJyA6ICIgYW5kIFBvc3RlZCBsaWtlICciLmRvU2xhc2goJG1vbnRoKS4i JSciOwoJJGlkICAgICAgICA9ICghJGlkKSAgICAgICAgPyAnJyA6ICIgYW5kIElEID0gJyIu aW50dmFsKCRpZCkuIiciOwoJc3dpdGNoICgkdGltZSkgewoJCWNhc2UgJ2FueSc6CgkJCSR0 aW1lID0gIiI7IGJyZWFrOwoJCWNhc2UgJ2Z1dHVyZSc6CgkJCSR0aW1lID0gIiBhbmQgUG9z dGVkID4gbm93KCkiOyBicmVhazsKCQlkZWZhdWx0OgoJCQkkdGltZSA9ICIgYW5kIFBvc3Rl ZCA8IG5vdygpIjsKCX0KCWlmICghaXNfbnVtZXJpYygkc3RhdHVzKSkKCQkkc3RhdHVzID0g Z2V0U3RhdHVzTnVtKCRzdGF0dXMpOwoKCSRjdXN0b20gPSAnJzsKCS8vIHRyeWluZyBjdXN0 b20gZmllbGRzIGhlcmUKCSRjdXN0b21GaWVsZHMgPSBnZXRDdXN0b21GaWVsZHMoKTsKCWlm ICgkY3VzdG9tRmllbGRzKSB7CgkJZm9yZWFjaCgkY3VzdG9tRmllbGRzIGFzICRjRmllbGQp IHsKCQkJaWYgKGlzc2V0KCRhdHRzWyRjRmllbGRdKSkKCQkJCSRjdXN0b21QYWlyc1skY0Zp ZWxkXSA9ICRhdHRzWyRjRmllbGRdOwoJCX0KCQlpZighZW1wdHkoJGN1c3RvbVBhaXJzKSkK CQkJJGN1c3RvbSA9ICBidWlsZEN1c3RvbVNxbCgkY3VzdG9tRmllbGRzLCRjdXN0b21QYWly cyk7CgkJZWxzZQoJCQkkY3VzdG9tID0gJyc7Cgl9CgoJLy9BbGxvdyBrZXl3b3JkcyBmb3Ig bm8tY3VzdG9tIGFydGljbGVzLiBUaGF0IHRhZ2dpbmcgbW9kZSwgeW91IGtub3cKCWlmICgk a2V5d29yZHMpIHsKCQkka2V5cyA9IGRvU2xhc2goYXJyYXlfbWFwKCd0cmltJywgc3BsaXQo JywnLCAka2V5d29yZHMpKSk7CgkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewoJCQkka2V5 cGFydHNbXSA9ICJGSU5EX0lOX1NFVCgnIi4ka2V5LiInLEtleXdvcmRzKSI7CgkJfQoJCSRr ZXl3b3JkcyA9ICIgYW5kICgiIC4gam9pbignIG9yICcsJGtleXBhcnRzKSAuICIpIjsKCX0K CglpZiAoJGlkKQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzID49ICc0JyI7CgllbHNlCgkJ JHN0YXR1c3EgPSAiIGFuZCBTdGF0dXM9JyIuZG9TbGFzaCgkc3RhdHVzKS4iJyI7CgoJJHdo ZXJlID0gIjEiIC4gJHN0YXR1c3EuICR0aW1lLgoJCSRpZCAuICRjYXRlZ29yeSAuICRzZWN0 aW9uIC4gJGV4Y2VycHRlZCAuICRtb250aCAuICRhdXRob3IgLiAka2V5d29yZHMgLiAkY3Vz dG9tIC4gJGZyb250cGFnZTsKCgkJJHBnb2Zmc2V0ID0gJG9mZnNldCAuICcsICc7CgoJJHJz ID0gc2FmZV9yb3dzX3N0YXJ0KCIqLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHVQb3N0 ZWQiLCAndGV4dHBhdHRlcm4nLAoJCSR3aGVyZS4gJyBvcmRlciBieSAnIC4gZG9zbGFzaCgk c29ydGJ5KSAuICcgJyAuIGRvU2xhc2goJHNvcnRkaXIpIC4gJyBsaW1pdCAnIC4gZG9TbGFz aCgkbGltaXQpKTsKCglyZXR1cm4gJHJzOwp9CgoKIjtzOjg6ImhlbHBfcmF3IjtzOjU5Mzoi VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0IHRoZSAiaW50cm9kdWN0 b3J5IGFydGljbGUiOmh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Jsb2cvNDkzL3RydXRhZ3Mt YS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4sICJyZWxlYXNlcyBwYWdlIjpodHRw Oi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTM3L3RydV90YWdzLXJlbGVhc2VzLCAi ZmVhdHVyZSBsaXN0IjpodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3Ry dXRhZ3MtZmVhdHVyZS1saXN0LCAicm9hZG1hcCI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20v cmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwLCBhbmQgInVzYWdlIGluc3RydWN0aW9u cyI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdl LWluc3RydWN0aW9ucy4KCkkndmUgdGFrZW4gdGhlIGRldGFpbGVkIGhlbHAgb3V0IG9mIHRo ZSBwbHVnaW47IG15IGFwb2xvZ2llcy4gIEl0IHdhcyB0b28gYmlnIGFuZCB0b28gZGlmZmlj dWx0IHRvIGtlZXAgbWFpbnRhaW5pbmcgb24gbXkgc2l0ZSBhbmQgaW4gdGhlIHBsdWdpbi4i O3M6MzoibWQ1IjtzOjMyOiI0MDdjYTA2YTJmYjg0NWVkZGJhYWUzNGFhM2YyOGRhNyI7fQ==