# rsx_page_number 4.0 # Renders diverse page navigation widgets # Jean Rajotte (following Ramanan Sivaranjan) # www.lalabobo.net # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTU6InJzeF9wYWdlX251bWJlciI7czo2OiJhdXRob3IiO3M6NDM6IkplYW4gUmFqb3R0ZSAoZm9sbG93aW5nIFJhbWFuYW4gU2l2YXJhbmphbikiO3M6MTA6ImF1dGhvcl91cmkiO3M6MTY6Ind3dy5sYWxhYm9iby5uZXQiO3M6NzoidmVyc2lvbiI7czozOiI0LjAiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjM5OiJSZW5kZXJzIGRpdmVyc2UgcGFnZSBuYXZpZ2F0aW9uIHdpZGdldHMiO3M6NDoiaGVscCI7czo0NjU5OiI8cD5PZmZlcnMgdGhlIGZvbGxvd2luZyB0YWdzIHRvIGRpc3BsYXkgcGFnZSBudW1iZXJzIG9uIGFydGljbGUgbGlzdCBwYWdlczogcnN4X3BhZ2VfbnVtYmVyLCByc3hfbGFzdF9wYWdlX251bSwgcnN4X3BhZ2VfbnVtYmVyX25hdiwgcnN4X3BhZ2VfbnVtYmVyX2xpc3QsIGFuZCByc3hfdG9fb2YuDQo8L3A+PHA+DQpOT1RFOiB0aGF0IGFsbCB0aGVzZSB0YWdzIG1heSBiZSBwbGFjZWQgQkVGT1JFIGFuZC9vciBBRlRFUiB0aGUgbGlzdCB0YWcgaW4geW91ciBwcmVzZW50YXRpb24uDQo8L3A+DQo8aDM+Jmx0O3JzeF9wYWdlX251bWJlcl9uYXYgLyZndDs8L2gzPg0KPHA+DQpUaGlzIHRhZyBkaXNwbGF5cyBhIHNpbXBsZSBuYXZpZ2F0aW9uIHdpZGdldCwgdGhhdCB3aWxsIGRpc3BsYXkgYXJyb3dzIHRvIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBwYWdlcywgYW5kIHdpbGwgYWxzbyBkaXNwbGF5IHRoZSBwYWdlIG51bWJlciB5b3UgYXJlIG9uLCBhbmQgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcy4gSXQgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlOiA8Y29kZT48PCBQYWdlIDIgb2YgNyA+PjwvY29kZT4uDQo8L3A+DQo8aDQ+T3B0aW9uYWwgQXR0cmlidXRlczwvaDQ+DQo8dWw+PGxpPg0KPGI+c29ydDwvYj4sIGRlZmF1bHQ6IDxpPmFzYzwvaT4sIGRldGVybWluZXMgdGhlIG1lYW5pbmcgb2YgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYXJyb3dzLiAgImFzYyIgbWVhbnMgTEVGVCBpcyBPTERFUiwgUklHSFQgaXMgTkVXRVIuICBBbnkgb3RoZXIgdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgImRlc2MiLCB3aGljaCBtZWFucyBMRUZUIGlzIE5FV0VSLCBSSUdIVCBpcyBPTERFUi4gIFRoZSBkZWZhdWx0IGlzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuDQo8L2xpPjxsaT4NCjxiPmxlZnR3YXJkPC9iPiwgZGVmYXVsdDogPGk+Jmx0OyZsdDs8L2k+OiB3aGF0IHRvIHNob3cgcG9pbnRpbmcgbGVmdC4NCjwvbGk+PGxpPg0KPGI+cmlnaHR3YXJkPC9iPiwgZGVmYXVsdDogPGk+Jmd0OyZndDs8L2k+OiB3aGF0IHRvIHNob3cgcG9pbnRpbmcgcmlnaHQuDQo8L2xpPjxsaT4NCjxiPm9sZGVyPC9iPjsgPGk+ZGVwcmVjYXRlZDwvaT46IHdoYXQgd2lsbCBzaG93IGFzIDxjb2RlPmxlZnR3YXJkPC9jb2RlPi4NCjwvbGk+PGxpPg0KPGI+bmV3ZXI8L2I+OyA8aT5kZXByZWNhdGVkPC9pPjogd2hhdCB3aWxsIHNob3cgYXMgPGNvZGU+cmlnaHR3YXJkPC9jb2RlPi4NCjwvbGk+PC91bD48cD4NClRoZSB0ZXh0IGdlbmVyYXRlZCBpcyB3cmFwZWQgaW4gc3BhbnMsIHRoYXQgY2FuIGJlIHN0eWxlZCB1c2luZyBjc3MuIFRoZXJlIGFyZSB0aHJlZSBzcGFucyBnZW5lcmF0ZWQsIHdpdGggY2xhc3NlczogPGNvZGU+cnN4LW5hdi1yaWdodDwvY29kZT4sIDxjb2RlPnJzeC1uYXYtbGVmdDwvY29kZT4sIGFuZCA8Y29kZT5yc3gtbmF2LW1pZGRsZTwvY29kZT4uDQo8L3A+DQo8aDM+Jmx0O3R4cDpyc3hfcGFnZV9udW1iZXJfbGlzdCAvJmd0OzwvaDM+DQo8cD4NClRoaXMgdGFnIGRpc3BsYXlzIGEgbGlzdCBvZiBwYWdlIG51bWJlciwgdGhhdCBjYW4gYmUgdXNlZCB0byBuYXZpZ2F0ZSB5b3VyIHNpdGUsIHNpbWlsYXIgdG8gYSBsaXN0aW5nIG9yIHNlYXJjaCByZXN1bHRzIGZyb20gZ29vZ2xlID8gaS5lIGEgbGlzdCBsaWtlIDEsMiwzLDQgLi4uIDEwMCwgd2hlcmUgdGhlIG51bWJlcnMgYXJlIGxpbmtzIHRvIHRoZSBhcHByb3ByaWF0ZSBwYWdlLg0KPC9wPg0KPGg0Pk9wdGlvbmFsIEF0dHJpYnV0ZXM8L2g0Pg0KPHVsPjxsaT4NCjxiPndpbmRvd3NpemU8L2I+LCBkZWZhdWx0OiA8aT41PC9pPiwgdGhlIHBhZ2UgbnVtYmVycyB0byBzaG93IGluIHRoZSBsaXN0Lg0KPC9saT48bGk+DQo8Yj5kZWxpbTwvYj4sIGRlZmF1bHQ6IDxpPiw8L2k+LCB0aGUgdGV4dCBzaG93biBiZXR3ZWVuIGVhY2ggcGFnZSBudW1iZXIgaW4gdGhlIGxpc3QuDQo8L2xpPjxsaT4NCjxiPm5hdjwvYj4sIGRlZmF1bHQ6IDxpPjA8L2k+OyBpZiB2YWx1ZSBpcyAxLCB0aGUgbGlzdCB3aWxsIGFsc28gaW5jbHVkZSA8Yj5wcmV2PC9iPiBhbmQgPGI+bmV4dDwvYj4gImJvb2tlbmRzIi4NCjwvbGk+PGxpPg0KPGI+bGVmdHdhcmQ8L2I+LCBkZWZhdWx0OiA8aT4mbHQ7Jmx0OzwvaT46IHdoYXQgdG8gc2hvdyBwb2ludGluZyBsZWZ0IHdoZW4gPGNvZGU+bmF2PScxJzwvY29kZT4uDQo8L2xpPjxsaT4NCjxiPnJpZ2h0d2FyZDwvYj4sIGRlZmF1bHQ6IDxpPiZndDsmZ3Q7PC9pPjogd2hhdCB0byBzaG93IHBvaW50aW5nIHJpZ2h0IHdoZW4gPGNvZGU+bmF2PScxJzwvY29kZT4uDQo8L2xpPjwvdWw+PHA+DQpUaGUgdGFnIGdlbmVyYXRlcyBhbiB1bm9yZGVyZWQgbGlzdCBvZiBwYWdlIG51bWJlcnMgKGFuZCBvcHRpb25hbCBwcmV2L25leHQpLiBUaGUgYmVzdCB3YXkgdG8gc3R5bGUgc3VjaCBhIGxpc3QgaXMgd2l0aCB0aGUgZm9sbG93aW5nIENTUzoNCjwvcD48cD4NCjxwcmU+DQogIHVsLnJzeC1wYWdlLW51bS1saXN0ew0KICAgIGRpc3BsYXk6aW5saW5lOw0KICAgIGxpc3Qtc3R5bGU6bm9uZTsNCiAgICBtYXJnaW46MHB4Ow0KICAgIHBhZGRpbmc6MHB4Ow0KICB9DQogIHVsLnJzeC1wYWdlLW51bS1saXN0IGxpIHsNCiAgICBkaXNwbGF5OiBpbmxpbmU7DQogIH0NCiAgLnVubGlua2VkIHsgZm9udC13ZWlnaHQ6IGJvbGQgfSAgIC8qICBmb3IgdGhlIGN1cnJlbnQgcGFnZSB0aGF0IGlzIG5vdCBhIGxpbmsgKi8NCjwvcHJlPg0KPC9wPg0KPGg0PkV4YW1wbGU8L2g0Pg0KPHByZT4NCiZsdDt0eHA6cnN4X3BhZ2VfbnVtYmVyX2xpc3QgbmF2PScxJyBsZWZ0d2FyZD0nWyZhbXA7bHQ7JmFtcDtsdDsgUHJldl0nIHJpZ2h0d2FyZD0nW05leHQgJmFtcDtndDsmYW1wO2d0O10nIGRlbGltPScnIHdpbmRvd3NpemU9JzUnIC8mZ3Q7DQo8L3ByZT4NCjxibG9ja3F1b3RlPg0Kd291bGQgZ2VuZXJhdGUgYSBsaXN0IGxpa2Ugc286ICA8dT5bJmx0OyZsdDsgUHJldl08L3U+IDx1PjEuLi48L3U+IDx1PjQ8L3U+IDx1PjU8L3U+IDxiPjY8L2I+IDx1Pjc8L3U+IDx1Pjg8L3U+IDx1Pi4uLjEyPC91PiA8dT5bTmV4dCAmZ3Q7Jmd0OyBdPC91Pg0KPC9ibG9ja3F1b3RlPg0KDQo8aDM+Jmx0O3R4cDpyc3hfcGFnZV9udW1iZXIgLyZndDs8L2gzPg0KPHA+DQpUaGlzIHRhZyBkaXNwbGF5cyB0aGUgcGFnZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWdlIGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQgYnkgdGV4dHBhdHRlcm4uDQo8L3A+DQo8aDQ+T3B0aW9uYWwgQXR0cmlidXRlczwvaDQ+DQo8dWw+PGxpPg0KPGI+b2Zmc2V0PC9iPiwgZGVmYXVsdDogPGk+MDwvaT4sIGEgdmFsdWUgdG8gb2Zmc2V0IHRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyLg0KPC9saT48L3VsPg0KPGg0PkV4YW1wbGU8L2g0Pg0KPHByZT4NCiZsdDt0eHA6bmV3ZXImZ3Q7cGFnZSAmbHQ7dHhwOnJzeF9wYWdlX251bWJlciBvZmZzZXQ9Ii0xIiAvJmd0OyZsdDsvdHhwOm5ld2VyJmd0Ow0KPC9wcmU+DQo8YmxvY2txdW90ZT4NCndvdWxkIGdlbmVyYXRlIGEgbGluayBzaG93aW5nIHRoZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHBhZ2UuDQo8L2Jsb2NrcXVvdGU+DQoNCjxoMz4mbHQ7dHhwOnJzeF9sYXN0X3BhZ2VfbnVtIC8mZ3Q7PC9oMz4NCjxwPg0KVGhpcyB0YWcgZGlzcGxheXMgdGhlIGxhc3QgcGFnZSBudW1iZXIgaW4gYW4gYXJ0aWNsZSBsaXN0aW5nLg0KPC9wPg0KPGg0PkV4YW1wbGU8L2g0Pg0KPHByZT4NClBhZ2UgJmx0O3R4cDpyc3hfcGFnZV9udW1iZXIgLyZndDsgb2YgJmx0O3R4cDpyc3hfbGFzdF9wYWdlX251bSAvJmd0Oy4NCjwvcHJlPg0KPGJsb2NrcXVvdGU+DQp3b3VsZCBzaG93ICJQYWdlIDUgb2YgMTIiDQo8L2Jsb2NrcXVvdGU+DQoNCjxoMz4mbHQ7dHhwOnJzeF90b19vZiAvJmd0OzwvaDM+DQo8cD4NClRoaXMgdGFnIGdlbmVyYXRlcyB0ZXh0IGFjY29yZGluZyB0byBhIG1hc2ssIHJlbmRlcmluZyBwbGFjZWhvbGRlcnMgPGI+JHN0YXJ0PC9iPiwgPGI+JGVuZDwvYj4sIGFuZCA8Yj4kdG90YWw8L2I+LCB0byByZXByZXNlbnQgdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgYXJ0aWNsZSBpbiB0aGUgY3VycmVudCBwYWdlLCB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0IGFydGljbGUgaW4gdGhlIGN1cnJlbnQgcGFnZSwgYW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgYXJ0aWNsZXMsIHJlc3BlY3RpdmVseS4NCjwvcD4NCjxoND5PcHRpb25hbCBBdHRyaWJ1dGVzPC9oND4NCjx1bD48bGk+DQo8Yj5tYXNrPC9iPiwgZGVmYXVsdDogPGk+J0Rpc3BsYXlpbmcgJHN0YXJ0IHRvICRlbmQgKG9mICR0b3RhbCBhcnRpY2xlcyknPC9pPiwgdGhlIHRleHQgc2hvd24gb25jZSBwbGFjZWhvbGRlcnMgaGF2ZSBiZWVuIHJlcGxhY2VkLg0KPC9saT48L3VsPg0KPGg0PkV4YW1wbGU8L2g0Pg0KPHByZT4NCiZsdDt0eHA6cnN4X3RvX29mIG1hc2s9J1Nob3dpbmcgJHN0YXJ0IHRvICRlbmQgaW4gYSBsaW5lIG9mICR0b3RhbCBuaWJzIScgLyZndDsNCjwvcHJlPg0KPGJsb2NrcXVvdGU+DQp3b3VsZCBnZW5lcmF0ZSB0ZXh0IHNob3dpbmc6ICJTaG93aW5nIDE2IG9mIDIwIGluIGEgbGluZSBvZiA5OSBuaWJzISIsIGFzc3VtaW5nIHRoZSBjdXJyZW50IHBhZ2UgaXMgNCBhbmQgPGNvZGU+bGltPSc1JzwvY29kZT4gaW4gdGhlIGFydGljbGUgbGlzdCB0YWcuDQo8L2Jsb2NrcXVvdGU+DQoiO3M6NDoiY29kZSI7czo1NzI5OiIvLyBBdXRob3JzOg0KLy8gICAgUmFtYW5hbiBTaXZhcmFuamFuOiAgdXAgdG8gdmVyc2lvbiAzLjANCi8vICAgIEplYW4gUmFqb3R0ZTogdmVyc2lvbiA0LjANCg0KLy8gT2ZmZXJzIGRpdmVyc2UgcGFnZSBuYXZpZ2F0aW9uIHdpZGdldHMNCg0KLy8gUmVuZGVycyBhIG5hdmlnYXRpb24gd2lkZ2V0LCBsaWtlOiAgPDwgcGFnZSAzIG9mIDEyID4+DQovLyBub3RlIHRoZSBkZWZhdWx0ICJzb3J0IiBhdHRyaWJ1dGUgaXMgImFzYyIsIG1lYW5pbmcgb2xkZXIgaXMgdG8gdGhlIGxlZnQsIGFuZCBuZXdlciBpcyB0byB0aGUgcmlnaHQNCi8vIGFueSBvdGhlciB2YWx1ZSBpbiAic29ydCIgYmVjb21lcyAiZGVzYyIsIHdoZXJlIG5ld2VyIGlzIHRvIHRoZSBsZWZ0LCBldGMuDQoNCmZ1bmN0aW9uIHJzeF9wYWdlX251bWJlcl9uYXYoJGF0dHMpDQp7DQogIGdsb2JhbCAkdGhpc3BhZ2U7DQoNCiAgLy8gQmVoYXZlIGxpa2UgbmV3ZXIgYW5kIG9sZGVyLiAgVGhpcyBzaG91bGQgbGV0IHRoZSBwYWdlDQogIC8vIG51bWJlciBwcmVjZWRlIGFuIGFydGljbGUgbGlzdC4NCiAgaWYgKGlzX2FycmF5KCR0aGlzcGFnZSkpIHsNCiAgICBleHRyYWN0KCR0aGlzcGFnZSk7DQogIH0gZWxzZSB7DQogICAgcmV0dXJuIHJzeF90YWcoJ3JzeF9wYWdlX251bWJlcl9uYXYnLCAkYXR0cyk7DQogIH0NCg0KICBleHRyYWN0KGxBdHRzKGFycmF5KA0KICAgICdzb3J0JyA9PiAnYXNjJywNCiAgICAnbGVmdHdhcmQnID0+ICc8PCcsDQogICAgJ3JpZ2h0d2FyZCcgPT4gJz4+Jw0KICApLCAkYXR0cykpOw0KDQogICRsZWZ0d2FyZCA9PSAoaXNzZXQoJG9sZGVyKSkgPyAkb2xkZXIgOiAkbGVmdHdhcmQ7DQogICRyaWdodHdhcmQgPSAoaXNzZXQoJG5ld2VyKSkgPyAkbmV3ZXIgOiAkcmlnaHR3YXJkOw0KDQogIGlmICgkc29ydD09J2FzYycpIHsNCiAgICAkYiA9ICgkcGcgPiAxKSA/ICc8c3BhbiBjbGFzcz0icnN4LW5hdi1yaWdodCI+Jy5uZXdlcihhcnJheSgpLCAkcmlnaHR3YXJkKS4nPC9zcGFuPicgOiAnJzsNCiAgICAkYSA9ICgkcGcgIT0gJG51bVBhZ2VzKSA/ICc8c3BhbiBjbGFzcz0icnN4LW5hdi1sZWZ0Ij4nLm9sZGVyKGFycmF5KCksJGxlZnR3YXJkKS4nPC9zcGFuPicgOiAnJzsNCiAgfSBlbHNlIHsNCiAgICAkYSA9ICgkcGcgPiAxKSA/ICc8c3BhbiBjbGFzcz0icnN4LW5hdi1yaWdodCI+Jy5uZXdlcihhcnJheSgpLCAkbGVmdHdhcmQpLic8L3NwYW4+JyA6ICcnOw0KICAgICRiID0gKCRwZyAhPSAkbnVtUGFnZXMpID8gJzxzcGFuIGNsYXNzPSJyc3gtbmF2LWxlZnQiPicub2xkZXIoYXJyYXkoKSwkcmlnaHR3YXJkKS4nPC9zcGFuPicgOiAnJzsNCiAgfQ0KICAkb3V0ID0JJGEuJzxzcGFuIGNsYXNzPSJyc3gtbmF2LW1pZGRsZSI+IFBhZ2UgJy4kcGcuJyBvZiAnLiRudW1QYWdlcy4nIDwvc3Bhbj4nLiRiOw0KICByZXR1cm4gJG91dDsNCn0NCg0KLy8gcmVuZGVycyBhIGxpc3Qgb2YgcGFnZSBudW1iZXJzIHdpdGhpbiBhIHdpbmRvdywgd2l0aCBvcHRpb25hbCA8PHByZXYgbmV4dD4+IGFycm93cw0KDQpmdW5jdGlvbiByc3hfcGFnZV9udW1iZXJfbGlzdCgkYXR0cykNCnsNCiAgZ2xvYmFsICR0aGlzcGFnZTsNCg0KICAvLyBCZWhhdmUgbGlrZSBuZXdlciBhbmQgb2xkZXIuICBUaGlzIHNob3VsZCBsZXQgdGhlIHBhZ2UNCiAgLy8gbnVtYmVyIGxpc3QgcHJlY2VkZSBhbiBhcnRpY2xlIGxpc3QgdGFnLg0KICBpZiAoaXNfYXJyYXkoJHRoaXNwYWdlKSkgew0KICAgIGV4dHJhY3QoJHRoaXNwYWdlKTsNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4gcnN4X3RhZygncnN4X3BhZ2VfbnVtYmVyX2xpc3QnLCAkYXR0cyk7DQogIH0NCg0KICBleHRyYWN0KGxBdHRzKGFycmF5KA0KICAgICd3aW5kb3dzaXplJyAgPT4gJzUnLA0KICAgICdkZWxpbScgPT4gJywnLA0KICAgICduYXYnID0+ICcwJywNCiAgICAnbmV3ZXInID0+ICc8PCcsDQogICAgJ29sZGVyJyAgPT4gJz4+Jw0KICApLCAkYXR0cykpOw0KDQogICRoYXNOYXYgPSAoJG5hdiE9JzAnKTsNCg0KICAvLyBob2xkIG9uIHRvIGN1cnJlbnQgY29udGV4dCAoZnJvbSAkdGhpc3BhZ2UpDQogICR1cmwgPSAoJHMgIT0gJycpID8gJyZzPScuJHMgOiAnJzsNCiAgJHVybCAuPSAoJGMgIT0gJycpID8gJyZjPScuJGMgOiAnJzsNCg0KICAvLyBzZXQgdGhlIHBhZ2UgbnVtYmVyIHBvc2l0aW9ucyB0byBkaXNwbGF5DQogIGlmICgkbnVtUGFnZXMgPD0gJHdpbmRvd3NpemUpIHsNCiAgICAkd2luZG93U3RhcnQgPSAxOw0KICAgICR3aW5kb3dFbmQgPSAkbnVtUGFnZXM7DQogIH0gZWxzZSB7DQogICAgJHdpbmRvd1N0YXJ0ID0gbWF4KCRwZyAtIChmbG9vcigkd2luZG93c2l6ZSAvMikpLCAxKTsNCiAgICAkd2luZG93RW5kID0gbWluKCR3aW5kb3dTdGFydCArICR3aW5kb3dzaXplIC0gMSwgJG51bVBhZ2VzKTsNCiAgfQ0KICAvL34gJGN1cnJXaW5kb3cgPSAkd2luZG93RW5kIC0gJHdpbmRvd1N0YXJ0ICsgMTsNCiAgLy9+IGlmICggJGN1cnJXaW5kb3cgIT0gJHdpbmRvd3NpemUgJiYgJHdpbmRvd0VuZCAtICR3aW5kb3dzaXplID4gMCkNCiAgICAvL34gJHdpbmRvd1N0YXJ0ID0gJHdpbmRvd0VuZCAtICR3aW5kb3dzaXplICsgMTsNCg0KICAvLyBvdXRwdXQgdGhlIHBhZ2UgbnVtYmVyIGxpc3QNCiAgJG91dCA9ICc8dWwgY2xhc3M9InJzeC1wYWdlLW51bS1saXN0Ij4nOw0KICBpZiAoJGhhc05hdikgew0KICAgICRvdXQgLj0gKCRwZyA+IDEpDQogICAgICA/ICc8bGk+PHNwYW4gY2xhc3M9InJzeC1uYXYtcmlnaHQiPicubmV3ZXIoYXJyYXkoKSwgJG5ld2VyKS4nPC9zcGFuPjwvbGk+Jw0KICAgICAgOiAnJzsNCiAgfQ0KICBpZiAoJHdpbmRvd1N0YXJ0ICE9IDEpIHsNCiAgICAkb3V0IC49ICc8bGk+PGEgaHJlZj0iP3BnPTEnLiR1cmwuJyIgdGl0bGU9IlBhZ2UgMSI+MTwvYT4nOw0KICAgIGlmICgkd2luZG93U3RhcnQgLSAxICE9IDEpIHsNCiAgICAgICRvdXQgLj0gJy4uLic7DQogICAgfSBlbHNlIHsNCiAgICAgICRvdXQgLj0gJGRlbGltOw0KICAgIH0NCiAgICAkb3V0IC49ICc8L2xpPic7DQogIH0NCiAgZm9yICgkaSA9ICR3aW5kb3dTdGFydDsgJGkgPD0gJHdpbmRvd0VuZDsgJGkrKykgew0KICAgICRvdXQgLj0nPGxpPic7DQogICAgaWYgKCRpICE9ICRwZykgew0KICAgICAgJG91dCAuPSAnPGEgaHJlZj0iP3BnPScuJGkuJHVybC4nIiB0aXRsZT0iUGFnZSAnLiRpLiciPicuJGkuJzwvYT4nOw0KICAgIH0gZWxzZSB7DQogICAgICAkb3V0IC49ICc8c3BhbiBjbGFzcz0idW5saW5rZWQiPicuJGkuJzwvc3Bhbj4nOw0KICAgIH0NCiAgICAkb3V0IC49ICRkZWxpbTsNCiAgICAkb3V0IC49ICc8L2xpPic7DQogIH0NCiAgaWYgKCR3aW5kb3dFbmQgIT0gJG51bVBhZ2VzKSB7DQogICAgJG91dCAuPSAnPGxpPi4uLiA8YSBocmVmPSI/cGc9Jy4kbnVtUGFnZXMuJHVybC4nIiB0aXRsZT0iUGFnZSAnLiRudW1QYWdlcy4nIj4nLiRudW1QYWdlcy4nPC9hPjwvbGk+JzsNCiAgfQ0KICBpZiAoJGhhc05hdikgew0KICAgICRvdXQgLj0gKCRwZyAhPSAkbnVtUGFnZXMpDQogICAgICA/ICc8bGk+PHNwYW4gY2xhc3M9InJzeC1uYXYtbGVmdCI+Jy5vbGRlcihhcnJheSgpLCRvbGRlcikuJzwvc3Bhbj48L2xpPicNCiAgICAgIDogJyc7DQogIH0NCiAgJG91dCAuPSAnPC91bD4nOw0KDQogIHJldHVybiAkb3V0Ow0KfQ0KDQovLyBSZXR1cm5zIHdoaWNoIHBhZ2Ugd2UgYXJlIG9uIGluIGFuIGFydGljbGUgbGlzdGluZw0KLy8gdGFrZXMgYW4gb3B0aW9uYWwgcGFyYW1hdGVyLCBvZmZzZXQsIHdoaWNoIGlzIGFkZGVkDQovLyB0byB0aGUgcGFnZSBudW1iZXIuDQpmdW5jdGlvbiByc3hfcGFnZV9udW1iZXIoJGF0dHMpDQp7DQogIGdsb2JhbCAkdGhpc3BhZ2U7DQoNCiAgLy8gQmVoYXZlIGxpa2UgbmV3ZXIgYW5kIG9sZGVyLiAgVGhpcyBzaG91bGQgbGV0IHRoZSBwYWdlDQogIC8vIG51bWJlciBwcmVjZWRlIGFuIGFydGljbGUgbGlzdC4NCiAgaWYgKGlzX2FycmF5KCR0aGlzcGFnZSkpIHsNCiAgICBleHRyYWN0KCR0aGlzcGFnZSk7DQogIH0gZWxzZSB7DQogICAgcmV0dXJuIHJzeF90YWcoJ3JzeF9wYWdlX251bWJlcicsICRhdHRzKTsNCiAgfQ0KDQogIGlmIChpc19hcnJheSgkYXR0cykpIGV4dHJhY3QoJGF0dHMpOw0KICAkb2Zmc2V0ID0gaXNzZXQoJG9mZnNldCkgPyAkb2Zmc2V0IDogMDsNCg0KICAkcmV0dXJuVmFsID0gJHBnICsgJG9mZnNldDsNCg0KICByZXR1cm4gJHJldHVyblZhbDsNCn0NCg0KLy8gUmV0dXJucyB0aGUgbGFzdCBwYWdlIHdlIGFyZSBvbiBpbiBhbiBhcnRpY2xlIGxpc3RpbmcuDQpmdW5jdGlvbiByc3hfbGFzdF9wYWdlX251bSgkYXR0cykNCnsNCiAgZ2xvYmFsICR0aGlzcGFnZTsNCg0KICAvLyBCZWhhdmUgbGlrZSBuZXdlciBhbmQgb2xkZXIuICBUaGlzIHNob3VsZCBsZXQgdGhlIHBhZ2UNCiAgLy8gbnVtYmVyIHByZWNlZGUgYW4gYXJ0aWNsZSBsaXN0Lg0KICBpZiAoaXNfYXJyYXkoJHRoaXNwYWdlKSkgew0KICAgIGV4dHJhY3QoJHRoaXNwYWdlKTsNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4gcnN4X3RhZygncnN4X2xhc3RfcGFnZV9udW0nLCAkYXR0cyk7DQogIH0NCg0KICByZXR1cm4gJG51bVBhZ2VzOw0KfQ0KDQovLyByZXR1cm5zIGEgaW5mb3JtYXRpb24gcGhyYXNlIGFib3V0IHRoZSBjdXJyZW50IGFydGljbGVzIGxpc3RlZA0KLy8gdGhlIGRlZmF1bHQgaXM6ICAnRGlzcGxheWluZyAkc3RhcnQgdG8gJGVuZCAob2YgJHRvdGFsIGFydGljbGVzKScNCg0KZnVuY3Rpb24gcnN4X3RvX29mKCRhdHRzKSB7DQogIGdsb2JhbCAkdGhpc3BhZ2U7DQoNCiAgLy8gQmVoYXZlIGxpa2UgbmV3ZXIgYW5kIG9sZGVyLiAgVGhpcyBzaG91bGQgbGV0IHRoZSBwYWdlDQogIC8vIG51bWJlciBsaXN0IHByZWNlZGUgYW4gYXJ0aWNsZSBsaXN0IHRhZy4NCiAgaWYgKGlzX2FycmF5KCR0aGlzcGFnZSkpIHsNCiAgICBleHRyYWN0KCR0aGlzcGFnZSk7DQogIH0gZWxzZSB7DQogICAgcmV0dXJuIHJzeF90YWcoJ3JzeF90b19vZicsICRhdHRzKTsNCiAgfQ0KDQogIGV4dHJhY3QobEF0dHMoYXJyYXkoDQogICAgJ21hc2snICA9PiAnRGlzcGxheWluZyAkc3RhcnQgdG8gJGVuZCAob2YgJHRvdGFsIGFydGljbGVzKScNCiAgKSwgJGF0dHMpKTsNCg0KICAvLyBJIHdpc2ggbGltaXQgd2VyZSBjYXB0dXJlZCBpbiAkdGhpc3BhZ2UsIGJ1dCBpdCdzIG5vdCwgc28gbGV0J3MgY2FsYyBpdC4NCiAgJGxpbSA9IGNlaWwoJGdyYW5kX3RvdGFsLyRudW1QYWdlcyk7DQogICRzdGFydCA9ICRsaW0gKiAoJHBnLTEpICsgMTsNCiAgJGVuZCA9IG1pbigoJGxpbSAqICRwZyksICR0b3RhbCk7DQoNCiAgJG91dCA9IHByZWdfcmVwbGFjZShhcnJheSgnL1wkc3RhcnQvJywgJy9cJGVuZC8nLCAnL1wkdG90YWwvJyksIGFycmF5KCRzdGFydCwgJGVuZCwgJHRvdGFsKSwgJG1hc2spOw0KICByZXR1cm4gJG91dDsNCn0NCg0KLy8gdXRpbGl0aWVzDQoNCmZ1bmN0aW9uIHJzeF90YWcoJHRhZywgJGF0dHNfbGlzdCA9IGFycmF5KCkpIHsNCiAgJGF0dHMgPSBhcnJheSgpOw0KICBmb3JlYWNoICgkYXR0c19saXN0IGFzICRhdHQgPT4gJHZhbCkgew0KICAgIGlmICgkdmFsIHx8ICR2YWwgPT09ICcwJyB8fCAkdmFsPT09JycpIHsNCiAgICAgICRhdHRzW10gPSAnICcuJGF0dC4nPSInLiR2YWwuJyInOw0KICAgIH0NCiAgfQ0KICAkYXR0cyA9ICgkYXR0cykgPyBqb2luKCcnLCAkYXR0cykgOiAnJzsNCiAgcmV0dXJuICc8dHhwOicuJHRhZy4kYXR0cy4nIC8+JzsNCn0NCiI7czo0OiJ0eXBlIjtzOjE6IjAiO3M6MzoibWQ1IjtzOjMyOiI1ZTExZDU3ZjY2NGI4NzJiZjA0M2ViZjczZDg5ZWQ2OCI7fQ==