# tru_tags v2.2 # 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: # ...................................................................... YToxMTp7czoxNToiYWxsb3dfaHRtbF9oZWxwIjtpOjA7czo3OiJ2ZXJzaW9uIjtzOjM6IjIu MiI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjI6Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjE1 OiJBcnRpY2xlIHRhZ2dpbmciO3M6NDoidHlwZSI7aToxO3M6NDoibmFtZSI7czo4OiJ0cnVf dGFncyI7czo0OiJoZWxwIjtzOjU2ODoiCTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1X3Rh Z3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5n LXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPmludHJvZHVjdG9yeSBhcnRpY2xlPC9hPiwgPGEg aHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVs ZWFzZXMiPnJlbGVhc2VzIHBhZ2U8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5j b20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0PC9h PiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk3L3Ry dXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zIj51c2FnZSBpbnN0cnVjdGlvbnM8L2E+LjwvcD4K Cgk8cD5JJiM4MjE3O3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxwIG91dCBvZiB0aGUgcGx1 Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRpZmZpY3VsdCB0 byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRoZSBwbHVnaW4uPC9wPiI7 czo0OiJjb2RlIjtzOjIwNTA2OiIKI0NvcHlyaWdodCAyMDA3IE5hdGhhbiBBcnRodXIKI1Jl bGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIHNlZSBodHRwOi8vd3d3Lm9w ZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocCBmb3IgZGV0YWlscwojVGhp cyB3b3JrIGlzIGluc3BpcmVkIGJ5IHJhbl90YWdzIGJ5IFJhbiBBcm91c3NpLCBvcmlnaW5h bGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9hcnRpY2xlLzQ1L3RhZ2dpbmctdGV4 dHBhdHRlcm4KCgojIyMgQ09ORklHVVJBVElPTiAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMj CgojU2VlIGh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk3L3RydXRhZ3MtdXNh Z2UtaW5zdHJ1Y3Rpb25zIGZvciBpbnN0cnVjdGlvbnMKCiMgU3dpdGNoIHRoaXMgdG8gJzEn IHRvIGdldCBjbGVhbiB1cmwgc3VwcG9ydCBvciAnMCcgdG8gdHVybiBpdCBvZmYuCiMgSXQg d2lsbCBwcm9iYWJseSBmaWd1cmUgaXQgb3V0LCB0aG91Z2gsIHNvIHlvdSBzaG91bGRuJ3Qg aGF2ZSB0byBjaGFuZ2UgaXQuCmdsb2JhbCAkcGVybWxpbmtfbW9kZTsKZGVmaW5lKCdUUlVf VEFHU19VU0VfQ0xFQU5fVVJMUycsICRwZXJtbGlua19tb2RlICE9ICdtZXNzeScpOwoKIyBU aGlzIHRlbGxzIHRydV90YWdzIHdoaWNoIHNlY3Rpb24gdG8gdXNlIGZvciB0YWdzLgpkZWZp bmUoJ1RSVV9UQUdTX1NFQ1RJT04nLCAndGFnJyk7CgojIFRoaXMgdGVsbHMgdHJ1X3RhZ3Mg d2hhdCBhdHRyaWJ1dGUgbmFtZSB0byB1c2UgZm9yIHRhZyBzZWFyY2hlcy4KZGVmaW5lKCdU UlVfVEFHU19UQUdfUEFSQU1FVEVSX05BTUUnLCAndCcpOwoKIyBUaGlzIHRlbGxzIHRydV90 YWdzIHRvIHB1dCB0YWdzIGludG8gdGhlIFJTUyBhbmQgQXRvbSBmZWVkcywgaW4gJ0NhdGVn b3J5JyBlbGVtZW50cy4KIyBZb3UgcHJvYmFibHkgd2FudCB0aGlzLgpkZWZpbmUoJ1RSVV9U QUdTX0FERF9UQUdTX1RPX0ZFRURfWE1MJywgMSk7CgojIEJ5IGRlZmF1bHQsIHRoaXMgd2ls bCBhcHBlbmQgYSB0YWcgbGlzdCBsaWtlICJ0YWdzOiB0cmVlcywgZmxvd2VycywgYW5pbWFs cywgZXRjIgojICh3aXRoIGxpbmtzLCBhbmQgd2l0aCByZWw9InRhZyIpIHRvIHRoZSBib2R5 IG9mIFJTUy9BdG9tIGZlZWRzLiBJZiB5b3UgZGVmaW5lIGEKIyAnbWlzYycgZm9ybSBuYW1l ZCB0cnVfdGFnc19mZWVkX3RhZ3MsIHRydV90YWdzIHdpbGwgdXNlIHRoYXQgZm9ybSB0byBy ZW5kZXIgdGhlIHRhZ3MKIyBmb3IgdGhlIGZlZWQsIGluc3RlYWQuCmRlZmluZSgnVFJVX1RB R1NfQUREX1RBR1NfVE9fRkVFRF9CT0RZJywgMCk7CgojIFRoaXMgc2hvd3MgYSBsaXN0IG9m IGNsaWNrYWJsZSB0YWdzIGluIHRoZSBhZG1pbiBzaWRlIG9uIHRoZSAnV3JpdGUnIHBhZ2UK ZGVmaW5lKCdUUlVfVEFHU19TSE9XX1RBR1NfSU5fQURNSU4nLCAxKTsKCiMgQ2hhbmdpbmcg dGhpcyB3b24ndCBkbyBhbnkgZ29vZC4gIEl0J3MganVzdCBoZXJlIGFzIGEgY29udmVuaWVu Y2UgZm9yIGRldmVsb3BtZW50LgpkZWZpbmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRz Jyk7CgoKIyMjIFBSSU1BUlkgVEFHIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCSR0YWdf cGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7Cglp ZiAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgewoJCSRhdHRzID0gdHJ1X3RhZ3NfZml4dXBf cXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIpOwoJCXJldHVybiBkb0FydGljbGVz KCRhdHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBpbiBUWFAgY29kZQoJfSBlbHNlIHsKCQlyZXR1 cm4gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xv dWQoJGF0dHMpIHsKCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90YWdzX2dldF9zdGFuZGFy ZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsKfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2xpc3QoJGF0dHMpIHsKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3Vk X2F0dHMoJGF0dHMsIHRydWUsIGZhbHNlKTsKCSRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3Vk X3F1ZXJ5KCRhdHRzKTsKCglyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAk YWxsX3RhZ3MsICRhbGxfdGFncyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGlj bGUoJGF0dHMpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRyYWN0KCR0aGlzYXJ0aWNs ZSk7CgoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJHRoaXNp ZCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywg ZmFsc2UsIHRydWUpOwoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7CglpZiAo JGF0dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0g dHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJfQoKCXJldHVybiB0cnVfdGFnc19yZW5k ZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMsICR0aGluZykgewoJZ2xvYmFs ICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9 IFRSVV9UQUdTX0ZJRUxEOwoKCSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBh dHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJcmV0dXJu IHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19p Zl90YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpCnsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3Rh Z3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CgkkY29uZGl0aW9uID0gKCFlbXB0 eSgkdGFnX3BhcmFtZXRlcikpID8gdHJ1ZSA6IGZhbHNlOwoJcmV0dXJuIHBhcnNlKEV2YWxF bHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3Bh cmFtZXRlcigkYXR0cywgJHNhZmVodG1sID0gdHJ1ZSkKewoJZXh0cmFjdChsQXR0cyhhcnJh eSgnc3RyaXBoeXBoZW5zJyA9PiAwLCAndXJsZW5jb2RlJyA9PiAwKSwgICRhdHRzLCAwKSk7 CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3RyaXBfdGFncyhncHMoVFJVX1RBR1NfVEFHX1BBUkFN RVRFUl9OQU1FKSkpOwoJJHBhcm0gPSAoJHN0cmlwaHlwaGVucyA/IHN0cl9yZXBsYWNlKCct JywgJyAnLCAkcGFybSkgOiAkcGFybSk7CglpZiAoJHVybGVuY29kZSkgewoJCSRwYXJtID0g dXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkgewoJCSRwYXJtID0g aHRtbHNwZWNpYWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJuICRwYXJtOwp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpCnsKCXJldHVybiBzdHJpcF90YWdzKGdw cygncScpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbGF0ZWRfdGFnc19mcm9tX3NlYXJj aCgkYXR0cykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFy cmF5KCksIGZhbHNlKTsKCWlmICghZW1wdHkoJHRhZ19wYXJhbWV0ZXIpKSB7CgkgICAgICAg ICR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkJJGFsbF90YWdzID0gYXJyYXkoKTsK CgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFn X3BhcmFtZXRlcik7CgkJJHJzID0gdHJ1X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkcXVl cnlfYXR0cyk7CgkJaWYgKCRycykgewoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsK CQkJCSRhcnRpY2xlX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xv d2VyKCRhWyR0YWdzX2ZpZWxkXSkpKTsKCQkJCSRhbGxfdGFncyA9IGFycmF5X21lcmdlKCRh bGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90YWdzKCRhcnRpY2xlX3RhZ3MpKTsKCQkJfQoJCX0K CgkJJGFsdF90YWdfcGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFy YW1ldGVyKTsKCQlmb3JlYWNoICgkYWxsX3RhZ3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlm ICgkdGFnID09ICR0YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVy KSB7CgkJCQl1bnNldCgkYWxsX3RhZ3NbJGtleV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0 cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFs c2UpOwoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRf YXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0g dHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGNsb3VkX2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90 YWdzX3JlbmRlcl9jbG91ZCgkY2xvdWRfYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9y X3dlaWdodCk7Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQ T1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVu Y3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3Qs ICRpc0FydGljbGUpIHsKCXJldHVybiBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xp c3QgPyAndWwnIDogJycpLAoJCQknYnJlYWsnCQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAn KSwKCQkJJ2NsYXNzJwkJPT4gJycsCgkJCSdicmVha2NsYXNzJwk9PiAnJywKCQkJJ3NlY3Rp b24nCT0+ICcnLAoJCQknbWlucGVyY2VudCcJPT4gJzEwMCcsCgkJCSdtYXhwZXJjZW50Jwk9 PiAoJGlzTGlzdCB8fCAkaXNBcnRpY2xlID8gJzEwMCcgOiAnMjAwJyksCgkJCSdzaG93Y291 bnRzJwk9PiAnJywKCQkJJ2NvdW50d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkndXNlcmVsdGFn Jwk9PiAoJGlzQXJ0aWNsZSA/ICcxJyA6ICcnKSwKCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcx JywKCQkJJ21pbnRhZ2NvdW50Jwk9PiAnMCcsCgkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAn LAoJCQknc2V0c2l6ZXMnCT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwKCQkJJ3VzZW5v Zm9sbG93Jwk9PiAnJywKCQkJJ3NvcnQnCQk9PiAnYWxwaGEnLAoJCQkndXNlb3ZlcmFsbGNv dW50cycJPT4gJycsCgkJCSdzZXRjbGFzc2VzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcx JyksCgkJCSd0aXRsZScJCT0+ICcnLAoJCQknbGlzdGxpbWl0Jwk9PiAnJywKCQkJJ2tlZXAn CQk9PiAnbGFyZ2VzdCcsCgkJCSdjdXRvZmYnCT0+ICdjaHVuaycsCgkJCSd0ZXh0dHJhbnNm b3JtJwk9PiAnbm9uZScsCgkJCSdsaW5rcGF0aCcJPT4gJycsCgkJCSdsaW5rcGF0aHRhaWwn CT0+ICcnLAoJCQknZmlsdGVyc2VhcmNoJwk9PiAnMScsCgkJCSdleGNsdWRlc2VjdGlvbic9 PiAnJywKCQkJJ2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJwoJCSksJGF0dHMsIDApOwp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpIHsKCWV4dHJhY3QoJGF0 dHMpOwoKCSRzZWN0aW9uX2NsYXVzZSA9ICcnOwoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7CgkJ JGtleXMgPSBzcGxpdCgnLCcsICRzZWN0aW9uKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5 KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIici OwoJCX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5 cGFydHMpIC4gIikiOwoJfQoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CglpbmNs dWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsKCgkkZmlsdGVyID0gdHJ1 X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRleGNsdWRlc2VjdGlvbik7CgkkZmlsdGVyIC49ICgk ZmlsdGVyc2VhcmNoID8gZmlsdGVyU2VhcmNoKCkgOiAnJyk7CgoJJGFsbF90YWdzID0gYXJy YXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRlcm4iLCAi JHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRlciAuICIgYW5k IFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8IG5vdygpIik7Cglmb3JlYWNoICgkcnMgYXMg JHJvdykgewoJCSR0ZW1wX2FycmF5ID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3Ry dG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkpKTsKCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJn ZSgkYWxsX3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9hcnJheSkpOwoJfQoKCXJl dHVybiAkYWxsX3RhZ3M7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMo JGV4Y2x1ZGVzZWN0aW9uKSB7Cgkkc2VjdGlvbnMgPSBleHBsb2RlKCcsJywgJGV4Y2x1ZGVz ZWN0aW9uKTsKCSRmaWx0ZXJzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRzZWN0aW9ucyBhcyAk c2VjdGlvbikgewoJCSRmaWx0ZXJzW10gPSAiYW5kIFNlY3Rpb24gIT0gJyIuZG9TbGFzaCgk c2VjdGlvbikuIiciOwoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVycyk7Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdz X2Zvcl93ZWlnaHQpIHsKCWV4dHJhY3QoJGF0dHMpOwoKCSR0YWdzX3dlaWdodCA9IGFycmF5 X2NvdW50X3ZhbHVlcygkYWxsX3RhZ3NfZm9yX3dlaWdodCk7CgoJZm9yZWFjaCAoJHRhZ3Nf d2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCWlmICghaW5fYXJyYXkoJHRhZywgJGFs bF90YWdzKQoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA8ICRtaW50YWdjb3VudAoJCSAg IHx8ICR0YWdzX3dlaWdodFskdGFnXSA+ICRtYXh0YWdjb3VudCkgewoJCQl1bnNldCgkdGFn c193ZWlnaHRbJHRhZ10pOwoJCX0KCX0KCgkkc29ydF9ieV9jb3VudCA9IChzdHJwb3MoJHNv cnQsICdjb3VudCcpICE9PSBmYWxzZSk7Cgkkc29ydF9hc2NlbmRpbmcgPSAoc3RycG9zKCRz b3J0LCAnYXNjJykgIT09IGZhbHNlKTsKCSR0YWdzX3dlaWdodCA9IHRydV90YWdzX3NvcnRf dGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRpbmcpOwoK CWlmICgkbGlzdGxpbWl0ID4gMCAmJiAkbGlzdGxpbWl0IDwgY291bnQoJHRhZ3Nfd2VpZ2h0 KSkgewoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXkoKTsKCQlpZiAoJGtlZXAgPT0gJ2xhcmdl c3QnKSB7CgkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3Rh Z3MoJHRhZ3Nfd2VpZ2h0LCB0cnVlLCBmYWxzZSkpOwoJCX0gZWxzZSB7CgkJCWlmICgka2Vl cCA9PSAncmFuZG9tJykgewoJCQkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4g JHdlaWdodCkgewoJCQkJCSRyZXNvcnRlZF90YWdzWyR0YWddID0gcmFuZCgwLCAkd2VpZ2h0 KTsKCQkJCX0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0 X3RhZ3MoJHJlc29ydGVkX3RhZ3MsIHRydWUsIGZhbHNlKSk7CgkJCX0gZWxzZSBpZiAoJGtl ZXAgPT0gJ2FscGhhJykgewoJCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKCR0YWdz X3dlaWdodCk7CgkJCQluYXRjYXNlc29ydCgkcmVzb3J0ZWRfdGFncyk7CgkJCX0KCQkJJGN1 dG9mZiA9ICdleGFjdCc7CgkJfQoKCQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAt IDE7CgkJaWYgKCRjdXRvZmYgPT0gJ2NodW5rJykgeyAvL2FsdGVybmF0aXZlIGlzICdleGFj dCcKCQkJJGxhc3Rfd2VpZ2h0ID0gLTE7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRsaXN0bGlt aXQgKyAxOyAkaSsrKSB7CgkJCQkkbmV3X3dlaWdodCA9ICR0YWdzX3dlaWdodFskcmVzb3J0 ZWRfdGFnc1skaV1dOwoJCQkJaWYgKCRuZXdfd2VpZ2h0ICE9ICRsYXN0X3dlaWdodCkgewoJ CQkJCSRsYXN0X2dvb2RfaW5kZXggPSAkaSAtIDE7CgkJCQkJJGxhc3Rfd2VpZ2h0ID0gJG5l d193ZWlnaHQ7CgkJCQl9CgkJCX0KCQkJaWYgKCRsYXN0X2dvb2RfaW5kZXggPCAwKSB7CgkJ CQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAtIDE7CgkJCX0KCQl9CgoJCSRyZXNv cnRlZF90YWdzID0gYXJyYXlfY2h1bmsoJHJlc29ydGVkX3RhZ3MsICRsYXN0X2dvb2RfaW5k ZXggKyAxKTsKCQkkcmVzb3J0ZWRfdGFncyA9ICRyZXNvcnRlZF90YWdzWzBdOwoKCQlmb3Jl YWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJCWlmICghaW5fYXJy YXkoJHRhZywgJHJlc29ydGVkX3RhZ3MpKSB7CgkJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRh Z10pOwoJCQl9CgkJfQoJfQoKCWlmICgkZ2VuZXJhdGVsaW5rcykgewoJCWlmICgkbGlua3Bh dGgpIHsKCQkJJHVybHByZWZpeCA9ICRsaW5rcGF0aDsKCQkJJHVybHN1ZmZpeCA9ICRsaW5r cGF0aHRhaWw7CgkJfSBlbHNlIHsKCQkJaWYgKFRSVV9UQUdTX1VTRV9DTEVBTl9VUkxTKSB7 CgkJCQkkdXJscHJlZml4ID0gaHUgLiBUUlVfVEFHU19TRUNUSU9OIC4gJy8nOwoJCQl9IGVs c2UgewoJCQkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiBUUlVfVEFHU19TRUNUSU9OIC4g JyZhbXA7dD0nOwoJCQl9CgkJCSR1cmxzdWZmaXggPSAoVFJVX1RBR1NfVVNFX0NMRUFOX1VS TFMgPyAnLycgOiAnJyk7CgkJfQoKCQlpZiAoJHVzZXJlbHRhZykgewoJCQlpZiAoJHVzZW5v Zm9sbG93KSB7CgkJCQkkdXJsc3VmZml4IC49ICciIHJlbD0idGFnIG5vZm9sbG93JzsKCQkJ fSBlbHNlIHsKCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0YWcnOwoJCQl9CgkJfSBlbHNl IGlmICgkdXNlbm9mb2xsb3cpIHsKCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9Im5vZm9sbG93 JzsKCQl9Cgl9CgoJaWYgKGNvdW50KCR0YWdzX3dlaWdodCkgPiAwKSB7CgkJJG1heCA9IG1h eCgkdGFnc193ZWlnaHQpOwoJCSRtaW4gPSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCX0gZWxzZSB7 CgkJJG1heCA9ICRtaW4gPSAwOwoJfQoJJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8g MCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4IC0gJG1pbik7CgoJJHRh Z19zZWFyY2hfdGFnID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgnc3RyaXBoeXBo ZW5zJyA9PiAnMScpKTsKCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWln aHQpIHsKCQkkdGFnX3dlaWdodCA9IGZsb29yKCRtaW5wZXJjZW50ICsgKCR3ZWlnaHQgLSAk bWluKSAqICRzdGVwdmFsdWUpOwoKCQkkc3R5bGUgPSAnJzsKCQlpZiAoJHNldHNpemVzKQoJ CQkkc3R5bGUgPSAnIHN0eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyIn OwoKCQkkdGFnX2NsYXNzID0gJyc7CgkJaWYgKCRzZXRjbGFzc2VzKSB7CgkJCSR0YWdfY2xh c3MgPSAnIGNsYXNzPSInOwoJCQlpZiAoJHdlaWdodCA9PSAkbWluKSB7CgkJCQkkdGFnX2Ns YXNzIC49ICJ0YWdTaXplU21hbGxlc3QiOwoJCQl9IGVsc2UgaWYgKCR3ZWlnaHQgPT0gJG1h eCkgewoJCQkJJHRhZ19jbGFzcyAuPSAidGFnU2l6ZUxhcmdlc3QiOwoJCQl9IGVsc2UgewoJ CQkJJHRhZ19jbGFzcyAuPSAidGFnU2l6ZU1lZGl1bSI7CgkJCX0KCQkJJHRhZ19jbGFzcyAu PSAnIHRhZ1NpemUnIC4gKCR3ZWlnaHQgKyAxIC0gJG1pbik7CgkJCWlmICgkdGFnID09ICR0 YWdfc2VhcmNoX3RhZykgewoJCQkJJHRhZ19jbGFzcyAuPSAnICcgLiAkYWN0aXZlY2xhc3M7 CgkJCX0KCQkJJHRhZ19jbGFzcyAuPSAnIic7CgkJfQoKCQkvL2FkYXB0ZWQgZnJvbSBjb2Rl IGJ5IGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3Rv cGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUKCQkkdGl0bGVjb3VudCA9ICcnOwoJCWlmICgk dGl0bGUpCgkJCSR0aXRsZWNvdW50ID0gJyB0aXRsZT0iJyAuICR0aXRsZSAuICciJzsKCQkk ZGlzcGxheWNvdW50PSAnJzsKCQkkY291bnQgPSAkY291bnR3cmFwY2hhcnN7MH0gLiAkd2Vp Z2h0IC4gJGNvdW50d3JhcGNoYXJzezF9OwoJCWlmICgkc2hvd2NvdW50cyA9PSAndGl0bGUn IHx8ICRzaG93Y291bnRzID09ICdib3RoJykKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxlPSIn IC4gJHRpdGxlIC4gJGNvdW50IC4gJyInOwoJCWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2Nv dW50cyAhPSAndGl0bGUnKQoJCQkkZGlzcGxheWNvdW50ID0gJyAnIC4gJGNvdW50OwoKCQlp ZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGl0YWxpemUnKSB7CgkJCSR0YWcgPSB1Y3dvcmRz KCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHsK CQkJJHRhZyA9IHN0cnRvdXBwZXIoJHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5zZm9y bSA9PSAnbG93ZXJjYXNlJykgewoJCQkkdGFnID0gc3RydG9sb3dlcigkdGFnKTsKCQl9IGVs c2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBmaXJzdCcpIHsKCQkJJHRhZyA9IHVjZmly c3QoJHRhZyk7CgkJfQoKCQlpZiAoJGdlbmVyYXRlbGlua3MpIHsKCQkJJHdob2xldXJsID0g JyInIC4gJHVybHByZWZpeCAuIHVybGVuY29kZShzdHJfcmVwbGFjZSgnICcsICctJywgJHRh ZykpIC4gJHVybHN1ZmZpeCAuICciJzsKCQkJJHRhZ3NfaHRtbFtdID0gJzxhIGhyZWY9JyAu ICR3aG9sZXVybCAuICR0YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3VudCAuICc+JyAu IGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnPC9hPicgLiAkZGlzcGxheWNvdW50OwoJCX0g ZWxzZSBpZiAoJHRhZ19jbGFzcyB8fCAkc3R5bGUgfHwgJHRpdGxlY291bnQpIHsKCQkJJHRh Z3NfaHRtbFtdID0gJzxzcGFuJyAuICR0YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3Vu dCAuICc+JyAuICR0YWcgLiAnPC9zcGFuPicgLiAkZGlzcGxheWNvdW50OwoJCX0gZWxzZSB7 CgkJCSR0YWdzX2h0bWxbXSA9ICR0YWcgLiAkZGlzcGxheWNvdW50OwoJCX0KCX0KCXJldHVy biB0cnVfdGFnc19kb193cmFwKCR0YWdzX2h0bWwsICR3cmFwdGFnLCAkYnJlYWssICRjbGFz cywgJGJyZWFrY2xhc3MpOwp9CgoKIyMjIENMRUFOIFVSTCBGVU5DVElPTlMgIyMjCiMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaWYgKFRSVV9UQUdTX1VTRV9DTEVBTl9VUkxTKSB7 CglyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXInLCAncHJl dGV4dCcpOwp9CgpmdW5jdGlvbiB0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQs ICRzdGVwKSB7Cgkkc3VicGF0aCA9IHByZWdfcmVwbGFjZSgiL2h0dHBzPzpcL1wvLiooXC8u KikvVWkiLCIkMSIsaHUpOwoJJHJlZ3NhZmVzdWJwYXRoID0gcHJlZ19xdW90ZSgkc3VicGF0 aCwgJy8nKTsKCSRyZXEgPSBwcmVnX3JlcGxhY2UoIi9eJHJlZ3NhZmVzdWJwYXRoL2kiLCcv JywkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSk7CgoJJHFzID0gc3RycG9zKCRyZXEsICc/Jyk7 CgkkcWF0dHMgPSAoJHFzID8gJyYnLnN1YnN0cigkcmVxLCAkcXMgKyAxKSA6ICcnKTsKCWlm ICgkcXMpICRyZXEgPSBzdWJzdHIoJHJlcSwgMCwgJHFzKTsKCgkkcGFydHMgPSBhcnJheV92 YWx1ZXMoYXJyYXlfZmlsdGVyKHNwbGl0KCcvJywgJHJlcSkpKTsKCWlmIChjb3VudCgkcGFy dHMpID09IDIgJiYgJHBhcnRzWzBdID09IFRSVV9UQUdTX1NFQ1RJT04pIHsKCQkkdGFnID0g JHBhcnRzWzFdOwoJCSRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSA9IFRSVV9UQUdTX1RBR19Q QVJBTUVURVJfTkFNRSAuICc9JyAuICR0YWcgLiAkcWF0dHM7CgkJJF9TRVJWRVJbJ1JFUVVF U1RfVVJJJ10gPSAkc3VicGF0aCAuIFRSVV9UQUdTX1NFQ1RJT04gLiAnLz8nIC4gJF9TRVJW RVJbJ1FVRVJZX1NUUklORyddOwoJCWlmIChjb3VudCgkX1BPU1QpID4gMCkgewoJCQkkX1BP U1RbJ3NlY3Rpb24nXSA9IFRSVV9UQUdTX1NFQ1RJT047CgkJCSRfUE9TVFtUUlVfVEFHU19U QUdfUEFSQU1FVEVSX05BTUVdID0gJHRhZzsKCQl9IGVsc2UgewoJCQkkX0dFVFsnc2VjdGlv biddID0gVFJVX1RBR1NfU0VDVElPTjsKCQkJJF9HRVRbVFJVX1RBR1NfVEFHX1BBUkFNRVRF Ul9OQU1FXSA9ICR0YWc7CgkJfQoJfQp9CgoKIyMjIEFETUlOIFNJREUgRlVOQ1RJT05TICMj IwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoVFJVX1RBR1NfU0hPV19UQUdT X0lOX0FETUlOKQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX2hhbmRsZXIn LCAnYXJ0aWNsZScpOwoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5faGFuZGxlcigkZXZlbnQs ICRzdGVwKSB7CgkkY2xvdWQgPSBhcnJheV91bmlxdWUodHJ1X3RhZ3NfY2xvdWRfcXVlcnko dHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgdHJ1ZSwgdHJ1ZSkp KTsKCXNvcnQoJGNsb3VkKTsKCgkkaWQgPSAoZW1wdHkoJEdMT0JBTFNbJ0lEJ10pID8gZ3Bz KCdJRCcpIDogJEdMT0JBTFNbJ0lEJ10pOwoJJGFydGljbGVfdGFncyA9IChlbXB0eSgkaWQp ID8gYXJyYXkoKSA6IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRpZCkpOwoKCSRs aW5rcyA9IGFycmF5KCk7Cglmb3JlYWNoICgkY2xvdWQgYXMgJHRhZykgewoJCSRzdHlsZSA9 IChpbl9hcnJheSgkdGFnLCAkYXJ0aWNsZV90YWdzKSA/ICcgY2xhc3M9InRhZ19jaG9zZW4i JyA6ICcnKTsKCQkkbGlua3NbXSA9ICc8YSBocmVmPSIjYWR2YW5jZWQiJy4kc3R5bGUuJyBv bmNsaWNrPSJ0aGlzLnNldEF0dHJpYnV0ZShcXFwnY2xhc3NcXFwnLCB0b2dnbGVUYWcoXFxc JycuJHRhZy4nXFxcJykpOyByZXR1cm4gZmFsc2U7Ij4nIC4gaHRtbHNwZWNpYWxjaGFycygk dGFnKSAuICc8XC9hPic7Cgl9CgkkdG9faW5zZXJ0ID0gam9pbignLCAnLCAkbGlua3MpOwoJ JHRvX2luc2VydCA9ICI8c3R5bGU+YS50YWdfY2hvc2Vue2JhY2tncm91bmQtY29sb3I6ICNG RUI7IGNvbG9yOiBibGFjazt9PC9zdHlsZT4iIC4gJHRvX2luc2VydDsKCgkkanMgPSA8PDxF T0YKdmFyIGtleXdvcmRzRmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29y ZHMnKTsKdmFyIHBhcmVudCA9IGtleXdvcmRzRmllbGQucGFyZW50Tm9kZTsKcGFyZW50LmFw cGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJykpOwp2YXIgY2xvdWQgPSBk b2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CmNsb3VkLnNldEF0dHJpYnV0ZSgnY2xh c3MnLCAndHJ1X3RhZ3NfYWRtaW5fdGFncycpOwpjbG91ZC5pbm5lckhUTUwgPSAneyR0b19p bnNlcnR9JzsKcGFyZW50LmFwcGVuZENoaWxkKGNsb3VkKTsKCmZ1bmN0aW9uIHRvZ2dsZVRh Zyh0YWdOYW1lKSB7Cgl2YXIgdGFnUmVnZXggPSBuZXcgUmVnRXhwKCIoKF58LClcXFxzKiki ICsgdGFnTmFtZSArICJcXFxzKigsXFxccyp8JCkiKTsKCXZhciB0ZXh0YXJlYSA9IGRvY3Vt ZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOwoJdmFyIGN1cnZhbCA9IHRleHRhcmVh LnZhbHVlLnJlcGxhY2UoLyw/XHMrJC8sICcnKTsKCWlmICgnJyA9PSBjdXJ2YWwpIHsKCQl0 ZXh0YXJlYS52YWx1ZSA9IHRhZ05hbWU7Cgl9IGVsc2UgaWYgKGN1cnZhbC5tYXRjaCh0YWdS ZWdleCkpIHsKCQl0ZXh0YXJlYS52YWx1ZSA9IGN1cnZhbC5yZXBsYWNlKHRhZ1JlZ2V4LCAn JDEnKS5yZXBsYWNlKC8sP1xzKyQvLCAnJyk7CgkJcmV0dXJuICcnOwoJfSBlbHNlIGlmICgn LCcgPT0gY3VydmFsLmNoYXJBdChjdXJ2YWwubGVuZ3RoIC0gMSkpIHsKCQl0ZXh0YXJlYS52 YWx1ZSArPSAnICcgKyB0YWdOYW1lOwoJfSBlbHNlIHsKCQl0ZXh0YXJlYS52YWx1ZSArPSAn LCAnICsgdGFnTmFtZTsKCX0KCXJldHVybiAndGFnX2Nob3Nlbic7Cn0KRU9GOwoKCWVjaG8g c2NyaXB0X2pzKCRqcyk7Cn0KCgojIyMgQVRPTS9SU1MgRkVFRCBGVU5DVElPTlMgIyMjCiMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVf dGFnc19hdG9tX2hhbmRsZXInLCAnYXRvbV9lbnRyeScpOwpmdW5jdGlvbiB0cnVfdGFnc19h dG9tX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5k bGVyKHRydWUpOyB9CnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19yc3NfaGFuZGxlcics ICdyc3NfZW50cnknKTsKZnVuY3Rpb24gdHJ1X3RhZ3NfcnNzX2hhbmRsZXIoJGV2ZW50LCAk c3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKGZhbHNlKTsgfQoKZnVuY3Rp b24gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKCRhdG9tKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xl OwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCSR0YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3Nf Zm9yX2FydGljbGUoJHRoaXNpZCk7CgoJaWYgKFRSVV9UQUdTX0FERF9UQUdTX1RPX0ZFRURf Qk9EWSkgewoJCSRleHRyYWJvZHkgPSAnJzsKCQkkRk9STV9OQU1FID0gJ3RydV90YWdzX2Zl ZWRfdGFncyc7CgkJaWYgKGZldGNoKCdmb3JtJywgJ3R4cF9mb3JtJywgJ25hbWUnLCAkRk9S TV9OQU1FKSkgewoJCQkkZm9ybSA9IGZldGNoX2Zvcm0oJEZPUk1fTkFNRSk7CgkJCSRleHRy YWJvZHkgPSB0cmltKHBhcnNlKCRmb3JtKSk7CgkJfSBlbHNlIHsKCQkJJGF0dHMgPSB0cnVf dGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgdHJ1ZSk7CgkJ CSRleHRyYWJvZHkgPSAnPHA+dGFnczogJyAuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0 cywgJHRhZ3MsICR0YWdzKSAuICc8L3A+JzsKCQl9CgkJZ2xvYmFsICR0aGlzYXJ0aWNsZTsK CQlpZiAodHJpbSgkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSkpIHsKCQkJJHRoaXNhcnRpY2xl WydleGNlcnB0J10gPSB0cmltKCR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddKS5uLiRleHRyYWJv ZHkubjsKCQl9CgkJJHRoaXNhcnRpY2xlWydib2R5J10gPSB0cmltKCR0aGlzYXJ0aWNsZVsn Ym9keSddKS5uLiRleHRyYWJvZHkubjsKCX0KCglpZiAoVFJVX1RBR1NfQUREX1RBR1NfVE9f RkVFRF9YTUwpIHsKCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkdGFncyBhcyAk dGFnKSB7CgkJCWlmICgkYXRvbSkgewoJCQkJJG91dHB1dFtdID0gJzxjYXRlZ29yeSB0ZXJt PSInIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICciIC8+JzsKCQkJfSBlbHNlIHsKCQkJ CSRvdXRwdXRbXSA9ICc8Y2F0ZWdvcnk+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAn PC9jYXRlZ29yeT4nOwoJCQl9CgkJfQoJCXJldHVybiBuLmpvaW4obiwgJG91dHB1dCkubjsK CX0KfQoKCiMjIyBPVEhFUiBTVVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGlj bGUoJGFydGljbGVJRCkgewoJJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19GSUVMRDsKCSRycyA9 IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyRhcnRpY2xlSUQn IEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJJGFsbF90YWdzID0gZXhwbG9kZSgiLCIsIHRy aW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigkcnNbJHRhZ3NfZmllbGRdKSkpOwoKCXJldHVybiB0 cnVfdGFnc190cmltX3RhZ3MoJGFsbF90YWdzKTsKfQoKCiMgZml4ZXMgYnVnIHdpdGggNC4w LjQncyB2ZXJzaW9uIG9mIGRvV3JhcCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBi ZWZvcmUgdGhlIGNvbW1hcwpmdW5jdGlvbiB0cnVfdGFnc19kb193cmFwKCRsaXN0LCAkd3Jh cHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKSB7CglpZiAoISR3cmFwdGFnICYm ICFwcmVnX21hdGNoKCcvXlx3KyQvJywgJGJyZWFrKSkgewoJCXJldHVybiBqb2luKCRicmVh ay5uLCAkbGlzdCk7Cgl9IGVsc2UgewoJCXJldHVybiBkb1dyYXAoJGxpc3QsICR3cmFwdGFn LCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3NfdHJpbV90YWdzKCR0YWdfYXJyYXkpIHsKCSR0cmltbWVkID0gYXJyYXkoKTsKCWZvcmVh Y2ggKCR0YWdfYXJyYXkgYXMgJHRhZykgewoJCWlmICgiIiAhPSB0cmltKCR0YWcpKSB7CgkJ CSR0cmltbWVkW10gPSB0cmltKCR0YWcpOwoJCX0KCX0KCXJldHVybiAkdHJpbW1lZDsKfQoK CmZ1bmN0aW9uIHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1l dGVyKSB7Cgkka2V5d29yZHMgPSBleHBsb2RlKCcsJywgJHRhZ19wYXJhbWV0ZXIpOwoJZm9y ZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkKSB7CgkJaWYgKHN0cnBvcygka2V5d29yZCwg Jy0nKSAhPT0gZmFsc2UpIHsKCQkJJGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcg JywgJGtleXdvcmQpOwoJCX0KCX0KCSRhdHRzWydrZXl3b3JkcyddID0gaW1wbG9kZSgnLCcs ICRrZXl3b3Jkcyk7CgoJaWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygk YXR0c1snc2VjdGlvbiddLCAnLCcpICE9PSBmYWxzZSkKCQkkYXR0c1snc2VjdGlvbiddID0g Jyc7CgoJaWYgKGlzc2V0KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkgewoJCXVuc2V0KCRh dHRzWydleGNsdWRlc2VjdGlvbiddKTsKCX0KCglpZiAoIWlzc2V0KCRhdHRzWydsaW1pdCdd KSkKCQkkYXR0c1snbGltaXQnXSA9ICcxMDAwJzsKCgkkYXR0c1snYWxsb3dvdmVycmlkZSdd ID0gdHJ1ZTsKCglyZXR1cm4gJGF0dHM7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19zdHJ0b2xv d2VyKCRzdHIpIHsKCWlmIChmdW5jdGlvbl9leGlzdHMoIm1iX3N0cnRvbG93ZXIiKSkgewoJ Ly9pZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwgIjQuMy4wIiwgIj49IikpIHsK CQlyZXR1cm4gbWJfc3RydG9sb3dlcigkc3RyLCAiVVRGLTgiKTsKCX0gZWxzZSB7CgkJcmV0 dXJuIHN0cnRvbG93ZXIoJHN0cik7Cgl9Cn0KCgovL3RoZXNlIG5leHQgdHdvIGZ1bmN0aW9u cyBhcmUgZ3Jvc3MsIGJ1dCBJIGNhbid0IGZpZ3VyZSBvdXQgYW5vdGhlciB3YXkgdG8gZG8g aXQKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRfYnlf Y291bnQsICRzb3J0X2FzY2VuZGluZykgewoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdo dCwgJHRydV90YWdzX3NvcnRfYnlfY291bnQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsK CgkkdHJ1X3RhZ3NfdGFnc193ZWlnaHQgPSAkdGFnc193ZWlnaHQ7CgkkdHJ1X3RhZ3Nfc29y dF9ieV9jb3VudCA9ICRzb3J0X2J5X2NvdW50OwoJJHRydV90YWdzX3NvcnRfYXNjZW5kaW5n ID0gJHNvcnRfYXNjZW5kaW5nOwoKCSR0ZW1wX2FycmF5ID0gYXJyYXlfa2V5cygkdGFnc193 ZWlnaHQpOwoJdXNvcnQoJHRlbXBfYXJyYXksICJ0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFy YXRvciIpOwoKCSRzb3J0ZWRfYXJyYXkgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHRlbXBfYXJy YXkgYXMgJHRhZykgewoJCSRzb3J0ZWRfYXJyYXlbJHRhZ10gPSAkdGFnc193ZWlnaHRbJHRh Z107Cgl9CgoJcmV0dXJuICRzb3J0ZWRfYXJyYXk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19z b3J0X3RhZ3NfY29tcGFyYXRvcigkbGVmdCwgJHJpZ2h0KSB7CglnbG9iYWwgJHRydV90YWdz X3RhZ3Nfd2VpZ2h0LCAkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCwgJHRydV90YWdzX3NvcnRf YXNjZW5kaW5nOwoKCWlmICgkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCkgewoJCSRsZWZ0X3dl aWdodCA9ICR0cnVfdGFnc190YWdzX3dlaWdodFskbGVmdF07CgkJJHJpZ2h0X3dlaWdodCA9 ICR0cnVfdGFnc190YWdzX3dlaWdodFskcmlnaHRdOwoJCWlmICgkbGVmdF93ZWlnaHQgPT0g JHJpZ2h0X3dlaWdodCkgewoJCQlyZXR1cm4gc3RybmF0Y2FzZWNtcCgkbGVmdCwgJHJpZ2h0 KTsKCQl9IGVsc2UgaWYgKCR0cnVfdGFnc19zb3J0X2FzY2VuZGluZykgewoJCQlyZXR1cm4g JGxlZnRfd2VpZ2h0IC0gJHJpZ2h0X3dlaWdodDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJp Z2h0X3dlaWdodCAtICRsZWZ0X3dlaWdodDsKCQl9Cgl9IGVsc2UgewoJCXJldHVybiBzdHJu YXRjYXNlY21wKCRsZWZ0LCAkcmlnaHQpOwoJfQp9CgoKCiMjIyBCQVNUQVJEIEZVTkNUSU9O UyBUSEFUIFNIT1VMRE4nVCBIQVZFIFRPIEVYSVNUICMjIwojIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgpmdW5jdGlvbiB0cnVfdGFn c19yZWRvX2FydGljbGVfc2VhcmNoKCRhdHRzKSB7CgkkdGhlQXR0cyA9IGxBdHRzKGFycmF5 KCdsaW1pdCcgICAgID0+IDEwMDAsCgkJCQknY2F0ZWdvcnknICA9PiAnJywKCQkJCSdzZWN0 aW9uJyAgID0+ICcnLAoJCQkJJ2V4Y2VycHRlZCcgPT4gJycsCgkJCQknYXV0aG9yJyAgICA9 PiAnJywKCQkJCSdzb3J0YnknICAgID0+ICdQb3N0ZWQnLAoJCQkJJ3NvcnRkaXInICAgPT4g J2Rlc2MnLAoJCQkJJ21vbnRoJyAgICAgPT4gJycsCgkJCQkna2V5d29yZHMnICA9PiAnJywK CQkJCSdmcm9udHBhZ2UnID0+ICcnLAoJCQkJJ2lkJyAgICAgICAgPT4gJycsCgkJCQkndGlt ZScgICAgICA9PiAncGFzdCcsCgkJCQknc3RhdHVzJyAgICA9PiAnNCcsCgkJCQknb2Zmc2V0 JyAgICA9PiAwCgkJCSksJGF0dHMsIDApOwoJZXh0cmFjdCgkdGhlQXR0cyk7CgoJLy9CdWls ZGluZyBxdWVyeSBwYXJ0cwoJJGZyb250cGFnZSA9ICgkZnJvbnRwYWdlKSA/IGZpbHRlckZy b250UGFnZSgpIDogJyc7CgkkY2F0ZWdvcnkgID0gKCEkY2F0ZWdvcnkpICA/ICcnIDogIiBh bmQgKChDYXRlZ29yeTE9JyIuZG9zbGFzaCgkY2F0ZWdvcnkpLiInKSBvciAoQ2F0ZWdvcnky PSciLmRvU2xhc2goJGNhdGVnb3J5KS4iJykpICI7Cgkkc2VjdGlvbiAgID0gKCEkc2VjdGlv bikgICA/ICcnIDogIiBhbmQgU2VjdGlvbiA9ICciLmRvc2xhc2goJHNlY3Rpb24pLiInIjsK CSRleGNlcnB0ZWQgPSAoJGV4Y2VycHRlZD09J3knKSAgPyAiIGFuZCBFeGNlcnB0ICE9Jyci IDogJyc7CgkkYXV0aG9yICAgID0gKCEkYXV0aG9yKSAgICA/ICcnIDogIiBhbmQgQXV0aG9y SUQgPSAnIi5kb3NsYXNoKCRhdXRob3IpLiInIjsKCSRtb250aCAgICAgPSAoISRtb250aCkg ICAgID8gJycgOiAiIGFuZCBQb3N0ZWQgbGlrZSAnIi5kb1NsYXNoKCRtb250aCkuIiUnIjsK CSRpZCAgICAgICAgPSAoISRpZCkgICAgICAgID8gJycgOiAiIGFuZCBJRCA9ICciLmludHZh bCgkaWQpLiInIjsKCXN3aXRjaCAoJHRpbWUpIHsKCQljYXNlICdhbnknOgoJCQkkdGltZSA9 ICIiOyBicmVhazsKCQljYXNlICdmdXR1cmUnOgoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA+ IG5vdygpIjsgYnJlYWs7CgkJZGVmYXVsdDoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPCBu b3coKSI7Cgl9CglpZiAoIWlzX251bWVyaWMoJHN0YXR1cykpCgkJJHN0YXR1cyA9IGdldFN0 YXR1c051bSgkc3RhdHVzKTsKCgkkY3VzdG9tID0gJyc7CgkvLyB0cnlpbmcgY3VzdG9tIGZp ZWxkcyBoZXJlCgkkY3VzdG9tRmllbGRzID0gZ2V0Q3VzdG9tRmllbGRzKCk7CglpZiAoJGN1 c3RvbUZpZWxkcykgewoJCWZvcmVhY2goJGN1c3RvbUZpZWxkcyBhcyAkY0ZpZWxkKSB7CgkJ CWlmIChpc3NldCgkYXR0c1skY0ZpZWxkXSkpCgkJCQkkY3VzdG9tUGFpcnNbJGNGaWVsZF0g PSAkYXR0c1skY0ZpZWxkXTsKCQl9CgkJaWYoIWVtcHR5KCRjdXN0b21QYWlycykpCgkJCSRj dXN0b20gPSAgYnVpbGRDdXN0b21TcWwoJGN1c3RvbUZpZWxkcywkY3VzdG9tUGFpcnMpOwoJ CWVsc2UKCQkJJGN1c3RvbSA9ICcnOwoJfQoKCS8vQWxsb3cga2V5d29yZHMgZm9yIG5vLWN1 c3RvbSBhcnRpY2xlcy4gVGhhdCB0YWdnaW5nIG1vZGUsIHlvdSBrbm93CglpZiAoJGtleXdv cmRzKSB7CgkJJGtleXMgPSBzcGxpdCgnLCcsJGtleXdvcmRzKTsKCQlmb3JlYWNoICgka2V5 cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBLZXl3b3JkcyBsaWtlICclIi5kb1Ns YXNoKHRyaW0oJGtleSkpLiIlJyI7CgkJfQoJCSRrZXl3b3JkcyA9ICIgYW5kICgiIC4gam9p bignIG9yICcsJGtleXBhcnRzKSAuICIpIjsKCX0KCglpZiAoJGlkKQoJCSRzdGF0dXNxID0g IiBhbmQgU3RhdHVzID49ICc0JyI7CgllbHNlCgkJJHN0YXR1c3EgPSAiIGFuZCBTdGF0dXM9 JyIuZG9TbGFzaCgkc3RhdHVzKS4iJyI7CgoJJHdoZXJlID0gIjEiIC4gJHN0YXR1c3EuICR0 aW1lLgoJCSRpZCAuICRjYXRlZ29yeSAuICRzZWN0aW9uIC4gJGV4Y2VycHRlZCAuICRtb250 aCAuICRhdXRob3IgLiAka2V5d29yZHMgLiAkY3VzdG9tIC4gJGZyb250cGFnZTsKCgkJJHBn b2Zmc2V0ID0gJG9mZnNldCAuICcsICc7CgoJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCIqLCB1 bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHVQb3N0ZWQiLCAndGV4dHBhdHRlcm4nLAoJCSR3 aGVyZS4gJyBvcmRlciBieSAnIC4gZG9zbGFzaCgkc29ydGJ5KSAuICcgJyAuIGRvU2xhc2go JHNvcnRkaXIpIC4gJyBsaW1pdCAnIC4gZG9TbGFzaCgkbGltaXQpKTsKCglyZXR1cm4gJHJz Owp9CgoKIjtzOjg6ImhlbHBfcmF3IjtzOjQ5ODoiVG8gbGVhcm4gbW9yZSBhYm91dCB0cnVf dGFncywgY2hlY2sgb3V0IHRoZSAiaW50cm9kdWN0b3J5IGFydGljbGUiOi9ibG9nLzQ5My90 cnV0YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuLCAicmVsZWFzZXMgcGFn ZSI6aHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVsZWFz ZXMsICJmZWF0dXJlIGxpc3QiOmh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk1 L3RydXRhZ3MtZmVhdHVyZS1saXN0LCBhbmQgInVzYWdlIGluc3RydWN0aW9ucyI6aHR0cDov L3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlv bnMuCgpJJ3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxwIG91dCBvZiB0aGUgcGx1Z2luOyBt eSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRpZmZpY3VsdCB0byBrZWVw IG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRoZSBwbHVnaW4uIjtzOjM6Im1kNSI7 czozMjoiNWI0OGRlOTQzMGZmZTQyNDA3YzAxYjBiMTE3Y2NmOGEiO30=