# smd_slimbox 0.25a # Image gallery lightbox wrapper using Christophe Beyl's Slimbox # Stef Dawson # http://www.stefdawson.com # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTE6InNtZF9zbGltYm94IjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjU6Imh0dHA6Ly93d3cuc3RlZmRhd3Nvbi5jb20iO3M6NzoidmVyc2lvbiI7czo1OiIwLjI1YSI7czoxMToiZGVzY3JpcHRpb24iO3M6NjI6IkltYWdlIGdhbGxlcnkgbGlnaHRib3ggd3JhcHBlciB1c2luZyBDaHJpc3RvcGhlIEJleWwncyBTbGltYm94IjtzOjQ6ImhlbHAiO3M6MTc2MjA6IjxoMT5zbWRfc2xpbWJveDwvaDE+DQo8cCBjbGFzcz0ic21hbGwiPltyZXF1aXJlcyBzbWRfbGliIHRvIGJlIGluc3RhbGxlZCBhbmQgYWN0aXZhdGVkXTxwPg0KDQo8cD5ZZWFoLCB5ZWFoIDxlbT5hbm90aGVyPC9lbT4gbGlnaHRib3gtc3R5bGUgaW1hZ2UgZ2FsbGVyeSEgQnV0IHRoaXMgdGltZSB1c2luZyA8YSBocmVmPSJodHRwOi8vd3d3LmRpZ2l0YWxpYS5iZS9zb2Z0d2FyZS9zbGltYm94Ij5DaHJpc3RvcGhlIEJleWwnczwvYT4gdWx0cmEtbGlnaHR3ZWlnaHQgU2xpbWJveCAoZGlldCBjb2tlIHZlcnNpb24gb2YgbGlnaHRib3gpIGFuZCBtb290b29scy4gQWxzbyBwbGFnaWFyaXNlcyBpZGVhcyBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD01MTc2Ij5Sb2IgU2FibGUncyByc3NfdGh1bWJwb3A8L2E+LiBTdXBwb3J0cyB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTIwNjkyIj5NdWx0aS1MaW5ndWFsIFBhY2s8L2E+IChNTFApIGZvciBpbWFnZSBjYXB0aW9uL2FsdCBhbmQgaW50ZXJuYWwgc3RyaW5nIGxvY2FsaXNhdGlvbi4gTWFueSB0aGFua3MgdG8gdGhlIG9yaWdpbmFsIGF1dGhvcnMuPC9wPg0KDQo8aDI+SW5zdGFsbGF0aW9uPC9oMj4NCg0KPHA+RW5zdXJlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBqcyBmb2xkZXIgKDxjb2RlPm1vb3Rvb2xzLmpzPC9jb2RlPiBhbmQgPGNvZGU+c2xpbWJveC5qczwvY29kZT4pIGFuZCB0aGUgY3NzIGZvbGRlciAoPGNvZGU+c2xpbWJveC5jc3M8L2NvZGU+IGFuZCA0IGltYWdlcykgYXJlIHVwbG9hZGVkIHRvIHlvdXIgc2VydmVyLiBZb3UgY2FuIHB1dCB0aGUgZGlyZWN0b3JpZXMgaW4gdGhlIHRleHRwYXR0ZXJuIHJvb3QgZm9sZGVyIG9yIHNvbWV3aGVyZSBlbHNlIG9mIHlvdXIgY2hvaWNlLiBJdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hlcmUgeW91IHB1dCB0aGVtLCB5b3UganVzdCBoYXZlIHRvIHRlbGwgdGhlIHBsdWdpbiB3aGVyZSBpdCBpcy48L3A+DQoNCjxwPldoZW4gaW5zdGFsbGVkLCB0aGlzIHBsdWdpbiBhZGRzIHR3byB0YWdzLiBUaGUgZmlyc3QgKDxjb2RlPnNtZF9zbGltYm94X2luYzwvY29kZT4pIGdvZXMgaW4gdGhlICZsdDtoZWFkJmd0OyBzZWN0aW9uIG9mIHlvdXIgcGFnZSBhbmQgbG9hZHMgdGhlIHJlcXVpcmVkIGxpYnJhcmllcy4gVGhlIHNlY29uZCAoPGNvZGU+c21kX3NsaW1ib3g8L2NvZGU+KSBpcyB0aGUgYWN0dWFsIHBsdWdpbiB0aGF0IGRpc3BsYXlzIHlvdXIgaW1hZ2UgZ2FsbGVyeSAob3IgZ2FsbGVyaWVzIGlmIHlvdSdyZSBmZWVsaW5nIGFkdmVudHVyb3VzKS48L3A+DQoNCjxwPkEgcXVpY2sgd29yZCBhYm91dCBob3cgaXQgYWxsIHdvcmtzOiB0aGUgcGx1Z2luIG9wdGlvbnMgZ292ZXJuIHdoaWNoIHRodW1ibmFpbHMgdG8gdXNlIGFuZCBob3cgdGhleSBhcmUgZGlzcGxheWVkIG9ubHkuIE9uY2UgdGhlIHRodW1icyBhcmUgY2xpY2tlZCwgY29udHJvbCBpcyBoYW5kZWQgb3ZlciB0byBzbGltYm94IGFuZCBtb290b29scyB0byBkbyB0aGUgZmFuY3kgd29yay4gVGhlcmVmb3JlLCBpZiB5b3Ugd2lzaCB0byBjb25maWd1cmUgdGhlIGxvb2sgb2YgdGhlICJsaWdodGJveCIgcGFydCwgeW91IG5lZWQgdG8gZWRpdCA8Y29kZT5zbGltYm94LmpzPC9jb2RlPiBhbmQvb3IgPGNvZGU+c2xpbWJveC5jc3M8L2NvZGU+LiBNb3JlIGluZm8gY2FuIGJlIGZvdW5kIG9uIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGlnaXRhbGlhLmJlL3NvZnR3YXJlL3NsaW1ib3giPkNocmlzdG9waGUgQmV5bCdzIHBhZ2U8L2E+LjwvcD4NCg0KPHA+QWxzbywgaWYgeW91IGFscmVhZHkgdXNlIG1vb3Rvb2xzIGZvciB5b3VyIHBhZ2UgeW91IGRvbid0IG5lZWQgdG8gdXBsb2FkIGl0IGFnYWluLiBKdXN0IG1ha2Ugc3VyZSB0aGUgdmVyc2lvbiB5b3UgdXNlIGhhcyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IHBsdXMgdGhlICJmeCIgYW5kICJ3aW5kb3ciIG1vZHVsZXMgbGlzdGVkIG9uIENocmlzdG9waGUncyBwYWdlLjwvcD4NCg0KPGgyPlVzYWdlOiBzbWRfc2xpbWJveF9pbmM8L2gyPg0KDQo8cD5Tb21ld2hlcmUgaW4gdGhlICZsdDtoZWFkJmd0OyBvZiB0aGUgcGFnZSB0aGF0IHlvdSB3YW50IHlvdXIgZ2FsbGVyeSBvbiwgYWRkOjwvcD4NCg0KPHA+PGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveF9pbmMganNkaXI9Ii9qcyIgY3NzZGlyPSIvY3NzIiAvJmd0OzwvY29kZT48L3A+DQoNCjxwPklmIHlvdSBoYXZlIHRoZSBsaWJyYXJpZXMgaW4gdGhlIGpzIGFuZCBjc3MgZm9sZGVycyBpbiB5b3VyIHRleHRwYXR0ZXJuIHJvb3QgZm9sZGVyLCB0aGF0IHdpbGwgYmUgZmluZS4gSWYgbm90LCB5b3UgY2FuIGNoYW5nZSB3aGVyZSB0aGUgcGx1Z2luIGxvb2tzIGZvciB0aGUgbGlicmFyaWVzIGJ5IGFkanVzdGluZyB0aGUgdHdvIG9wdGlvbnMuPC9wPg0KDQo8cD5JZiB5b3Ugd2FudCBtb3JlIGNvbnRyb2wsIHlvdSBoYXZlIHR3byBtb3JlIG9wdGlvbnMgYXZhaWxhYmxlLiBUaGUgZmlyc3QgaXMgPGNvZGU+c2NyaXB0czwvY29kZT4uIFRoaXMgdGFrZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB1cCB0byAzIGFyZ3VtZW50cyBpbiB0aGlzIG9yZGVyOiBtb290b29sc0pTTG9jYXRpb24sIHNsaW1ib3hKU0xvY2F0aW9uLCBzbGltYm94Q1NTTG9jYXRpb24uIFRoZSBvcmRlciBpcyBpbXBvcnRhbnQ6IG1vb3Rvb2xzIG11c3QgYXBwZWFyIG9uIHRoZSBwYWdlIGJlZm9yZSBzbGltYm94LmpzISBTbyBpZiB5b3UgaGF2ZSB5b3VyIHNjcmlwdHMgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzIG9yIGhhdmUgcmVuYW1lZCB0aGUgZmlsZXMsIGluc3RlYWQgb2YgdGhlIDxjb2RlPmNzc2RpcjwvY29kZT4gYW5kIDxjb2RlPmpzZGlyPC9jb2RlPiBvcHRpb25zIHlvdSBjb3VsZCBkbzo8L3A+DQoNCjxwPjxjb2RlPiZsdDt0eHA6c21kX3NsaW1ib3hfaW5jIHNjcmlwdHM9Ii9zY3JpcHRzL21vb3Rvb2xzLmpzLCAvc2JveC9zbGltYm94LmpzLCAvc2Jjc3Mvc2xpbWJveC5jc3MiIC8mZ3Q7PC9jb2RlPjwvcD4NCg0KPHA+VGhlIHRocmVlIG9wdGlvbnMgY2FuIGVpdGhlciBiZSBkaXJlY3QgZmlsZSBwYXRocywgYXMgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIG9yIGZ1bGwgWEhUTUwgdGFncyBpbmNsdWRpbmcgPGNvZGU+Jmx0O3NjcmlwdCZndDs8L2NvZGU+IG9yIDxjb2RlPiZsdDtsaW5rJmd0OzwvY29kZT50YWdzLiBZb3UgY2FuIG1peCBhbmQgbWF0Y2ggdGhlIG9wdGlvbnMgaW4gYW55IHdheSB5b3UgbGlrZSwgYXMgbG9uZyBhcyB0aGUgdG90YWwgbnVtYmVyIG9mIHNjcmlwdHMgeW91IHRlbGwgdGhlIHRhZyB0byBsb2FkIGRvZXNuJ3QgZXhjZWVkIDMuIFNvIGFuIGVxdWl2YWxlbnQgdG8gdGhlIGFib3ZlIGlzOjwvcD4NCg0KPHA+PGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveF9pbmMgc2NyaXB0cz0iL3NjcmlwdHMvbW9vdG9vbHMuanMsIC9zYm94L3NsaW1ib3guanMiIGNzc2Rpcj0iL3NiY3NzIiAvJmd0OzwvY29kZT48L3A+DQoNCjxwPklmIHlvdSB3aXNoIHRvIGxvYWQgc29tZSBvciBhbGwgb2YgdGhlIHNjcmlwdHMgIm91dHNpZGUiIHRoZSBzbWRfc2xpbWJveF9pbmMgZnVuY3Rpb24geW91IGNhbiB1c2UgdGhlIDxjb2RlPnNraXA8L2NvZGU+IG9wdGlvbiB0byB0ZWxsIGl0IGhvdyBtYW55IHlvdSBoYXZlIGxvYWRlZC4gSWYsIGZvciBleGFtcGxlLCB5b3UgaGF2ZSBzdG1famF2YXNjcmlwdCBpbnN0YWxsZWQgeW91IGNvdWxkIGRvOjwvcD4NCg0KPHA+PGNvZGU+Jmx0O3R4cDpqcyBuPSJtb290b29scyIgLyZndDs8L2NvZGU+PGJyIC8+DQo8Y29kZT4mbHQ7dHhwOnNtZF9zbGltYm94X2luYyBza2lwPSIxIiBzY3JpcHRzPSIsIC9zYm94L3NsaW1ib3guanMsIC9zYmNzcy9zbGltYm94LmNzcyIgLyZndDs8L2NvZGU+PC9wPg0KDQo8cD5Ob3RlIHRoZSBlbXB0eSBvcHRpb24gYXQgdGhlIHN0YXJ0LiBZb3UgZG9uJ3QgaGF2ZSB0byBkbyB0aGF0IChiZWNhdXNlIDxjb2RlPnNraXA8L2NvZGU+IHdpbGwganVtcCBvdmVyIGl0IGZvciB5b3UpIGJ1dCBpZiB5b3UgbGlrZSB0byBtYWtlIGl0IG9idmlvdXMsIGl0IGRvZXMgbm8gaGFybS4gVXNpbmcgdGhlIHNvbGUgb3B0aW9uIDxjb2RlPnNraXA9IjMiPC9jb2RlPiBtZWFucyAiSSd2ZSBsb2FkZWQgdGhlbSBhbGwgbXlzZWxmLCBJIGtub3cgd2hhdCBJJ20gZG9pbmciIDotKTwvcD4NCg0KPHA+T25lIG1vcmUgdGhpbmcgd2l0aCB0aGlzIGZlYXR1cmU6IFRYUCBkb2VzIG5vdCBhbGxvdyB5b3UgdG8gZGlyZWN0bHkgZW1iZWQgb3RoZXIgdGFncyBhcyBhdHRyaWJ1dGVzIChzbyB1bmZvcnR1bmF0ZWx5IDxjb2RlPnNjcmlwdHM9IiZsdDt0eHA6Y3NzIC8mZ3Q7IjwvY29kZT4gZmFpbHMpLiBJZiB5b3UgYWJzb2x1dGVseSBtdXN0IGRvIGl0LCB5b3UgY2FuIGNoZWF0IChzZWUgV2V0J3MgZXhjZWxsZW50IHBvc3Qgb24gPGEgaHJlZj0iaHR0cDovL2F3YXN0ZW9md29yZHMuY29tL2FydGljbGUvdGV4dHBhdHRlcm4tdGFncy1pbi10YWdzLXRoZS1nb3JkaWFuLWtub3QiPnRhZ3MgaW4gdGFnczwvYT4gZm9yIG1vcmUgZGV0YWlscykgYnkgZHJvcHBpbmcgaW50byBQSFAgYW5kIGRvaW5nIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOnNtZF9zbGltYm94X2luYyBjc3NkaXI9Ii9jc3MiIHNjcmlwdHM9Ii9zY3JpcHRzL21vb3Rvb2xzLmpzLCAmbHQ7dHhwOnBocCZndDtlY2hvIGpzKGFycmF5KCAnbicgPT4gJ3NsaW1ib3gnKSk7Jmx0Oy90eHA6cGhwJmd0OyAvJmd0OzwvY29kZT48L3A+DQoNCjxwPlVuZm9ydHVuYXRlbHksIHRoZSBwbHVnaW4gZG9lcyBub3QgY2hlY2sgdGhhdCB5b3UgaGF2ZSBnaXZlbiBpdCB0aGUgY29ycmVjdCBmaWxlIGxvY2F0aW9ucyB0byB2YWxpZCwgcmVhZGFibGUgZmlsZXMgc28gaWYgeW91IGhhdmUgcHJvYmxlbXMgbWFraW5nIGl0IHdvcmssIGNoZWNrIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgcGFnZSB0byBzZWUgaWYgeW91J3JlIGxvYWRpbmcgd2hhdCB5b3UgdGhpbmsgeW91J3JlIGxvYWRpbmcgZnJvbSB0aGUgY29ycmVjdCBwbGFjZXMhPC9wPg0KDQo8cD5JZiB5b3UgYXJlIHVzaW5nIFJTUyBmZWVkcyBvciBqdXN0IGRvbid0IHdhbnQgdG8gdXNlIHNtZF9zbGltYm94X2luYywgeW91IGNhbiB0dXJuIGl0IG9mZi4gSnVzdCBhZGQgbGliY2hlY2s9IjAiIHRvIHRoZSBzbWRfc2xpbWJveCB0YWcuIFNlZSB0aGUgbmV4dCBzZWN0aW9uLjwvcD4NCg0KPGgyPlVzYWdlOiBzbWRfc2xpbWJveDwvaDI+DQoNCjxwPk9uY2UgdGhlIHNjcmlwdHMgYXJlIGxvYWRlZCwgeW91IGFyZSBmcmVlIHRvIHVzZSA8Y29kZT4mbHQ7dHhwOnNtZF9zbGltYm94IC8mZ3Q7PC9jb2RlPiB0byBkaXNwbGF5IGFuIGltYWdlIGdhbGxlcnkuIFdpdGhvdXQgYW55IG9wdGlvbnMgaXQgZGlzcGxheXMgZXZlcnkgaW1hZ2UgaW4geW91ciBlbnRpcmUgY29sbGVjdGlvbiBhbmQgd29uJ3QgbG9vayB2ZXJ5IHByZXR0eSAodGhvdWdoIHlvdSBjYW4gaGVscCBhIGJpdCBieSBzdGFydGluZyB3aXRoIHRoZSA8YSBocmVmPSIjU3R5bGluZyI+ZXhhbXBsZSBDU1M8L2E+IGdpdmVuIGxhdGVyKS4gVGhlIGZvbGxvd2luZyBvcHRpb25zIHRhbWUgdGhlIHBsdWdpbiBhIGxpdHRsZTo8L3A+DQoNCjxwPg0KPHVsPg0KPGxpPjxiPmNhdGVnb3J5PC9iPjxiciAvPmNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGltYWdlIGNhdGVnb3J5IG5hbWVzIHRvIHNob3cuDQo8YnIgLz5Vc2luZyAiP2MiIGFzIG9uZSBvZiB0aGUgb3B0aW9ucyB1c2VzIHRoZSBjdXJyZW50IGdsb2JhbCBjYXRlZ29yeSBhcyB0aGUgbmFtZSBvZiBhbiBpbWFnZSBjYXRlZ29yeS4NCjxiciAvPlVzaW5nICIhYyIgdXNlcyBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgY3VycmVudCBnbG9iYWwgY2F0ZWdvcnkuDQo8YnIgLz5Vc2luZyAiP3MiIGFzIG9uZSBvZiB0aGUgb3B0aW9ucyB1c2VzIHRoZSBjdXJyZW50IHNlY3Rpb24gYXMgdGhlIG5hbWUgb2YgYW4gaW1hZ2UgY2F0ZWdvcnkuDQo8YnIgLz5Vc2luZyAiIXMiIHVzZXMgZXZlcnl0aGluZyBleGNlcHQgdGhlIGN1cnJlbnQgc2VjdGlvbi4NCjxiciAvPlVzaW5nICI/dCIgYXMgb25lIG9mIHRoZSBvcHRpb25zIHVzZXMgdGhlIGN1cnJlbnQgYXJ0aWNsZSdzIHVybD10aXRsZSBhcyB0aGUgbmFtZSBvZiBhbiBpbWFnZSBjYXRlZ29yeS4NCjxiciAvPlVzaW5nICIhdCIgdXNlcyBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgY3VycmVudCBhcnRpY2xlJ3MgdXJsPXRpdGxlLg0KPGJyIC8+VG8gbWFrZSBhIHBlci1hcnRpY2xlIGltYWdlIGdhbGxlcnksIHVzZSAiP2lkIiB0byB0YWtlIHRoZSBjdXJyZW50IGFydGljbGUgSUQ6IGl0IG1ha2VzIHVwIGEgY2F0ZWdvcnkgbmFtZSB1c2luZyB0aGUgPGNvZGU+Y2F0bGFiZWw8L2NvZGU+IG9wdGlvbiBhbmQgdGhlIElEIGZpZWxkLiBCeSBkZWZhdWx0IHRoaXMgd2lsbCBiZSAiYXJ0aWNsZS1JRCIuIFlvdSBtYXkgbmVnYXRlIHRoZSBhcnRpY2xlIElEIGJ5IHVzaW5nICIhaWQiLg0KPGJyIC8+WW91IGNhbiBhbHNvIHVzZSAiP2ZpZWxkbmFtZSIgd2hpY2ggd2lsbCBwaWNrIHVwIGNhdGVnb3JpZXMgZnJvbSB0aGUgZ2l2ZW4gZmllbGRuYW1lIG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGFydGljbGUuIERlc2lnbmVkIHByaW1hcmlseSBmb3IgdXNlIHdpdGggY3VzdG9tIGZpZWxkcyAoZS5nLiA/Y3VzdG9tMSksIGl0IGNvdWxkIGFsc28gYmUgYW55IG90aGVyIGZpZWxkIChvciBmaWVsZHMpIGZyb20geW91ciBhcnRpY2xlcyAoZS5nLiA/ZXhjZXJwdCBvciA/Y2F0ZWdvcnkxIG9yID9rZXl3b3JkcyBvciA/YXV0aG9yaWQsIGV0Yy4pIFRoZSBza3kncyB0aGUgbGltaXQgYmVjYXVzZSB0aG9zZSBmaWVsZHMgY291bGQgY29udGFpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNhdGVnb3JpZXMuLi4gYmUgd2FybmVkOiBpZiB5b3UgdXNlID9ib2R5IG9yIHNvbWV0aGluZyBlcXVhbGx5IG91dHJhZ2VvdXMsIGNoYW5jZXMgYXJlIHRoZSBwbHVnaW4gd2lsbCBleHBsb2RlLg0KPGJyIC8+VG8gbmVnYXRlIHRoZSBjYXRlZ29yeSBzZWxlY3Rpb24sIHVzZSAiIWNhdGVnb3J5X29yX2ZpZWxkX25hbWUiLiBJZiB5b3UgbGlzdCBzcGVjaWZpYyBpbWFnZSBjYXRlZ29yaWVzIChlLmcuICFsYW5kc2NhcGUsICFiaXJkcykgdGhvc2UgY2F0ZWdvcmllcyB3aWxsIGJlIGV4Y2x1ZGVkLiBJZiB5b3Ugc3BlY2lmeSBhIGZpZWxkIG5hbWUgc3VjaCBhcyAha2V5d29yZHMgb3IgIWN1c3RvbTEsIHRoZSBjb250ZW50cyBvZiB0aGF0IGZpZWxkIHdpbGwgYmUgcmVhZCBhbmQgdGhlIGxpc3Qgb2YgaW1hZ2UgY2F0ZWdvcmllcyBmb3VuZCB0aGVyZSB3aWxsIGJlIGV4Y2x1ZGVkLiBOb3RlIHRoYXQgaWYgeW91IHNwZWNpZnkgYSBmaWVsZCBuYW1lIGFuZCB0aGF0IGZpZWxkIGluIHRoZSBhcnRpY2xlIGlzIGVtcHR5LCB0aGUgbmFtZSB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgaXQgd2FzIGFuIGltYWdlIGNhdGVnb3J5LiBBbHNvIG5vdGUgdGhhdCwgcmVnYXJkbGVzcyBvZiB0aGUgb3JkZXIgeW91IGxpc3QgdGhlbSwgYWxsICdwb3NpdGl2ZXMnIHdpbGwgYmUgcHJvY2Vzc2VkIGZpcnN0LCB0aGVuIGFueSBleGNsdXNpb25zIGFwcGxpZWQuPC9saT4NCjxsaT48Yj5zdWJjYXRzPSIxIjwvYj48YnIgLz50byBhdXRvbWF0aWNhbGx5IGluY2x1ZGUgYWxsIHN1Yi1jYXRlZ29yaWVzIG9mIHRoZSBjaG9zZW4gaW1hZ2UgY2F0ZWdvcmllczwvbGk+DQo8bGk+PGI+Y2F0bGFiZWw8L2I+PGJyIC8+dGhlIGxhYmVsIHVzZWQgaW4gZnJvbnQgb2YgdGhlIGNhdGVnb3J5IGlmIHRoZSAiP2lkIiBvciAiIWlkIiBvcHRpb24gaXMgdXNlZDsgZGVmYXVsdDogImFydGljbGUtIjwvbGk+DQo8bGk+PGI+aW1hZ2VpZDwvYj48YnIgLz5jb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBpbWFnZSBJRHMgdG8gc2hvdy4gVGhlc2UgYXJlIGFkZGVkIHRvIGFueSBpbWFnZXMgZnJvbSB0aGUgPGNvZGU+Y2F0ZWdvcnk8L2NvZGU+IG9wdGlvbiBCRUZPUkUgYW55IGV4Y2x1c2lvbnMgYXJlIGFwcGxpZWQuDQo8YnIgLz5BcyB3aXRoIHRoZSA8Y29kZT5jYXRlZ29yeTwvY29kZT4gb3B0aW9uLCB5b3UgY2FuIGFsc28gdXNlICI/aWQiIGFuZCAiP2ZpZWxkbmFtZSIgd2hpY2ggd2lsbCBwaWNrIHVwIGltYWdlIElEcyBmcm9tIHRoZSBnaXZlbiBmaWVsZG5hbWUgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgYXJ0aWNsZS4gSW50ZXJlc3RpbmcgaWYgeW91IGNob29zZSA/YXJ0aWNsZV9pbWFnZSBiZWNhdXNlIHlvdSBjYW4gbWFrZSB5b3VyIGFydGljbGUgaW1hZ2Ugdmlld2FibGUgaW4gYSBsaWdodGJveCENCjxiciAvPlRoaXMgb3B0aW9uIGFsc28gc3VwcG9ydHMgaWQgYW5kIGZpZWxkIG5lZ2F0aW9uIHVzaW5nIHRoZSBzYW1lIHRlcm1pbm9sb2d5IGFzIHRoZSA8Y29kZT5jYXRlZ29yeTwvY29kZT4gb3B0aW9uLg0KPC9saT4NCjxsaT48Yj5saW1pdDwvYj48YnIgLz4wIChvciBvbWl0dGVkKT1lc3NlbnRpYWxseSB1bmxpbWl0ZWQ7IG9yIHRoZSBudW1iZXIgb2YgaW1hZ2UgdGh1bWJuYWlscyB0byBzaG93IHBlciBwYWdlPC9saT4NCjxsaT48Yj5tYXhsaW1pdDwvYj48YnIgLz4wIChvciBvbWl0dGVkKT1lc3NlbnRpYWxseSB1bmxpbWl0ZWQ7IG9yIHRoZSBhYnNvbHV0ZSBtYXhpbXVtIG51bWJlciBvZiBpbWFnZXMgdG8gcHVsbCBmcm9tIHRoZSBkYXRhYmFzZTwvbGk+DQo8bGk+PGI+b3JkZXJieTwvYj48YnIgLz5jb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3YXlzIHRvIG9yZGVyIHRoZSByZXN1bHRzLiBDaG9vc2UgZnJvbTogY2F0ZWdvcnkgKHRoZSBkZWZhdWx0KSwgbmFtZSwgaWQsIGRhdGUsIGFsdCwgY2FwdGlvbiwgYXV0aG9yLCBleHQsIHdpZHRoLCBoZWlnaHQgb3IgcmFuZG9tLiBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzb3J0IG9yZGVyIGJ5IGFkZGluZyA6YXNjIG9yIDpkZXNjIHRvIGFueSB2YWx1ZSAoZS5nIGNhdGVnb3J5LCBkYXRlOmRlc2Mgd291bGQgc29ydCBieSBjYXRlZ29yeSBmaXJzdCwgdGhlbiBkZXNjZW5kaW5nIGRhdGUpLiBBIHNwZWNpYWwsIG92ZXJyaWRpbmcsIG9wdGlvbiAnZml4ZWQnIGFsbG93cyB0aHVtYnMgdG8gYmUgb3V0cHV0IGluIHRoZSBvcmRlciBnaXZlbiBpbiB0aGUgaW1hZ2VpZCB0YWcuDQo8YnIgLz5Ob3RlIHRoYXQgcmFuZG9tIGFjdHMgc2xpZ2h0bHkgZGlmZmVyZW50bHkuIElmIGl0IGFwcGVhcnMgYXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QsIHJhbmRvbSBpbWFnZXMgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgZGF0YWJhc2UgYW5kIHRoZXkgd2lsbCB0aGVuIGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGFmdGVyIGl0LiBJZiBpdCBhcHBlYXJzIGFueXdoZXJlIGVsc2UgaW4gdGhlIGxpc3QsIGFueSBzb3J0IGl0ZW1zIGJlZm9yZSBpdCB3aWxsIGRldGVybWluZSB0aGUgb3JkZXIgb2YgZGF0YSBwdWxsZWQgZnJvbSB0aGUgZGF0YWJhc2UsIGFuZCB0aGUgcmVzdWx0cyB3aWxsIHRoZW4gYmUgb3JkZXJlZCByYW5kb21seSAoaW4gdGhhdCBjYXNlLCBhbnkgaXRlbXMgIGxpc3RlZCBhZnRlciAncmFuZG9tJyB3aWxsIGJlIGlnbm9yZWQuICdmaXhlZCcgaXMgc3RpbGwgaG9ub3VyZWQsIGhvd2V2ZXIpLiBTZWUgdGhlIGV4YW1wbGVzIGZvciBtb3JlIG9uIHRoaXMgZmVhdHVyZS48L2xpPg0KPGxpPjxiPmdyb3VwbmFtZTwvYj48YnIgLz50aGUgbmFtZSB0byBhcHBlbmQgdG8gdGhlIFtyZWxdIGFyZ3VtZW50IGluIG9yZGVyIHRvIGxvZ2ljYWxseSBncm91cCBpbWFnZXMuICI/YyIgdXNlcyB0aGUgaW1hZ2UgY2F0ZWdvcnksIG9yIHRyeSAiP2ZpZWxkbmFtZSIgdG8gcHVsbCB0aGUgZ3JvdXBuYW1lIGZyb20gdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBjdXJyZW50IGFydGljbGUuIFNlZSB0aGUgPGEgaHJlZj0iI0V4YW1wbGVzIj5leGFtcGxlczwvYT4gYW5kIHRoZSBTbGltYm94IGRvY3VtZW50YXRpb24gZm9yIG1vcmUgb24gdGhpcyBmZWF0dXJlLiBEZWZhdWx0OiAic21kIjwvbGk+DQo8bGk+PGI+c2hvd2NhcHRpb248L2I+PGJyIC8+MT15ZXM7IDA9bm87IHRvIGRpc3BsYXkgdGhlIGltYWdlJ3MgY2FwdGlvbiB3aXRoIHRoZSBpbWFnZS4gT2ZmIGJ5IGRlZmF1bHQ8L2xpPg0KPGxpPjxiPnNob3dhbHQ8L2I+PGJyIC8+MT15ZXM7IDA9bm87IHRvIGRpc3BsYXkgdGhlIGltYWdlJ3MgYWx0IHRhZyB3aXRoIHRoZSBpbWFnZS4gT2ZmIGJ5IGRlZmF1bHQ8L2xpPg0KPGxpPjxiPnRleHRwb3M8L2I+PGJyIC8+cG9zaXRpb24gb2YgdGhlIGFsdC9jYXB0aW9uIGluZm9ybWF0aW9uLiBDaG9vc2UgZnJvbSBvbmUgb2Y6DQo8dWw+DQo8bGk+YWJvdmU6IGFib3ZlIHRoZSB0aHVtYm5haWwsIG5vdCBjbGlja2FibGU8L2xpPg0KPGxpPmJlbG93OiBiZWxvdyB0aGUgdGh1bWJuYWlsLCBub3QgY2xpY2thYmxlIChkZWZhdWx0KTwvbGk+DQo8bGk+YmVmb3JlOiBpbW1lZGlhdGVseSBhYm92ZSB0aGUgdGh1bWJuYWlsLCBjbGlja2FibGUgYXMgcGFydCBvZiB0aGUgbGluazwvbGk+DQo8bGk+YWZ0ZXI6IGltbWVkaWF0ZWx5IGJlbG93IHRoZSB0aHVtYm5haWwsIGNsaWNrYWJsZSBhcyBwYXJ0IG9mIHRoZSBsaW5rPC9saT4NCjwvdWw+DQo8L2xpPg0KPGxpPjxiPnNob3dwYWdlbGlua3M8L2I+PGJyIC8+MT15ZXM7IDA9bm87IHRvIGRpc3BsYXkgY2xpY2thYmxlIG5leHQvcHJldmlvdXMgbGlua3MuIE9uIGJ5IGRlZmF1bHQgKGlmIGxpbWl0IGlzIGdyZWF0ZXIgdGhhbiAwKTwvbGk+DQo8bGk+PGI+cHJldmxhYmVsPC9iPjxiciAvPkxhYmVsIGZvciB0aGUgJ3ByZXZpb3VzIHBhZ2UnIG9mIHBpY3R1cmVzIHdoZW4gdXNpbmcgc2hvd3BhZ2VsaW5rcy4gRGVmYXVsdDogIlByZXYiPC9saT4NCjxsaT48Yj5uZXh0bGFiZWw8L2I+PGJyIC8+TGFiZWwgZm9yIHRoZSAnbmV4dCBwYWdlJyBvZiBwaWN0dXJlcyB3aGVuIHVzaW5nIHNob3dwYWdlbGlua3MuIERlZmF1bHQ6ICJOZXh0IjwvbGk+DQo8bGk+PGI+d3JhcHRhZzwvYj48YnIgLz5UYWcgdG8gd3JhcCBlYWNoICdjZWxsJyB3aXRoLiBEbyBub3Qgc3BlY2lmeSB0aGUgJmx0OyBvciAmZ3Q7IGNoYXJhY3RlcnMuIEZvciBhIHZhbGlkIHBhZ2UsIHRoZSBvbmx5IHVzZWZ1bCBvcHRpb25zIGFyZSAiZGl2IiwgImxpIiBvciAicCIuIERlZmF1bHQ6IGVtcHR5IChpLmUuIG5vIHRhZyk8L2xpPg0KPGxpPjxiPmNlbGxjbGFzczwvYj48YnIgLz5DU1MgY2xhc3MgZm9yIGVhY2ggJ2NlbGwnIHRoYXQgZGlzcGxheXMgYSB0aHVtYm5haWwuIERlZmF1bHQ6IGVtcHR5IChpLmUuIG5vIGNsYXNzKTwvbGk+DQo8bGk+PGI+Y2FwdGlvbmNsYXNzPC9iPjxiciAvPkNTUyBjbGFzcyBmb3IgdGhlIGNhcHRpb24gdGV4dC4gRGVmYXVsdDogZW1wdHkgKGkuZS4gbm8gY2xhc3MpPC9saT4NCjxsaT48Yj5hbHRjbGFzczwvYj48YnIgLz5DU1MgY2xhc3MgZm9yIHRoZSBhbHQgdGV4dC4gRGVmYXVsdDogZW1wdHkgKGkuZS4gbm8gY2xhc3MpPC9saT4NCjxsaT48Yj5uYXZjbGFzczwvYj48YnIgLz5DU1MgY2xhc3MgZm9yIHRoZSBuZXh0L3ByZXYgY29udGFpbmVyLiBEZWZhdWx0OiBlbXB0eSAoaS5lLiBubyBjbGFzcyk8L2xpPg0KPGxpPjxiPnByZXZjbGFzczwvYj48YnIgLz5DU1MgY2xhc3MgZm9yIHRoZSAncHJldicgbGluay4gRGVmYXVsdDogc21kX3NsaW1ib3hfcHJldjwvbGk+DQo8bGk+PGI+bmV4dGNsYXNzPC9iPjxiciAvPkNTUyBjbGFzcyBmb3IgdGhlICduZXh0JyBsaW5rLiBEZWZhdWx0OiBzbWRfc2xpbWJveF9uZXh0PC9saT4NCjxsaT48Yj5saWJjaGVjazwvYj48YnIgLz5zZXQgdGhpcyB0byAwIHRvIGJ5cGFzcyB0aGUgbGlicmFyeSBjaGVjay4gVXNlZnVsIGlmIHlvdSB3YW50IHRoZSB0aHVtYnMgdG8gYmUgaW5jbHVkZWQgaW4gYW4gUlNTIGZlZWQgd2l0aG91dCB0aGUgcGx1Z2luIGNvbXBsYWluaW5nIHRoZSBsaWJyYXJpZXMgYXJlIG1pc3NpbmcuIERlZmF1bHQ6IDEgKG9uKTwvbGk+DQo8L3VsPg0KPC9wPg0KDQo8aDI+PGEgbmFtZT0iRXhhbXBsZXMiPjwvYT5FeGFtcGxlczwvaDI+DQoNCjxjb2RlPiZsdDt0eHA6c21kX3NsaW1ib3ggY2F0ZWdvcnk9ImxhbmRzY2FwZSIgbGltaXQ9IjEwIiAvJmd0OzwvY29kZT4NCjxwPlNob3cgYWxsIGltYWdlcyBpbiB0aGUgbGFuZHNjYXBlIGNhdGVnb3J5LCB0ZW4gYXQgYSB0aW1lLjwvcD4NCg0KPGNvZGU+Jmx0O3R4cDpzbWRfc2xpbWJveCBjYXRlZ29yeT0iZG9ncywgYmlyZHMiIGxpbWl0PSI5IiBzaG93Y2FwdGlvbnM9IjEiIHRleHRwb3M9ImFmdGVyIiB3cmFwdGFnPSJsaSIgY2VsbGNsYXNzPSJjZWxsIiAvJmd0OzwvY29kZT4NCjxwPlNob3cgYWxsIGltYWdlcyBpbiB0aGUgZG9ncyBhbmQgYmlyZHMgY2F0ZWdvcmllcywgOSBwZXIgcGFnZS4gQWRkIHRoZSBjYXB0aW9ucyB1bmRlciB0aGUgdGh1bWJuYWlscyBhbmQgbWFrZSB0aGVtIGNsaWNrYWJsZSB0b28uIFdyYXAgZWFjaCBpbWFnZSBpbiBhIDxjb2RlPmxpPC9jb2RlPiB0YWcgYW5kIGdpdmUgZWFjaCBhIGNsYXNzIG9mICdjZWxsJyAoaW1wbGllcyB5b3UgbXVzdCBtYW51YWxseSBhZGQgYSBjb3JyZXNwb25kaW5nIDxjb2RlPiZsdDt1bCZndDs8L2NvZGU+IHRhZyBhcm91bmQgdGhlIHBsdWdpbiBpbiBvcmRlciB0byBtYWludGFpbiBwYWdlIHZhbGlkaXR5KS48L3A+DQoNCjxwPklmIHlvdSBhZGRlZCBvcmRlcmJ5PSJkYXRlOmRlc2MsIHJhbmRvbSIgdG8gdGhlIGFib3ZlIHRhZywgeW91IHdvdWxkIGdldCB0aGUgbW9zdCByZWNlbnQgOSBpbWFnZXMgb24gdGhlIGZpcnN0IHBhZ2UsIGJ1dCBzaG93biBpbiBhIHJhbmRvbSBvcmRlci4gVGhlIG5leHQgcGFnZSB3b3VsZCBzaG93IHRoZSBuZXh0IG1vc3QtcmVjZW50IDkgaW1hZ2VzLCBhZ2FpbiBzb3J0ZWQgcmFuZG9tbHkgd2l0aGluIHRoZW1zZWx2ZXMuPC9wPg0KDQo8cD5Td2l0Y2hpbmcgdGhlIHNvcnQgdG86IG9yZGVyYnk9InJhbmRvbSwgZGF0ZTpkZXNjIiB3b3VsZCBjaGFuZ2UgdGhlIG91dHB1dC4gWW91IHdvdWxkIHRoZW4gZ2V0IDkgcmFuZG9tIGltYWdlcyBvbiB0aGUgZmlyc3QgcGFnZSwgd2l0aCB0aGUgbW9zdCByZWNlbnQgb25lcyBvZiB0aGUgZ3JvdXAgc2hvd24gZmlyc3QuIENsaWNraW5nICdOZXh0JyB3b3VsZCBzaG93IGFub3RoZXIgOSByYW5kb20gaW1hZ2VzIChzb21lIG1heSBiZSB0aGUgc2FtZSBhcyBwYWdlIDEpIHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGRhdGUuIEZvciB0aGlzIHJlYXNvbiAodW5sZXNzIHlvdSdyZSBzaW1wbHkgdXNpbmcgdGhlIHBsdWdpbiB0byBwcmV0dHkgdXAgYSBwYWdlIHdpdGggcmFuZG9tIGltYWdlcykgaWYgeW91J3JlIHVzaW5nIHJhbmRvbSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gb3JkZXJieSwgeW91IHByb2JhYmx5IHdhbnQgdG8gZGlzYWJsZSBwYWdpbmcgYnkgc2V0dGluZyBzaG93cGFnZWxpbmtzPSIwIi48L3A+DQoNCjxjb2RlPiZsdDt0eHA6c21kX3NsaW1ib3ggaW1hZ2VpZD0iNDgsIDI1LCA0IiBjYXRlZ29yeT0iZG9ncywgP2N1c3RvbTEiIHN1YmNhdHM9IjEiIGxpbWl0PSIyMCIgcHJldmxhYmVsPSJCYWNrIiBvcmRlcmJ5PSJuYW1lOmRlc2MsIGNhdGVnb3J5IiAvJmd0OzwvY29kZT4NCjxwPlNob3cgaW1hZ2VzIHdpdGggSURzIDQ4LCAyNSBhbmQgNCBhcyB3ZWxsIGFzIGFsbCBpbWFnZXMgaW4gdGhlIGRvZ3MgY2F0ZWdvcnkgYW5kIGFsc28gcHVsbCB0aGUgaW1hZ2UgY2F0ZWdvcnkgbmFtZXMgZnJvbSB0aGUgY3VycmVudCBhcnRpY2xlJ3MgY3VzdG9tMSBmaWVsZCAoaWYgY3VzdG9tMSBoZWxkICJiaXJkcywgbGFuZHNjYXBlcyIgKHdpdGhvdXQgdGhlIHF1b3RlcykgeW91J2QgZ2V0IHBpY3R1cmVzIGZyb20gYWxsIHRocmVlIGNhdGVnb3JpZXMgYW5kIGFsbCB0aGVpciBzdWJjYXRlZ29yaWVzKS4gTGltaXQgdGhlIG51bWJlciBwZXIgcGFnZSB0byAyMCwgY2hhbmdlIHRoZSBwcmV2aW91cyBwYWdlIGxhYmVsIHRvICJCYWNrIiBhbmQgc29ydCB0aGUgaW1hZ2VzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgbmFtZSwgdGhlbiBjYXRlZ29yeS48L3A+DQoNCjxjb2RlPiZsdDt0eHA6c21kX3NsaW1ib3ggY2F0ZWdvcnk9InN0YXRpYywgP2lkIiBpbWFnZWlkPSIhYXJ0aWNsZV9pbWFnZSIgbGltaXQ9IjYiIGdyb3VwbmFtZT0iP2MiIHNob3dwYWdlbGlua3M9IjAiIC8mZ3Q7PC9jb2RlPg0KPHA+SWYgdGhlIHBlcnNvbiBpcyBjdXJyZW50bHkgdmlld2luZyBhcnRpY2xlIElEIDY3LCBzaG93IGFsbCBpbWFnZXMgZnJvbSB0aGUgJ3N0YXRpYycgY2F0ZWdvcnkgYW5kIHRoZSAnYXJ0aWNsZS02NycgY2F0ZWdvcnkuIElmIGFueSBpbWFnZSBpbiBlaXRoZXIgb2YgdGhvc2UgY2F0ZWdvcmllcyBpcyBmb3VuZCB0byBoYXZlIGFuIElEIG9mIHRoZSBhcnRpY2xlIGltYWdlIGZyb20gdGhlIGN1cnJlbnQgYXJ0aWNsZSwgdGhhdCBwaWN0dXJlIHdpbGwgYmUgaWdub3JlZC4gT25seSBzaG93IDYgcGljdHVyZXMgYW5kIGRvbid0IHNob3cgdGhlIG5leHQvcHJldiBsaW5rcyBvbiB0aGUgcGFnZS4gQWxzbywgZ3JvdXAgdGhlIFNsaW1ib3ggcGljdHVyZXMgYnkgaW1hZ2UgY2F0ZWdvcnkuIFRoaXMgbWVhbnMgdGhhdCBpZiBzb21lb25lIGNsaWNrcyBvbiBhIHBpY3R1cmUgZnJvbSB0aGUgInN0YXRpYyIgY2F0ZWdvcnksIHRoZSBTbGltYm94IG5leHQvcHJldiBsaW5rcyBvbmx5IG5hdmlnYXRlIGJldHdlZW4gdGhvc2UgcGljdHVyZXMuIFRoZSB1c2VyIHdpbGwgaGF2ZSB0byBjbG9zZSB0aGUgbGlnaHRib3ggYW5kIGNsaWNrIGEgcGljdHVyZSBpbiB0aGUgYXJ0aWNsZS02NyBjYXRlZ29yeSB0byBzaG93IHBpY3R1cmVzIGZyb20gdGhlIG90aGVyIGdyb3VwLjwvcD4NCjxwPk9uIHRoZSBzdXJmYWNlIHRoZSBncm91cG5hbWUgb3B0aW9uIG1heSBzZWVtIGEgbGl0dGxlIHN1cGVyZmx1b3VzIGJ1dCBpdCBjYW4gYmUgdXNlZnVsIHRvIGFsbG93IHBlb3BsZSB0byBvbmx5IGZsaWNrIHRocm91Z2ggYSBzdWJzZXQgb2YgdGhlIHBpY3R1cmVzIG9uIGVhY2ggcGFnZSwgYmFzZWQgb24gdGhlaXIgY2F0ZWdvcnkgKG9yIGEgZml4ZWQgdmFsdWUgcmVhZCBmcm9tIGEgZmllbGQgaW4gdGhlIGN1cnJlbnQgYXJ0aWNsZSwgZS5nLiBncm91cG5hbWU9Ij9jdXN0b20yIikuIEl0IGNvbWVzIGludG8gaXRzIG93biB3aGVuIHlvdSB1c2UgQ1NTMiB0byBzdHlsZSBncm91cHMgb2YgaW1hZ2VzIGJhc2VkIG9uIHRoZWlyIFtyZWxdIGF0dHJpYnV0ZSBiZWNhdXNlIHlvdSBjYW4gc3ViLWRpdmlkZSB5b3VyIHBpY3R1cmVzIGZ1cnRoZXIgdGhhbiB5b3Ugd291bGQgbm9ybWFsbHkgYmUgYWJsZS48L3A+DQoNCjxjb2RlPiZsdDt0eHA6c21kX3NsaW1ib3ggY2F0ZWdvcnk9Ij9jLCA/Y3VzdG9tMSwgIWN1c3RvbTIsICFzdGF0aWMiIGxpbWl0PSI4IiBtYXhsaW1pdD0iMzIiIC8mZ3Q7PC9jb2RlPg0KPHA+QSBiaXQgb2YgYSBjb250cml2ZWQgZXhhbXBsZSB0aGF0IHNob3dzIGhvdyBjcmF6eSB5b3UgY2FuIGdldDogVGhpcyB3aWxsIHNob3cgYSBtYXhpbXVtIG9mIDMyIGltYWdlcyBmcm9tIGFuIGltYWdlIGNhdGVnb3J5IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgY3VycmVudCBnbG9iYWwgY2F0ZWdvcnksIHBsdXMgYWxsIGltYWdlcyBmcm9tIGNhdGVnb3JpZXMgbGlzdGVkIGluIHRoZSBjdXN0b20xIGZpZWxkIG9mIHRoZSBjdXJyZW50IGFydGljbGUgYnV0IDxlbT5leGNsdWRlPC9lbT4gaW1hZ2VzIGZyb20gY2F0ZWdvcmllcyBsaXN0ZWQgaW4gY3VzdG9tMiBhbmQgYWxzbyBleGNsdWRlIHRoZSAnc3RhdGljJyBjYXRlZ29yeS4gU2hvdyA4IGltYWdlIHRodW1ibmFpbHMgYXQgYSB0aW1lLjwvcD4NCg0KPGgyPjxhIG5hbWU9IlN0eWxpbmciPjwvYT5TdHlsaW5nIHdpdGggQ1NTPC9oMj4NCg0KPHA+VGhlcmUgYXJlIChkZWxpYmVyYXRlbHkpIHZlcnkgZmV3IGxheW91dCBhdHRyaWJ1dGVzIGZvciB0aGUgcGx1Z2luIGJlY2F1c2UgcHJldHR5IG11Y2ggZXZlcnl0aGluZyBjYW4gYmUgYWNjZXNzZWQgZnJvbSBDU1MgdG8gbGF5IHlvdXIgaW1hZ2VzIG91dCBob3dldmVyIHlvdSBsaWtlIHRoZW0uIFdhbnQgdG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgaW1hZ2VzIHBlciByb3c/IENoYW5nZSB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5pbmcgJmx0O2RpdiZndDsgYW5kIHNldCB0aGUgd2lkdGggb2YgZWFjaCB0aHVtYm5haWwgc3BhY2UgdG8gYSBwYXJ0aWN1bGFyIHNpemUuPC9wPg0KDQo8cD5UaGUgZm9sbG93aW5nIGxvZ2ljYWwgc3RydWN0dXJlIGFwcGxpZXM6PC9wPg0KDQo8dWw+DQo8bGk+QW4gb3B0aW9uYWwgd3JhcHRhZyBhbmQgY2xhc3MgbmFtZSBhcm91bmQgZWFjaCAiY2VsbCIgKGkuZS4gdGh1bWJuYWlsKTwvbGk+DQo8bGk+QSBsaW5rIGVsZW1lbnQgY29udGFpbmluZyB0aGUgdGh1bWJuYWlsJ3MgPGNvZGU+Jmx0O2ltZyZndDs8L2NvZGU+IHRhZzwvbGk+DQo8bGk+VGhlIGNhcHRpb24vYWx0IGlzIGEgJmx0O3NwYW4mZ3Q7IHdpdGggYW4gb3B0aW9uYWwgY2xhc3MgYW5kIGNhbiBhcHBlYXIgYWJvdmUsIGJlbG93IG9yIHdpdGhpbiB0aGUgbGluayBlbGVtZW50PC9saT4NCjxsaT5UaGUgbmV4dC9wcmV2IGxpbmtzIGFyZSB3cmFwcGVkIGluIHRoZSBvcHRpb25hbCB3cmFwdGFnIGNvbnRhaW5lciBhbmQgY2FuIGJlIGdpdmVuIGFuIG9wdGlvbmFsIGNsYXNzIG5hbWU8L2xpPg0KPGxpPlRoZSBuZXh0IGxpbmsgaGFzIGEgKGRlZmF1bHQpIGNsYXNzIG9mICJzbWRfc2xpbWJveF9uZXh0IiBhbmQgcHJldiBoYXMgInNtZF9zbGltYm94X3ByZXYiLiBUaGVzZSBjYW4gYmUgY2hhbmdlZCBvciByZW1vdmVkIGlmIHlvdSB3aXNoLjwvbGk+DQo8L3VsPg0KDQo8cD5Vc2luZyBDU1Mgc2VsZWN0b3JzIHlvdSBjYW4gYWNjZXNzIGV2ZXJ5IHBhcnQgb2YgdGhlIHN0cnVjdHVyZS4gQW4gZXhhbXBsZSBDU1MgbGF5b3V0IGlzIGdpdmVuIGhlcmUgdG8gZ2V0IHlvdSBzdGFydGVkIChhc3N1bWVzIGEgd3JhcHRhZyBvZiAnbGknLCBhIGNvbnRhaW5pbmcgJ3VsJyBhcm91bmQgdGhlIHBsdWdpbiB0YWcgd2l0aCBhIGNsYXNzIG9mIDxjb2RlPnNtZF9zbGltYm94PC9jb2RlPiBhbmQgPGNvZGU+bmF2Y2xhc3M9InNtZF9zbGltYm94X25hdiI8L2NvZGU+KS4gUGFzdGUgaXQgaW50byB5b3VyIENTUyB0ZW1wbGF0ZSBhbmQgeW91J3JlIGdvb2QgdG8gZ28uPC9wPg0KDQo8cHJlPg0KLnNtZF9zbGltYm94IHsNCglmbG9hdDpsZWZ0Ow0KCXdpZHRoOjYwMHB4Ow0KCW1hcmdpbjoxZW0gMDsNCgljbGVhcjpib3RoOw0KCWxpc3Qtc3R5bGU6bm9uZTsNCn0NCi5zbWRfc2xpbWJveCBsaSB7DQoJd2lkdGg6MTUwcHg7DQoJaGVpZ2h0OjE1MHB4Ow0KCWZsb2F0OmxlZnQ7DQoJbWFyZ2luOjFlbSBhdXRvOw0KCXRleHQtYWxpZ246Y2VudGVyOw0KfQ0KLnNtZF9zbGltYm94IGltZyB7DQoJbWFyZ2luOjAgYXV0bzsNCn0NCi5zbWRfc2xpbWJveCBzcGFuIHsNCglmbG9hdDpsZWZ0Ow0KCXdpZHRoOjE0MHB4Ow0KCXBhZGRpbmc6MnB4IDAgMCA1cHg7DQp9DQpsaS5zbWRfc2xpbWJveF9uYXYgew0KCWNsZWFyOmJvdGg7DQoJd2lkdGg6NTAwcHg7DQoJcGFkZGluZzoyMHB4Ow0KfQ0KLnNtZF9zbGltYm94X3ByZXYgew0KCWZsb2F0OmxlZnQ7DQp9DQouc21kX3NsaW1ib3hfbmV4dCB7DQoJZmxvYXQ6cmlnaHQ7DQp9DQo8L3ByZT4iO3M6NDoiY29kZSI7czoxNjYzNjoiLy8gdjAuMSAgIEluaXRpYWwgcHVibGljIHJlbGVhc2UNCi8vIHYwLjExIEFkZGVkICFjYXRlZ29yeSBzdXBwb3J0DQovLyB2MC4xMiBBZGRlZCB0ZXh0cG9zIG9wdGlvbiAodGhhbmtzIGxlZSkgYW5kIGltYWdlaWQgb3B0aW9uICh0aGFua3Mgd291YXJlbikNCi8vIHYwLjIgICBqcyBhbmQgY3NzIGNhbiBub3cgYmUgbG9hZGVkIGVsc2V3aGVyZSAodGhhbmtzIGpzdHViYnMpLiBBZGRlZCB3cmFwdGFnIGFuZCBjaGFuZ2VkIGRlZmF1bHRzIHRvIG1ha2Ugb3V0cHV0IGxlc3MgbGlrZSB0YWctc291cCAodGhhbmtzIHdvdWFyZW4pDQovLyB2MC4yMSBBZGRlZCBvcmRlcmJ5PSJmaXhlZCIgdG8gYWxsb3dlZCBmaXhlZCBpbWFnZWlkIG9yZGVyaW5nICh0aGFua3MgbGVlKS4gJHdoZXJlIHdhcm5pbmcgc3F1YXNoZWQgKHRoYW5rcyBiZW5qaWJvdCkNCi8vIHYwLjIyIE5vdyB1c2VzIHNtZF9saWIgYW5kIHN1YmNhdHMuIEFsc28gTUxQKE11bHRpLWxpbmd1YWwpLWF3YXJlLg0KLy8gdjAuMjMgRml4ZWQgb3JkZXJieSB3aGVuIHVzaW5nIHJhbmRvbSAodGhhbmtzIG1yZGFsZSkgYW5kIGFkZGVkIGFiaWxpdHkgdG8gb3ZlcnJpZGUgbWF4bGltaXQNCi8vIHYwLjI0IEFkZGVkIGxpYmNoZWNrICh0aGFua3MgcGFwdWFzcykuIE51bWVyaWMgcmFuZ2VzIG5vdyBhbGxvd2VkIGZvciBJRHMgKHNtZF9saWIpLiBGaXhlZCBlbXB0eSBmaWVsZC9pbWFnZWlkIG5lZ2F0aW9uIGJ1Z3MuIEZpeGVkIG5leHQvcHJldiBidXR0b25zIGZvciBNTFAuDQovLyB2MC4yNGIgRml4ZWQgcGFnaW5nIGluIHN1YmRpcmVjdG9yeSBpbnN0YWxsYXRpb25zICh0aGFua3MgdWx0cmFtZWdhIGFuZCBRd2VzdCkNCi8vIHYwLjI1IEV4dGVuZGVkIGdyb3VwbmFtZSAodGhhbmtzIFtBeGVsXSkNCi8vIHYwLjI1YSBVc2VzIHRoZSBnZW5lcmljIE1MUCB2ZXJzaW9uIG9mIHNtZF9saWIuDQoNCnJlcXVpcmVfcGx1Z2luKCdzbWRfbGliJyk7DQpnbG9iYWwgJHNtZF9zYm94TGFuZzsNCmdsb2JhbCAkc21kX3Nib3hfbGliczsNCg0KJHNtZF9zYm94X3N0ciA9IGFycmF5KA0KCSdpbmNlcnInID0+ICdJZiB1c2luZyB0aGUgc2NyaXB0cyBvcHRpb24sIHNwZWNpZnkgdXAgdG8gdGhyZWUgcmVxdWlyZWQgc2NyaXB0cyBpbiB0aGlzIG9yZGVyOiAmbHQ7dHhwOnNtZF9zbGltYm94X2luYyBzY3JpcHRzPSJtb290b29sc0pTTG9jYXRpb24sIHNsaW1ib3hKU0xvY2F0aW9uLCBzbGltYm94Q1NTTG9jYXRpb24iIC8mZ3Q7LiBJZiBhbnkgcG9zaXRpb25zIGFyZSBsZWZ0IGVtcHR5LCB0aGUgbWlzc2luZyBzY3JpcHRzIG11c3QgYmUgc3VwcGxpZWQgdmlhIHRoZSBqc2Rpci9jc3NkaXIgb3B0aW9ucywgb3IgbG9hZGVkIGV4dGVybmFsbHkgYW5kIHRvbGQgdG8gc2tpcCB0aGlzIHN0ZXAuIFRoZSB0aHJlZSB2YWx1ZXMgY2FuIGVpdGhlciBiZSBhIGZ1bGwgWEhUTUwgc3RyaW5nIChlLmcuIGFzIHJldHVybmVkIGJ5IHR4cDpzdG1famF2YXNjcmlwdCBvciB0eHA6Y3NzLCBhbHRob3VnaCB0aGV5IG1heSBub3Qgd29yayBkaXJlY3RseSB3aXRoaW4gdGhlIHRhZzsgc2VlIHRoZSBkb2NzKSBvciBzaW1wbHkgcGF0aHMgdG8gdGhlIGZpbGVzLiBOb3RlIHRoYXQgbm8gdmFsaWRhdGlvbiBpcyBwZXJmb3JtZWQgdG8gY2hlY2sgaWYgdGhlIGZpbGVzIGV4aXN0LicsDQoJJ25vaW5jJyA9PiAnUmVxdWlyZWQgbGlicmFyaWVzIG5vdCBsb2FkZWQuIENhbGwgJmx0O3R4cDpzbWRfc2xpbWJveF9pbmMgLyZndDsgaW4gdGhlICZsdDtoZWFkJmd0OyBvZiB0aGlzIHBhZ2UuJywNCgknbmV4dF9sYmwnID0+ICdOZXh0JywNCgkncHJldl9sYmwnID0+ICdQcmV2JywNCik7DQoNCiRzbWRfc2JveExhbmcgPSBuZXcgc21kX01MUCgnc21kX3NsaW1ib3gnLCAnc21kX3Nib3gnLCAkc21kX3Nib3hfc3RyKTsNCg0KLy8gVXNlIHRoaXMgdG8gaW5jbHVkZSB0aGUgbGlicmFyaWVzIGluIHRoZSA8aGVhZD4gc2VjdGlvbiBvZiB0aGUgcGFnZQ0KZnVuY3Rpb24gc21kX3NsaW1ib3hfaW5jKCRhdHRzKSB7DQoJZ2xvYmFsICRzbWRfc2JveF9saWJzOw0KCWdsb2JhbCAkc21kX3Nib3hMYW5nOw0KDQoJaWYgKGlzX2FycmF5KCRhdHRzKSkgZXh0cmFjdCgkYXR0cyk7DQoNCgkvLyBGdW5jdGlvbiBvcHRpb25zDQoJJGpzZGlyID0gaXNzZXQoJGpzZGlyKSA/IGRvU2xhc2goJGpzZGlyKSA6ICcnOw0KCSRjc3NkaXIgPSBpc3NldCgkY3NzZGlyKSA/IGRvU2xhc2goJGNzc2RpcikgOiAnJzsNCgkkc2NyaXB0cyA9IGlzc2V0KCRzY3JpcHRzKSA/ICRzY3JpcHRzIDogJyc7DQoJJHNraXAgPSBpc3NldCgkc2tpcCkgPyAkc2tpcCA6ICIwIjsNCg0KCSRtb2RzUmVxdWlyZWQgPSAzOw0KCSRtb2RzTG9hZGVkID0gMDsNCgkkb3V0U3RyID0gJyc7DQoNCglpZiAoJHNraXAgPiAwKSB7DQoJCSRtb2RzTG9hZGVkID0gJHNraXA7DQoJfQ0KDQoJLy8gSW5jbHVkZSB0aGUganMgbGlicyBpZiByZXF1aXJlZA0KCWlmICgkanNkaXIgIT0gJycpIHsNCgkJJG91dFN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyAuJGpzZGlyLiAnL21vb3Rvb2xzLmpzIj48L3NjcmlwdD4nLm47DQoJCSRvdXRTdHIgLj0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicgLiRqc2Rpci4gJy9zbGltYm94LmpzIj48L3NjcmlwdD4nLm47DQoJCSRtb2RzTG9hZGVkICs9IDI7DQoJfQ0KDQoJLy8gRmluZCB3aGljaCBzY3JpcHRzIHRvIGF1dG8tbG9hZA0KCWlmICgoJHNjcmlwdHMgIT0gJycpICYmICgkbW9kc0xvYWRlZCA8ICRtb2RzUmVxdWlyZWQpKSB7DQoJCSRtb2RzTGlzdCA9IHByZWdfc3BsaXQoJy9bLF0rLycsJHNjcmlwdHMsJG1vZHNSZXF1aXJlZCk7DQoJCSRqc3ByZWZpeCA9ICI8c2NyaXB0IjsNCgkJJGNzc3ByZWZpeCA9ICI8bGluayI7DQoJCSR0eHBwcmVmaXggPSAiPHR4cCI7DQoJCWZvcmVhY2ggKCRtb2RzTGlzdCBhcyAkZmlsZW9iaikgew0KCQkJJGZpbGVvYmogPSB0cmltKCRmaWxlb2JqKTsNCgkJCWlmICgkZmlsZW9iaiA9PSAnJykgew0KCQkJCSRtb2RzTG9hZGVkLS07DQoJCQl9IGVsc2UgaWYgKHN1YnN0cigkZmlsZW9iaiwgMCwgc3RybGVuKCRqc3ByZWZpeCkpID09PSAkanNwcmVmaXgpIHsNCgkJCQkkb3V0U3RyIC49ICRmaWxlb2JqLm47DQoJCQl9IGVsc2UgaWYgKHN1YnN0cigkZmlsZW9iaiwgMCwgc3RybGVuKCRjc3NwcmVmaXgpKSA9PT0gJGNzc3ByZWZpeCkgew0KCQkJCSRvdXRTdHIgLj0gJGZpbGVvYmoubjsNCgkJCX0gZWxzZSBpZiAoc3Vic3RyKCRmaWxlb2JqLCAwLCBzdHJsZW4oJHR4cHByZWZpeCkpID09PSAkdHhwcHJlZml4KSB7DQoJCQkJJG91dFN0ciAuPSBwYXJzZSgkZmlsZW9iaik7DQoJCQl9IGVsc2Ugew0KCQkJCWlmICgkbW9kc0xvYWRlZCA8IDIpIHsNCgkJCQkJJG91dFN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyAuJGZpbGVvYmouICciPjwvc2NyaXB0PicubjsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkb3V0U3RyIC49ICc8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9IicgLiRmaWxlb2JqLiAnIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4nLm47DQoJCQkJfQ0KCQkJfQ0KCQkJJG1vZHNMb2FkZWQrKzsNCgkJfQ0KCX0NCg0KCS8vIEluY2x1ZGUgdGhlIGNzcyBmaWxlIGlmIHJlcXVpcmVkDQoJaWYgKCRjc3NkaXIgIT0gJycpIHsNCgkJJG91dFN0ciAuPSAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSInIC4kY3NzZGlyLiAnL3NsaW1ib3guY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4nLm47DQoJCSRtb2RzTG9hZGVkKys7DQoJfQ0KDQoJLy8gU2V0IHRoZSBmbGFnIHRvIHNheSB0aGUgbGlicyBhcmUgb2suIFNoYW1lIHRoZXJlJ3Mgbm8gZWFzeSBwcm92aXNpb24gZm9yDQoJLy8gY2hlY2tpbmcgdGhlIGZpbGVzIGFjdHVhbGx5IGV4aXN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbnMsIGJ1dCBoZXkNCglpZiAoJG1vZHNMb2FkZWQgPT0gJG1vZHNSZXF1aXJlZCkgew0KCQkkc21kX3Nib3hfbGlicyA9IHRydWU7DQoJfSBlbHNlIHsNCgkJJHNtZF9zYm94X2xpYnMgPSBmYWxzZTsNCgkJJG91dFN0ciA9ICRzbWRfc2JveExhbmctPmdUeHQoJ2luY2VycicpLm47DQoJfQ0KDQoJcmV0dXJuICRvdXRTdHI7DQp9DQoNCmZ1bmN0aW9uIHNtZF9zbGltYm94KCRhdHRzKSB7DQoJZ2xvYmFsICRwcmV0ZXh0LCAkdGhpc2FydGljbGUsICRpbWdfZGlyOw0KCWdsb2JhbCAkc21kX3Nib3hfbGlicywgJHNtZF9zYm94TGFuZzsNCg0KCWlmIChpc19hcnJheSgkYXR0cykpIGV4dHJhY3QoJGF0dHMpOw0KCSRjYXRpZG9wdHMgPSAoaXNzZXQoJGNhdGVnb3J5KSB8fCBpc3NldCgkaW1hZ2VpZCkpID8gdHJ1ZSA6IGZhbHNlOw0KDQoJLy8gUGx1Z2luIG9wdGlvbnMNCgkkbGliY2hlY2sgPSBpc3NldCgkbGliY2hlY2spID8gJGxpYmNoZWNrOiAiMSI7DQoJJGltYWdlaWQgPSBpc3NldCgkaW1hZ2VpZCkgPyBkb1NsYXNoKCRpbWFnZWlkKSA6ICcnOw0KCSRjYXRlZ29yeSA9IGlzc2V0KCRjYXRlZ29yeSkgPyBkb1NsYXNoKCRjYXRlZ29yeSkgOiAoKCRpbWFnZWlkPT0iIikgPyAkcHJldGV4dFsnYyddOiAnJyk7DQoJJHN1YmNhdHMgPSBpc3NldCgkc3ViY2F0cykgPyB0cnVlIDogZmFsc2U7DQoJJGNhdGxhYmVsID0gaXNzZXQoJGNhdGxhYmVsKSA/ICRjYXRsYWJlbDogImFydGljbGUtIjsNCgkkZ3JvdXBuYW1lID0gaXNzZXQoJGdyb3VwbmFtZSkgPyAkZ3JvdXBuYW1lOiAic21kIjsNCgkkbWF4bGltaXQgPSBpc3NldCgkbWF4bGltaXQpID8gJG1heGxpbWl0OiAiOTk5OTkiOw0KCSRsaW1pdCA9IGlzc2V0KCRsaW1pdCkgPyAkbGltaXQ6ICIwIjsNCgkkb3JkZXJieSA9IGlzc2V0KCRvcmRlcmJ5KSA/ICRvcmRlcmJ5OiAiY2F0ZWdvcnkiOw0KCSRzaG93cGFnZWxpbmtzID0gaXNzZXQoJHNob3dwYWdlbGlua3MpID8gJHNob3dwYWdlbGlua3M6ICIxIjsNCgkkcHJldmxhYmVsPSBpc3NldCgkcHJldmxhYmVsKSA/ICRwcmV2bGFiZWw6ICRzbWRfc2JveExhbmctPmdUeHQoJ3ByZXZfbGJsJyk7DQoJJG5leHRsYWJlbD0gaXNzZXQoJG5leHRsYWJlbCkgPyAkbmV4dGxhYmVsOiAkc21kX3Nib3hMYW5nLT5nVHh0KCduZXh0X2xibCcpOw0KCSRzaG93Y2FwdGlvbiA9IGlzc2V0KCRzaG93Y2FwdGlvbikgPyAkc2hvd2NhcHRpb246ICIwIjsNCgkkc2hvd2FsdCA9IGlzc2V0KCRzaG93YWx0KSA/ICRzaG93YWx0OiAiMCI7DQoJJHRleHRwb3MgPSBpc3NldCgkdGV4dHBvcykgPyAkdGV4dHBvczogImJlbG93IjsNCgkkd3JhcHRhZyA9IGlzc2V0KCR3cmFwdGFnKSA/ICR3cmFwdGFnOiAiIjsNCgkkY2VsbGNsYXNzID0gaXNzZXQoJGNlbGxjbGFzcykgPyAkY2VsbGNsYXNzOiAiIjsNCgkkaW1nY2xhc3MgPSBpc3NldCgkaW1nY2xhc3MpID8gJGltZ2NsYXNzOiAiIjsNCgkkbmF2Y2xhc3MgPSBpc3NldCgkbmF2Y2xhc3MpID8gJG5hdmNsYXNzOiAiIjsNCgkkcHJldmNsYXNzID0gaXNzZXQoJHByZXZjbGFzcykgPyAkcHJldmNsYXNzOiAic21kX3NsaW1ib3hfcHJldiI7DQoJJG5leHRjbGFzcyA9IGlzc2V0KCRuZXh0Y2xhc3MpID8gJG5leHRjbGFzczogInNtZF9zbGltYm94X25leHQiOw0KCSRjYXB0aW9uY2xhc3MgPSBpc3NldCgkY2FwdGlvbmNsYXNzKSA/ICRjYXB0aW9uY2xhc3M6ICIiOw0KCSRhbHRjbGFzcyA9IGlzc2V0KCRhbHRjbGFzcykgPyAkYWx0Y2xhc3M6ICIiOw0KDQoJJGZpeGVkT3JkZXIgPSBmYWxzZTsNCg0KCS8vIE1haW4gY29kZSBib2R5DQoJaWYgKCgkbGliY2hlY2sgPT0gMSkgJiYgKCRzbWRfc2JveF9saWJzID09IGZhbHNlKSkgew0KCQkkb3V0U3RyID0gJHNtZF9zYm94TGFuZy0+Z1R4dCgnbm9pbmMnKTsNCgl9IGVsc2Ugew0KCQkvLyBUaGUgZGF0YWJhc2UgZmllbGRzIHJlcXVpcmVkDQoJCSRmaWVsZHMgPSAnaWQsbmFtZSxjYXB0aW9uLGFsdCxjYXRlZ29yeSxkYXRlLGF1dGhvcixleHQsdyxoJzsNCg0KCQkvLyBDb252ZXJ0IHRoZSBjYXRlZ29yeSAocG9zc2libHkgYSBjb21tYS1zZXAgbGlzdCkgaW50byBhbiBTUUwtc3R5bGUgJ2luJyBsaXN0Lg0KCQkkZnVsbENhdExpc3QgPSBhcnJheSgpOw0KCQkkbm90Q2F0TGlzdCA9IGFycmF5KCk7DQoJCSRjYXRWYXJzID0gYXJyYXkoIj9jIiwgIiFjIiwgIj9zIiwgIiFzIiwgIj90IiwgIiF0IiwgIj9pZCIsICIhaWQiLCAiP2ZpZWxkIiwgIiFmaWVsZCIpOw0KCQkkcmV0QXJyYXkgPSBzbWRfZ2V0QXR0cygkY2F0ZWdvcnksICRjYXRWYXJzLCAkY2F0bGFiZWwpOw0KCQkkZnVsbENhdExpc3QgPSAkcmV0QXJyYXlbMF07DQoJCSRub3RDYXRMaXN0ID0gJHJldEFycmF5WzFdOw0KDQoJCS8vIENvbnZlcnQgdGhlIGltYWdlaWQgKHBvc3NpYmx5IGEgY29tbWEtc2VwIGxpc3QpIGludG8gYW4gU1FMLXN0eWxlICdpbicgbGlzdC4NCgkJJGZ1bGxJRExpc3QgPSBhcnJheSgpOw0KCQkkbm90SURMaXN0ID0gYXJyYXkoKTsNCgkJJGlkVmFycyA9IGFycmF5KCI/aWQiLCAiIWlkIiwgIj9maWVsZCIsICIhZmllbGQiKTsNCgkJJHJldEFycmF5ID0gc21kX2dldEF0dHMoJGltYWdlaWQsICRpZFZhcnMpOw0KCQkkZnVsbElETGlzdCA9ICRyZXRBcnJheVswXTsNCgkJJG5vdElETGlzdCA9ICRyZXRBcnJheVsxXTsNCg0KCQkvLyBNYWtlIHVwIHRoZSBXSEVSRSBzdGF0ZW1lbnQgZnJvbSB0aGUgY29tYmluZWQgbGlzdHMuDQoJCS8vIFRoZSBjYXRlZ29yaWVzL2ltYWdlIElEcyBhcmUgT1JlZCB0b2dldGhlciBpbiBicmFja2V0cyBmaXJzdA0KCQkvLyBiZWZvcmUgdGhlIG5lZ2F0aW9uIG9wdGlvbnMgYXJlIHRhY2tlZCBvbiBhcyBBTkRzIGFmdGVyd2FyZHMNCgkJJHdoZXJlT1IgPSBhcnJheSgpOw0KCQkkd2hlcmVBTkQgPSBhcnJheSgpOw0KDQoJCS8vIFN0YXJ0IHRoZSBXSEVSRSBzdGF0ZW1lbnQgd2l0aCB0aGUgY29tYmluZWQgbGlzdCBvZiBpbWFnZSBJRHMNCgkJaWYgKGNvdW50KCRmdWxsSURMaXN0KSA+IDApIHsNCgkJCWZvciAoJGlkeCA9IGNvdW50KCRmdWxsSURMaXN0KTsgJGlkeCA+PTA7ICRpZHgtLSkgew0KCQkJCWlmIChlbXB0eSgkZnVsbElETGlzdFskaWR4XSkpIHsNCgkJCQkJdW5zZXQoJGZ1bGxJRExpc3RbJGlkeF0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRmdWxsSURMaXN0WyRpZHhdID0gIiciIC4gJGZ1bGxJRExpc3RbJGlkeF0gLiAiJyI7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKGNvdW50KCRmdWxsSURMaXN0KSA+IDApIHsNCgkJCQkkd2hlcmVPUltdID0gImlkIElOICgiIC4gaW1wbG9kZSgiLCIsICRmdWxsSURMaXN0KS4gIikiOw0KCQkJfQ0KCQl9DQoNCgkJLy8gaW5jbHVkZWQgY2F0ZWdvcmllcyAtIHNvbWUgbWF5IGJlIHN1YmNhdHMNCgkJJHRtcGEgPSBhcnJheSgpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJGZ1bGxDYXRMaXN0KTsgJGlkeCsrKSB7DQoJCQlpZiAoJHN1YmNhdHMpIHsNCgkJCQkkY2F0ZWdzID0gc21kX2dldFN1YkNhdHMoJGZ1bGxDYXRMaXN0WyRpZHhdLCdpbWFnZScpOw0KCQkJCWZvciAoJGpkeCA9IDA7ICRqZHggPCBjb3VudCgkY2F0ZWdzKTsgJGpkeCsrKSB7DQoJCQkJCWlmICgkY2F0ZWdzWyRqZHhdWyduYW1lJ10gIT0gInJvb3QiKSB7DQoJCQkJCQkkdG1wYVtdID0gIiciIC4kY2F0ZWdzWyRqZHhdWyduYW1lJ10uICInIjsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHRtcGFbXSA9ICInIiAuJGZ1bGxDYXRMaXN0WyRpZHhdLiAiJyI7DQoJCQl9DQoJCX0NCgkJaWYgKGNvdW50KCR0bXBhKSA+IDApIHsNCgkJCSR3aGVyZU9SW10gPSAiY2F0ZWdvcnkgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgkJfQ0KDQoJCWlmIChjb3VudCgkd2hlcmVPUikgPiAwKSB7DQoJCQkkd2hlcmUgPSAiKCIgLiBpbXBsb2RlKCIgT1IgIiwgJHdoZXJlT1IpIC4gIikiOw0KCQl9IGVsc2Ugew0KCQkJJHdoZXJlID0gIiI7DQoJCX0NCg0KCQkvLyBleGNsdWRlZCBjYXRlZ29yaWVzDQoJCSR0bXBhID0gYXJyYXkoKTsNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRub3RDYXRMaXN0KTsgJGlkeCsrKSB7DQoJCQlpZiAoJHN1YmNhdHMpIHsNCgkJCQkkY2F0ZWdzID0gc21kX2dldFN1YkNhdHMoJG5vdENhdExpc3RbJGlkeF0sJ2ltYWdlJyk7DQoJCQkJZm9yICgkamR4ID0gMDsgJGpkeCA8IGNvdW50KCRjYXRlZ3MpOyAkamR4KyspIHsNCgkJCQkJaWYgKCRjYXRlZ3NbJGpkeF1bJ25hbWUnXSAhPSAicm9vdCIpIHsNCgkJCQkJCSR0bXBhW10gPSAiJyIgLiRjYXRlZ3NbJGpkeF1bJ25hbWUnXS4gIiciOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkdG1wYVtdID0gIiciIC4kbm90Q2F0TGlzdFskaWR4XS4gIiciOw0KCQkJfQ0KCQl9DQoJCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCQkkd2hlcmVBTkRbXSA9ICJjYXRlZ29yeSBOT1QgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgkJfQ0KDQoJCS8vIEFkZCB0byB0aGUgV0hFUkUgc3RhdGVtZW50IHRoZSBjb21iaW5lZCBsaXN0IG9mIE5PVCBpbWFnZSBJRHMNCgkJaWYgKGNvdW50KCRub3RJRExpc3QpID4gMCkgew0KCQkJZm9yICgkaWR4ID0gY291bnQoJG5vdElETGlzdCk7ICRpZHggPj0wOyAkaWR4LS0pIHsNCgkJCQlpZiAoZW1wdHkoJG5vdElETGlzdFskaWR4XSkpIHsNCgkJCQkJdW5zZXQoJG5vdElETGlzdFskaWR4XSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJG5vdElETGlzdFskaWR4XSA9ICInIiAuICRub3RJRExpc3RbJGlkeF0gLiAiJyI7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKGNvdW50KCRub3RJRExpc3QpID4gMCkgew0KCQkJCSR3aGVyZUFORFtdID0gImlkIE5PVCBJTiAoIiAuIGltcGxvZGUoIiwiLCAkbm90SURMaXN0KS4gIikiOw0KCQkJfQ0KCQl9DQoNCgkJaWYgKGNvdW50KCR3aGVyZUFORCkgPiAwKSB7DQoJCQkkd2hlcmUgLj0gKCgkd2hlcmU9PSIiKSA/ICIiIDogIiBBTkQgIikgLiBpbXBsb2RlKCIgQU5EICIsICR3aGVyZUFORCk7DQoJCX0NCg0KCQkvLyBJZiB0aGUgcmVhc29uIG5vdGhpbmcgd2FzIHJldHVybmVkIGlzIGJlY2F1c2Ugbm8gb3B0aW9ucyB3ZXJlIGdpdmVuDQoJCWlmICgkd2hlcmUgPT0gIiIgJiYgISRjYXRpZG9wdHMpIHsNCgkJCSR3aGVyZSA9ICIxPTEiOw0KCQl9DQoNCgkJLy8gQ29udmVydCB0aGUgb3JkZXJieSBpbnRvIGEgdmFsaWQgc29ydGluZyBoaWVyYXJjaHkuDQoJCS8vIE5vdGUgdGhhdCByYW5kb20gaXMgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHk6DQoJCS8vICAxKSBBbnl0aGluZyBhcHBlYXJpbmcgYmVmb3JlIHJhbmRvbSBpcyBwYXNzZWQgdG8gdGhlIGRhdGFiYXNlIHF1ZXJ5IGZvciBvcmRlcmluZw0KCQkvLyAgMikgQXMgc29vbiBhcyByYW5kb20gaXMgZW5jb3VudGVyZWQsIHRoZSBvcmRlcmJ5IHN0cmluZyBpcyBpZ25vcmVkLg0KCQkvLyAgICAgVGhlIHJlc3VsdHNldCB3aWxsIGJlIHNvcnRlZCByYW5kb21seSBpbnN0ZWFkDQoJCS8vICAzKSBJZiByYW5kb20gYXBwZWFycyBmaXJzdCBpbiB0aGUgbGlzdCwgdGhlIGRhdGEgaXMgcmV0cmlldmVkIHJhbmRvbWx5IHRoZW4gdGhlDQoJCS8vICAgICByZW1haW5pbmcgb3B0aW9ucyBzb3J0IHRoZSByZXN1bHRzZXQNCgkJJHdoZXJlT0IgPSBBcnJheSgpOw0KCQkkcG9zdE9yZGVyID0gYXJyYXkoKTsNCgkJJHJ1bGUgPSAic3FsIjsNCgkJJHBvc3RQcmVmaXggPSAiU09SVF8iOw0KCQkkcmFuZHNvcnQgPSBmYWxzZTsNCgkJJG9iTGlzdCA9IHByZWdfc3BsaXQoJy9bLFxzXSsvJywkb3JkZXJieSwtMSxQUkVHX1NQTElUX05PX0VNUFRZKTsNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRvYkxpc3QpOyAkaWR4KyspIHsNCgkJCSRvYl9kaXIgPSBleHBsb2RlKCc6Jywkb2JMaXN0WyRpZHhdKTsNCgkJCSRkaXJlY3Rpb24gPSAnJzsNCgkJCSRjb2xSZWYgPSAnJzsNCgkJCWlmIChjb3VudCgkb2JfZGlyKSA8PSAxKSB7DQoJCQkJJG9iX2RpclsxXSA9ICJhc2MiOw0KCQkJfQ0KCQkJaWYgKCRydWxlID09ICJzcWwiKSB7DQoJCQkJJGRpcmVjdGlvbiA9ICgkb2JfZGlyWzFdID09ICJkZXNjIikgPyAnIGRlc2MnIDogJyBhc2MnOw0KCQkJfSBlbHNlIHsNCgkJCQkkZGlyZWN0aW9uID0gKCRvYl9kaXJbMV0gPT0gImRlc2MiKSA/ICRwb3N0UHJlZml4LidERVNDJyA6ICRwb3N0UHJlZml4LidBU0MnOw0KCQkJfQ0KCQkJc3dpdGNoICgkb2JfZGlyWzBdKSB7DQoJCQkJY2FzZSAnbmFtZSc6DQoJCQkJCSRjb2xSZWYgPSAnbmFtZSc7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ2lkJzoNCgkJCQkJJGNvbFJlZiA9ICdpZCc7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ2FsdCc6DQoJCQkJCSRjb2xSZWYgPSAnYWx0JzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnY2FwdGlvbic6DQoJCQkJCSRjb2xSZWYgPSAnY2FwdGlvbic7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ2RhdGUnOg0KCQkJCQkkY29sUmVmID0gJ2RhdGUnOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdleHQnOg0KCQkJCQkkY29sUmVmID0gJ2V4dCc7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ2F1dGhvcic6DQoJCQkJCSRjb2xSZWYgPSAnYXV0aG9yJzsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnd2lkdGgnOg0KCQkJCQkkY29sUmVmID0gJ3cnOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdoZWlnaHQnOg0KCQkJCQkkY29sUmVmID0gJ2gnOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdyYW5kb20nOg0KCQkJCQkkcnVsZSA9ICJwb3N0IjsNCgkJCQkJaWYgKCRpZHggPT0gMCkgew0KCQkJCQkJJHdoZXJlT0JbXSA9ICdyYW5kKCknOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJHJhbmRzb3J0ID0gdHJ1ZTsNCgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlICdmaXhlZCc6DQoJCQkJCS8vICdmaXhlZCcgb25seSB3b3JrcyBvbiBpbWFnZSBpZHMNCgkJCQkJaWYgKCRpbWFnZWlkICE9ICIiKSB7DQoJCQkJCQkkZml4ZWRPcmRlciA9IHRydWU7DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnY2F0ZWdvcnknOg0KCQkJCWRlZmF1bHQ6DQoJCQkJCSRjb2xSZWYgPSAnY2F0ZWdvcnknOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCWlmICgkcnVsZSA9PSAic3FsIikgew0KCQkJCWlmICgkY29sUmVmICE9ICIiKSB7DQoJCQkJCSR3aGVyZU9CW10gPSAkY29sUmVmLiRkaXJlY3Rpb247DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQlpZiAoISRyYW5kc29ydCkgew0KCQkJCQlpZiAoJGNvbFJlZiAhPSAiIikgew0KCQkJCQkJJHBvc3RPcmRlcltdID0gYXJyYXkoImNvbCIgPT4gJGNvbFJlZiwgInNvcnQiID0+ICRkaXJlY3Rpb24pOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJaWYgKGNvdW50KCR3aGVyZU9CKSA+IDApIHsNCgkJCSR3aGVyZSAuPSAnIE9SREVSIEJZICcgLiBpbXBsb2RlKCIsIiwkd2hlcmVPQik7DQoJCX0NCg0KCQkvLyBIYW5kbGUgcGFnaW5nDQoJCWlmICgoJGxpbWl0ID4gMCkgJiYgJHNob3dwYWdlbGlua3MpIHsNCgkJCSRycyA9IHNhZmVfcm93cygkZmllbGRzLCAndHhwX2ltYWdlJywgJHdoZXJlIC4nIExJTUlUIDAsJy4kbWF4bGltaXQpOw0KCQkJJG51bXRodW0gPSBjb3VudCgkcnMpOw0KCQkJJG51bVBhZ2VzID0gKCRudW10aHVtID4gMCkgPyBjZWlsKCRudW10aHVtLyRsaW1pdCkgOiAxOw0KCQkJJHRodW1icGFnZSA9ICghZ3BzKCd0cGcnKSkgPyAxIDogZ3BzKCd0cGcnKTsNCgkJCSRvZmZzZXQgPSAoJHRodW1icGFnZSAtIDEpICogJGxpbWl0Ow0KCQkJJHJzID0gc2FmZV9yb3dzKCRmaWVsZHMsICd0eHBfaW1hZ2UnLCAkd2hlcmUgLicgTElNSVQgJy4kb2Zmc2V0LicsJy4kbGltaXQpOw0KCQl9IGVsc2Ugew0KCQkJLy8gTm8gcGFnaW5nIHJlcXVpcmVkDQoJCQkkbnVtUGFnZXMgPSAxOw0KCQkJJHRodW1icGFnZSA9IDE7DQoJCQkkcnMgPSBzYWZlX3Jvd3MoJGZpZWxkcywgJ3R4cF9pbWFnZScsICR3aGVyZSAuJyBMSU1JVCAwLCcuICgoJGxpbWl0PT0wKSA/ICRtYXhsaW1pdCA6ICRsaW1pdCkpOw0KCQl9DQoNCgkJLy8gSXMgcG9zdC1vcmRlcmluZyByZXF1aXJlZD8gRG8gaXQNCgkJaWYgKCRyYW5kc29ydCkgew0KCQkJc2h1ZmZsZSgkcnMpOw0KCQl9IGVsc2UgaWYgKGNvdW50KCRwb3N0T3JkZXIpID4gMCkgew0KCQkJLy8gVHJhbnNsYXRlIHRoZSByb3dzIGludG8gY29sdW1ucyB0aGF0IGNhbiBiZSBzb3J0ZWQNCgkJCWZvcmVhY2goJHJzIGFzICRrZXkgPT4gJHJvdykgew0KCQkJCSRjb2xfaWRbJGtleV0gPSAkcm93WydpZCddOw0KCQkJCSRjb2xfbmFtZVska2V5XSA9ICRyb3dbJ25hbWUnXTsNCgkJCQkkY29sX2NhcHRpb25bJGtleV0gPSAkcm93WydjYXB0aW9uJ107DQoJCQkJJGNvbF9hbHRbJGtleV0gPSAkcm93WydhbHQnXTsNCgkJCQkkY29sX2NhdGVnb3J5WyRrZXldID0gJHJvd1snY2F0ZWdvcnknXTsNCgkJCQkkY29sX2RhdGVbJGtleV0gPSAkcm93WydkYXRlJ107DQoJCQkJJGNvbF9leHRbJGtleV0gPSAkcm93WydleHQnXTsNCgkJCQkkY29sX2F1dGhvclska2V5XSA9ICRyb3dbJ2F1dGhvciddOw0KCQkJCSRjb2xfd1ska2V5XSA9ICRyb3dbJ3cnXTsNCgkJCQkkY29sX2hbJGtleV0gPSAkcm93WydoJ107DQoJCQl9DQoJCQkvLyBNYWtlIHVwIGFuIGFycmF5X211bHRpc29ydCBhcmcgbGlzdCBhbmQgZXhlY3V0ZSBpdA0KCQkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRwb3N0T3JkZXIpOyAkaWR4KyspIHsNCgkJCQkkc29ydGFyZ3NbXSA9ICckY29sXycuJHBvc3RPcmRlclskaWR4XVsnY29sJ107DQoJCQkJJHNvcnRhcmdzW10gPSAkcG9zdE9yZGVyWyRpZHhdWydzb3J0J107DQoJCQl9DQoJCQkkc29ydGl0ID0gJ2FycmF5X211bHRpc29ydCgnLmltcGxvZGUoIiwgIiwkc29ydGFyZ3MpLicsICRycyk7JzsNCgkJCWV2YWwoJHNvcnRpdCk7DQoJCX0NCg0KCQkvLyBJcyBmaXhlZC1vcmRlciBvdXRwdXQgZGVzaXJlZD8gSWYgc28sIHJlLW9yZGVyIHRoZSAkcnMNCgkJaWYgKCRmaXhlZE9yZGVyKSB7DQoJCQkkb3JkZXJlZFJTID0gQXJyYXkoKTsNCgkJCSRpZ25vcmVMaXN0ID0gQXJyYXkoKTsNCgkJCSRyZW1haW5pbmdSUyA9IEFycmF5KCk7DQoJCQkvLyBTdWNrIG91dCB0aGUgZml4ZWQgaXRlbXMgZmlyc3QNCgkJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkZnVsbElETGlzdCk7ICRpZHgrKykgew0KCQkJCWZvcmVhY2goJHJzIGFzICRyb3cpIHsNCgkJCQkJaWYgKCInIi4kcm93WydpZCddLiInIiA9PSAkZnVsbElETGlzdFskaWR4XSkgew0KCQkJCQkJJG9yZGVyZWRSU1tdID0gJHJvdzsNCgkJCQkJCSRpZ25vcmVMaXN0W10gPSAkcm93WydpZCddOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQkJLy8gVGFjayBvbiB0aGUgcmVtYWluaW5nIHJvd3MNCgkJCWZvcmVhY2goJHJzIGFzICRyb3cpIHsNCgkJCQlpZiAoIWluX2FycmF5KCRyb3dbJ2lkJ10sICRpZ25vcmVMaXN0KSkgew0KCQkJCQkkcmVtYWluaW5nUlNbXSA9ICRyb3c7DQoJCQkJfQ0KCQkJfQ0KCQkJJHJzID0gYXJyYXlfbWVyZ2UoJG9yZGVyZWRSUywgJHJlbWFpbmluZ1JTKTsNCgkJfQ0KDQoJCS8vIENvbnN0cnVjdCB0aGUgb3V0cHV0DQoJCSRvdXRTdHIgPSAnJzsNCgkJaWYoJHJzKSB7DQoJCQlmb3JlYWNoKCRycyBhcyAkcm93KSB7DQoJCQkJJHRodW1iID0gaHUuJGltZ19kaXIuJy8nIC4gJHJvd1snaWQnXSAuICd0JyAuICRyb3dbJ2V4dCddOw0KCQkJCSRmdWxsID0gaHUuJGltZ19kaXIuJy8nIC4gJHJvd1snaWQnXSAuICRyb3dbJ2V4dCddOw0KCQkJCWlmICgkZ3JvdXBuYW1lID09PSAiP2MiKSB7DQoJCQkJCSRncnAgPSAkcm93WydjYXRlZ29yeSddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZSA9PT0gIj9pZCIpIHsNCgkJCQkJJGdycCA9ICRyb3dbJ2lkJ107DQoJCQkJfSBlbHNlIGlmICgkZ3JvdXBuYW1lID09PSAiP2F1dGhvciIpIHsNCgkJCQkJJGdycCA9ICRyb3dbJ2F1dGhvciddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZSA9PT0gIj9kYXRlIikgew0KCQkJCQkkZ3JwID0gJHJvd1snZGF0ZSddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZSA9PT0gIj9hbHQiKSB7DQoJCQkJCSRncnAgPSAkcm93WydhbHQnXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWUgPT09ICI/Y2FwdGlvbiIpIHsNCgkJCQkJJGdycCA9ICRyb3dbJ2NhcHRpb24nXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWUgPT09ICI/ZXh0Iikgew0KCQkJCQkkZ3JwID0gJHJvd1snZXh0J107DQoJCQkJfSBlbHNlIGlmICgkZ3JvdXBuYW1lID09PSAiP25hbWUiKSB7DQoJCQkJCSRncnAgPSAkcm93WyduYW1lJ107DQoJCQkJfSBlbHNlIGlmICgkZ3JvdXBuYW1lID09PSAiP3dpZHRoIikgew0KCQkJCQkkZ3JwID0gJHJvd1sndyddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZSA9PT0gIj9oZWlnaHQiKSB7DQoJCQkJCSRncnAgPSAkcm93WydoJ107DQoJCQkJfSBlbHNlIGlmICgkZ3JvdXBuYW1lWzBdID09PSAiPyIpIHsNCgkJCQkJLy8gU3BsaXQgb2ZmIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhlIHF1ZXN0aW9uIG1hcmsNCgkJCQkJJGZpZWxkbmFtZSA9IHN1YnN0cigkZ3JvdXBuYW1lLDEpOw0KCQkJCQlpZiAoaXNzZXQoJHRoaXNhcnRpY2xlWyRmaWVsZG5hbWVdKSkgew0KCQkJCQkJJGdycCA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRncnAgPSAnJzsNCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCSRncnAgPSAkZ3JvdXBuYW1lOw0KCQkJCX0NCg0KCQkJCS8vIEdlbmVyYXRlIHRoZSBjYXB0aW9uL2FsdCBpZiByZXF1aXJlZA0KCQkJCSRjYXBTdHIgPSAoJHNob3dhbHQgJiYgJHJvd1snYWx0J10pID8gJzxzcGFuJyAuICgoJGFsdGNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRhbHRjbGFzcy4gJyInIDogJycpIC4gJz4nIC4kcm93WydhbHQnXS4gJzwvc3Bhbj4nIDogJyc7DQoJCQkJJGNhcFN0ciAuPSAoJHNob3djYXB0aW9uICYmICRyb3dbJ2NhcHRpb24nXSkgPyAnPHNwYW4nIC4gKCgkY2FwdGlvbmNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRjYXB0aW9uY2xhc3MuICciJyA6ICcnKSAuICc+JyAuJHJvd1snY2FwdGlvbiddLiAnPC9zcGFuPicgOiAnJzsNCg0KCQkJCS8vIENvbnN0cnVjdCB0aGUgbGluayBhbmQgcHV0IGNhcHRpb24vYWx0IGluIHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbg0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8JyAuJHdyYXB0YWcuICgoJGNlbGxjbGFzcyAhPSAiIikgPyAnIGNsYXNzPSInIC4kY2VsbGNsYXNzLiAnIicgOiAnJykgLiAnPicgOiAnJzsNCgkJCQkkb3V0U3RyIC49ICgkdGV4dHBvcyA9PSAiYWJvdmUiKSA/ICRjYXBTdHIgOiAnJzsNCgkJCQkkb3V0U3RyIC49ICc8YSBocmVmPSInLiRmdWxsLiciIHJlbD0ibGlnaHRib3gtJyAuJGdycC4gJyIgdGl0bGU9IicgLiRyb3dbJ2NhcHRpb24nXS4gJyI+JyAuKCgkdGV4dHBvcyA9PSAiYmVmb3JlIikgPyAkY2FwU3RyIDogJycpLiAnPGltZyBzcmM9IicgLiR0aHVtYi4gJyIgYWx0PSInIC4kcm93WydhbHQnXS4gJyInIC4gKCgkaW1nY2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJGltZ2NsYXNzLiAnIicgOiAnJykgLiAnIC8+JyAuKCgkdGV4dHBvcyA9PSAiYWZ0ZXIiKSA/ICRjYXBTdHIgOiAnJykuICc8L2E+Jy5uOw0KCQkJCSRvdXRTdHIgLj0gKCR0ZXh0cG9zID09ICJiZWxvdyIpID8gJGNhcFN0ciA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8LycgLiR3cmFwdGFnLiAnPicgOiAnJzsNCgkJCQkkb3V0U3RyIC49IG47DQoJCQl9DQoNCgkJCS8vIEFkZCB0aGUgcGFnaW5nIGZlYXR1cmVzIGlmIHJlcXVpcmVkDQoJCQlpZiAoKCRsaW1pdCA+IDApICYmICRzaG93cGFnZWxpbmtzKSB7DQoJCQkJJG5leHQgPSAoJG51bVBhZ2VzID4gMSAmJiAkdGh1bWJwYWdlICE9ICRudW1QYWdlcyk7DQoJCQkJJHByZXYgPSAoJG51bVBhZ2VzID4gMSAmJiAkdGh1bWJwYWdlID4gMSk7DQoNCgkJCQkvLyBSZXBsYWNlIGFueSBwYWdpbmcgaW5mbyBpbiB0aGUgcXVlcnkgc3RyaW5nDQoJCQkJJHByZXZQYWdlID0gc21kX2FkZFFTVmFyKCRwcmV0ZXh0WydyZXF1ZXN0X3VyaSddLCAndHBnJywgJHRodW1icGFnZS0xKTsNCgkJCQkkbmV4dFBhZ2UgPSBzbWRfYWRkUVNWYXIoJHByZXRleHRbJ3JlcXVlc3RfdXJpJ10sICd0cGcnLCAkdGh1bWJwYWdlKzEpOw0KDQoJCQkJJG91dFN0ciAuPSAoJHdyYXB0YWcgIT0gIiIpID8gJzwnIC4kd3JhcHRhZy4gKCgkbmF2Y2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJG5hdmNsYXNzLiAnIicgOiAnJykgLiAnPicgOiAnJzsNCgkJCQkkb3V0U3RyIC49ICgkcHJldikgPyAnPGEnIC4gKCgkcHJldmNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRwcmV2Y2xhc3MuICciJyA6ICcnKSAuICcgaHJlZj0iJyAuJHByZXZQYWdlLiAnIj4nIC4kcHJldmxhYmVsLiAnPC9hPicubiA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCRuZXh0KSA/ICc8YScgLiAoKCRuZXh0Y2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJG5leHRjbGFzcy4gJyInIDogJycpIC4gJyBocmVmPSInIC4kbmV4dFBhZ2UuICciPicgLiRuZXh0bGFiZWwuICc8L2E+Jy5uIDogJyc7DQoJCQkJJG91dFN0ciAuPSAoJHdyYXB0YWcgIT0gIiIpID8gJzwvJyAuJHdyYXB0YWcuICc+JyA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gbjsNCgkJCX0NCgkJfQ0KCX0NCg0KCXJldHVybiAkb3V0U3RyOw0KfSI7czo0OiJ0eXBlIjtzOjE6IjAiO3M6MzoibWQ1IjtzOjMyOiJjN2ViY2UxZjI5ODVlOWQxZjM1OTdlM2U1MDdlYWUxOSI7fQ==