# smd_fuzzy_find 0.02 # Offers alternative spellings and/or close-matching articles from search terms. # 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: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTQ6InNtZF9mdXp6eV9maW5kIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjY6Imh0dHA6Ly93d3cuc3RlZmRhd3Nvbi5jb20vIjtzOjc6InZlcnNpb24iO3M6NDoiMC4wMiI7czoxMToiZGVzY3JpcHRpb24iO3M6Nzg6Ik9mZmVycyBhbHRlcm5hdGl2ZSBzcGVsbGluZ3MgYW5kL29yIGNsb3NlLW1hdGNoaW5nIGFydGljbGVzIGZyb20gc2VhcmNoIHRlcm1zLiI7czo0OiJoZWxwIjtzOjQ4NDY6IjxoMT5zbWRfZnV6enlfZmluZDwvaDE+DQoNCjxwPkV2ZXIgd2FudGVkIFRYUCdzIHNlYXJjaCBmYWNpbGl0eSB0byBiZSBhIGxpdHRsZSBtb3JlLCB3ZWxsLCBpbmFjY3VyYXRlPyBXYW50IG5vIG1vcmUuIERlZmluZSBob3cgZnV6enkgeW91ciBzZWFyY2ggaXMsIHdoZXJlIHRvIGxvb2sgYW5kIGhvdyBtdWNoIG9mIGEgbnVkZ2UgdG8gb2ZmZXIgeW91ciBzaXRlIHZpc2l0b3JzIHdpdGggcGhhdCBwaGluZ2Vycy48L3A+DQoNCjxwPlJlc3VsdHMgYXJlIG9yZGVyZWQgYnkgYXBwcm94aW1hdGUgcmVsZXZhbmN5IGFuZCBpdCdzIGF1dG9tYXRpY2FsbHkgY29udGV4dC1zZW5zaXRpdmUgYmVjYXVzZSB0aGUgcG9vbCBvZiB3b3JkcyBpdCBjb21wYXJlcyBhZ2FpbnN0IGFyZSBmcm9tIHlvdXIgc2l0ZS4gT24gYSB6b28gd2Vic2l0ZSwgc29tZW9uZSB0eXBpbmcgaW4gImxpbm8iIHdvbid0IGdldCBhcnRpY2xlcyBhYm91dCBmbG9vcmluZyBidXQgbW9yZSBsaWtlbHkgYXJ0aWNsZXMgYWJvdXQgbGlvbnMsIHdoaWNoIGlzIHdoYXQgdGhleSByZWFsbHkgd2FudGVkLiBXZSBob3BlLjwvcD4NCg0KPGgyPlVzYWdlIGF0IGEgZ2xhbmNlPC9oMj4NCjx1bD4NCjxsaT48Yj5zZWFyY2hfdGVybTwvYj4NCjxiciAvPldoYXQgeW91IHdvdWxkIGxpa2UgdG8gc2VhcmNoIGZvcjogZWl0aGVyIGEgZml4ZWQgc3RyaW5nIChyYXRoZXIgcG9pbnRsZXNzISkgb3IgIj9xIiAodGhlIGRlZmF1bHQpLiBNYXliZSBpbiBmdXR1cmUgb3RoZXIgdGhpbmdzIGxpa2UgP2N1c3RvbV9maWVsZCBzbyB5b3UgY2FuIGVtYmVkIHRoaXMgaW4gYW4gYXJ0aWNsZSBhbmQgZG8gcHN1ZWRvLXJlbGF0ZWQtYXJ0aWNsZSBzZWFyY2hlczwvbGk+DQo8bGk+PGI+bWF0Y2hfd2l0aDwvYj4NCjxiciAvPldoZXJlIHlvdSB3b3VsZCBsaWtlIHRvIGxvb2sgZm9yIGEgbWF0Y2ggKGkuZS4gd2hpY2ggYXJ0aWNsZSBmaWVsZHMpLiBEZWZpbmUgdGhlIG9iamVjdCB5b3Ugd2FudCB0byBsb29rIGluIChjdXJyZW50bHkgb25seSBhcnRpY2xlIGlzIHN1cHBvcnRlZCkgZm9sbG93ZWQgYnkgYSBjb2xvbiwgdGhlbiBhIHNlbWktY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgcGxhY2VzIHRvIGxvb2s6IDxjb2RlPm1hdGNoX3dpdGg9ImFydGljbGU6a2V5d29yZHM7Ym9keTtleGNlcnB0IjwvY29kZT4uIE9wdGlvbnMgYXJlIGtleXdvcmRzLCBib2R5LCBleGNlcnB0LCBjYXRlZ29yeTEsIGNhdGVnb3J5Miwgc2VjdGlvbiwgaWQsIGF1dGhvcmlkLCB0aXRsZSAoY29taW5nIHNvb246IGN1c3RvbSBmaWVsZHMgYW5kIGltYWdlIHNlYXJjaGluZykuIERlZmF1bHQgaXMgYXJ0aWNsZTprZXl3b3Jkcztib2R5O2V4Y2VycHQ7PC9saT4NCjxsaT48Yj5zaG93PC9iPg0KPGJyIC8+V2hhdCB0byBkaXNwbGF5OiB3aGV0aGVyIHRvIGxpc3QgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgYXJ0aWNsZXMsIGNsb3Nlc3QgbWF0Y2hpbmcgc2VhcmNoIHRlcm1zLCBvciBib3RoLiBDaG9pY2VzIGFyZSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGVpdGhlciA8Y29kZT5hcnRpY2xlczwvY29kZT4gb3IgPGNvZGU+d29yZHM8L2NvZGU+LiBEZWZhdWx0OiAid29yZHMsIGFydGljbGVzIjwvbGk+DQo8bGk+PGI+c2VjdGlvbjwvYj4NCjxiciAvPkxpbWl0IHlvdXIgc2VhcmNoIHJlc3VsdHMgdG8gYSBwYXJ0aWN1bGFyIHNlY3Rpb24gb3IgdGhyZWU7IGdpdmUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gRGVmYXVsdDogZW1wdHkgKHRoZSB3aG9sZSBzaXRlKS4gQ29taW5nIHNvb246IChtYXliZSkgY2F0ZWdvcmllcy48L2xpPg0KPGxpPjxiPnRvbGVyYW5jZTwvYj4NCjxiciAvPkhvdyBmdXp6eSB0aGUgc2VhcmNoIGlzIGFuZCBob3cgbG9uZyB0aGUgbWluaW11bSBzZWFyY2ggdGVybSBpcyBhbGxvd2VkIHRvIGJlLiBBbiBpbnRlZ2VyIGZyb20gMCAodmVyeSBjbG9zZSBtYXRjaCwgYWxsb3dzIHNob3J0IHNlYXJjaCB3b3JkcykgdG8gNSAocHJldHR5IG11Y2ggbm90aGluZyBsaWtlIHdoYXQgeW91IHNlYXJjaGVkIGZvciBhbmQgc2VhcmNoIHdvcmRzIG11c3QgdGhlbiBiZSBsb25nZXIsIHJvdWdobHkgPjcgY2hhcmFjdGVyKS4gUHJhY3RpY2FsIHZhbHVlcyBhcmUgdXN1YWxseSAwLCAxLCAyICh0aGUgZGVmYXVsdCksIG9yIHBvc3NpYmx5IDMuPC9saT4NCjxsaT48Yj5jYXNlX3NlbnNpdGl2ZTwvYj4NCjxiciAvPkRvZXMgd2hhdCBpdCBzYXlzIG9uIHRoZSB0aW4uIDE9Y2FzZSBzZW5zaXRpdmUgc2VhcmNoLCAwPW5vdC4gRGVmYXVsdDogMDwvbGk+DQo8bGk+PGI+bWluX3dvcmRfbGVuZ3RoPC9iPg0KPGJyIC8+VGhlIG1pbmltdW0gd29yZCBsZW5ndGggeW91IHdhbnQgcmV0dXJuaW5nLiBEZWZhdWx0OiA0PC9saT4NCjxsaT48Yj5saW1pdDwvYj4NCjxiciAvPlRoZSBtYXhpbXVtIG51bWJlciBvZiB3b3JkcyBhbmQvb3IgYXJ0aWNsZXMgdG8gZGlzcGxheS4gR2l2ZSBpdCBhIHNpbmdsZSBpbnRlZ2VyIGFuZCBpdCBsaW1pdHMgYm90aCB0byB0aGUgc2FtZSB2YWx1ZS4gU3BlY2lmeWluZyA8Y29kZT5hcnRpY2xlczo1PC9jb2RlPiB3b3VsZCByZW1vdmUgYW55IGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgYWx0ZXJuYXRpdmUgc2VhcmNoIHdvcmRzIG9mZmVyZWQgYnV0IHdvdWxkIGxpbWl0IHRoZSBhcnRpY2xlcyB0byBhIG1heGltdW0gb2YgNS4gU2ltaWxhcmx5LCA8Y29kZT53b3Jkczo0PC9jb2RlPiB3b3VsZCByZW1vdmUgdGhlIGFydGljbGUgbGltaXQgYW5kIG9ubHkgc2hvdyBhIG1heGltdW0gb2YgNCBhbHRlcm5hdGl2ZSB3b3Jkcy4gQm90aCBvZiB0aGVzZSBhcmUgc3ViamVjdCB0byB0aGVpciByZXNwZWN0aXZlICJzaG93IiBvcHRpb25zIGJlaW5nIHNldCBvZiBjb3Vyc2UuIERlZmF1bHQ6IDxjb2RlPndvcmRzOjUsIGFydGljbGVzOjEwPC9jb2RlPjwvbGk+DQo8bGk+PGI+Zm9ybTwvYj4NCjxiciAvPlRoZSBUWFAgZm9ybSB0byBvdXRwdXQgdGhlIGxpc3Qgb2YgYXJ0aWNsZXMgaW4uIERlZmF1bHQ6IHNlYXJjaF9yZXN1bHRzLiBOb3RlIHRoYXQgYmVjYXVzZSB0aGUgbWF0Y2hlcyBtYXkgbm90IGNvbnRhaW4gZXhhY3Qgc2VhcmNoIHRlcm1zLCB0aGUgJ2V4Y2VycHQnIHBhcnQgb2Ygc2VhcmNoX3Jlc3VsdHMgd2l0aCB0aGUgaGlnaGxpZ2h0ZWQgbWF0Y2hlcyBpcyB1c3VhbGx5IG5vdCBkaXNwbGF5ZWQhPC9saT4NCjxsaT48Yj5ub19tYXRjaF9sYWJlbDwvYj4NCjxiciAvPlRoZSBwaHJhc2UgdG8gZGlzcGxheSB3aGVuIG5vIG1hdGNoZXMgKG1heWJlIG5vdCBldmVuIGZ1enp5IG9uZXMhKSBhcmUgZm91bmQuIERlZmF1bHRzIHRvIHRoZSBNTFAgc3RyaW5nICdub19tYXRjaCcuIFVzZSA8Y29kZT5ub19tYXRjaF9sYWJlbD0iIjwvY29kZT4gdG8gdHVybiBpdCBvZmYuPC9saT4NCjxsaT48Yj5zdWdnZXN0X2xhYmVsPC9iPg0KPGJyIC8+VGhlIHBocmFzZSB0byBkaXNwbGF5IGltbWVkaWF0ZWx5IHByaW9yIHRvIHNob3dpbmcgY2xvc2UtbWF0Y2hpbmcgYXJ0aWNsZXMvd29yZHMuIERlZmF1bHRzIHRvIHRoZSBNTFAgc3RyaW5nICdzdWdnZXN0Jy4gVXNlIDxjb2RlPnN1Z2dlc3RfbGFiZWw9IiI8L2NvZGU+IHRvIHN3aXRjaCBpdCBvZmYuPC9saT4NCjxsaT48Yj50b29fc2hvcnRfbGFiZWw8L2I+DQo8YnIgLz5TZWFyY2hlcyBvZiB1bmRlciBhYm91dCAzIGNoYXJhY3RlcnMgKHNvbWV0aW1lcyBtb3JlIGRlcGVuZGluZyBvbiB5b3VyIGNvbnRlbnQpIGFyZSB0b28gc2hvcnQgZm9yIGFueSByZWFzb25hYmxlIGZ1enppbmVzcyB0byBiZSBhcHBsaWVkLiBUaGlzIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIHRoYXQgY2lyY3Vtc3RhbmNlLiBEZWZhdWx0cyB0byB0aGUgTUxQIHN0cmluZyB0b29fc2hvcnQuIFVzZSA8Y29kZT50b29fc2hvcnRfbGFiZWw9IiI8L2NvZGU+IHRvIHN3aXRjaCBpdCBvZmYuPC9saT4NCjwvdWw+DQo8cD5Db21pbmcgc29vbjogY2xhc3Mgb3B0aW9ucywgaW1hZ2Ugc3VwcG9ydCAod2l0aCBsdWNrKSBhbmQgYSBmZXcgb3RoZXIgZW5oYW5jZW1lbnRzLCBtYXliZSBjaGFuZ2VzIHRvIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGFsZ29yaXRobSBpZiBhbnlvbmUgd2FudHMgdG8gaGVscC4gUHJldHR5IHBsZWFzZT8hPC9wPg0KDQo8aDI+RXhhbXBsZSB1c2FnZTwvaDI+DQoNCjxwPlNpbmNlIGl0J3Mgbm90IG5lY2Vzc2FyaWx5IGEgZGlyZWN0IHJlcGxhY2VtZW50IGZvciB0aGUgYnVpbHQtaW4gc2VhcmNoICh0aG91Z2ggaXQgc29ydCBvZiBjYW4gYmUpIHRoZSBiZXN0IHdheSB0byB1c2UgaXQgaXMgaW4gY29uanVuY3Rpb24gd2l0aCA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MTQxNjMiPmNoaF9pZl9kYXRhPC9hPiBpbiBhIHBhZ2UgbGlrZSB0aGlzOjwvcD4NCg0KPHByZT4NCiZsdDt0eHA6aWZfc2VhcmNoJmd0Ow0KICAmbHQ7dHhwOmNoaF9pZl9kYXRhJmd0Ow0KICAgICZsdDtkbCBjbGFzcz0iZXhjZXJwdHMiJmd0Ow0KICAgICAgJmx0O3R4cDphcnRpY2xlIGxpbWl0PSI4IiBsaXN0Zm9ybT0iZXhjZXJwdHMiIC8mZ3Q7DQogICAgJmx0Oy9kbCZndDsNCiAgJmx0O3R4cDplbHNlIC8mZ3Q7DQogICAgJmx0O2RsIGNsYXNzPSJleGNlcnB0cyImZ3Q7DQogICAgICAmbHQ7dHhwOnNtZF9mdXp6eV9maW5kIGZvcm09ImV4Y2VycHRzIiAvJmd0Ow0KICAgICZsdDsvZGwmZ3Q7DQogICZsdDsvdHhwOmNoaF9pZl9kYXRhJmd0Ow0KJmx0Oy90eHA6aWZfc2VhcmNoJmd0Ow0KPC9wcmU+DQoNClNvIGluIHRoZSBjYXNlIGFuIGV4YWN0IHRlcm0gaXMgZm91bmQsIHRoZSBub3JtYWwgVFhQIHNlYXJjaCBpcyBjYWxsZWQuIElmIGFuIGV4YWN0IHNlYXJjaCB0ZXJtIGlzIG5vdCBmb3VuZCwgbGV0IHNtZF9mdXp6eV9maW5kIGhhdmUgYSBnby4iO3M6NDoiY29kZSI7czo5MDgwOiIvLyB2MC4wMSAgIEluaXRpYWwgcHVibGljIGJldGENCi8vIHYwLjAyICAgRml4ZWQgY2FzZSBzZW5zaXRpdml0eS4gU3BlZCB1cCBhbmQgaW1wcm92ZWQgd29yZGxpc3QgZ2VuZXJhdGlvbi4gQWRkZWQgcmVmaW5lIGF0dHJpYnV0ZSB0byBzd2l0Y2ggb2ZmIHNvdW5kZXgvbWV0YXBob25lIGlmIHJlcXVpcmVkDQoNCnJlcXVpcmVfcGx1Z2luKCdzbWRfbGliJyk7DQpnbG9iYWwgJHNtZF9mdXp6TGFuZzsNCg0KJHNtZF9mdXp6X3N0ciA9IGFycmF5KA0KCSd0b29fc2hvcnQnID0+ICdUaGUgdGV4dCB5b3UgYXJlIHNlYXJjaGluZyBmb3IgaXMgcHJvYmFibHkgdG9vIHNob3J0LiBUcnkgYSBsb25nZXIgd29yZC4gJywNCgknbm9fbWF0Y2gnID0+ICdTb3JyeSwgbm8gcmVzdWx0cyBtYXRjaGVkICJ7c2VhcmNoX3Rlcm19IiBleGFjdGx5LiAnLA0KCSdzdWdnZXN0JyA9PiAnSGVyZSBhcmUgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcge3RoaW5naWVzfSB0aGF0IG1heSBoZWxwIHlvdSBmaW5kIHdoYXQgeW91IGFyZSBsb29raW5nIGZvcjogJywNCgknc3VnZ2VzdF9qb2luJyA9PiAnYW5kJywNCgknYXJ0aWNsZXMnID0+ICdhcnRpY2xlcycsDQoJJ3dvcmRzJyA9PiAnd29yZHMnLA0KKTsNCiRzbWRfZnV6ekxhbmcgPSBuZXcgc21kX01MUCgnc21kX2Z1enp5X2ZpbmQnLCAnc21kX2Z1enonLCAkc21kX2Z1enpfc3RyKTsNCg0KZnVuY3Rpb24gc21kX2Z1enp5X2ZpbmQoJGF0dHMsICR0aGluZz0nJykgew0KCWdsb2JhbCAkcHJldGV4dDsNCglnbG9iYWwgJHNtZF9mdXp6TGFuZzsNCg0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdmb3JtJyA9PiAnc2VhcmNoX3Jlc3VsdHMnLA0KCQknc2VjdGlvbicgPT4gJycsDQoJCSdzdWJjYXRzJyA9PiAnMCcsDQoJCSdzZWFyY2hfdGVybScgPT4gJz9xJywNCgkJJ21hdGNoX3dpdGgnID0+ICdhcnRpY2xlOmtleXdvcmRzO2JvZHk7ZXhjZXJwdCcsDQoJCSd0b2xlcmFuY2UnID0+ICcyJywNCgkJJ21pbl93b3JkX2xlbmd0aCcgPT4gJzQnLA0KCQknbGltaXQnID0+ICd3b3Jkczo1LCBhcnRpY2xlczoxMCcsDQoJCSdjYXNlX3NlbnNpdGl2ZScgPT4gJzAnLA0KCQkncmVmaW5lJyA9PiAnbWV0YXBob25lLCBzb3VuZGV4JywNCgkJJ3Nob3cnID0+ICd3b3JkcywgYXJ0aWNsZXMnLA0KCQknbm9fbWF0Y2hfbGFiZWwnID0+ICcjJywNCgkJJ3N1Z2dlc3RfbGFiZWwnID0+ICcjJywNCgkJJ3Rvb19zaG9ydF9sYWJlbCcgPT4gJyMnLA0KCSksICRhdHRzKSk7DQoNCgkkc2VhcmNoQWxsb3cgPSBhcnJheSgiP2MiLCAiIWMiLCAiP3MiLCAiIXMiLCAiP3QiLCAiIXQiLCAiP2lkIiwgIiFpZCIsICI/cSIsICIhcSIsICI/ZmllbGQiLCAiIWZpZWxkIik7DQoJJHJlZmluZUFsbG93ID0gYXJyYXkoIm1ldGFwaG9uZSIsICJzb3VuZGV4Iik7DQoJJHNob3dBbGxvdyA9IGFycmF5KCJhcnRpY2xlcyIsICJ3b3JkcyIpOw0KCSRjb2xOYW1lcyA9IGFycmF5KCdLZXl3b3JkcycgPT4gImFydGljbGU6a2V5d29yZHMiLA0KCQkJCQkJCSdCb2R5JyA9PiAiYXJ0aWNsZTpib2R5IiwNCgkJCQkJCQknRXhjZXJwdCcgPT4gImFydGljbGU6ZXhjZXJwdCIsDQoJCQkJCQkJJ0NhdGVnb3J5MScgPT4gImFydGljbGU6Y2F0ZWdvcnkxIiwNCgkJCQkJCQknQ2F0ZWdvcnkyJyA9PiAiYXJ0aWNsZTpjYXRlZ29yeTIiLA0KCQkJCQkJCSdTZWN0aW9uJyA9PiAiYXJ0aWNsZTpzZWN0aW9uIiwNCgkJCQkJCQknSUQnID0+ICJhcnRpY2xlOmlkIiwNCgkJCQkJCQknQXV0aG9ySUQnID0+ICJhcnRpY2xlOmF1dGhvcmlkIiwNCgkJCQkJCQknVGl0bGUnID0+ICJhcnRpY2xlOnRpdGxlIiwNCgkJCQkJCQknY2F0ZWdvcnknID0+ICJpbWFnZTpjYXRlZ29yeSIsDQoJCQkJCQkJJ2FsdCcgPT4gImltYWdlOmFsdCIsDQoJCQkJCQkJJ2NhcHRpb24nID0+ICJpbWFnZTpjYXB0aW9uIiwNCgkJCQkJCQknbmFtZScgPT4gImltYWdlOm5hbWUiKTsNCg0KCSRwbGFjZXMgPSBhcnJheSgndGV4dHBhdHRlcm4nID0+ICJhcnRpY2xlIiwgJ3R4cF9pbWFnZScgPT4gImltYWdlIik7DQoJJHNlY3NpbiA9IGFycmF5KCk7DQoJJGNhdHNpbiA9IGFycmF5KCk7DQoJJGZ1bGxTZWNMaXN0ID0gYXJyYXkoKTsNCgkkbm90U2VjTGlzdCA9IGFycmF5KCk7DQoJJGRiRmllbGQgPSBhcnJheSgpOw0KDQoJLy8gRXhwYW5kIHRoZSBhcmdzIGluIGNhc2UgdGhleSdyZSA/IG9yICEgc2hvcnRjdXRzLCBhbmQgZG8gc29tZSB2YWxpZGl0eSBjaGVja2luZw0KCSRsb29raW4gPSBzbWRfc3BsaXRSYW5nZSgkbWF0Y2hfd2l0aCwgIjoiKTsNCgkkZGJUYWJsZSA9IGFycmF5X3NlYXJjaCgkbG9va2luWzBdLCAkcGxhY2VzKTsNCgkkZGJUYWJsZSA9ICgkZGJUYWJsZSA9PSAiIikgPyAiYXJ0aWNsZSIgOiAkZGJUYWJsZTsNCgkkaXNBcnRpY2xlID0gKCRsb29raW5bMF0gPT0gImFydGljbGUiKSA/IHRydWUgOiBmYWxzZTsNCgkkcmVmaW5lID0gc21kX2dldEF0dHMoJHJlZmluZSwgYXJyYXkoKSk7DQoJJHJlZmluZSA9ICRyZWZpbmVbMF07DQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRyZWZpbmUpOyAkaWR4KyspIHsNCgkJaWYgKGluX2FycmF5KCRyZWZpbmVbJGlkeF0sICRyZWZpbmVBbGxvdykpIHsNCgkJCSRyZWZpbmVMaXN0WyRpZHhdID0gJHJlZmluZVskaWR4XTsNCgkJfQ0KCX0NCgkkZGJGaWVsZHMgPSBzbWRfc3BsaXRSYW5nZSgkbG9va2luWzFdLCI7Iik7DQoJZm9yZWFjaCAoJGRiRmllbGRzIGFzICRsb29rRmllbGQpIHsNCgkJJGRiRmllbGRbXSA9IGFycmF5X3NlYXJjaCgkbG9va2luWzBdLiI6Ii4kbG9va0ZpZWxkLCAkY29sTmFtZXMpOw0KCX0NCg0KCSRzZWFyY2hfdGVybSA9IHNtZF9nZXRBdHRzKCRzZWFyY2hfdGVybSwkc2VhcmNoQWxsb3cpOw0KCSRzZWFyY2hfdGVybSA9ICRzZWFyY2hfdGVybVswXVswXTsNCgkkbWV0YV9zZWFyY2ggPSAoaW5fYXJyYXkoIm1ldGFwaG9uZSIsICRyZWZpbmVMaXN0KSkgPyBtZXRhcGhvbmUoJHNlYXJjaF90ZXJtKSA6ICIiOw0KCSRzb3VuZF9zZWFyY2ggPSAoaW5fYXJyYXkoInNvdW5kZXgiLCAkcmVmaW5lTGlzdCkpID8gc291bmRleCgkc2VhcmNoX3Rlcm0pIDogIiI7DQoJJHRvbGVyYW5jZSA9IGludHZhbCgkdG9sZXJhbmNlKTsNCgkkc2hvdyA9IHNtZF9nZXRBdHRzKCRzaG93LCBhcnJheSgpKTsNCgkkc2hvd0xpc3QgPSAkc2hvd1swXTsNCglmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHNob3dMaXN0KTsgJGlkeCsrKSB7DQoJCWlmIChpbl9hcnJheSgkc2hvd0xpc3RbJGlkeF0sICRzaG93QWxsb3cpKSB7DQoJCQkkc2hvd0xpc3RbJGlkeF0gPSAkc21kX2Z1enpMYW5nLT5nVHh0KCRzaG93TGlzdFskaWR4XSk7DQoJCX0NCgl9DQoJJGxpbWl0QnkgPSBhcnJheSgpOw0KCSRsaW1pdCA9IHNtZF9nZXRBdHRzKCRsaW1pdCwgYXJyYXkoKSk7DQoJZm9yZWFjaCAoJGxpbWl0WzBdIGFzICRsaW1PcHRpb24pIHsNCgkJaWYgKGlzX251bWVyaWMoJGxpbU9wdGlvbikpIHsNCgkJCSRsaW1pdEJ5WyJhcnRpY2xlcyJdID0gJGxpbU9wdGlvbjsNCgkJCSRsaW1pdEJ5WyJ3b3JkcyJdID0gJGxpbU9wdGlvbjsNCgkJfSBlbHNlIHsNCgkJCSRsaW1zcGxpdCA9IHNtZF9zcGxpdFJhbmdlKCRsaW1PcHRpb24sICI6Iik7DQoJCQlpZiAoKGNvdW50KCRsaW1zcGxpdCkgPT0gMikgJiYgKGluX2FycmF5KCRsaW1zcGxpdFswXSwgJHNob3dBbGxvdykpICYmIChpc19udW1lcmljKCRsaW1zcGxpdFsxXSkpKSB7DQoJCQkJJGxpbWl0QnlbJGxpbXNwbGl0WzBdXSA9ICRsaW1zcGxpdFsxXTsNCgkJCX0NCgkJfQ0KCX0NCg0KCSR0aGluZ2llcyA9IGltcGxvZGUoIiAiLiRzbWRfZnV6ekxhbmctPmdUeHQoJ3N1Z2dlc3Rfam9pbicpLiIgIiwgJHNob3dMaXN0KTsNCgkkbm9fbWF0Y2hfbGFiZWwgPSAoJG5vX21hdGNoX2xhYmVsID09ICIjIikgPyAkc21kX2Z1enpMYW5nLT5nVHh0KCdub19tYXRjaCcsIGFycmF5KCJ7c2VhcmNoX3Rlcm19IiA9PiAkc2VhcmNoX3Rlcm0pKSA6ICRub19tYXRjaF9sYWJlbDsNCgkkc3VnZ2VzdF9sYWJlbCA9ICgkc3VnZ2VzdF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFuZy0+Z1R4dCgnc3VnZ2VzdCcsIGFycmF5KCJ7dGhpbmdpZXN9IiA9PiAkdGhpbmdpZXMpKSA6ICRzdWdnZXN0X2xhYmVsOw0KCSR0b29fc2hvcnRfbGFiZWwgPSAoJHRvb19zaG9ydF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFuZy0+Z1R4dCgndG9vX3Nob3J0JykgOiAkdG9vX3Nob3J0X2xhYmVsOw0KDQoJJHNlY3Rpb25zID0gc21kX2dldEF0dHMoJHNlY3Rpb24sYXJyYXkoIj9zIiwgIiFzIiwgIj9maWVsZCIsICIhZmllbGQiKSk7DQoJJGZ1bGxTZWNMaXN0ID0gJHNlY3Rpb25zWzBdOw0KCSRub3RTZWNMaXN0ID0gJHNlY3Rpb25zWzFdOw0KCSR3aGVyZSA9ICIiOw0KDQoJLy8gaW5jbHVkZWQgc2VjdGlvbnMNCglpZiAoJGlzQXJ0aWNsZSkgew0KCQkkdG1wYSA9IGFycmF5KCk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkZnVsbFNlY0xpc3QpOyAkaWR4KyspIHsNCgkJCSR0bXBhW10gPSAiJyIgLiRmdWxsU2VjTGlzdFskaWR4XS4gIiciOw0KCQl9DQoJCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCQkkc2Vjc2luW10gPSAic2VjdGlvbiBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCQl9DQoNCgkJLy8gZXhjbHVkZWQgc2VjdGlvbnMNCgkJJHRtcGEgPSBhcnJheSgpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJG5vdFNlY0xpc3QpOyAkaWR4KyspIHsNCgkJCSR0bXBhW10gPSAiJyIgLiRub3RTZWNMaXN0WyRpZHhdLiAiJyI7DQoJCX0NCgkJaWYgKGNvdW50KCR0bXBhKSA+IDApIHsNCgkJCSRzZWNzaW5bXSA9ICJzZWN0aW9uIE5PVCBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCQl9DQoNCgkJaWYgKGNvdW50KCRzZWNzaW4pID4gMCkgew0KCQkJJHdoZXJlIC49ICIoIiAuIGltcGxvZGUoIiBPUiAiLCAkc2Vjc2luKSAuICIpIjsNCgkJfSBlbHNlIHsNCgkJCSR3aGVyZSAuPSAiIjsNCgkJfQ0KCX0NCg0KCS8vIENhdGNoLWFsbCBmb3IgdGhlIHdoZXJlIHN0YXRlbWVudA0KCWlmICgkd2hlcmUgPT0gIiIpIHsNCgkJJHdoZXJlID0gIjE9MSI7DQoJfQ0KDQoJJG91dCA9ICIiOw0KCS8vIFBlcmZvcm0gdGhlIHNlYXJjaGVzDQoJJGZpbmRlciA9IG5ldyBzbWRfRnV6enlGaW5kKCRzZWFyY2hfdGVybSwgJHRvbGVyYW5jZSk7DQoJaWYgKCRmaW5kZXItPnRvb19zaG9ydF9lcnIpIHsNCgkJJG91dCAuPSAkbm9fbWF0Y2hfbGFiZWw7DQoJCSRvdXQgLj0gJHRvb19zaG9ydF9sYWJlbDsNCgl9IGVsc2Ugew0KCQkkY29scyA9ICIqIiAuICgoJGlzQXJ0aWNsZSkgPyAiLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIEFTIHVQb3N0ZWQiIDogIiIpOw0KCQkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoJGNvbHMsICRkYlRhYmxlLCAkd2hlcmUpOw0KCQkkb3Bmb3JtID0gIiI7DQoNCgkJaWYgKCRpc0FydGljbGUpIHsNCgkJCSRvcGZvcm0gPSBmZXRjaF9mb3JtKCRmb3JtKTsNCgkJfQ0KCQkkcGFnZXVybCA9IHNtZF9yZW1vdmVRU1ZhcigkcHJldGV4dFsncmVxdWVzdF91cmknXSwncScpOw0KCQkkYWxsRmllbGRzID0gIiI7DQoJCSRhcnRMaXN0ID0gYXJyYXkoKTsNCgkJJHRlcm1MaXN0ID0gYXJyYXkoKTsNCgkJd2hpbGUoJHJvdyA9IG5leHRSb3coJHJzKSkgew0KCQkJJGFsbEZpZWxkcyA9ICIiOw0KCQkJLy8gSm9pbiBhbGwgdGhlIHJlcXVpcmVkIHBsYWNlcyB0byBsb29rIGludG8gYSBsb25nIHRleHQgYmxvY2sNCgkJCWZvcmVhY2ggKCRkYkZpZWxkIGFzICR0aGVGaWVsZCkgew0KCQkJCSRhbGxGaWVsZHMgLj0gJHJvd1skdGhlRmllbGRdLiIgIjsNCgkJCX0NCgkJCS8vIFJlbW92ZSBiZXR3ZWVuLXdvcmQgcHVuY3R1YXRpb24gYW5kIHJlcGxhY2Ugd2l0aCBzcGFjZQ0KCQkJJGp1c3RDaGFycyA9ICIvW15hLXpBLVowLTlcLVwnIF0rLyI7DQoJCQkkYWxsRmllbGRzID0gcHJlZ19yZXBsYWNlKCRqdXN0Q2hhcnMsICcgJywgJGFsbEZpZWxkcyk7DQoJCQkvLyBTcGxpdCB0aGUgcmVtYWluZGVyIGJ5IChzaW5nbGUgb3IgbXVsdGlwbGUpIHNwYWNlcw0KCQkJJHdlcmRzID0gcHJlZ19zcGxpdCgnL1xzKy8nLCAkYWxsRmllbGRzLCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7DQoJCQkvLyAuLi5hbmQgcmVjb25zdGl0dXRlIHRoZSB1bmlxdWUgd29yZHMgYXMgYSBodWdlIHNwYWNlLWRlbGltaXRlZCBzdHJpbmcNCgkJCSR3ZXJkcyA9IGltcGxvZGUoIiAiLGFycmF5X3VuaXF1ZSgkd2VyZHMpKTsNCgkJCS8vIFRha2UgaW50byBhY2NvdW50IGNhc2Ugc2Vuc2l0aXZpdHkNCgkJCSR3ZXJkcyA9ICgkY2FzZV9zZW5zaXRpdmUpID8gJHdlcmRzIDogc3RydG9sb3dlcigkd2VyZHMpOw0KDQoJCQkvLyBGaW5kIGNsb3NlIHdvcmQgbWF0Y2hlcw0KCQkJJG1hdGNoZXMgPSAkZmluZGVyLT5zZWFyY2goJHdlcmRzKTsNCgkJCWlmIChjb3VudCgkbWF0Y2hlcykgPiAwKSB7DQoJCQkJJHNob3J0ZXN0RGlzdCA9IDEwMDsgLy8gQSBzdHVwaWRseSBoaWdoIG51bWJlciB0byBzdGFydCB3aXRoDQoJCQkJJHNob3J0ZXN0TWV0YURpc3QgPSAtMTsNCgkJCQkkY2xvc2VzdFdvcmQgPSAiIjsNCgkJCQkkY2xvc2VzdE1ldGFXb3JkID0gIiI7DQoJCQkJJG1heF90ZXJtX2xlbiA9IDA7DQoJCQkJLy8gQnVpbGQgYSB1bmlxZSBhcnJheSBvZiBjbG9zZXN0IG1hdGNoaW5nIHdvcmRzDQoJCQkJd2hpbGUobGlzdCgkaWR4LCRkaXN0KSA9IGVhY2goJG1hdGNoZXMpKSB7DQoJCQkJCSR0ZXJtID0gc21kX2dldFdvcmQoJHdlcmRzLCRpZHgpOw0KDQoJCQkJCS8vIE9ubHkgd29yZHMgbWVldGluZyB0aGUgbWluaW11bSByZXF1aXJlbWVudCBuZWVkIGFwcGx5DQoJCQkJCSRtYXhfdGVybV9sZW4gPSAoc3RybGVuKCR0ZXJtKSA+ICRtYXhfdGVybV9sZW4pID8gc3RybGVuKCR0ZXJtKSA6ICRtYXhfdGVybV9sZW47DQoJCQkJCWlmIChzdHJsZW4oJHRlcm0pIDwgJG1pbl93b3JkX2xlbmd0aCkgew0KCQkJCQkJY29udGludWU7DQoJCQkJCX0NCgkJCQkJJHRlcm0gPSAoJGNhc2Vfc2Vuc2l0aXZlKSA/ICR0ZXJtIDogc3RydG9sb3dlcigkdGVybSk7DQoJCQkJCWlmICgkZGlzdCA8ICRzaG9ydGVzdERpc3QpIHsNCgkJCQkJCSRzaG9ydGVzdERpc3QgPSAkZGlzdDsNCgkJCQkJCSRjbG9zZXN0V29yZCA9ICR0ZXJtOw0KCQkJCQl9DQoJCQkJCWlmICgkbWV0YV9zZWFyY2ggIT0gIiIpIHsNCgkJCQkJCSRtZXRhX3Rlcm0gPSBtZXRhcGhvbmUoJHRlcm0pOw0KCQkJCQkJJGxldkRpc3QgPSBsZXZlbnNodGVpbigkbWV0YV9zZWFyY2gsICRtZXRhX3Rlcm0pOw0KCQkJCQkJaWYgKCRsZXZEaXN0IDw9ICRzaG9ydGVzdE1ldGFEaXN0IHx8ICRzaG9ydGVzdE1ldGFEaXN0IDwgMCkgew0KCQkJCQkJCSRzaG9ydGVzdE1ldGFEaXN0ID0gJGxldkRpc3Q7DQoJCQkJCQkJJGNsb3Nlc3RNZXRhV29yZCAgPSAkdGVybTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCQkvLyBQaWNrIHRoZSBvbmUgdGhhdCBzb3VuZHMgY2xvc2VzdCB0byB0aGUgb3JpZ2luYWwNCgkJCQlpZiAodHJpbSgkY2xvc2VzdFdvcmQpICE9ICIiKSB7DQoJCQkJCSRpZHggPSBtZDUoJGNsb3Nlc3RXb3JkKTsNCgkJCQkJJGJlc3RGaXQgPSAkY2xvc2VzdFdvcmQ7DQoJCQkJCSRiZXN0RGlzdCA9ICRzaG9ydGVzdERpc3Q7DQoJCQkJCWlmICgkc291bmRfc2VhcmNoICE9ICIiKSB7DQoJCQkJCQkkc291bmQxID0gbGV2ZW5zaHRlaW4oc291bmRleCgkY2xvc2VzdFdvcmQpLCAkc291bmRfc2VhcmNoKTsNCgkJCQkJCSRzb3VuZDIgPSBsZXZlbnNodGVpbihzb3VuZGV4KCRjbG9zZXN0TWV0YVdvcmQpLCAkc291bmRfc2VhcmNoKTsNCgkJCQkJCWlmICgkc291bmQxID49ICRzb3VuZDIpIHsNCgkJCQkJCQkkaWR4ID0gbWQ1KCRjbG9zZXN0TWV0YVdvcmQpOw0KCQkJCQkJCSRiZXN0Rml0ID0gJGNsb3Nlc3RNZXRhV29yZDsNCgkJCQkJCQkkYmVzdERpc3QgPSAkc2hvcnRlc3RNZXRhRGlzdDsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQkkd29yZExpc3RbJGlkeF0gPSAkYmVzdEZpdDsNCgkJCQkJJHdvcmREaXN0WyRpZHhdID0gJGJlc3REaXN0Ow0KCQkJCX0NCgkJCQkvLyBCdWlsZCBhbiBhcnJheSBvZiB1bmlxdWUgbWF0Y2hpbmcgYXJ0aWNsZXMNCgkJCQlpZiAoJG1heF90ZXJtX2xlbiA+PSAkbWluX3dvcmRfbGVuZ3RoKSB7DQoJCQkJCWlmICgkaXNBcnRpY2xlKSB7DQoJCQkJCQlwb3B1bGF0ZUFydGljbGVEYXRhKCRyb3cpOw0KCQkJCQl9DQoJCQkJCSRhcnRMaXN0W10gPSBwYXJzZSgkb3Bmb3JtKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJLy8gU29ydCB0aGUgd29yZCBsaXN0IGluIG9yZGVyIG9mIHJlbGV2YW5jZQ0KCQlpZiAoY291bnQoJHdvcmRMaXN0KSA+IDApIHsNCgkJCWFycmF5X211bHRpc29ydCgkd29yZERpc3QsJHdvcmRMaXN0KTsNCgkJfQ0KCQkvLyBPdXRwdXQgc3R1ZmYgdG8gdGhlIHBhZ2UNCgkJJG91dCAuPSAkbm9fbWF0Y2hfbGFiZWw7DQoJCWlmIChjb3VudCgkd29yZExpc3QpID4gMCkgew0KCQkJJG91dCAuPSAoY291bnQoJHNob3dMaXN0KSA+IDApID8gJHN1Z2dlc3RfbGFiZWwgOiAiIjsNCg0KCQkJaWYgKGluX2FycmF5KCJ3b3JkcyIsICRzaG93WzBdKSkgew0KCQkJCSRjdHIgPSAwOw0KCQkJCWZvcmVhY2ggKCR3b3JkTGlzdCBhcyAkaXRlbSkgew0KCQkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygid29yZHMiLCAkbGltaXRCeSkgJiYgJGN0ciA+ICRsaW1pdEJ5WyJ3b3JkcyJdKSB7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCQkkb3V0IC49ICc8YSBocmVmPSInLnNtZF9hZGRRU1ZhcigkcGFnZXVybCwncScsJGl0ZW0pLiciPicuJGl0ZW0uJzwvYT4nLm47DQoJCQkJCSRjdHIrKzsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoaW5fYXJyYXkoImFydGljbGVzIiwgJHNob3dbMF0pKSB7DQoJCQkJJGN0ciA9IDA7DQoJCQkJZm9yZWFjaCAoJGFydExpc3QgYXMgJGFydCkgew0KCQkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygiYXJ0aWNsZXMiLCAkbGltaXRCeSkgJiYgJGN0ciA+PSAkbGltaXRCeVsiYXJ0aWNsZXMiXSkgew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJJG91dCAuPSAkYXJ0Ow0KCQkJCQkkY3RyKys7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiAkb3V0Ow0KfSI7czo0OiJ0eXBlIjtzOjE6IjAiO3M6MzoibWQ1IjtzOjMyOiI2M2VjZDYzZmEzZTAxNmMzYTU5N2M4Yzk0ZTQ0MjVlMCI7fQ==