# smd_fuzzy_find 0.03 # Offers alternative spellings and/or close-matching articles from search terms. # Stef Dawson # http://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: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTQ6InNtZF9mdXp6eV9maW5kIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjE6Imh0dHA6Ly9zdGVmZGF3c29uLmNvbSI7czo3OiJ2ZXJzaW9uIjtzOjQ6IjAuMDMiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjc4OiJPZmZlcnMgYWx0ZXJuYXRpdmUgc3BlbGxpbmdzIGFuZC9vciBjbG9zZS1tYXRjaGluZyBhcnRpY2xlcyBmcm9tIHNlYXJjaCB0ZXJtcy4iO3M6NDoiaGVscCI7czo1NTEzOiI8aDE+c21kX2Z1enp5X2ZpbmQ8L2gxPg0KDQo8cD5FdmVyIHdhbnRlZCBUWFAncyBzZWFyY2ggZmFjaWxpdHkgdG8gYmUgYSBsaXR0bGUgbW9yZSwgd2VsbCwgaW5hY2N1cmF0ZT8gV2FudCBubyBtb3JlLiBEZWZpbmUgaG93IGZ1enp5IHlvdXIgc2VhcmNoIGlzLCB3aGVyZSB0byBsb29rIGFuZCBob3cgbXVjaCBvZiBhIG51ZGdlIHRvIG9mZmVyIHlvdXIgc2l0ZSB2aXNpdG9ycyB3aXRoIHBoYXQgcGhpbmdlcnMuPC9wPg0KDQo8cD5SZXN1bHRzIGFyZSBvcmRlcmVkIGJ5IGFwcHJveGltYXRlIHJlbGV2YW5jeSBhbmQgaXQncyBhdXRvbWF0aWNhbGx5IGNvbnRleHQtc2Vuc2l0aXZlIGJlY2F1c2UgdGhlIHBvb2wgb2Ygd29yZHMgaXQgY29tcGFyZXMgYWdhaW5zdCBhcmUgZnJvbSB5b3VyIHNpdGUuIE9uIGEgem9vIHdlYnNpdGUsIHNvbWVvbmUgdHlwaW5nIGluICJsaW5vIiB3b24ndCBnZXQgYXJ0aWNsZXMgYWJvdXQgZmxvb3JpbmcgYnV0IG1vcmUgbGlrZWx5IGFydGljbGVzIGFib3V0IGxpb25zLCB3aGljaCBpcyB3aGF0IHRoZXkgcmVhbGx5IHdhbnRlZC4gV2UgaG9wZS48L3A+DQoNCjxoMj5Vc2FnZSBhdCBhIGdsYW5jZTwvaDI+DQo8dWw+DQo8bGk+PGI+c2VhcmNoX3Rlcm08L2I+DQo8YnIgLz5XaGF0IHlvdSB3b3VsZCBsaWtlIHRvIHNlYXJjaCBmb3I6IGVpdGhlciBhIGZpeGVkIHN0cmluZyAocmF0aGVyIHBvaW50bGVzcyEpIG9yICI/cSIgKHRoZSBkZWZhdWx0KS4gTWF5YmUgaW4gZnV0dXJlIG90aGVyIHRoaW5ncyBsaWtlID9jdXN0b21fZmllbGQgc28geW91IGNhbiBlbWJlZCB0aGlzIGluIGFuIGFydGljbGUgYW5kIGRvIHBzdWVkby1yZWxhdGVkLWFydGljbGUgc2VhcmNoZXM8L2xpPg0KPGxpPjxiPm1hdGNoX3dpdGg8L2I+DQo8YnIgLz5XaGVyZSB5b3Ugd291bGQgbGlrZSB0byBsb29rIGZvciBhIG1hdGNoIChpLmUuIHdoaWNoIGFydGljbGUgZmllbGRzKS4gRGVmaW5lIHRoZSBvYmplY3QgeW91IHdhbnQgdG8gbG9vayBpbiAoY3VycmVudGx5IG9ubHkgYXJ0aWNsZSBpcyBzdXBwb3J0ZWQpIGZvbGxvd2VkIGJ5IGEgY29sb24sIHRoZW4gYSBzZW1pLWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHBsYWNlcyB0byBsb29rOiA8Y29kZT5tYXRjaF93aXRoPSJhcnRpY2xlOmtleXdvcmRzO2JvZHk7ZXhjZXJwdCI8L2NvZGU+LiBPcHRpb25zIGFyZSBrZXl3b3JkcywgYm9keSwgZXhjZXJwdCwgY2F0ZWdvcnkxLCBjYXRlZ29yeTIsIHNlY3Rpb24sIGlkLCBhdXRob3JpZCwgdGl0bGUgKGNvbWluZyBzb29uOiBjdXN0b20gZmllbGRzKS4gRGVmYXVsdCBpcyBhcnRpY2xlOmtleXdvcmRzO2JvZHk7ZXhjZXJwdDs8L2xpPg0KPGxpPjxiPnNob3c8L2I+DQo8YnIgLz5XaGF0IHRvIGRpc3BsYXk6IHdoZXRoZXIgdG8gbGlzdCB0aGUgY2xvc2VzdCBtYXRjaGluZyBhcnRpY2xlcywgY2xvc2VzdCBtYXRjaGluZyBzZWFyY2ggdGVybXMsIG9yIGJvdGguIENob2ljZXMgYXJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZWl0aGVyIDxjb2RlPmFydGljbGVzPC9jb2RlPiBvciA8Y29kZT53b3JkczwvY29kZT4uIERlZmF1bHQ6ICJ3b3JkcywgYXJ0aWNsZXMiPC9saT4NCjxsaT48Yj5zZWN0aW9uPC9iPg0KPGJyIC8+TGltaXQgeW91ciBzZWFyY2ggcmVzdWx0cyB0byBhIHBhcnRpY3VsYXIgc2VjdGlvbiBvciB0aHJlZTsgZ2l2ZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiBZb3UgY2FuIHVzZSA/cyBmb3IgdGhlIGN1cnJlbnQgc2VjdGlvbiBvciAhcyBmb3IgYW55dGhpbmcgZXhjZXB0IHRoZSBjdXJyZW50IHNlY3Rpb24sIG9yIHVzZSAhIGFuZCB0aGUgbmFtZSBvZiBhIHNwZWNpZmljIHNlY3Rpb24gdG8gZXhjbHVkZSBpdC4gRGVmYXVsdDogZW1wdHkgKHRoZSB3aG9sZSBzaXRlKS48L2xpPg0KPGxpPjxiPmNhdGVnb3J5PC9iPg0KPGJyIC8+TGltaXQgeW91ciBzZWFyY2ggcmVzdWx0cyB0byBhIHBhcnRpY3VsYXIgY2F0ZWdvcnk7IGdpdmUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gWW91IGNhbiB1c2UgP2MgZm9yIHRoZSBjdXJyZW50IGdsb2JhbCBjYXRlZ29yeSBvciAhYyBmb3IgYW55IGV4Y2VwdCB0aGUgY3VycmVudCBnbG9iYWwgY2F0ZWdvcnksIG9yIHVzZSAhIGFuZCB0aGUgbmFtZSBvZiBhIHNwZWNpZmljIGNhdGVnb3J5IHRvIGV4Y2x1ZGUgaXQuIERlZmF1bHQ6IGVtcHR5IChhbGwgY2F0ZWdvcmllcykuPC9saT4NCjxsaT48Yj5zdWJjYXRzPC9iPg0KPGJyIC8+U2V0IHRoaXMgdG8gMSB0byBlbmFibGUgc2VhcmNoaW5nIG9mIHN1Yi1jYXRlZ29yaWVzIHVuZGVyIHRoZSBnaXZlbiBjYXRlZ29yaWVzLiBEZWZhdWx0OiB1bnVzZWQuPC9saT4NCjxsaT48Yj5zdGF0dXM8L2I+DQo8YnIgLz5SZXN0cmljdHMgdGhlIHNlYXJjaCB0byBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRvY3VtZW50IHN0YXR1cy4gQ2hvb3NlIGZyb20gZHJhZnQsIGhpZGRlbiwgcGVuZGluZywgbGl2ZSwgc3RpY2t5LiBEZWZhdWx0OiAibGl2ZSwgc3RpY2t5Ii48L2xpPg0KPGxpPjxiPnRvbGVyYW5jZTwvYj4NCjxiciAvPkhvdyBmdXp6eSB0aGUgc2VhcmNoIGlzIGFuZCBob3cgbG9uZyB0aGUgbWluaW11bSBzZWFyY2ggdGVybSBpcyBhbGxvd2VkIHRvIGJlLiBBbiBpbnRlZ2VyIGZyb20gMCAodmVyeSBjbG9zZSBtYXRjaCwgYWxsb3dzIHNob3J0IHNlYXJjaCB3b3JkcykgdG8gNSAocHJldHR5IG11Y2ggbm90aGluZyBsaWtlIHdoYXQgeW91IHNlYXJjaGVkIGZvciBhbmQgc2VhcmNoIHdvcmRzIG11c3QgdGhlbiBiZSBsb25nZXIsIHJvdWdobHkgPjcgY2hhcmFjdGVyKS4gUHJhY3RpY2FsIHZhbHVlcyBhcmUgdXN1YWxseSAwLCAxLCAyICh0aGUgZGVmYXVsdCksIG9yIHBvc3NpYmx5IDMuPC9saT4NCjxsaT48Yj5jYXNlX3NlbnNpdGl2ZTwvYj4NCjxiciAvPkRvZXMgd2hhdCBpdCBzYXlzIG9uIHRoZSB0aW4uIDE9Y2FzZSBzZW5zaXRpdmUgc2VhcmNoLCAwPW5vdC4gRGVmYXVsdDogMDwvbGk+DQo8bGk+PGI+bWluX3dvcmRfbGVuZ3RoPC9iPg0KPGJyIC8+VGhlIG1pbmltdW0gd29yZCBsZW5ndGggeW91IHdhbnQgcmV0dXJuaW5nLiBEZWZhdWx0OiA0PC9saT4NCjxsaT48Yj5saW1pdDwvYj4NCjxiciAvPlRoZSBtYXhpbXVtIG51bWJlciBvZiB3b3JkcyBhbmQvb3IgYXJ0aWNsZXMgdG8gZGlzcGxheS4gR2l2ZSBpdCBhIHNpbmdsZSBpbnRlZ2VyIGFuZCBpdCBsaW1pdHMgYm90aCB0byB0aGUgc2FtZSB2YWx1ZS4gU3BlY2lmeWluZyA8Y29kZT5hcnRpY2xlczo1PC9jb2RlPiB3b3VsZCByZW1vdmUgYW55IGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgYWx0ZXJuYXRpdmUgc2VhcmNoIHdvcmRzIG9mZmVyZWQgYnV0IHdvdWxkIGxpbWl0IHRoZSBhcnRpY2xlcyB0byBhIG1heGltdW0gb2YgNS4gU2ltaWxhcmx5LCA8Y29kZT53b3Jkczo0PC9jb2RlPiB3b3VsZCByZW1vdmUgdGhlIGFydGljbGUgbGltaXQgYW5kIG9ubHkgc2hvdyBhIG1heGltdW0gb2YgNCBhbHRlcm5hdGl2ZSB3b3Jkcy4gQm90aCBvZiB0aGVzZSBhcmUgc3ViamVjdCB0byB0aGVpciByZXNwZWN0aXZlICJzaG93IiBvcHRpb25zIGJlaW5nIHNldCBvZiBjb3Vyc2UuIERlZmF1bHQ6IDxjb2RlPndvcmRzOjUsIGFydGljbGVzOjEwPC9jb2RlPjwvbGk+DQo8bGk+PGI+Zm9ybTwvYj4NCjxiciAvPlRoZSBUWFAgZm9ybSB0byBvdXRwdXQgdGhlIGxpc3Qgb2YgYXJ0aWNsZXMgaW4uIERlZmF1bHQ6IHNlYXJjaF9yZXN1bHRzLiBOb3RlIHRoYXQgJmx0O3R4cDpzZWFyY2hfcmVzdWx0X2V4Y2VycHQgLyZndDsgaXMgbm93IGhvbm91cmVkIGFzIGNsb3NlbHkgYXMgcG9zc2libGUuPC9saT4NCjxsaT48Yj5ub19tYXRjaF9sYWJlbDwvYj4NCjxiciAvPlRoZSBwaHJhc2UgdG8gZGlzcGxheSB3aGVuIG5vIG1hdGNoZXMgKG1heWJlIG5vdCBldmVuIGZ1enp5IG9uZXMhKSBhcmUgZm91bmQuIERlZmF1bHRzIHRvIHRoZSBNTFAgc3RyaW5nICdub19tYXRjaCcuIFVzZSA8Y29kZT5ub19tYXRjaF9sYWJlbD0iIjwvY29kZT4gdG8gdHVybiBpdCBvZmYuPC9saT4NCjxsaT48Yj5zdWdnZXN0X2xhYmVsPC9iPg0KPGJyIC8+VGhlIHBocmFzZSB0byBkaXNwbGF5IGltbWVkaWF0ZWx5IHByaW9yIHRvIHNob3dpbmcgY2xvc2UtbWF0Y2hpbmcgYXJ0aWNsZXMvd29yZHMuIERlZmF1bHRzIHRvIHRoZSBNTFAgc3RyaW5nICdzdWdnZXN0Jy4gVXNlIDxjb2RlPnN1Z2dlc3RfbGFiZWw9IiI8L2NvZGU+IHRvIHN3aXRjaCBpdCBvZmYuPC9saT4NCjxsaT48Yj50b29fc2hvcnRfbGFiZWw8L2I+DQo8YnIgLz5TZWFyY2hlcyBvZiB1bmRlciBhYm91dCAzIGNoYXJhY3RlcnMgKHNvbWV0aW1lcyBtb3JlIGRlcGVuZGluZyBvbiB5b3VyIGNvbnRlbnQpIGFyZSB0b28gc2hvcnQgZm9yIGFueSByZWFzb25hYmxlIGZ1enppbmVzcyB0byBiZSBhcHBsaWVkLiBUaGlzIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIHRoYXQgY2lyY3Vtc3RhbmNlLiBEZWZhdWx0cyB0byB0aGUgTUxQIHN0cmluZyB0b29fc2hvcnQuIFVzZSA8Y29kZT50b29fc2hvcnRfbGFiZWw9IiI8L2NvZGU+IHRvIHN3aXRjaCBpdCBvZmYuPC9saT4NCjwvdWw+DQo8cD5Db21pbmcgc29vbjogY2xhc3Mgb3B0aW9ucywgY29tbWVudCBzZWFyY2ggc3VwcG9ydCAod2l0aCBsdWNrKSBhbmQgYSBmZXcgb3RoZXIgZW5oYW5jZW1lbnRzLiBNYXliZSBjaGFuZ2VzIHRvIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGFsZ29yaXRobSBpZiBhbnlvbmUgd2FudHMgdG8gaGVscC4gUHJldHR5IHBsZWFzZT8hPC9wPg0KDQo8aDI+RXhhbXBsZSB1c2FnZTwvaDI+DQoNCjxwPlNpbmNlIGl0J3Mgbm90IGEgZGlyZWN0IHJlcGxhY2VtZW50IGZvciB0aGUgYnVpbHQtaW4gc2VhcmNoIChUWFAgd2lsbCBjb21wbGFpbiBpZiB5b3UgZG8gbm90IGluY2x1ZGUgYW4gYXJ0aWNsZSB3aXRoaW4gYW4gaWZfc2VhcmNoIHRhZykgdGhlIGJlc3Qgd2F5IHRvIHVzZSBpdCBpcyBpbiBjb25qdW5jdGlvbiB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0xNDE2MyI+Y2hoX2lmX2RhdGE8L2E+IGluIGEgcGFnZSBsaWtlIHRoaXM6PC9wPg0KDQo8cHJlPg0KJmx0O3R4cDppZl9zZWFyY2gmZ3Q7DQogICZsdDt0eHA6Y2hoX2lmX2RhdGEmZ3Q7DQogICAgJmx0O2RsIGNsYXNzPSJleGNlcnB0cyImZ3Q7DQogICAgICAmbHQ7dHhwOmFydGljbGUgbGltaXQ9IjgiIGxpc3Rmb3JtPSJleGNlcnB0cyIgLyZndDsNCiAgICAmbHQ7L2RsJmd0Ow0KICAmbHQ7dHhwOmVsc2UgLyZndDsNCiAgICAmbHQ7ZGwgY2xhc3M9ImV4Y2VycHRzIiZndDsNCiAgICAgICZsdDt0eHA6c21kX2Z1enp5X2ZpbmQgZm9ybT0iZXhjZXJwdHMiIC8mZ3Q7DQogICAgJmx0Oy9kbCZndDsNCiAgJmx0Oy90eHA6Y2hoX2lmX2RhdGEmZ3Q7DQombHQ7L3R4cDppZl9zZWFyY2gmZ3Q7DQo8L3ByZT4NCg0KU28gaW4gdGhlIGNhc2UgYW4gZXhhY3QgdGVybSBpcyBmb3VuZCwgdGhlIG5vcm1hbCBUWFAgc2VhcmNoIGlzIGNhbGxlZC4gSWYgYW4gZXhhY3Qgc2VhcmNoIHRlcm0gaXMgbm90IGZvdW5kLCBsZXQgc21kX2Z1enp5X2ZpbmQgaGF2ZSBhIGdvLiI7czo0OiJjb2RlIjtzOjEzMDUyOiIvLyB2MC4wMSAgIEluaXRpYWwgcHVibGljIGJldGENCi8vIHYwLjAyICAgRml4ZWQgY2FzZSBzZW5zaXRpdml0eS4gU3BlZCB1cCBhbmQgaW1wcm92ZWQgd29yZGxpc3QgZ2VuZXJhdGlvbi4gQWRkZWQgcmVmaW5lIGF0dHJpYnV0ZSB0byBzd2l0Y2ggb2ZmIHNvdW5kZXgvbWV0YXBob25lIGlmIHJlcXVpcmVkDQovLyB2MC4wMyAgIEZpeGVkOiBtdWx0aS13b3JkIHNlYXJjaGluZyAoc21kX2dldFdvcmQgYnVnKSBhbmQgc2VhcmNoX3Jlc3VsdF9leGNlcnB0LiBBZGRlZCBjYXRlZ29yeSBhbmQgc3RhdHVzIHN1cHBvcnQuDQoNCnJlcXVpcmVfcGx1Z2luKCdzbWRfbGliJyk7DQpnbG9iYWwgJHNtZF9mdXp6TGFuZzsNCg0KJHNtZF9mdXp6X3N0ciA9IGFycmF5KA0KCSd0b29fc2hvcnQnID0+ICdUaGUgdGV4dCB5b3UgYXJlIHNlYXJjaGluZyBmb3IgaXMgcHJvYmFibHkgdG9vIHNob3J0LiBUcnkgYSBsb25nZXIgd29yZC4gJywNCgknbm9fbWF0Y2gnID0+ICdTb3JyeSwgbm8gcmVzdWx0cyBtYXRjaGVkICJ7c2VhcmNoX3Rlcm19IiBleGFjdGx5LiAnLA0KCSdzdWdnZXN0JyA9PiAnSGVyZSBhcmUgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcge3RoaW5naWVzfSB0aGF0IG1heSBoZWxwIHlvdSBmaW5kIHdoYXQgeW91IGFyZSBsb29raW5nIGZvcjogJywNCgknc3VnZ2VzdF9qb2luJyA9PiAnYW5kJywNCgknYXJ0aWNsZXMnID0+ICdhcnRpY2xlcycsDQoJJ3dvcmRzJyA9PiAnd29yZHMnLA0KKTsNCiRzbWRfZnV6ekxhbmcgPSBuZXcgc21kX01MUCgnc21kX2Z1enp5X2ZpbmQnLCAnc21kX2Z1enonLCAkc21kX2Z1enpfc3RyKTsNCg0KZnVuY3Rpb24gc21kX2Z1enp5X2ZpbmQoJGF0dHMsICR0aGluZz0nJykgew0KCWdsb2JhbCAkcHJldGV4dCwgJHRoaXNhcnRpY2xlOw0KCWdsb2JhbCAkc21kX2Z1enpMYW5nOw0KDQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ2Zvcm0nID0+ICdzZWFyY2hfcmVzdWx0cycsDQoJCSdzZWN0aW9uJyA9PiAnJywNCgkJJ2NhdGVnb3J5JyA9PiAnJywNCgkJJ3N1YmNhdHMnID0+ICcwJywNCgkJJ3NlYXJjaF90ZXJtJyA9PiAnP3EnLA0KCQknbWF0Y2hfd2l0aCcgPT4gJ2FydGljbGU6a2V5d29yZHM7Ym9keTtleGNlcnB0JywNCgkJJ3RvbGVyYW5jZScgPT4gJzInLA0KCQknbWluX3dvcmRfbGVuZ3RoJyA9PiAnNCcsDQoJCSdsaW1pdCcgPT4gJ3dvcmRzOjUsIGFydGljbGVzOjEwJywNCgkJJ2Nhc2Vfc2Vuc2l0aXZlJyA9PiAnMCcsDQoJCSdyZWZpbmUnID0+ICdtZXRhcGhvbmUsIHNvdW5kZXgnLA0KCQknc2hvdycgPT4gJ3dvcmRzLCBhcnRpY2xlcycsDQoJCSdzdGF0dXMnID0+ICdsaXZlLCBzdGlja3knLA0KCQknZGVidWcnID0+ICcwJywNCgkJJ25vX21hdGNoX2xhYmVsJyA9PiAnIycsDQoJCSdzdWdnZXN0X2xhYmVsJyA9PiAnIycsDQoJCSd0b29fc2hvcnRfbGFiZWwnID0+ICcjJywNCgkpLCAkYXR0cykpOw0KDQoJJHNlYXJjaEFsbG93ID0gYXJyYXkoIj9jIiwgIiFjIiwgIj9zIiwgIiFzIiwgIj90IiwgIiF0IiwgIj9pZCIsICIhaWQiLCAiP3EiLCAiIXEiLCAiP2ZpZWxkIiwgIiFmaWVsZCIpOw0KCSRyZWZpbmVBbGxvdyA9IGFycmF5KCJtZXRhcGhvbmUiLCAic291bmRleCIpOw0KCSRzaG93QWxsb3cgPSBhcnJheSgiYXJ0aWNsZXMiLCAid29yZHMiKTsNCgkkY29sTmFtZXMgPSBhcnJheSgnS2V5d29yZHMnID0+ICJhcnRpY2xlOmtleXdvcmRzIiwNCgkJCQkJCQknQm9keScgPT4gImFydGljbGU6Ym9keSIsDQoJCQkJCQkJJ0V4Y2VycHQnID0+ICJhcnRpY2xlOmV4Y2VycHQiLA0KCQkJCQkJCSdDYXRlZ29yeTEnID0+ICJhcnRpY2xlOmNhdGVnb3J5MSIsDQoJCQkJCQkJJ0NhdGVnb3J5MicgPT4gImFydGljbGU6Y2F0ZWdvcnkyIiwNCgkJCQkJCQknU2VjdGlvbicgPT4gImFydGljbGU6c2VjdGlvbiIsDQoJCQkJCQkJJ0lEJyA9PiAiYXJ0aWNsZTppZCIsDQoJCQkJCQkJJ0F1dGhvcklEJyA9PiAiYXJ0aWNsZTphdXRob3JpZCIsDQoJCQkJCQkJJ1RpdGxlJyA9PiAiYXJ0aWNsZTp0aXRsZSIsDQoJCQkJCQkJJ2NhdGVnb3J5JyA9PiAiaW1hZ2U6Y2F0ZWdvcnkiLA0KCQkJCQkJCSdhbHQnID0+ICJpbWFnZTphbHQiLA0KCQkJCQkJCSdjYXB0aW9uJyA9PiAiaW1hZ2U6Y2FwdGlvbiIsDQoJCQkJCQkJJ25hbWUnID0+ICJpbWFnZTpuYW1lIiwNCgkJCQkJCQknbWVzc2FnZScgPT4gImNvbW1lbnRzOm1lc3NhZ2UiLA0KCQkJCQkJCSdlbWFpbCcgPT4gImNvbW1lbnRzOmVtYWlsIiwNCgkJCQkJCQknbmFtZScgPT4gImNvbW1lbnRzOm5hbWUiLA0KCQkJCQkJCSd3ZWInID0+ICJjb21tZW50czp3ZWIiLA0KCQkJCQkJCSk7DQoNCgkkcGxhY2VzID0gYXJyYXkoJ3RleHRwYXR0ZXJuJyA9PiAiYXJ0aWNsZSIsICd0eHBfaW1hZ2UnID0+ICJpbWFnZSIsICd0eHBfZGlzY3VzcycgPT4gImNvbW1lbnRzIik7DQoJJHNlY3NpbiA9IGFycmF5KCk7DQoJJGNhdHNpbiA9IGFycmF5KCk7DQoJJHN0YXRzaW4gPSBhcnJheSgpOw0KCSRmdWxsU2VjTGlzdCA9IGFycmF5KCk7DQoJJG5vdFNlY0xpc3QgPSBhcnJheSgpOw0KCSRmdWxsQ2F0TGlzdCA9IGFycmF5KCk7DQoJJG5vdENhdExpc3QgPSBhcnJheSgpOw0KCSRmdWxsU3RhdExpc3QgPSBhcnJheSgpOw0KCSRub3RTdGF0TGlzdCA9IGFycmF5KCk7DQoJJHJlZmluZUxpc3QgPSBhcnJheSgpOw0KCSRkYlRhYmxlcyA9IGFycmF5KCk7DQoJJGRiRmllbGRzID0gYXJyYXkoKTsNCgkkd2hlcmVQYXJ0cyA9IGFycmF5KCk7DQoNCgkvLyBFeHBhbmQgdGhlIGFyZ3MgaW4gY2FzZSB0aGV5J3JlID8gb3IgISBzaG9ydGN1dHMsIGFuZCBkbyBzb21lIHZhbGlkaXR5IGNoZWNraW5nLg0KCSRzZWFyY2hfdGVybSA9IHNtZF9nZXRBdHRzKCRzZWFyY2hfdGVybSwkc2VhcmNoQWxsb3cpOw0KCSRzZWFyY2hfdGVybSA9ICRzZWFyY2hfdGVybVswXVswXTsNCglpZiAoJGRlYnVnID4gMSkgew0KCQlkbXAoJHNlYXJjaF90ZXJtKTsNCgl9DQoJJHJlZmluZSA9IHNtZF9nZXRBdHRzKCRyZWZpbmUsIGFycmF5KCkpOw0KCSRyZWZpbmUgPSAkcmVmaW5lWzBdOw0KCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkcmVmaW5lKTsgJGlkeCsrKSB7DQoJCWlmIChpbl9hcnJheSgkcmVmaW5lWyRpZHhdLCAkcmVmaW5lQWxsb3cpKSB7DQoJCQkkcmVmaW5lTGlzdFskaWR4XSA9ICRyZWZpbmVbJGlkeF07DQoJCX0NCgl9DQoJJG1ldGFfc2VhcmNoID0gKGluX2FycmF5KCJtZXRhcGhvbmUiLCAkcmVmaW5lTGlzdCkpID8gbWV0YXBob25lKCRzZWFyY2hfdGVybSkgOiAiIjsNCgkkc291bmRfc2VhcmNoID0gKGluX2FycmF5KCJzb3VuZGV4IiwgJHJlZmluZUxpc3QpKSA/IHNvdW5kZXgoJHNlYXJjaF90ZXJtKSA6ICIiOw0KCSR0b2xlcmFuY2UgPSBpbnR2YWwoJHRvbGVyYW5jZSk7DQoNCgkvLyBtYXRjaF93aXRoIG5lZWRzIHRvIGJlIGJ1aWx0IGludG8gYSBzZXJpZXMgb2YgYXJyYXlzIG9mIGRhdGFiYXNlIHRhYmxlcyBhbmQgY29sdW1ucw0KCSRsb29raW4gPSBzbWRfc3BsaXRSYW5nZSgkbWF0Y2hfd2l0aCwgIjosXHMiKTsNCgkvLyBMb29wIG92ZXIgcGFpcnMgb2YgZWxlbWVudHMNCglmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJGxvb2tpbik7ICRpZHgrPTIpIHsNCgkJJGRiVGFibGVzW10gPSBhcnJheV9zZWFyY2goJGxvb2tpblskaWR4XSwgJHBsYWNlcyk7DQoJCSRkYkZpZWxkTGlzdCA9IHNtZF9zcGxpdFJhbmdlKCRsb29raW5bJGlkeCsxXSwgIjsiKTsNCgkJJGRiRmllbGQgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkZGJGaWVsZExpc3QgYXMgJGxvb2tGaWVsZCkgew0KCQkJJGRiRmllbGRbXSA9IGFycmF5X3NlYXJjaCgkbG9va2luWyRpZHhdLiI6Ii4kbG9va0ZpZWxkLCAkY29sTmFtZXMpOw0KCQl9DQoJCSRkYkZpZWxkc1tdID0gJGRiRmllbGQ7DQoJfQ0KCWlmIChjb3VudCgkZGJUYWJsZXMpID09IDApIHsNCgkJJGRiVGFibGVzW10gPSAidGV4dHBhdHRlcm4iOw0KCQkkZGJGaWVsZHNbXSA9ICIqIjsNCgl9DQovKg0KCS8vIENyZWF0ZSB0aGUgZWxlbWVudHMgb2YgdGhlIFNRTCBzdGF0ZW1lbnRzDQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRkYlRhYmxlcyk7ICRpZHgrKykgew0KCQkkY29sdW1ucyA9IGltcGxvZGUoIiwiLCRkYkZpZWxkc1skaWR4XSk7DQoJCSRzcWxFbGVtc1tdID0gYXJyYXkoJGRiVGFibGVzWyRpZHhdLCAkY29sdW1ucyk7DQoJfQ0KKi8NCgkkc2hvdyA9IHNtZF9nZXRBdHRzKCRzaG93LCBhcnJheSgpKTsNCgkkc2hvd0xpc3QgPSAkc2hvd1swXTsNCglmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHNob3dMaXN0KTsgJGlkeCsrKSB7DQoJCWlmIChpbl9hcnJheSgkc2hvd0xpc3RbJGlkeF0sICRzaG93QWxsb3cpKSB7DQoJCQkkc2hvd0xpc3RbJGlkeF0gPSAkc21kX2Z1enpMYW5nLT5nVHh0KCRzaG93TGlzdFskaWR4XSk7DQoJCX0NCgl9DQoJJGxpbWl0QnkgPSBhcnJheSgpOw0KCSRsaW1pdCA9IHNtZF9nZXRBdHRzKCRsaW1pdCwgYXJyYXkoKSk7DQoJZm9yZWFjaCAoJGxpbWl0WzBdIGFzICRsaW1PcHRpb24pIHsNCgkJaWYgKGlzX251bWVyaWMoJGxpbU9wdGlvbikpIHsNCgkJCSRsaW1pdEJ5WyJhcnRpY2xlcyJdID0gJGxpbU9wdGlvbjsNCgkJCSRsaW1pdEJ5WyJ3b3JkcyJdID0gJGxpbU9wdGlvbjsNCgkJfSBlbHNlIHsNCgkJCSRsaW1zcGxpdCA9IHNtZF9zcGxpdFJhbmdlKCRsaW1PcHRpb24sICI6Iik7DQoJCQlpZiAoKGNvdW50KCRsaW1zcGxpdCkgPT0gMikgJiYgKGluX2FycmF5KCRsaW1zcGxpdFswXSwgJHNob3dBbGxvdykpICYmIChpc19udW1lcmljKCRsaW1zcGxpdFsxXSkpKSB7DQoJCQkJJGxpbWl0QnlbJGxpbXNwbGl0WzBdXSA9ICRsaW1zcGxpdFsxXTsNCgkJCX0NCgkJfQ0KCX0NCg0KCSR0aGluZ2llcyA9IGltcGxvZGUoIiAiLiRzbWRfZnV6ekxhbmctPmdUeHQoJ3N1Z2dlc3Rfam9pbicpLiIgIiwgJHNob3dMaXN0KTsNCgkkbm9fbWF0Y2hfbGFiZWwgPSAoJG5vX21hdGNoX2xhYmVsID09ICIjIikgPyAkc21kX2Z1enpMYW5nLT5nVHh0KCdub19tYXRjaCcsIGFycmF5KCJ7c2VhcmNoX3Rlcm19IiA9PiAkc2VhcmNoX3Rlcm0pKSA6ICRub19tYXRjaF9sYWJlbDsNCgkkc3VnZ2VzdF9sYWJlbCA9ICgkc3VnZ2VzdF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFuZy0+Z1R4dCgnc3VnZ2VzdCcsIGFycmF5KCJ7dGhpbmdpZXN9IiA9PiAkdGhpbmdpZXMpKSA6ICRzdWdnZXN0X2xhYmVsOw0KCSR0b29fc2hvcnRfbGFiZWwgPSAoJHRvb19zaG9ydF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFuZy0+Z1R4dCgndG9vX3Nob3J0JykgOiAkdG9vX3Nob3J0X2xhYmVsOw0KDQoJLy8gR2V0IHRoZSBkb2N1bWVudCBzdGF0dXNlcyB0byBzZWFyY2gNCgkkc3RhdGlpID0gc21kX2dldEF0dHMoJHN0YXR1cywgYXJyYXkoIiFmaWVsZCIpKTsNCgkkZnVsbFN0YXRMaXN0ID0gJHN0YXRpaVswXTsNCgkkbm90U3RhdExpc3QgPSAkc3RhdGlpWzFdOw0KDQoJJHRtcGEgPSBhcnJheSgpOw0KCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkZnVsbFN0YXRMaXN0KTsgJGlkeCsrKSB7DQoJCSR0bXBhW10gPSAiJyIgLmdldFN0YXR1c051bSgkZnVsbFN0YXRMaXN0WyRpZHhdKS4gIiciOw0KCX0NCglpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkkc3RhdHNpbltdID0gInN0YXR1cyBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCX0NCgkkdG1wYSA9IGFycmF5KCk7DQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRub3RTdGF0TGlzdCk7ICRpZHgrKykgew0KCQkkdG1wYVtdID0gIiciIC5nZXRTdGF0dXNOdW0oJG5vdFN0YXRMaXN0WyRpZHhdKS4gIiciOw0KCX0NCglpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkkc3RhdHNpbltdID0gInN0YXR1cyBOT1QgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgl9DQoNCglpZiAoY291bnQoJHN0YXRzaW4pID4gMCkgew0KCQkkd2hlcmVQYXJ0c1tdID0gIigiIC4gaW1wbG9kZSgiIE9SICIsICRzdGF0c2luKSAuICIpIjsNCgl9DQoNCgkkc2VjdGlvbnMgPSBzbWRfZ2V0QXR0cygkc2VjdGlvbixhcnJheSgiP3MiLCAiIXMiLCAiIWZpZWxkIikpOw0KCSRmdWxsU2VjTGlzdCA9ICRzZWN0aW9uc1swXTsNCgkkbm90U2VjTGlzdCA9ICRzZWN0aW9uc1sxXTsNCg0KCSRjYXRzID0gc21kX2dldEF0dHMoJGNhdGVnb3J5LGFycmF5KCI/YyIsICIhYyIsICIhZmllbGQiKSk7DQoJJGZ1bGxDYXRMaXN0ID0gJGNhdHNbMF07DQoJJG5vdENhdExpc3QgPSAkY2F0c1sxXTsNCg0KCS8vIGluY2x1ZGVkIHNlY3Rpb25zICYgY2F0ZWdvcmllcw0KCWlmIChpbl9hcnJheSgidGV4dHBhdHRlcm4iLCAkZGJUYWJsZXMpKSB7DQoJCS8vIHNlY3Rpb25zDQoJCSR0bXBhID0gYXJyYXkoKTsNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRmdWxsU2VjTGlzdCk7ICRpZHgrKykgew0KCQkJJHRtcGFbXSA9ICInIiAuJGZ1bGxTZWNMaXN0WyRpZHhdLiAiJyI7DQoJCX0NCgkJaWYgKGNvdW50KCR0bXBhKSA+IDApIHsNCgkJCSRzZWNzaW5bXSA9ICJzZWN0aW9uIElOICgiIC5pbXBsb2RlKCIsIiwgJHRtcGEpLiAiKSI7DQoJCX0NCg0KCQkvLyBleGNsdWRlZCBzZWN0aW9ucw0KCQkkdG1wYSA9IGFycmF5KCk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkbm90U2VjTGlzdCk7ICRpZHgrKykgew0KCQkJJHRtcGFbXSA9ICInIiAuJG5vdFNlY0xpc3RbJGlkeF0uICInIjsNCgkJfQ0KCQlpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkJJHNlY3NpbltdID0gInNlY3Rpb24gTk9UIElOICgiIC5pbXBsb2RlKCIsIiwgJHRtcGEpLiAiKSI7DQoJCX0NCg0KCQlpZiAoY291bnQoJHNlY3NpbikgPiAwKSB7DQoJCQkkd2hlcmVQYXJ0c1tdID0gIigiIC4gaW1wbG9kZSgiIE9SICIsICRzZWNzaW4pIC4gIikiOw0KCQl9DQoNCgkJLy8gY2F0ZWdvcmllcw0KCQkkdG1wYSA9IGFycmF5KCk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkZnVsbENhdExpc3QpOyAkaWR4KyspIHsNCgkJCWlmICgkc3ViY2F0cykgew0KCQkJCSRjYXRlZ3MgPSBzbWRfZ2V0U3ViQ2F0cygkZnVsbENhdExpc3RbJGlkeF0sJ2FydGljbGUnKTsNCgkJCQlmb3IgKCRqZHggPSAwOyAkamR4IDwgY291bnQoJGNhdGVncyk7ICRqZHgrKykgew0KCQkJCQlpZiAoJGNhdGVnc1skamR4XVsnbmFtZSddICE9ICJyb290Iikgew0KCQkJCQkJJHRtcGFbXSA9ICInIiAuJGNhdGVnc1skamR4XVsnbmFtZSddLiAiJyI7DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCSR0bXBhW10gPSAiJyIgLiRmdWxsQ2F0TGlzdFskaWR4XS4gIiciOw0KCQkJfQ0KCQl9DQoJCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCQkkdGhlQ2F0cyA9IGltcGxvZGUoIiwiLCAkdG1wYSk7DQoJCQkkY2F0c2luW10gPSAiKCBDYXRlZ29yeTEgSU4gKCIgLiR0aGVDYXRzLiAiKSBPUiBDYXRlZ29yeTIgSU4gKCIgLiR0aGVDYXRzLiAiKSApIjsNCgkJfQ0KDQoJCS8vIGV4Y2x1ZGVkIGNhdGVnb3JpZXMNCgkJJHRtcGEgPSBhcnJheSgpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJG5vdENhdExpc3QpOyAkaWR4KyspIHsNCgkJCWlmICgkc3ViY2F0cykgew0KCQkJCSRjYXRlZ3MgPSBzbWRfZ2V0U3ViQ2F0cygkbm90Q2F0TGlzdFskaWR4XSwnYXJ0aWNsZScpOw0KCQkJCWZvciAoJGpkeCA9IDA7ICRqZHggPCBjb3VudCgkY2F0ZWdzKTsgJGpkeCsrKSB7DQoJCQkJCWlmICgkY2F0ZWdzWyRqZHhdWyduYW1lJ10gIT0gInJvb3QiKSB7DQoJCQkJCQkkdG1wYVtdID0gIiciIC4kY2F0ZWdzWyRqZHhdWyduYW1lJ10uICInIjsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHRtcGFbXSA9ICInIiAuJG5vdENhdExpc3RbJGlkeF0uICInIjsNCgkJCX0NCgkJfQ0KCQlpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkJJHRoZUNhdHMgPSBpbXBsb2RlKCIsIiwgJHRtcGEpOw0KCQkJJGNhdHNpbltdID0gIiggQ2F0ZWdvcnkxIE5PVCBJTiAoIiAuJHRoZUNhdHMuICIpIEFORCBDYXRlZ29yeTIgTk9UIElOICgiIC4kdGhlQ2F0cy4gIikgKSI7DQoJCX0NCg0KCQlpZiAoY291bnQoJGNhdHNpbikgPiAwKSB7DQoJCQkkd2hlcmVQYXJ0c1tdID0gIigiIC4gaW1wbG9kZSgiIEFORCAiLCAkY2F0c2luKSAuICIpIjsNCgkJfQ0KDQoJCS8vIGNvbW1lbnRzDQoJCWlmIChpbl9hcnJheSgidHhwX2Rpc2N1c3MiLCRkYlRhYmxlcykpIHsNCgkJCSR3aGVyZVBhcnRzW10gPSAidGV4dHBhdHRlcm4uSUQgPSB0eHBfZGlzY3Vzcy5wYXJlbnRpZCI7DQogICAgICB9DQoJfQ0KDQoJLy8gQ2F0Y2gtYWxsIGZvciB0aGUgd2hlcmUgc3RhdGVtZW50DQoJaWYgKGNvdW50KCR3aGVyZVBhcnRzKSA9PSAwKSB7DQoJCSR3aGVyZSA9ICIxPTEiOw0KCX0gZWxzZSB7DQoJCSR3aGVyZSA9IGltcGxvZGUoIiBBTkQgIiwgJHdoZXJlUGFydHMpOw0KCX0NCg0KCWlmICgkZGVidWcgPiAwKSB7DQoJCWRtcCgkd2hlcmUpOw0KCX0NCg0KCSRvdXQgPSAiIjsNCgkvLyBQZXJmb3JtIHRoZSBzZWFyY2hlcw0KCSRmaW5kZXIgPSBuZXcgc21kX0Z1enp5RmluZCgkc2VhcmNoX3Rlcm0sICR0b2xlcmFuY2UpOw0KCWlmICgkZmluZGVyLT50b29fc2hvcnRfZXJyKSB7DQoJCSRvdXQgLj0gJG5vX21hdGNoX2xhYmVsOw0KCQkkb3V0IC49ICR0b29fc2hvcnRfbGFiZWw7DQoJfSBlbHNlIHsNCgkJJGNvbHMgPSAiKiIgLiAoKGluX2FycmF5KCJ0ZXh0cGF0dGVybiIsICRkYlRhYmxlcykpID8gIiwgdW5peF90aW1lc3RhbXAodGV4dHBhdHRlcm4uUG9zdGVkKSBBUyB1UG9zdGVkIiA6ICIiKTsNCgkJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCRjb2xzLCBpbXBsb2RlKCRkYlRhYmxlcywgIiwgIiksICR3aGVyZSk7DQoJCWlmIChpbl9hcnJheSgidGV4dHBhdHRlcm4iLCRkYlRhYmxlcykpIHsNCgkJCSRvcGZvcm0gPSBmZXRjaF9mb3JtKCRmb3JtKTsNCgkJfQ0KCQkkcGFnZXVybCA9IHNtZF9yZW1vdmVRU1ZhcigkcHJldGV4dFsncmVxdWVzdF91cmknXSwncScpOw0KCQkkYWxsRmllbGRzID0gIiI7DQoJCSRhcnRMaXN0ID0gYXJyYXkoKTsNCgkJJHRlcm1MaXN0ID0gYXJyYXkoKTsNCgkJd2hpbGUoJHJvdyA9IG5leHRSb3coJHJzKSkgew0KCQkJJGFsbEZpZWxkcyA9ICIiOw0KCQkJLy8gSm9pbiBhbGwgdGhlIHJlcXVpcmVkIHBsYWNlcyB0byBsb29rIGludG8gYSBsb25nIHRleHQgYmxvY2sNCgkJCWZvcmVhY2ggKCRkYkZpZWxkIGFzICR0aGVGaWVsZCkgew0KCQkJCSRhbGxGaWVsZHMgLj0gJHJvd1skdGhlRmllbGRdLiIgIjsNCgkJCX0NCgkJCS8vIFJlbW92ZSBiZXR3ZWVuLXdvcmQgcHVuY3R1YXRpb24gYW5kIHJlcGxhY2Ugd2l0aCBzcGFjZQ0KCQkJJGp1c3RDaGFycyA9ICIvW15hLXpBLVowLTlcLVwnIF0rLyI7DQoJCQkkYWxsRmllbGRzID0gcHJlZ19yZXBsYWNlKCRqdXN0Q2hhcnMsICcgJywgJGFsbEZpZWxkcyk7DQoJCQkvLyBTcGxpdCB0aGUgcmVtYWluZGVyIGJ5IChzaW5nbGUgb3IgbXVsdGlwbGUpIHNwYWNlcw0KCQkJJHdlcmRzID0gcHJlZ19zcGxpdCgnL1xzKy8nLCAkYWxsRmllbGRzLCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7DQoJCQkvLyAuLi5hbmQgcmVjb25zdGl0dXRlIHRoZSB1bmlxdWUgd29yZHMgYXMgYSBodWdlIHNwYWNlLWRlbGltaXRlZCBzdHJpbmcNCgkJCSR3ZXJkcyA9IGltcGxvZGUoIiAiLGFycmF5X3VuaXF1ZSgkd2VyZHMpKTsNCgkJCS8vIFRha2UgaW50byBhY2NvdW50IGNhc2Ugc2Vuc2l0aXZpdHkNCgkJCSR3ZXJkcyA9ICgkY2FzZV9zZW5zaXRpdmUpID8gJHdlcmRzIDogc3RydG9sb3dlcigkd2VyZHMpOw0KCQkJaWYgKCRkZWJ1ZyA+IDEpIHsNCgkJCQlkbXAoJHdlcmRzKTsNCgkJCX0NCg0KCQkJLy8gRmluZCBjbG9zZSB3b3JkIG1hdGNoZXMNCgkJCSRtYXRjaGVzID0gJGZpbmRlci0+c2VhcmNoKCR3ZXJkcyk7DQoJCQlpZiAoJGRlYnVnID4gMSkgew0KCQkJCWRtcCgkbWF0Y2hlcyk7DQoJCQl9DQoNCgkJCWlmIChjb3VudCgkbWF0Y2hlcykgPiAwKSB7DQoJCQkJJHNob3J0ZXN0RGlzdCA9IDEwMDsgLy8gQSBzdHVwaWRseSBoaWdoIG51bWJlciB0byBzdGFydCB3aXRoDQoJCQkJJHNob3J0ZXN0TWV0YURpc3QgPSAtMTsNCgkJCQkkY2xvc2VzdFdvcmQgPSAiIjsNCgkJCQkkY2xvc2VzdE1ldGFXb3JkID0gIiI7DQoJCQkJJG1heF90ZXJtX2xlbiA9IDA7DQoJCQkJLy8gQnVpbGQgYSB1bmlxdWUgYXJyYXkgb2YgY2xvc2VzdCBtYXRjaGluZyB3b3Jkcw0KCQkJCXdoaWxlKGxpc3QoJGlkeCwkZGlzdCkgPSBlYWNoKCRtYXRjaGVzKSkgew0KCQkJCQkkdGVybSA9IHNtZF9nZXRXb3JkKCR3ZXJkcywkc2VhcmNoX3Rlcm0sJGlkeCk7DQoNCgkJCQkJLy8gT25seSB3b3JkcyBtZWV0aW5nIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50IG5lZWQgYXBwbHkNCgkJCQkJJG1heF90ZXJtX2xlbiA9IChzdHJsZW4oJHRlcm0pID4gJG1heF90ZXJtX2xlbikgPyBzdHJsZW4oJHRlcm0pIDogJG1heF90ZXJtX2xlbjsNCgkJCQkJaWYgKHN0cmxlbigkdGVybSkgPCAkbWluX3dvcmRfbGVuZ3RoKSB7DQoJCQkJCQljb250aW51ZTsNCgkJCQkJfQ0KCQkJCQkkdGVybSA9ICgkY2FzZV9zZW5zaXRpdmUpID8gJHRlcm0gOiBzdHJ0b2xvd2VyKCR0ZXJtKTsNCgkJCQkJaWYgKCRkZWJ1ZyA+IDIpIHsNCgkJCQkJCWVjaG8gJHRlcm0gLiAiICI7DQoJCQkJCX0NCgkJCQkJaWYgKCRkaXN0IDwgJHNob3J0ZXN0RGlzdCkgew0KCQkJCQkJJHNob3J0ZXN0RGlzdCA9ICRkaXN0Ow0KCQkJCQkJJGNsb3Nlc3RXb3JkID0gJHRlcm07DQoJCQkJCX0NCgkJCQkJaWYgKCRtZXRhX3NlYXJjaCAhPSAiIikgew0KCQkJCQkJJG1ldGFfdGVybSA9IG1ldGFwaG9uZSgkdGVybSk7DQoJCQkJCQlpZiAoJGRlYnVnID4gMikgew0KCQkJCQkJCWVjaG8gJG1ldGFfdGVybSAuICIgOiAiIC4gJG1ldGFfc2VhcmNoIC4iICIubjsNCgkJCQkJCX0NCgkJCQkJCSRsZXZEaXN0ID0gbGV2ZW5zaHRlaW4oJG1ldGFfc2VhcmNoLCAkbWV0YV90ZXJtKTsNCgkJCQkJCWlmICgkbGV2RGlzdCA8PSAkc2hvcnRlc3RNZXRhRGlzdCB8fCAkc2hvcnRlc3RNZXRhRGlzdCA8IDApIHsNCgkJCQkJCQkkc2hvcnRlc3RNZXRhRGlzdCA9ICRsZXZEaXN0Ow0KCQkJCQkJCSRjbG9zZXN0TWV0YVdvcmQgID0gJHRlcm07DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQkJLy8gUGljayB0aGUgb25lIHRoYXQgc291bmRzIGNsb3Nlc3QgdG8gdGhlIG9yaWdpbmFsDQoJCQkJaWYgKHRyaW0oJGNsb3Nlc3RXb3JkKSAhPSAiIikgew0KCQkJCQkkaWR4ID0gbWQ1KCRjbG9zZXN0V29yZCk7DQoJCQkJCSRiZXN0Rml0ID0gJGNsb3Nlc3RXb3JkOw0KCQkJCQkkYmVzdERpc3QgPSAkc2hvcnRlc3REaXN0Ow0KCQkJCQlpZiAoJHNvdW5kX3NlYXJjaCAhPSAiIikgew0KCQkJCQkJJHNvdW5kMSA9IGxldmVuc2h0ZWluKHNvdW5kZXgoJGNsb3Nlc3RXb3JkKSwgJHNvdW5kX3NlYXJjaCk7DQoJCQkJCQkkc291bmQyID0gbGV2ZW5zaHRlaW4oc291bmRleCgkY2xvc2VzdE1ldGFXb3JkKSwgJHNvdW5kX3NlYXJjaCk7DQoJCQkJCQlpZiAoJHNvdW5kMSA+PSAkc291bmQyKSB7DQoJCQkJCQkJJGlkeCA9IG1kNSgkY2xvc2VzdE1ldGFXb3JkKTsNCgkJCQkJCQkkYmVzdEZpdCA9ICRjbG9zZXN0TWV0YVdvcmQ7DQoJCQkJCQkJJGJlc3REaXN0ID0gJHNob3J0ZXN0TWV0YURpc3Q7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJJHdvcmRMaXN0WyRpZHhdID0gJGJlc3RGaXQ7DQoJCQkJCSR3b3JkRGlzdFskaWR4XSA9ICRiZXN0RGlzdDsNCgkJCQl9DQoJCQkJaWYgKCRkZWJ1ZyA+IDIpIHsNCgkJCQkJZG1wKCJCRVNURklUOiIgLiRiZXN0Rml0KTsNCgkJCQl9DQoNCgkJCQkvLyBCdWlsZCBhbiBhcnJheSBvZiB1bmlxdWUgbWF0Y2hpbmcgYXJ0aWNsZXMNCgkJCQlpZiAoJG1heF90ZXJtX2xlbiA+PSAkbWluX3dvcmRfbGVuZ3RoKSB7DQoJCQkJCWlmIChpbl9hcnJheSgidGV4dHBhdHRlcm4iLCAkZGJUYWJsZXMpKSB7DQoJCQkJCQlwb3B1bGF0ZUFydGljbGVEYXRhKCRyb3cpOw0KCQkJCQl9DQoJCQkJCS8vIFRlbXBvcmFyaWx5IGFzc2lnbiB0aGUgY2xvc2VzdCBtYXRjaCB0byB0aGUgcXVlcnkgc3RyaW5nIHNvIHRoYXQNCgkJCQkJLy8gdGhlIHNlYXJjaF9yZXN1bHRfZXhjZXJwdCBjYW4gaGlsaWdodCB0aGUgZm91bmQgd29yZHMNCgkJCQkJJHByZXRleHRbJ3EnXSA9ICR0ZXJtOw0KCQkJCQkkYXJ0TGlzdFtdID0gcGFyc2UoJG9wZm9ybSk7DQoJCQkJCSRwcmV0ZXh0WydxJ10gPSAkc2VhcmNoX3Rlcm07DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCS8vIFNvcnQgdGhlIHdvcmQgbGlzdCBpbiBvcmRlciBvZiByZWxldmFuY2UNCgkJaWYgKGNvdW50KCR3b3JkTGlzdCkgPiAwKSB7DQoJCQlhcnJheV9tdWx0aXNvcnQoJHdvcmREaXN0LCR3b3JkTGlzdCk7DQoJCX0NCg0KCQkvLyBPdXRwdXQgc3R1ZmYgdG8gdGhlIHBhZ2UNCgkJJG91dCAuPSAkbm9fbWF0Y2hfbGFiZWw7DQoJCWlmIChjb3VudCgkd29yZExpc3QpID4gMCkgew0KCQkJJG91dCAuPSAoY291bnQoJHNob3dMaXN0KSA+IDApID8gJHN1Z2dlc3RfbGFiZWwgOiAiIjsNCg0KCQkJaWYgKGluX2FycmF5KCJ3b3JkcyIsICRzaG93WzBdKSkgew0KCQkJCSRjdHIgPSAwOw0KCQkJCWZvcmVhY2ggKCR3b3JkTGlzdCBhcyAkaXRlbSkgew0KCQkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygid29yZHMiLCAkbGltaXRCeSkgJiYgJGN0ciA+ICRsaW1pdEJ5WyJ3b3JkcyJdKSB7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCQkkb3V0IC49ICc8YSBocmVmPSInLnNtZF9hZGRRU1ZhcigkcGFnZXVybCwncScsJGl0ZW0pLiciPicuJGl0ZW0uJzwvYT4nLm47DQoJCQkJCSRjdHIrKzsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoaW5fYXJyYXkoImFydGljbGVzIiwgJHNob3dbMF0pKSB7DQoJCQkJJGN0ciA9IDA7DQoJCQkJZm9yZWFjaCAoJGFydExpc3QgYXMgJGFydCkgew0KCQkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygiYXJ0aWNsZXMiLCAkbGltaXRCeSkgJiYgJGN0ciA+PSAkbGltaXRCeVsiYXJ0aWNsZXMiXSkgew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJJG91dCAuPSAkYXJ0Ow0KCQkJCQkkY3RyKys7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiAkb3V0Ow0KfSI7czo0OiJ0eXBlIjtzOjE6IjAiO3M6MzoibWQ1IjtzOjMyOiJlMjBlNzQ2ZDJmZDRiZjJmZTY3YmUxMWJjMWQxZjM0OSI7fQ==