# tru_tags v1.0 # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMS4wIjtzOjY6ImF1dGhvciI7czoxMzoiTmF0aGFu IEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL3RydWlzdC5jb20vIjtz OjExOiJkZXNjcmlwdGlvbiI7czozNzoiVGFnZ2luZyBzdXBwb3J0IHdpdGggZnVsbCBpbnRl Z3JhdGlvbiI7czo0OiJ0eXBlIjtpOjA7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjQ6 ImhlbHAiO3M6NzQzNToiCgk8cD5UbyBsZWFybiBtb3JlIGFib3V0IHRydV90YWdzLCBjaGVj ayBvdXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9ibG9nLzQ5My90cnV0 YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuIj5pbnRyb2R1Y3RvcnkgYXJ0 aWNsZTwvYT4uPC9wPgoJPHA+Q29weXJpZ2h0IDIwMDYgTmF0aGFuIEFydGh1cjwvcD4KCTxw PlJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIHNlZSBodHRwOi8vd3d3 Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocCBmb3IgZGV0YWlsczwv cD4KCTxwPlRoaXMgd29yayBpcyBiYXNlZCBvbiByYW5fdGFncyBieSBSYW4gQXJvdXNzaSwg b3JpZ2luYWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20vYXJ0aWNsZS80NS90YWdn aW5nLXRleHRwYXR0ZXJuPC9wPgoJPGgzPkNvbmZpZ3VyYXRpb248L2gzPgoJPHA+VGhpcyBz ZWN0aW9uIGRldGFpbHMgd2hhdCBkbyB0byBhZnRlciB5b3UmIzgyMTc7dmUgaW5zdGFsbGVk IHRoZSBwbHVnaW4uICBQbGVhc2UgPGEgaHJlZj0iL3N0YXNoL3RydV90YWdzLTAuOS50eHQi PmNsaWNrIGhlcmUgdG8gc2VlIHRoZSBpbnN0YWxsIGluc3RydWN0aW9uczwvYT4gaWYgeW91 IGhhdmVuJiM4MjE3O3QgZG9uZSB0aGF0IHlldC48L3A+Cgk8aDQ+U3RlcCAxOiBDcmVhdGUg YSBuZXcgc2VjdGlvbjwvaDQ+Cgk8cD50cnVfdGFncyBkZXBlbmRzIG9uIHRoZSBleGlzdGVu Y2Ugb2YgYSBzcGVjaWFsIFRleHRwYXR0ZXJuIHNlY3Rpb24gbmFtZWQgJiM4MjIwO3RhZzxz dXA+PGEgaHJlZj0iI2ZuMTQ0NzMyMjE3NTQ0MGQwNmVhNDA2MTAiPjE8L2E+PC9zdXA+LCYj ODIyMTsgYnkgZGVmYXVsdC4gIENyZWF0ZSB0aGF0IHNlY3Rpb24sIHVzaW5nIHdoYXRldmVy IHNldHRpbmdzIHlvdSBsaWtlLiAgKFlvdSB3b24mIzgyMTc7dCBiZSBwdWJsaXNoaW5nIGFy dGljbGVzIHRvIHRoYXQgc2VjdGlvbi4pICBIZXJlJiM4MjE3O3Mgd2hhdCBJIHVzZTxzdXA+ PGEgaHJlZj0iI2ZuMTE1MDkxMzE0NjQ0MGQwNmVhNDU0OTAiPjI8L2E+PC9zdXA+OjwvcD4K CTxwPjxpbWcgc3JjPSJodHRwOi8vd3d3LnRydWlzdC5jb20vaW1hZ2VzLzIucG5nIiBoZWln aHQ9IjI4MCIgd2lkdGg9IjM5OCIgYWx0PSJ0YWcgc2VjdGlvbiBjb25maWd1cmF0aW9uIiBj bGFzcz0iZGlhZ3JhbSIgLz48L3A+Cgk8cCBjbGFzcz0iZm9vdG5vdGUiIGlkPSJmbjE0NDcz MjIxNzU0NDBkMDZlYTQwNjEwIj48c3VwPjE8L3N1cD4gWW91IGNhbiB1c2UgYSBkaWZmZXJl bnQgbmFtZSwgYnV0IHlvdSBoYXZlIHRvIHVzZSBhIHNwZWNpYWwgYXR0cmlidXRlIGluIHNv bWUgb2YgdGhlIHBsdWdpbiBjYWxscyB0byBtYWtlICBldmVyeXRoaW5nIHdvcmsgY29ycmVj dGx5LiAgU2VlIGJlbG93IGZvciBkZXRhaWxzLjwvcD4KCTxwIGNsYXNzPSJmb290bm90ZSIg aWQ9ImZuMTE1MDkxMzE0NjQ0MGQwNmVhNDU0OTAiPjxzdXA+Mjwvc3VwPiBOb3RlIHRoYXQg SSB1c2UgdGhlICYjODIxNjtkZWZhdWx0JiM4MjE3OyBwYWdlICYjODIxMTsgdGhhdCBjaG9p Y2UgbWF5IG5vdCBiZSByaWdodCBmb3IgeW91LiAgVGhpcyBzZWN0aW9uIHdpbGwgYmUgc2hv d24gd2hlbmV2ZXIgeW91IGNsaWNrIG9uIGEgdGFnLCB0byBkaXNwbGF5IHRoZSB0YWcgc2Vh cmNoIHJlc3VsdHMuICBZb3UmIzgyMTc7bGwgd2FudCBhIHBhZ2UgdGhhdCBoYXMgdGhlIGNv cnJlY3QgbGF5b3V0L2hlYWRlcnMvZm9vdGVycy4gIEkgdXNlIG15IGRlZmF1bHQgcGFnZSwg d2l0aCA8Y29kZT4mbHQ7dHhwOmlmX3NlY3Rpb24gbmFtZT0idGFnIiZndDs8L2NvZGU+IHRv IGNoYW5nZSB0aGUgcGFnZSBkaXNwbGF5IGluIHRoaXMgY2FzZS48L3A+Cgk8aDQ+U3RlcCAy OiBDYWxsIHRoZSBwbHVnaW4gZnJvbSB0aGF0IHNlY3Rpb248L2g0PgoJPHA+VG8gbWFrZSB0 YWcgc2VhcmNoaW5nIGFuZCB0aGUgZGVmYXVsdCB0YWcgY2xvdWQgd29yaywgeW91JiM4MjE3 O2xsIG5lZWQgdG8gY2FsbCA8Y29kZT4mbHQ7dHhwOnRydV90YWdzX2hhbmRsZXIgLyZndDs8 L2NvZGU+IGZyb20gdGhlIHBhZ2UgeW91IGNob3NlIGluIFN0ZXAgMS4gIEkgcmVwbGFjZWQg dGhlIGRlZmF1bHQgPGNvZGU+Jmx0O3R4cDphcnRpY2xlIC8mZ3Q7PC9jb2RlPiB3aXRoIHNv bWV0aGluZyBsaWtlIHRoaXM6PC9wPgo8cHJlPiZsdDt0eHA6aWZfc2VjdGlvbiBuYW1lPSJ0 YWciJmd0OwogICZsdDt0eHA6dHJ1X3RhZ3NfaGFuZGxlciAvJmd0OwombHQ7dHhwOmVsc2Ug LyZndDsKICAmbHQ7dHhwOmFydGljbGUgLyZndDsKJmx0Oy90eHA6aWZfc2VjdGlvbiZndDs8 L3ByZT4KCTxoND5TdGVwIDM6IENvbmZpZ3VyZSB5b3VyIGFydGljbGUgZm9ybSB0byBkaXNw bGF5IHRhZ3M8L2g0PgoJPHA+VG8gbWFrZSBlYWNoIGFydGljbGUgc2hvdyBhIGxpc3Qgb2Yg YWxsIHRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCBpdCwgcHV0IHNvbWV0aW5nIGxpa2UgdGhp cyBpbiB5b3VyIGFydGljbGUgZm9ybTo8L3A+CjxwcmU+Jmx0O3R4cDp0cnVfdGFnc19pZl9o YXNfdGFncyZndDsKICB0YWdzOiAmbHQ7dHhwOnRydV90YWdzX2Zyb21fYXJ0aWNsZSAvJmd0 OwombHQ7L3R4cDp0cnVfdGFnc19pZl9oYXNfdGFncyZndDs8L3ByZT4KCTxoND5TdGVwIDQ6 IERyb3AgYSBjdXN0b20gdGFnIGNsb3VkIHNvbWV3aGVyZSwgaWYgeW91IHdhbnQ8L2g0PgoJ PHA+SWYgeW91JiM4MjE3O2QgbGlrZSB0byBzaG93IGEgdGFnIGNsb3VkIHNvbWV3aGVyZSBv biB5b3VyIHNpdGUgKG90aGVyIHRoYW4gL3RhZy8pLCBwdXQgc29tZXRoaW5nIGxpa2UgdGhp cywgaW4gdGhhdCBwYWdlOjwvcD4KPHByZT4mbHQ7dHhwOnRydV90YWdzX2Nsb3VkIC8mZ3Q7 PC9wcmU+Cgk8aDQ+U3RlcCA1OiBTdGFydCB0YWdnaW5nITwvaDQ+Cgk8cD5XaGVuZXZlciB5 b3Ugd3JpdGUgYW4gYXJ0aWNsZSwgcHV0IHlvdXIgdGFncyBpbnRvIHRoZSBLZXl3b3JkcyBm aWVsZCBpbiBUZXh0cGF0dGVybi4gIChUaGUgS2V5d29yZHMgZmllbGQgaGlkZXMgYmVoaW5k IHRoZSAmIzgyMjA7QWR2YW5jZWQgT3B0aW9ucyYjODIyMTsgbGluayBvbiB0aGUgbGVmdCBz aWRlIG9mIHRoZSAmIzgyMjA7d3JpdGUmIzgyMjE7IHBhZ2UuKSAgVGFncyBzaG91bGQgYmUg c2VwYXJhdGVkIGJ5IGNvbW1hcywgYW5kIGNhbiBoYXZlIHNwYWNlcy4gIEJlIGNhcmVmdWwg bm90IHRvIGxlYXZlIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGFncy4g IEhlcmUmIzgyMTc7cyBhIGdvb2QgZXhhbXBsZTo8L3A+Cgk8cD48aW1nIHNyYz0iaHR0cDov L3d3dy50cnVpc3QuY29tL2ltYWdlcy8zLnBuZyIgaGVpZ2h0PSIxMTAiIHdpZHRoPSIxMTgi IGFsdD0idGFncyB3aXRoIHNwYWNlcywgYnV0IG5vdCBuZXh0IHRvIHRoZSBjb21tYXMiIGNs YXNzPSJkaWFncmFtIiAvPjwvcD4KCTxwPi4uLmFuZCBhIGJhZCBvbmU6PC9wPgoJPHA+PGlt ZyBzcmM9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9pbWFnZXMvNC5wbmciIGhlaWdodD0iMTEy IiB3aWR0aD0iMTE5IiBhbHQ9InRhZ3Mgd2l0aCBzcGFjZXMgYWZ0ZXIgdGhlIGNvbW1hcyAo V1JPTkcpIiBjbGFzcz0iZGlhZ3JhbSIgLz48L3A+Cgk8cD5Zb3UmIzgyMTc7bGwgcHJvYmFi bHkgd2FudCB0byBpbnN0YWxsIFJvYiBTYWJsZSYjODIxNztzIDxhIGhyZWY9Imh0dHA6Ly93 d3cud2lsc2hpcmVvbmUuY29tL3RleHRwYXR0ZXJuLXBsdWdpbnMvcnNzLWFkbWluLXNob3ct YWR2LW9wdHMiPnJzc19hZG1pbl9zaG93X2Fkdl9vcHRzPC9hPiwgd2hpY2ggd2lsbCBhdXRv bWF0aWNhbGx5IGV4cGFuZCB0aGUgJiM4MjIwO0FkdmFuY2VkIE9wdGlvbnMmIzgyMjE7IHNl Y3Rpb24gb2YgdGhlICYjODIyMDt3cml0ZSYjODIyMTsgcGFnZSwgd2hlbiB5b3UgYXJlIHdy aXRpbmcgYXJ0aWNsZXMuICBUaGF0IGdpdmVzIHlvdSBlYXN5IGFjY2VzcyB0byB0aGUgS2V5 d29yZHMgZmllbGQuPC9wPgoJPGg0PlN0ZXAgNjogRmFuY3kgZGlzcGxheSBjdXN0b21pemF0 aW9uPC9oND4KCTxwPllvdSBjYW4gdXNlIDxjb2RlPnRydV90YWdzX2lmX3RhZ19zZWFyY2g8 L2NvZGU+LCA8Y29kZT50cnVfdGFnc190YWdfcGFyYW1ldGVyPC9jb2RlPiwgYW5kIDxjb2Rl PnRydV90YWdzX3NlYXJjaF9wYXJhbWV0ZXI8L2NvZGU+IHRvIGN1c3RvbWl6ZSB5b3VyIHBh Z2UgdGl0bGVzIG9yIHRhZyBzZWFyY2ggcmVzdWx0cy4gIFNlZSBiZWxvdyBmb3IgZGV0YWls cy4gIFNlZSB0aGUgdGl0bGViYXIgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29t LyI+dHJ1aXN0LmNvbTwvYT4gZm9yIGFuIGV4YW1wbGUuPC9wPgoJPGgzPlRhZyByZWZlcmVu Y2U8L2gzPgoJPGg0Pjxjb2RlPnRydV90YWdzX2hhbmRsZXI8L2NvZGU+PC9oND4KCTxwPlRo aXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gdGhhdCBkcml2ZXMgdGFnIHNlYXJjaCwgYW5kIHNo b3dzIHRoZSBnZW5lcmljIHRhZyBjbG91ZC4gIEl0IHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0 aGUgcGFnZSB0aGF0IGlzIHVzZWQgaW4gdGhlICYjODIxNjt0YWcmIzgyMTc7IHNlY3Rpb24u ICBJdCBjYWxscyA8Y29kZT5kb0FydGljbGVzKCk8L2NvZGU+IHRvIGRpc3BsYXkgdGFnIHNl YXJjaCByZXN1bHRzLjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19pZl9oYXNfdGFnczwvY29k ZT48L2g0PgoJPHA+VGhpcyBjb25kaXRpb25hbCB0YWcgY2FuIGJlIHVzZWQgaW4gYW4gYXJ0 aWNsZSBmb3JtLCBhbmQgd2lsbCBldmFsdWF0ZSBpdHMgY29udGVudHMgKGUuZy4gJiM4MjIw O3JldHVybiB0cnVlJiM4MjIxOykgaWYgdGhlIGN1cnJlbnQgYXJ0aWNsZSBoYXMgdGFncy48 L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfZnJvbV9hcnRpY2xlPC9jb2RlPjwvaDQ+Cgk8cD5U aGlzIHRhZyBjYW4gYmUgdXNlZCBpbiBhbiBhcnRpY2xlIGZvcm0gdG8gcmV0dXJuIGEgbGlz dCBvZiB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBhcnRpY2xlLiAgRWFjaCB0 YWcgaW4gdGhlIGxpc3Qgd2lsbCBiZSBhIGxpbmsgKDxjb2RlPiZsdDthIGhyZWY9Li4uJmd0 OzwvY29kZT4pIHRvIHRoZSB0YWcgc2VhcmNoIHVybCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHRh Zy48L3A+Cgk8cD5UaGlzIHRhZyBhY2NlcHRzIHRoZSBzdGFuZGFyZCA8Y29kZT5icmVhazwv Y29kZT4sIDxjb2RlPmNsYXNzPC9jb2RlPiwgYW5kIDxjb2RlPmJyZWFrY2xhc3M8L2NvZGU+ IGF0dHJpYnV0ZXMuPC9wPgoJPHA+SXQgYWxzbyBhY2NlcHRzIGEgPGNvZGU+dGFnc2VjdGlv bjwvY29kZT4gYXR0cmlidXRlLCB3aGljaCB0ZWxscyB0cnVfdGFncyB3aGF0IHJlbGF0aXZl IHVybCB0byB1c2UgdG8gZmluZCB0aGUgJiM4MjE2O3RhZyYjODIxNzsgc2VjdGlvbi4gIFRo aXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBuYW1lZCB0aGUgc2VjdGlvbiBzb21ldGhp bmcgb3RoZXIgdGhhbiAmIzgyMTY7dGFnJiM4MjE3Oy4gIEJ5IGRlZmF1bHQsIHRoaXMgaXMg c2V0IHRvIDxjb2RlPnRhZzwvY29kZT4uPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX2Nsb3Vk PC9jb2RlPjwvaDQ+Cgk8cD5UaGF0IHRhZyBjYW4gYmUgdXNlZCBvbiBhbnkgcGFnZSB0byBn ZW5lcmF0ZSBhIHNpbXBsZSB0YWcgY2xvdWQgb2YgYWxsIHRoZSB0YWdzIHVzZWQgb24geW91 ciBzaXRlLiAgVGhlIGNsb3VkIGlzIHJlYWxseSBqdXN0IGEgbGlzdCBvZiBsaW5rcywgbXVj aCBsaWtlIHRoYXQgZ2VuZXJhdGVkIGJ5IDxjb2RlPnRydV90YWdzX2Zyb21fYXJ0aWNsZTwv Y29kZT4sIGJ1dCB3aXRoIGEgPGNvZGU+c3R5bGU8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgb24g ZWFjaCBsaW5rIHRvIGdpdmUgaXQgYSBmcm9tIHNpemUgcmFuZ2luZyBmcm9tIDEwMCUgdG8g MjAwJS48L3A+Cgk8cD5UaGlzIHRhZyBhY2NlcHRzIHRoZSBzdGFuZGFyZCA8Y29kZT5icmVh azwvY29kZT4sIDxjb2RlPmNsYXNzPC9jb2RlPiwgYW5kIDxjb2RlPmJyZWFrY2xhc3M8L2Nv ZGU+IGF0dHJpYnV0ZXMuPC9wPgoJPHA+SXQgYWxzbyBhY2NlcHRzIGEgPGNvZGU+dGFnc2Vj dGlvbjwvY29kZT4gYXR0cmlidXRlLCB3aGljaCB0ZWxscyB0cnVfdGFncyB3aGF0IHJlbGF0 aXZlIHVybCB0byB1c2UgdG8gZmluZCB0aGUgJiM4MjE2O3RhZyYjODIxNzsgc2VjdGlvbi4g IFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBuYW1lZCB0aGUgc2VjdGlvbiBzb21l dGhpbmcgb3RoZXIgdGhhbiAmIzgyMTY7dGFnJiM4MjE3Oy4gIEJ5IGRlZmF1bHQsIHRoaXMg aXMgc2V0IHRvIDxjb2RlPnRhZzwvY29kZT4uPC9wPgoJPHA+TGFzdGx5LCB0aGlzIHRhZyBh Y2NlcHRzIGEgPGNvZGU+c2VjdGlvbjwvY29kZT4gYXR0cmlidXRlLCB3aGljaCB0ZWxscyBp dCB0byBsaW1pdCB0aGUgbGlzdCB0byB0YWdzIGZyb20gdGhlIGdpdmVuIHNlY3Rpb24uICBG b3IgZXhhbXBsZSwgPGNvZGU+Jmx0O3R4cDp0cnVfdGFnc19jbG91ZCBzZWN0aW9uPSJibG9n IiAvJmd0OzwvY29kZT4gd291bGQgb25seSBzaG93IHRhZ3MgZnJvbSB0aGUgJiM4MjIwO2Js b2cmIzgyMjE7IHNlY3Rpb24uICBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byBibGFuayAo dG8gc2hvdyB0YWdzIGZyb20gYWxsIHNlY3Rpb25zKS48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3Rh Z3NfaWZfdGFnX3NlYXJjaDwvY29kZT48L2g0PgoJPHA+VGhpcyBjb25kaXRpb25hbCB0YWcg Y2FuIGJlIHVzZWQgYW55d2hlcmUgYW5kIHdpbGwgZXZhbHVhdGUgaXRzIGNvbnRlbnRzIChl LmcuICYjODIyMDtyZXR1cm4gdHJ1ZSYjODIyMTspIGlmIHRoZSBjdXJyZW50IHVybCBpbmRp Y2F0ZXMgdGhhdCB0aGVyZSBpcyBhIHRhZyBzZWFyY2ggZ29pbmcgb24uICBUaGlzIGNhbiBi ZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIGxpa2UgY3VzdG9taXplIHRo ZSB0aXRsZWJhciB3aGVuIHVzaW5nIHRoZSB0YWcgc2VhcmNoLjwvcD4KCTxoND48Y29kZT50 cnVfdGFnc190YWdfcGFyYW1ldGVyPC9jb2RlPjwvaDQ+Cgk8cD5UaGlzIHRhZyBjYW4gYmUg dXNlZCBhbnl3aGVyZSBhbmQgd2lsbCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQg dGFnIHVuZGVyIHNlYXJjaCwgZHVyaW5nIGEgdGFnIHNlYXJjaC4gIFRoaXMgaXMgZ2VuZXJh bGx5IHVzZWQgd2l0aCA8Y29kZT50cnVfdGFnc19pZl90YWdfc2VhcmNoPC9jb2RlPi48L3A+ Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcjwvY29kZT48L2g0PgoJPHA+ VGhpcyB0YWcgY2FuIGJlIHVzZWQgYW55d2hlcmUgYW5kIHdpbGwgcmV0dXJuIHdoYXRldmVy IHRoZSB1c2VyIHR5cGVkIGludG8gdGhlIFRleHRwYXR0ZXJuIHNlYXJjaCBib3gsIGR1cmlu ZyBhIHJlZ3VsYXIgc2VhcmNoLiAgVGhpcyB0YWcgaXMgbm90IHNwZWNpZmljYWxseSByZWxh dGVkIHRvIHRhZ2dpbmcsIGJ1dCBjYW4gYmUgaGFuZHkgZm9yIGN1c3RvbWl6aW5nIHRoZSB0 aXRsZWJhciAob3IgdGhlIHBhZ2UpIGR1cmluZyBzZWFyY2ggcmVzdWx0cy48L3A+CgoKICI7 czo0OiJjb2RlIjtzOjMzNjA6IgoKCiNDb3B5cmlnaHQgMjAwNiBOYXRoYW4gQXJ0aHVyCiNS ZWxlYXNlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBzZWUgaHR0cDovL3d3dy5v cGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAgZm9yIGRldGFpbHMKI1Ro aXMgd29yayBpcyBiYXNlZCBvbiByYW5fdGFncyBieSBSYW4gQXJvdXNzaSwgb3JpZ2luYWxs eSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20vYXJ0aWNsZS80NS90YWdnaW5nLXRleHRw YXR0ZXJuCgoKZnVuY3Rpb24gdHJ1X3RhZ3NfaGFuZGxlcigkYXR0cykgewoJZXh0cmFjdCgk X0dFVCk7CglpZiAoIWlzc2V0KCR0KSkgewoJCXJldHVybiB0cnVfdGFnc19jbG91ZCgwKTsK CX0KCWVsc2UgewoJCSRhdHRzWydrZXl3b3JkcyddID0gc3RyaXBfdGFncygkdCk7CgkJcmV0 dXJuIGRvQXJ0aWNsZXMoJGF0dHMsIHRydWUpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf aWZfaGFzX3RhZ3MoJGF0dHMsICR0aGluZykgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4 dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9IHRydV90YWdzX2ZpZWxkKCk7 CgoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJHRo aXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CglpZiAoJHJzKSB7CgkJcmV0dXJuIHBh cnNlKCR0aGluZyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGljbGUoJGF0 dHMpIHsKCglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkc2l0ZXVybCwgJHBhdGhfZnJvbV9yb290 OwoKCWV4dHJhY3QoJF9TRVJWRVIpOwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCWV4dHJh Y3QobEF0dHMoYXJyYXkoJ3dyYXB0YWcnICAgICAgID0+ICcnLAoJCQkJCQknYnJlYWsnICAg ICAgICAgPT4gJywgJywKCQkJCQkJJ2NsYXNzJyAgICAgICAgID0+ICcnLAoJCQkJCQknYnJl YWtjbGFzcycJPT4gJycsCgkJCQkJCSd0YWdzZWN0aW9uJwk9PiAndGFnJywKCQkJCQkJKSwk YXR0cykpOwoKCSR0YWdzX2ZpZWxkID0gdHJ1X3RhZ3NfZmllbGQoKTsKCgkkcnMgPSBzYWZl X3JvdygkdGFnc19maWVsZCwgInRleHRwYXR0ZXJuIiwgIklEPSckdGhpc2lkJyBBTkQgJHRh Z3NfZmllbGQgPD4gJyciKTsKCSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHN0cnRv bG93ZXIoJHJzWyR0YWdzX2ZpZWxkXSkpKTsKCXNvcnQoJGFsbF90YWdzKTsKCSRhbGxfdGFn cyA9IGFycmF5X3VuaXF1ZSgkYWxsX3RhZ3MpOwoKCSR1cmwgPSAnaHR0cDovLycgLiAkc2l0 ZXVybCAuICRwYXRoX2Zyb21fcm9vdCAuICR0YWdzZWN0aW9uIC4gJz90PSc7CgoJZm9yKCRp PTA7ICRpPGNvdW50KCRhbGxfdGFncyk7ICRpKyspIHsKCQkkdGFnc19odG1sW10gPSAnPGEg aHJlZj0iJyAuICR1cmwgLiAkYWxsX3RhZ3NbJGldIC4gJyI+JyAuICRhbGxfdGFnc1skaV0g Lic8L2E+JzsKCX0KCXJldHVybiBkb1dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVh aywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZCgk YXR0cykgewoJZ2xvYmFsICRzaXRldXJsLCAkcGF0aF9mcm9tX3Jvb3Q7CglleHRyYWN0KCRf U0VSVkVSKTsKCglleHRyYWN0KGxBdHRzKGFycmF5KCd3cmFwdGFnJyAgICAgICA9PiAnJywK CQkJCQkJJ2JyZWFrJyAgICAgICAgID0+ICcsICcsCgkJCQkJCSdjbGFzcycgICAgICAgICA9 PiAnJywKCQkJCQkJJ2JyZWFrY2xhc3MnCT0+ICcnLAoJCQkJCQkndGFnc2VjdGlvbicJPT4g J3RhZycsCgkJCQkJCSdzZWN0aW9uJwk9PiAnJywKCQkJCQkJKSwkYXR0cykpOwoKCSR0YWdz X2ZpZWxkID0gdHJ1X3RhZ3NfZmllbGQoKTsKCgkkc2VjdGlvbl9jbGF1c2UgPSAnJzsKCWlm ICgkc2VjdGlvbiA8PiAnJykgewoJCSRrZXlzID0gc3BsaXQoJywnLCAkc2VjdGlvbik7CgkJ Zm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewoJCQkka2V5cGFydHNbXSA9ICIgU2VjdGlvbiA9 ICciIC4gdHJpbSgka2V5KSAuICInIjsKCQl9CgkJJHNlY3Rpb25fY2xhdXNlID0gIiBBTkQg KCIgLiBqb2luKCcgb3IgJywgJGtleXBhcnRzKSAuICIpIjsKCX0KCglpbmNsdWRlX29uY2Ug dHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsKCSRmaWx0ZXIgPSBmaWx0ZXJTZWFyY2go KTsKCSRhbGxfdGFncyA9IGFycmF5KCk7CgkkcnMgPSBzYWZlX3Jvd3MoIiR0YWdzX2ZpZWxk IiwgInRleHRwYXR0ZXJuIiwgIiR0YWdzX2ZpZWxkIDw+ICcnIiAuICRzZWN0aW9uX2NsYXVz ZSAuICRmaWx0ZXIgLiAiIGFuZCBTdGF0dXMgPj0gJzQnIGFuZCBQb3N0ZWQgPCBub3coKSIp OwoJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsKCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJnZSgk YWxsX3RhZ3MsIGV4cGxvZGUoIiwiLCB0cmltKHN0cnRvbG93ZXIoJHJvd1skdGFnc19maWVs ZF0pKSkpOwoJfQoJc29ydCgkYWxsX3RhZ3MpOwoKCSR0YWdzX3dlaWdodCA9IGFycmF5X2Nv dW50X3ZhbHVlcygkYWxsX3RhZ3MpOwoJJHRhZ3NfdW5pcXVlID0gYXJyYXlfdW5pcXVlKCRh bGxfdGFncyk7CgoJJG1heCA9IG1heCgkdGFnc193ZWlnaHQpOwoJJG1pbiA9IG1pbigkdGFn c193ZWlnaHQpOwoJJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8gMCA6IDEwMCAvICgk bWF4IC0gJG1pbik7CgoJJHVybCA9ICdodHRwOi8vJyAuICRzaXRldXJsIC4gJHBhdGhfZnJv bV9yb290IC4gJHRhZ3NlY3Rpb24gLiAnP3Q9JzsKCWZvcmVhY2ggKCR0YWdzX3VuaXF1ZSBh cyAkbm8pIHsKCQkkdGFnX3dlaWdodCA9IDEwMCArICgkdGFnc193ZWlnaHRbJG5vXSAtICRt aW4pICogJHN0ZXB2YWx1ZTsKCQkkdGFnc19odG1sW10gPSAnPGEgaHJlZj0iJyAuICR1cmwg LiAkbm8gLiAnIiBzdHlsZT0iZm9udC1zaXplOicuICR0YWdfd2VpZ2h0IC4gJyU7Ij4nIC4g JG5vIC4nPC9hPic7Cgl9CgoJcmV0dXJuIGRvV3JhcCgkdGFnc19odG1sLCAkd3JhcHRhZywg JGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2lm X3RhZ19zZWFyY2goJGF0dHMsICR0aGluZykKewoJJHRhZ19zZWFyY2hpbmcgPSBncHMoJ3Qn KTsKCSRjb25kaXRpb24gPSAoIWVtcHR5KCR0YWdfc2VhcmNoaW5nKSk/IHRydWUgOiBmYWxz ZTsKCXJldHVybiBwYXJzZShFdmFsRWxzZSgkdGhpbmcsICRjb25kaXRpb24pKTsKfQoKCmZ1 bmN0aW9uIHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoKQp7CglyZXR1cm4gc3RyaXBfdGFncyhn cHMoJ3QnKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19zZWFyY2hfcGFyYW1ldGVyKCkKewoJ cmV0dXJuIHN0cmlwX3RhZ3MoZ3BzKCdxJykpOwp9CgpmdW5jdGlvbiB0cnVfdGFnc19maWVs ZCgpIHsKCXJldHVybiAnS2V5d29yZHMnOwp9CgoKCiI7czozOiJtZDUiO3M6MzI6ImYzMzhj MjRhYjEwYzFlMmZiYzQzZjQzNmZmMGMxODY1Ijt9