# tru_tags v3.4 # 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 NCI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjQ6Imh0dHA6Ly93d3cucmFpbnNraXQuY29tLyI7czoxMToiZGVzY3JpcHRpb24iO3M6 MTU6IkFydGljbGUgdGFnZ2luZyI7czo0OiJ0eXBlIjtpOjE7czo0OiJuYW1lIjtzOjg6InRy dV90YWdzIjtzOjQ6ImhlbHAiO3M6MTA4NjoiCTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1 X3RhZ3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20v YmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiI+aW50 cm9kdWN0b3J5IGFydGljbGU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNv bS9yZWZlcmVuY2UvNTM3L3RydV90YWdzLXJlbGVhc2VzIj5yZWxlYXNlcyBwYWdlPC9hPiwg PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdz LWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0PC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5y YWluc2tpdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwIj5yb2FkbWFwPC9h PiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTcv dHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiPnVzYWdlIGluc3RydWN0aW9uczwvYT4uPC9w PgoKCTxwPllvdSBjYW4gYWxzbyBmaW5kIHRoZSBzb3VyY2UgY29kZSBhdCA8YSBocmVmPSJo dHRwOi8vY29kZS5nb29nbGUuY29tL3AvdHJ1LXRhZ3MvIj5odHRwOi8vY29kZS5nb29nbGUu Y29tL3AvdHJ1LXRhZ3MvPC9hPi48L3A+CgoJPHA+SSYjODIxNzt2ZSB0YWtlbiB0aGUgZGV0 YWlsZWQgaGVscCBvdXQgb2YgdGhlIHBsdWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRv byBiaWcgYW5kIHRvbyBkaWZmaWN1bHQgdG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRl IGFuZCBpbiB0aGUgcGx1Z2luLiAgSWYsIG15IHNpdGUgaXMgZXZlciBkb3duLCBob3dldmVy LCB0aGUgc291cmNlIDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiBvZiB0aGUgdXNh Z2UgaW5zdHJ1Y3Rpb25zIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vY29kZS5n b29nbGUuY29tL3AvdHJ1LXRhZ3Mvc291cmNlL2Jyb3dzZS90cnVuay90cnVfdGFncy1kb2Nz Lmh0bWwiPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90cnUtdGFncy9zb3VyY2UvYnJvd3Nl L3RydW5rL3RydV90YWdzLWRvY3MuaHRtbDwvYT48L3A+IjtzOjQ6ImNvZGUiO3M6Mzk3NzQ6 IgojQ29weXJpZ2h0IDIwMDggTmF0aGFuIEFydGh1cgojUmVsZWFzZWQgdW5kZXIgdGhlIEdO VSBQdWJsaWMgTGljZW5zZSwgc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5z ZXMvZ3BsLWxpY2Vuc2UucGhwIGZvciBkZXRhaWxzCiNUaGlzIHdvcmsgaXMgaW5zcGlyZWQg YnkgcmFuX3RhZ3MgYnkgUmFuIEFyb3Vzc2ksIG9yaWdpbmFsbHkgZm91bmQgYXQgaHR0cDov L2Fyb3Vzc2kuY29tL2FydGljbGUvNDUvdGFnZ2luZy10ZXh0cGF0dGVybgoKCiMjIyBDT05G SUdVUkFUSU9OICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgVFVSTiBCQUNLISAgQ29u ZmlndXJhdGlvbiBpcyBubyBsb25nZXIgaGFuZGxlZCBieSBlZGl0aW5nIHRoZSBwbHVnaW4u CiMgQ2hlY2sgb3V0IHRoZSAnRXh0ZW5zaW9ucycgdGFiIGluIHRoZSBUZXh0cGF0dGVybiBh ZG1pbiA6KQoKCiMgQ2hhbmdpbmcgdGhlc2Ugd29uJ3QgZG8gYW55IGdvb2QuICBUaGV5J3Jl IGp1c3QgaGVyZSBhcyBhIGNvbnZlbmllbmNlIGZvciBkZXZlbG9wbWVudC4KZGVmaW5lKCdU UlVfVEFHU19GSUVMRCcsICdLZXl3b3JkcycpOwpkZWZpbmUoJ0NMRUFOX1VSTFMnLCAnY2xl YW5fdXJscycpOwpkZWZpbmUoJ1RBR19TRUNUSU9OJywgJ3RhZ19zZWN0aW9uJyk7CmRlZmlu ZSgnUEFSTV9OQU1FJywgJ3Bhcm0nKTsKZGVmaW5lKCdUQUdTX0lOX0ZFRURfQ0FURUdPUklF UycsICd0YWdzX2luX2ZlZWRfY2F0ZWdvcmllcycpOwpkZWZpbmUoJ1RBR1NfSU5fRkVFRF9C T0RZJywgJ3RhZ3NfaW5fZmVlZF9ib2R5Jyk7CmRlZmluZSgnVEFHU19JTl9XUklURV9UQUIn LCAndGFnc19pbl93cml0ZV90YWInKTsKCmdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CiR0cnVf dGFnc19wcmVmcyA9IHRydV90YWdzX2xvYWRfcHJlZnMoKTsKCgojIyMgUFJJTUFSWSBUQUcg RlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24g dHJ1X3RhZ3NfaGFuZGxlcigkYXR0cykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190 YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsKCWlmICghZW1wdHkoJHRhZ19wYXJhbWV0 ZXIpKSB7CgkJaWYgKHRydV90YWdzX3JlZGlyZWN0X2lmX25lZWRlZCgkdGFnX3BhcmFtZXRl cikpIHsKCQkJcmV0dXJuICcnOwoJCX0KCQkkY2xlYW5fYXR0cyA9IHRydV90YWdzX2ZpeHVw X3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKTsKCQkkcmVzdWx0ID0gZG9BcnRp Y2xlcygkY2xlYW5fYXR0cywgdHJ1ZSk7CQkjZnVuY3Rpb24gaW4gVFhQIGNvZGUKCQlpZiAo dHJpbSgkcmVzdWx0KSA9PSAnJykgewoJCQlpZiAoaXNzZXQoJGF0dHNbJ25vYXJ0aWNsZXMn XSkpIHsKCQkJCXRydV90YWdzX3JlZGlyZWN0KCRhdHRzWydub2FydGljbGVzJ10sIHRydWUp OwoJCQl9IGVsc2UgewoJCQkJdHhwX2RpZShnVHh0KCc0MDRfbm90X2ZvdW5kJyksICc0MDQn KTsKCQkJfQoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCX0gZWxzZSB7CgkJ cmV0dXJuIHRydV90YWdzX2Nsb3VkKCRhdHRzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdz X2FyY2hpdmUoJGF0dHMpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3Rh ZzsKCSR0YWdzID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KHRydV90YWdz X2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKSk7Cglzb3J0 KCR0YWdzKTsKCWZvcmVhY2ggKCR0YWdzIGFzICR0YWcpIHsKCQkkdHJ1X3RhZ3NfY3VycmVu dF9hcmNoaXZlX3RhZyA9ICR0YWc7CgkJJGNsZWFuX2F0dHMgPSB0cnVfdGFnc19maXh1cF9x dWVyeV9hdHRzKCRhdHRzLCAkdGFnKTsKCQkkcmVzdWx0c1tdID0gZG9BcnRpY2xlcygkY2xl YW5fYXR0cywgdHJ1ZSk7CQkjZnVuY3Rpb24gaW4gVFhQIGNvZGUKCX0KCXJldHVybiBqb2lu KCcgJywgJHJlc3VsdHMpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZl X3RhZygkYXR0cykgewoJZ2xvYmFsICR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnOwoJ ZXh0cmFjdChsQXR0cyhhcnJheSgnbGluaycgPT4gJzAnKSwgICRhdHRzLCAwKSk7CglpZiAo JGxpbmspIHsKCQlyZXR1cm4gJzxhIGhyZWY9IicgLiB0cnVfdGFnc19saW5raWZ5X3RhZygk dHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZykgLiAnIj4nIC4gJHRydV90YWdzX2N1cnJl bnRfYXJjaGl2ZV90YWcgLiAnPC9hPic7Cgl9IGVsc2UgewoJCXJldHVybiAkdHJ1X3RhZ3Nf Y3VycmVudF9hcmNoaXZlX3RhZzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Nsb3VkKCRh dHRzKSB7CglyZXR1cm4gdHJ1X3RhZ3NfbGlzdCh0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv dWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNlKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19s aXN0KCRhdHRzKSB7CgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRz KCRhdHRzLCB0cnVlLCBmYWxzZSk7CgkkYWxsX3RhZ3MgPSB0cnVfdGFnc19jbG91ZF9xdWVy eSgkYXR0cyk7CgoJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90 YWdzLCAkYWxsX3RhZ3MpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZnJvbV9hcnRpY2xlKCRh dHRzKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xlOwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoK CSRhbGxfdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCR0aGlzaWQpOwoK CSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZhbHNl LCB0cnVlKTsKCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOwoJaWYgKCRhdHRz Wyd1c2VvdmVyYWxsY291bnRzJ10pIHsKCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9IHRydV90 YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsKCX0KCglyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVyX2Ns b3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFnc19mb3Jfd2VpZ2h0KTsKfQoKCmZ1bmN0 aW9uIHRydV90YWdzX2lmX2hhc190YWdzKCRhdHRzLCAkdGhpbmcpIHsKCWdsb2JhbCAkdGhp c2FydGljbGU7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgoJJHRhZ3NfZmllbGQgPSBUUlVf VEFHU19GSUVMRDsKCgkkcnMgPSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRleHRwYXR0ZXJu IiwgIklEPSckdGhpc2lkJyBBTkQgJHRhZ3NfZmllbGQgPD4gJyciKTsKCXJldHVybiBwYXJz ZShFdmFsRWxzZSgkdGhpbmcsICRycykpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfdGFn X3NlYXJjaCgkYXR0cywgJHRoaW5nKSB7CglleHRyYWN0KGxBdHRzKGFycmF5KCd0YWcnID0+ ICcnKSwgICRhdHRzLCAwKSk7CgoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFy YW1ldGVyKGFycmF5KCdzdHJpcGh5cGhlbnMnID0+IDEpLCBmYWxzZSk7CgkkY29uZGl0aW9u ID0gKCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpID8gdHJ1ZSA6IGZhbHNlOwoJaWYgKCRjb25k aXRpb24gJiYgIWVtcHR5KCR0YWcpKSB7CgkJJGNvbmRpdGlvbiA9ICgkdGFnX3BhcmFtZXRl ciA9PSAkdGFnKTsKCX0KCXJldHVybiBwYXJzZShFdmFsRWxzZSgkdGhpbmcsICRjb25kaXRp b24pKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoJGF0dHMsICRzYWZl aHRtbCA9IHRydWUpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CglleHRyYWN0KGxBdHRz KGFycmF5KCdzdHJpcGh5cGhlbnMnID0+ICcwJywgJ3VybGVuY29kZScgPT4gMCksICAkYXR0 cywgMCkpOwoKCSRwYXJtID0gdXJsZGVjb2RlKHN0cmlwX3RhZ3MoZ3BzKCR0cnVfdGFnc19w cmVmc1tQQVJNX05BTUVdLT52YWx1ZSkpKTsKCWlmICgnbG9va3VwJyA9PSAkc3RyaXBoeXBo ZW5zKSB7CgkJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJh eSgpLCBmYWxzZSwgZmFsc2UpOwoJCSR0YWdfbGlzdCA9IGFycmF5X3VuaXF1ZSh0cnVfdGFn c19jbG91ZF9xdWVyeSgkYXR0cykpOwoJCWZvcmVhY2ggKCR0YWdfbGlzdCBhcyAkY2xvdWRf dGFnKSB7CgkJCWlmICgkcGFybSA9PSBzdHJfcmVwbGFjZSgnICcsICctJywgJGNsb3VkX3Rh ZykpIHsKCQkJCSRwYXJtID0gJGNsb3VkX3RhZzsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfSBl bHNlIGlmICgkc3RyaXBoeXBoZW5zKSB7CgkJJHBhcm0gPSBzdHJfcmVwbGFjZSgnLScsICcg JywgJHBhcm0pOwoJfQoJaWYgKCR1cmxlbmNvZGUpIHsKCQkkcGFybSA9IHVybGVuY29kZSgk cGFybSk7CgkgfSBlbHNlIGlmICgkc2FmZWh0bWwpIHsKCQkkcGFybSA9IGh0bWxzcGVjaWFs Y2hhcnMoJHBhcm0pOwoJfQoKCXJldHVybiAkcGFybTsKfQoKCmZ1bmN0aW9uIHRydV90YWdz X3NlYXJjaF9wYXJhbWV0ZXIoKSB7Cgl0cmlnZ2VyX2Vycm9yKGdUeHQoJ2RlcHJlY2F0ZWRf dGFnJyksIEVfVVNFUl9OT1RJQ0UpOwoJcmV0dXJuIHN0cmlwX3RhZ3MoZ3BzKCdxJykpOwp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVsYXRlZF90YWdzX2Zyb21fc2VhcmNoKCRhdHRzKSB7 CgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoKSwgZmFs c2UpOwoJZXh0cmFjdChsQXR0cyhhcnJheSgndGFnX3BhcmFtZXRlcicgPT4gJHRhZ19wYXJh bWV0ZXIpLCAgJGF0dHMsIDApKTsKCWlmICghZW1wdHkoJHRhZ19wYXJhbWV0ZXIpKSB7CiAg ICAgICAgJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19GSUVMRDsKCQkkYWxsX3RhZ3MgPSBhcnJh eSgpOwoKCQkkcXVlcnlfYXR0cyA9IHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMs ICR0YWdfcGFyYW1ldGVyKTsKCQkkcnMgPSB0cnVfdGFnc19yZWRvX2FydGljbGVfc2VhcmNo KCRxdWVyeV9hdHRzKTsKCQlpZiAoJHJzKSB7CgkJCXdoaWxlICgkYSA9IG5leHRSb3coJHJz KSkgewoJCQkJJGFydGljbGVfdGFncyA9IGFycmF5KCk7CgkJCQlpZiAoYXJyYXlfa2V5X2V4 aXN0cygkdGFnc19maWVsZCwgJGEpKSB7CgkJCQkJJGFydGljbGVfdGFncyA9IGV4cGxvZGUo IiwiLCB0cmltKHRydV90YWdzX3N0cnRvbG93ZXIoJGFbJHRhZ3NfZmllbGRdKSkpOwoJCQkJ fQoJCQkJJGFsbF90YWdzID0gYXJyYXlfbWVyZ2UoJGFsbF90YWdzLCB0cnVfdGFnc190cmlt X3RhZ3MoJGFydGljbGVfdGFncykpOwoJCQl9CgkJfQoKCQkkYWx0X3RhZ19wYXJhbWV0ZXIg PSBzdHJfcmVwbGFjZSgnLScsICcgJywgJHRhZ19wYXJhbWV0ZXIpOwoJCWZvcmVhY2ggKCRh bGxfdGFncyBhcyAka2V5ID0+ICR0YWcpIHsKCQkJaWYgKCR0YWcgPT0gJHRhZ19wYXJhbWV0 ZXIgfHwgJHRhZyA9PSAkYWx0X3RhZ19wYXJhbWV0ZXIpIHsKCQkJCXVuc2V0KCRhbGxfdGFn c1ska2V5XSk7CgkJCX0KCQl9CgoJCSRjbG91ZF9hdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5k YXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZhbHNlLCBmYWxzZSk7CgkJJGFsbF90YWdzX2Zvcl93 ZWlnaHQgPSAkYWxsX3RhZ3M7CgkJaWYgKCRjbG91ZF9hdHRzWyd1c2VvdmVyYWxsY291bnRz J10pIHsKCQkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSB0cnVfdGFnc19jbG91ZF9xdWVyeSgk Y2xvdWRfYXR0cyk7CgkJfQoKCQlyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRjbG91 ZF9hdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFnc19mb3Jfd2VpZ2h0KTsKCX0gZWxzZSB7CgkJ cmV0dXJuICcnOwoJfQp9CgoKIyMjIENMT1VEIFNVUFBPUlQgRlVOQ1RJT05TICMjIwojIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFnc19nZXRfc3Rh bmRhcmRfY2xvdWRfYXR0cygkYXR0cywgJGlzTGlzdCwgJGlzQXJ0aWNsZSkgewoJcmV0dXJu IGxBdHRzKGFycmF5KCd3cmFwdGFnJwk9PiAoJGlzTGlzdCA/ICd1bCcgOiAnJyksCgkJCSdi cmVhaycJCT0+ICgkaXNMaXN0ID8gJ2xpJyA6ICcsICcpLAoJCQknY2xhc3MnCQk9PiAnJywK CQkJJ2JyZWFrY2xhc3MnCT0+ICcnLAoJCQknc2VjdGlvbicJPT4gJycsCgkJCSdtaW5wZXJj ZW50Jwk9PiAnMTAwJywKCQkJJ21heHBlcmNlbnQnCT0+ICgkaXNMaXN0IHx8ICRpc0FydGlj bGUgPyAnMTAwJyA6ICcyMDAnKSwKCQkJJ3Nob3djb3VudHMnCT0+ICcnLAoJCQknY291bnR3 cmFwY2hhcnMnCT0+ICdbXScsCgkJCSd1c2VyZWx0YWcnCT0+ICgkaXNBcnRpY2xlID8gJzEn IDogJycpLAoJCQknZ2VuZXJhdGVsaW5rcycJPT4gJzEnLAoJCQknbWludGFnY291bnQnCT0+ ICcwJywKCQkJJ21heHRhZ2NvdW50Jwk9PiAnMTAwMCcsCgkJCSdzZXRzaXplcycJPT4gKCRp c0FydGljbGUgPyAnMCcgOiAnMScpLAoJCQkndXNlbm9mb2xsb3cnCT0+ICcnLAoJCQknc29y dCcJCT0+ICdhbHBoYScsCgkJCSd1c2VvdmVyYWxsY291bnRzJwk9PiAnJywKCQkJJ3NldGNs YXNzZXMnCT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwKCQkJJ3RpdGxlJwkJPT4gJycs CgkJCSdsaXN0bGltaXQnCT0+ICcnLAoJCQkna2VlcCcJCT0+ICdsYXJnZXN0JywKCQkJJ2N1 dG9mZicJPT4gJ2NodW5rJywKCQkJJ3RleHR0cmFuc2Zvcm0nCT0+ICdub25lJywKCQkJJ2xp bmtwYXRoJwk9PiAnJywKCQkJJ2xpbmtwYXRodGFpbCcJPT4gJycsCgkJCSdmaWx0ZXJzZWFy Y2gnCT0+ICcxJywKCQkJJ2V4Y2x1ZGVzZWN0aW9uJz0+ICcnLAoJCQknYWN0aXZlY2xhc3Mn CT0+ICd0YWdBY3RpdmUnLAoJCQkndGltZScJCT0+ICdwYXN0JwoJCSksJGF0dHMsIDApOwp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpIHsKCWV4dHJhY3QoJGF0 dHMpOwoKCSRzZWN0aW9uX2NsYXVzZSA9ICcnOwoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7CgkJ JGtleXMgPSBzcGxpdCgnLCcsICRzZWN0aW9uKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5 KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIici OwoJCX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5 cGFydHMpIC4gIikiOwoJfQoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CglpbmNs dWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsKCgkkZmlsdGVyID0gdHJ1 X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRleGNsdWRlc2VjdGlvbik7CgkkZmlsdGVyIC49ICgk ZmlsdGVyc2VhcmNoID8gZmlsdGVyU2VhcmNoKCkgOiAnJyk7CgoJc3dpdGNoICgkdGltZSkg ewoJCWNhc2UgJ2FueSc6CgkJCSR0aW1lID0gIiI7IGJyZWFrOwoJCWNhc2UgJ2Z1dHVyZSc6 CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkID4gbm93KCkiOyBicmVhazsKCQlkZWZhdWx0OgoJ CQkkdGltZSA9ICIgYW5kIFBvc3RlZCA8PSBub3coKSI7Cgl9CglnbG9iYWwgJHByZWZzOwoJ ZXh0cmFjdCgkcHJlZnMpOwoJaWYgKCEkcHVibGlzaF9leHBpcmVkX2FydGljbGVzKSB7CgkJ JHRpbWUgLj0gIiBhbmQgKG5vdygpIDw9IEV4cGlyZXMgb3IgRXhwaXJlcyA9ICIuTlVMTERB VEVUSU1FLiIpIjsKCX0KCgkkYWxsX3RhZ3MgPSBhcnJheSgpOwoJJHJzID0gc2FmZV9yb3dz KCIkdGFnc19maWVsZCIsICJ0ZXh0cGF0dGVybiIsICIkdGFnc19maWVsZCA8PiAnJyIgLiAk c2VjdGlvbl9jbGF1c2UgLiAkZmlsdGVyIC4gIiBhbmQgU3RhdHVzID49ICc0JyIgLiAkdGlt ZSk7Cglmb3JlYWNoICgkcnMgYXMgJHJvdykgewoJCSR0ZW1wX2FycmF5ID0gYXJyYXkoKTsK CQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVsZCwgJHJvdykpIHsKCQkJJHRlbXBf YXJyYXkgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRyb3dbJHRh Z3NfZmllbGRdKSkpOwoJCX0KCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJnZSgkYWxsX3RhZ3Ms IHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9hcnJheSkpOwoJfQoKCXJldHVybiAkYWxsX3Rh Z3M7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0 aW9uKSB7Cgkkc2VjdGlvbnMgPSBleHBsb2RlKCcsJywgJGV4Y2x1ZGVzZWN0aW9uKTsKCSRm aWx0ZXJzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRzZWN0aW9ucyBhcyAkc2VjdGlvbikgewoJ CSRmaWx0ZXJzW10gPSAiYW5kIFNlY3Rpb24gIT0gJyIuZG9TbGFzaCgkc2VjdGlvbikuIici OwoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVycyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQp IHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CglleHRyYWN0KCRhdHRzKTsKCgkkdGFnc193 ZWlnaHQgPSBhcnJheV9jb3VudF92YWx1ZXMoJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwoKCWZv cmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQlpZiAoIWluX2Fy cmF5KCR0YWcsICRhbGxfdGFncykKCQkgICB8fCAkdGFnc193ZWlnaHRbJHRhZ10gPCAkbWlu dGFnY291bnQKCQkgICB8fCAkdGFnc193ZWlnaHRbJHRhZ10gPiAkbWF4dGFnY291bnQpIHsK CQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsKCQl9Cgl9CgoJJHNvcnRfYnlfY291bnQg PSAoc3RycG9zKCRzb3J0LCAnY291bnQnKSAhPT0gZmFsc2UpOwoJJHNvcnRfYXNjZW5kaW5n ID0gKHN0cnBvcygkc29ydCwgJ2FzYycpICE9PSBmYWxzZSk7CgkkdGFnc193ZWlnaHQgPSB0 cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCAkc29ydF9ieV9jb3VudCwgJHNvcnRf YXNjZW5kaW5nKTsKCglpZiAoJGxpc3RsaW1pdCA+IDAgJiYgJGxpc3RsaW1pdCA8IGNvdW50 KCR0YWdzX3dlaWdodCkpIHsKCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5KCk7CgkJaWYgKCRr ZWVwID09ICdsYXJnZXN0JykgewoJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1 X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgdHJ1ZSwgZmFsc2UpKTsKCQl9IGVsc2Ug ewoJCQlpZiAoJGtlZXAgPT0gJ3JhbmRvbScpIHsKCQkJCWZvcmVhY2ggKCR0YWdzX3dlaWdo dCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQkJCQkkcmVzb3J0ZWRfdGFnc1skdGFnXSA9IHJh bmQoMCwgJHdlaWdodCk7CgkJCQl9CgkJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXMo dHJ1X3RhZ3Nfc29ydF90YWdzKCRyZXNvcnRlZF90YWdzLCB0cnVlLCBmYWxzZSkpOwoJCQl9 IGVsc2UgaWYgKCRrZWVwID09ICdhbHBoYScpIHsKCQkJCSRyZXNvcnRlZF90YWdzID0gYXJy YXlfa2V5cygkdGFnc193ZWlnaHQpOwoJCQkJbmF0Y2FzZXNvcnQoJHJlc29ydGVkX3RhZ3Mp OwoJCQl9CgkJCSRjdXRvZmYgPSAnZXhhY3QnOwoJCX0KCgkJJGxhc3RfZ29vZF9pbmRleCA9 ICRsaXN0bGltaXQgLSAxOwoJCWlmICgkY3V0b2ZmID09ICdjaHVuaycpIHsgLy9hbHRlcm5h dGl2ZSBpcyAnZXhhY3QnCgkJCSRsYXN0X3dlaWdodCA9IC0xOwoJCQlmb3IgKCRpID0gMDsg JGkgPCAkbGlzdGxpbWl0ICsgMTsgJGkrKykgewoJCQkJJG5ld193ZWlnaHQgPSAkdGFnc193 ZWlnaHRbJHJlc29ydGVkX3RhZ3NbJGldXTsKCQkJCWlmICgkbmV3X3dlaWdodCAhPSAkbGFz dF93ZWlnaHQpIHsKCQkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGkgLSAxOwoJCQkJCSRsYXN0 X3dlaWdodCA9ICRuZXdfd2VpZ2h0OwoJCQkJfQoJCQl9CgkJCWlmICgkbGFzdF9nb29kX2lu ZGV4IDwgMCkgewoJCQkJJGxhc3RfZ29vZF9pbmRleCA9ICRsaXN0bGltaXQgLSAxOwoJCQl9 CgkJfQoKCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2NodW5rKCRyZXNvcnRlZF90YWdzLCAk bGFzdF9nb29kX2luZGV4ICsgMSk7CgkJJHJlc29ydGVkX3RhZ3MgPSAkcmVzb3J0ZWRfdGFn c1swXTsKCgkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJ CQlpZiAoIWluX2FycmF5KCR0YWcsICRyZXNvcnRlZF90YWdzKSkgewoJCQkJdW5zZXQoJHRh Z3Nfd2VpZ2h0WyR0YWddKTsKCQkJfQoJCX0KCX0KCglpZiAoJGdlbmVyYXRlbGlua3MpIHsK CQlpZiAoJGxpbmtwYXRoKSB7CgkJCSR1cmxwcmVmaXggPSAkbGlua3BhdGg7CgkJCSR1cmxz dWZmaXggPSAkbGlua3BhdGh0YWlsOwoJCX0gZWxzZSB7CgkJCWlmICh0cnVfdGFnc19jbGVh bl91cmxzKCkpIHsKCQkJCSR1cmxwcmVmaXggPSBodSAuICR0cnVfdGFnc19wcmVmc1tUQUdf U0VDVElPTl0tPnZhbHVlIC4gJy8nOwoJCQl9IGVsc2UgewoJCQkJJHVybHByZWZpeCA9IGh1 IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcmYW1w OycgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPSc7CgkJCX0KCQkJ JHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVhbl91cmxzKCkgPyAnLycgOiAnJyk7CgkJfQoK CQlpZiAoJHVzZXJlbHRhZykgewoJCQlpZiAoJHVzZW5vZm9sbG93KSB7CgkJCQkkdXJsc3Vm Zml4IC49ICciIHJlbD0idGFnIG5vZm9sbG93JzsKCQkJfSBlbHNlIHsKCQkJCSR1cmxzdWZm aXggLj0gJyIgcmVsPSJ0YWcnOwoJCQl9CgkJfSBlbHNlIGlmICgkdXNlbm9mb2xsb3cpIHsK CQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9Im5vZm9sbG93JzsKCQl9Cgl9CgoJaWYgKGNvdW50 KCR0YWdzX3dlaWdodCkgPiAwKSB7CgkJJG1heCA9IG1heCgkdGFnc193ZWlnaHQpOwoJCSRt aW4gPSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCX0gZWxzZSB7CgkJJG1heCA9ICRtaW4gPSAwOwoJ fQoJJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8gMCA6ICgkbWF4cGVyY2VudCAtICRt aW5wZXJjZW50KSAvICgkbWF4IC0gJG1pbik7CgoJJHRhZ3NfaHRtbCA9IGFycmF5KCk7Cgkk dGFnX3NlYXJjaF90YWcgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCdzdHJpcGh5 cGhlbnMnID0+ICcxJykpOwoJJHRhZ19zZWFyY2hfdGFnID0gZnVuY3Rpb25fZXhpc3RzKCJo dG1sc3BlY2lhbGNoYXJzX2RlY29kZSIpID8gaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUoJHRh Z19zZWFyY2hfdGFnKSA6IGh0bWxfZW50aXR5X2RlY29kZSgkdGFnX3NlYXJjaF90YWcpOwoJ Zm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCSR0YWdfd2Vp Z2h0ID0gZmxvb3IoJG1pbnBlcmNlbnQgKyAoJHdlaWdodCAtICRtaW4pICogJHN0ZXB2YWx1 ZSk7CgoJCSRzdHlsZSA9ICcnOwoJCWlmICgkc2V0c2l6ZXMpCgkJCSRzdHlsZSA9ICcgc3R5 bGU9ImZvbnQtc2l6ZTogJyAuICR0YWdfd2VpZ2h0IC4gJyU7Iic7CgoJCSR0YWdfY2xhc3Mg PSAnJzsKCQlpZiAoJHNldGNsYXNzZXMpIHsKCQkJJHRhZ19jbGFzcyA9ICcgY2xhc3M9Iic7 CgkJCWlmICgkd2VpZ2h0ID09ICRtaW4pIHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVT bWFsbGVzdCI7CgkJCX0gZWxzZSBpZiAoJHdlaWdodCA9PSAkbWF4KSB7CgkJCQkkdGFnX2Ns YXNzIC49ICJ0YWdTaXplTGFyZ2VzdCI7CgkJCX0gZWxzZSB7CgkJCQkkdGFnX2NsYXNzIC49 ICJ0YWdTaXplTWVkaXVtIjsKCQkJfQoJCQkkdGFnX2NsYXNzIC49ICcgdGFnU2l6ZScgLiAo JHdlaWdodCArIDEgLSAkbWluKTsKCQkJaWYgKCR0YWcgPT0gJHRhZ19zZWFyY2hfdGFnKSB7 CgkJCQkkdGFnX2NsYXNzIC49ICcgJyAuICRhY3RpdmVjbGFzczsKCQkJfQoJCQkkdGFnX2Ns YXNzIC49ICciJzsKCQl9CgoJCS8vYWRhcHRlZCBmcm9tIGNvZGUgYnkgZ2R0cm9pYW5vLCBz ZWUgaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3BpZD0xMDI4 NzUjcDEwMjg3NQoJCSR0aXRsZWNvdW50ID0gJyc7CgkJaWYgKCR0aXRsZSkKCQkJJHRpdGxl Y291bnQgPSAnIHRpdGxlPSInIC4gJHRpdGxlIC4gJyInOwoJCSRkaXNwbGF5Y291bnQ9ICcn OwoJCSRjb3VudCA9ICRjb3VudHdyYXBjaGFyc3swfSAuICR3ZWlnaHQgLiAkY291bnR3cmFw Y2hhcnN7MX07CgkJaWYgKCRzaG93Y291bnRzID09ICd0aXRsZScgfHwgJHNob3djb3VudHMg PT0gJ2JvdGgnKQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAkY291 bnQgLiAnIic7CgkJaWYgKCRzaG93Y291bnRzICYmICRzaG93Y291bnRzICE9ICd0aXRsZScp CgkJCSRkaXNwbGF5Y291bnQgPSAnICcgLiAkY291bnQ7CgoJCWlmICgkdGV4dHRyYW5zZm9y bSA9PSAnY2FwaXRhbGl6ZScpIHsKCQkJJHRhZyA9IHVjd29yZHMoJHRhZyk7CgkJfSBlbHNl IGlmICgkdGV4dHRyYW5zZm9ybSA9PSAndXBwZXJjYXNlJykgewoJCQkkdGFnID0gc3RydG91 cHBlcigkdGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdsb3dlcmNhc2Un KSB7CgkJCSR0YWcgPSBzdHJ0b2xvd2VyKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFu c2Zvcm0gPT0gJ2NhcGZpcnN0JykgewoJCQkkdGFnID0gdWNmaXJzdCgkdGFnKTsKCQl9CgoJ CWlmICgkZ2VuZXJhdGVsaW5rcykgewoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJscHJlZml4 IC4gdXJsZW5jb2RlKHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4 IC4gJyInOwoJCQkkdGFnc19odG1sW10gPSAnPGEgaHJlZj0nIC4gJHdob2xldXJsIC4gJHRh Z19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFy cygkdGFnKSAuICc8L2E+JyAuICRkaXNwbGF5Y291bnQ7CgkJfSBlbHNlIGlmICgkdGFnX2Ns YXNzIHx8ICRzdHlsZSB8fCAkdGl0bGVjb3VudCkgewoJCQkkdGFnc19odG1sW10gPSAnPHNw YW4nIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNw ZWNpYWxjaGFycygkdGFnKSAuICc8L3NwYW4+JyAuICRkaXNwbGF5Y291bnQ7CgkJfSBlbHNl IHsKCQkJJHRhZ3NfaHRtbFtdID0gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICRkaXNwbGF5 Y291bnQ7CgkJfQoJfQoJcmV0dXJuIHRydV90YWdzX2RvX3dyYXAoJHRhZ3NfaHRtbCwgJHdy YXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgojIyMgQ0xFQU4gVVJM IEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAodHJ1X3Rh Z3NfY2xlYW5fdXJscygpKSB7CglyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfY2xlYW5f dXJsX2hhbmRsZXInLCAncHJldGV4dCcpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5f dXJsX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsK CSRzdWJwYXRoID0gcHJlZ19yZXBsYWNlKCIvaHR0cHM/OlwvXC8uKihcLy4qKS9VaSIsIiQx IixodSk7CgkkcmVnc2FmZXN1YnBhdGggPSBwcmVnX3F1b3RlKCRzdWJwYXRoLCAnLycpOwoJ JHJlcSA9IHByZWdfcmVwbGFjZSgiL14kcmVnc2FmZXN1YnBhdGgvaSIsJy8nLCRfU0VSVkVS WydSRVFVRVNUX1VSSSddKTsKCgkkcXMgPSBzdHJwb3MoJHJlcSwgJz8nKTsKCSRxYXR0cyA9 ICgkcXMgPyAnJicuc3Vic3RyKCRyZXEsICRxcyArIDEpIDogJycpOwoJaWYgKCRxcykgJHJl cSA9IHN1YnN0cigkcmVxLCAwLCAkcXMpOwoKCSRwYXJ0cyA9IGFycmF5X3ZhbHVlcyhhcnJh eV9maWx0ZXIoc3BsaXQoJy8nLCAkcmVxKSkpOwoJaWYgKGNvdW50KCRwYXJ0cykgPT0gMiAm JiAkcGFydHNbMF0gPT0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUpIHsK CQkkdGFnID0gJHBhcnRzWzFdOwoJCSRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSA9ICR0cnVf dGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSAuICc9JyAuICR0YWcgLiAkcWF0dHM7CgkJ JF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gPSAkc3VicGF0aCAuICR0cnVfdGFnc19wcmVmc1tU QUdfU0VDVElPTl0tPnZhbHVlIC4gJy8/JyAuICRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXTsK CQlpZiAoY291bnQoJF9QT1NUKSA+IDApIHsKCQkJJF9QT1NUWydzZWN0aW9uJ10gPSAkdHJ1 X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZTsKCQkJJF9QT1NUWyR0cnVfdGFnc19w cmVmc1tQQVJNX05BTUVdLT52YWx1ZV0gPSAkdGFnOwoJCX0gZWxzZSB7CgkJCSRfR0VUWydz ZWN0aW9uJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZTsKCQkJJF9H RVRbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7CgkJfQoJfQp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJscygpIHsKCWdsb2JhbCAkdHJ1X3RhZ3Nf cHJlZnM7CglyZXR1cm4gKCdjbGVhbicgPT0gJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNd LT52YWx1ZSk7Cn0KCgojIyMgQURNSU4gU0lERSBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMKCmlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpIHsKCWFk ZF9wcml2cygndHJ1X3RhZ3MnLCAnMSwyJyk7CglyZWdpc3Rlcl90YWIoJ2V4dGVuc2lvbnMn LCAndHJ1X3RhZ3MnLCAndHJ1X3RhZ3MnKTsKCXJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFn c19hZG1pbl90YWInLCAndHJ1X3RhZ3MnKTsKCglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1Nf SU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsKCQlyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3Nf YWRtaW5fd3JpdGVfdGFiX2hhbmRsZXInLCAnYXJ0aWNsZScpOwoJfQp9CgoKZnVuY3Rpb24g dHJ1X3RhZ3NfYWRtaW5fdGFiKCRldmVudCwgJHN0ZXApIHsKCXJlcXVpcmVfcHJpdnMoJ3Ry dV90YWdzJyk7CgoJJHJlc3VsdHMgPSB0cnVfdGFnc19hZG1pbl90YWJfaGFuZGxlX2lucHV0 KCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgp LCBmYWxzZSwgZmFsc2UpOwoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0 dHMpOwoJJGNsb3VkID0gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3Ms ICRhbGxfdGFncyk7CgoJJHJlZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7 CgoJdHJ1X3RhZ3NfYWRtaW5fdGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRy ZWRpcmVjdHMpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX3JlbmRlcl9wYWdl KCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpIHsKCWdsb2JhbCAkZXZlbnQ7CglwYWdl dG9wKCd0cnVfdGFncycsICcnKTsKCglpbmNsdWRlKHR4cGF0aCAuICcvaW5jbHVkZS90eHBf cHJlZnMucGhwJyk7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoKCWVjaG8gc3RhcnRUYWJs ZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItcmln aHQ6MnB4IHNvbGlkIGdyYXkiPicuICAjIEkga25vdywgSSBrbm93Li4uCgkJc3RhcnRUYWJs ZSgnbGF5b3V0JywgJycsICcnLCAnJywgJzEwcHgnKS4nPHRyPjx0ZCBzdHlsZT0iYm9yZGVy LWJvdHRvbToycHggc29saWQgZ3JheSI+Jy4KCQkJc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAn JywgJycsICczMDBweCcpLgoJCQkJdHIoaENlbGwoZ1R4dCgnQ3VycmVudCB0YWdzJykpKS4K CQkJCXRyKHRkKCRjbG91ZCkpLgoJCQllbmRUYWJsZSgpLgoJCSc8L3RkPjwvdHI+PHRyPjx0 ZD4nLgoJCQlzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4JykuCgkJCQl0 cihoQ2VsbChnVHh0KCd0cnVfdGFncyBSZWZlcmVuY2UnKSkpLgoJCQkJdHIodGQoJzxhIGhy ZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2Fn ZS1pbnN0cnVjdGlvbnMiPlVzYWdlIGluc3RydWN0aW9uczwvYT4nLgoJCQkJJzxicj48YSBo cmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MTUw ODQiPkZvcnVtIHBhZ2VzPC9hPicuCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cucmFp bnNraXQuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMiPlJlbGVhc2VzIHBh Z2U8L2E+Jy4KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVm ZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwIj5SZWxlYXNlIHJvYWRtYXA8L2E+Jy4KCQkJ CSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90 cnV0YWdzLWZlYXR1cmUtbGlzdCI+RmVhdHVyZSBsaXN0PC9hPicuCgkJCQknPGJyPjxicj48 YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdHJ1LXRhZ3Mvc291cmNlL2Jyb3dz ZS90cnVuay90cnVfdGFncy5waHAiPnRydV90YWdzIHNvdXJjZSBjb2RlPC9hPicuCgkJCQkn PGJyPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90cnUtdGFncy9zb3VyY2Uv YnJvd3NlL3RydW5rL3RydV90YWdzLWRvY3MuaHRtbCI+U291cmNlIEhUTUwgZm9yIHRoZSB1 c2FnZSBpbnN0cnVjdGlvbnM8L2E+Jy4KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHA6Ly93 d3cucmFpbnNraXQuY29tL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5nLXBsdWdpbi1mb3It dGV4dHBhdHRlcm4iPnRydV90YWdzPC9hPiwgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWlu c2tpdC5jb20vIj5OYXRoYW4gQXJ0aHVyPC9hPicuCgkJCQknPGJyPjxicj4nLgoJCQkJJzxk aXYgaWQ9InBheXBhbCI+PGZvcm0gYWN0aW9uPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2Nn aS1iaW4vd2Vic2NyIiBtZXRob2Q9InBvc3QiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9 ImNtZCIgdmFsdWU9Il9zLXhjbGljayIgLz48aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0 cHM6Ly93d3cucGF5cGFsLmNvbS9lbl9VUy9pL2J0bi94LWNsaWNrLWJ1dDA0LmdpZiIgbmFt ZT0ic3VibWl0IiBhbHQ9Ik1ha2UgYSBkb25hdGlvbiB0byBOYXRoYW4gQXJ0aHVyIiAvPjxp bWcgYWx0PSIiIGJvcmRlcj0iMCIgc3JjPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VT L2kvc2NyL3BpeGVsLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48aW5wdXQgdHlwZT0i aGlkZGVuIiBuYW1lPSJlbmNyeXB0ZWQiIHZhbHVlPSItLS0tLUJFR0lOIFBLQ1M3LS0tLS1N SUlIVHdZSktvWklodmNOQVFjRW9JSUhRRENDQnp3Q0FRRXhnZ0V3TUlJQkxBSUJBRENCbERD QmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3MU5i M1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1akxqRVRNQkVHQTFV RUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhjR2t4SERBYUJna3Fo a2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwQ0FRQXdEUVlKS29aSWh2Y05BUUVCQlFB RWdZQzhpMVQyN2xqS2ZwTlRFUWkwd0tIY2RHdWx4eGtNcXdkQ01tYkd2czg3bi80VHNKdGlB c3FNbzJoeXM3WnNHeTVSRi9PN3MrQjJvUTc2elVsVDUyV1c3UWVYVUszR3AwbnIyY1AzaW9C U3ROdStSWjZqa2FtMkUwRkdMWHlWNitVTlZFT3doOGxtb0lTUm90dlN2SWdReVRMbkVlREhx RzlxdlV6cXZGM1NxakVMTUFrR0JTc09Bd0lhQlFBd2djd0dDU3FHU0liM0RRRUhBVEFVQmdn cWhraUc5dzBEQndRSXBtUFpybHJaZlptQWdhaWVQVmIrbjlzVmRzdWZnR3JtQXcyclhBelIz OWtZcVBVSjduMExpTkRtZEFxNzNKb1A1M2taeThnU3BvdnVjTDJTMGpDMXNYcmNwRUxBcExM OEJGU0hmZExpWm9aU1YvQ1lPcHBINStkeDJZcUZJZHlDQ2RqSVg3b09QZ1F5QXVnUmEyUXIz Yit5dXR1RzBERnNkK0xBSkdiOGw0Q25ucmJtd2RZSzNOblZEQlBPbXhFT2psWFVnRXpsRkxY bUUzdzUrTW9QS1FjcDJuOGZkSkxzZ0cxNXhvVlBGekNkL0syZ2dnT0hNSUlEZ3pDQ0F1eWdB d0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pB SkJnTlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURW UVFLRXd0UVlYbFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4 R0ExVUVBeFFJYkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhi QzVqYjIwd0hoY05NRFF3TWpFek1UQXhNekUxV2hjTk16VXdNakV6TVRBeE16RTFXakNCampF TE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVk R0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hR S2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5 dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjB3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kw QU1JR0pBb0dCQU1GSFR0MzhSTXhMWEp5TzJTbVMrTmRsNzJUN29LSjR1NHV3KzZhd250QUxX aDAzUGV3bUlKdXpiQUxTY3NUUzRzWm9TMWZLY2lCR29oMTFnSWZIenlsdmtkTmUvaEpsNjYv Ukdxcmo1ckZiMDhzQUFCTlR6RFRpcXFOcEplQnNZcy9jMmFpR296cHRYMlJsbkJrdEgrU1VO cEFhalc3MjROdjJXdmhpZjZzRkFnTUJBQUdqZ2U0d2dlc3dIUVlEVlIwT0JCWUVGSmFmZkx2 R2J4ZTlXVDlTMXdvYjdCRFdaSlJyTUlHN0JnTlZIU01FZ2JNd2diQ0FGSmFmZkx2R2J4ZTlX VDlTMXdvYjdCRFdaSlJyb1lHVXBJR1JNSUdPTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFV RUNCTUNRMEV4RmpBVUJnTlZCQWNURFUxdmRXNTBZV2x1SUZacFpYY3hGREFTQmdOVkJBb1RD MUJoZVZCaGJDQkpibU11TVJNd0VRWURWUVFMRkFwc2FYWmxYMk5sY25Sek1SRXdEd1lEVlFR REZBaHNhWFpsWDJGd2FURWNNQm9HQ1NxR1NJYjNEUUVKQVJZTmNtVkFjR0Y1Y0dGc0xtTnZi WUlCQURBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBSUZmT2xh YWdGcmw3MStqcTZPS2lkYldGU0UrUTRGcVJPdmRnSU9OdGgrOGtTSy8vWS80aWh1RTRZbXZ6 bjVjZUUzUy9pQlNRUU1qeXZiK3MyVFdiUVlEd2NwMTI5T1BJYkQ5ZXBkcjR0Sk9VTmlTb2p3 N0JId1lSaVBoNThTMXhHbEZnSEZYd3JFQmIzZGdOYk1VYSt1NHFlY3RzTUFYcFZIbkQ5d0l5 Zm1ITVlJQm1qQ0NBWllDQVFFd2daUXdnWTR4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFR SUV3SkRRVEVXTUJRR0ExVUVCeE1OVFc5MWJuUmhhVzRnVm1sbGR6RVVNQklHQTFVRUNoTUxV R0Y1VUdGc0lFbHVZeTR4RXpBUkJnTlZCQXNVQ214cGRtVmZZMlZ5ZEhNeEVUQVBCZ05WQkFN VUNHeHBkbVZmWVhCcE1Sd3dHZ1lKS29aSWh2Y05BUWtCRmcxeVpVQndZWGx3WVd3dVkyOXRB Z0VBTUFrR0JTc09Bd0lhQlFDZ1hUQVlCZ2txaGtpRzl3MEJDUU14Q3dZSktvWklodmNOQVFj Qk1Cd0dDU3FHU0liM0RRRUpCVEVQRncwd09EQTNNRE13TkRFME1USmFNQ01HQ1NxR1NJYjNE UUVKQkRFV0JCVDB0a2o0ZFpMZS9FNFF3YmliMjlYRWRIeEFZakFOQmdrcWhraUc5dzBCQVFF RkFBU0JnTDVKc1FIalE5U2c0WTNlRFdLRE8xNnIrdGZFejRSWUFEdCs2aDk4MWZrVkN4Zk5I RkR4b2ZEY3h5elJNWXI3eTk1Y2RuVmk0QU5Rd01VWTZ5Slc1am0vR0QxN3JqZ1N4Wk1FdnNB ZTZZY0NTTEs1WmFwQ3cxcWx5U3BQR1pCQTNNVHQ2T0Qrb3ZWb2EvMXY4Q05zRWNIcDdmNHRP eE9VU3c1UDRuSHlMUFdqLS0tLS1FTkQgUEtDUzctLS0tLSI+PC9mb3JtPjwvZGl2PicKCQkJ CSkpLgoJCQllbmRUYWJsZSgpLgoJCSc8L3RkPjwvdHI+Jy5lbmRUYWJsZSgpLgoJJzwvdGQ+ PHRkPicuCgkJc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRk IHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOwoK CQlpZiAoJHJlc3VsdHMpIHsKCQkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAn JywgJzEwMCUnKS4KCQkJCXRyKGhDZWxsKGdUeHQoJ1Jlc3VsdHMnKSkpLgoJCQkJdHIodGRh KCRyZXN1bHRzKSwgJyBzdHlsZT0iY29sb3I6cmVkIicpLgoJCQllbmRUYWJsZSgpOwoJCQll Y2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQg Z3JheSI+JzsKCQl9CgoKCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAn MTAwJScpLgoJCQl0cih0YWcoZ1R4dCgnQXJ0aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgn LmdUeHQoJ0Nhc2UgU2Vuc2l0aXZlJykuJyEpJywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4K CQkJdHIoCgkJCQlmb3JtKAoJCQkJCXRkYShnVHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxl PSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dCgnbWF0Y2h0 YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkYShnVHh0KCd0bycpLic6JywgJyBzdHlsZT0idmVy dGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcn LCAnJywgJzE1JykpLgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ3JlcGxhY2UnLCBnVHh0 KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJykpLAoJCQkJCScnLCAnIHZl cmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJwoJCQkJKQoJCQkpLgoJ CQl0cigKCQkJCWZvcm0oCgkJCQkJdGRhKGdUeHQoJ0RlbGV0ZScpLic6ICcsICcgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lucHV0KCdkZWxldGV0 YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkY3MoJycsIDIpLgoJCQkJCXRkKGZJbnB1dCgnc3Vi bWl0JywgJ2RlbGV0ZScsIGdUeHQoJ1J1bicpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3Rh Z3MnKSksCgkJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4g J1wnKSInCgkJCQkpCgkJCSkuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRy Pjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCgkJZWNobyBz dGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJdHIodGFnKGdUeHQo J1JlZGlyZWN0aW9ucycpLCAndGgnLCAnIGNvbHNwYW49IjQiJykpOwoJCQlmb3JlYWNoICgk cmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRyaWdodHRhZykgewoJCQkJZWNobyB0cigKCQkJ CQl0ZGEoaHJlZigkbGVmdHRhZywgdHJ1X3RhZ3NfbGlua2lmeV90YWcoJGxlZnR0YWcpKSwg JyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJCQkJCXRkYShodG1sc3BlY2lhbGNo YXJzKCc9PicpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiJykuCgkJCQkJdGRhKGhy ZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5raWZ5X3RhZygkcmlnaHR0YWcpKSwgJyBzdHls ZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJCQkJCXRkKCc8YSBocmVmPSJpbmRleC5waHA/ ZXZlbnQ9dHJ1X3RhZ3MmYW1wO2RlbGV0ZV9yZWRpcmVjdD0nLnVybGVuY29kZSgkbGVmdHRh ZykuJyIgIG9uY2xpY2s9InJldHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScp LidcJykiPkRlbGV0ZTwvYT4nKQoJCQkJKTsKCQkJfQoJCQllY2hvIHRyKAoJCQkJJzxmb3Jt IG5hbWU9InJlZGlyZWN0IiBpZD0icmVkaXJlY3QiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJp bmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MiIG9uc3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5n VHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4nLgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0 dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciInKS4KCQkJCQl0 ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlk ZGxlO3RleHQtYWxpZ246Y2VudGVyIicpLgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdyaWdodHRh ZycsICcnLCAnMTUnKSwgJyBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiJykuCgkJCQkJdGRh KCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAodmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1 cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1p dCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFs aWduOm1pZGRsZSInKS4KCQkJCQlmSW5wdXQoJ2hpZGRlbicsICdyZWRpcmVjdCcsICcxJyku CgkJCQknPC9mb3JtPicKCgkJCSkuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+ PHRyPjx0ZD4nOwoKCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnKS4KCQkJdHIodGFnKGdUeHQo J1ByZWZlcmVuY2VzJyksICd0aCcsICcgY29sc3Bhbj0iMiInKSkuCgkJCWZvcm0oCgkJCQl0 cigKCQkJCQl0ZGEoZ1R4dCgnVXNlIGNsZWFuIFVSTHMnKS4nICgnLmdUeHQoJ3NpdGUgZGVm YXVsdCBpcycpLicgJy4kdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPmRlZmF1bHRfdmFs dWUuJyk6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZChy YWRpb19saXN0KENMRUFOX1VSTFMsCgkJCQkJCQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVh bicpLCAnbWVzc3knPT5nVHh0KCdtZXNzeScpKSwKCQkJCQkJCSR0cnVfdGFnc19wcmVmc1tD TEVBTl9VUkxTXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdUYWcg c2VjdGlvbiBuYW1lJykuJyAoZGVmYXVsdCBpcyAiJy4kdHJ1X3RhZ3NfcHJlZnNbVEFHX1NF Q1RJT05dLT5kZWZhdWx0X3ZhbHVlLiciKTogJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246 bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5wdXQoVEFHX1NFQ1RJT04sICR0cnVfdGFnc19w cmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlLCAnMTUnKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0 ZGEoZ1R4dCgnVVJMIHBhcmFtZXRlciBmb3IgdGFnIHNlYXJjaCcpLicgKGRlZmF1bHQgaXMg IicuJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPmRlZmF1bHRfdmFsdWUuJyIpOiAnLgoJ CQkJCQknPGJyPih5b3Ugc2hvdWxkblwndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IHJlYWxs eSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyknLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjpt aWRkbGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dChQQVJNX05BTUUsICR0cnVfdGFnc19wcmVm c1tQQVJNX05BTUVdLT52YWx1ZSwgJzE1JykpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdU eHQoJ1B1dCB0YWdzIGludG8gUlNTL0F0b20gZmVlZHMsIGluICJDYXRlZ29yeSIgZWxlbWVu dHMnKS4KCQkJCQkJJzogPGJyPih5b3UgcHJvYmFibHkgd2FudCB0aGlzKScsICcgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5f RkVFRF9DQVRFR09SSUVTLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJ RVNdLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBs aXN0IHRvIHRoZSBib2R5IG9mIFJTUy9BdG9tIGZlZWRzLCAnLgoJCQkJCQknd2l0aCBsaW5r cywgYW5kIHdpdGggcmVsPSJ0YWciOjxicj5JZiB0aGlzIGlzIHR1cm5lZCBvbiwnLgoJCQkJ CQkneW91IGNhbiBkZWZpbmUgYSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19mZWVkX3Rh Z3MgJy4KCQkJCQkJJ3RoYXQgd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgdGFncyBpbiB0 aGUgZmVlZC4nLAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJ CQkJdGQoeWVzbm9SYWRpbyhUQUdTX0lOX0ZFRURfQk9EWSwgJHRydV90YWdzX3ByZWZzW1RB R1NfSU5fRkVFRF9CT0RZXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0 KCdTaG93IGEgY2xpY2thYmxlIGxpc3Qgb2YgdGFncyBvbiB0aGUgIldyaXRlIiBwYWdlJyku JzogJywKCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRk KHllc25vUmFkaW8oVEFHU19JTl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lO X1dSSVRFX1RBQl0tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZCgnJykuCgkJCQkJ dGRhKGZJbnB1dCgnc3VibWl0JywgJ3ByZWZzJywgZ1R4dCgnU2F2ZScpLCAncHVibGlzaCcp LmVJbnB1dCgndHJ1X3RhZ3MnKSwgJyBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCInKQoJCQkJ KSwKCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJyki JwoJCQkpLgoJCWVuZFRhYmxlKCkuJzwvdGQ+PC90cj4nLgoJCWVuZFRhYmxlKCk7CgoJZWNo byAnPC90ZD48L3RyPicuZW5kVGFibGUoKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWlu X3RhYl9oYW5kbGVfaW5wdXQoKSB7CglpZiAoZ3BzKCdwcmVmcycpKSB7CgkJcmV0dXJuIHRy dV90YWdzX2FkbWluX3VwZGF0ZV9wcmVmcygpOwoJfSBlbHNlIGlmIChncHMoJ2RlbGV0ZScp KSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWcoZ3BzKCdkZWxldGV0YWcn KSk7Cgl9IGVsc2UgaWYgKGdwcygncmVwbGFjZScpKSB7CgkJJHJlc3VsdCA9IHRydV90YWdz X2FkbWluX3JlcGxhY2VfdGFnKGdwcygnbWF0Y2h0YWcnKSwgZ3BzKCdyZXBsYWNldGFnJyks IGZhbHNlKTsKCQlyZXR1cm4gJHJlc3VsdCAuICc8YnI+JyAuIHRydV90YWdzX2FkbWluX3Jl ZGlyZWN0X3RhZyhncHMoJ21hdGNodGFnJyksIGdwcygncmVwbGFjZXRhZycpKTsKCX0gZWxz ZSBpZiAoZ3BzKCdyZWRpcmVjdCcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3JlZGly ZWN0X3RhZyhncHMoJ2xlZnR0YWcnKSwgZ3BzKCdyaWdodHRhZycpKTsKCX0gZWxzZSBpZiAo Z3BzKCdkZWxldGVfcmVkaXJlY3QnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9kZWxl dGVfcmVkaXJlY3QoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSk7Cgl9IGVsc2UgewoJCXJldHVy biAnJzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3VwZGF0ZV9wcmVmcygpIHsK CWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CgkkcmVzdWx0cyA9IGFycmF5KCk7Cglmb3JlYWNo ICgkdHJ1X3RhZ3NfcHJlZnMgYXMgJHByZWYpIHsKCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+ dmFsaWRhdGVfdmFsdWUoZ3BzKCRwcmVmLT5uYW1lKSk7CgkJaWYgKCR2YWxpZF92YWx1ZSAm JiAkdmFsaWRfdmFsdWUgPD4gZ3BzKCRwcmVmLT5uYW1lKSkgewoJCQlyZXR1cm4gJHZhbGlk X3ZhbHVlOyAgIyMjIHRoaXMgaXMgYSBzbmVha3kgd2F5IHRvIGhhbmRsZSB2YWxpZGF0aW9u IC0gc29ycnkgOykKCQl9CgkJaWYgKCR2YWxpZF92YWx1ZSA8PiAkcHJlZi0+dmFsdWUpIHsK CQkJaWYgKCR2YWxpZF92YWx1ZSA9PSAkcHJlZi0+ZGVmYXVsdF92YWx1ZSkgewoJCQkJJHJl c3VsdCA9IHRydV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsKCQkJfSBlbHNlIHsK CQkJCSRyZXN1bHQgPSB0cnVfdGFnc191cHNlcnRfcHJlZigkcHJlZi0+bmFtZSwgJHZhbGlk X3ZhbHVlKTsKCQkJfQoJCQlpZiAoJHJlc3VsdCkgewoJCQkJJHJlc3VsdHNbXSA9ICdVcGRh dGVkICcgLiAkcHJlZi0+bmFtZTsKCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92YWx1ZTsK CQkJfSBlbHNlIHsKCQkJCSRyZXN1bHRzW10gPSAnRXJyb3IgdXBkYXRpbmcgJyAuICRwcmVm LT5uYW1lOwoJCQl9CgkJfQoJfQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAwKSB7CgkJcmV0 dXJuICdObyByZWNvcmRzIG5lZWQgdXBkYXRpbmcnOwoJfSBlbHNlIHsKCQlyZXR1cm4gam9p bignPGJyPicsICRyZXN1bHRzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3Vwc2VydF9w cmVmKCRuYW1lLCAkdmFsdWUpIHsKCWlmICghc2FmZV9xdWVyeSgnY3JlYXRlIHRhYmxlIGlm IG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpLgoJCScgKG5hbWUg dmFyY2hhcigyNTUpIHByaW1hcnkga2V5LCAnLgoJCSd2YWx1ZSB2YXJjaGFyKDI1NSkgbm90 IG51bGwpJykpIHsKCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRl IHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykgLiAnIHRhYmxlLic7Cgl9CgoJ cmV0dXJuIHNhZmVfdXBzZXJ0KCd0cnVfdGFnc19wcmVmcycsICd2YWx1ZT0iJy4kdmFsdWUu JyInLCAnbmFtZT0iJy4kbmFtZS4nIicpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZGVsZXRl X3ByZWYoJG5hbWUpIHsKCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcHJlZnMnLCAnbmFt ZT0iJy4kbmFtZS4nIicpKSB7CgkJaWYgKHNhZmVfY291bnQoJ3RydV90YWdzX3ByZWZzJywg JzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1 X3RhZ3NfcHJlZnMnKSkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsK CX0gZWxzZSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRt aW5fZGVsZXRlX3RhZygkZGVsZXRldGFnKSB7CglpZiAodHJpbSgkZGVsZXRldGFnKSkgewoJ CXJldHVybiB0cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1 ZSk7Cgl9IGVsc2UgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUnOwoJfQp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoJG1hdGNodGFnLCAkcmVwbGFj ZXRhZywgJGFsbG93X2JsYW5rX3JlcGxhY2V0YWcpIHsKCSRtYXRjaHRhZyA9IHRyaW0oJG1h dGNodGFnKTsKCSRyZXBsYWNldGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7CglpZiAoJG1hdGNo dGFnICYmICgkYWxsb3dfYmxhbmtfcmVwbGFjZXRhZyB8fCAkcmVwbGFjZXRhZykpIHsKCQlp ZiAoc2FmZV91cGRhdGUoJ3RleHRwYXR0ZXJuJywgVFJVX1RBR1NfRklFTEQuJz10cmltKGJv dGggXCcsXCcgZnJvbSByZXBsYWNlKGNvbmNhdCgiLCIsICcuVFJVX1RBR1NfRklFTEQuJywg IiwiKSwgY29uY2F0KCIsIiwgXCcnLmFkZHNsYXNoZXMoJG1hdGNodGFnKS4nXCcsICIsIiks IFwnLCcuYWRkc2xhc2hlcygkcmVwbGFjZXRhZykuJyxcJykpJywgJzEnKSkgewoJCQlyZXR1 cm4gJ1VwZGF0ZWQgJy5teXNxbF9hZmZlY3RlZF9yb3dzKCkuJyByb3dzICgiJy5odG1sc3Bl Y2lhbGNoYXJzKCRtYXRjaHRhZykuJyI9PiInLmh0bWxzcGVjaWFsY2hhcnMoJHJlcGxhY2V0 YWcpLiciKSc7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICdFcnJvcjogJyAuIG15c3FsX2Vycm9y KCk7CgkJfQoJfSBlbHNlIHsKCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGluIGJv dGggZmllbGRzJzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3Rh ZygkbGVmdHRhZywgJHJpZ2h0dGFnKSB7CgkkbGVmdHRhZyA9IGFkZHNsYXNoZXModHJ1X3Rh Z3Nfc3RydG9sb3dlcih0cmltKCRsZWZ0dGFnKSkpOwoJJHJpZ2h0dGFnID0gYWRkc2xhc2hl cyh0cnVfdGFnc19zdHJ0b2xvd2VyKHRyaW0oJHJpZ2h0dGFnKSkpOwoJaWYgKCEkbGVmdHRh ZyB8fCAhJHJpZ2h0dGFnKSB7CgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBpbiBi b3RoIGZpZWxkcyc7Cgl9CgoJaWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUgdGFibGUgaWYgbm90 IGV4aXN0cyAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpLgoJCScgKGxlZnR0 YWcgdmFyY2hhcigyNTUpIHByaW1hcnkga2V5LCAnLgoJCSdyaWdodHRhZyB2YXJjaGFyKDI1 NSkgbm90IG51bGwpJykpIHsKCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8g Y3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpIC4gJyB0YWJs ZS4nOwoJfQoKCWlmIChzYWZlX2luc2VydCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJ2xlZnR0 YWc9IicuJGxlZnR0YWcuJyIscmlnaHR0YWc9IicuJHJpZ2h0dGFnLiciJykpIHsKCQlyZXR1 cm4gJ1JlZGlyZWN0IGFkZGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIj0+ IicuaHRtbHNwZWNpYWxjaGFycygkcmlnaHR0YWcpLiciKSAtIHBsZWFzZSB0ZXN0IGl0ISc7 Cgl9IGVsc2UgewoJCXJldHVybiAnRXJyb3IgYWRkaW5nIHJlY29yZCAtIGRvZXMgaXQgYWxy ZWFkeSBleGlzdD8nOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3Jl ZGlyZWN0KCRsZWZ0dGFnKSB7CglpZiAoc2FmZV9kZWxldGUoJ3RydV90YWdzX3JlZGlyZWN0 cycsICdsZWZ0dGFnPSInLmFkZHNsYXNoZXMoJGxlZnR0YWcpLiciJykpIHsKCQlpZiAoc2Fm ZV9jb3VudCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5 KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykpKSB7CgkJ CXJldHVybiAnUmVkaXJlY3QgZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBkcm9wIHRhYmxlICcg LiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJyk7CgkJfQoJCXJldHVybiAnUmVkaXJl Y3QgZGVsZXRlZCAoIicuaHRtbHNwZWNpYWxjaGFycygkbGVmdHRhZykuJyIpJzsKCX0gZWxz ZSB7CgkJcmV0dXJuICdFcnJvciBkZWxldGluZyByZWRpcmVjdCc7Cgl9Cn0KCgpmdW5jdGlv biB0cnVfdGFnc19hZG1pbl93cml0ZV90YWJfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7Cgkk YXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIHRydWUs IHRydWUpOwoJJGF0dHNbJ3RpbWUnXSA9ICdhbnknOwoJJGNsb3VkID0gYXJyYXlfdW5pcXVl KHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7Cglzb3J0KCRjbG91ZCk7CgoJJGlkID0g KGVtcHR5KCRHTE9CQUxTWydJRCddKSA/IGdwcygnSUQnKSA6ICRHTE9CQUxTWydJRCddKTsK CSRhcnRpY2xlX3RhZ3MgPSAoZW1wdHkoJGlkKSA/IGFycmF5KCkgOiB0cnVfdGFnc19nZXRf dGFnc19mb3JfYXJ0aWNsZSgkaWQpKTsKCgkkbGlua3MgPSBhcnJheSgpOwoJZm9yZWFjaCAo JGNsb3VkIGFzICR0YWcpIHsKCQkkc3R5bGUgPSAoaW5fYXJyYXkoJHRhZywgJGFydGljbGVf dGFncykgPyAnIGNsYXNzPSJ0YWdfY2hvc2VuIicgOiAnJyk7CgkJJGxpbmtzW10gPSAnPGEg aHJlZj0iI2FkdmFuY2VkIicuJHN0eWxlLicgb25jbGljaz0idGhpcy5zZXRBdHRyaWJ1dGUo XFxcJ2NsYXNzXFxcJywgdG9nZ2xlVGFnKFxcXCcnLmFkZHNsYXNoZXMoYWRkc2xhc2hlcygk dGFnKSkuJ1xcXCcpKTsgcmV0dXJuIGZhbHNlOyI+JyAuIGFkZHNsYXNoZXMoaHRtbHNwZWNp YWxjaGFycygkdGFnKSkgLiAnPFwvYT4nOwoJfQoJJHRvX2luc2VydCA9IGpvaW4oJywgJywg JGxpbmtzKTsKCSR0b19pbnNlcnQgPSAiPHN0eWxlPmEudGFnX2Nob3NlbntiYWNrZ3JvdW5k LWNvbG9yOiAjRkVCOyBjb2xvcjogYmxhY2s7fTwvc3R5bGU+IiAuICR0b19pbnNlcnQ7CgoJ JGpzID0gPDw8RU9GCgkJdmFyIGtleXdvcmRzRmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCgna2V5d29yZHMnKTsKCQl2YXIgcGFyZW50ID0ga2V5d29yZHNGaWVsZC5wYXJlbnRO b2RlOwoJCXBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicp KTsKCQl2YXIgY2xvdWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CgkJY2xv dWQuc2V0QXR0cmlidXRlKCdjbGFzcycsICd0cnVfdGFnc19hZG1pbl90YWdzJyk7CgkJY2xv dWQuaW5uZXJIVE1MID0gJ3skdG9faW5zZXJ0fSc7CgkJcGFyZW50LmFwcGVuZENoaWxkKGNs b3VkKTsKCgkJZnVuY3Rpb24gdG9nZ2xlVGFnKHRhZ05hbWUpIHsKCQkJdmFyIHJlZ2V4VGFn ID0gdGFnTmFtZS5yZXBsYWNlKC8oW1xcXFxcXlxcJCorW1xcXT97fS49IToofCldKS9nLCJc XFxcJDEiKTsKCQkJdmFyIHRhZ1JlZ2V4ID0gbmV3IFJlZ0V4cCgiKChefCwpXFxccyopIiAr IHJlZ2V4VGFnICsgIlxcXHMqKCxcXFxzKnwkKSIpOwoJCQl2YXIgdGV4dGFyZWEgPSBkb2N1 bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsKCQkJdmFyIGN1cnZhbCA9IHRleHRh cmVhLnZhbHVlLnJlcGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJaWYgKCcnID09IGN1cnZhbCkg ewoJCQkJdGV4dGFyZWEudmFsdWUgPSB0YWdOYW1lOwoJCQl9IGVsc2UgaWYgKGN1cnZhbC5t YXRjaCh0YWdSZWdleCkpIHsKCQkJCXRleHRhcmVhLnZhbHVlID0gY3VydmFsLnJlcGxhY2Uo dGFnUmVnZXgsICckMScpLnJlcGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJCXJldHVybiAnJzsK CQkJfSBlbHNlIGlmICgnLCcgPT0gY3VydmFsLmNoYXJBdChjdXJ2YWwubGVuZ3RoIC0gMSkp IHsKCQkJCXRleHRhcmVhLnZhbHVlICs9ICcgJyArIHRhZ05hbWU7CgkJCX0gZWxzZSB7CgkJ CQl0ZXh0YXJlYS52YWx1ZSArPSAnLCAnICsgdGFnTmFtZTsKCQkJfQoJCQlyZXR1cm4gJ3Rh Z19jaG9zZW4nOwoJCX0KRU9GOwoKCWVjaG8gc2NyaXB0X2pzKCRqcyk7Cn0KCgojIyMgQVRP TS9SU1MgRkVFRCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKCnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19hdG9tX2hhbmRsZXInLCAnYXRvbV9l bnRyeScpOwpmdW5jdGlvbiB0cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkg eyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKHRydWUpOyB9CnJlZ2lzdGVyX2NhbGxi YWNrKCd0cnVfdGFnc19yc3NfaGFuZGxlcicsICdyc3NfZW50cnknKTsKZnVuY3Rpb24gdHJ1 X3RhZ3NfcnNzX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVl ZF9oYW5kbGVyKGZhbHNlKTsgfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKCRh dG9tKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdHJ1X3RhZ3NfcHJlZnM7CglleHRyYWN0 KCR0aGlzYXJ0aWNsZSk7CgoJJHRhZ3MgPSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNs ZSgkdGhpc2lkKTsKCglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXS0+ dmFsdWUpIHsKCQkkZXh0cmFib2R5ID0gJyc7CgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFnc19m ZWVkX3RhZ3MnOwoJCWlmIChmZXRjaCgnZm9ybScsICd0eHBfZm9ybScsICduYW1lJywgJEZP Uk1fTkFNRSkpIHsKCQkJJGZvcm0gPSBmZXRjaF9mb3JtKCRGT1JNX05BTUUpOwoJCQkkZXh0 cmFib2R5ID0gdHJpbShwYXJzZSgkZm9ybSkpOwoJCX0gZWxzZSB7CgkJCSRhdHRzID0gdHJ1 X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIHRydWUpOwoJ CQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0 dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7CgkJfQoJCWdsb2JhbCAkdGhpc2FydGljbGU7 CgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pKSB7CgkJCSR0aGlzYXJ0aWNs ZVsnZXhjZXJwdCddID0gdHJpbSgkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSkubi4kZXh0cmFi b2R5Lm47CgkJfQoJCSR0aGlzYXJ0aWNsZVsnYm9keSddID0gdHJpbSgkdGhpc2FydGljbGVb J2JvZHknXSkubi4kZXh0cmFib2R5Lm47Cgl9CgoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdT X0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSB7CgkJJG91dHB1dCA9IGFycmF5KCk7CgkJ Zm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykgewoJCQlpZiAoJGF0b20pIHsKCQkJCSRvdXRwdXRb XSA9ICc8Y2F0ZWdvcnkgdGVybT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnIiAv Pic7CgkJCX0gZWxzZSB7CgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5PicgLiBodG1sc3Bl Y2lhbGNoYXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsKCQkJfQoJCX0KCQlyZXR1cm4gbi5q b2luKG4sICRvdXRwdXQpLm47Cgl9Cn0KCgojIyMgUFJFRlMgRlVOQ1RJT05TIC8gQ0xBU1NF UyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjbGFzcyB0cnVfdGFn c19wcmVmIHsKCWZ1bmN0aW9uIHRydV90YWdzX3ByZWYoJG5hbWUsICRkZWZhdWx0X3ZhbHVl LCAkdHlwZSkgewoJCSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPnZhbHVlID0gJGRl ZmF1bHRfdmFsdWU7CgkJJHRoaXMtPmRlZmF1bHRfdmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsK CQkkdGhpcy0+dHlwZSA9ICR0eXBlOwoJfQoKCWZ1bmN0aW9uIHZhbGlkYXRlX3ZhbHVlKCR2 YWx1ZSkgewoJCWlmICgkdmFsdWUpIHsKCQkJcmV0dXJuICR2YWx1ZTsKCQl9IGVsc2UgaWYg KCR0aGlzLT50eXBlID09ICdib29sZWFuJykgewoJCQlyZXR1cm4gJzAnOwoJCX0gZWxzZSB7 CgkJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgZm9yICcgLiAkdGhpcy0+bmFtZTsK CQl9Cgl9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX2xvYWRfcHJlZnMoKSB7CgkkcHJlZnMgPSBh cnJheSgpOwoKCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsKCSRwcmVmc1tDTEVBTl9VUkxTXSA9 IG5ldyB0cnVfdGFnc19wcmVmKENMRUFOX1VSTFMsICgkcGVybWxpbmtfbW9kZSAhPSAnbWVz c3knID8gJ2NsZWFuJyA6ICdtZXNzeScpLCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHX1NFQ1RJ T05dID0gbmV3IHRydV90YWdzX3ByZWYoVEFHX1NFQ1RJT04sICd0YWcnLCAnc3RyaW5nJyk7 CgkkcHJlZnNbUEFSTV9OQU1FXSA9IG5ldyB0cnVfdGFnc19wcmVmKFBBUk1fTkFNRSwgJ3Qn LCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdID0gbmV3IHRy dV90YWdzX3ByZWYoVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMsICcxJywgJ2Jvb2xlYW4nKTsK CSRwcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lO X0ZFRURfQk9EWSwgJzAnLCAnYm9vbGVhbicpOwoJJHByZWZzW1RBR1NfSU5fV1JJVEVfVEFC XSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fV1JJVEVfVEFCLCAnMScsICdib29sZWFu Jyk7CgoJaWYgKG15c3FsX3F1ZXJ5KCJkZXNjcmliZSAiIC4gUEZYIC4gInRydV90YWdzX3By ZWZzIikpIHsKCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3NfcHJlZnMnLCAnMScp OwoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJCSRwcmVmc1skcm93WyduYW1lJ11dLT52 YWx1ZSA9ICRyb3dbJ3ZhbHVlJ107CgkJfQoJfQoKCXJldHVybiAkcHJlZnM7Cn0KCgojIyMg T1RIRVIgU1VQUE9SVCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0X2lmX25lZWRlZCgkdGFnX3BhcmFt ZXRlcikgewoJJHJlZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7Cglmb3Jl YWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRyaWdodHRhZykgewoJCWlmICgkbGVm dHRhZyA9PSAkdGFnX3BhcmFtZXRlciB8fCAkbGVmdHRhZyA9PSBzdHJfcmVwbGFjZSgnLScs ICcgJywgJHRhZ19wYXJhbWV0ZXIpKSB7CgkJCXRydV90YWdzX3JlZGlyZWN0KCRyaWdodHRh ZywgZmFsc2UpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKSB7CgkkcmVkaXJlY3RzID0gYXJy YXkoKTsKCWlmIChteXNxbF9xdWVyeSgiZGVzY3JpYmUgIiAuIFBGWCAuICJ0cnVfdGFnc19y ZWRpcmVjdHMiKSkgewoJCSRycyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19yZWRpcmVj dHMnLCAnMSBvcmRlciBieSBsZWZ0dGFnJyk7CgkJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsK CQkJJHJlZGlyZWN0c1skcm93WydsZWZ0dGFnJ11dID0gJHJvd1sncmlnaHR0YWcnXTsKCQl9 Cgl9CglyZXR1cm4gJHJlZGlyZWN0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0 KCRkZXN0aW5hdGlvbiwgJGlzX2Z1bGxfdXJsKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZz OwoJaWYgKCRpc19mdWxsX3VybCkgewoJCSR1cmwgPSAkZGVzdGluYXRpb247CgkJJG1lc3Nh Z2UgPSAnVGhlIHJlc291cmNlIHlvdSByZXF1ZXN0ZWQgaGFzIG1vdmVkIHRvICcgLiAkZGVz dGluYXRpb247Cgl9IGVsc2UgewoJCSR1cmwgPSB0cnVfdGFnc19saW5raWZ5X3RhZygkZGVz dGluYXRpb24sIGZhbHNlKTsKCQkkbWVzc2FnZSA9ICdUaGUgcmVxdWVzdGVkIHRhZyBoYXMg YmVlbiByZXBsYWNlZCBieSAnIC4gJGRlc3RpbmF0aW9uOwoJfQoKCWhlYWRlcignTG9jYXRp b246ICcgLiAkdXJsKTsKCXR4cF9kaWUoJG1lc3NhZ2UsICczMDEnKTsKfQoKCmZ1bmN0aW9u IHRydV90YWdzX2xpbmtpZnlfdGFnKCR0YWcsICR1c2VfYW1wID0gdHJ1ZSkgewoJZ2xvYmFs ICR0cnVfdGFnc19wcmVmczsKCWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCQkkdXJs cHJlZml4ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcv JzsKCX0gZWxzZSB7CgkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJl ZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICgkdXNlX2FtcCA/ICcmYW1wOycgOiAnJicpIC4g JHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0nOwoJfQoJJHVybHN1ZmZp eCA9ICh0cnVfdGFnc19jbGVhbl91cmxzKCkgPyAnLycgOiAnJyk7CglyZXR1cm4gJHVybHBy ZWZpeCAuIHVybGVuY29kZShzdHJfcmVwbGFjZSgnICcsICctJywgJHRhZykpIC4gJHVybHN1 ZmZpeDsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRhcnRp Y2xlSUQpIHsKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkkcnMgPSBzYWZlX3Jv dygkdGFnc19maWVsZCwgInRleHRwYXR0ZXJuIiwgIklEPSckYXJ0aWNsZUlEJyBBTkQgJHRh Z3NfZmllbGQgPD4gJyciKTsKCSRhbGxfdGFncyA9IGFycmF5KCk7CglpZiAoYXJyYXlfa2V5 X2V4aXN0cygkdGFnc19maWVsZCwgJHJzKSkgewoJCSRhbGxfdGFncyA9IGV4cGxvZGUoIiwi LCB0cmltKHRydV90YWdzX3N0cnRvbG93ZXIoJHJzWyR0YWdzX2ZpZWxkXSkpKTsKCX0KCgly ZXR1cm4gdHJ1X3RhZ3NfdHJpbV90YWdzKCRhbGxfdGFncyk7Cn0KCgojIGZpeGVzIGJ1ZyB3 aXRoIDQuMC40J3MgdmVyc2lvbiBvZiBkb1dyYXAgdGhhdCBjYXVzZWQgc3BhY2VzIHRvIHNo b3cgdXAgYmVmb3JlIHRoZSBjb21tYXMKZnVuY3Rpb24gdHJ1X3RhZ3NfZG9fd3JhcCgkbGlz dCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcykgewoJaWYgKCEkd3Jh cHRhZyAmJiAhcHJlZ19tYXRjaCgnL15cdyskLycsICRicmVhaykpIHsKCQlyZXR1cm4gam9p bigkYnJlYWsubiwgJGxpc3QpOwoJfSBlbHNlIHsKCQlyZXR1cm4gZG9XcmFwKCRsaXN0LCAk d3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsKCX0KfQoKCmZ1bmN0aW9u IHRydV90YWdzX3RyaW1fdGFncygkdGFnX2FycmF5KSB7CgkkdHJpbW1lZCA9IGFycmF5KCk7 Cglmb3JlYWNoICgkdGFnX2FycmF5IGFzICR0YWcpIHsKCQlpZiAoIiIgIT0gdHJpbSgkdGFn KSkgewoJCQkkdHJpbW1lZFtdID0gdHJpbSgkdGFnKTsKCQl9Cgl9CglyZXR1cm4gJHRyaW1t ZWQ7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFn X3BhcmFtZXRlcikgewoJJGtleXdvcmRzID0gZXhwbG9kZSgnLCcsICR0YWdfcGFyYW1ldGVy KTsKCWZvcmVhY2ggKCRrZXl3b3JkcyBhcyAka2V5d29yZCkgewoJCWlmIChzdHJwb3MoJGtl eXdvcmQsICctJykgIT09IGZhbHNlKSB7CgkJCSRrZXl3b3Jkc1tdID0gc3RyX3JlcGxhY2Uo Jy0nLCAnICcsICRrZXl3b3JkKTsKCQl9Cgl9CgkkYXR0c1sna2V5d29yZHMnXSA9IGltcGxv ZGUoJywnLCAka2V5d29yZHMpOwoKCWlmIChpc3NldCgkYXR0c1snc2VjdGlvbiddKSAmJiBz dHJwb3MoJGF0dHNbJ3NlY3Rpb24nXSwgJywnKSAhPT0gZmFsc2UpIHsKCQkkYXR0c1snc2Vj dGlvbiddID0gJyc7Cgl9CgoJaWYgKGlzc2V0KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkg ewoJCXVuc2V0KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKTsKCX0KCglpZiAoaXNzZXQoJGF0 dHNbJ25vYXJ0aWNsZXMnXSkpIHsKCQl1bnNldCgkYXR0c1snbm9hcnRpY2xlcyddKTsKCX0K CglpZiAoIWlzc2V0KCRhdHRzWydsaW1pdCddKSkgewoJCSRhdHRzWydsaW1pdCddID0gJzEw MDAnOwoJfQoKCWlmICghaXNzZXQoJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSkpIHsKCQkkYXR0 c1snYWxsb3dvdmVycmlkZSddID0gdHJ1ZTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ3NlYXJj aGZvcm0nXSkgJiYgIWlzc2V0KCRhdHRzWydsaXN0Zm9ybSddKSkgewoJCSRhdHRzWydsaXN0 Zm9ybSddID0gJGF0dHNbJ3NlYXJjaGZvcm0nXTsKCX0KCglyZXR1cm4gJGF0dHM7Cn0KCgpm dW5jdGlvbiB0cnVfdGFnc19zdHJ0b2xvd2VyKCRzdHIpIHsKCWlmIChmdW5jdGlvbl9leGlz dHMoIm1iX3N0cnRvbG93ZXIiKSkgewoJCXJldHVybiBtYl9zdHJ0b2xvd2VyKCRzdHIsICJV VEYtOCIpOwoJfSBlbHNlIHsKCQlyZXR1cm4gc3RydG9sb3dlcigkc3RyKTsKCX0KfQoKCi8v dGhlc2UgbmV4dCB0d28gZnVuY3Rpb25zIGFyZSBncm9zcywgYnV0IEkgY2FuJ3QgZmlndXJl IG91dCBhbm90aGVyIHdheSB0byBkbyBpdApmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3Mo JHRhZ3Nfd2VpZ2h0LCAkc29ydF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKSB7CglnbG9i YWwgJHRydV90YWdzX3RhZ3Nfd2VpZ2h0LCAkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmc7CgoJ JHRydV90YWdzX3RhZ3Nfd2VpZ2h0ID0gJHRhZ3Nfd2VpZ2h0OwoJJHRydV90YWdzX3NvcnRf YXNjZW5kaW5nID0gJHNvcnRfYXNjZW5kaW5nOwoKCSR0ZW1wX2FycmF5ID0gYXJyYXlfa2V5 cygkdGFnc193ZWlnaHQpOwoJaWYgKCRzb3J0X2J5X2NvdW50KSB7CgkJdXNvcnQoJHRlbXBf YXJyYXksICJ0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvciIpOwoJfSBlbHNlIHsKCQlu YXRjYXNlc29ydCgkdGVtcF9hcnJheSk7CgkJJHRlbXBfYXJyYXkgPSBhcnJheV92YWx1ZXMo JHRlbXBfYXJyYXkpOwoJfQoKCSRzb3J0ZWRfYXJyYXkgPSBhcnJheSgpOwoJZm9yZWFjaCAo JHRlbXBfYXJyYXkgYXMgJHRhZykgewoJCSRzb3J0ZWRfYXJyYXlbJHRhZ10gPSAkdGFnc193 ZWlnaHRbJHRhZ107Cgl9CgoJcmV0dXJuICRzb3J0ZWRfYXJyYXk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvcigkbGVmdCwgJHJpZ2h0KSB7CglnbG9iYWwg JHRydV90YWdzX3RhZ3Nfd2VpZ2h0LCAkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmc7CgoJJGxl ZnRfd2VpZ2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRsZWZ0XTsKCSRyaWdodF93ZWln aHQgPSAkdHJ1X3RhZ3NfdGFnc193ZWlnaHRbJHJpZ2h0XTsKCWlmICgkbGVmdF93ZWlnaHQg PT0gJHJpZ2h0X3dlaWdodCkgewoJCSR0ZW1wX2FycmF5ID0gYXJyYXkoJGxlZnQsICRyaWdo dCk7CgkJbmF0Y2FzZXNvcnQoJHRlbXBfYXJyYXkpOwoJCSR0ZW1wX2FycmF5ID0gYXJyYXlf dmFsdWVzKCR0ZW1wX2FycmF5KTsKCQlyZXR1cm4gKCR0ZW1wX2FycmF5WzBdID09ICRsZWZ0 ID8gLTEgOiAxKTsKCX0gZWxzZSBpZiAoJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nKSB7CgkJ cmV0dXJuICRsZWZ0X3dlaWdodCAtICRyaWdodF93ZWlnaHQ7Cgl9IGVsc2UgewoJCXJldHVy biAkcmlnaHRfd2VpZ2h0IC0gJGxlZnRfd2VpZ2h0OwoJfQp9CgoKCiMjIyBCQVNUQVJEIEZV TkNUSU9OUyBUSEFUIFNIT1VMRE4nVCBIQVZFIFRPIEVYSVNUICMjIwojIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgpmdW5jdGlvbiB0 cnVfdGFnc19yZWRvX2FydGljbGVfc2VhcmNoKCRhdHRzKSB7CgkkdGhlQXR0cyA9IGxBdHRz KGFycmF5KCdsaW1pdCcgICAgID0+IDEwMDAsCgkJCQknY2F0ZWdvcnknICA9PiAnJywKCQkJ CSdzZWN0aW9uJyAgID0+ICcnLAoJCQkJJ2V4Y2VycHRlZCcgPT4gJycsCgkJCQknYXV0aG9y JyAgICA9PiAnJywKCQkJCSdzb3J0YnknICAgID0+ICdQb3N0ZWQnLAoJCQkJJ3NvcnRkaXIn ICAgPT4gJ2Rlc2MnLAoJCQkJJ21vbnRoJyAgICAgPT4gJycsCgkJCQkna2V5d29yZHMnICA9 PiAnJywKCQkJCSdmcm9udHBhZ2UnID0+ICcnLAoJCQkJJ2lkJyAgICAgICAgPT4gJycsCgkJ CQkndGltZScgICAgICA9PiAncGFzdCcsCgkJCQknc3RhdHVzJyAgICA9PiAnNCcsCgkJCQkn b2Zmc2V0JyAgICA9PiAwCgkJCSksJGF0dHMsIDApOwoJZXh0cmFjdCgkdGhlQXR0cyk7CgoJ Ly9CdWlsZGluZyBxdWVyeSBwYXJ0cwoJJGZyb250cGFnZSA9ICgkZnJvbnRwYWdlKSA/IGZp bHRlckZyb250UGFnZSgpIDogJyc7CgkkY2F0ZWdvcnkgID0gKCEkY2F0ZWdvcnkpICA/ICcn IDogIiBhbmQgKChDYXRlZ29yeTE9JyIuZG9zbGFzaCgkY2F0ZWdvcnkpLiInKSBvciAoQ2F0 ZWdvcnkyPSciLmRvU2xhc2goJGNhdGVnb3J5KS4iJykpICI7Cgkkc2VjdGlvbiAgID0gKCEk c2VjdGlvbikgICA/ICcnIDogIiBhbmQgU2VjdGlvbiA9ICciLmRvc2xhc2goJHNlY3Rpb24p LiInIjsKCSRleGNlcnB0ZWQgPSAoJGV4Y2VycHRlZD09J3knKSAgPyAiIGFuZCBFeGNlcnB0 ICE9JyciIDogJyc7CgkkYXV0aG9yICAgID0gKCEkYXV0aG9yKSAgICA/ICcnIDogIiBhbmQg QXV0aG9ySUQgPSAnIi5kb3NsYXNoKCRhdXRob3IpLiInIjsKCSRtb250aCAgICAgPSAoISRt b250aCkgICAgID8gJycgOiAiIGFuZCBQb3N0ZWQgbGlrZSAnIi5kb1NsYXNoKCRtb250aCku IiUnIjsKCSRpZCAgICAgICAgPSAoISRpZCkgICAgICAgID8gJycgOiAiIGFuZCBJRCA9ICci LmludHZhbCgkaWQpLiInIjsKCXN3aXRjaCAoJHRpbWUpIHsKCQljYXNlICdhbnknOgoJCQkk dGltZSA9ICIiOyBicmVhazsKCQljYXNlICdmdXR1cmUnOgoJCQkkdGltZSA9ICIgYW5kIFBv c3RlZCA+IG5vdygpIjsgYnJlYWs7CgkJZGVmYXVsdDoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0 ZWQgPCBub3coKSI7Cgl9CglpZiAoIWlzX251bWVyaWMoJHN0YXR1cykpCgkJJHN0YXR1cyA9 IGdldFN0YXR1c051bSgkc3RhdHVzKTsKCgkkY3VzdG9tID0gJyc7CgkvLyB0cnlpbmcgY3Vz dG9tIGZpZWxkcyBoZXJlCgkkY3VzdG9tRmllbGRzID0gZ2V0Q3VzdG9tRmllbGRzKCk7Cglp ZiAoJGN1c3RvbUZpZWxkcykgewoJCWZvcmVhY2goJGN1c3RvbUZpZWxkcyBhcyAkY0ZpZWxk KSB7CgkJCWlmIChpc3NldCgkYXR0c1skY0ZpZWxkXSkpCgkJCQkkY3VzdG9tUGFpcnNbJGNG aWVsZF0gPSAkYXR0c1skY0ZpZWxkXTsKCQl9CgkJaWYoIWVtcHR5KCRjdXN0b21QYWlycykp CgkJCSRjdXN0b20gPSAgYnVpbGRDdXN0b21TcWwoJGN1c3RvbUZpZWxkcywkY3VzdG9tUGFp cnMpOwoJCWVsc2UKCQkJJGN1c3RvbSA9ICcnOwoJfQoKCS8vQWxsb3cga2V5d29yZHMgZm9y IG5vLWN1c3RvbSBhcnRpY2xlcy4gVGhhdCB0YWdnaW5nIG1vZGUsIHlvdSBrbm93CglpZiAo JGtleXdvcmRzKSB7CgkJJGtleXMgPSBkb1NsYXNoKGFycmF5X21hcCgndHJpbScsIHNwbGl0 KCcsJywgJGtleXdvcmRzKSkpOwoJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKCQkJJGtl eXBhcnRzW10gPSAiRklORF9JTl9TRVQoJyIuJGtleS4iJyxLZXl3b3JkcykiOwoJCX0KCQkk a2V5d29yZHMgPSAiIGFuZCAoIiAuIGpvaW4oJyBvciAnLCRrZXlwYXJ0cykgLiAiKSI7Cgl9 CgoJaWYgKCRpZCkKCQkkc3RhdHVzcSA9ICIgYW5kIFN0YXR1cyA+PSAnNCciOwoJZWxzZQoJ CSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzPSciLmRvU2xhc2goJHN0YXR1cykuIiciOwoKCSR3 aGVyZSA9ICIxIiAuICRzdGF0dXNxLiAkdGltZS4KCQkkaWQgLiAkY2F0ZWdvcnkgLiAkc2Vj dGlvbiAuICRleGNlcnB0ZWQgLiAkbW9udGggLiAkYXV0aG9yIC4gJGtleXdvcmRzIC4gJGN1 c3RvbSAuICRmcm9udHBhZ2U7CgoJCSRwZ29mZnNldCA9ICRvZmZzZXQgLiAnLCAnOwoKCSRy cyA9IHNhZmVfcm93c19zdGFydCgiKiwgdW5peF90aW1lc3RhbXAoUG9zdGVkKSBhcyB1UG9z dGVkIiwgJ3RleHRwYXR0ZXJuJywKCQkkd2hlcmUuICcgb3JkZXIgYnkgJyAuIGRvc2xhc2go JHNvcnRieSkgLiAnICcgLiBkb1NsYXNoKCRzb3J0ZGlyKSAuICcgbGltaXQgJyAuIGRvU2xh c2goJGxpbWl0KSk7CgoJcmV0dXJuICRyczsKfQoKCiI7czo4OiJoZWxwX3JhdyI7czo5NDY6 IlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1X3RhZ3MsIGNoZWNrIG91dCB0aGUgImludHJvZHVj dG9yeSBhcnRpY2xlIjpodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9ibG9nLzQ5My90cnV0YWdz LWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuLCAicmVsZWFzZXMgcGFnZSI6aHR0 cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzUzNy90cnVfdGFncy1yZWxlYXNlcywg ImZlYXR1cmUgbGlzdCI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90 cnV0YWdzLWZlYXR1cmUtbGlzdCwgInJvYWRtYXAiOmh0dHA6Ly93d3cucmFpbnNraXQuY29t L3JlZmVyZW5jZS81NTQvdHJ1X3RhZ3Mtcm9hZG1hcCwgYW5kICJ1c2FnZSBpbnN0cnVjdGlv bnMiOmh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2Fn ZS1pbnN0cnVjdGlvbnMuCgpZb3UgY2FuIGFsc28gZmluZCB0aGUgc291cmNlIGNvZGUgYXQg Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90cnUtdGFncy8iOmh0dHA6Ly9jb2RlLmdvb2ds ZS5jb20vcC90cnUtdGFncy8uCgpJJ3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxwIG91dCBv ZiB0aGUgcGx1Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRp ZmZpY3VsdCB0byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRoZSBwbHVn aW4uICBJZiwgbXkgc2l0ZSBpcyBldmVyIGRvd24sIGhvd2V2ZXIsIHRoZSBzb3VyY2UgSFRN TCBvZiB0aGUgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGlzIGF2YWlsYWJsZSBhdCAiaHR0cDovL2Nv ZGUuZ29vZ2xlLmNvbS9wL3RydS10YWdzL3NvdXJjZS9icm93c2UvdHJ1bmsvdHJ1X3RhZ3Mt ZG9jcy5odG1sIjpodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdHJ1LXRhZ3Mvc291cmNlL2Jy b3dzZS90cnVuay90cnVfdGFncy1kb2NzLmh0bWwiO3M6MzoibWQ1IjtzOjMyOiJmZDZkZDlk ODc0MjQ4YmY0NGM0MDdkZWU5ZWMyYzNmMiI7fQ==