# tru_tags v1.1 # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMS4xIjtzOjY6ImF1dGhvciI7czoxMzoiTmF0aGFu IEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL3RydWlzdC5jb20vIjtz OjExOiJkZXNjcmlwdGlvbiI7czozNzoiVGFnZ2luZyBzdXBwb3J0IHdpdGggZnVsbCBpbnRl Z3JhdGlvbiI7czo0OiJ0eXBlIjtpOjA7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjQ6 ImhlbHAiO3M6MTAxOTE6IgoJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hl Y2sgb3V0IHRoZSA8YSBocmVmPSIvYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2lu LWZvci10ZXh0cGF0dGVybiI+aW50cm9kdWN0b3J5IGFydGljbGU8L2E+IGFuZCA8YSBocmVm PSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUt bGlzdCI+ZmVhdHVyZSBsaXN0PC9hPi48L3A+Cgk8cD5Db3B5cmlnaHQgMjAwNiBOYXRoYW4g QXJ0aHVyPC9wPgoJPHA+UmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwg c2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhw IGZvciBkZXRhaWxzPC9wPgoJPHA+VGhpcyB3b3JrIGlzIGJhc2VkIG9uIHJhbl90YWdzIGJ5 IFJhbiBBcm91c3NpLCBvcmlnaW5hbGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9h cnRpY2xlLzQ1L3RhZ2dpbmctdGV4dHBhdHRlcm4uICBJdCBhbHNvIGNvbnRhaW5zIGNvZGUg YWRhcHRlZCBmcm9tIGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5j b20vdmlld3RvcGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUuPC9wPgoJPGgzPkNvbmZpZ3Vy YXRpb248L2gzPgoJPGg0PlN0ZXAgMTogQ3JlYXRlIGEgbmV3IHNlY3Rpb248L2g0PgoJPHA+ dHJ1X3RhZ3MgZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgc3BlY2lhbCBUZXh0cGF0 dGVybiBzZWN0aW9uIG5hbWVkICYjODIyMDt0YWcsJiM4MjIxOyBieSBkZWZhdWx0PHN1cD48 YSBocmVmPSIjZm4xMjQ3NjA1MzUzNDQxMWI4MjM3YjAzZSI+MTwvYT48L3N1cD4uICBDcmVh dGUgdGhhdCBzZWN0aW9uLCB1c2luZyB3aGF0ZXZlciBzZXR0aW5ncyB5b3UgbGlrZS4gIChZ b3Ugd29uJiM4MjE3O3QgYmUgcHVibGlzaGluZyBhcnRpY2xlcyB0byB0aGF0IHNlY3Rpb24u KSAgSGVyZSYjODIxNztzIHdoYXQgSSB1c2U8c3VwPjxhIGhyZWY9IiNmbjE5MDY5NzM3OTI0 NDExYjgyMzdmZTVkIj4yPC9hPjwvc3VwPjo8L3A+Cgk8cD48aW1nIHNyYz0iaHR0cDovL3d3 dy50cnVpc3QuY29tL2ltYWdlcy8yLnBuZyIgaGVpZ2h0PSIyODAiIHdpZHRoPSIzOTgiIGFs dD0idGFnIHNlY3Rpb24gY29uZmlndXJhdGlvbiIgY2xhc3M9ImRpYWdyYW0iIC8+PC9wPgoJ PHAgY2xhc3M9ImZvb3Rub3RlIiBpZD0iZm4xMjQ3NjA1MzUzNDQxMWI4MjM3YjAzZSI+PHN1 cD4xPC9zdXA+IFlvdSBjYW4gdXNlIGEgZGlmZmVyZW50IG5hbWUsIGJ1dCB5b3UgaGF2ZSB0 byB1c2UgYSBzcGVjaWFsIGF0dHJpYnV0ZSBpbiBzb21lIG9mIHRoZSBwbHVnaW4gY2FsbHMg dG8gbWFrZSAgZXZlcnl0aGluZyB3b3JrIGNvcnJlY3RseS4gIFNlZSBiZWxvdyBmb3IgZGV0 YWlscy48L3A+Cgk8cCBjbGFzcz0iZm9vdG5vdGUiIGlkPSJmbjE5MDY5NzM3OTI0NDExYjgy MzdmZTVkIj48c3VwPjI8L3N1cD4gTm90ZSB0aGF0IEkgdXNlIHRoZSAmIzgyMTY7ZGVmYXVs dCYjODIxNzsgcGFnZSAmIzgyMTE7IHRoYXQgY2hvaWNlIG1heSBub3QgYmUgcmlnaHQgZm9y IHlvdS4gIFRoaXMgc2VjdGlvbiB3aWxsIGJlIHNob3duIHdoZW5ldmVyIHlvdSBjbGljayBv biBhIHRhZywgdG8gZGlzcGxheSB0aGUgdGFnIHNlYXJjaCByZXN1bHRzLiAgWW91JiM4MjE3 O2xsIHdhbnQgYSBwYWdlIHRoYXQgaGFzIHRoZSBjb3JyZWN0IGxheW91dC9oZWFkZXJzL2Zv b3RlcnMuICBJIHVzZSBteSBkZWZhdWx0IHBhZ2UsIHdpdGggPGNvZGU+Jmx0O3R4cDppZl9z ZWN0aW9uIG5hbWU9InRhZyImZ3Q7PC9jb2RlPiB0byBjaGFuZ2UgdGhlIHBhZ2UgZGlzcGxh eSBpbiB0aGlzIGNhc2UuPC9wPgoJPGg0PlN0ZXAgMjogQ2FsbCB0aGUgcGx1Z2luIGZyb20g dGhhdCBzZWN0aW9uPC9oND4KCTxwPlRvIG1ha2UgdGFnIHNlYXJjaGluZyBhbmQgdGhlIGRl ZmF1bHQgdGFnIGNsb3VkIHdvcmssIHlvdSYjODIxNztsbCBuZWVkIHRvIGNhbGwgPGNvZGU+ Jmx0O3R4cDp0cnVfdGFnc19oYW5kbGVyIC8mZ3Q7PC9jb2RlPiBmcm9tIHRoZSBwYWdlIHlv dSBjaG9zZSBpbiBTdGVwIDEuICBJIHJlcGxhY2VkIHRoZSBkZWZhdWx0IDxjb2RlPiZsdDt0 eHA6YXJ0aWNsZSAvJmd0OzwvY29kZT4gd2l0aCBzb21ldGhpbmcgbGlrZSB0aGlzOjwvcD4K PHByZT4mbHQ7dHhwOmlmX3NlY3Rpb24gbmFtZT0idGFnIiZndDsKICAmbHQ7dHhwOnRydV90 YWdzX2hhbmRsZXIgLyZndDsKJmx0O3R4cDplbHNlIC8mZ3Q7CiAgJmx0O3R4cDphcnRpY2xl IC8mZ3Q7CiZsdDsvdHhwOmlmX3NlY3Rpb24mZ3Q7PC9wcmU+Cgk8aDQ+U3RlcCAzOiBDb25m aWd1cmUgeW91ciBhcnRpY2xlIGZvcm0gdG8gZGlzcGxheSB0YWdzPC9oND4KCTxwPlRvIG1h a2UgZWFjaCBhcnRpY2xlIHNob3cgYSBsaXN0IG9mIGFsbCB0aGUgdGFncyBhc3NvY2lhdGVk IHdpdGggaXQsIHB1dCBzb21ldGluZyBsaWtlIHRoaXMgaW4geW91ciBhcnRpY2xlIGZvcm06 PC9wPgo8cHJlPiZsdDt0eHA6dHJ1X3RhZ3NfaWZfaGFzX3RhZ3MmZ3Q7CiAgdGFnczogJmx0 O3R4cDp0cnVfdGFnc19mcm9tX2FydGljbGUgLyZndDsKJmx0Oy90eHA6dHJ1X3RhZ3NfaWZf aGFzX3RhZ3MmZ3Q7PC9wcmU+Cgk8aDQ+U3RlcCA0OiBEcm9wIGEgY3VzdG9tIHRhZyBjbG91 ZCBzb21ld2hlcmUsIGlmIHlvdSB3YW50PC9oND4KCTxwPklmIHlvdSYjODIxNztkIGxpa2Ug dG8gc2hvdyBhIHRhZyBjbG91ZCBzb21ld2hlcmUgb24geW91ciBzaXRlIChvdGhlciB0aGFu IC90YWcvKSwgcHV0IHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gdGhhdCBwYWdlOjwvcD4KPHBy ZT4mbHQ7dHhwOnRydV90YWdzX2Nsb3VkIC8mZ3Q7PC9wcmU+Cgk8cD5TZWUgYmVsb3cgZm9y IGxvdHMgb2YgZm9ybWF0dGluZyBvcHRpb25zLCBpbmNsdWRpbmcgdGhlIGFiaWxpdHkgdG8g b3V0cHV0IGEgc2ltcGxlIGxpc3QgaW5zdGVhZCBvZiBhIGNsb3VkICh1c2luZyA8Y29kZT50 cnVfdGFnc19saXN0PC9jb2RlPikuPC9wPgoJPGg0PlN0ZXAgNTogU3RhcnQgdGFnZ2luZyE8 L2g0PgoJPHA+V2hlbmV2ZXIgeW91IHdyaXRlIGFuIGFydGljbGUsIHB1dCB5b3VyIHRhZ3Mg aW50byB0aGUgS2V5d29yZHMgZmllbGQgaW4gVGV4dHBhdHRlcm4uICAoVGhlIEtleXdvcmRz IGZpZWxkIGhpZGVzIGJlaGluZCB0aGUgJiM4MjIwO0FkdmFuY2VkIE9wdGlvbnMmIzgyMjE7 IGxpbmsgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgJiM4MjIwO3dyaXRlJiM4MjIxOyBwYWdl LikgIFRhZ3Mgc2hvdWxkIGJlIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZCBjYW4gaGF2ZSBz cGFjZXMuICBCZSBjYXJlZnVsIG5vdCB0byBsZWF2ZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmlu ZyBhbmQgZW5kIG9mIHRhZ3MuICBIZXJlJiM4MjE3O3MgYSBnb29kIGV4YW1wbGU6PC9wPgoJ PHA+PGltZyBzcmM9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9pbWFnZXMvMy5wbmciIGhlaWdo dD0iMTEwIiB3aWR0aD0iMTE4IiBhbHQ9InRhZ3Mgd2l0aCBzcGFjZXMsIGJ1dCBub3QgbmV4 dCB0byB0aGUgY29tbWFzIiBjbGFzcz0iZGlhZ3JhbSIgLz48L3A+Cgk8cD4uLi5hbmQgYSBi YWQgb25lOjwvcD4KCTxwPjxpbWcgc3JjPSJodHRwOi8vd3d3LnRydWlzdC5jb20vaW1hZ2Vz LzQucG5nIiBoZWlnaHQ9IjExMiIgd2lkdGg9IjExOSIgYWx0PSJ0YWdzIHdpdGggc3BhY2Vz IGFmdGVyIHRoZSBjb21tYXMgKFdST05HKSIgY2xhc3M9ImRpYWdyYW0iIC8+PC9wPgoJPHA+ WW91JiM4MjE3O2xsIHByb2JhYmx5IHdhbnQgdG8gaW5zdGFsbCBSb2IgU2FibGUmIzgyMTc7 cyA8YSBocmVmPSJodHRwOi8vd3d3LndpbHNoaXJlb25lLmNvbS90ZXh0cGF0dGVybi1wbHVn aW5zL3Jzcy1hZG1pbi1zaG93LWFkdi1vcHRzIj5yc3NfYWRtaW5fc2hvd19hZHZfb3B0czwv YT4sIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBleHBhbmQgdGhlICYjODIyMDtBZHZhbmNl ZCBPcHRpb25zJiM4MjIxOyBzZWN0aW9uIG9mIHRoZSAmIzgyMjA7d3JpdGUmIzgyMjE7IHBh Z2UsIHdoZW4geW91IGFyZSB3cml0aW5nIGFydGljbGVzLiAgVGhhdCBnaXZlcyB5b3UgZWFz eSBhY2Nlc3MgdG8gdGhlIEtleXdvcmRzIGZpZWxkLjwvcD4KCTxoND5TdGVwIDY6IEZhbmN5 IGRpc3BsYXkgY3VzdG9taXphdGlvbjwvaDQ+Cgk8cD5Zb3UgY2FuIHVzZSA8Y29kZT50cnVf dGFnc19pZl90YWdfc2VhcmNoPC9jb2RlPiwgPGNvZGU+dHJ1X3RhZ3NfdGFnX3BhcmFtZXRl cjwvY29kZT4sIGFuZCA8Y29kZT50cnVfdGFnc19zZWFyY2hfcGFyYW1ldGVyPC9jb2RlPiB0 byBjdXN0b21pemUgeW91ciBwYWdlIHRpdGxlcyBvciB0YWcgc2VhcmNoIHJlc3VsdHMuICBT ZWUgYmVsb3cgZm9yIGRldGFpbHMuICBTZWUgdGhlIHRpdGxlYmFyIG9mIDxhIGhyZWY9Imh0 dHA6Ly93d3cudHJ1aXN0LmNvbS8iPnRydWlzdC5jb208L2E+IGZvciBhbiBleGFtcGxlLjwv cD4KCTxoMz5UYWcgcmVmZXJlbmNlPC9oMz4KCTxoND48Y29kZT50cnVfdGFnc19oYW5kbGVy PC9jb2RlPjwvaDQ+Cgk8cD5UaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHRoYXQgZHJpdmVz IHRhZyBzZWFyY2gsIGFuZCBzaG93cyB0aGUgZ2VuZXJpYyB0YWcgY2xvdWQuICBJdCBzaG91 bGQgYmUgY2FsbGVkIGZyb20gdGhlIHBhZ2UgdGhhdCBpcyB1c2VkIGluIHRoZSAmIzgyMTY7 dGFnJiM4MjE3OyBzZWN0aW9uLiAgSXQgY2FsbHMgPGNvZGU+ZG9BcnRpY2xlcygpPC9jb2Rl PiAoaW4gdGhlIFRleHRwYXR0ZXJuIGNvZGUpIHRvIGRpc3BsYXkgdGFnIHNlYXJjaCByZXN1 bHRzLjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19pZl9oYXNfdGFnczwvY29kZT48L2g0PgoJ PHA+VGhpcyBjb25kaXRpb25hbCB0YWcgY2FuIGJlIHVzZWQgaW4gYW4gYXJ0aWNsZSBmb3Jt LCBhbmQgd2lsbCBldmFsdWF0ZSBpdHMgY29udGVudHMgKGUuZy4gJiM4MjIwO3JldHVybiB0 cnVlJiM4MjIxOykgaWYgdGhlIGN1cnJlbnQgYXJ0aWNsZSBoYXMgdGFncy48L3A+Cgk8aDQ+ PGNvZGU+dHJ1X3RhZ3NfZnJvbV9hcnRpY2xlPC9jb2RlPjwvaDQ+Cgk8cD5UaGlzIHRhZyBj YW4gYmUgdXNlZCBpbiBhbiBhcnRpY2xlIGZvcm0gdG8gcmV0dXJuIGEgbGlzdCBvZiB0YWdz IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBhcnRpY2xlLiAgRWFjaCB0YWcgaW4gdGhl IGxpc3Qgd2lsbCBiZSBhIGxpbmsgKDxjb2RlPiZsdDthIGhyZWY9Li4uJmd0OzwvY29kZT4p IHRvIHRoZSB0YWcgc2VhcmNoIHVybCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHRhZy48L3A+Cgk8 cD5UaGlzIHRhZyBhY2NlcHRzIHRoZSBzdGFuZGFyZCA8Y29kZT5icmVhazwvY29kZT4sIDxj b2RlPmNsYXNzPC9jb2RlPiwgYW5kIDxjb2RlPmJyZWFrY2xhc3M8L2NvZGU+IGF0dHJpYnV0 ZXMuPC9wPgoJPHA+SXQgYWxzbyBhY2NlcHRzIGEgPGNvZGU+dGFnc2VjdGlvbjwvY29kZT4g YXR0cmlidXRlLCB3aGljaCB0ZWxscyB0cnVfdGFncyB3aGF0IHJlbGF0aXZlIHVybCB0byB1 c2UgdG8gZmluZCB0aGUgJiM4MjE2O3RhZyYjODIxNzsgc2VjdGlvbi4gIFRoaXMgY2FuIGJl IHVzZWZ1bCBpZiB5b3UgaGF2ZSBuYW1lZCB0aGUgc2VjdGlvbiBzb21ldGhpbmcgb3RoZXIg dGhhbiAmIzgyMTY7dGFnJiM4MjE3Oy4gIEJ5IGRlZmF1bHQsIHRoaXMgaXMgc2V0IHRvIDxj b2RlPnRhZzwvY29kZT4uPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPjwv aDQ+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT48L2g0PgoJPHA+VGhlc2UgdHdv IHRhZ3MgZG8gdGhlIGV4YWN0IHNhbWUgdGhpbmcgJiM4MjExOyA8Y29kZT50cnVfdGFnc19j bG91ZDwvY29kZT4ganVzdCBwcm92aWRlcyBkaWZmZXJlbnQgZGVmYXVsdHMgdG8gPGNvZGU+ dHJ1X3RhZ3NfbGlzdDwvY29kZT4uPC9wPgo8cD48Y29kZT50cnVfdGFnc19jbG91ZDwvY29k ZT4gY2FuIGJlIHVzZWQgb24gYW55IHBhZ2UsIGFuZCBpcyBnZW5lcmFsbHkgdXNlZCB0byBn ZW5lcmF0ZSBhIHNpbXBsZSB0YWcgY2xvdWQgb2YgYWxsIHRoZSB0YWdzIHVzZWQgb24geW91 ciBzaXRlLiAgVGhlIGNsb3VkIGlzIHJlYWxseSBqdXN0IGEgbGlzdCBvZiBsaW5rcywgbXVj aCBsaWtlIHRoYXQgZ2VuZXJhdGVkIGJ5IDxjb2RlPnRydV90YWdzX2Zyb21fYXJ0aWNsZTwv Y29kZT4sIGJ1dCB3aXRoIGEgPGNvZGU+c3R5bGU8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgb24g ZWFjaCBsaW5rIHRvIGdpdmUgaXQgYSBmb250IHNpemUgcmFuZ2luZyBmcm9tIDEwMCUgdG8g MjAwJS48L3A+CjxwPjxjb2RlPnRydV90YWdzX2xpc3Q8L2NvZGU+IGNhbiBiZSB1c2VkIG9u IGFueSBwYWdlLCBhbmQgaXMgZ2VuZXJhbGx5IHVzZWQgdG8gb3V0cHV0IGEgYnVsbGV0ZWQg bGlzdCBvZiBhbGwgdGhlIHRhZ3MgdXNlZCBvbiB5b3VyIHNpdGUuICBCeSBkZWZhdWx0LCB0 aGUgdGFncyB3aWxsIGFsbCBoYXZlIGEgZm9udC1zaXplIG9mIDEwMCUuPC9wPgoJPGg1PkJv dGggdGFncyBhY2NlcHQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvaDU+Cgk8dWw+CgkJ PGxpPlRoZSBzdGFuZGFyZCA8Y29kZT53cmFwdGFnPC9jb2RlPiwgPGNvZGU+YnJlYWs8L2Nv ZGU+LCA8Y29kZT5jbGFzczwvY29kZT4sIGFuZCA8Y29kZT5icmVha2NsYXNzPC9jb2RlPiBh dHRyaWJ1dGVzLiAgPGNvZGU+dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+IGhhcyBhIGRlZmF1bHQg PGNvZGU+YnJlYWs8L2NvZGU+IG9mIGEgY29tbWEuICA8Y29kZT50cnVfdGFnc19saXN0PC9j b2RlPiBoYXMgYSBkZWZhdWx0IDxjb2RlPndyYXB0YWc8L2NvZGU+IG9mIDxjb2RlPnVsPC9j b2RlPiBhbmQgYSBkZWZhdWx0IDxjb2RlPmJyZWFrPC9jb2RlPiBvZiA8Y29kZT5saTwvY29k ZT4uPC9saT4KCQk8bGk+PGNvZGU+dGFnc2VjdGlvbjwvY29kZT4sIHdoaWNoIHRlbGxzIHRy dV90YWdzIHdoYXQgcmVsYXRpdmUgdXJsIHRvIHVzZSB0byBmaW5kIHRoZSAmIzgyMTY7dGFn JiM4MjE3OyBzZWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIG5hbWVk IHRoZSBzZWN0aW9uIHNvbWV0aGluZyBvdGhlciB0aGFuICYjODIxNjt0YWcmIzgyMTc7LiAg QnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gPGNvZGU+dGFnPC9jb2RlPi48L2xpPgoJCTxs aT48Y29kZT5zZWN0aW9uPC9jb2RlPiwgd2hpY2ggdGVsbHMgaXQgdG8gbGltaXQgdGhlIGxp c3QgdG8gdGFncyBmcm9tIHRoZSBnaXZlbiBzZWN0aW9uIG9yIHNlY3Rpb25zLiAgRm9yIGV4 YW1wbGUsIDxjb2RlPiZsdDt0eHA6dHJ1X3RhZ3NfY2xvdWQgc2VjdGlvbj0iYmxvZyxyZWZl cmVuY2UiIC8mZ3Q7PC9jb2RlPiB3b3VsZCBvbmx5IHNob3cgdGFncyBmcm9tIHRoZSAmIzgy MjA7YmxvZyYjODIyMTsgYW5kICYjODIyMDtyZWZlcmVuY2UmIzgyMjE7IHNlY3Rpb25zLiAg QnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gYmxhbmsgKHRvIHNob3cgdGFncyBmcm9tIGFs bCBzZWN0aW9ucykuCgk8dWw+CgkJPGxpPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gaWYgeW91 IHVzZSA8Y29kZT5zZWN0aW9uPC9jb2RlPiB0byBsaW1pdCB0aGUgY2xvdWQgdG8gYSBwYXJ0 aWN1bGFyIHNlY3Rpb24sIGl0IHdvbiYjODIxNzt0IGxpbWl0IHRoZSB0YWcgc2VhcmNoIGZl YXR1cmUgdG8gdGhhdCBzZWN0aW9uLiAgVGhlIHRhZyBzZWFyY2ggZmluZHMgKHRhZ2dlZCkg YXJ0aWNsZXMgZnJvbSBhbGwgc2VjdGlvbnMsIG5vIG1hdHRlciB3aGF0LiAgVGhhdCYjODIx NztzIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIHVzZSBvZiA8Y29kZT5kb0FydGljbGVzKCk8L2Nv ZGU+LCBhbmQgSSBkb24mIzgyMTc7dCB0aGluayB0aGVyZSYjODIxNztzIGFueXRoaW5nIEkg Y2FuIGRvIGFib3V0IGl0LjwvbGk+Cgk8L3VsPjwvbGk+CgkJPGxpPjxjb2RlPm1pbnBlcmNl bnQ8L2NvZGU+IGFuZCA8Y29kZT5tYXhwZXJjZW50PC9jb2RlPiwgd2hpY2ggY2FuIGJlIHVz ZWQgdG8gY29udHJvbCB0aGUgd2VpZ2h0ZWQgZm9udCBzaXplcyBpbiB0aGUgdGFnIGNsb3Vk L2xpc3QuICA8Y29kZT50cnVfdGFnc19jbG91ZDwvY29kZT4gZGVmYXVsdHMgdG8gPGNvZGU+ MTAwPC9jb2RlPiBhbmQgPGNvZGU+MjAwPC9jb2RlPiwgcmVzcGVjdGl2ZWx5LCBhbmQgPGNv ZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4gZGVmYXVsdHMgdG8gPGNvZGU+MTAwPC9jb2RlPiBh bmQgPGNvZGU+MTAwPC9jb2RlPi48L2xpPgoJCTxsaT48Y29kZT5zaG93Y291bnRzPC9jb2Rl Piwgd2hpY2ggd2lsbCBhcHBlbmQgYSBudW1iZXIgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9m IHRpbWVzIGEgdGFnIGhhcyBiZWVuIHVzZWQsIHRvIGVhY2ggdGFnIGluIHRoZSBsaXN0LiAg Rm9yIGV4YW1wbGUsIHlvdSBtaWdodCBzZWU6IDxzcGFuIGNsYXNzPSJwcmUiPjxhIGhyZWY9 Ii8/cz10YWcmIzM4O3Q9bGlmZSI+bGlmZTwvYT4gWzNdLCA8YSBocmVmPSIvP3M9dGFnJiMz ODt0PXRlY2giPnRlY2g8L2E+IFs1XTwvc3Bhbj4gaW4gbXkgdGFnIGNsb3VkLCBpZiB0aGlz IHdhcyB0dXJuZWQgb24uICBUaGlzIGlzIG9mZiBieSBkZWZhdWx0LiAgVXNlIDxjb2RlPjE8 L2NvZGU+IG9yIDxjb2RlPnRydWU8L2NvZGU+IHRvIHR1cm4gaXQgb24uPC9saT4KCQk8bGk+ PGNvZGU+Y291bnR3cmFwY2hhcnM8L2NvZGU+LCB3aGljaCBjb250cm9scyB0aGUgY2hhcmFj dGVycyB1c2VkIHRvIHNob3cgdGhlIHRhZyBjb3VudCwgaWYgPGNvZGU+c2hvd2NvdW50czwv Y29kZT4gaXMgdHVybmVkIG9uLiAgQnkgZGVmYXVsdCB0aGlzIGlzIDxjb2RlPltdPC9jb2Rl Pi4gIFRoZSBmaXJzdCBjaGFyYWN0ZXIgd2lsbCBiZSBwdXQgb24gdGhlIGxlZnQgc2lkZSBv ZiB0aGUgbnVtYmVyLCBhbmQgdGhlIHNlY29uZCBjaGFyYWN0ZXIgd2lsbCBiZSBwdXQgb24g dGhlIHJpZ2h0LiAgRm9yIGV4YW1wbGUsIGEgPGNvZGU+Y291bnR3cmFwY2hhcnM8L2NvZGU+ IG9mIDxjb2RlPigpPC9jb2RlPiB3b3VsZCBzaG93OiA8c3BhbiBjbGFzcz0icHJlIj48YSBo cmVmPSIvP3M9dGFnJiMzODt0PWxpZmUiPmxpZmU8L2E+ICgzKSwgPGEgaHJlZj0iLz9zPXRh ZyYjMzg7dD10ZWNoIj50ZWNoPC9hPiAoNSk8L3NwYW4+PC9saT4KCTwvdWw+Cgk8cD5Ob3Rl IHRoYXQgeW91IGNhbiB1c2UgdGhlIGF0dHJpYnV0ZXMgdG8gbWFrZSBlYWNoIHRhZyBkbyB0 aGUgc2FtZSB0aGluZy4gIDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBpcyBqdXN0IGEg Y29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgYSB0YWcgY2xvdWQgdXNpbmcg PGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4uICBUaGVyZWZvcmUsIGl0JiM4MjE3O3MgcG9z c2libGUgdG8gaGF2ZSBhIHRhZyBjbG91ZCB3aXRoIHRhZyBjb3VudHMgc2hvd2luZywgb3Ig aGF2ZSBhIGJ1bGxldGVkIGxpc3Qgd2l0aCB2YXJpYWJsZSBmb250IHNpemVzLCBldGMuPC9w PgoJPGg0Pjxjb2RlPnRydV90YWdzX2lmX3RhZ19zZWFyY2g8L2NvZGU+PC9oND4KCTxwPlRo aXMgY29uZGl0aW9uYWwgdGFnIGNhbiBiZSB1c2VkIGFueXdoZXJlIGFuZCB3aWxsIGV2YWx1 YXRlIGl0cyBjb250ZW50cyAoZS5nLiAmIzgyMjA7cmV0dXJuIHRydWUmIzgyMjE7KSBpZiB0 aGUgY3VycmVudCB1cmwgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSB0YWcgc2VhcmNoIGdv aW5nIG9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGlu ZyBsaWtlIGN1c3RvbWl6ZSB0aGUgdGl0bGViYXIgd2hlbiB1c2luZyB0aGUgdGFnIHNlYXJj aC48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcjwvY29kZT48L2g0PgoJ PHA+VGhpcyB0YWcgY2FuIGJlIHVzZWQgYW55d2hlcmUgYW5kIHdpbGwgcmV0dXJuIHRoZSBu YW1lIG9mIHRoZSBjdXJyZW50IHRhZyB1bmRlciBzZWFyY2gsIGR1cmluZyBhIHRhZyBzZWFy Y2guICBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHdpdGggPGNvZGU+dHJ1X3RhZ3NfaWZfdGFn X3NlYXJjaDwvY29kZT4uPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX3NlYXJjaF9wYXJhbWV0 ZXI8L2NvZGU+PC9oND4KCTxwPlRoaXMgdGFnIGNhbiBiZSB1c2VkIGFueXdoZXJlIGFuZCB3 aWxsIHJldHVybiB0aGUgdGV4dCB0aGUgdXNlciB0eXBlZCBpbnRvIHRoZSBzdGFuZGFyZCBz ZWFyY2ggYm94LCBkdXJpbmcgYSByZWd1bGFyIHNlYXJjaC4gIFRoaXMgdGFnIGlzIG5vdCBz cGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0YWdnaW5nLCBidXQgY2FuIGJlIGhhbmR5IGZvciBj dXN0b21pemluZyB0aGUgdGl0bGViYXIgb24gc2VhcmNoIHJlc3VsdCBwYWdlcy48L3A+CgoK ICI7czo0OiJjb2RlIjtzOjQwNTc6IgoKCiNDb3B5cmlnaHQgMjAwNiBOYXRoYW4gQXJ0aHVy CiNSZWxlYXNlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBzZWUgaHR0cDovL3d3 dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAgZm9yIGRldGFpbHMK I1RoaXMgd29yayBpcyBiYXNlZCBvbiByYW5fdGFncyBieSBSYW4gQXJvdXNzaSwgb3JpZ2lu YWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20vYXJ0aWNsZS80NS90YWdnaW5nLXRl eHRwYXR0ZXJuCgoKZnVuY3Rpb24gdHJ1X3RhZ3NfaGFuZGxlcigkYXR0cykgewoJZXh0cmFj dCgkX0dFVCk7CglpZiAoIWlzc2V0KCR0KSkgewoJCXJldHVybiB0cnVfdGFnc19jbG91ZCgw KTsKCX0KCWVsc2UgewoJCSRhdHRzWydrZXl3b3JkcyddID0gc3RyaXBfdGFncygkdCk7CgkJ cmV0dXJuIGRvQXJ0aWNsZXMoJGF0dHMsIHRydWUpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3NfaWZfaGFzX3RhZ3MoJGF0dHMsICR0aGluZykgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsK CWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9IHRydV90YWdzX2ZpZWxk KCk7CgoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0n JHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CglpZiAoJHJzKSB7CgkJcmV0dXJu IHBhcnNlKCR0aGluZyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGljbGUo JGF0dHMpIHsKCglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkc2l0ZXVybCwgJHBhdGhfZnJvbV9y b290OwoKCWV4dHJhY3QoJF9TRVJWRVIpOwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCWV4 dHJhY3QobEF0dHMoYXJyYXkoJ3dyYXB0YWcnICAgICAgID0+ICcnLAoJCQkJCQknYnJlYWsn ICAgICAgICAgPT4gJywgJywKCQkJCQkJJ2NsYXNzJyAgICAgICAgID0+ICcnLAoJCQkJCQkn YnJlYWtjbGFzcycJPT4gJycsCgkJCQkJCSd0YWdzZWN0aW9uJwk9PiAndGFnJywKCQkJCQkJ KSwkYXR0cykpOwoKCSR0YWdzX2ZpZWxkID0gdHJ1X3RhZ3NfZmllbGQoKTsKCgkkcnMgPSBz YWZlX3JvdygkdGFnc19maWVsZCwgInRleHRwYXR0ZXJuIiwgIklEPSckdGhpc2lkJyBBTkQg JHRhZ3NfZmllbGQgPD4gJyciKTsKCSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHN0 cnRvbG93ZXIoJHJzWyR0YWdzX2ZpZWxkXSkpKTsKCXNvcnQoJGFsbF90YWdzKTsKCSRhbGxf dGFncyA9IGFycmF5X3VuaXF1ZSgkYWxsX3RhZ3MpOwoKCSR1cmwgPSAnaHR0cDovLycgLiAk c2l0ZXVybCAuICRwYXRoX2Zyb21fcm9vdCAuICc/cz0nIC4gJHRhZ3NlY3Rpb24gLiAnJmFt cDt0PSc7CgoJZm9yKCRpPTA7ICRpPGNvdW50KCRhbGxfdGFncyk7ICRpKyspIHsKCQkkdGFn c19odG1sW10gPSAnPGEgaHJlZj0iJyAuICR1cmwgLiAkYWxsX3RhZ3NbJGldIC4gJyI+JyAu ICRhbGxfdGFnc1skaV0gLic8L2E+JzsKCX0KCXJldHVybiBkb1dyYXAoJHRhZ3NfaHRtbCwg JHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19jbG91ZCgkYXR0cykgewoJJGF0dHMgPSBsQXR0cyhhcnJheSgnd3JhcHRhZycJ PT4gJycsCgkJCQknYnJlYWsnCT0+ICcsICcsCgkJCQknY2xhc3MnCT0+ICcnLAoJCQkJJ2Jy ZWFrY2xhc3MnCT0+ICcnLAoJCQkJJ3RhZ3NlY3Rpb24nCT0+ICd0YWcnLAoJCQkJJ3NlY3Rp b24nCT0+ICcnLAoJCQkJJ21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQkJJ21heHBlcmNlbnQn CT0+ICcyMDAnLAoJCQkJJ3Nob3djb3VudHMnCT0+ICcnLAoJCQkJJ2NvdW50d3JhcGNoYXJz Jwk9PiAnW10nKSwKCQkJJGF0dHMpOwoKCXJldHVybiB0cnVfdGFnc19saXN0KCRhdHRzKTsK fQoKCmZ1bmN0aW9uIHRydV90YWdzX2xpc3QoJGF0dHMpIHsKCWdsb2JhbCAkc2l0ZXVybCwg JHBhdGhfZnJvbV9yb290OwoJZXh0cmFjdCgkX1NFUlZFUik7CgoJJGF0dHMgPSBsQXR0cyhh cnJheSgnd3JhcHRhZycJPT4gJ3VsJywKCQkJCSdicmVhaycJPT4gJ2xpJywKCQkJCSdjbGFz cycJPT4gJycsCgkJCQknYnJlYWtjbGFzcycJPT4gJycsCgkJCQkndGFnc2VjdGlvbicJPT4g J3RhZycsCgkJCQknc2VjdGlvbicJPT4gJycsCgkJCQknbWlucGVyY2VudCcJPT4gJzEwMCcs CgkJCQknbWF4cGVyY2VudCcJPT4gJzEwMCcsCgkJCQknc2hvd2NvdW50cycJPT4gJycsCgkJ CQknY291bnR3cmFwY2hhcnMnCT0+ICdbXScpLAoJCQkkYXR0cyk7CglleHRyYWN0KCRhdHRz KTsKCgkkdGFnc19maWVsZCA9IHRydV90YWdzX2ZpZWxkKCk7CgoJJHNlY3Rpb25fY2xhdXNl ID0gJyc7CglpZiAoJHNlY3Rpb24gPD4gJycpIHsKCQkka2V5cyA9IHNwbGl0KCcsJywgJHNl Y3Rpb24pOwoJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKCQkJJGtleXBhcnRzW10gPSAi IFNlY3Rpb24gPSAnIiAuIHRyaW0oJGtleSkgLiAiJyI7CgkJfQoJCSRzZWN0aW9uX2NsYXVz ZSA9ICIgQU5EICgiIC4gam9pbignIG9yICcsICRrZXlwYXJ0cykgLiAiKSI7Cgl9CgoJaW5j bHVkZV9vbmNlIHR4cGF0aC4nL3B1Ymxpc2gvc2VhcmNoLnBocCc7CgkkZmlsdGVyID0gZmls dGVyU2VhcmNoKCk7CgkkYWxsX3RhZ3MgPSBhcnJheSgpOwoJJHJzID0gc2FmZV9yb3dzKCIk dGFnc19maWVsZCIsICJ0ZXh0cGF0dGVybiIsICIkdGFnc19maWVsZCA8PiAnJyIgLiAkc2Vj dGlvbl9jbGF1c2UgLiAkZmlsdGVyIC4gIiBhbmQgU3RhdHVzID49ICc0JyBhbmQgUG9zdGVk IDwgbm93KCkiKTsKCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJJGFsbF90YWdzID0gYXJy YXlfbWVyZ2UoJGFsbF90YWdzLCBleHBsb2RlKCIsIiwgdHJpbShzdHJ0b2xvd2VyKCRyb3db JHRhZ3NfZmllbGRdKSkpKTsKCX0KCXNvcnQoJGFsbF90YWdzKTsKCgkkdGFnc193ZWlnaHQg PSBhcnJheV9jb3VudF92YWx1ZXMoJGFsbF90YWdzKTsKCSR0YWdzX3VuaXF1ZSA9IGFycmF5 X3VuaXF1ZSgkYWxsX3RhZ3MpOwoKCSRtYXggPSBtYXgoJHRhZ3Nfd2VpZ2h0KTsKCSRtaW4g PSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCSRzdGVwdmFsdWUgPSAoJG1heCA9PSAkbWluKSA/IDAg OiAoJG1heHBlcmNlbnQgLSAkbWlucGVyY2VudCkgLyAoJG1heCAtICRtaW4pOwoKCSR1cmwg PSAnaHR0cDovLycgLiAkc2l0ZXVybCAuICRwYXRoX2Zyb21fcm9vdCAuICc/cz0nIC4gJHRh Z3NlY3Rpb24gLiAnJmFtcDt0PSc7CgoJZm9yZWFjaCAoJHRhZ3NfdW5pcXVlIGFzICR0YWcp IHsKCQkkdGFnX3dlaWdodCA9ICRtaW5wZXJjZW50ICsgKCR0YWdzX3dlaWdodFskdGFnXSAt ICRtaW4pICogJHN0ZXB2YWx1ZTsKCQkvL2FkYXB0ZWQgZnJvbSBjb2RlIGJ5IGdkdHJvaWFu bywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9 MTAyODc1I3AxMDI4NzUKCQkkY291bnQgPSAkc2hvd2NvdW50cyA/ICcgJyAuICRjb3VudHdy YXBjaGFyc3swfSAuICR0YWdzX3dlaWdodFskdGFnXSAuICRjb3VudHdyYXBjaGFyc3sxfSA6 ICcnOwoJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPSInIC4gJHVybCAuICR0YWcgLiAnIiBz dHlsZT0iZm9udC1zaXplOicuICR0YWdfd2VpZ2h0IC4gJyU7Ij4nIC4gJHRhZyAuJzwvYT4n IC4gJGNvdW50OwoJfQoKCXJldHVybiBkb1dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRi cmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl90 YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpCnsKCSR0YWdfc2VhcmNoaW5nID0gZ3BzKCd0Jyk7 CgkkY29uZGl0aW9uID0gKCFlbXB0eSgkdGFnX3NlYXJjaGluZykpPyB0cnVlIDogZmFsc2U7 CglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9uKSk7Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCkKewoJcmV0dXJuIHN0cmlwX3RhZ3MoZ3Bz KCd0JykpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpCnsKCXJl dHVybiBzdHJpcF90YWdzKGdwcygncScpKTsKfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmllbGQo KSB7CglyZXR1cm4gJ0tleXdvcmRzJzsKfQoKCgoiO3M6MzoibWQ1IjtzOjMyOiI0MDNjMmU5 YTdhYjMyMDQ2YTNlMWExZjI0MTBhMDExNCI7fQ==