# tru_tags v1.3 # Tagging support with full integration # Nathan Arthur # http://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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMS4zIjtzOjY6ImF1dGhvciI7czoxMzoiTmF0aGFu IEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL3RydWlzdC5jb20vIjtz OjExOiJkZXNjcmlwdGlvbiI7czozNzoiVGFnZ2luZyBzdXBwb3J0IHdpdGggZnVsbCBpbnRl Z3JhdGlvbiI7czo0OiJ0eXBlIjtpOjA7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjQ6 ImhlbHAiO3M6MTM5MzM6IgoJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hl Y2sgb3V0IHRoZSA8YSBocmVmPSIvYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2lu LWZvci10ZXh0cGF0dGVybiI+aW50cm9kdWN0b3J5IGFydGljbGU8L2E+IGFuZCA8YSBocmVm PSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUt bGlzdCI+ZmVhdHVyZSBsaXN0PC9hPi48L3A+Cgk8cD5Db3B5cmlnaHQgMjAwNiBOYXRoYW4g QXJ0aHVyPC9wPgoJPHA+UmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwg c2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhw IGZvciBkZXRhaWxzPC9wPgoJPHA+VGhpcyB3b3JrIGlzIGJhc2VkIG9uIHJhbl90YWdzIGJ5 IFJhbiBBcm91c3NpLCBvcmlnaW5hbGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9h cnRpY2xlLzQ1L3RhZ2dpbmctdGV4dHBhdHRlcm4uICBJdCBhbHNvIGNvbnRhaW5zIGNvZGUg YWRhcHRlZCBmcm9tIGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5j b20vdmlld3RvcGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUuPC9wPgoJPGgzPkNvbmZpZ3Vy YXRpb248L2gzPgoJPGg0PlN0ZXAgMTogQ3JlYXRlIGEgbmV3IHNlY3Rpb248L2g0PgoJPHA+ dHJ1X3RhZ3MgZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgc3BlY2lhbCBUZXh0cGF0 dGVybiBzZWN0aW9uIG5hbWVkICYjODIyMDt0YWcsJiM4MjIxOyBieSBkZWZhdWx0PHN1cD48 YSBocmVmPSIjZm45NTc0NzE1NDM0NDE0ODVhYzI5NjVmIj4xPC9hPjwvc3VwPi4gIENyZWF0 ZSB0aGF0IHNlY3Rpb24sIHVzaW5nIHdoYXRldmVyIHNldHRpbmdzIHlvdSBsaWtlLiAgKFlv dSB3b24mIzgyMTc7dCBiZSBwdWJsaXNoaW5nIGFydGljbGVzIHRvIHRoYXQgc2VjdGlvbi4p ICBIZXJlJiM4MjE3O3Mgd2hhdCBJIHVzZTxzdXA+PGEgaHJlZj0iI2ZuMjEzMzI5OTA0OTQ0 MTQ4NWFjMmU0NzgiPjI8L2E+PC9zdXA+OjwvcD4KCTxwPjxpbWcgc3JjPSJodHRwOi8vd3d3 LnRydWlzdC5jb20vaW1hZ2VzLzIucG5nIiBoZWlnaHQ9IjI4MCIgd2lkdGg9IjM5OCIgYWx0 PSJ0YWcgc2VjdGlvbiBjb25maWd1cmF0aW9uIiBjbGFzcz0iZGlhZ3JhbSIgLz48L3A+Cgk8 cCBjbGFzcz0iZm9vdG5vdGUiIGlkPSJmbjk1NzQ3MTU0MzQ0MTQ4NWFjMjk2NWYiPjxzdXA+ MTwvc3VwPiBZb3UgY2FuIHVzZSBhIGRpZmZlcmVudCBuYW1lLCBidXQgeW91IGhhdmUgdG8g dXNlIGEgc3BlY2lhbCBhdHRyaWJ1dGUgaW4gc29tZSBvZiB0aGUgcGx1Z2luIGNhbGxzIHRv IG1ha2UgIGV2ZXJ5dGhpbmcgd29yayBjb3JyZWN0bHkuICBTZWUgYmVsb3cgZm9yIGRldGFp bHMuPC9wPgoJPHAgY2xhc3M9ImZvb3Rub3RlIiBpZD0iZm4yMTMzMjk5MDQ5NDQxNDg1YWMy ZTQ3OCI+PHN1cD4yPC9zdXA+IE5vdGUgdGhhdCBJIHVzZSB0aGUgJiM4MjE2O2RlZmF1bHQm IzgyMTc7IHBhZ2UgJiM4MjExOyB0aGF0IGNob2ljZSBtYXkgbm90IGJlIHJpZ2h0IGZvciB5 b3UuICBUaGlzIHNlY3Rpb24gd2lsbCBiZSBzaG93biB3aGVuZXZlciB5b3UgY2xpY2sgb24g YSB0YWcsIHRvIGRpc3BsYXkgdGhlIHRhZyBzZWFyY2ggcmVzdWx0cy4gIFlvdSYjODIxNzts bCB3YW50IGEgcGFnZSB0aGF0IGhhcyB0aGUgY29ycmVjdCBsYXlvdXQvaGVhZGVycy9mb290 ZXJzLiAgSSB1c2UgbXkgZGVmYXVsdCBwYWdlLCB3aXRoIDxjb2RlPiZsdDt0eHA6aWZfc2Vj dGlvbiBuYW1lPSJ0YWciJmd0OzwvY29kZT4gdG8gY2hhbmdlIHRoZSBwYWdlIGRpc3BsYXkg aW4gdGhpcyBjYXNlLjwvcD4KCTxoND5TdGVwIDI6IENhbGwgdGhlIHBsdWdpbiBmcm9tIHRo YXQgc2VjdGlvbjwvaDQ+Cgk8cD5UbyBtYWtlIHRhZyBzZWFyY2hpbmcgYW5kIHRoZSBkZWZh dWx0IHRhZyBjbG91ZCB3b3JrLCB5b3UmIzgyMTc7bGwgbmVlZCB0byBjYWxsIDxjb2RlPiZs dDt0eHA6dHJ1X3RhZ3NfaGFuZGxlciAvJmd0OzwvY29kZT4gZnJvbSB0aGUgcGFnZSB5b3Ug Y2hvc2UgaW4gU3RlcCAxLiAgSSByZXBsYWNlZCB0aGUgZGVmYXVsdCA8Y29kZT4mbHQ7dHhw OmFydGljbGUgLyZndDs8L2NvZGU+IHdpdGggc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+Cjxw cmU+Jmx0O3R4cDppZl9zZWN0aW9uIG5hbWU9InRhZyImZ3Q7CiAgJmx0O3R4cDp0cnVfdGFn c19oYW5kbGVyIC8mZ3Q7CiZsdDt0eHA6ZWxzZSAvJmd0OwogICZsdDt0eHA6YXJ0aWNsZSAv Jmd0OwombHQ7L3R4cDppZl9zZWN0aW9uJmd0OzwvcHJlPgoJPGg0PlN0ZXAgMzogQ29uZmln dXJlIHlvdXIgYXJ0aWNsZSBmb3JtIHRvIGRpc3BsYXkgdGFnczwvaDQ+Cgk8cD5UbyBtYWtl IGVhY2ggYXJ0aWNsZSBzaG93IGEgbGlzdCBvZiBhbGwgdGhlIHRhZ3MgYXNzb2NpYXRlZCB3 aXRoIGl0LCBwdXQgc29tZXRpbmcgbGlrZSB0aGlzIGluIHlvdXIgYXJ0aWNsZSBmb3JtOjwv cD4KPHByZT4mbHQ7dHhwOnRydV90YWdzX2lmX2hhc190YWdzJmd0OwogIHRhZ3M6ICZsdDt0 eHA6dHJ1X3RhZ3NfZnJvbV9hcnRpY2xlIC8mZ3Q7CiZsdDsvdHhwOnRydV90YWdzX2lmX2hh c190YWdzJmd0OzwvcHJlPgoJPGg0PlN0ZXAgNDogRHJvcCBhIGN1c3RvbSB0YWcgY2xvdWQg c29tZXdoZXJlLCBpZiB5b3Ugd2FudDwvaDQ+Cgk8cD5JZiB5b3UmIzgyMTc7ZCBsaWtlIHRv IHNob3cgYSB0YWcgY2xvdWQgc29tZXdoZXJlIG9uIHlvdXIgc2l0ZSAob3RoZXIgdGhhbiAv dGFnLyksIHB1dCBzb21ldGhpbmcgbGlrZSB0aGlzIGluIHRoYXQgcGFnZTo8L3A+CjxwcmU+ Jmx0O3R4cDp0cnVfdGFnc19jbG91ZCAvJmd0OzwvcHJlPgoJPHA+U2VlIGJlbG93IGZvciBs b3RzIG9mIGZvcm1hdHRpbmcgb3B0aW9ucywgaW5jbHVkaW5nIHRoZSBhYmlsaXR5IHRvIG91 dHB1dCBhIHNpbXBsZSBsaXN0IGluc3RlYWQgb2YgYSBjbG91ZCAodXNpbmcgPGNvZGU+dHJ1 X3RhZ3NfbGlzdDwvY29kZT4pLjwvcD4KCTxoND5TdGVwIDU6IFN0YXJ0IHRhZ2dpbmchPC9o ND4KCTxwPldoZW5ldmVyIHlvdSB3cml0ZSBhbiBhcnRpY2xlLCBwdXQgeW91ciB0YWdzIGlu dG8gdGhlIEtleXdvcmRzIGZpZWxkIGluIFRleHRwYXR0ZXJuLiAgKFRoZSBLZXl3b3JkcyBm aWVsZCBoaWRlcyBiZWhpbmQgdGhlICYjODIyMDtBZHZhbmNlZCBPcHRpb25zJiM4MjIxOyBs aW5rIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlICYjODIyMDt3cml0ZSYjODIyMTsgcGFnZS4p ICBUYWdzIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgY29tbWFzLCBhbmQgY2FuIGhhdmUgc3Bh Y2VzLiAgQmUgY2FyZWZ1bCBub3QgdG8gbGVhdmUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcg YW5kIGVuZCBvZiB0YWdzLiAgSGVyZSYjODIxNztzIGEgZ29vZCBleGFtcGxlOjwvcD4KCTxw PjxpbWcgc3JjPSJodHRwOi8vd3d3LnRydWlzdC5jb20vaW1hZ2VzLzMucG5nIiBoZWlnaHQ9 IjExMCIgd2lkdGg9IjExOCIgYWx0PSJ0YWdzIHdpdGggc3BhY2VzLCBidXQgbm90IG5leHQg dG8gdGhlIGNvbW1hcyIgY2xhc3M9ImRpYWdyYW0iIC8+PC9wPgoJPHA+Li4uYW5kIGEgYmFk IG9uZTo8L3A+Cgk8cD48aW1nIHNyYz0iaHR0cDovL3d3dy50cnVpc3QuY29tL2ltYWdlcy80 LnBuZyIgaGVpZ2h0PSIxMTIiIHdpZHRoPSIxMTkiIGFsdD0idGFncyB3aXRoIHNwYWNlcyBh ZnRlciB0aGUgY29tbWFzIChXUk9ORykiIGNsYXNzPSJkaWFncmFtIiAvPjwvcD4KCTxwPllv dSYjODIxNztsbCBwcm9iYWJseSB3YW50IHRvIGluc3RhbGwgUm9iIFNhYmxlJiM4MjE3O3Mg PGEgaHJlZj0iaHR0cDovL3d3dy53aWxzaGlyZW9uZS5jb20vdGV4dHBhdHRlcm4tcGx1Z2lu cy9yc3MtYWRtaW4tc2hvdy1hZHYtb3B0cyI+cnNzX2FkbWluX3Nob3dfYWR2X29wdHM8L2E+ LCB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgZXhwYW5kIHRoZSAmIzgyMjA7QWR2YW5jZWQg T3B0aW9ucyYjODIyMTsgc2VjdGlvbiBvZiB0aGUgJiM4MjIwO3dyaXRlJiM4MjIxOyBwYWdl LCB3aGVuIHlvdSBhcmUgd3JpdGluZyBhcnRpY2xlcy4gIFRoYXQgZ2l2ZXMgeW91IGVhc3kg YWNjZXNzIHRvIHRoZSBLZXl3b3JkcyBmaWVsZC48L3A+Cgk8aDQ+U3RlcCA2OiBGYW5jeSBk aXNwbGF5IGN1c3RvbWl6YXRpb248L2g0PgoJPHA+WW91IGNhbiB1c2UgPGNvZGU+dHJ1X3Rh Z3NfaWZfdGFnX3NlYXJjaDwvY29kZT4sIDxjb2RlPnRydV90YWdzX3RhZ19wYXJhbWV0ZXI8 L2NvZGU+LCBhbmQgPGNvZGU+dHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcjwvY29kZT4gdG8g Y3VzdG9taXplIHlvdXIgcGFnZSB0aXRsZXMgb3IgdGFnIHNlYXJjaCByZXN1bHRzLiAgU2Vl IGJlbG93IGZvciBkZXRhaWxzLiAgU2VlIHRoZSB0aXRsZWJhciBvZiA8YSBocmVmPSJodHRw Oi8vd3d3LnRydWlzdC5jb20vIj50cnVpc3QuY29tPC9hPiBmb3IgYW4gZXhhbXBsZS48L3A+ Cgk8aDQ+U3RlcCA3OiBUdXJuIG9uIGNsZWFuIHVybHM8L2g0PgoJPHA+Q2xlYW4gdXJscyBh cmUgbm93IHBvc3NpYmxlIHdpdGggdHJ1X3RhZ3MsIHByb3ZpZGVkIHRoYXQgeW91IGFyZSB3 aWxsaW5nIHRvIG1vZGlmeSBUZXh0cGF0dGVybiYjODIxNztzIHJld3JpdGUgcnVsZXMgKGlu IHRoZSAuaHRhY2Nlc3MgZmlsZSkuICBCdXQgYmUgd2FybmVkICYjODIxMTsgcmV3cml0ZSBy dWxlcyBhcmUgY29tcGxleC4gIEkgbWFrZSBubyBndWFyYW50ZWVzIHRoYXQgdGhpcyB3b24m IzgyMTc7dCBlYXQgeW91ciBjaGlsZHJlbi4gIDxzdHJvbmc+WW91IGRvbiYjODIxNzt0IGhh dmUgdG8gZG8gdGhpczwvc3Ryb25nPiBidXQgYSBsb3Qgb2YgcGVvcGxlIHdhbnQgaXQuICBU aGlzIHNpdGUgdXNlcyBpdCwgaWYgdGhhdCBoZWxwcy48L3A+Cgk8cD5IZXJlJiM4MjE3O3Mg d2hhdCB0byBkbzo8L3A+Cgk8b2w+CgkJPGxpPkFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRv IFRleHRwYXR0ZXJuJiM4MjE3O3MgLmh0YWNjZXNzIGZpbGUgKGZvdW5kIGluIHRoZSByb290 IG9mIHlvdXIgVGV4dHBhdHRlcm4gZGlyZWN0b3J5KSwgYWRqdXN0aW5nIHRoZW0gaWYgbmVj ZXNzYXJ5LiAgVGhlc2UgbGluZXMgc2hvdWxkIGJlIDxzdHJvbmc+YWZ0ZXI8L3N0cm9uZz4g dGhlPC9saT4KCTwvb2w+Cgk8cD48ZGl2IGNsYXNzPSJwcmUiPjwvcD4KCTxwPlJld3JpdGVS dWxlICYjOTQ7KC4mIzQzOykgJiM0NTsgW1BULExdPC9wPgoJPHA+PC9kaXY+PC9wPgoJPHA+ YW5kIDxzdHJvbmc+YmVmb3JlPC9zdHJvbmc+IHRoZTwvcD4KCTxwPjxkaXYgY2xhc3M9InBy ZSI+PC9wPgoJPHA+UmV3cml0ZVJ1bGUgJiM5NDsoLiYjNDI7KSBpbmRleC5waHA8L3A+Cgk8 cD48L2Rpdj48L3A+Cgk8cD5IZXJlJiM4MjE3O3MgdGhlIGJpdCB0byBpbnNlcnQ6PC9wPgoJ PHA+PGRpdiBjbGFzcz0icHJlIj48L3A+Cgk8cD4jVGhpcyBwYXRoIHNob3VsZCBtYXRjaCB0 aGUgcmVsYXRpdmUgdXJsIG9mIHlvdXIgVGV4dHBhdHRlcm4gaW5zdGFsbDxiciAvPgpSZXdy aXRlQmFzZSAvPGJyIC8+CiNJZiB5b3UncmUgdXNpbmcgYSBzZWN0aW9uIG90aGVyIHRoYW4g JiMzNDt0YWcmIzM0OywgY2hhbmdlIHRoZSBmb2xsb3dpbmcgdHdvIHJ1bGVzIGFjY29yZGlu Z2x5PGJyIC8+ClJld3JpdGVSdWxlICYjOTQ7dGFnLyhbJiM5NDsvXSYjNDM7KSQgdGFnLyQx LyBbUixMXTxiciAvPgpSZXdyaXRlUnVsZSAmIzk0O3RhZy8oLiYjNDM7KS8kICYjNjM7cyYj NjE7dGFneCYjMzc7eCYjMzc7dCYjNjE7JDE8L3A+Cgk8cD48L2Rpdj48L3A+Cgk8b2w+CgkJ PGxpPjxzdHJvbmc+Q2hlY2sgdG8gbWFrZSBzdXJlIHlvdXIgc2l0ZSBpcyBzdGlsbCB3b3Jr aW5nLjwvc3Ryb25nPjwvbGk+CgkJPGxpPkVkaXQgdGhlIHRydV90YWdzIHBsdWdpbiAoYWRt aW4gLT4gcGx1Z2lucywgY2xpY2sgJiM4MjE2O0VkaXQmIzgyMTc7KSBhbmQgY2hhbmdlIHRo ZSA8Y29kZT50cnVfdGFnc191c2VfY2xlYW5fdXJscygpPC9jb2RlPiBmdW5jdGlvbiB0byBy ZXR1cm4gPGNvZGU+MTwvY29kZT4uICAoSXQmIzgyMTc7cyB0aGUgZmlyc3QgZnVuY3Rpb24u KTwvbGk+CgkJPGxpPkNsZWFuIHVybHMgc2hvdWxkIGJlIHdvcmtpbmcgbm93LiAgVHJ5IGNs aWNraW5nIGEgdGFnIGxpbmsgdG8gc2VlIHdoYXQgdXJsIGl0IHJlZmVyZW5jZXMuPC9saT4K CQk8bGk+QnkgZGVmYXVsdCwgYXJ0aWNsZSB0YWdzIHdpbGwgdXNlIHRoZSA8Y29kZT5yZWw9 InRhZyI8L2NvZGU+IGF0dHJpYnV0ZSwgYW5kIHRoZSB0YWcgY2xvdWQgKG9yIGxpc3QpIHdv biYjODIxNzt0LiAgVGhpcyBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHRoZSA8Y29kZT51c2Vy ZWx0YWc8L2NvZGU+IGF0dHJpYnV0ZTsgc2VlIGJlbG93IGZvciBkZXRhaWxzLjwvbGk+Cgk8 L29sPgoJPGgzPlRhZyByZWZlcmVuY2U8L2gzPgoJPGg0Pjxjb2RlPnRydV90YWdzX2hhbmRs ZXI8L2NvZGU+PC9oND4KCTxwPlRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gdGhhdCBkcml2 ZXMgdGFnIHNlYXJjaCBhbmQgc2hvd3MgdGhlIGdlbmVyaWMgdGFnIGNsb3VkLiAgSXQgc2hv dWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBwYWdlIHRoYXQgaXMgdXNlZCBpbiB0aGUgJiM4MjE2 O3RhZyYjODIxNzsgc2VjdGlvbi4gIEl0IGdlbmVyYWxseSBjYWxscyA8Y29kZT5kb0FydGlj bGVzKCk8L2NvZGU+IChpbiB0aGUgVGV4dHBhdHRlcm4gY29kZSkgdG8gZGlzcGxheSB0YWcg c2VhcmNoIHJlc3VsdHMsIGJ1dCBpZiBubyB0YWcgd2FzIHBhc3NlZCBpbiB0aGUgdXJsIGl0 IHdpbGwgY2FsbCA8Y29kZT50cnVfdGFnc19jbG91ZDwvY29kZT4gaW5zdGVhZC48L3A+Cgk8 cD5UaGlzIHRhZyBhY2NlcHRzIG1vc3Qgb2YgdGhlIHN0YW5kYXJkIDxjb2RlPnR4cDphcnRp Y2xlPC9jb2RlPiBhdHRyaWJ1dGVzLCB3aGljaCB3aWxsIGJlIGFwcGxpZWQgZHVyaW5nIHRo ZSB0YWcgc2VhcmNoLiAgTm90ZSB0aGF0IDxjb2RlPnRydV90YWdzX2hhbmRsZXI8L2NvZGU+ IDxzdHJvbmc+ZG9lcyBub3Q8L3N0cm9uZz4gc3VwcG9ydCB1c2luZyBtdWx0aXBsZSBzZWN0 aW9ucyB3aXRoIHRoZSA8Y29kZT5zZWN0aW9uPC9jb2RlPiBhdHRyaWJ1dGUsIHdoZW4gZG9p bmcgYSB0YWcgc2VhcmNoLiAgSWYgbXVsdGlwbGUgc2VjdGlvbnMgYXJlIHBhc3NlZCwgbm9u ZSBhcmUgdXNlZC48L3A+Cgk8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEluIFRleHRwYXR0 ZXJuLCB0aGUgPGNvZGU+bGltaXQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBkZWZhdWx0ZWQgdG8g PGNvZGU+MTA8L2NvZGU+LCB0byBsaW1pdCB0aGUgb3V0cHV0IHRvIDEwIGFydGljbGVzIHBl ciBwYWdlLCBhbmQgdGhlIDxjb2RlPnR4cDpvbGRlcjwvY29kZT4gYW5kIDxjb2RlPnR4cDpu ZXdlcjwvY29kZT4gdGFncyBhcmUgdXNlZCB0byBwYWdpbmF0ZSB0aGUgZnVsbCBsaXN0LiAg VGhlIDxjb2RlPnR4cDpvbGRlcjwvY29kZT4gYW5kIDxjb2RlPnR4cDpuZXdlcjwvY29kZT4g dGFncyBkbyBub3Qgd29yayB3aXRoIHRydV90YWdzLCBidXQgdGhlIDxjb2RlPmxpbWl0PC9j b2RlPiBpcyBzdGlsbCB1c2VkIGJ5IFRleHRwYXR0ZXJuIHdoZW4gaXQgb3V0cHV0cyB0aGUg YXJ0aWNsZXMuICBUaGVyZWZvcmUsIHRydV90YWdzIHVzZXMgYSBkZWZhdWx0IGxpbWl0IG9m IDxjb2RlPjEwMDA8L2NvZGU+IHdoZW4gZG9pbmcgYW4gYXJ0aWNsZSBzZWFyY2guICBZb3Ug Y2FuIG92ZXJyaWRlIHRoaXMgbGltaXQgYnkgc2V0dGluZyB0aGUgPGNvZGU+bGltaXQ8L2Nv ZGU+IGF0dHJpYnV0ZSBvbiA8Y29kZT50cnVfdGFnc19oYW5kbGVyPC9jb2RlPi48L3A+Cgk8 cD5UaGlzIHRhZyB3aWxsIGFsc28gYWNjZXB0IGFsbCBvZiB0aGUgYXR0cmlidXRlcyB1c2Vk IGJ5IDxjb2RlPnRydV90YWdfY2xvdWQ8L2NvZGU+LiAgU2VlIGJlbG93IGZvciBkZXRhaWxz LjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19pZl9oYXNfdGFnczwvY29kZT48L2g0PgoJPHA+ VGhpcyBjb25kaXRpb25hbCB0YWcgY2FuIGJlIHVzZWQgaW4gYW4gYXJ0aWNsZSBmb3JtLCBh bmQgd2lsbCBldmFsdWF0ZSBpdHMgY29udGVudHMgKGUuZy4gJiM4MjIwO3JldHVybiB0cnVl JiM4MjIxOykgaWYgdGhlIGN1cnJlbnQgYXJ0aWNsZSBoYXMgdGFncy48L3A+Cgk8aDQ+PGNv ZGU+dHJ1X3RhZ3NfZnJvbV9hcnRpY2xlPC9jb2RlPjwvaDQ+Cgk8cD5UaGlzIHRhZyBjYW4g YmUgdXNlZCBpbiBhbiBhcnRpY2xlIGZvcm0gdG8gcmV0dXJuIGEgbGlzdCBvZiB0YWdzIGFz c29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBhcnRpY2xlLiAgRWFjaCB0YWcgaW4gdGhlIGxp c3Qgd2lsbCBiZSBhIGxpbmsgKDxjb2RlPiZsdDthIGhyZWY9Li4uJmd0OzwvY29kZT4pIHRv IHRoZSB0YWcgc2VhcmNoIHVybCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHRhZy48L3A+Cgk8cD5U aGlzIHRhZyBhY2NlcHRzIHRoZSBzdGFuZGFyZCA8Y29kZT5icmVhazwvY29kZT4sIDxjb2Rl PmNsYXNzPC9jb2RlPiwgYW5kIDxjb2RlPmJyZWFrY2xhc3M8L2NvZGU+IGF0dHJpYnV0ZXMu PC9wPgoJPHA+SXQgYWxzbyBhY2NlcHRzIGEgPGNvZGU+dGFnc2VjdGlvbjwvY29kZT4gYXR0 cmlidXRlLCB3aGljaCB0ZWxscyB0cnVfdGFncyB3aGF0IHJlbGF0aXZlIHVybCB0byB1c2Ug dG8gZmluZCB0aGUgJiM4MjE2O3RhZyYjODIxNzsgc2VjdGlvbi4gIFRoaXMgY2FuIGJlIHVz ZWZ1bCBpZiB5b3UgaGF2ZSBuYW1lZCB0aGUgc2VjdGlvbiBzb21ldGhpbmcgb3RoZXIgdGhh biAmIzgyMTY7dGFnJiM4MjE3Oy4gIEJ5IGRlZmF1bHQsIHRoaXMgaXMgc2V0IHRvIDxjb2Rl PnRhZzwvY29kZT4uPC9wPgoJPHA+SWYgeW91IGhhdmUgY2xlYW4gdXJscyB0dXJuZWQgb24g KHNlZSBhYm92ZSksIHlvdSBjYW4gdXNlIHRoZSA8Y29kZT51c2VyZWx0YWdzPC9jb2RlPiBh dHRyaWJ1dGUgdG8gc3BlY2lmeSB3aGV0aGVyIGxpbmtzIGluIHRoZSBsaXN0IHNob3VsZCBo YXZlIHRoZSA8YSBocmVmPSJodHRwOi8vbWljcm9mb3JtYXRzLm9yZy93aWtpL3JlbHRhZyI+ PGNvZGU+cmVsPSJ0YWciPC9jb2RlPjwvYT4gICh1c2VkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93 d3cudGVjaG5vcmF0aS5jb20vIj5UZWNobm9yYXRpPC9hPikgYXR0cmlidXRlIHNldC4gIFRo aXMgaXMgb24gYnkgZGVmYXVsdC48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfY2xvdWQ8L2Nv ZGU+PC9oND4KCTxoND48Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPjwvaDQ+Cgk8cD5UaGVz ZSB0d28gdGFncyBkbyB0aGUgZXhhY3Qgc2FtZSB0aGluZyAmIzgyMTE7IDxjb2RlPnRydV90 YWdzX2Nsb3VkPC9jb2RlPiBqdXN0IHByb3ZpZGVzIGRpZmZlcmVudCBkZWZhdWx0cyB0byA8 Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPi48L3A+CjxwPjxjb2RlPnRydV90YWdzX2Nsb3Vk PC9jb2RlPiBjYW4gYmUgdXNlZCBvbiBhbnkgcGFnZSwgYW5kIGlzIGdlbmVyYWxseSB1c2Vk IHRvIGdlbmVyYXRlIGEgc2ltcGxlIHRhZyBjbG91ZCBvZiBhbGwgdGhlIHRhZ3MgdXNlZCBv biB5b3VyIHNpdGUuICBUaGUgY2xvdWQgaXMgcmVhbGx5IGp1c3QgYSBsaXN0IG9mIGxpbmtz LCBtdWNoIGxpa2UgdGhhdCBnZW5lcmF0ZWQgYnkgPGNvZGU+dHJ1X3RhZ3NfZnJvbV9hcnRp Y2xlPC9jb2RlPiwgYnV0IHdpdGggYSA8Y29kZT5zdHlsZTwvY29kZT4gYXR0cmlidXRlIHNl dCBvbiBlYWNoIGxpbmsgdG8gZ2l2ZSBpdCBhIGZvbnQgc2l6ZSByYW5naW5nIGZyb20gMTAw JSB0byAyMDAlLjwvcD4KPHA+PGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4gY2FuIGJlIHVz ZWQgb24gYW55IHBhZ2UsIGFuZCBpcyBnZW5lcmFsbHkgdXNlZCB0byBvdXRwdXQgYSBidWxs ZXRlZCBsaXN0IG9mIGFsbCB0aGUgdGFncyB1c2VkIG9uIHlvdXIgc2l0ZS4gIEJ5IGRlZmF1 bHQsIHRoZSB0YWdzIHdpbGwgYWxsIGhhdmUgYSBmb250LXNpemUgb2YgMTAwJS48L3A+Cgk8 aDU+Qm90aCB0YWdzIGFjY2VwdCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9oNT4KCTx1 bD4KCQk8bGk+VGhlIHN0YW5kYXJkIDxjb2RlPndyYXB0YWc8L2NvZGU+LCA8Y29kZT5icmVh azwvY29kZT4sIDxjb2RlPmNsYXNzPC9jb2RlPiwgYW5kIDxjb2RlPmJyZWFrY2xhc3M8L2Nv ZGU+IGF0dHJpYnV0ZXMuICA8Y29kZT50cnVfdGFnc19jbG91ZDwvY29kZT4gaGFzIGEgZGVm YXVsdCA8Y29kZT5icmVhazwvY29kZT4gb2YgYSBjb21tYS4gIDxjb2RlPnRydV90YWdzX2xp c3Q8L2NvZGU+IGhhcyBhIGRlZmF1bHQgPGNvZGU+d3JhcHRhZzwvY29kZT4gb2YgPGNvZGU+ dWw8L2NvZGU+IGFuZCBhIGRlZmF1bHQgPGNvZGU+YnJlYWs8L2NvZGU+IG9mIDxjb2RlPmxp PC9jb2RlPi48L2xpPgoJCTxsaT48Y29kZT50YWdzZWN0aW9uPC9jb2RlPiwgd2hpY2ggdGVs bHMgdHJ1X3RhZ3Mgd2hhdCByZWxhdGl2ZSB1cmwgdG8gdXNlIHRvIGZpbmQgdGhlICYjODIx Njt0YWcmIzgyMTc7IHNlY3Rpb24uICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUg bmFtZWQgdGhlIHNlY3Rpb24gc29tZXRoaW5nIG90aGVyIHRoYW4gJiM4MjE2O3RhZyYjODIx NzsuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byA8Y29kZT50YWc8L2NvZGU+LjwvbGk+ CgkJPGxpPjxjb2RlPnNlY3Rpb248L2NvZGU+LCB3aGljaCB0ZWxscyBpdCB0byBsaW1pdCB0 aGUgbGlzdCB0byB0YWdzIGZyb20gdGhlIGdpdmVuIHNlY3Rpb24gb3Igc2VjdGlvbnMuICBG b3IgZXhhbXBsZSwgPGNvZGU+Jmx0O3R4cDp0cnVfdGFnc19jbG91ZCBzZWN0aW9uPSJibG9n LHJlZmVyZW5jZSIgLyZndDs8L2NvZGU+IHdvdWxkIG9ubHkgc2hvdyB0YWdzIGZyb20gdGhl ICYjODIyMDtibG9nJiM4MjIxOyBhbmQgJiM4MjIwO3JlZmVyZW5jZSYjODIyMTsgc2VjdGlv bnMuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byBibGFuayAodG8gc2hvdyB0YWdzIGZy b20gYWxsIHNlY3Rpb25zKS4KCTx1bD4KCQk8bGk+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBp ZiB5b3UgdXNlIDxjb2RlPnNlY3Rpb248L2NvZGU+IHRvIGxpbWl0IHRoZSBjbG91ZCB0byBh IHBhcnRpY3VsYXIgc2VjdGlvbiwgaXQgd29uJiM4MjE3O3QgbGltaXQgdGhlIHRhZyBzZWFy Y2ggZmVhdHVyZSB0byB0aGF0IHNlY3Rpb24uICBUaGUgdGFnIHNlYXJjaCBmaW5kcyAodGFn Z2VkKSBhcnRpY2xlcyBmcm9tIGFsbCBzZWN0aW9ucywgbm8gbWF0dGVyIHdoYXQuICBUaGF0 JiM4MjE3O3MgYSBzaWRlLWVmZmVjdCBvZiB0aGUgdXNlIG9mIDxjb2RlPmRvQXJ0aWNsZXMo KTwvY29kZT4sIGFuZCBJIGRvbiYjODIxNzt0IHRoaW5rIHRoZXJlJiM4MjE3O3MgYW55dGhp bmcgSSBjYW4gZG8gYWJvdXQgaXQuPC9saT4KCTwvdWw+PC9saT4KCQk8bGk+PGNvZGU+bWlu cGVyY2VudDwvY29kZT4gYW5kIDxjb2RlPm1heHBlcmNlbnQ8L2NvZGU+LCB3aGljaCBjYW4g YmUgdXNlZCB0byBjb250cm9sIHRoZSB3ZWlnaHRlZCBmb250IHNpemVzIGluIHRoZSB0YWcg Y2xvdWQvbGlzdC4gIDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBkZWZhdWx0cyB0byA8 Y29kZT4xMDA8L2NvZGU+IGFuZCA8Y29kZT4yMDA8L2NvZGU+LCByZXNwZWN0aXZlbHksIGFu ZCA8Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPiBkZWZhdWx0cyB0byA8Y29kZT4xMDA8L2Nv ZGU+IGFuZCA8Y29kZT4xMDA8L2NvZGU+LjwvbGk+CgkJPGxpPjxjb2RlPnNob3djb3VudHM8 L2NvZGU+LCB3aGljaCB3aWxsIGFwcGVuZCBhIG51bWJlciBpbmRpY2F0aW5nIHRoZSBudW1i ZXIgb2YgdGltZXMgYSB0YWcgaGFzIGJlZW4gdXNlZCwgdG8gZWFjaCB0YWcgaW4gdGhlIGxp c3QuICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHNlZTogPHNwYW4gY2xhc3M9InByZSI+PGEg aHJlZj0iLz9zPXRhZyYjMzg7dD1saWZlIj5saWZlPC9hPiBbM10sIDxhIGhyZWY9Ii8/cz10 YWcmIzM4O3Q9dGVjaCI+dGVjaDwvYT4gWzVdPC9zcGFuPiBpbiBteSB0YWcgY2xvdWQsIGlm IHRoaXMgd2FzIHR1cm5lZCBvbi4gIFRoaXMgaXMgb2ZmIGJ5IGRlZmF1bHQuICBVc2UgPGNv ZGU+MTwvY29kZT4gb3IgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gdHVybiBpdCBvbi48L2xpPgoJ CTxsaT48Y29kZT5jb3VudHdyYXBjaGFyczwvY29kZT4sIHdoaWNoIGNvbnRyb2xzIHRoZSBj aGFyYWN0ZXJzIHVzZWQgdG8gc2hvdyB0aGUgdGFnIGNvdW50LCBpZiA8Y29kZT5zaG93Y291 bnRzPC9jb2RlPiBpcyB0dXJuZWQgb24uICBCeSBkZWZhdWx0IHRoaXMgaXMgPGNvZGU+W108 L2NvZGU+LiAgVGhlIGZpcnN0IGNoYXJhY3RlciB3aWxsIGJlIHB1dCBvbiB0aGUgbGVmdCBz aWRlIG9mIHRoZSBudW1iZXIsIGFuZCB0aGUgc2Vjb25kIGNoYXJhY3RlciB3aWxsIGJlIHB1 dCBvbiB0aGUgcmlnaHQuICBGb3IgZXhhbXBsZSwgYSA8Y29kZT5jb3VudHdyYXBjaGFyczwv Y29kZT4gb2YgPGNvZGU+KCk8L2NvZGU+IHdvdWxkIHNob3c6IDxzcGFuIGNsYXNzPSJwcmUi PjxhIGhyZWY9Ii8/cz10YWcmIzM4O3Q9bGlmZSI+bGlmZTwvYT4gKDMpLCA8YSBocmVmPSIv P3M9dGFnJiMzODt0PXRlY2giPnRlY2g8L2E+ICg1KTwvc3Bhbj48L2xpPgoJCTxsaT5JZiB5 b3UgaGF2ZSBjbGVhbiB1cmxzIHR1cm5lZCBvbiAoc2VlIGFib3ZlKSwgeW91IGNhbiB1c2Ug dGhlIDxjb2RlPnVzZXJlbHRhZ3M8L2NvZGU+IGF0dHJpYnV0ZSB0byBzcGVjaWZ5IHdoZXRo ZXIgbGlua3MgaW4gdGhlIGxpc3Qgc2hvdWxkIGhhdmUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9t aWNyb2Zvcm1hdHMub3JnL3dpa2kvcmVsdGFnIj48Y29kZT5yZWw9InRhZyI8L2NvZGU+PC9h PiAgKHVzZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy50ZWNobm9yYXRpLmNvbS8iPlRlY2hu b3JhdGk8L2E+KSBhdHRyaWJ1dGUgc2V0LiAgVGhpcyBpcyBvbiBieSBkZWZhdWx0LjwvbGk+ Cgk8L3VsPgoJPHA+Tm90ZSB0aGF0IHlvdSBjYW4gdXNlIHRoZSBhdHRyaWJ1dGVzIHRvIG1h a2UgZWFjaCB0YWcgZG8gdGhlIHNhbWUgdGhpbmcuICA8Y29kZT50cnVfdGFnc19jbG91ZDwv Y29kZT4gaXMganVzdCBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZW5lcmF0aW5nIGEg dGFnIGNsb3VkIHVzaW5nIDxjb2RlPnRydV90YWdzX2xpc3Q8L2NvZGU+LiAgVGhlcmVmb3Jl LCBpdCYjODIxNztzIHBvc3NpYmxlIHRvIGhhdmUgYSB0YWcgY2xvdWQgd2l0aCB0YWcgY291 bnRzIHNob3dpbmcsIG9yIGhhdmUgYSBidWxsZXRlZCBsaXN0IHdpdGggdmFyaWFibGUgZm9u dCBzaXplcywgZXRjLjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19pZl90YWdfc2VhcmNoPC9j b2RlPjwvaDQ+Cgk8cD5UaGlzIGNvbmRpdGlvbmFsIHRhZyBjYW4gYmUgdXNlZCBhbnl3aGVy ZSBhbmQgd2lsbCBldmFsdWF0ZSBpdHMgY29udGVudHMgKGUuZy4gJiM4MjIwO3JldHVybiB0 cnVlJiM4MjIxOykgaWYgdGhlIGN1cnJlbnQgdXJsIGluZGljYXRlcyB0aGF0IHRoZXJlIGlz IGEgdGFnIHNlYXJjaCBnb2luZyBvbi4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2Fu dCB0byBkbyBzb21ldGhpbmcgbGlrZSBjdXN0b21pemUgdGhlIHRpdGxlYmFyIHdoZW4gdXNp bmcgdGhlIHRhZyBzZWFyY2guPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX3RhZ19wYXJhbWV0 ZXI8L2NvZGU+PC9oND4KCTxwPlRoaXMgdGFnIGNhbiBiZSB1c2VkIGFueXdoZXJlIGFuZCB3 aWxsIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgdW5kZXIgc2VhcmNoLCBk dXJpbmcgYSB0YWcgc2VhcmNoLiAgVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB3aXRoIDxjb2Rl PnRydV90YWdzX2lmX3RhZ19zZWFyY2g8L2NvZGU+LjwvcD4KCTxoND48Y29kZT50cnVfdGFn c19zZWFyY2hfcGFyYW1ldGVyPC9jb2RlPjwvaDQ+Cgk8cD5UaGlzIHRhZyBjYW4gYmUgdXNl ZCBhbnl3aGVyZSBhbmQgd2lsbCByZXR1cm4gdGhlIHRleHQgdGhlIHVzZXIgdHlwZWQgaW50 byB0aGUgc3RhbmRhcmQgc2VhcmNoIGJveCwgZHVyaW5nIGEgcmVndWxhciBzZWFyY2guICBU aGlzIHRhZyBpcyBub3Qgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdGFnZ2luZywgYnV0IGNh biBiZSBoYW5keSBmb3IgY3VzdG9taXppbmcgdGhlIHRpdGxlYmFyIG9uIHNlYXJjaCByZXN1 bHQgcGFnZXMuPC9wPgoKCiAiO3M6NDoiY29kZSI7czo1MDc5OiIKCgojQ29weXJpZ2h0IDIw MDYgTmF0aGFuIEFydGh1cgojUmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5z ZSwgc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2Uu cGhwIGZvciBkZXRhaWxzCiNUaGlzIHdvcmsgaXMgYmFzZWQgb24gcmFuX3RhZ3MgYnkgUmFu IEFyb3Vzc2ksIG9yaWdpbmFsbHkgZm91bmQgYXQgaHR0cDovL2Fyb3Vzc2kuY29tL2FydGlj bGUvNDUvdGFnZ2luZy10ZXh0cGF0dGVybgoKCiNTZWUgaHR0cDovL3d3dy50cnVpc3QuY29t L3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMgZm9yIGluc3RydWN0 aW9ucwpmdW5jdGlvbiB0cnVfdGFnc191c2VfY2xlYW5fdXJscygpCnsKCXJldHVybiAwOyAj RE8gTk9UIEVOQUJMRSBUSElTIHVubGVzcyB5b3UndmUgcmVhZCB0aGUgaW5zdHJ1Y3Rpb25z Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19oYW5kbGVyKCRhdHRzKSB7CglleHRyYWN0KCRfR0VU KTsKCWlmICghaXNzZXQoJHQpKSB7CgkJcmV0dXJuIHRydV90YWdzX2Nsb3VkKCRhdHRzKTsK CX0KCWVsc2UgewoJCSRhdHRzWydrZXl3b3JkcyddID0gc3RyaXBfdGFncygkdCk7CgkJaWYg KCRhdHRzWydzZWN0aW9uJ10gJiYgc3RycG9zKCRhdHRzWydzZWN0aW9uJ10sICcsJykgIT09 IGZhbHNlKQoJCQkkYXR0c1snc2VjdGlvbiddID0gJyc7CgkJaWYgKCEkYXR0c1snbGltaXQn XSkKCQkJJGF0dHNbJ2xpbWl0J10gPSAnMTAwMCc7CgoJCXJldHVybiBkb0FydGljbGVzKCRh dHRzLCB0cnVlKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2lmX2hhc190YWdzKCRhdHRz LCAkdGhpbmcpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRyYWN0KCR0aGlzYXJ0aWNs ZSk7CgoJJHRhZ3NfZmllbGQgPSB0cnVfdGFnc19maWVsZCgpOwoKCSRycyA9IHNhZmVfcm93 KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19m aWVsZCA8PiAnJyIpOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0K CgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGljbGUoJGF0dHMpIHsKCglnbG9iYWwgJHRo aXNhcnRpY2xlLCAkc2l0ZXVybCwgJHBhdGhfZnJvbV9yb290OwoKCWV4dHJhY3QoJF9TRVJW RVIpOwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3dy YXB0YWcnICAgICAgID0+ICcnLAoJCQkJCQknYnJlYWsnICAgICAgICAgPT4gJywgJywKCQkJ CQkJJ2NsYXNzJyAgICAgICAgID0+ICcnLAoJCQkJCQknYnJlYWtjbGFzcycJPT4gJycsCgkJ CQkJCSd0YWdzZWN0aW9uJwk9PiAndGFnJywKCQkJCQkJJ3VzZXJlbHRhZycJPT4gJzEnCgkJ CQkJCSksJGF0dHMpKTsKCgkkdGFnc19maWVsZCA9IHRydV90YWdzX2ZpZWxkKCk7CgoJJHJz ID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJHRoaXNpZCcg QU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CgkkYWxsX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJp bShzdHJ0b2xvd2VyKCRyc1skdGFnc19maWVsZF0pKSk7Cglzb3J0KCRhbGxfdGFncyk7Cgkk YWxsX3RhZ3MgPSBhcnJheV91bmlxdWUoJGFsbF90YWdzKTsKCglpZiAodHJ1X3RhZ3NfdXNl X2NsZWFuX3VybHMoKSkgewoJCSR1cmxwcmVmaXggPSAnaHR0cDovLycgLiAkc2l0ZXVybCAu ICRwYXRoX2Zyb21fcm9vdCAuICR0YWdzZWN0aW9uIC4gJy8nOwoJCSR1cmxzdWZmaXggPSAk dXNlcmVsdGFnID8gJy8iIHJlbD0idGFnJzogJy8nOwoJfSBlbHNlIHsKCQkkdXJscHJlZml4 ID0gJ2h0dHA6Ly8nIC4gJHNpdGV1cmwgLiAkcGF0aF9mcm9tX3Jvb3QgLiAnP3M9JyAuICR0 YWdzZWN0aW9uIC4gJyZhbXA7dD0nOwoJCSR1cmxzdWZmaXggPSAnJzsKCX0KCglmb3IoJGk9 MDsgJGk8Y291bnQoJGFsbF90YWdzKTsgJGkrKykgewoJCSR0YWdzX2h0bWxbXSA9ICc8YSBo cmVmPSInIC4gJHVybHByZWZpeCAuICRhbGxfdGFnc1skaV0gLiAkdXJsc3VmZml4IC4gJyI+ JyAuICRhbGxfdGFnc1skaV0gLic8L2E+JzsKCX0KCXJldHVybiBkb1dyYXAoJHRhZ3NfaHRt bCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgpmdW5jdGlv biB0cnVfdGFnc19jbG91ZCgkYXR0cykgewoJJGF0dHMgPSBsQXR0cyhhcnJheSgnd3JhcHRh ZycJPT4gJycsCgkJCQknYnJlYWsnCT0+ICcsICcsCgkJCQknY2xhc3MnCT0+ICcnLAoJCQkJ J2JyZWFrY2xhc3MnCT0+ICcnLAoJCQkJJ3RhZ3NlY3Rpb24nCT0+ICd0YWcnLAoJCQkJJ3Nl Y3Rpb24nCT0+ICcnLAoJCQkJJ21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQkJJ21heHBlcmNl bnQnCT0+ICcyMDAnLAoJCQkJJ3Nob3djb3VudHMnCT0+ICcnLAoJCQkJJ2NvdW50d3JhcGNo YXJzJwk9PiAnW10nLAoJCQkJJ3VzZXJlbHRhZycJPT4gJycKCQkJKSwkYXR0cyk7CgoJcmV0 dXJuIHRydV90YWdzX2xpc3QoJGF0dHMpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbGlzdCgk YXR0cykgewoJZ2xvYmFsICRzaXRldXJsLCAkcGF0aF9mcm9tX3Jvb3Q7CglleHRyYWN0KCRf U0VSVkVSKTsKCgkkYXR0cyA9IGxBdHRzKGFycmF5KCd3cmFwdGFnJwk9PiAndWwnLAoJCQkJ J2JyZWFrJwk9PiAnbGknLAoJCQkJJ2NsYXNzJwk9PiAnJywKCQkJCSdicmVha2NsYXNzJwk9 PiAnJywKCQkJCSd0YWdzZWN0aW9uJwk9PiAndGFnJywKCQkJCSdzZWN0aW9uJwk9PiAnJywK CQkJCSdtaW5wZXJjZW50Jwk9PiAnMTAwJywKCQkJCSdtYXhwZXJjZW50Jwk9PiAnMTAwJywK CQkJCSdzaG93Y291bnRzJwk9PiAnJywKCQkJCSdjb3VudHdyYXBjaGFycycJPT4gJ1tdJywK CQkJCSd1c2VyZWx0YWcnCT0+ICcnCgkJCSksJGF0dHMpOwoJZXh0cmFjdCgkYXR0cyk7CgoJ JHRhZ3NfZmllbGQgPSB0cnVfdGFnc19maWVsZCgpOwoKCSRzZWN0aW9uX2NsYXVzZSA9ICcn OwoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7CgkJJGtleXMgPSBzcGxpdCgnLCcsICRzZWN0aW9u KTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0 aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIiciOwoJCX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAi IEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5cGFydHMpIC4gIikiOwoJfQoKCWluY2x1ZGVf b25jZSB0eHBhdGguJy9wdWJsaXNoL3NlYXJjaC5waHAnOwoJJGZpbHRlciA9IGZpbHRlclNl YXJjaCgpOwoJJGFsbF90YWdzID0gYXJyYXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRhZ3Nf ZmllbGQiLCAidGV4dHBhdHRlcm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25f Y2xhdXNlIC4gJGZpbHRlciAuICIgYW5kIFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8IG5v dygpIik7Cglmb3JlYWNoICgkcnMgYXMgJHJvdykgewoJCSRhbGxfdGFncyA9IGFycmF5X21l cmdlKCRhbGxfdGFncywgZXhwbG9kZSgiLCIsIHRyaW0oc3RydG9sb3dlcigkcm93WyR0YWdz X2ZpZWxkXSkpKSk7Cgl9Cglzb3J0KCRhbGxfdGFncyk7CgoJJHRhZ3Nfd2VpZ2h0ID0gYXJy YXlfY291bnRfdmFsdWVzKCRhbGxfdGFncyk7CgkkdGFnc191bmlxdWUgPSBhcnJheV91bmlx dWUoJGFsbF90YWdzKTsKCgkkbWF4ID0gbWF4KCR0YWdzX3dlaWdodCk7CgkkbWluID0gbWlu KCR0YWdzX3dlaWdodCk7Cgkkc3RlcHZhbHVlID0gKCRtYXggPT0gJG1pbikgPyAwIDogKCRt YXhwZXJjZW50IC0gJG1pbnBlcmNlbnQpIC8gKCRtYXggLSAkbWluKTsKCglpZiAodHJ1X3Rh Z3NfdXNlX2NsZWFuX3VybHMoKSkgewoJCSR1cmxwcmVmaXggPSAnaHR0cDovLycgLiAkc2l0 ZXVybCAuICRwYXRoX2Zyb21fcm9vdCAuICR0YWdzZWN0aW9uIC4gJy8nOwoJCSR1cmxzdWZm aXggPSAkdXNlcmVsdGFnID8gJy8iIHJlbD0idGFnJzogJy8nOwoJfSBlbHNlIHsKCQkkdXJs cHJlZml4ID0gJ2h0dHA6Ly8nIC4gJHNpdGV1cmwgLiAkcGF0aF9mcm9tX3Jvb3QgLiAnP3M9 JyAuICR0YWdzZWN0aW9uIC4gJyZhbXA7dD0nOwoJCSR1cmxzdWZmaXggPSAnJzsKCX0KCglm b3JlYWNoICgkdGFnc191bmlxdWUgYXMgJHRhZykgewoJCSR0YWdfd2VpZ2h0ID0gJG1pbnBl cmNlbnQgKyAoJHRhZ3Nfd2VpZ2h0WyR0YWddIC0gJG1pbikgKiAkc3RlcHZhbHVlOwoKCQkv L2FkYXB0ZWQgZnJvbSBjb2RlIGJ5IGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0 cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUKCQkkY291bnQg PSAkY291bnR3cmFwY2hhcnN7MH0gLiAkdGFnc193ZWlnaHRbJHRhZ10gLiAkY291bnR3cmFw Y2hhcnN7MX07CgkJaWYgKCRzaG93Y291bnRzID09ICd0aXRsZScgfHwgJHNob3djb3VudHMg PT0gJ2JvdGgnKQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkY291bnQgLiAnIic7 CgkJaWYgKCRzaG93Y291bnRzICYmICRzaG93Y291bnRzICE9ICd0aXRsZScpCgkJCSRkaXNw bGF5Y291bnQgPSAnICcgLiAkY291bnQ7CgoJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPSIn IC4gJHVybHByZWZpeCAuICR0YWcgLiAkdXJsc3VmZml4IC4gJyIgc3R5bGU9ImZvbnQtc2l6 ZTonLiAkdGFnX3dlaWdodCAuICclOyInIC4gJHRpdGxlY291bnQgLiAnPicgLiAkdGFnIC4n PC9hPicgLiAkZGlzcGxheWNvdW50OwoJfQoKCXJldHVybiBkb1dyYXAoJHRhZ3NfaHRtbCwg JHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpCnsKCSR0YWdfc2VhcmNoaW5n ID0gZ3BzKCd0Jyk7CgkkY29uZGl0aW9uID0gKCFlbXB0eSgkdGFnX3NlYXJjaGluZykpPyB0 cnVlIDogZmFsc2U7CglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9u KSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCkKewoJcmV0dXJuIHN0 cmlwX3RhZ3MoZ3BzKCd0JykpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFt ZXRlcigpCnsKCXJldHVybiBzdHJpcF90YWdzKGdwcygncScpKTsKfQoKZnVuY3Rpb24gdHJ1 X3RhZ3NfZmllbGQoKSB7CglyZXR1cm4gJ0tleXdvcmRzJzsKfQoKCgoiO3M6MzoibWQ1Ijtz OjMyOiI4Y2EwZjNjYzc1ZDJiNzU2ZGFhYzMyZTlmNjJiZmQxNCI7fQ==