# Name: soo_toc v0.1.4 # Type: Client side plugin # Auto-generate table of contents for an article # Author: Jeff Soo # URL: http://ipsedixit.net/txp/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjc6InNvb190b2MiO3M6NjoiYXV0aG9yIjtzOjg6IkplZmYg U29vIjtzOjEwOiJhdXRob3JfdXJpIjtzOjI1OiJodHRwOi8vaXBzZWRpeGl0Lm5ldC90eHAv IjtzOjc6InZlcnNpb24iO3M6NToiMC4xLjQiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjQ2OiJB dXRvLWdlbmVyYXRlIHRhYmxlIG9mIGNvbnRlbnRzIGZvciBhbiBhcnRpY2xlIjtzOjQ6Imhl bHAiO3M6OTY5MjoiPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KZGl2I3NlZF9oZWxwIHByZSB7 cGFkZGluZzogMC41ZW0gMWVtOyBiYWNrZ3JvdW5kOiAjZWVlOyBib3JkZXI6IDFweCBkYXNo ZWQgI2NjYzt9CmRpdiNzZWRfaGVscCBoMSwgZGl2I3NlZF9oZWxwIGgyLCBkaXYjc2VkX2hl bHAgaDMsIGRpdiNzZWRfaGVscCBoMyBjb2RlIHtmb250LWZhbWlseTogc2Fucy1zZXJpZjsg Zm9udC13ZWlnaHQ6IGJvbGQ7fQpkaXYjc2VkX2hlbHAgaDEsIGRpdiNzZWRfaGVscCBoMiwg ZGl2I3NlZF9oZWxwIGgzIHttYXJnaW4tbGVmdDogLTFlbTt9CmRpdiNzZWRfaGVscCBoMiwg ZGl2I3NlZF9oZWxwIGgzIHttYXJnaW4tdG9wOiAyZW07fQpkaXYjc2VkX2hlbHAgaDEge2Zv bnQtc2l6ZTogMi40ZW07fQpkaXYjc2VkX2hlbHAgaDIge2ZvbnQtc2l6ZTogMS44ZW07fQpk aXYjc2VkX2hlbHAgaDMge2ZvbnQtc2l6ZTogMS40ZW07fQpkaXYjc2VkX2hlbHAgaDQge2Zv bnQtc2l6ZTogMS4yZW07fQpkaXYjc2VkX2hlbHAgaDUge2ZvbnQtc2l6ZTogMWVtO21hcmdp bi1sZWZ0OjFlbTtmb250LXN0eWxlOm9ibGlxdWU7fQpkaXYjc2VkX2hlbHAgaDYge2ZvbnQt c2l6ZTogMWVtO21hcmdpbi1sZWZ0OjJlbTtmb250LXN0eWxlOm9ibGlxdWU7fQpkaXYjc2Vk X2hlbHAgbGkge2xpc3Qtc3R5bGUtdHlwZTogZGlzYzt9CmRpdiNzZWRfaGVscCBsaSBsaSB7 bGlzdC1zdHlsZS10eXBlOiBjaXJjbGU7fQpkaXYjc2VkX2hlbHAgbGkgbGkgbGkge2xpc3Qt c3R5bGUtdHlwZTogc3F1YXJlO30KZGl2I3NlZF9oZWxwIGxpIGEgY29kZSB7Zm9udC13ZWln aHQ6IG5vcm1hbDt9CmRpdiNzZWRfaGVscCBsaSBjb2RlOmZpcnN0LWNoaWxkIHtiYWNrZ3Jv dW5kOiAjZGRkO3BhZGRpbmc6MCAuM2VtO21hcmdpbi1sZWZ0Oi0uM2VtO30KZGl2I3NlZF9o ZWxwIGxpIGxpIGNvZGU6Zmlyc3QtY2hpbGQge2JhY2tncm91bmQ6bm9uZTtwYWRkaW5nOjA7 bWFyZ2luLWxlZnQ6MDt9CmRpdiNzZWRfaGVscCBkZm4ge2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9u dC1zdHlsZTpvYmxpcXVlO30KZGl2I3NlZF9oZWxwIC5yZXF1aXJlZCwgZGl2I3NlZF9oZWxw IC53YXJuaW5nIHtjb2xvcjpyZWQ7fQpkaXYjc2VkX2hlbHAgLmRlZmF1bHQge2NvbG9yOmdy ZWVuO30KPC9zdHlsZT4KCTxwPjxkaXYgaWQ9InNlZF9oZWxwIj48L3A+CgoJPGgxPnNvb190 b2MgKHRhYmxlIG9mIGNvbnRlbnRzIGdlbmVyYXRvcik8L2gxPgoKIDxkaXYgaWQ9InRvYyI+ CgoJPGgyPkNvbnRlbnRzPC9oMj4KCgk8dWw+CgkJPGxpPjxhIGhyZWY9IiNvdmVydmlldyI+ T3ZlcnZpZXc8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3N5bnRheCI+U3ludGF4PC9hPjwv bGk+CgkJPGxpPjxhIGhyZWY9IiNhdHRyaWJ1dGVzIj5BdHRyaWJ1dGVzPC9hPjwvbGk+CgkJ PGxpPjxhIGhyZWY9IiN1c2FnZSI+VXNhZ2U8L2E+Cgk8dWw+CgkJPGxpPjxhIGhyZWY9IiNn ZW5lcmFsIj5HZW5lcmFsPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiNoZWFkaW5ncyI+VGhl IGFydGljbGUgaGVhZGluZ3M8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI2xldmVsIj5MZXZl bDwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjdXJscyI+UmVsYXRpdmUgdnMuIGFic29sdXRl IDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+czwvYT48L2xpPgoJCTxsaT48YSBocmVm PSIjbmVzdGVkIj5OZXN0ZWQgb3V0cHV0PC9hPjwvbGk+Cgk8L3VsPjwvbGk+CgkJPGxpPjxh IGhyZWY9IiNub3RlcyI+Tm90ZXM8L2E+Cgk8dWw+CgkJPGxpPjxhIGhyZWY9IiNwZXJmb3Jt YW5jZSI+UGVyZm9ybWFuY2U8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI2hpc3RvcnkiPkhp c3Rvcnk8L2E+PC9saT4KCTwvdWw+PC9saT4KCTwvdWw+CgogPC9kaXY+CgoJPGgyIGlkPSJv dmVydmlldyI+T3ZlcnZpZXc8L2gyPgoKCTxwPlRoaXMgaXMgYSA8YSBocmVmPSJodHRwOi8v dGV4dHBhdHRlcm4uY29tIj5UZXh0cGF0dGVybjwvYT4gcGx1Z2luLiBJdCBjb250YWlucyBv bmUgdGFnLCA8Y29kZT4mbHQ7dHhwOnNvb190b2MgLyZndDs8L2NvZGU+LiBUaGlzIHRhZyBj YW4gYmUgcGxhY2VkIGp1c3QgYWJvdXQgYW55d2hlcmUgYW5kIHdpbGwgYXV0b21hdGljYWxs eSBnZW5lcmF0ZSBhIHRhYmxlIG9mIGNvbnRlbnRzIGZvciBhbnkgYXJ0aWNsZSBpdCBmaW5k cywgc28gbG9uZyBhcyB0aGF0IGFydGljbGUgY29udGFpbnMgPHNwYW4gY2xhc3M9ImNhcHMi PkhUTUw8L3NwYW4+IGhlYWRpbmdzIChoMSwgaDIsIGV0Yy4pIHdpdGggaWQgYXR0cmlidXRl cy4gT2YgY291cnNlIGl0IHJlcXVpcmVzIGFuIGFydGljbGUgY29udGV4dCwgZWl0aGVyIGxp c3Qgb3IgaW5kaXZpZHVhbC48L3A+CgoJPHA+SXQmIzgyMTc7cyBtdWNoIGxpa2UgdGhlIDxh IGhyZWY9Imh0dHA6Ly90ZXh0cGF0dGVybi5vcmcvcGx1Z2lucy82NTgvY2JzX2FydGljbGVf aW5kZXgiPjxjb2RlPmNic19hcnRpY2xlX2luZGV4PC9jb2RlPiBwbHVnaW48L2E+LiBIb3dl dmVyLCA8Y29kZT4mbHQ7dHhwOnNvb190b2MgLyZndDs8L2NvZGU+IG9mZmVycyBuZXN0ZWQg bGlzdCBvdXRwdXQsIGhlYWRpbmctbGV2ZWwgZmlsdGVyaW5nLCBhbmQgYSBjaG9pY2Ugb2Yg cmVsYXRpdmUgb3IgYWJzb2x1dGUgPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj5zLiBJ ZiB5b3UgZG9uJiM4MjE3O3QgbmVlZCB0aG9zZSBmZWF0dXJlcywgeW91IG1pZ2h0IHByZWZl ciA8YSBocmVmPSJodHRwOi8vdGV4dHBhdHRlcm4ub3JnL3BsdWdpbnMvNjU4L2Nic19hcnRp Y2xlX2luZGV4Ij48Y29kZT5jYnNfYXJ0aWNsZV9pbmRleDwvY29kZT48L2E+IGZvciBpdHMg bGlnaHRlciBmb290cHJpbnQuPC9wPgoKCTxoMiBpZD0ic3ludGF4Ij5TeW50YXg8L2gyPgoK PHByZT4mbHQ7dHhwOnNvb190b2MgLyZndDsKPC9wcmU+CgoJPGgyIGlkPSJhdHRyaWJ1dGVz Ij5BdHRyaWJ1dGVzPC9oMj4KCgk8cD5UaGUgZmlyc3QgZml2ZSBhcmUgc3RhbmRhcmQgVGV4 dHBhdHRlcm4gYXR0cmlidXRlczsgb25seSB0aGUgbGFzdCB0d28gKDxjb2RlPmxldmVsPC9j b2RlPiBhbmQgPGNvZGU+ZnVsbF91cmw8L2NvZGU+KSBhcmUgcGx1Z2luLXNwZWNpZmljLjwv cD4KCgk8dWw+CgkJPGxpPjxjb2RlPmxhYmVsPSZxdW90O3RleHQmcXVvdDs8L2NvZGU+PGJy IC8+CkxhYmVsIHRvIHByZWNlZGUgdGhlIGNvbnRlbnRzIGxpc3QuIE9wdGlvbmFsOyBkZWZh dWx0IGlzIHVuc2V0LjwvbGk+CgkJPGxpPjxjb2RlPmxhYmVsdGFnPSZxdW90O3RhZyBuYW1l JnF1b3Q7PC9jb2RlPjxiciAvPgooWClIVE1MIGVsZW1lbnQgKHdpdGhvdXQgYnJhY2tldHMp IGZvciB0aGUgbGFiZWwuIE9wdGlvbmFsOyBkZWZhdWx0IGlzIHVuc2V0LjwvbGk+CgkJPGxp Pjxjb2RlPmJyZWFrPSZxdW90O3RleHQmcXVvdDs8L2NvZGU+PGJyIC8+CihYKUhUTUwgZWxl bWVudCAod2l0aG91dCBicmFja2V0cykgb3IgdGV4dCBmb3Igc2VwYXJhdGluZyBsaXN0IGl0 ZW1zLiBPcHRpb25hbDsgZGVmYXVsdCBpcyA8Y29kZT5saTwvY29kZT4uIElmIHlvdSBjaGFu Z2UgdGhpcywgeW91IHNob3VsZCBhbHNvIGNoYW5nZSB0aGUgPGNvZGU+d3JhcHRhZzwvY29k ZT4uPC9saT4KCQk8bGk+PGNvZGU+d3JhcHRhZz0mcXVvdDt0YWcgbmFtZSZxdW90OzwvY29k ZT48YnIgLz4KKFgpSFRNTCBlbGVtZW50IGZvciBlbmNsb3NpbmcgdGhlIGxpc3QuIE9wdGlv bmFsOyBkZWZhdWx0IGlzIDxjb2RlPnVsPC9jb2RlPi4gSWYgeW91IGNoYW5nZSB0aGlzIHRv IHNvbWV0aGluZyBvdGhlciB0aGFuIDxjb2RlPm9sPC9jb2RlPiwgeW91IHNob3VsZCBhbHNv IGNoYW5nZSB0aGUgPGNvZGU+YnJlYWs8L2NvZGU+LjwvbGk+CgkJPGxpPjxjb2RlPmNsYXNz PSZxdW90O2NsYXNzIG5hbWUmcXVvdDs8L2NvZGU+PGJyIC8+CihYKUhUTUwgY2xhc3MgYXR0 cmlidXRlIHRvIGJlIGFwcGxpZWQgdG8gPGNvZGU+d3JhcHRhZzwvY29kZT4uIE9wdGlvbmFs OyBkZWZhdWx0IGlzIDxjb2RlPnRvYzwvY29kZT4uPC9saT4KCQk8bGk+PGNvZGU+bGV2ZWw9 JnF1b3Q7dmFsdWUmcXVvdDs8L2NvZGU+PGJyIC8+Ck51bWJlciBpbiB0aGUgcmFuZ2UgMSYj ODIxMTs2LCBpbmRpY2F0aW5nIHRoZSBoaWdoZXN0IGhlYWRpbmcgbGV2ZWwgdG8gaW5jbHVk ZSBpbiB0aGUgdGFibGUgb2YgY29udGVudHMgKHNlZSA8YSBocmVmPSIjbGV2ZWwiPkxldmVs LCBiZWxvdzwvYT4pLiA8c3BhbiBjbGFzcz0icmVxdWlyZWQiPlJlcXVpcmVkPC9zcGFuPjsg ZGVmYXVsdCBpcyA8Y29kZT42PC9jb2RlPiAoaW5jbHVkZSBhbGwgaGVhZGluZ3MpLjwvbGk+ CgkJPGxpPjxjb2RlPmZ1bGxfdXJsPSZxdW90O2Jvb2xlYW4mcXVvdDs8L2NvZGU+PGJyIC8+ CklmIDxjb2RlPnRydWU8L2NvZGU+LCB1c2UgYWJzb2x1dGUgaW5zdGVhZCBvZiByZWxhdGl2 ZSA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPnMuIE9wdGlvbmFsIChidXQgc2VlIDxh IGhyZWY9IiN1cmxzIj5SZWxhdGl2ZSB2cy4gQWJzb2x1dGUgPHNwYW4gY2xhc3M9ImNhcHMi PlVSTDwvc3Bhbj5zPC9hPiwgYmVsb3cpOyBkZWZhdWx0IGlzIHVuc2V0IChmYWxzZSkuPC9s aT4KCTwvdWw+CgoJPGgyIGlkPSJ1c2FnZSI+VXNhZ2U8L2gyPgoKCTxoMyBpZD0iZ2VuZXJh bCI+R2VuZXJhbDwvaDM+CgoJPHA+Q2FuIGJlIHVzZWQgaW4gYW4gYXJ0aWNsZSBib2R5LCBp biBhIHBhZ2UsIG9yIGluIGEgZm9ybS4gSWYgdXNlZCB3aXRoIHJlbGF0aXZlIDxzcGFuIGNs YXNzPSJjYXBzIj5VUkw8L3NwYW4+cyAodGhlIGRlZmF1bHQgc2V0dGluZykgaXQgPHNwYW4g Y2xhc3M9InJlcXVpcmVkIj5yZXF1aXJlczwvc3Bhbj4gYW4gaW5kaXZpZHVhbCBhcnRpY2xl IGNvbnRleHQuIElmIHVzZWQgaW4gYW4gYXJ0aWNsZSBsaXN0LCBvciBvbiBhIHBhZ2UgaW4g d2hpY2ggdGhlIDxjb2RlPmJhc2U8L2NvZGU+IGVsZW1lbnQgaW5kaWNhdGVzIGFueXRoaW5n IG90aGVyIHRoYW4gY3VycmVudCBwYWdlLCB0aGUgPGNvZGU+ZnVsbF91cmw8L2NvZGU+IGF0 dHJpYnV0ZSBtdXN0IGJlIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiAob3IgYW55dGhpbmcg b3RoZXIgdGhhbiA8Y29kZT4wPC9jb2RlPikuIChTZWUgPGEgaHJlZj0iI3VybHMiPlJlbGF0 aXZlIHZzLiBBYnNvbHV0ZSA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPnM8L2E+LCBi ZWxvdy4pPC9wPgoKCTxoMyBpZD0iaGVhZGluZ3MiPlRoZSBhcnRpY2xlIGhlYWRpbmdzPC9o Mz4KCgk8cD5Pbmx5IGhlYWRpbmdzIHRoYXQgaGF2ZSBhbiA8Y29kZT5pZDwvY29kZT4gYXR0 cmlidXRlIHdpbGwgYmUgaW5jbHVkZWQuIFRoaXMgaXMgdG8gZ2l2ZSB0aGUgbGlua3MgaW4g dGhlIHRhYmxlIG9mIGNvbnRlbnRzIHNvbWV0aGluZyB0byBwb2ludCB0by4gSW4gVGV4dGls ZSwgeW91IGNhbiBhcHBseSB0aGUgPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSBsaWtlIHRo aXM6PC9wPgoKPHByZT5oMygjZXhhbXBsZSkuIEV4YW1wbGUKPC9wcmU+CgoJPHA+dG8gcHJv ZHVjZTo8L3A+Cgo8cHJlPiZsdDtoMyBpZD0mcXVvdDtleGFtcGxlJnF1b3Q7Jmd0O0V4YW1w bGUmbHQ7L2gzJmd0Owo8L3ByZT4KCgk8aDMgaWQ9ImxldmVsIj5MZXZlbDwvaDM+CgoJPHA+ VGhlIDxjb2RlPmxldmVsPC9jb2RlPiBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byByZXN0cmlj dCB3aGljaCBoZWFkaW5nIGxldmVscyB0byBpbmNsdWRlIGluIHRoZSB0YWJsZSBvZiBjb250 ZW50cy4gRm9yIGV4YW1wbGUsIDxjb2RlPmxldmVsPSZxdW90OzMmcXVvdDs8L2NvZGU+IHdp bGwgcmVzdHJpY3Qgb3V0cHV0IHRvIDxjb2RlPmgxPC9jb2RlPiwgPGNvZGU+aDI8L2NvZGU+ LCBhbmQgPGNvZGU+aDM8L2NvZGU+IGhlYWRpbmdzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8 Y29kZT42PC9jb2RlPiwgc2hvdyBhbGwgaGVhZGluZ3MuPC9wPgoKCTxwPllvdSBtaWdodCB1 c2UgdGhpcyB0byBoYXZlIGJvdGggYSBmdWxsIGFuZCBhIGNvbmNpc2UgdGFibGUgb2YgY29u dGVudHMsIG9uZSBpbiB0aGUgc2lkZWJhciBhbmQgdGhlIG90aGVyIGluIHRoZSBhcnRpY2xl IGJvZHkuIE9yIGNvbWJpbmUgd2l0aCBhIGJpdCBvZiBqYXZhc2NyaXB0IHRvIGFsbG93IHRo ZSB1c2VyIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgdGFibGUgb2YgY29udGVudHMuPC9w PgoKCTxoMyBpZD0idXJscyI+UmVsYXRpdmUgdnMuIGFic29sdXRlIDxzcGFuIGNsYXNzPSJj YXBzIj5VUkw8L3NwYW4+czwvaDM+CgoJPHA+VGhlIGRlZmF1bHQgb3V0cHV0IHVzZXMgc2Ft ZS1wYWdlIHJlbGF0aXZlIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+cyAoZS5nLiA8 Y29kZT5ocmVmPSZxdW90OyNpZF9uYW1lJnF1b3Q7PC9jb2RlPiksIHdoaWNoIHdpbGwgb25s eSB3b3JrIGNvcnJlY3RseSBpbiBhbiBpbmRpdmlkdWFsIGFydGljbGUgY29udGV4dC4gVG8g Z2V0IGFic29sdXRlIChmdWxsKSA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPnMgaW5z dGVhZCwgc2V0IHRoZSA8Y29kZT5mdWxsX3VybDwvY29kZT4gYXR0cmlidXRlIHRvIDxjb2Rl PnRydWU8L2NvZGU+IChvciBhbnkgdmFsdWUgb3RoZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiku PC9wPgoKCTxwPklmIHlvdSB1c2UgYSA8Y29kZT5iYXNlPC9jb2RlPiB0YWcgdG8gcG9pbnQg dG8gdGhlIHNpdGUgcm9vdCAob3IgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgY3VycmVudCBw YWdlKSwgeW91IHdpbGwgYWxzbyBuZWVkIHRvIHVzZSBmdWxsIDxzcGFuIGNsYXNzPSJjYXBz Ij5VUkw8L3NwYW4+cy4gKE4uIEIuLCBzdWNoIHVzYWdlIG9mIDxjb2RlPmJhc2U8L2NvZGU+ IGlzLCBzdHJpY3RseSBzcGVha2luZywgaW5jb3JyZWN0Lik8L3A+CgoJPGgzIGlkPSJuZXN0 ZWQiPk5lc3RlZCBvdXRwdXQ8L2gzPgoKCTxwPklmIHRoZSA8Y29kZT53cmFwdGFnPC9jb2Rl PiBpcyA8Y29kZT51bDwvY29kZT4gKHRoZSBkZWZhdWx0IHZhbHVlKSBvciA8Y29kZT5vbDwv Y29kZT4sIGFuZCBpZiB0aGUgYXJ0aWNsZSBoYXMgZGlmZmVyZW50IGxldmVscyBvZiBoZWFk aW5ncywgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIHdpbGwgYmUgYSBuZXN0ZWQgbGlzdC4gRm9y IGV4YW1wbGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZSBoZWFkaW5ncyAoc2hvd24g aW4gVGV4dGlsZSk6PC9wPgoKPHByZT5oMigjZm9vKS4gRm9vCi4uLgpoMygjYmFyKS4gQmFy CjwvcHJlPgoKCTxwPnRoZSBwbHVnaW4gd2lsbCBwcm9kdWNlLCB1c2luZyBkZWZhdWx0IGF0 dHJpYnV0ZXM6PC9wPgoKPHByZT4mbHQ7dWwgY2xhc3M9JnF1b3Q7dG9jJnF1b3Q7Jmd0OwoJ Jmx0O2xpJmd0OyZsdDthIGhyZWY9JnF1b3Q7I2ZvbyZxdW90OyZndDtGb28mbHQ7L2EmZ3Q7 CgkmbHQ7dWwmZ3Q7CgkJJmx0O2xpJmd0OyZsdDthIGhyZWY9JnF1b3Q7I2JhciZxdW90OyZn dDtCYXImbHQ7L2EmZ3Q7Jmx0Oy9saSZndDsKCSZsdDsvdWwmZ3Q7Jmx0Oy9saSZndDsKJmx0 Oy91bCZndDsKPC9wcmU+CgoJPHA+Rm9yIHRoaXMgbmVzdGVkIG91dHB1dCB0byBtYWtlIHNl bnNlLCB0aGUgYXJ0aWNsZSYjODIxNztzIGhlYWRpbmcgc3RydWN0dXJlIG11c3QgYWxzbyBt YWtlIHNlbnNlLiA8c3BhbiBjbGFzcz0id2FybmluZyI+SW4gcGFydGljdWxhcjo8L3NwYW4+ PC9wPgoKCTx1bD4KCQk8bGk+ZG8gbm90IGp1bXAgdXB3YXJkcyBtb3JlIHRoYW4gb25lIGhl YWRpbmcgbGV2ZWwgYXQgYSB0aW1lIChlLmcuLCBnbyBkaXJlY3RseSBmcm9tIDxjb2RlPmgy PC9jb2RlPiB0byA8Y29kZT5oNDwvY29kZT4pPC9saT4KCQk8bGk+dGhlIGZpcnN0IGhlYWRp bmcgc2hvdWxkIGJlIGF0IHRoZSBsb3dlc3QgaGVhZGluZyBsZXZlbCAoZS5nLiwgaWYgdGhl IGZpcnN0IGhlYWRpbmcgaW4gdGhlIGFydGljbGUgYm9keSBpcyA8Y29kZT5oMjwvY29kZT4s IHRoZXJlIHNob3VsZCBub3QgYmUgYW55IDxjb2RlPmgxPC9jb2RlPnMgaW4gdGhlIGFydGlj bGUgYm9keSk8L2xpPgoJPC91bD4KCgk8cD5CZWNhdXNlIHRoZSBwbHVnaW4gaWdub3JlcyBo ZWFkaW5ncyB3aXRoIG5vIGlkIGF0dHJpYnV0ZSwgeW91IGNvdWxkIGdldCB1bmV4cGVjdGVk IHJlc3VsdHMgKGFuZCBwb3NzaWJseSA8c3BhbiBjbGFzcz0iY2FwcyI+WEhUTUw8L3NwYW4+ IHZhbGlkYXRpb24gZXJyb3JzKSBpZiB5b3UgYXJlIGluY29uc2lzdGVudCBhYm91dCBhc3Np Z25pbmcgaWQgdG8gaGVhZGluZ3MuPC9wPgoKCTxoMiBpZD0ibm90ZXMiPk5vdGVzPC9oMj4K Cgk8aDMgaWQ9InBlcmZvcm1hbmNlIj5QZXJmb3JtYW5jZTwvaDM+CgoJPHA+VGhlIHBsdWdp biBydW5zIGEgPGNvZGU+cHJlZ19tYXRjaF9hbGw8L2NvZGU+IHNlYXJjaCBvbiB0aGUgYXJ0 aWNsZSYjODIxNztzIDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiBib2R5LCBhbmQg YW5vdGhlciA8Y29kZT5wcmVnX21hdGNoPC9jb2RlPiBvbiBlYWNoIGhlYWRpbmcuIFRoZW9y ZXRpY2FsbHkgdGhpcyBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGNvbmNlcm4gaW4gc29tZSBz aXR1YXRpb25zLCBwYXJ0aWN1bGFybHkgaW4gYW4gYXJ0aWNsZSBsaXN0IGNvbnRleHQuPC9w PgoKCTxoMyBpZD0iaGlzdG9yeSI+SGlzdG9yeTwvaDM+CgoJPHA+VGhpcyBwbHVnaW4gaXMg dmVyeSBzaW1pbGFyIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vdGV4dHBhdHRlcm4ub3JnL3Bs dWdpbnMvNjU4L2Nic19hcnRpY2xlX2luZGV4Ij48Y29kZT5jYnNfYXJ0aWNsZV9pbmRleDwv Y29kZT4gcGx1Z2luPC9hPiAoZGlkbiYjODIxNzt0IHJlYWxpemUgdGhpcyB3aGVuIEkgd3Jv dGUgaXQpLCBidXQgd2l0aCBtb3JlIG9wdGlvbnMgZm9yIG91dHB1dCBhbmQgY29udHJvbC48 L3A+CgoJPGg0IGlkPSJ2ZXJzaW9uXzBfMV80Ij5WZXJzaW9uIDAuMS40LCAyMDA5LjQuMjY8 L2g0PgoKCTx1bD4KCQk8bGk+TWlub3IgY29kZSBjbGVhbmluZzwvbGk+Cgk8L3VsPgoKCTxo NCBpZD0idmVyc2lvbl8wXzFfMyI+VmVyc2lvbiAwLjEuMywgMjAwOC4yLjAzPC9oND4KCgk8 dWw+CgkJPGxpPkNvZGUgY2xlYW5pbmcsIHBsdXMgdmFsaWQgPHNwYW4gY2xhc3M9ImNhcHMi PlhIVE1MPC9zcGFuPiBvdXRwdXQgZXZlbiBmb3IgYXJ0aWNsZXMgd2l0aCB1bnNlbWFudGlj IGhlYWRpbmcgc3RydWN0dXJlPC9saT4KCTwvdWw+CgoJPGg0IGlkPSJ2ZXJzaW9uXzBfMV8y Ij5WZXJzaW9uIDAuMS4yLCAyMDA4LjIuMDM8L2g0PgoKCTx1bD4KCQk8bGk+Rml4ZWQgYnVn IChkZXNpZ24gZmxhdywgYWN0dWFsbHkpIHJlIG5lc3RlZCBsaXN0IG91dHB1dDogdGhhbmtz IHRvIERlamFuIGZvciBzcG90dGluZyB0aGlzPC9saT4KCTwvdWw+CgoJPGg0IGlkPSJ2ZXJz aW9uXzBfMV8xIj5WZXJzaW9uIDAuMS4xLCAyMDA4LjEuMjk8L2g0PgoKCTx1bD4KCQk8bGk+ Rml4ZWQgYnVnIHJlIGhlYWRpbmdzIGNvbnRhaW5pbmcgPHNwYW4gY2xhc3M9ImNhcHMiPkhU TUw8L3NwYW4+IHRhZ3M8L2xpPgoJPC91bD4KCgk8aDQgaWQ9InZlcnNpb25fMF8xIj5WZXJz aW9uIDAuMSwgMjAwOC4xLjI2PC9oND4KCgk8dWw+CgkJPGxpPkF1dG9tYXRpY2FsbHkgZ2Vu ZXJhdGUgYSBsaW5rZWQgdGFibGUgb2YgY29udGVudHMgZm9yIGFuIGFydGljbGU8L2xpPgoJ CTxsaT5OZXN0ZWQgb3V0cHV0IGZvciAoWClIVE1MIGxpc3RzPC9saT4KCQk8bGk+T3B0aW9u IHRvIGZpbHRlciByZXN1bHRzIHdpdGggdGhlIDxjb2RlPmxldmVsPC9jb2RlPiBhdHRyaWJ1 dGUuPC9saT4KCQk8bGk+T3B0aW9uIHRvIHVzZSBmdWxsIDxzcGFuIGNsYXNzPSJjYXBzIj5V Ukw8L3NwYW4+czwvbGk+Cgk8L3VsPgoKCTxwPjwvZGl2PjwvcD4iO3M6NDoiY29kZSI7czoy MDgwOiIKZnVuY3Rpb24gc29vX3RvYyggJGF0dHMgKSB7CgoJZ2xvYmFsICR0aGlzYXJ0aWNs ZTsKCWFzc2VydF9hcnRpY2xlKCk7CgoJZXh0cmFjdChsQXR0cyhhcnJheSgKCQknbGFiZWwn CQkJPT4gJycsCgkJJ2xhYmVsdGFnJwkJPT4gJycsCgkJJ2JyZWFrJwkJCT0+ICdsaScsCgkJ J3dyYXB0YWcnCQk9PiAndWwnLAoJCSdjbGFzcycJCQk9PiAndG9jJywKCQknbGV2ZWwnCQkJ PT4gNiwKCQknZnVsbF91cmwnCQk9PiAnJywKCSksICRhdHRzKSk7CgoJJGZ1bGxfdXJsID0g JGZ1bGxfdXJsID8gcGVybWxpbmt1cmwoJHRoaXNhcnRpY2xlKSA6ICcnOwoKCSRwYXR0ZXJu ID0gJy88aChcZClbXj5dKz9pZFxzKj1ccyoiKFtcdy1dKykiW14+XSo+KC4rPyk8XFwvaFxc MS8nOwoJcHJlZ19tYXRjaF9hbGwoJHBhdHRlcm4sICR0aGlzYXJ0aWNsZVsnYm9keSddLCAk aGVhZGluZ3MsIFBSRUdfU0VUX09SREVSKTsKCgkkaXRlbXMgPSBhcnJheSgpOwoKCWZvcmVh Y2ggKCAkaGVhZGluZ3MgYXMgJGggKQoJCWlmICggJGhbMV0gPD0gJGxldmVsICkgewogCQkJ JGZpbHRlcmVkW10gPSAkaDsKCQkJJGl0ZW1zW10gPSAnPGEgaHJlZj0iJyAuICRmdWxsX3Vy bCAuICcjJyAuICRoWzJdIC4gJyI+JyAuICRoWzNdIC4gJzwvYT4nOwoJCX0KCglpZiAoICEk aXRlbXMgKQoJCXJldHVybjsKCglpZiAoICR3cmFwdGFnICE9ICd1bCcgJiYgJHdyYXB0YWcg IT0gJ29sJyApCgkJcmV0dXJuIGRvTGFiZWwoJGxhYmVsLCAkbGFiZWx0YWcpIC4gZG9XcmFw KCRpdGVtcywgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzKTsKCgkkbmVzdF9sZXZlbCA9IDE7 CgkkbGluZXNbXSA9IHNvb190b2NfcHJlcGVuZCgnPGxpPicgLiAkaXRlbXNbMF0sIHQsICRu ZXN0X2xldmVsKTsKCglmb3IgKCRpID0gMTsgJGkgPCBjb3VudCgkaXRlbXMpOyAkaSsrKSB7 CgkJJGxldmVsX2NoYW5nZSA9ICRmaWx0ZXJlZFskaV1bMV0gLSAkZmlsdGVyZWRbJGktMV1b MV07CgkJaWYgKCRsZXZlbF9jaGFuZ2UgPiAwKQoJCQlmb3IgKCRqID0gMTsgJGogPD0gJGxl dmVsX2NoYW5nZTsgJGorKykgewoJCQkJJGxpbmVzW10gPSBzb29fdG9jX3ByZXBlbmQoIjwk d3JhcHRhZz4iLCB0LCAkbmVzdF9sZXZlbCkuCgkJCQkJKCRsZXZlbF9jaGFuZ2UgPiAkaiA/ ICc8bGk+JyA6ICcnKTsKCQkJCSRuZXN0X2xldmVsICsrOwoJCQl9CgkJZWxzZWlmICgkbGV2 ZWxfY2hhbmdlIDwgMCkKCQkJZm9yICgkaiA9IDE7ICRqIDw9IC0kbGV2ZWxfY2hhbmdlOyAk aisrKSB7CgkJCQkkbmVzdF9sZXZlbCAtLTsKCQkJCSRsaW5lc1tdID0gc29vX3RvY19wcmVw ZW5kKCI8LyR3cmFwdGFnPjwvbGk+IiwgdCwgJG5lc3RfbGV2ZWwpOwoJCQl9CgkJJGxpbmVz W10gPSBzb29fdG9jX3ByZXBlbmQoJzxsaT4nIC4gJGl0ZW1zWyRpXSwgdCwgJG5lc3RfbGV2 ZWwpOwoJfQoKCXdoaWxlICgkbmVzdF9sZXZlbCA+IDEpIHsKCQkkbmVzdF9sZXZlbCAtLTsK CQkkbGluZXNbXSA9IHNvb190b2NfcHJlcGVuZCgiPC8kd3JhcHRhZz48L2xpPiIsIHQsICRu ZXN0X2xldmVsKTsKCX0KCglmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkbGluZXMpLTE7ICRp KyspCgkJaWYgKCBwcmVnX21hdGNoKCcvPGxpPi8nLCAkbGluZXNbJGldKQoJCQkmJiAhcHJl Z19tYXRjaCgiLzwkd3JhcHRhZz4vIiwgJGxpbmVzWyRpKzFdKSApCgkJCQkkbGluZXNbJGld IC49ICc8L2xpPic7CgoJaWYgKCAhcHJlZ19tYXRjaCgiLzxcLyR3cmFwdGFnPi8iLCAkbGlu ZXNbY291bnQoJGxpbmVzKS0xXSkgKQoJCSRsaW5lc1tjb3VudCgkbGluZXMpLTFdIC49ICc8 L2xpPic7CgoJJG91dCA9ICc8JyAuICR3cmFwdGFnIC4gKCAkY2xhc3MgPyAnIGNsYXNzPSIn IC4gJGNsYXNzIC4gJyI+JyA6ICc+JyApCgkJLiBuIC4gam9pbihuLCAkbGluZXMpIC4gbiAu ICI8LyR3cmFwdGFnPiIgLiBuOwoKCXJldHVybiBkb0xhYmVsKCRsYWJlbCwgJGxhYmVsdGFn KSAuIG4gLiAkb3V0Owp9CgpmdW5jdGlvbiBzb29fdG9jX3ByZXBlbmQoJGJhc2UsICRhZGQs ICR0aW1lcykgewoJZm9yICggJGkgPSAxOyAkaSA8PSAkdGltZXM7ICRpKysgKQoJCSRiYXNl ID0gJGFkZCAuICRiYXNlOwoJcmV0dXJuICRiYXNlOwp9IjtzOjQ6InR5cGUiO3M6MToiMCI7 czo1OiJmbGFncyI7czoxOiIwIjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6MzoibWQ1IjtzOjMy OiIzZGFhNzNkY2E3MDhkMDE0ZmM0ZjMzZDkwZDA4MDhhYiI7fQ==