# tru_tags v3.8 # 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 OCI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjQ6Imh0dHA6Ly93d3cucmFpbnNraXQuY29tLyI7czoxMToiZGVzY3JpcHRpb24iO3M6 MTU6IkFydGljbGUgdGFnZ2luZyI7czo0OiJ0eXBlIjtpOjE7czo0OiJuYW1lIjtzOjg6InRy dV90YWdzIjtzOjQ6ImhlbHAiO3M6MTAxNjoiCTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1 X3RhZ3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20v YmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiI+aW50 cm9kdWN0b3J5IGFydGljbGU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNv bS9yZWZlcmVuY2UvNTM3L3RydV90YWdzLXJlbGVhc2VzIj5yZWxlYXNlcyBwYWdlPC9hPiwg PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdz LWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0PC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5y YWluc2tpdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwIj5yb2FkbWFwPC9h PiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTcv dHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiPnVzYWdlIGluc3RydWN0aW9uczwvYT4uPC9w PgoKCTxwPllvdSBjYW4gYWxzbyBmaW5kIHRoZSBzb3VyY2UgY29kZSBhdCA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vdHJ1aXN0L3RydS10YWdzIj5naXRodWIuY29tL3RydWlzdC90 cnUtdGFnczwvYT4uPC9wPgoKCTxwPkkmIzgyMTc7dmUgdGFrZW4gdGhlIGRldGFpbGVkIGhl bHAgb3V0IG9mIHRoZSBwbHVnaW47IG15IGFwb2xvZ2llcy4gIEl0IHdhcyB0b28gYmlnIGFu ZCB0b28gZGlmZmljdWx0IHRvIGtlZXAgbWFpbnRhaW5pbmcgb24gbXkgc2l0ZSBhbmQgaW4g dGhlIHBsdWdpbi4gIElmLCBteSBzaXRlIGlzIGV2ZXIgZG93biwgaG93ZXZlciwgdGhlIHNv dXJjZSA8c3BhbiBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj4gb2YgdGhlIHVzYWdlIGluc3Ry dWN0aW9ucyBpcyBhdmFpbGFibGUgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL3RydWlzdC90cnUtdGFncy9ibG9iL21hc3Rlci90cnVfdGFncy1kb2NzLmh0bWwiPmdp dGh1YiByZXBvPC9hPjwvcD4iO3M6NDoiY29kZSI7czo0NTA1NjoiCiMgQ29weXJpZ2h0IDIw MTcgTmF0aGFuIEFydGh1cgojIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vu c2UsIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNl LnBocCBmb3IgZGV0YWlscwojCiMgVGhpcyB3b3JrIHdhcyBvcmlnaW5hbGx5IGluc3BpcmVk IGJ5IHJhbl90YWdzIGJ5IFJhbiBBcm91c3NpLCBvcmlnaW5hbGx5IGZvdW5kIGF0IGh0dHA6 Ly9hcm91c3NpLmNvbS9hcnRpY2xlLzQ1L3RhZ2dpbmctdGV4dHBhdHRlcm4KIyBKYXZhc2Ny aXB0IGJ1ZyBmaXhlcyB3ZXJlIHByb3ZpZGVkIGJ5IHRoZV9naG9zdCAtIGh0dHA6Ly92aWN0 b3J1cy5uZXQKIyBKYXZhc2NyaXB0IGNvZGUgZm9yIHRoZSB0YWcgYXV0by1jb21wbGV0ZSBm ZWF0dXJlIHdhcyBwcm92aWRlZCBieSBKaW0gQmlhbmNvbG8gLSBodHRwOi8vd3d3LmJpYW5j b2xvLmNvbS8KIyBGaXhlcyBmb3IgVGV4dHBhdHRlcm4gNC42IHByb3ZpZGVkIGJ5OgojICAg LSBSaW1hcyBLdWRlbGlzOyBodHRwczovL2dpdGh1Yi5jb20vcmltYXMta3VkZWxpcwojICAg LSBqb29scy1yOyBodHRwczovL2dpdGh1Yi5jb20vam9vbHMtcgojICAgLSBTaW1vbiBGaW5j aDsgaHR0cHM6Ly9naXRodWIuY29tL3NwaWZmaW4KCgojIyMgQ09ORklHVVJBVElPTiAjIyMK IyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFRVUk4gQkFDSyEgIENvbmZpZ3VyYXRpb24gaXMg bm8gbG9uZ2VyIGhhbmRsZWQgYnkgZWRpdGluZyB0aGUgcGx1Z2luLgojIENoZWNrIG91dCB0 aGUgJ0V4dGVuc2lvbnMnIHRhYiBpbiB0aGUgVGV4dHBhdHRlcm4gYWRtaW4gOikKCgojIENo YW5naW5nIHRoZXNlIHdvbid0IGRvIGFueSBnb29kLiAgVGhleSdyZSBqdXN0IGhlcmUgYXMg YSBjb252ZW5pZW5jZSBmb3IgZGV2ZWxvcG1lbnQuCmRlZmluZSgnVFJVX1RBR1NfRklFTEQn LCAnS2V5d29yZHMnKTsKZGVmaW5lKCdFTkNPRElORycsICd1dGYtOCcpOwoKZGVmaW5lKCdD TEVBTl9VUkxTJywgJ2NsZWFuX3VybHMnKTsKZGVmaW5lKCdUQUdfU0VDVElPTicsICd0YWdf c2VjdGlvbicpOwpkZWZpbmUoJ1BBUk1fTkFNRScsICdwYXJtJyk7CmRlZmluZSgnVEFHU19J Tl9GRUVEX0NBVEVHT1JJRVMnLCAndGFnc19pbl9mZWVkX2NhdGVnb3JpZXMnKTsKZGVmaW5l KCdUQUdTX0lOX0ZFRURfQk9EWScsICd0YWdzX2luX2ZlZWRfYm9keScpOwpkZWZpbmUoJ1RB R1NfSU5fV1JJVEVfVEFCJywgJ3RhZ3NfaW5fd3JpdGVfdGFiJyk7CmRlZmluZSgnQVVUT0NP TVBMRVRFX0lOX1dSSVRFX1RBQicsICdhdXRvY29tcGxldGVfaW5fd3JpdGVfdGFiJyk7CmRl ZmluZSgnVVRGXzhfQ0FTRScsICd1dGZfOF9jYXNlJyk7CgpnbG9iYWwgJHRydV90YWdzX3By ZWZzOwokdHJ1X3RhZ3NfcHJlZnMgPSB0cnVfdGFnc19sb2FkX3ByZWZzKCk7CgoKIyMjIFRB RyBSRUdJU1RSQVRJT04gIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKVHhwOjpnZXQo J1xUZXh0cGF0dGVyblxUYWdcUmVnaXN0cnknKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfaGFu ZGxlcicpCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19pZl9oYXNfdGFncycpCgktPnJlZ2lzdGVy KCd0cnVfdGFnc19mcm9tX2FydGljbGUnKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfY2xvdWQn KQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfbGlzdCcpCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19p Zl90YWdfc2VhcmNoJykKCS0+cmVnaXN0ZXIoJ3RydV90YWdzX3RhZ19wYXJhbWV0ZXInKQoJ LT5yZWdpc3RlcigndHJ1X3RhZ3Nfc2VhcmNoX3Jlc3VsdF9leGNlcnB0JykKCS0+cmVnaXN0 ZXIoJ3RydV90YWdzX3NlYXJjaF9wYXJhbWV0ZXInKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3Nf cmVsYXRlZF90YWdzX2Zyb21fc2VhcmNoJykKCS0+cmVnaXN0ZXIoJ3RydV90YWdzX2FyY2hp dmUnKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZycpOwoKIyMj IFBSSU1BUlkgVEFHIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKCmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCSR0YWdfcGFyYW1ldGVy ID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CglpZiAoIWVtcHR5 KCR0YWdfcGFyYW1ldGVyKSkgewoJCWlmICh0cnVfdGFnc19yZWRpcmVjdF9pZl9uZWVkZWQo JHRhZ19wYXJhbWV0ZXIpKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJJGNsZWFuX2F0dHMgPSB0 cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7CgkJJHJl c3VsdCA9IGRvQXJ0aWNsZXMoJGNsZWFuX2F0dHMsIHRydWUpOwkJI2Z1bmN0aW9uIGluIFRY UCBjb2RlCgkJaWYgKHRyaW0oJHJlc3VsdCkgPT0gJycpIHsKCQkJaWYgKGlzc2V0KCRhdHRz Wydub2FydGljbGVzJ10pKSB7CgkJCQl0cnVfdGFnc19yZWRpcmVjdCgkYXR0c1snbm9hcnRp Y2xlcyddLCB0cnVlKTsKCQkJfSBlbHNlIGlmIChpc3NldCgkYXR0c1snNDA0cmVkaXJlY3Qn XSkgJiYgISRhdHRzWyc0MDRyZWRpcmVjdCddKSB7CgkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJ fSBlbHNlIHsKCQkJCXR4cF9kaWUoZ1R4dCgnNDA0X25vdF9mb3VuZCcpLCAnNDA0Jyk7CgkJ CX0KCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJlc3VsdDsKCQl9Cgl9IGVsc2UgewoJCXJldHVy biB0cnVfdGFnc19jbG91ZCgkYXR0cyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hcmNo aXZlKCRhdHRzKSB7CglnbG9iYWwgJHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWc7Cgkk dGFncyA9IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSh0cnVfdGFnc19nZXRf c3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNlKSkpOwoJbmF0Y2FzZXNv cnQoJHRhZ3MpOwoJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykgewoJCSR0cnVfdGFnc19jdXJy ZW50X2FyY2hpdmVfdGFnID0gJHRhZzsKCQkkY2xlYW5fYXR0cyA9IHRydV90YWdzX2ZpeHVw X3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWcpOwoJCSRyZXN1bHRzW10gPSBkb0FydGljbGVzKCRj bGVhbl9hdHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBpbiBUWFAgY29kZQoJfQoJcmV0dXJuIGpv aW4oJyAnLCAkcmVzdWx0cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jdXJyZW50X2FyY2hp dmVfdGFnKCRhdHRzKSB7CglnbG9iYWwgJHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWc7 CglleHRyYWN0KGxBdHRzKGFycmF5KCdsaW5rJyA9PiAnMCcpLCAgJGF0dHMsIDApKTsKCWlm ICgkbGluaykgewoJCXJldHVybiAnPGEgaHJlZj0iJyAuIHRydV90YWdzX2xpbmtpZnlfdGFn KCR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKSAuICciPicgLiAkdHJ1X3RhZ3NfY3Vy cmVudF9hcmNoaXZlX3RhZyAuICc8L2E+JzsKCX0gZWxzZSB7CgkJcmV0dXJuICR0cnVfdGFn c19jdXJyZW50X2FyY2hpdmVfdGFnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xvdWQo JGF0dHMpIHsKCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90YWdzX2dldF9zdGFuZGFyZF9j bG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdz X2xpc3QoJGF0dHMpIHsKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0 dHMoJGF0dHMsIHRydWUsIGZhbHNlKTsKCSRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3VkX3F1 ZXJ5KCRhdHRzKTsKCglyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxs X3RhZ3MsICRhbGxfdGFncyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGljbGUo JGF0dHMpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7 CgoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJHRoaXNpZCk7 CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFs c2UsIHRydWUpOwoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7CglpZiAoJGF0 dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1 X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJfQoKCXJldHVybiB0cnVfdGFnc19yZW5kZXJf Y2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwp9CgoKZnVu Y3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMsICR0aGluZykgewoJZ2xvYmFsICR0 aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9IFRS VV9UQUdTX0ZJRUxEOwoKCSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRl cm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJcmV0dXJuIHBh cnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl90 YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpIHsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3RhZycg PT4gJycpLCAgJGF0dHMsIDApKTsKCgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19w YXJhbWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gMSksIGZhbHNlKTsKCSRjb25kaXRp b24gPSAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgPyB0cnVlIDogZmFsc2U7CglpZiAoJGNv bmRpdGlvbiAmJiAhZW1wdHkoJHRhZykpIHsKCQkkY29uZGl0aW9uID0gKCR0YWdfcGFyYW1l dGVyID09ICR0YWcpOwoJfQoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJGNvbmRp dGlvbikpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcigkYXR0cywgJHNh ZmVodG1sID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWV4dHJhY3QobEF0 dHMoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gJzAnLCAndXJsZW5jb2RlJyA9PiAwKSwgICRh dHRzLCAwKSk7CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3RyaXBfdGFncyhncHMoJHRydV90YWdz X3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlKSkpOwoJaWYgKCdsb29rdXAnID09ICRzdHJpcGh5 cGhlbnMpIHsKCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFy cmF5KCksIGZhbHNlLCBmYWxzZSk7CgkJJHRhZ19saXN0ID0gYXJyYXlfdW5pcXVlKHRydV90 YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7CgkJZm9yZWFjaCAoJHRhZ19saXN0IGFzICRjbG91 ZF90YWcpIHsKCQkJaWYgKCRwYXJtID09IHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkY2xvdWRf dGFnKSkgewoJCQkJJHBhcm0gPSAkY2xvdWRfdGFnOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9 IGVsc2UgaWYgKCRzdHJpcGh5cGhlbnMpIHsKCQkkcGFybSA9IHN0cl9yZXBsYWNlKCctJywg JyAnLCAkcGFybSk7Cgl9CglpZiAoJHVybGVuY29kZSkgewoJCSRwYXJtID0gdXJsZW5jb2Rl KCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkgewoJCSRwYXJtID0gaHRtbHNwZWNp YWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJuICRwYXJtOwp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3Nfc2VhcmNoX3Jlc3VsdF9leGNlcnB0KCRhdHRzKSB7CglnbG9iYWwgJHByZXRleHQ7CgoJ JHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNl KTsKCWlmICh0cmltKCR0YWdfcGFyYW1ldGVyKSAhPSAnJykgewoJCSRxID0gJHByZXRleHRb J3EnXTsKCQkkcHJldGV4dFsncSddID0gJHRhZ19wYXJhbWV0ZXI7CgkJJHJlc3VsdCA9IHNl YXJjaF9yZXN1bHRfZXhjZXJwdCgkYXR0cyk7CgkJJHByZXRleHRbJ3EnXSA9ICRxOwoJfSBl bHNlIHsKCQkkcmVzdWx0ID0gc2VhcmNoX3Jlc3VsdF9leGNlcnB0KCRhdHRzKTsKCX0KCXJl dHVybiAkcmVzdWx0Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigp IHsKCXRyaWdnZXJfZXJyb3IoZ1R4dCgnZGVwcmVjYXRlZF90YWcnKSwgRV9VU0VSX05PVElD RSk7CglyZXR1cm4gc3RyaXBfdGFncyhncHMoJ3EnKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19yZWxhdGVkX3RhZ3NfZnJvbV9zZWFyY2goJGF0dHMpIHsKCSR0YWdfcGFyYW1ldGVyID0g dHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CglleHRyYWN0KGxBdHRz KGFycmF5KCd0YWdfcGFyYW1ldGVyJyA9PiAkdGFnX3BhcmFtZXRlciksICAkYXR0cywgMCkp OwoJaWYgKCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpIHsKICAgICAgICAkdGFnc19maWVsZCA9 IFRSVV9UQUdTX0ZJRUxEOwoJCSRhbGxfdGFncyA9IGFycmF5KCk7CgoJCSRxdWVyeV9hdHRz ID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIpOwoJ CSRycyA9IHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJHF1ZXJ5X2F0dHMpOwoJCWlm ICgkcnMpIHsKCQkJd2hpbGUgKCRhID0gbmV4dFJvdygkcnMpKSB7CgkJCQkkYXJ0aWNsZV90 YWdzID0gYXJyYXkoKTsKCQkJCWlmIChpc3NldCgkYVskdGFnc19maWVsZF0pKSB7CgkJCQkJ JGFydGljbGVfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0cnRvbG93ZXIo JGFbJHRhZ3NfZmllbGRdKSkpOwoJCQkJfQoJCQkJIyBmYXN0ZXIgaW1wbGVtZW50YXRpb24g b2YgYXJyYXlfbWVyZ2UoKSwgdGhhbmtzIHRvIHdob2NhcmV6CgkJCQkjIChodHRwOi8vZm9y dW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTIzODM3MyNwMjM4MzczKQoJ CQkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJGFydGljbGVfdGFncykgYXMgJGkpIHsk YWxsX3RhZ3NbXSA9ICRpO30KCQkJfQoJCX0KCgkJJGFsdF90YWdfcGFyYW1ldGVyID0gc3Ry X3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKTsKCQlmb3JlYWNoICgkYWxsX3Rh Z3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlmICgkdGFnID09ICR0YWdfcGFyYW1ldGVyIHx8 ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7CgkJCQl1bnNldCgkYWxsX3RhZ3NbJGtl eV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9j bG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpOwoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0 ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRfYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7 CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGNsb3Vk X2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkY2xvdWRfYXR0 cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7Cgl9IGVsc2UgewoJCXJldHVy biAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJk X2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3QsICRpc0FydGljbGUsICRzaG93QWxsPWZhbHNl KSB7CglyZXR1cm4gbEF0dHMoYXJyYXkoJ3dyYXB0YWcnCT0+ICgkaXNMaXN0ID8gJ3VsJyA6 ICcnKSwKCQkJJ2JyZWFrJwkJPT4gKCRpc0xpc3QgPyAnbGknIDogJywgJyksCgkJCSdjbGFz cycJCT0+ICcnLAoJCQknYnJlYWtjbGFzcycJPT4gJycsCgkJCSdzZWN0aW9uJwk9PiAnJywK CQkJJ21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQknbWF4cGVyY2VudCcJPT4gKCRpc0xpc3Qg fHwgJGlzQXJ0aWNsZSA/ICcxMDAnIDogJzIwMCcpLAoJCQknc2hvd2NvdW50cycJPT4gJycs CgkJCSdjb3VudHdyYXBjaGFycycJPT4gJ1tdJywKCQkJJ3VzZXJlbHRhZycJPT4gKCRpc0Fy dGljbGUgPyAnMScgOiAnJyksCgkJCSdnZW5lcmF0ZWxpbmtzJwk9PiAnMScsCgkJCSdtaW50 YWdjb3VudCcJPT4gJzAnLAoJCQknbWF4dGFnY291bnQnCT0+ICcxMDAwJywKCQkJJ3NldHNp emVzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksCgkJCSd1c2Vub2ZvbGxvdycJPT4g JycsCgkJCSdzb3J0JwkJPT4gJ2FscGhhJywKCQkJJ3VzZW92ZXJhbGxjb3VudHMnCT0+ICcn LAoJCQknc2V0Y2xhc3NlcycJPT4gKCRpc0FydGljbGUgPyAnMCcgOiAnMScpLAoJCQkndGl0 bGUnCQk9PiAnJywKCQkJJ2xpc3RsaW1pdCcJPT4gJycsCgkJCSdrZWVwJwkJPT4gJ2xhcmdl c3QnLAoJCQknY3V0b2ZmJwk9PiAnY2h1bmsnLAoJCQkndGV4dHRyYW5zZm9ybScJPT4gJ25v bmUnLAoJCQknbGlua3BhdGgnCT0+ICcnLAoJCQknbGlua3BhdGh0YWlsJwk9PiAnJywKCQkJ J2ZpbHRlcnNlYXJjaCcJPT4gKCRzaG93QWxsID8gMCA6ICcxJyksCgkJCSdleGNsdWRlc2Vj dGlvbic9PiAnJywKCQkJJ2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJywKCQkJJ3RpbWUn CQk9PiAoJHNob3dBbGwgPyAnYW55JyA6ICdwYXN0JykKCQkpLCRhdHRzLCAwKTsKfQoKCmZ1 bmN0aW9uIHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSB7CglleHRyYWN0KCRhdHRzKTsK Cgkkc2VjdGlvbl9jbGF1c2UgPSAnJzsKCWlmICgkc2VjdGlvbiA8PiAnJykgewoJCSRrZXlz ID0gZXhwbG9kZSgnLCcsICRzZWN0aW9uKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7 CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIiciOwoJ CX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5cGFy dHMpIC4gIikiOwoJfQoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CglpbmNsdWRl X29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsKCgkkZmlsdGVyID0gdHJ1X3Rh Z3NfZmlsdGVyX3NlY3Rpb25zKCRleGNsdWRlc2VjdGlvbik7CgkkZmlsdGVyIC49ICgkZmls dGVyc2VhcmNoID8gZmlsdGVyU2VhcmNoKCkgOiAnJyk7CgoJc3dpdGNoICgkdGltZSkgewoJ CWNhc2UgJ2FueSc6CgkJCSR0aW1lID0gIiI7IGJyZWFrOwoJCWNhc2UgJ2Z1dHVyZSc6CgkJ CSR0aW1lID0gIiBhbmQgUG9zdGVkID4gbm93KCkiOyBicmVhazsKCQlkZWZhdWx0OgoJCQkk dGltZSA9ICIgYW5kIFBvc3RlZCA8PSBub3coKSI7Cgl9CglnbG9iYWwgJHByZWZzOwoJZXh0 cmFjdCgkcHJlZnMpOwoJaWYgKCEkcHVibGlzaF9leHBpcmVkX2FydGljbGVzKSB7CgkJJHRp bWUgLj0gIiBhbmQgKG5vdygpIDw9IEV4cGlyZXMgb3IgRXhwaXJlcyBJUyBOVUxMKSI7Cgl9 CgoJJGFsbF90YWdzID0gYXJyYXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQi LCAidGV4dHBhdHRlcm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNl IC4gJGZpbHRlciAuICIgYW5kIFN0YXR1cyA+PSAnNCciIC4gJHRpbWUpOwoJZm9yZWFjaCAo JHJzIGFzICRyb3cpIHsKCQkkdGVtcF9hcnJheSA9IGFycmF5KCk7CgkJaWYgKGlzc2V0KCRy b3dbJHRhZ3NfZmllbGRdKSkgewoJCQkkdGVtcF9hcnJheSA9IGV4cGxvZGUoIiwiLCB0cmlt KHRydV90YWdzX3N0cnRvbG93ZXIoJHJvd1skdGFnc19maWVsZF0pKSk7CgkJfQoJCSMgZmFz dGVyIGltcGxlbWVudGF0aW9uIG9mIGFycmF5X21lcmdlKCksIHRoYW5rcyB0byB3aG9jYXJl egoJCSMgKGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9 MjM4MzczI3AyMzgzNzMpCgkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJHRlbXBfYXJy YXkpIGFzICRpKSB7JGFsbF90YWdzW10gPSAkaTt9Cgl9CgoJcmV0dXJuICRhbGxfdGFnczsK fQoKCmZ1bmN0aW9uIHRydV90YWdzX2ZpbHRlcl9zZWN0aW9ucygkZXhjbHVkZXNlY3Rpb24p IHsKCSRzZWN0aW9ucyA9IGV4cGxvZGUoJywnLCAkZXhjbHVkZXNlY3Rpb24pOwoJJGZpbHRl cnMgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHNlY3Rpb25zIGFzICRzZWN0aW9uKSB7CgkJJGZp bHRlcnNbXSA9ICJhbmQgU2VjdGlvbiAhPSAnIi5kb1NsYXNoKCRzZWN0aW9uKS4iJyI7Cgl9 CglyZXR1cm4gam9pbignICcsICRmaWx0ZXJzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3Jl bmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCkgewoJ Z2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWV4dHJhY3QoJGF0dHMpOwoKCSR0YWdzX3dlaWdo dCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3RhZ3NfZm9yX3dlaWdodCk7CgoJZm9yZWFj aCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCWlmICghaW5fYXJyYXko JHRhZywgJGFsbF90YWdzKQoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA8ICRtaW50YWdj b3VudAoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA+ICRtYXh0YWdjb3VudCkgewoJCQl1 bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOwoJCX0KCX0KCgkkc29ydF9ieV9jb3VudCA9IChz dHJwb3MoJHNvcnQsICdjb3VudCcpICE9PSBmYWxzZSk7Cgkkc29ydF9hc2NlbmRpbmcgPSAo c3RycG9zKCRzb3J0LCAnYXNjJykgIT09IGZhbHNlKTsKCSR0YWdzX3dlaWdodCA9IHRydV90 YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2Nl bmRpbmcpOwoKCWlmICgkbGlzdGxpbWl0ID4gMCAmJiAkbGlzdGxpbWl0IDwgY291bnQoJHRh Z3Nfd2VpZ2h0KSkgewoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXkoKTsKCQlpZiAoJGtlZXAg PT0gJ2xhcmdlc3QnKSB7CgkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFn c19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCB0cnVlLCBmYWxzZSkpOwoJCX0gZWxzZSB7CgkJ CWlmICgka2VlcCA9PSAncmFuZG9tJykgewoJCQkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFz ICR0YWcgPT4gJHdlaWdodCkgewoJCQkJCSRyZXNvcnRlZF90YWdzWyR0YWddID0gcmFuZCgw LCAkd2VpZ2h0KTsKCQkJCX0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVf dGFnc19zb3J0X3RhZ3MoJHJlc29ydGVkX3RhZ3MsIHRydWUsIGZhbHNlKSk7CgkJCX0gZWxz ZSBpZiAoJGtlZXAgPT0gJ2FscGhhJykgewoJCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9r ZXlzKCR0YWdzX3dlaWdodCk7CgkJCQluYXRjYXNlc29ydCgkcmVzb3J0ZWRfdGFncyk7CgkJ CX0KCQkJJGN1dG9mZiA9ICdleGFjdCc7CgkJfQoKCQkkbGFzdF9nb29kX2luZGV4ID0gJGxp c3RsaW1pdCAtIDE7CgkJaWYgKCRjdXRvZmYgPT0gJ2NodW5rJykgeyAvL2FsdGVybmF0aXZl IGlzICdleGFjdCcKCQkJJGxhc3Rfd2VpZ2h0ID0gLTE7CgkJCWZvciAoJGkgPSAwOyAkaSA8 ICRsaXN0bGltaXQgKyAxOyAkaSsrKSB7CgkJCQkkbmV3X3dlaWdodCA9ICR0YWdzX3dlaWdo dFskcmVzb3J0ZWRfdGFnc1skaV1dOwoJCQkJaWYgKCRuZXdfd2VpZ2h0ICE9ICRsYXN0X3dl aWdodCkgewoJCQkJCSRsYXN0X2dvb2RfaW5kZXggPSAkaSAtIDE7CgkJCQkJJGxhc3Rfd2Vp Z2h0ID0gJG5ld193ZWlnaHQ7CgkJCQl9CgkJCX0KCQkJaWYgKCRsYXN0X2dvb2RfaW5kZXgg PCAwKSB7CgkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAtIDE7CgkJCX0KCQl9 CgoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfY2h1bmsoJHJlc29ydGVkX3RhZ3MsICRsYXN0 X2dvb2RfaW5kZXggKyAxKTsKCQkkcmVzb3J0ZWRfdGFncyA9ICRyZXNvcnRlZF90YWdzWzBd OwoKCQlmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJCWlm ICghaW5fYXJyYXkoJHRhZywgJHJlc29ydGVkX3RhZ3MpKSB7CgkJCQl1bnNldCgkdGFnc193 ZWlnaHRbJHRhZ10pOwoJCQl9CgkJfQoJfQoKCWlmICgkZ2VuZXJhdGVsaW5rcykgewoJCWlm ICgkbGlua3BhdGgpIHsKCQkJJHVybHByZWZpeCA9ICRsaW5rcGF0aDsKCQkJJHVybHN1ZmZp eCA9ICRsaW5rcGF0aHRhaWw7CgkJfSBlbHNlIHsKCQkJaWYgKHRydV90YWdzX2NsZWFuX3Vy bHMoKSkgewoJCQkJJHVybHByZWZpeCA9IGh1IC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNU SU9OXS0+dmFsdWUgLiAnLyc7CgkJCX0gZWxzZSB7CgkJCQkkdXJscHJlZml4ID0gaHUgLiAn P3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJyZhbXA7JyAu ICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSAuICc9JzsKCQkJfQoJCQkkdXJs c3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3VybHMoKSA/ICcvJyA6ICcnKTsKCQl9CgoJCWlm ICgkdXNlcmVsdGFnKSB7CgkJCWlmICgkdXNlbm9mb2xsb3cpIHsKCQkJCSR1cmxzdWZmaXgg Lj0gJyIgcmVsPSJ0YWcgbm9mb2xsb3cnOwoJCQl9IGVsc2UgewoJCQkJJHVybHN1ZmZpeCAu PSAnIiByZWw9InRhZyc7CgkJCX0KCQl9IGVsc2UgaWYgKCR1c2Vub2ZvbGxvdykgewoJCQkk dXJsc3VmZml4IC49ICciIHJlbD0ibm9mb2xsb3cnOwoJCX0KCX0KCglpZiAoY291bnQoJHRh Z3Nfd2VpZ2h0KSA+IDApIHsKCQkkbWF4ID0gbWF4KCR0YWdzX3dlaWdodCk7CgkJJG1pbiA9 IG1pbigkdGFnc193ZWlnaHQpOwoJfSBlbHNlIHsKCQkkbWF4ID0gJG1pbiA9IDA7Cgl9Cgkk c3RlcHZhbHVlID0gKCRtYXggPT0gJG1pbikgPyAwIDogKCRtYXhwZXJjZW50IC0gJG1pbnBl cmNlbnQpIC8gKCRtYXggLSAkbWluKTsKCgkkdGFnc19odG1sID0gYXJyYXkoKTsKCSR0YWdf c2VhcmNoX3RhZyA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVu cycgPT4gJ2xvb2t1cCcpKTsKCSR0YWdfc2VhcmNoX3RhZyA9IGZ1bmN0aW9uX2V4aXN0cygi aHRtbHNwZWNpYWxjaGFyc19kZWNvZGUiKSA/IGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCR0 YWdfc2VhcmNoX3RhZykgOiBodG1sX2VudGl0eV9kZWNvZGUoJHRhZ19zZWFyY2hfdGFnKTsK CWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQkkdGFnX3dl aWdodCA9IGZsb29yKCRtaW5wZXJjZW50ICsgKCR3ZWlnaHQgLSAkbWluKSAqICRzdGVwdmFs dWUpOwoKCQkkc3R5bGUgPSAnJzsKCQlpZiAoJHNldHNpemVzKQoJCQkkc3R5bGUgPSAnIHN0 eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOwoKCQkkdGFnX2NsYXNz ID0gJyc7CgkJaWYgKCRzZXRjbGFzc2VzKSB7CgkJCSR0YWdfY2xhc3MgPSAnIGNsYXNzPSIn OwoJCQlpZiAoJHdlaWdodCA9PSAkbWluKSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXpl U21hbGxlc3QiOwoJCQl9IGVsc2UgaWYgKCR3ZWlnaHQgPT0gJG1heCkgewoJCQkJJHRhZ19j bGFzcyAuPSAidGFnU2l6ZUxhcmdlc3QiOwoJCQl9IGVsc2UgewoJCQkJJHRhZ19jbGFzcyAu PSAidGFnU2l6ZU1lZGl1bSI7CgkJCX0KCQkJJHRhZ19jbGFzcyAuPSAnIHRhZ1NpemUnIC4g KCR3ZWlnaHQgKyAxIC0gJG1pbik7CgkJCWlmICgkdGFnID09ICR0YWdfc2VhcmNoX3RhZykg ewoJCQkJJHRhZ19jbGFzcyAuPSAnICcgLiAkYWN0aXZlY2xhc3M7CgkJCX0KCQkJJHRhZ19j bGFzcyAuPSAnIic7CgkJfQoKCQkvL2FkYXB0ZWQgZnJvbSBjb2RlIGJ5IGdkdHJvaWFubywg c2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MTAy ODc1I3AxMDI4NzUKCQkkdGl0bGVjb3VudCA9ICcnOwoJCWlmICgkdGl0bGUpCgkJCSR0aXRs ZWNvdW50ID0gJyB0aXRsZT0iJyAuICR0aXRsZSAuICciJzsKCQkkZGlzcGxheWNvdW50PSAn JzsKCQkkY291bnQgPSAkY291bnR3cmFwY2hhcnN7MH0gLiAkd2VpZ2h0IC4gJGNvdW50d3Jh cGNoYXJzezF9OwoJCWlmICgkc2hvd2NvdW50cyA9PSAndGl0bGUnIHx8ICRzaG93Y291bnRz ID09ICdib3RoJykKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxlPSInIC4gJHRpdGxlIC4gJGNv dW50IC4gJyInOwoJCWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0bGUn KQoJCQkkZGlzcGxheWNvdW50ID0gJyAnIC4gJGNvdW50OwoKCQlpZiAoJHRleHR0cmFuc2Zv cm0gPT0gJ2NhcGl0YWxpemUnKSB7CgkJCSR0YWcgPSB0cnVfdGFnc191Y3dvcmRzKCR0YWcp OwoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHsKCQkJJHRh ZyA9IHRydV90YWdzX3N0cnRvdXBwZXIoJHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5z Zm9ybSA9PSAnbG93ZXJjYXNlJykgewoJCQkkdGFnID0gdHJ1X3RhZ3Nfc3RydG9sb3dlcigk dGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBmaXJzdCcpIHsKCQkJ JHRhZyA9IHRydV90YWdzX3VjZmlyc3QoJHRhZyk7CgkJfQoKCQlpZiAoJGdlbmVyYXRlbGlu a3MpIHsKCQkJJHdob2xldXJsID0gJyInIC4gJHVybHByZWZpeCAuIHVybGVuY29kZSgkdGFn KSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPScgLiAk d2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAnPicgLiBo dG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsKCQl9IGVs c2UgaWYgKCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8ICR0aXRsZWNvdW50KSB7CgkJCSR0YWdz X2h0bWxbXSA9ICc8c3BhbicgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQg LiAnPicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvc3Bhbj4nIC4gJGRpc3BsYXlj b3VudDsKCQl9IGVsc2UgewoJCQkkdGFnc19odG1sW10gPSBodG1sc3BlY2lhbGNoYXJzKCR0 YWcpIC4gJGRpc3BsYXljb3VudDsKCQl9Cgl9CglyZXR1cm4gdHJ1X3RhZ3NfZG9fd3JhcCgk dGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsKfQoK CiMjIyBDTEVBTiBVUkwgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKCmlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCXJlZ2lzdGVyX2NhbGxiYWNrKCd0 cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jyk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CglnbG9iYWwgJHRy dV90YWdzX3ByZWZzOwoJJHN1YnBhdGggPSBwcmVnX3JlcGxhY2UoIi9odHRwcz86XC9cLy4q KFwvLiopL1VpIiwiJDEiLGh1KTsKCSRyZWdzYWZlc3VicGF0aCA9IHByZWdfcXVvdGUoJHN1 YnBhdGgsICcvJyk7CgkkcmVxID0gcHJlZ19yZXBsYWNlKCIvXiRyZWdzYWZlc3VicGF0aC9p IiwnLycsJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOwoKCSRxcyA9IHN0cnBvcygkcmVxLCAn PycpOwoJJHFhdHRzID0gKCRxcyA/ICcmJy5zdWJzdHIoJHJlcSwgJHFzICsgMSkgOiAnJyk7 CglpZiAoJHFzKSAkcmVxID0gc3Vic3RyKCRyZXEsIDAsICRxcyk7CgoJJHBhcnRzID0gYXJy YXlfdmFsdWVzKGFycmF5X2ZpbHRlcihleHBsb2RlKCcvJywgJHJlcSkpKTsKCWlmIChjb3Vu dCgkcGFydHMpID09IDIgJiYgJHBhcnRzWzBdID09ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD VElPTl0tPnZhbHVlKSB7CgkJJHRhZyA9ICRwYXJ0c1sxXTsKCQkkX1NFUlZFUlsnUVVFUllf U1RSSU5HJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPScgLiAk dGFnIC4gJHFhdHRzOwoJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddID0gJHN1YnBhdGggLiAk dHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvPycgLiAkX1NFUlZFUlsn UVVFUllfU1RSSU5HJ107CgkJaWYgKGNvdW50KCRfUE9TVCkgPiAwKSB7CgkJCSRfUE9TVFsn c2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWU7CgkJCSRf UE9TVFskdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWVdID0gJHRhZzsKCQl9IGVs c2UgewoJCQkkX0dFVFsnc2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9O XS0+dmFsdWU7CgkJCSRfR0VUWyR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZV0g PSAkdGFnOwoJCX0KCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2NsZWFuX3VybHMoKSB7Cgln bG9iYWwgJHRydV90YWdzX3ByZWZzOwoJcmV0dXJuICgnY2xlYW4nID09ICR0cnVfdGFnc19w cmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUpOwp9CgoKIyMjIEFETUlOIFNJREUgRlVOQ1RJT05T ICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoQHR4cGludGVyZmFjZSA9 PSAnYWRtaW4nKSB7CglhZGRfcHJpdnMoJ3RydV90YWdzJywgJzEsMicpOwoJcmVnaXN0ZXJf dGFiKCdleHRlbnNpb25zJywgJ3RydV90YWdzJywgJ3RydV90YWdzJyk7CglyZWdpc3Rlcl9j YWxsYmFjaygndHJ1X3RhZ3NfYWRtaW5fdGFiJywgJ3RydV90YWdzJyk7CgoJaWYgKCR0cnVf dGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlIHx8ICR0cnVfdGFnc19wcmVm c1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsKCQlyZWdpc3Rlcl9jYWxs YmFjaygndHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXInLCAnYXJ0aWNsZScpOwoJ fQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiKCRldmVudCwgJHN0ZXApIHsKCXJl cXVpcmVfcHJpdnMoJ3RydV90YWdzJyk7CgoJJHJlc3VsdHMgPSB0cnVfdGFnc19hZG1pbl90 YWJfaGFuZGxlX2lucHV0KCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv dWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpOwoJJGFsbF90YWdzID0gdHJ1 X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJJGNsb3VkID0gdHJ1X3RhZ3NfcmVuZGVyX2Ns b3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7CgoJJHJlZGlyZWN0cyA9IHRydV90 YWdzX2xvYWRfcmVkaXJlY3RzKCk7CgoJdHJ1X3RhZ3NfYWRtaW5fdGFiX3JlbmRlcl9wYWdl KCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf YWRtaW5fdGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpIHsK CWdsb2JhbCAkZXZlbnQ7CglwYWdldG9wKCd0cnVfdGFncycsICcnKTsKCglpbmNsdWRlX29u Y2UodHhwYXRoIC4gJy9pbmNsdWRlL3R4cF9wcmVmcy5waHAnKTsKCWdsb2JhbCAkdHJ1X3Rh Z3NfcHJlZnM7CgoJZWNobyBzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcxMHB4Jyku Jzx0cj48dGQgc3R5bGU9ImJvcmRlci1yaWdodDoycHggc29saWQgZ3JheSI+Jy4gICMgSSBr bm93LCBJIGtub3cuLi4KCQlzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcnLCAnMTBw eCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5Ij4nLgoJ CQlzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4JykuCgkJCQl0cihoQ2Vs bChnVHh0KCdDdXJyZW50IHRhZ3MnKSkpLgoJCQkJdHIodGQoJGNsb3VkKSkuCgkJCWVuZFRh YmxlKCkuCgkJJzwvdGQ+PC90cj48dHI+PHRkPicuCgkJCXN0YXJ0VGFibGUoJ2xpc3QnLCAn JywgJycsICcnLCAnMzAwcHgnKS4KCQkJCXRyKGhDZWxsKGdUeHQoJ3RydV90YWdzIFJlZmVy ZW5jZScpKSkuCgkJCQl0cih0ZCgnPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20v cmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+VXNhZ2UgaW5zdHJ1 Y3Rpb25zPC9hPicuCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVy bi5jb20vdmlld3RvcGljLnBocD9pZD0xNTA4NCI+Rm9ydW0gcGFnZXM8L2E+Jy4KCQkJCSc8 YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzUzNy90cnVf dGFncy1yZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJo dHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAi PlJlbGVhc2Ugcm9hZG1hcDwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8vd3d3LnJh aW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0Ij5GZWF0dXJl IGxpc3Q8L2E+Jy4KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90 cnVpc3QvdHJ1LXRhZ3MvYmxvYi9tYXN0ZXIvdHJ1X3RhZ3MucGhwIj50cnVfdGFncyBzb3Vy Y2UgY29kZTwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdHJ1 aXN0L3RydS10YWdzL2Jsb2IvbWFzdGVyL3RydV90YWdzLWRvY3MuaHRtbCI+U291cmNlIEhU TUwgZm9yIHRoZSB1c2FnZSBpbnN0cnVjdGlvbnM8L2E+Jy4KCQkJCSc8YnI+PGJyPjxhIGhy ZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5n LXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPnRydV90YWdzPC9hPiwgYnkgPGEgaHJlZj0iaHR0 cDovL3d3dy5yYWluc2tpdC5jb20vIj5OYXRoYW4gQXJ0aHVyPC9hPicuCgkJCQknPGJyPjxi cj4nLgoJCQkJJzxkaXYgaWQ9InBheXBhbCI+PGZvcm0gYWN0aW9uPSJodHRwczovL3d3dy5w YXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRob2Q9InBvc3QiPjxpbnB1dCB0eXBlPSJo aWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIgLz48aW5wdXQgdHlwZT0iaW1h Z2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9lbl9VUy9pL2J0bi94LWNsaWNrLWJ1 dDA0LmdpZiIgbmFtZT0ic3VibWl0IiBhbHQ9Ik1ha2UgYSBkb25hdGlvbiB0byBOYXRoYW4g QXJ0aHVyIiAvPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgc3JjPSJodHRwczovL3d3dy5wYXlw YWwuY29tL2VuX1VTL2kvc2NyL3BpeGVsLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48 aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJlbmNyeXB0ZWQiIHZhbHVlPSItLS0tLUJFR0lO IFBLQ1M3LS0tLS1NSUlIVHdZSktvWklodmNOQVFjRW9JSUhRRENDQnp3Q0FRRXhnZ0V3TUlJ QkxBSUJBRENCbERDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdG QVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1 akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhj R2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwQ0FRQXdEUVlKS29a SWh2Y05BUUVCQlFBRWdZQzhpMVQyN2xqS2ZwTlRFUWkwd0tIY2RHdWx4eGtNcXdkQ01tYkd2 czg3bi80VHNKdGlBc3FNbzJoeXM3WnNHeTVSRi9PN3MrQjJvUTc2elVsVDUyV1c3UWVYVUsz R3AwbnIyY1AzaW9CU3ROdStSWjZqa2FtMkUwRkdMWHlWNitVTlZFT3doOGxtb0lTUm90dlN2 SWdReVRMbkVlREhxRzlxdlV6cXZGM1NxakVMTUFrR0JTc09Bd0lhQlFBd2djd0dDU3FHU0li M0RRRUhBVEFVQmdncWhraUc5dzBEQndRSXBtUFpybHJaZlptQWdhaWVQVmIrbjlzVmRzdWZn R3JtQXcyclhBelIzOWtZcVBVSjduMExpTkRtZEFxNzNKb1A1M2taeThnU3BvdnVjTDJTMGpD MXNYcmNwRUxBcExMOEJGU0hmZExpWm9aU1YvQ1lPcHBINStkeDJZcUZJZHlDQ2RqSVg3b09Q Z1F5QXVnUmEyUXIzYit5dXR1RzBERnNkK0xBSkdiOGw0Q25ucmJtd2RZSzNOblZEQlBPbXhF T2psWFVnRXpsRkxYbUUzdzUrTW9QS1FjcDJuOGZkSkxzZ0cxNXhvVlBGekNkL0syZ2dnT0hN SUlEZ3pDQ0F1eWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmpqRUxNQWtHQTFV RUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldh V1YzTVJRd0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5 alpYSjBjekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdE WEpsUUhCaGVYQmhiQzVqYjIwd0hoY05NRFF3TWpFek1UQXhNekUxV2hjTk16VXdNakV6TVRB eE16RTFXakNCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURW UVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpF VE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hI REFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjB3Z1o4d0RRWUpLb1pJaHZj TkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU1GSFR0MzhSTXhMWEp5TzJTbVMrTmRsNzJUN29LSjR1 NHV3KzZhd250QUxXaDAzUGV3bUlKdXpiQUxTY3NUUzRzWm9TMWZLY2lCR29oMTFnSWZIenls dmtkTmUvaEpsNjYvUkdxcmo1ckZiMDhzQUFCTlR6RFRpcXFOcEplQnNZcy9jMmFpR296cHRY MlJsbkJrdEgrU1VOcEFhalc3MjROdjJXdmhpZjZzRkFnTUJBQUdqZ2U0d2dlc3dIUVlEVlIw T0JCWUVGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyTUlHN0JnTlZIU01FZ2JNd2diQ0FG SmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyb1lHVXBJR1JNSUdPTVFzd0NRWURWUVFHRXdK VlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZCQWNURFUxdmRXNTBZV2x1SUZacFpYY3hG REFTQmdOVkJBb1RDMUJoZVZCaGJDQkpibU11TVJNd0VRWURWUVFMRkFwc2FYWmxYMk5sY25S ek1SRXdEd1lEVlFRREZBaHNhWFpsWDJGd2FURWNNQm9HQ1NxR1NJYjNEUUVKQVJZTmNtVkFj R0Y1Y0dGc0xtTnZiWUlCQURBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQlFV QUE0R0JBSUZmT2xhYWdGcmw3MStqcTZPS2lkYldGU0UrUTRGcVJPdmRnSU9OdGgrOGtTSy8v WS80aWh1RTRZbXZ6bjVjZUUzUy9pQlNRUU1qeXZiK3MyVFdiUVlEd2NwMTI5T1BJYkQ5ZXBk cjR0Sk9VTmlTb2p3N0JId1lSaVBoNThTMXhHbEZnSEZYd3JFQmIzZGdOYk1VYSt1NHFlY3Rz TUFYcFZIbkQ5d0l5Zm1ITVlJQm1qQ0NBWllDQVFFd2daUXdnWTR4Q3pBSkJnTlZCQVlUQWxW VE1Rc3dDUVlEVlFRSUV3SkRRVEVXTUJRR0ExVUVCeE1OVFc5MWJuUmhhVzRnVm1sbGR6RVVN QklHQTFVRUNoTUxVR0Y1VUdGc0lFbHVZeTR4RXpBUkJnTlZCQXNVQ214cGRtVmZZMlZ5ZEhN eEVUQVBCZ05WQkFNVUNHeHBkbVZmWVhCcE1Sd3dHZ1lKS29aSWh2Y05BUWtCRmcxeVpVQndZ WGx3WVd3dVkyOXRBZ0VBTUFrR0JTc09Bd0lhQlFDZ1hUQVlCZ2txaGtpRzl3MEJDUU14Q3dZ SktvWklodmNOQVFjQk1Cd0dDU3FHU0liM0RRRUpCVEVQRncwd09EQTNNRE13TkRFME1USmFN Q01HQ1NxR1NJYjNEUUVKQkRFV0JCVDB0a2o0ZFpMZS9FNFF3YmliMjlYRWRIeEFZakFOQmdr cWhraUc5dzBCQVFFRkFBU0JnTDVKc1FIalE5U2c0WTNlRFdLRE8xNnIrdGZFejRSWUFEdCs2 aDk4MWZrVkN4Zk5IRkR4b2ZEY3h5elJNWXI3eTk1Y2RuVmk0QU5Rd01VWTZ5Slc1am0vR0Qx N3JqZ1N4Wk1FdnNBZTZZY0NTTEs1WmFwQ3cxcWx5U3BQR1pCQTNNVHQ2T0Qrb3ZWb2EvMXY4 Q05zRWNIcDdmNHRPeE9VU3c1UDRuSHlMUFdqLS0tLS1FTkQgUEtDUzctLS0tLSI+PC9mb3Jt PjwvZGl2PicKCQkJCSkpLgoJCQllbmRUYWJsZSgpLgoJCSc8L3RkPjwvdHI+Jy5lbmRUYWJs ZSgpLgoJJzwvdGQ+PHRkPicuCgkJc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBw eCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5O3dpZHRo OjQwMHB4Ij4nOwoKCQlpZiAoJHJlc3VsdHMpIHsKCQkJZWNobyBzdGFydFRhYmxlKCdsaXN0 JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJCXRyKGhDZWxsKGdUeHQoJ1Jlc3VsdHMnKSkp LgoJCQkJdHIodGRhKCRyZXN1bHRzKSwgJyBzdHlsZT0iY29sb3I6cmVkIicpLgoJCQllbmRU YWJsZSgpOwoJCQllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRv bToycHggc29saWQgZ3JheSI+JzsKCQl9CgoKCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAn JywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0YWcoZ1R4dCgnQXJ0aWNsZSBUYWcgTWFpbnRl bmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vuc2l0aXZlJykuJyEpJywgJ3RoJywgJyBjb2xz cGFuPSI1IicpKS4KCQkJdHIoCgkJCQlmb3JtKAoJCQkJCXRkYShnVHh0KCdSZW5hbWUnKS4n OiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQodGV4dF9p bnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkYShnVHh0KCd0bycpLic6Jywg JyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5wdXQo J3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ3Jl cGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJykpLAoJ CQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJwoJ CQkJKQoJCQkpLgoJCQl0cigKCQkJCWZvcm0oCgkJCQkJdGRhKGdUeHQoJ0RlbGV0ZScpLic6 ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lu cHV0KCdkZWxldGV0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkY3MoJycsIDIpLgoJCQkJCXRk KGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdUeHQoJ1J1bicpLCAncHVibGlzaCcpLmVJ bnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95 b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJCSkuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8 L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+ JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJ dHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAndGgnLCAnIGNvbHNwYW49IjQiJykpOwoJ CQlmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRyaWdodHRhZykgewoJCQkJ ZWNobyB0cigKCQkJCQl0ZGEoaHJlZigkbGVmdHRhZywgdHJ1X3RhZ3NfbGlua2lmeV90YWco JGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJCQkJCXRkYSho dG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiJyku CgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5raWZ5X3RhZygkcmlnaHR0 YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJCQkJCXRkKCc8YSBocmVm PSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1wO2RlbGV0ZV9yZWRpcmVjdD0nLnVybGVu Y29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJldHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2Fy ZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4nKQoJCQkJKTsKCQkJfQoJCQllY2hvIHRy KAoJCQkJJzxmb3JtIG5hbWU9InJlZGlyZWN0IiBpZD0icmVkaXJlY3QiIG1ldGhvZD0icG9z dCIgYWN0aW9uPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MiIG9uc3VibWl0PSJyZXR1cm4g dmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4nLgoJCQkJCXRkYSh0ZXh0 X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRl ciInKS4KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwgJyBzdHlsZT0idmVydGlj YWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyIicpLgoJCQkJCXRkYSh0ZXh0X2lu cHV0KCdyaWdodHRhZycsICcnLCAnMTUnKSwgJyBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIi JykuCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAodmVyaWZ5KFwnJy5nVHh0 KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcJ3JlZGly ZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3PC9hPicsICcgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQlmSW5wdXQoJ2hpZGRlbicsICdyZWRp cmVjdCcsICcxJykuCgkJCQknPC9mb3JtPicKCgkJCSkuCgkJZW5kVGFibGUoKTsKCgllY2hv ICc8L3RkPjwvdHI+PHRyPjx0ZD4nOwoKCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnKS4KCQkJ dHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0aCcsICcgY29sc3Bhbj0iMiInKSkuCgkJ CWZvcm0oCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVXNlIGNsZWFuIFVSTHMnKS4nICgnLmdU eHQoJ3NpdGUgZGVmYXVsdCBpcycpLicgJy4kdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10t PmRlZmF1bHRfdmFsdWUuJyk6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIn KS4KCQkJCQl0ZChyYWRpb19saXN0KENMRUFOX1VSTFMsCgkJCQkJCQlhcnJheSgnY2xlYW4n PT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0KCdtZXNzeScpKSwKCQkJCQkJCSR0cnVf dGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRk YShnVHh0KCdUYWcgc2VjdGlvbiBuYW1lJykuJyAoZGVmYXVsdCBpcyAiJy4kdHJ1X3RhZ3Nf cHJlZnNbVEFHX1NFQ1RJT05dLT5kZWZhdWx0X3ZhbHVlLiciKTogJywgJyBzdHlsZT0idmVy dGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5wdXQoVEFHX1NFQ1RJT04s ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlLCAnMTUnKSkKCQkJCSkuCgkJ CQl0cigKCQkJCQl0ZGEoZ1R4dCgnVVJMIHBhcmFtZXRlciBmb3IgdGFnIHNlYXJjaCcpLicg KGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPmRlZmF1bHRfdmFs dWUuJyIpOiAnLgoJCQkJCQknPGJyPjxlbT4oeW91IHNob3VsZG5cJ3QgY2hhbmdlIHRoaXMg dW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcpPC9lbT4nLCAnIHN0 eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dChQQVJN X05BTUUsICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSwgJzE1JykpCgkJCQkp LgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1B1dCB0YWdzIGludG8gUlNTL0F0b20gZmVlZHMs IGluICJDYXRlZ29yeSIgZWxlbWVudHMnKS4KCQkJCQkJJzogPGJyPjxlbT4oeW91IHByb2Jh Ymx5IHdhbnQgdGhpcyk8L2VtPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIn KS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAkdHJ1X3Rh Z3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkpCgkJCQkpLgoJCQkJ dHIoCgkJCQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRoZSBib2R5IG9mIFJTUy9B dG9tIGZlZWRzLCAnLgoJCQkJCQknd2l0aCBsaW5rcywgYW5kIHdpdGggcmVsPSJ0YWciOicu CgkJCQkJCSc8YnI+PGVtPihpZiB0aGlzIGlzIHR1cm5lZCBvbiwnLgoJCQkJCQkneW91IGNh biBkZWZpbmUgYSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19mZWVkX3RhZ3MgJy4KCQkJ CQkJJ3RoYXQgd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgdGFncyBpbiB0aGUgZmVlZCk8 L2VtPicsCgkJCQkJCScgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0 ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9CT0RZLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19J Tl9GRUVEX0JPRFldLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1No b3cgYSBjbGlja2FibGUgbGlzdCBvZiB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4nOiAn LAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQoeWVz bm9SYWRpbyhUQUdTX0lOX1dSSVRFX1RBQiwgJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fV1JJ VEVfVEFCXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdBdXRvY29t cGxldGUgdGFncyBvbiB0aGUgIldyaXRlIiBwYWdlJykuJzogPGJyPicuCgkJCQkJCSc8ZW0+ KHJlcXVpcmVzIHRoYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9iYXNzaXN0YW5jZS5kZS9qcXVl cnktcGx1Z2lucy9qcXVlcnktcGx1Z2luLWF1dG9jb21wbGV0ZS8iPmpRdWVyeSBBdXRvY29t cGxldGUgcGx1Z2luPC9hPiA8Y29kZT4uY3NzPC9jb2RlPiBhbmQgPGNvZGU+Lm1pbi5qczwv Y29kZT4gZmlsZXMgYmUgdXBsb2FkZWQgaW50byBhICI8Y29kZT5qczwvY29kZT4iIGZvbGRl ciBvbiB5b3VyIHNpdGUpPC9lbT4nLAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjpt aWRkbGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFC LCAkdHJ1X3RhZ3NfcHJlZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSkK CQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnQ29udmVydCB0YWdzIHRvIGxvd2VyY2Fz ZSBieSBkZWZhdWx0JykuJzogPGJyPicuCgkJCQkJCSc8ZW0+KHlvdSBwcm9iYWJseSB3YW50 IHRoaXMsIHVubGVzcyB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3aXRoIHV0Zi04IGNoYXJh Y3RlcnMpPC9lbT4nLAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJyku CgkJCQkJdGQoeWVzbm9SYWRpbyhVVEZfOF9DQVNFLCAkdHJ1X3RhZ3NfcHJlZnNbVVRGXzhf Q0FTRV0tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZCgnJykuCgkJCQkJdGRhKGZJ bnB1dCgnc3VibWl0JywgJ3ByZWZzJywgZ1R4dCgnU2F2ZScpLCAncHVibGlzaCcpLmVJbnB1 dCgndHJ1X3RhZ3MnKSwgJyBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCInKQoJCQkJKSwKCQkJ CScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJwoJCQkp LgoJCWVuZFRhYmxlKCkuJzwvdGQ+PC90cj4nLgoJCWVuZFRhYmxlKCk7CgoJZWNobyAnPC90 ZD48L3RyPicuZW5kVGFibGUoKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3RhYl9o YW5kbGVfaW5wdXQoKSB7CglpZiAoZ3BzKCdwcmVmcycpKSB7CgkJcmV0dXJuIHRydV90YWdz X2FkbWluX3VwZGF0ZV9wcmVmcygpOwoJfSBlbHNlIGlmIChncHMoJ2RlbGV0ZScpKSB7CgkJ cmV0dXJuIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWcoZ3BzKCdkZWxldGV0YWcnKSk7Cgl9 IGVsc2UgaWYgKGdwcygncmVwbGFjZScpKSB7CgkJJHJlc3VsdCA9IHRydV90YWdzX2FkbWlu X3JlcGxhY2VfdGFnKGdwcygnbWF0Y2h0YWcnKSwgZ3BzKCdyZXBsYWNldGFnJyksIGZhbHNl KTsKCQlyZXR1cm4gJHJlc3VsdCAuICc8YnI+JyAuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0 X3RhZyhncHMoJ21hdGNodGFnJyksIGdwcygncmVwbGFjZXRhZycpKTsKCX0gZWxzZSBpZiAo Z3BzKCdyZWRpcmVjdCcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3Rh ZyhncHMoJ2xlZnR0YWcnKSwgZ3BzKCdyaWdodHRhZycpKTsKCX0gZWxzZSBpZiAoZ3BzKCdk ZWxldGVfcmVkaXJlY3QnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9kZWxldGVfcmVk aXJlY3QoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSk7Cgl9IGVsc2UgewoJCXJldHVybiAnJzsK CX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3VwZGF0ZV9wcmVmcygpIHsKCWdsb2Jh bCAkdHJ1X3RhZ3NfcHJlZnM7CgkkcmVzdWx0cyA9IGFycmF5KCk7Cglmb3JlYWNoICgkdHJ1 X3RhZ3NfcHJlZnMgYXMgJHByZWYpIHsKCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+dmFsaWRh dGVfdmFsdWUoZ3BzKCRwcmVmLT5uYW1lKSk7CgkJaWYgKCR2YWxpZF92YWx1ZSAmJiAkdmFs aWRfdmFsdWUgPD4gZ3BzKCRwcmVmLT5uYW1lKSkgewoJCQlyZXR1cm4gJHZhbGlkX3ZhbHVl OyAgIyMjIHRoaXMgaXMgYSBzbmVha3kgd2F5IHRvIGhhbmRsZSB2YWxpZGF0aW9uIC0gc29y cnkgOykKCQl9CgkJaWYgKCR2YWxpZF92YWx1ZSA8PiAkcHJlZi0+dmFsdWUpIHsKCQkJaWYg KCR2YWxpZF92YWx1ZSA9PSAkcHJlZi0+ZGVmYXVsdF92YWx1ZSkgewoJCQkJJHJlc3VsdCA9 IHRydV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsKCQkJfSBlbHNlIHsKCQkJCSRy ZXN1bHQgPSB0cnVfdGFnc191cHNlcnRfcHJlZigkcHJlZi0+bmFtZSwgJHZhbGlkX3ZhbHVl KTsKCQkJfQoJCQlpZiAoJHJlc3VsdCkgewoJCQkJJHJlc3VsdHNbXSA9ICdVcGRhdGVkICcg LiAkcHJlZi0+bmFtZTsKCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92YWx1ZTsKCQkJfSBl bHNlIHsKCQkJCSRyZXN1bHRzW10gPSAnRXJyb3IgdXBkYXRpbmcgJyAuICRwcmVmLT5uYW1l OwoJCQl9CgkJfQoJfQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAwKSB7CgkJcmV0dXJuICdO byByZWNvcmRzIG5lZWQgdXBkYXRpbmcnOwoJfSBlbHNlIHsKCQlyZXR1cm4gam9pbignPGJy PicsICRyZXN1bHRzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3Vwc2VydF9wcmVmKCRu YW1lLCAkdmFsdWUpIHsKCWlmICghc2FmZV9xdWVyeSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBl eGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpLgoJCScgKG5hbWUgdmFyY2hh cigyNTUpIHByaW1hcnkga2V5LCAnLgoJCSd2YWx1ZSB2YXJjaGFyKDI1NSkgbm90IG51bGwp JykpIHsKCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAn IC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykgLiAnIHRhYmxlLic7Cgl9CgoJcmV0dXJu IHNhZmVfdXBzZXJ0KCd0cnVfdGFnc19wcmVmcycsICd2YWx1ZT0iJy4kdmFsdWUuJyInLCAn bmFtZT0iJy4kbmFtZS4nIicpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZGVsZXRlX3ByZWYo JG5hbWUpIHsKCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcHJlZnMnLCAnbmFtZT0iJy4k bmFtZS4nIicpKSB7CgkJaWYgKHNhZmVfY291bnQoJ3RydV90YWdzX3ByZWZzJywgJzEnKSA9 PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3Nf cHJlZnMnKSkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0gZWxz ZSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVs ZXRlX3RhZygkZGVsZXRldGFnKSB7CglpZiAodHJpbSgkZGVsZXRldGFnKSkgewoJCXJldHVy biB0cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1ZSk7Cgl9 IGVsc2UgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUnOwoJfQp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoJG1hdGNodGFnLCAkcmVwbGFjZXRhZywg JGFsbG93X2JsYW5rX3JlcGxhY2V0YWcpIHsKCSRtYXRjaHRhZyA9IHRyaW0oJG1hdGNodGFn KTsKCSRyZXBsYWNldGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7CglpZiAoJG1hdGNodGFnICYm ICgkYWxsb3dfYmxhbmtfcmVwbGFjZXRhZyB8fCAkcmVwbGFjZXRhZykpIHsKCQlpZiAoc2Fm ZV91cGRhdGUoJ3RleHRwYXR0ZXJuJywgVFJVX1RBR1NfRklFTEQuJz10cmltKGJvdGggXCcs XCcgZnJvbSByZXBsYWNlKGNvbmNhdCgiLCIsICcuVFJVX1RBR1NfRklFTEQuJywgIiwiKSwg Y29uY2F0KCIsIiwgXCcnLmFkZHNsYXNoZXMoJG1hdGNodGFnKS4nXCcsICIsIiksIFwnLCcu YWRkc2xhc2hlcygkcmVwbGFjZXRhZykuJyxcJykpJywgJzEnKSkgewoJCQlyZXR1cm4gJ1Vw ZGF0ZWQgJy5teXNxbGlfYWZmZWN0ZWRfcm93cygpLicgcm93cyAoIicuaHRtbHNwZWNpYWxj aGFycygkbWF0Y2h0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRyZXBsYWNldGFnKS4n IiknOwoJCX0gZWxzZSB7CgkJCXJldHVybiAnRXJyb3I6ICcgLiBteXNxbGlfZXJyb3IoKTsK CQl9Cgl9IGVsc2UgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgaW4gYm90aCBm aWVsZHMnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKCRs ZWZ0dGFnLCAkcmlnaHR0YWcpIHsKCSRsZWZ0dGFnID0gYWRkc2xhc2hlcyh0cnVfdGFnc19z dHJ0b2xvd2VyKHRyaW0oJGxlZnR0YWcpKSk7CgkkcmlnaHR0YWcgPSBhZGRzbGFzaGVzKHRy dV90YWdzX3N0cnRvbG93ZXIodHJpbSgkcmlnaHR0YWcpKSk7CglpZiAoISRsZWZ0dGFnIHx8 ICEkcmlnaHR0YWcpIHsKCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGluIGJvdGgg ZmllbGRzJzsKCX0KCglpZiAoIXNhZmVfcXVlcnkoJ2NyZWF0ZSB0YWJsZSBpZiBub3QgZXhp c3RzICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykuCgkJJyAobGVmdHRhZyB2 YXJjaGFyKDI1NSkgcHJpbWFyeSBrZXksICcuCgkJJ3JpZ2h0dGFnIHZhcmNoYXIoMjU1KSBu b3QgbnVsbCknKSkgewoJCXJldHVybiAnU2VyaW91cyBlcnJvciAtIHVuYWJsZSB0byBjcmVh dGUgdGhlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykgLiAnIHRhYmxlLic7 Cgl9CgoJaWYgKHNhZmVfaW5zZXJ0KCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnbGVmdHRhZz0i Jy4kbGVmdHRhZy4nIixyaWdodHRhZz0iJy4kcmlnaHR0YWcuJyInKSkgewoJCXJldHVybiAn UmVkaXJlY3QgYWRkZWQgKCInLmh0bWxzcGVjaWFsY2hhcnMoJGxlZnR0YWcpLiciPT4iJy5o dG1sc3BlY2lhbGNoYXJzKCRyaWdodHRhZykuJyIpIC0gcGxlYXNlIHRlc3QgaXQhJzsKCX0g ZWxzZSB7CgkJcmV0dXJuICdFcnJvciBhZGRpbmcgcmVjb3JkIC0gZG9lcyBpdCBhbHJlYWR5 IGV4aXN0Pyc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9kZWxldGVfcmVkaXJl Y3QoJGxlZnR0YWcpIHsKCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcmVkaXJlY3RzJywg J2xlZnR0YWc9IicuYWRkc2xhc2hlcygkbGVmdHRhZykuJyInKSkgewoJCWlmIChzYWZlX2Nv dW50KCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMScpID09IDAgJiYgIXNhZmVfcXVlcnkoJ2Ry b3AgdGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKSkpIHsKCQkJcmV0 dXJuICdSZWRpcmVjdCBkZWxldGVkLCBidXQgdW5hYmxlIHRvIGRyb3AgdGFibGUgJyAuIHNh ZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKTsKCQl9CgkJcmV0dXJuICdSZWRpcmVjdCBk ZWxldGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIiknOwoJfSBlbHNlIHsK CQlyZXR1cm4gJ0Vycm9yIGRlbGV0aW5nIHJlZGlyZWN0JzsKCX0KfQoKCmZ1bmN0aW9uIHRy dV90YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsKCWdsb2Jh bCAkdHJ1X3RhZ3NfcHJlZnM7CgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91 ZF9hdHRzKGFycmF5KCksIHRydWUsIHRydWUsIHRydWUpOwoJJGNsb3VkID0gYXJyYXlfdW5p cXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7CgluYXRjYXNlc29ydCgkY2xvdWQp OwoKCSRpZCA9IChlbXB0eSgkR0xPQkFMU1snSUQnXSkgPyBncHMoJ0lEJykgOiAkR0xPQkFM U1snSUQnXSk7CgkkYXJ0aWNsZV90YWdzID0gKGVtcHR5KCRpZCkgPyBhcnJheSgpIDogdHJ1 X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGlkKSk7CgoJJGxpbmtzID0gYXJyYXkoKTsK CSRyYXdfY2xvdWQgPSAnJzsKCWZvcmVhY2ggKCRjbG91ZCBhcyAkdGFnKSB7CgkJJHN0eWxl ID0gKGluX2FycmF5KCR0YWcsICRhcnRpY2xlX3RhZ3MpID8gJyBjbGFzcz0idGFnX2Nob3Nl biInIDogJycpOwoJCSRsaW5rc1tdID0gJzxhIGhyZWY9IiNhZHZhbmNlZCInLiRzdHlsZS4n IG9uY2xpY2s9InRvZ2dsZUNsYXNzKHRoaXMsIHRvZ2dsZVRhZyhcXFwnJy5hZGRzbGFzaGVz KGFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycygkdGFnKSkpLidcXFwnKSk7IHJldHVybiBm YWxzZTsiPicgLiBhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMoJHRhZykpIC4gJzxcL2E+ JzsKCQkkcmF3X2Nsb3VkIC49ICciJyAuIGFkZFNsYXNoZXMoJHRhZykgLiAnIiwnOwoJfQoJ JHJhd19jbG91ZCA9IHN1YnN0cigkcmF3X2Nsb3VkLCAwLCBzdHJsZW4oJHJhd19jbG91ZCkg LSAxKTsKCSR0b19pbnNlcnQgPSBqb2luKCcsICcsICRsaW5rcyk7CgoJaWYgKCR0cnVfdGFn c19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSB7CgkJJGpzID0gPDw8RU9GCgkJ CXZhciBrZXl3b3Jkc0ZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2tleXdvcmRz Jyk7CgkJCWtleXdvcmRzRmllbGQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5j cmVhdGVFbGVtZW50KCdicicpKTsKCQkJdmFyIGNsb3VkID0gZG9jdW1lbnQuY3JlYXRlRWxl bWVudCgnc3BhbicpOwoJCQlrZXl3b3Jkc0ZpZWxkLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQo Y2xvdWQpOwoJCQljbG91ZC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3RydV90YWdzX2FkbWlu X3RhZ3MnKTsKCQkJY2xvdWQuaW5uZXJIVE1MID0gJ3skdG9faW5zZXJ0fSc7CgoJCQl2YXIg c3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKCQkJc3R5 bGVFbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2NzcyIpOwoJCQl2YXIgc3R5 bGVUZXh0ID0gJ2EudGFnX2Nob3NlbntiYWNrZ3JvdW5kLWNvbG9yOiAjRkVCOyBjb2xvcjog YmxhY2s7fSc7CgkJCWlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkgeyAvL0lFCgkJCQlz dHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gc3R5bGVUZXh0OwoJCQl9IGVsc2Ug ewoJCQkJdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc3R5bGVUZXh0 KTsKCQkJCXN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7CgkJCX0KCQkJdmFy IGhlYWRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVsw XTsKCQkJaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsKCgkJCWZ1bmN0 aW9uIHRvZ2dsZVRhZyh0YWdOYW1lKSB7CgkJCQl2YXIgcmVnZXhUYWcgPSB0YWdOYW1lLnJl cGxhY2UoLyhbXFxcXFxeXFwkKitbXFxdP3t9Lj0hOih8KV0pL2csIlxcXFwkMSIpOwoJCQkJ dmFyIHRhZ1JlZ2V4ID0gbmV3IFJlZ0V4cCgiKChefCwpXFxccyopIiArIHJlZ2V4VGFnICsg IlxcXHMqKCxcXFxzKnwkKSIpOwoJCQkJdmFyIHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxl bWVudEJ5SWQoJ2tleXdvcmRzJyk7CgkJCQl2YXIgY3VydmFsID0gdGV4dGFyZWEudmFsdWUu cmVwbGFjZSgvLD9ccyskLywgJycpOwoJCQkJaWYgKCcnID09IGN1cnZhbCkgewoJCQkJCXRl eHRhcmVhLnZhbHVlID0gdGFnTmFtZTsKCQkJCX0gZWxzZSBpZiAoY3VydmFsLm1hdGNoKHRh Z1JlZ2V4KSkgewoJCQkJCXRleHRhcmVhLnZhbHVlID0gY3VydmFsLnJlcGxhY2UodGFnUmVn ZXgsICckMScpLnJlcGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJCQlyZXR1cm4gJyc7CgkJCQl9 IGVsc2UgaWYgKCcsJyA9PSBjdXJ2YWwuY2hhckF0KGN1cnZhbC5sZW5ndGggLSAxKSkgewoJ CQkJCXRleHRhcmVhLnZhbHVlICs9ICcgJyArIHRhZ05hbWU7CgkJCQl9IGVsc2UgewoJCQkJ CXRleHRhcmVhLnZhbHVlICs9ICcsICcgKyB0YWdOYW1lOwoJCQkJfQoJCQkJcmV0dXJuICd0 YWdfY2hvc2VuJzsKCQkJfQoKCQkJZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWxlbWVudCwgY2xh c3NOYW1lKSB7CgkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbGFzc05hbWUp OwoJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzTmFtZScsIGNsYXNzTmFtZSk7IC8q IGZvciBJRSAqLwoJCQl9CkVPRjsKCQllY2hvIHNjcmlwdF9qcygkanMpOwoJfQoKCWlmICgk dHJ1X3RhZ3NfcHJlZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSB7CgkJ ZWNobyA8PDxFT0YKCQkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIg aHJlZj0iLi4vanMvanF1ZXJ5LmF1dG9jb21wbGV0ZS5jc3MiIG1lZGlhPSJwcm9qZWN0aW9u LCBzY3JlZW4iIC8+CgkJCTxzY3JpcHQgc3JjPSIuLi9qcy9qcXVlcnkuYXV0b2NvbXBsZXRl Lm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCQkJPHNjcmlwdCBs YW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJCQkk KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpeyB2YXIgdGFncyA9IG5ldyBBcnJheSh7JHJh d19jbG91ZH0pOwoJCQkJCSQoIiNrZXl3b3JkcyIpLmF1dG9jb21wbGV0ZSh0YWdzLCB7IG11 bHRpcGxlOiB0cnVlLCBtdXN0TWF0Y2g6IGZhbHNlLCBhdXRvRmlsbDogZmFsc2UgfSk7CgkJ CQl9KTsKCQkJLy8tLT48L3NjcmlwdD4KRU9GOwoJfQoKfQoKCiMjIyBBVE9NL1JTUyBGRUVE IEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKcmVnaXN0 ZXJfY2FsbGJhY2soJ3RydV90YWdzX2F0b21faGFuZGxlcicsICdhdG9tX2VudHJ5Jyk7CmZ1 bmN0aW9uIHRydV90YWdzX2F0b21faGFuZGxlcigkZXZlbnQsICRzdGVwKSB7IHJldHVybiB0 cnVfdGFnc19mZWVkX2hhbmRsZXIodHJ1ZSk7IH0KcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90 YWdzX3Jzc19oYW5kbGVyJywgJ3Jzc19lbnRyeScpOwpmdW5jdGlvbiB0cnVfdGFnc19yc3Nf aGFuZGxlcigkZXZlbnQsICRzdGVwKSB7IHJldHVybiB0cnVfdGFnc19mZWVkX2hhbmRsZXIo ZmFsc2UpOyB9CgpmdW5jdGlvbiB0cnVfdGFnc19mZWVkX2hhbmRsZXIoJGF0b20pIHsKCWds b2JhbCAkdGhpc2FydGljbGUsICR0cnVfdGFnc19wcmVmczsKCWV4dHJhY3QoJHRoaXNhcnRp Y2xlKTsKCgkkdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCR0aGlzaWQp OwoKCWlmICgkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0JPRFldLT52YWx1ZSkgewoJ CSRleHRyYWJvZHkgPSAnJzsKCQkkRk9STV9OQU1FID0gJ3RydV90YWdzX2ZlZWRfdGFncyc7 CgkJaWYgKGZldGNoKCdmb3JtJywgJ3R4cF9mb3JtJywgJ25hbWUnLCAkRk9STV9OQU1FKSkg ewoJCQkkZm9ybSA9IGZldGNoX2Zvcm0oJEZPUk1fTkFNRSk7CgkJCSRleHRyYWJvZHkgPSB0 cmltKHBhcnNlKCRmb3JtKSk7CgkJfSBlbHNlIHsKCQkJJGF0dHMgPSB0cnVfdGFnc19nZXRf c3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgdHJ1ZSk7CgkJCSRleHRyYWJv ZHkgPSAnPHA+dGFnczogJyAuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJHRhZ3Ms ICR0YWdzKSAuICc8L3A+JzsKCQl9CgkJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCQlpZiAodHJp bSgkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSkpIHsKCQkJJHRoaXNhcnRpY2xlWydleGNlcnB0 J10gPSB0cmltKCR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddKS5uLiRleHRyYWJvZHkubjsKCQl9 CgkJJHRoaXNhcnRpY2xlWydib2R5J10gPSB0cmltKCR0aGlzYXJ0aWNsZVsnYm9keSddKS5u LiRleHRyYWJvZHkubjsKCX0KCglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9D QVRFR09SSUVTXS0+dmFsdWUpIHsKCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQlmb3JlYWNoICgk dGFncyBhcyAkdGFnKSB7CgkJCWlmICgkYXRvbSkgewoJCQkJJG91dHB1dFtdID0gJzxjYXRl Z29yeSB0ZXJtPSInIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICciIC8+JzsKCQkJfSBl bHNlIHsKCQkJCSRvdXRwdXRbXSA9ICc8Y2F0ZWdvcnk+JyAuIGh0bWxzcGVjaWFsY2hhcnMo JHRhZykgLiAnPC9jYXRlZ29yeT4nOwoJCQl9CgkJfQoJCXJldHVybiBuLmpvaW4obiwgJG91 dHB1dCkubjsKCX0KfQoKCiMjIyBQUkVGUyBGVU5DVElPTlMgLyBDTEFTU0VTICMjIwojIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmNsYXNzIHRydV90YWdzX3ByZWYgewoJ ZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG5hbWUsICRkZWZhdWx0X3ZhbHVlLCAkdHlwZSkgewoJ CSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPnZhbHVlID0gJGRlZmF1bHRfdmFsdWU7 CgkJJHRoaXMtPmRlZmF1bHRfdmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsKCQkkdGhpcy0+dHlw ZSA9ICR0eXBlOwoJfQoKCWZ1bmN0aW9uIHZhbGlkYXRlX3ZhbHVlKCR2YWx1ZSkgewoJCWlm ICgkdmFsdWUpIHsKCQkJcmV0dXJuICR2YWx1ZTsKCQl9IGVsc2UgaWYgKCR0aGlzLT50eXBl ID09ICdib29sZWFuJykgewoJCQlyZXR1cm4gJzAnOwoJCX0gZWxzZSB7CgkJCXJldHVybiAn UGxlYXNlIGVudGVyIGEgdmFsdWUgZm9yICcgLiAkdGhpcy0+bmFtZTsKCQl9Cgl9Cn0KCmZ1 bmN0aW9uIHRydV90YWdzX2xvYWRfcHJlZnMoKSB7CgkkcHJlZnMgPSBhcnJheSgpOwoKCWds b2JhbCAkcGVybWxpbmtfbW9kZTsKCSRwcmVmc1tDTEVBTl9VUkxTXSA9IG5ldyB0cnVfdGFn c19wcmVmKENMRUFOX1VSTFMsICgkcGVybWxpbmtfbW9kZSAhPSAnbWVzc3knID8gJ2NsZWFu JyA6ICdtZXNzeScpLCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHX1NFQ1RJT05dID0gbmV3IHRy dV90YWdzX3ByZWYoVEFHX1NFQ1RJT04sICd0YWcnLCAnc3RyaW5nJyk7CgkkcHJlZnNbUEFS TV9OQU1FXSA9IG5ldyB0cnVfdGFnc19wcmVmKFBBUk1fTkFNRSwgJ3QnLCAnc3RyaW5nJyk7 CgkkcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdID0gbmV3IHRydV90YWdzX3ByZWYo VEFHU19JTl9GRUVEX0NBVEVHT1JJRVMsICcxJywgJ2Jvb2xlYW4nKTsKCSRwcmVmc1tUQUdT X0lOX0ZFRURfQk9EWV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZFRURfQk9EWSwg JzAnLCAnYm9vbGVhbicpOwoJJHByZWZzW1RBR1NfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVf dGFnc19wcmVmKFRBR1NfSU5fV1JJVEVfVEFCLCAnMScsICdib29sZWFuJyk7CgkkcHJlZnNb QVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihBVVRPQ09N UExFVEVfSU5fV1JJVEVfVEFCLCAnMCcsICdib29sZWFuJyk7CgkkcHJlZnNbVVRGXzhfQ0FT RV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihVVEZfOF9DQVNFLCAnMScsICdib29sZWFuJyk7CgoJ aWYgKHNhZmVfcXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAidHJ1X3RhZ3NfcHJlZnMiKSkg ewoJCSRycyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19wcmVmcycsICcxJyk7CgkJZm9y ZWFjaCAoJHJzIGFzICRyb3cpIHsKCQkJJHByZWZzWyRyb3dbJ25hbWUnXV0tPnZhbHVlID0g JHJvd1sndmFsdWUnXTsKCQl9Cgl9CgoJcmV0dXJuICRwcmVmczsKfQoKCiMjIyBPVEhFUiBT VVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoK ZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkaXJlY3RfaWZfbmVlZGVkKCR0YWdfcGFyYW1ldGVyKSB7 CgkkcmVkaXJlY3RzID0gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKTsKCWZvcmVhY2ggKCRy ZWRpcmVjdHMgYXMgJGxlZnR0YWcgPT4gJHJpZ2h0dGFnKSB7CgkJaWYgKCRsZWZ0dGFnID09 ICR0YWdfcGFyYW1ldGVyIHx8ICRsZWZ0dGFnID09IHN0cl9yZXBsYWNlKCctJywgJyAnLCAk dGFnX3BhcmFtZXRlcikpIHsKCQkJdHJ1X3RhZ3NfcmVkaXJlY3QoJHJpZ2h0dGFnLCBmYWxz ZSk7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7Cn0KCgpmdW5jdGlv biB0cnVfdGFnc19sb2FkX3JlZGlyZWN0cygpIHsKCSRyZWRpcmVjdHMgPSBhcnJheSgpOwoJ aWYgKHNhZmVfcXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAidHJ1X3RhZ3NfcmVkaXJlY3Rz IikpIHsKCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJzEg b3JkZXIgYnkgbGVmdHRhZycpOwoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJCSRyZWRp cmVjdHNbJHJvd1snbGVmdHRhZyddXSA9ICRyb3dbJ3JpZ2h0dGFnJ107CgkJfQoJfQoJcmV0 dXJuICRyZWRpcmVjdHM7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZWRpcmVjdCgkZGVzdGlu YXRpb24sICRpc19mdWxsX3VybCkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWlmICgk aXNfZnVsbF91cmwpIHsKCQkkdXJsID0gJGRlc3RpbmF0aW9uOwoJCSRtZXNzYWdlID0gJ1Ro ZSByZXNvdXJjZSB5b3UgcmVxdWVzdGVkIGhhcyBtb3ZlZCB0byAnIC4gJGRlc3RpbmF0aW9u OwoJfSBlbHNlIHsKCQkkdXJsID0gdHJ1X3RhZ3NfbGlua2lmeV90YWcoJGRlc3RpbmF0aW9u LCBmYWxzZSk7CgkJJG1lc3NhZ2UgPSAnVGhlIHJlcXVlc3RlZCB0YWcgaGFzIGJlZW4gcmVw bGFjZWQgYnkgJyAuICRkZXN0aW5hdGlvbjsKCX0KCgloZWFkZXIoJ0xvY2F0aW9uOiAnIC4g JHVybCk7Cgl0eHBfZGllKCRtZXNzYWdlLCAnMzAxJyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19saW5raWZ5X3RhZygkdGFnLCAkdXNlX2FtcCA9IHRydWUpIHsKCWdsb2JhbCAkdHJ1X3Rh Z3NfcHJlZnM7CglpZiAodHJ1X3RhZ3NfY2xlYW5fdXJscygpKSB7CgkJJHVybHByZWZpeCA9 IGh1IC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUgLiAnLyc7Cgl9IGVs c2UgewoJCSR1cmxwcmVmaXggPSBodSAuICc/cz0nIC4gJHRydV90YWdzX3ByZWZzW1RBR19T RUNUSU9OXS0+dmFsdWUgLiAoJHVzZV9hbXAgPyAnJmFtcDsnIDogJyYnKSAuICR0cnVfdGFn c19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSAuICc9JzsKCX0KCSR1cmxzdWZmaXggPSAodHJ1 X3RhZ3NfY2xlYW5fdXJscygpID8gJy8nIDogJycpOwoJcmV0dXJuICR1cmxwcmVmaXggLiB1 cmxlbmNvZGUoJHRhZykgLiAkdXJsc3VmZml4Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0 X3RhZ3NfZm9yX2FydGljbGUoJGFydGljbGVJRCkgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZSwg JHRydV90YWdzX3ByZWZzOwoJaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZSkpIHsKCQlleHRyYWN0 KCR0aGlzYXJ0aWNsZSk7Cgl9Cgkka2V5d29yZHMgPSAnJzsKCWlmIChpc3NldCgkdGhpc2lk KSAmJiAkdGhpc2lkID09ICRhcnRpY2xlSUQpIHsKCQlpZiAoaXNzZXQoJHRoaXNhcnRpY2xl WydrZXl3b3JkcyddKSkgewoJCQkka2V5d29yZHMgPSAkdGhpc2FydGljbGVbJ2tleXdvcmRz J107CgkJfQoJfSBlbHNlIHsKCQkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoJCSRy cyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyRhcnRpY2xl SUQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJCWlmIChpc3NldCgkcnNbJHRhZ3NfZmll bGRdKSkgewoJCQkka2V5d29yZHMgPSAkcnNbJHRhZ3NfZmllbGRdOwoJCX0KCX0KCSRhbGxf dGFncyA9IGFycmF5KCk7CgkkYWxsX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFn c19zdHJ0b2xvd2VyKCRrZXl3b3JkcykpKTsKCglyZXR1cm4gdHJ1X3RhZ3NfdHJpbV90YWdz KCRhbGxfdGFncyk7Cn0KCgojIGZpeGVzIGJ1ZyB3aXRoIDQuMC40J3MgdmVyc2lvbiBvZiBk b1dyYXAgdGhhdCBjYXVzZWQgc3BhY2VzIHRvIHNob3cgdXAgYmVmb3JlIHRoZSBjb21tYXMK ZnVuY3Rpb24gdHJ1X3RhZ3NfZG9fd3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNs YXNzLCAkYnJlYWtjbGFzcykgewoJaWYgKCEkd3JhcHRhZyAmJiAhcHJlZ19tYXRjaCgnL15c dyskLycsICRicmVhaykpIHsKCQlyZXR1cm4gam9pbigkYnJlYWsubiwgJGxpc3QpOwoJfSBl bHNlIHsKCQlyZXR1cm4gZG9XcmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3Ms ICRicmVha2NsYXNzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3RyaW1fdGFncygkdGFn X2FycmF5KSB7CgkkdHJpbW1lZCA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGFnX2FycmF5IGFz ICR0YWcpIHsKCQlpZiAoIiIgIT0gdHJpbSgkdGFnKSkgewoJCQkkdHJpbW1lZFtdID0gdHJp bSgkdGFnKTsKCQl9Cgl9CglyZXR1cm4gJHRyaW1tZWQ7Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcikgewoJJGtleXdvcmRz ID0gZXhwbG9kZSgnLCcsICR0YWdfcGFyYW1ldGVyKTsKCWZvcmVhY2ggKCRrZXl3b3JkcyBh cyAka2V5d29yZCkgewoJCWlmIChzdHJwb3MoJGtleXdvcmQsICctJykgIT09IGZhbHNlKSB7 CgkJCSRrZXl3b3Jkc1tdID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICRrZXl3b3JkKTsKCQl9 Cgl9CgkkYXR0c1sna2V5d29yZHMnXSA9IGltcGxvZGUoJywnLCAka2V5d29yZHMpOwoKCWlm IChpc3NldCgkYXR0c1snc2VjdGlvbiddKSAmJiBzdHJwb3MoJGF0dHNbJ3NlY3Rpb24nXSwg JywnKSAhPT0gZmFsc2UpIHsKCQkkYXR0c1snc2VjdGlvbiddID0gJyc7Cgl9CgoJaWYgKGlz c2V0KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkgewoJCXVuc2V0KCRhdHRzWydleGNsdWRl c2VjdGlvbiddKTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ25vYXJ0aWNsZXMnXSkpIHsKCQl1 bnNldCgkYXR0c1snbm9hcnRpY2xlcyddKTsKCX0KCglpZiAoIWlzc2V0KCRhdHRzWydsaW1p dCddKSkgewoJCSRhdHRzWydsaW1pdCddID0gJzEwMDAnOwoJfQoKCWlmICghaXNzZXQoJGF0 dHNbJ2FsbG93b3ZlcnJpZGUnXSkpIHsKCQkkYXR0c1snYWxsb3dvdmVycmlkZSddID0gdHJ1 ZTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ3NlYXJjaGZvcm0nXSkgJiYgIWlzc2V0KCRhdHRz WydsaXN0Zm9ybSddKSkgewoJCSRhdHRzWydsaXN0Zm9ybSddID0gJGF0dHNbJ3NlYXJjaGZv cm0nXTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ3Nob3djb3VudHMnXSkpIHsKCQl1bnNldCgk YXR0c1snc2hvd2NvdW50cyddKTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJzQwNHJlZGlyZWN0 J10pKSB7CgkJdW5zZXQoJGF0dHNbJzQwNHJlZGlyZWN0J10pOwoJfQoKCXJldHVybiAkYXR0 czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3N0cnRvbG93ZXIoJHN0cikgewoJZ2xvYmFsICR0 cnVfdGFnc19wcmVmczsKCWlmICgkdHJ1X3RhZ3NfcHJlZnNbVVRGXzhfQ0FTRV0tPnZhbHVl KSB7CgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG9sb3dlcicpKSB7CgkJCXJldHVy biBtYl9zdHJ0b2xvd2VyKCRzdHIsIEVOQ09ESU5HKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4g c3RydG9sb3dlcigkc3RyKTsKCQl9Cgl9IGVsc2UgewoJCXJldHVybiAkc3RyOwoJfQp9Cgpm dW5jdGlvbiB0cnVfdGFnc19zdHJ0b3VwcGVyKCRzdHIpIHsKCWlmIChmdW5jdGlvbl9leGlz dHMoJ21iX3N0cnRvdXBwZXInKSkgewoJCXJldHVybiBtYl9zdHJ0b3VwcGVyKCRzdHIsIEVO Q09ESU5HKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHN0cnRvdXBwZXIoJHN0cik7Cgl9Cn0KCmZ1 bmN0aW9uIHRydV90YWdzX3VjZmlyc3QoJHN0cikgewoJaWYgKGZ1bmN0aW9uX2V4aXN0cygn bWJfc3Vic3RyJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b3VwcGVyJykgJiYgZnVu Y3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSAmJiBtYl9zdHJsZW4oJHN0ciwgRU5DT0RJTkcp ID4gMSkgewoJCXJldHVybiBtYl9zdHJ0b3VwcGVyKG1iX3N1YnN0cigkc3RyLCAwLCAxLCBF TkNPRElORyksIEVOQ09ESU5HKSAuIG1iX3N1YnN0cigkc3RyLCAxLCBtYl9zdHJsZW4oJHN0 ciwgRU5DT0RJTkcpLCBFTkNPRElORyk7Cgl9IGVsc2UgewoJCXJldHVybiB1Y2ZpcnN0KCRz dHIpOwoJfQp9CgpmdW5jdGlvbiB0cnVfdGFnc191Y3dvcmRzKCRzdHIpIHsKCWlmIChmdW5j dGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfY2FzZScpKSB7CgkJcmV0dXJuIG1iX2NvbnZlcnRf Y2FzZSgkc3RyLCBNQl9DQVNFX1RJVExFLCBFTkNPRElORyk7Cgl9IGVsc2UgewoJCXJldHVy biB1Y3dvcmRzKCRzdHIpOwoJfQp9CgoKLy90aGVzZSBuZXh0IHR3byBmdW5jdGlvbnMgYXJl IGdyb3NzLCBidXQgSSBjYW4ndCBmaWd1cmUgb3V0IGFub3RoZXIgd2F5IHRvIGRvIGl0CmZ1 bmN0aW9uIHRydV90YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50 LCAkc29ydF9hc2NlbmRpbmcpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfdGFnc193ZWlnaHQsICR0 cnVfdGFnc19zb3J0X2FzY2VuZGluZzsKCgkkdHJ1X3RhZ3NfdGFnc193ZWlnaHQgPSAkdGFn c193ZWlnaHQ7CgkkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmcgPSAkc29ydF9hc2NlbmRpbmc7 CgoJJHRlbXBfYXJyYXkgPSBhcnJheV9rZXlzKCR0YWdzX3dlaWdodCk7CglpZiAoJHNvcnRf YnlfY291bnQpIHsKCQl1c29ydCgkdGVtcF9hcnJheSwgInRydV90YWdzX3NvcnRfdGFnc19j b21wYXJhdG9yIik7Cgl9IGVsc2UgewoJCW5hdGNhc2Vzb3J0KCR0ZW1wX2FycmF5KTsKCQkk dGVtcF9hcnJheSA9IGFycmF5X3ZhbHVlcygkdGVtcF9hcnJheSk7Cgl9CgoJJHNvcnRlZF9h cnJheSA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGVtcF9hcnJheSBhcyAkdGFnKSB7CgkJJHNv cnRlZF9hcnJheVskdGFnXSA9ICR0YWdzX3dlaWdodFskdGFnXTsKCX0KCglyZXR1cm4gJHNv cnRlZF9hcnJheTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3NvcnRfdGFnc19jb21wYXJhdG9y KCRsZWZ0LCAkcmlnaHQpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfdGFnc193ZWlnaHQsICR0cnVf dGFnc19zb3J0X2FzY2VuZGluZzsKCgkkbGVmdF93ZWlnaHQgPSAkdHJ1X3RhZ3NfdGFnc193 ZWlnaHRbJGxlZnRdOwoJJHJpZ2h0X3dlaWdodCA9ICR0cnVfdGFnc190YWdzX3dlaWdodFsk cmlnaHRdOwoJaWYgKCRsZWZ0X3dlaWdodCA9PSAkcmlnaHRfd2VpZ2h0KSB7CgkJJHRlbXBf YXJyYXkgPSBhcnJheSgkbGVmdCwgJHJpZ2h0KTsKCQluYXRjYXNlc29ydCgkdGVtcF9hcnJh eSk7CgkJJHRlbXBfYXJyYXkgPSBhcnJheV92YWx1ZXMoJHRlbXBfYXJyYXkpOwoJCXJldHVy biAoJHRlbXBfYXJyYXlbMF0gPT0gJGxlZnQgPyAtMSA6IDEpOwoJfSBlbHNlIGlmICgkdHJ1 X3RhZ3Nfc29ydF9hc2NlbmRpbmcpIHsKCQlyZXR1cm4gJGxlZnRfd2VpZ2h0IC0gJHJpZ2h0 X3dlaWdodDsKCX0gZWxzZSB7CgkJcmV0dXJuICRyaWdodF93ZWlnaHQgLSAkbGVmdF93ZWln aHQ7Cgl9Cn0KCgoKIyMjIEJBU1RBUkQgRlVOQ1RJT05TIFRIQVQgU0hPVUxETidUIEhBVkUg VE8gRVhJU1QgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIwoKCmZ1bmN0aW9uIHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2go JGF0dHMpIHsKCSR0aGVBdHRzID0gbEF0dHMoYXJyYXkoJ2xpbWl0JyAgICAgPT4gMTAwMCwK CQkJCSdjYXRlZ29yeScgID0+ICcnLAoJCQkJJ3NlY3Rpb24nICAgPT4gJycsCgkJCQknZXhj ZXJwdGVkJyA9PiAnJywKCQkJCSdhdXRob3InICAgID0+ICcnLAoJCQkJJ3NvcnRieScgICAg PT4gJ1Bvc3RlZCcsCgkJCQknc29ydGRpcicgICA9PiAnZGVzYycsCgkJCQknbW9udGgnICAg ICA9PiAnJywKCQkJCSdrZXl3b3JkcycgID0+ICcnLAoJCQkJJ2Zyb250cGFnZScgPT4gJycs CgkJCQknaWQnICAgICAgICA9PiAnJywKCQkJCSd0aW1lJyAgICAgID0+ICdwYXN0JywKCQkJ CSdzdGF0dXMnICAgID0+ICc0JywKCQkJCSdvZmZzZXQnICAgID0+IDAKCQkJKSwkYXR0cywg MCk7CglleHRyYWN0KCR0aGVBdHRzKTsKCgkvL0J1aWxkaW5nIHF1ZXJ5IHBhcnRzCgkkZnJv bnRwYWdlID0gKCRmcm9udHBhZ2UpID8gZmlsdGVyRnJvbnRQYWdlKCkgOiAnJzsKCSRjYXRl Z29yeSAgPSAoISRjYXRlZ29yeSkgID8gJycgOiAiIGFuZCAoKENhdGVnb3J5MT0nIi5kb3Ns YXNoKCRjYXRlZ29yeSkuIicpIG9yIChDYXRlZ29yeTI9JyIuZG9TbGFzaCgkY2F0ZWdvcnkp LiInKSkgIjsKCSRzZWN0aW9uICAgPSAoISRzZWN0aW9uKSAgID8gJycgOiAiIGFuZCBTZWN0 aW9uID0gJyIuZG9zbGFzaCgkc2VjdGlvbikuIiciOwoJJGV4Y2VycHRlZCA9ICgkZXhjZXJw dGVkPT0neScpICA/ICIgYW5kIEV4Y2VycHQgIT0nJyIgOiAnJzsKCSRhdXRob3IgICAgPSAo ISRhdXRob3IpICAgID8gJycgOiAiIGFuZCBBdXRob3JJRCA9ICciLmRvc2xhc2goJGF1dGhv cikuIiciOwoJJG1vbnRoICAgICA9ICghJG1vbnRoKSAgICAgPyAnJyA6ICIgYW5kIFBvc3Rl ZCBsaWtlICciLmRvU2xhc2goJG1vbnRoKS4iJSciOwoJJGlkICAgICAgICA9ICghJGlkKSAg ICAgICAgPyAnJyA6ICIgYW5kIElEID0gJyIuaW50dmFsKCRpZCkuIiciOwoJc3dpdGNoICgk dGltZSkgewoJCWNhc2UgJ2FueSc6CgkJCSR0aW1lID0gIiI7IGJyZWFrOwoJCWNhc2UgJ2Z1 dHVyZSc6CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkID4gbm93KCkiOyBicmVhazsKCQlkZWZh dWx0OgoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA8IG5vdygpIjsKCX0KCWlmICghaXNfbnVt ZXJpYygkc3RhdHVzKSkKCQkkc3RhdHVzID0gZ2V0U3RhdHVzTnVtKCRzdGF0dXMpOwoKCSRj dXN0b20gPSAnJzsKCS8vIHRyeWluZyBjdXN0b20gZmllbGRzIGhlcmUKCSRjdXN0b21GaWVs ZHMgPSBnZXRDdXN0b21GaWVsZHMoKTsKCWlmICgkY3VzdG9tRmllbGRzKSB7CgkJZm9yZWFj aCgkY3VzdG9tRmllbGRzIGFzICRjRmllbGQpIHsKCQkJaWYgKGlzc2V0KCRhdHRzWyRjRmll bGRdKSkKCQkJCSRjdXN0b21QYWlyc1skY0ZpZWxkXSA9ICRhdHRzWyRjRmllbGRdOwoJCX0K CQlpZighZW1wdHkoJGN1c3RvbVBhaXJzKSkKCQkJJGN1c3RvbSA9ICBidWlsZEN1c3RvbVNx bCgkY3VzdG9tRmllbGRzLCRjdXN0b21QYWlycyk7CgkJZWxzZQoJCQkkY3VzdG9tID0gJyc7 Cgl9CgoJLy9BbGxvdyBrZXl3b3JkcyBmb3Igbm8tY3VzdG9tIGFydGljbGVzLiBUaGF0IHRh Z2dpbmcgbW9kZSwgeW91IGtub3cKCWlmICgka2V5d29yZHMpIHsKCQkka2V5cyA9IGRvU2xh c2goYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsICRrZXl3b3JkcykpKTsKCQlmb3Jl YWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIkZJTkRfSU5fU0VUKCci LiRrZXkuIicsS2V5d29yZHMpIjsKCQl9CgkJJGtleXdvcmRzID0gIiBhbmQgKCIgLiBqb2lu KCcgb3IgJywka2V5cGFydHMpIC4gIikiOwoJfQoKCWlmICgkaWQpCgkJJHN0YXR1c3EgPSAi IGFuZCBTdGF0dXMgPj0gJzQnIjsKCWVsc2UKCQkkc3RhdHVzcSA9ICIgYW5kIFN0YXR1cz0n Ii5kb1NsYXNoKCRzdGF0dXMpLiInIjsKCgkkd2hlcmUgPSAiMSIgLiAkc3RhdHVzcS4gJHRp bWUuCgkJJGlkIC4gJGNhdGVnb3J5IC4gJHNlY3Rpb24gLiAkZXhjZXJwdGVkIC4gJG1vbnRo IC4gJGF1dGhvciAuICRrZXl3b3JkcyAuICRjdXN0b20gLiAkZnJvbnRwYWdlOwoKCQkkcGdv ZmZzZXQgPSAkb2Zmc2V0IC4gJywgJzsKCgkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoIiosIHVu aXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgdVBvc3RlZCIsICd0ZXh0cGF0dGVybicsCgkJJHdo ZXJlLiAnIG9yZGVyIGJ5ICcgLiBkb3NsYXNoKCRzb3J0YnkpIC4gJyAnIC4gZG9TbGFzaCgk c29ydGRpcikgLiAnIGxpbWl0ICcgLiBkb1NsYXNoKCRsaW1pdCkpOwoKCXJldHVybiAkcnM7 Cn0KCgoiO3M6ODoiaGVscF9yYXciO3M6ODc2OiJUbyBsZWFybiBtb3JlIGFib3V0IHRydV90 YWdzLCBjaGVjayBvdXQgdGhlICJpbnRyb2R1Y3RvcnkgYXJ0aWNsZSI6aHR0cDovL3d3dy5y YWluc2tpdC5jb20vYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0 cGF0dGVybiwgInJlbGVhc2VzIHBhZ2UiOmh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVy ZW5jZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMsICJmZWF0dXJlIGxpc3QiOmh0dHA6Ly93d3cu cmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTUvdHJ1dGFncy1mZWF0dXJlLWxpc3QsICJyb2Fk bWFwIjpodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJv YWRtYXAsIGFuZCAidXNhZ2UgaW5zdHJ1Y3Rpb25zIjpodHRwOi8vd3d3LnJhaW5za2l0LmNv bS9yZWZlcmVuY2UvNDk3L3RydXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zLgoKWW91IGNhbiBh bHNvIGZpbmQgdGhlIHNvdXJjZSBjb2RlIGF0ICJnaXRodWIuY29tL3RydWlzdC90cnUtdGFn cyI6aHR0cHM6Ly9naXRodWIuY29tL3RydWlzdC90cnUtdGFncy4KCkkndmUgdGFrZW4gdGhl IGRldGFpbGVkIGhlbHAgb3V0IG9mIHRoZSBwbHVnaW47IG15IGFwb2xvZ2llcy4gIEl0IHdh cyB0b28gYmlnIGFuZCB0b28gZGlmZmljdWx0IHRvIGtlZXAgbWFpbnRhaW5pbmcgb24gbXkg c2l0ZSBhbmQgaW4gdGhlIHBsdWdpbi4gIElmLCBteSBzaXRlIGlzIGV2ZXIgZG93biwgaG93 ZXZlciwgdGhlIHNvdXJjZSBIVE1MIG9mIHRoZSB1c2FnZSBpbnN0cnVjdGlvbnMgaXMgYXZh aWxhYmxlIGZyb20gdGhlICJnaXRodWIgcmVwbyI6aHR0cHM6Ly9naXRodWIuY29tL3RydWlz dC90cnUtdGFncy9ibG9iL21hc3Rlci90cnVfdGFncy1kb2NzLmh0bWwiO3M6MzoibWQ1Ijtz OjMyOiI2OWQ4YzYzNGFkYmFjMjczN2JjZGEyOTYzNWJmNDRmNCI7fQ==