# pnh_mf v0.8 # Tags for embedding Microformats in page templates and content. # Chris Casciano # http://placenamehere.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjQ6Im5hbWUiO3M6NjoicG5oX21mIjtzOjc6InZlcnNpb24iO3M6MzoiMC44Ijtz OjY6ImF1dGhvciI7czoxNDoiQ2hyaXMgQ2FzY2lhbm8iO3M6MTA6ImF1dGhvcl91cmkiO3M6 MjU6Imh0dHA6Ly9wbGFjZW5hbWVoZXJlLmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjYy OiJUYWdzIGZvciBlbWJlZGRpbmcgTWljcm9mb3JtYXRzIGluIHBhZ2UgdGVtcGxhdGVzIGFu ZCBjb250ZW50LiI7czo0OiJ0eXBlIjtpOjE7czo0OiJoZWxwIjtzOjI5MDQ6IgoJPGgxPltw bmhfbWZdIE1pY3JvZm9ybWF0IFBsdWdpbiBIZWxwPC9oMT4KCTxwPlRoaXMgcGx1Z2luIHBy b3ZpZGVzIHRhZ3MgZm9yIGVtYmVkZGluZyBNaWNyb2Zvcm1hdHMgaW4gcGFnZSB0ZW1wbGF0 ZXMsIGZvcm1zIGFuZCBjb250ZW50LiBUYWdzIGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb246 PC9wPgoJPHVsPgoJCTxsaT50eHA6cG5oX21mX3hmbjwvbGk+CgkJPGxpPnR4cDpwbmhfbWZf aGNhcmQ8L2xpPgoJCTxsaT50eHA6cG5oX21mX2FkcjwvbGk+CgkJPGxpPnR4cDpwbmhfbWZf aGNhbGVuZGFyPC9saT4KCQk8bGk+dHhwOnBuaF9tZl90YWc8L2xpPgoJCTxsaT50eHA6cG5o X21mX2xpY2Vuc2U8L2xpPgoJCTxsaT50eHA6cG5oX21mX2dlbzwvbGk+Cgk8L3VsPgoJPHA+ QWxsIG9mIHRoZXNlIHRhZ3MgY2FuIGJlIHVzZWQgaW4gZWl0aGVyIHRlbXBsYXRlcyAoJiM4 MjE2O3BhZ2VzJiM4MjE3OyksIHNuaXBwZXRzICgmIzgyMTY7Zm9ybXMmIzgyMTc7KSBvciBp biBhcnRpY2xlIGJvZGllcywgYnV0IGNhbm5vdCBiZSB1c2VkIGluIGNvbW1lbnRzLjwvcD4K CTxoMj50eHA6cG5oX21mX3hmbjwvaDI+Cgk8cD5Vc2FnZTogPGNvZGU+Jmx0O3R4cDpwbmhf bWZfeGZuJmd0OyZsdDsvdHhwOnBuaF9tZl94Zm4mZ3Q7PC9jb2RlPjwvcD4KCTxoMz5BdHRy aWJ1dGVzICYjMzg7IENvbnRlbnQ8L2gzPgoJPHVsPgoJCTxsaT5yZWw8L2xpPgoJCTxsaT5o cmVmPC9saT4KCQk8bGk+aWQ8L2xpPgoJCTxsaT5jbGFzczwvbGk+CgkJPGxpPnRpdGxlPC9s aT4KCQk8bGk+bmFtZSAoY29udGVudCk8L2xpPgoJPC91bD4KCTxoMj50eHA6cG5oX21mX2hj YXJkPC9oMj4KCTxwPlVzYWdlOiA8Y29kZT4mbHQ7dHhwOnBuaF9tZl9oY2FyZCAvJmd0Ozwv Y29kZT48YnIgLz4KVXNhZ2U6IDxjb2RlPiZsdDt0eHA6cG5oX21mX2hjYXJkJmd0OyZsdDt0 eHA6cG5oX21mX2FkciAvJmd0OyZsdDsvdHhwOnBuaF9tZl9oY2FyZCZndDs8L2NvZGU+PC9w PgoJPGgzPkF0dHJpYnV0ZXMgJiMzODsgQ29udGVudDwvaDM+Cgk8dWw+CgkJPGxpPm5hbWU8 L2xpPgoJCTxsaT5ocmVmPC9saT4KCQk8bGk+b3JnPC9saT4KCQk8bGk+b3JnaHJlZjwvbGk+ CgkJPGxpPnBob3RvPC9saT4KCQk8bGk+ZW1haWw8L2xpPgoJCTxsaT53b3JrdGVsPC9saT4K CQk8bGk+aG9tZXRlbDwvbGk+CgkJPGxpPmNlbGx0ZWw8L2xpPgoJCTxsaT53b3JrZmF4PC9s aT4KCQk8bGk+YWRkcmVzcyhlcykgKGNvbnRlbnQsIHVzaW5nIHBuaF9tZl9hZHIpPC9saT4K CTwvdWw+Cgk8aDI+dHhwOnBuaF9tZl9hZHI8L2gyPgoJPHA+VXNhZ2U6IDxjb2RlPiZsdDt0 eHA6cG5oX21mX2FkciAvJmd0OzwvY29kZT48L3A+Cgk8aDM+QXR0cmlidXRlczwvaDM+Cgk8 dWw+CgkJPGxpPnR5cGU8L2xpPgoJCTxsaT5wb3N0b2ZmaWNlYm94PC9saT4KCQk8bGk+c3Ry ZWV0YWRkcmVzczwvbGk+CgkJPGxpPmV4dGVuZGVkYWRkcmVzczwvbGk+CgkJPGxpPmxvY2Fs aXR5PC9saT4KCQk8bGk+cmVnaW9uPC9saT4KCQk8bGk+cG9zdGFsY29kZTwvbGk+CgkJPGxp PmNvdW50cnk8L2xpPgoJPC91bD4KCTxoMj50eHA6cG5oX21mX2hjYWxlbmRhcjwvaDI+Cgk8 cD5Vc2FnZTogPGNvZGU+Jmx0O3R4cDpwbmhfbWZfaGNhbGVuZGFyJmd0OyZsdDsvdHhwOnBu aF9tZl9oY2FsZW5kYXImZ3Q7PC9jb2RlPjwvcD4KCTxoMz5BdHRyaWJ1dGVzICYjMzg7IENv bnRlbnQ8L2gzPgoJPHVsPgoJCTxsaT5zdW1tYXJ5PC9saT4KCQk8bGk+bG9jYXRpb248L2xp PgoJCTxsaT5ocmVmPC9saT4KCQk8bGk+ZHRzdGFydCAobWFjaGluZSBmb3JtYXR0ZWQgc3Rh cnQpPC9saT4KCQk8bGk+c3RhcnQgKGh1bWFuIHJlYWRhYmxlIHN0YXJ0KTwvbGk+CgkJPGxp PmR0ZW5kIChtYWNoaW5lIGZvcm1hdHRlZCBlbmQpPC9saT4KCQk8bGk+ZW5kIChodW1hbiBy ZWFkYWJsZSBlbmQpPC9saT4KCQk8bGk+ZGVzY3JpcHRpb24gKGNvbnRlbnQpPC9saT4KCTwv dWw+Cgk8cD5OT1RFOiBSZWFkIGZvciBodHRwOi8vbWljcm9mb3JtYXRzLm9yZy93aWtpL2hj YWxlbmRhciBwcm9wZXIgZGF0ZSB1c2FnZS4gVmFsdWUgdXNlZCBpbiB0YWcgaXMgaW4gZXhw ZWN0ZWQgbWFjaGluZSByZWFkYWJsZSBmb3JtYXQuPC9wPgoJPGgyPnR4cDpwbmhfbWZfdGFn PC9oMj4KCTxwPlVzYWdlOiA8Y29kZT4mbHQ7dHhwOnBuaF9tZl90YWcmZ3Q7Jmx0Oy90eHA6 cG5oX21mX3RhZyZndDs8L2NvZGU+PC9wPgoJPGgzPkF0dHJpYnV0ZXMgJiMzODsgQ29udGVu dDwvaDM+Cgk8dWw+CgkJPGxpPmhyZWYgKGlmIG5vdCBwcm92aWRlZCB1c2VzIHRlY2hub3Jh dGkpPC9saT4KCQk8bGk+aWQ8L2xpPgoJCTxsaT5jbGFzczwvbGk+CgkJPGxpPnRpdGxlPC9s aT4KCQk8bGk+dGFnIChjb250ZW50KTwvbGk+Cgk8L3VsPgoJPGgyPnR4cDpwbmhfbWZfbGlj ZW5zZTwvaDI+Cgk8cD5Vc2FnZTogPGNvZGU+Jmx0O3R4cDpwbmhfbWZfbGljZW5zZSZndDsm bHQ7L3R4cDpwbmhfbWZfbGljZW5zZSZndDs8L2NvZGU+PC9wPgoJPGgzPkF0dHJpYnV0ZXMg JiMzODsgQ29udGVudDwvaDM+Cgk8dWw+CgkJPGxpPmhyZWY8L2xpPgoJCTxsaT5pZDwvbGk+ CgkJPGxpPmNsYXNzPC9saT4KCQk8bGk+dGl0bGU8L2xpPgoJCTxsaT5saW5rIHRleHQgKGNv bnRlbnQpPC9saT4KCTwvdWw+Cgk8aDI+dHhwOnBuaF9tZl9nZW88L2gyPgoJPHA+VXNhZ2U6 IDxjb2RlPiZsdDt0eHA6cG5oX21mX2dlbyAvJmd0OzwvY29kZT48L3A+Cgk8aDM+QXR0cmli dXRlczwvaDM+Cgk8dWw+CgkJPGxpPmxhdDwvbGk+CgkJPGxpPmxvbmc8L2xpPgoJPC91bD4K CTxwPkZvciBtb3JlIGRldGFpbGVkIGV4YW1wbGVzIGFuZCB1cGRhdGVzIHBsZWFzZSBzZWUg dGhlIDxhIGhyZWY9Imh0dHA6Ly9wbGFjZW5hbWVoZXJlLmNvbS9UWFAvcG5oX21mLyI+cGx1 Z2luJiM4MjE3O3MgaG9tZSBwYWdlPC9hPi48L3A+CgoKICI7czo0OiJjb2RlIjtzOjE4NDQw OiIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQovLyBQdWJsaWMgc2lkZSB0YWdzCgoJLy8gQSB0YWcgZm9yIHRoZSBYRk4gbWljcm9m b3JtYXQKCS8vIDx0eHA6cG5oX21mX3hmbiByZWw9ImNvbnRhY3QiIGhyZWY9Imh0dHA6Ly9w bGFjZW5hbWVoZXJlLmNvbS8iPkNocmlzPC90eHA6cG5oX21mX3hmbj4KCS8vIGFsc28gYWNj ZXB0cyBzdGFuZGFyZCA8YT4gYXR0cmlidXRlczogaWQsIGNsYXNzLCB0aXRsZQoKCWZ1bmN0 aW9uIHBuaF9tZl94Zm4oJGF0dHMsJHRleHQ9JycpIHsKCQlleHRyYWN0KGxBdHRzKGFycmF5 KAoJCQkncmVsJyAgPT4gJycsCgkJCSdocmVmJyAgPT4gJycsCgkJKSwkYXR0cykpOwoKCQkv LyBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCByZXBsYWNlIHRoZSB0YWcgb24gdGhlIHBhZ2UK CQkkbWFya3VwID0gJzxhIGhyZWY9IicuJGhyZWYuJyInOwoJCSRtYXJrdXAgLj0gJyByZWw9 IicuJHJlbC4nIic7CgoJCWlmIChpc3NldCgkY2xhc3MpKSB7ICRtYXJrdXAgLj0gJyBjbGFz cz0iJy4kY2xhc3MuJyInOyB9CgkJaWYgKGlzc2V0KCRpZCkpIHsgJG1hcmt1cCAuPSAnIGlk PSInLiRpZC4nIic7IH0KCgkJaWYgKGlzc2V0KCR0aXRsZSkpIHsgJG1hcmt1cCAuPSAnIHRp dGxlPSInLiR0aXRsZS4nIic7IH0KCQkkbWFya3VwIC49ICc+Jy4kdGV4dC4nPC9hPic7CgkJ cmV0dXJuICRtYXJrdXA7Cgl9CgoJLy8gQSB0YWcgZm9yIHRoZSByZWxUYWcgbWljcm9mb3Jt YXQKCS8vIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gbGluayB0byB0ZWNobm9yYXRpCgkvLyA8 dHhwOnBuaF9tZl90YWc+dGVjaDwvdHhwOnBuaF9tZl90YWc+CgkvLyA8dHhwOnBuaF9tZl90 YWcgaHJlZj0iaHR0cDovL2RlbC5pY2lvLnVzL3RhZy90ZWNoIj50ZWNoPC90eHA6cG5oX21m X3RhZz4KCS8vIGFsc28gYWNjZXB0cyBzdGFuZGFyZCA8YT4gYXR0cmlidXRlczogaWQsIGNs YXNzLCB0aXRsZQoKCglmdW5jdGlvbiBwbmhfbWZfdGFnKCRhdHRzLCR0ZXh0PScnKSB7CgkJ ZXh0cmFjdCgkYXR0cyk7CgoJCS8vIGlmIHRoZXJlIHdhcyBubyBleHBsaWNpdCB1cmwgZ2l2 ZW4sIHVzZSB0ZWNobm9yYXRpCgkJaWYgKCFpc3NldCgkaHJlZikpIHsKCQkJJGhyZWYgPSAn aHR0cDovL3RlY2hub3JhdGkuY29tL3RhZy8nLiR0ZXh0OwoJCX0KCgkJLy8gVGhlIHJldHVy bmVkIHZhbHVlIHdpbGwgcmVwbGFjZSB0aGUgdGFnIG9uIHRoZSBwYWdlCgkJJG1hcmt1cCA9 ICc8YSBocmVmPSInLiRocmVmLiciJzsKCQkkbWFya3VwIC49ICcgcmVsPSJ0YWciJzsKCQlp ZiAoaXNzZXQoJGlkKSkgeyAkbWFya3VwIC49ICcgaWQ9IicuJGlkLiciJzsgfQoJCWlmIChp c3NldCgkY2xhc3MpKSB7ICRtYXJrdXAgLj0gJyBjbGFzcz0iJy4kY2xhc3MuJyInOyB9CgkJ aWYgKGlzc2V0KCR0aXRsZSkpIHsgJG1hcmt1cCAuPSAnIHRpdGxlPSInLiR0aXRsZS4nIic7 IH0KCQkkbWFya3VwIC49ICc+Jy4kdGV4dC4nPC9hPic7CgkJcmV0dXJuICRtYXJrdXA7Cgl9 CgoJLy8gQSB0YWcgZm9yIHRoZSBnZW8gbWljcm9mb3JtYXQKCS8vIDx0eHA6cG5oX21mX2dl byBsYXQ9IiIgbG9uZz0iIiAvPgoKCglmdW5jdGlvbiBwbmhfbWZfZ2VvKCRhdHRzKSB7CgkJ ZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ2xhdCcgID0+ICcwJywKCQkJJ2xvbmcnICA9PiAn MCcsCgkJKSwkYXR0cykpOwoKCQkkbWFya3VwID0gJzxzcGFuIGNsYXNzPSJnZW8iPic7CgkJ JG1hcmt1cCAuPSAnPHNwYW4gY2xhc3M9ImxhdGl0dWRlIj4nLiRsYXQuJzwvc3Bhbj4gJzsK CQkkbWFya3VwIC49ICc8c3BhbiBjbGFzcz0ibG9uZ2l0dWRlIj4nLiRsb25nLic8L3NwYW4+ JzsKCQkkbWFya3VwIC49ICc8L3NwYW4+JzsKCgkJcmV0dXJuICRtYXJrdXA7Cgl9CgoJLy8g QSB0YWcgZm9yIHRoZSBoQ2FsZW5kYXIgbWljcm9mb3JtYXQKCS8vIG1hcmt1cCB0ZW1wbGF0 ZSBvcmlnaW5hbGx5IHRha2VuIGZyb206IGh0dHA6Ly9taWNyb2Zvcm1hdHMub3JnL2NvZGUv aGNhbGVuZGFyL2NyZWF0b3IKCS8vIDx0eHA6cG5oX21mX2hjYWxlbmRhciBzdW1tYXJ5PSIi IGxvY2F0aW9uPSIiIGhyZWY9IiIgc3RhcnQ9IiIgZW5kPSIiPkRlc2NyaXB0aW9uPC90eHA6 cG5oX21mX2hjYWxlbmRhcj4KCglmdW5jdGlvbiBwbmhfbWZfaGNhbGVuZGFyKCRhdHRzLCR0 ZXh0PScnKSB7CgkJZXh0cmFjdCgkYXR0cyk7CgoJCS8vIGZvcm1hdCBodW1hbiByZWFkYWJs ZSBkYXRlcwoJCS8vJHN0YXJ0X3RpbWUgPSBzdHJ0b3RpbWUoJGR0c3RhcnQpOwoJCS8vJGVu ZF9lbmQgPSBzdHJ0b3RpbWUoJGR0c3RhcnQpOwoKCQkvLyBUaGUgcmV0dXJuZWQgdmFsdWUg d2lsbCByZXBsYWNlIHRoZSB0YWcgb24gdGhlIHBhZ2UKCgkJJG1hcmt1cCA9ICc8ZGl2IGNs YXNzPSJ2ZXZlbnQiPic7CgkJaWYgKGlzc2V0KCRocmVmKSkgeyAkbWFya3VwIC49ICc8YSBj bGFzcz0idXJsIiBocmVmPSInLiRocmVmLiciPic7IH0KCgkJaWYgKGlzc2V0KCRkdHN0YXJ0 KSkgewoJCQkkbWFya3VwIC49ICc8YWJiciBjbGFzcz0iZHRzdGFydCIgdGl0bGU9IicuJGR0 c3RhcnQuJyI+JzsKCQkJaWYgKGlzc2V0KCRzdGFydCkpIHsKCQkJCSRtYXJrdXAgLj0gJHN0 YXJ0OwoJCQl9IGVsc2UgewoJCQkJbGlzdCgkZCwkdCkgPSBleHBsb2RlKCJUIiwkZHRzdGFy dCk7CgkJCQkkbWFya3VwIC49IGRhdGUoJ00uIGosIFknLHN0cnRvdGltZSgkZCkpLicgJy4k dDsKCQkJfQoJCQkkbWFya3VwIC49ICc8L2FiYnI+JzsKCQl9CgkJaWYgKGlzc2V0KCRkdGVu ZCkpIHsKCQkJJG1hcmt1cCAuPSAnIC0gPGFiYnIgY2xhc3M9ImR0ZW5kIiB0aXRsZT0iJy4k ZHRlbmQuJyI+JzsKCQkJaWYgKGlzc2V0KCRlbmQpKSB7CgkJCQkkbWFya3VwIC49ICRlbmQ7 CgkJCX0gZWxzZSB7CgkJCQlsaXN0KCRkLCR0KSA9IGV4cGxvZGUoIlQiLCRkdGVuZCk7CgkJ CQlpZiAoaXNzZXQoJHQpKSB7CgkJCQkJJG1hcmt1cCAuPSBkYXRlKCdNLiBqLCBZJyxzdHJ0 b3RpbWUoJGQpKS4nICcuJHQ7CgkJCQl9IGVsc2UgewoJCQkJCSRtYXJrdXAgLj0gZGF0ZSgn TS4gaiwgWScsKHN0cnRvdGltZSgkZCktODY0MDApKTsKCQkJCX0KCQkJfQoJCQkkbWFya3Vw IC49ICc8L2FiYnI+JzsgfQoJCWlmIChpc3NldCgkc3VtbWFyeSkpIHsgJG1hcmt1cCAuPSAn IC0gPHNwYW4gY2xhc3M9InN1bW1hcnkiPicuJHN1bW1hcnkuJzwvc3Bhbj4nOyB9CgkJaWYg KGlzc2V0KCRsb2NhdGlvbikpIHsgJG1hcmt1cCAuPSAnIC0gPHNwYW4gY2xhc3M9ImxvY2F0 aW9uIj4nLiRsb2NhdGlvbi4nPC9zcGFuPic7IH0KCQlpZiAoaXNzZXQoJGhyZWYpKSB7ICRt YXJrdXAgLj0gJzwvYT4nOyB9CgoJCSRtYXJrdXAgLj0gJzxkaXYgY2xhc3M9ImRlc2NyaXB0 aW9uIj4nLiR0ZXh0Lic8L2Rpdj4nOwoKCQkkbWFya3VwIC49ICc8L2Rpdj4nOwoJCXJldHVy biAkbWFya3VwOwoJfQoKCgkvLyBBIHRhZyBmb3IgdGhlIHJlbExpY2Vuc2UgbWljcm9mb3Jt YXQKCS8vIDx0eHA6cG5oX21mX2xpY2Vuc2UgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9u cy5vcmcvbGljZW5zZXMvYnkvMi4wLyI+Y2MgYnkgMi4wPC90eHA6cG5oX21mX2xpY2Vuc2U+ CgkvLyBhbHNvIGFjY2VwdHMgc3RhbmRhcmQgPGE+IGF0dHJpYnV0ZXM6IGlkLCBjbGFzcywg dGl0bGUKCglmdW5jdGlvbiBwbmhfbWZfbGljZW5zZSgkYXR0cywkdGV4dD0nJykgewoJCWV4 dHJhY3QobEF0dHMoYXJyYXkoCgkJCSdocmVmJyAgPT4gJycsCgkJKSwkYXR0cykpOwoKCQkv LyBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCByZXBsYWNlIHRoZSB0YWcgb24gdGhlIHBhZ2UK CQkkbWFya3VwID0gJzxhIGhyZWY9IicuJGhyZWYuJyInOwoJCSRtYXJrdXAgLj0gJyByZWw9 ImxpY2Vuc2UiJzsKCQlpZiAoaXNzZXQoJGlkKSkgeyAkbWFya3VwIC49ICcgaWQ9IicuJGlk LiciJzsgfQoJCWlmIChpc3NldCgkY2xhc3MpKSB7ICRtYXJrdXAgLj0gJyBjbGFzcz0iJy4k Y2xhc3MuJyInOyB9CgkJaWYgKGlzc2V0KCR0aXRsZSkpIHsgJG1hcmt1cCAuPSAnIHRpdGxl PSInLiR0aXRsZS4nIic7IH0KCQkkbWFya3VwIC49ICc+Jy4kdGV4dC4nPC9hPic7CgkJcmV0 dXJuICRtYXJrdXA7Cgl9CgoJLy8gQSB0YWcgZm9yIHRoZSBoY2FyZCBtaWNyb2Zvcm1hdAoJ Ly8gbWFya3VwIHRlbXBsYXRlIG9yaWdpbmFsbHkgdGFrZW4gZnJvbTogaHR0cDovL3RhbnRl ay5jb20vbWljcm9mb3JtYXRzL2hjYXJkLWNyZWF0b3IuaHRtbAoJLy8gPHR4cDpwbmhfbWZf aGNhcmQgbmFtZT0iIiBzdHJlZXRhZGRyZXNzPSIiIGV4dGVuZGVkYWRkcmVzcz0iIiBsb2Nh bGl0eT0iIiByZWdpb249IiIgcG9zdGFsY29kZT0iIiBjb3VudHJ5bmFtZT0iIiAvPk5hbWU8 L3R4cDpwbmhfbWZfaGNhcmQ+CgoJZnVuY3Rpb24gcG5oX21mX2hjYXJkKCRhdHRzLCR0ZXh0 PScnKSB7CgkJZXh0cmFjdCgkYXR0cyk7CgoKCQkvLyBUaGUgcmV0dXJuZWQgdmFsdWUgd2ls bCByZXBsYWNlIHRoZSB0YWcgb24gdGhlIHBhZ2UKCQkkbWFya3VwID0gJzxkaXYgY2xhc3M9 InZjYXJkIj4nOwoKCQlpZiAoaXNzZXQoJGltZ2hyZWYpKSB7ICRtYXJrdXAgLj0gJzxpbWcg c3JjPSInLiRpbWdocmVmLiciIGFsdD0icGhvdG8iIGNsYXNzPSJwaG90byIgLz4nOyB9CgkJ aWYgKGlzc2V0KCRocmVmKSkgewoJCQkkbWFya3VwIC49ICc8YSBjbGFzcz0idXJsIGZuIiBo cmVmPSInLiRocmVmLiciPicuJG5hbWUuJzwvYT4nOwoJCX0gZWxzZSB7CgkJCSRtYXJrdXAg Lj0gJzxzcGFuIGNsYXNzPSJmbiI+Jy4kbmFtZS4nPC9zcGFuPic7CgkJfQoKCQlpZiAoaXNz ZXQoJG9yZykpIHsKCQkJaWYgKGlzc2V0KCRvcmdocmVmKSkgewoJCQkJJG1hcmt1cCAuPSAn PGRpdj48YSBocmVmPSInLiRvcmdocmVmLiciIGNsYXNzPSJvcmciPicuJG9yZy4nPC9hPjwv ZGl2Pic7CgkJCX0gZWxzZSB7CgkJCQkkbWFya3VwIC49ICc8ZGl2IGNsYXNzPSJvcmciPicu JG9yZy4nPC9kaXY+JzsKCQkJfQoJCX0KCgoKCQkvLyB3b3JrdGVsCgkJaWYgKGlzc2V0KCR3 b3JrdGVsKSkgeyAkbWFya3VwIC49ICc8ZGl2IGNsYXNzPSJ0ZWwiPjxzcGFuIGNsYXNzPSJ0 eXBlIj5Xb3JrPC9zcGFuPjogPHNwYW4gY2xhc3M9InZhbHVlIj4nLiR3b3JrdGVsLic8L3Nw YW4+PC9kaXY+JzsgfQoJCS8vIGhvbWV0ZWwKCQlpZiAoaXNzZXQoJGhvbWV0ZWwpKSB7ICRt YXJrdXAgLj0gJzxkaXYgY2xhc3M9InRlbCI+PHNwYW4gY2xhc3M9InR5cGUiPkhvbWU8L3Nw YW4+OiA8c3BhbiBjbGFzcz0idmFsdWUiPicuJGhvbWV0ZWwuJzwvc3Bhbj48L2Rpdj4nOyB9 CgkJLy8gY2VsbHRlbAoJCWlmIChpc3NldCgkY2VsbHRlbCkpIHsgJG1hcmt1cCAuPSAnPGRp diBjbGFzcz0idGVsIj48c3BhbiBjbGFzcz0idHlwZSI+Q2VsbDwvc3Bhbj46IDxzcGFuIGNs YXNzPSJ2YWx1ZSI+Jy4kY2VsbHRlbC4nPC9zcGFuPjwvZGl2Pic7IH0KCQkvLyB3b3JrZmF4 CgkJaWYgKGlzc2V0KCR3b3JrZmF4KSkgeyAkbWFya3VwIC49ICc8ZGl2IGNsYXNzPSJ0ZWwi PjxzcGFuIGNsYXNzPSJ0eXBlIj5GYXg8L3NwYW4+OiA8c3BhbiBjbGFzcz0idmFsdWUiPicu JHdvcmtmYXguJzwvc3Bhbj48L2Rpdj4nOyB9CgkJLy8gaW0gLSBuZWVkIHVybCwgc2Vydmlj ZSAmIHNjcmVlbiBuYW1lPwoJCS8vIGVtYWlsCgkJaWYgKGlzc2V0KCRlbWFpbCkpIHsgJG1h cmt1cCAuPSAnPGRpdj48YSBjbGFzcz0iZW1haWwiIGhyZWY9Im1haWx0bzonLiRlbWFpbC4n Ij4nLiRlbWFpbC4nPC9hPjwvZGl2Pic7IH0KCgkJJG1hcmt1cCAuPSAkdGV4dDsgLy8gYW55 IGFkZHJlc3NlcwoKCQkkbWFya3VwIC49ICc8L2Rpdj4nOwoJCXJldHVybiAkbWFya3VwOwoJ fQoKCgkvLyBBIHRhZyBmb3IgdGhlIGFkciBtaWNyb2Zvcm1hdAoJLy8gY2F1dGlvbjogdGhp cyBtaWNyb2Zvcm1hdCBpcyBzdGlsbCBpbiBkcmFmdCBtb2RlCgkvLyA8dHhwOnBuaF9tZl9h ZHIgc3RyZWV0YWRkcmVzcz0iIiBleHRlbmRlZGFkZHJlc3M9IiIgbG9jYWxpdHk9IiIgcmVn aW9uPSIiIHBvc3RhbGNvZGU9IiIgY291bnRyeT0iIiAvPgoKCWZ1bmN0aW9uIHBuaF9tZl9h ZHIoJGF0dHMpIHsKCQlleHRyYWN0KCRhdHRzKTsKCgoKCQkvLyBUaGUgcmV0dXJuZWQgdmFs dWUgd2lsbCByZXBsYWNlIHRoZSB0YWcgb24gdGhlIHBhZ2UKCQkkbWFya3VwID0gJzxkaXYg Y2xhc3M9ImFkciI+JzsKCgkJaWYgKGlzc2V0KCR0eXBlKSkgeyAkbWFya3VwIC49ICc8ZGl2 PjxzcGFuIGNsYXNzPSJ0eXBlIj4nLiR0eXBlLic8L3NwYW4+IEFkZHJlc3M8L2Rpdj4nOyB9 CgkJaWYgKGlzc2V0KCRwb3N0b2ZmaWNlYm94KSkgeyAkbWFya3VwIC49ICc8ZGl2IGNsYXNz PSJwb3N0LW9mZmljZS1ib3giPicuJHBvc3RvZmZpY2Vib3guJzwvZGl2Pic7IH0KCQlpZiAo aXNzZXQoJHN0cmVldGFkZHJlc3MpKSB7ICRtYXJrdXAgLj0gJzxkaXYgY2xhc3M9InN0cmVl dC1hZGRyZXNzIj4nLiRzdHJlZXRhZGRyZXNzLic8L2Rpdj4nOyB9CgkJaWYgKGlzc2V0KCRl eHRlbmRlZGFkZHJlc3MpKSB7ICRtYXJrdXAgLj0gJzxkaXYgY2xhc3M9ImV4dGVuZGVkLWFk ZHJlc3MiPicuJGV4dGVuZGVkYWRkcmVzcy4nPC9kaXY+JzsgfQoJCWlmIChpc3NldCgkbG9j YWxpdHkpKSB7ICRtYXJrdXAgLj0gJzxzcGFuIGNsYXNzPSJsb2NhbGl0eSI+Jy4kbG9jYWxp dHkuJzwvc3Bhbj4sICc7IH0KCQlpZiAoaXNzZXQoJHJlZ2lvbikpIHsgJG1hcmt1cCAuPSAn PHNwYW4gY2xhc3M9InJlZ2lvbiI+Jy4kcmVnaW9uLic8L3NwYW4+JzsgfQoJCWlmIChpc3Nl dCgkcG9zdGFsY29kZSkpIHsgJG1hcmt1cCAuPSAnIDxzcGFuIGNsYXNzPSJwb3N0YWwtY29k ZSI+Jy4kcG9zdGFsY29kZS4nPC9zcGFuPic7IH0KCQlpZiAoaXNzZXQoJGNvdW50cnkpKSB7 ICRtYXJrdXAgLj0gJzxkaXYgY2xhc3M9ImNvdW50cnktbmFtZSI+Jy4kY291bnRyeS4nPC9k aXY+JzsgfQoKCQkkbWFya3VwIC49ICc8L2Rpdj4nOwoJCXJldHVybiAkbWFya3VwOwoJfQoK Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KLy8gYWRtaW4gc2lkZSBwbHVnaW4gY29kZQoKCglpZiAoQHR4cGludGVyZmFjZSA9PSAn YWRtaW4nKSB7CgkJZ2xvYmFsICR0ZXh0YXJyYXk7CgkgICAgLy9yZWdpc3Rlcl9jYWxsYmFj aygicG5oX21mX3RhZ2dlbmhlbHBlcnMiLCAidGFnIiwgJycsIDEpOwoJICAgIHJlZ2lzdGVy X2NhbGxiYWNrKCJwbmhfbWZfcGFnZWhlbHBlcnMiLCAicGFnZSIpOwoJICAgIHJlZ2lzdGVy X2NhbGxiYWNrKCJwbmhfbWZfZm9ybWhlbHBlcnMiLCAiZm9ybSIpOwoJICAgIHJlZ2lzdGVy X2NhbGxiYWNrKCJwbmhfbWZfYXJ0aWNsZWhlbHBlcnMiLCAiYXJ0aWNsZSIpOwoKCQkkdGV4 dGFycmF5W3N0cnRvbG93ZXIoJ3RhZ19wbmhfbWZfeGZuJyldID0gJ1hGTic7CgkJJHRleHRh cnJheVtzdHJ0b2xvd2VyKCd0YWdfcG5oX21mX2hjYXJkJyldID0gJ2hDYXJkJzsKCQkkdGV4 dGFycmF5W3N0cnRvbG93ZXIoJ3RhZ19wbmhfbWZfYWRyJyldID0gJ2Fkcic7CgkJJHRleHRh cnJheVtzdHJ0b2xvd2VyKCd0YWdfcG5oX21mX2hjYWxlbmRhcicpXSA9ICdoQ2FsZW5kYXIn OwoJCSR0ZXh0YXJyYXlbc3RydG9sb3dlcigndGFnX3BuaF9tZl90YWcnKV0gPSAncmVsLXRh Zyc7CgkJJHRleHRhcnJheVtzdHJ0b2xvd2VyKCd0YWdfcG5oX21mX2xpY2Vuc2UnKV0gPSAn cmVsLWxpY2Vuc2UnOwoJCSR0ZXh0YXJyYXlbc3RydG9sb3dlcigndGFnX3BuaF9tZl9nZW8n KV0gPSAnZ2VvJzsKCgl9CgoJZnVuY3Rpb24gdGFnX3BuaF9tZl94Zm4oKQoJewoJCWdsb2Jh bCAkc3RlcCwkZW5kZm9ybSwkbmFtZTsKCQkkbGFiZWwgPSBncHMoJ2xhYmVsJyk7CgkJJGlu dmFycyA9IGdwc2EoYXJyYXkoJ3JlbCcsJ2hyZWYnKSk7CgkJZXh0cmFjdCgkaW52YXJzKTsK CQkkbGFiZWwgPSAoISRsYWJlbCkgPyAnTmFtZScgOiAkbGFiZWw7CgkJJG91dCA9IGZvcm0o c3RhcnRUYWJsZSgnbGlzdCcpLgoJCQl0cih0ZGNzKGhlZChnVHh0KCd0YWdfcG5oX21mX3hm bicpLDMpLDIpICkgLgoJCQl0YWdSb3coJ3JlbCcsZklucHV0KCd0ZXh0JywncmVsJywkcmVs LCdlZGl0JywnJywnJywyNSkpIC4KCQkJdGFnUm93KCdocmVmJywgZklucHV0KCd0ZXh0Jywn aHJlZicsJGhyZWYsJ2VkaXQnLCcnLCcnLDI1KSkuCgkJCXRhZ1JvdygnbmFtZScsIGZJbnB1 dCgndGV4dCcsJ2xhYmVsJywkbGFiZWwsJ2VkaXQnLCcnLCcnLDI1KSkuCgkJCSRlbmRmb3Jt CgkJKTsKCQkkb3V0IC49ICgkc3RlcD09J2J1aWxkJykgPyB0ZGIodGIoJG5hbWUsICRpbnZh cnMsICRsYWJlbCkpIDogJyc7CgkJcmV0dXJuICRvdXQ7Cgl9CglmdW5jdGlvbiB0YWdfcG5o X21mX2hjYXJkKCkKCXsKCQlnbG9iYWwgJHN0ZXAsJGVuZGZvcm0sJG5hbWU7CgkJJHhuYW1l ID0gZ3BzKCd4bmFtZScpOyAvLyBhdm9pZCBjb2xsaXNpb24gd2l0aCB0eHBzIHVzZSBvZiBu YW1lCgkJJGFkZHJlc3MgPSBncHMoJ2FkZHJlc3MnKTsgLy8gYXZvaWQgY29sbGlzaW9uIHdp dGggdHhwcyB1c2Ugb2YgbmFtZQoJCSRpbnZhcnMgPSBncHNhKGFycmF5KCdocmVmJywnb3Jn Jywnb3JnaHJlZicsJ3Bob3RvJywnZW1haWwnLCd3b3JrdGVsJywnaG9tZXRlbCcsJ2NlbGx0 ZWwnLCd3b3JrZmF4JykpOwoJCWV4dHJhY3QoJGludmFycyk7CgkJJG91dCA9IGZvcm0oc3Rh cnRUYWJsZSgnbGlzdCcpLgoJCQl0cih0ZGNzKGhlZChnVHh0KCd0YWdfcG5oX21mX2hjYXJk JyksMyksMikgKSAuCgkJCXRhZ1JvdygncGVyc29uXCdzIG5hbWUnLCBmSW5wdXQoJ3RleHQn LCd4bmFtZScsJHhuYW1lLCdlZGl0JywnJywnJywyNSkpLgoJCQl0YWdSb3coJ2hyZWYnLCBm SW5wdXQoJ3RleHQnLCdocmVmJywkaHJlZiwnZWRpdCcsJycsJycsMjUpKS4KCQkJdGFnUm93 KCdvcmdhbml6YXRpb24nLGZJbnB1dCgndGV4dCcsJ29yZycsJG9yZywnZWRpdCcsJycsJycs MjUpKSAuCgkJCXRhZ1Jvdygnb3JnXCdzIGhyZWYnLGZJbnB1dCgndGV4dCcsJ29yZ2hyZWYn LCRvcmdocmVmLCdlZGl0JywnJywnJywyNSkpIC4KCQkJdGFnUm93KCdwaG90byBocmVmJywg ZklucHV0KCd0ZXh0JywncGhvdG8nLCRwaG90bywnZWRpdCcsJycsJycsMjUpKS4KCQkJdGFn Um93KCdlbWFpbCcsZklucHV0KCd0ZXh0JywnZW1haWwnLCRlbWFpbCwnZWRpdCcsJycsJycs MjUpKSAuCgkJCXRhZ1Jvdygnd29yayBwaG9uZScsIGZJbnB1dCgndGV4dCcsJ3dvcmt0ZWwn LCR3b3JrdGVsLCdlZGl0JywnJywnJywyNSkpLgoJCQl0YWdSb3coJ2hvbWUgcGhvbmUnLGZJ bnB1dCgndGV4dCcsJ2hvbWV0ZWwnLCRob21ldGVsLCdlZGl0JywnJywnJywyNSkpIC4KCQkJ dGFnUm93KCdjZWxsJywgZklucHV0KCd0ZXh0JywnY2VsbHRlbCcsJGNlbGx0ZWwsJ2VkaXQn LCcnLCcnLDI1KSkuCgkJCXRhZ1Jvdygnd29yayBmYXgnLCBmSW5wdXQoJ3RleHQnLCd3b3Jr ZmF4Jywkd29ya2ZheCwnZWRpdCcsJycsJycsMjUpKS4KCQkJdGFnUm93KCdoYXMgYWRkcmVz cz8nLCB5ZXNub19wb3AoJ2FkZHJlc3MnLCRhZGRyZXNzKSkuCgkJCSRlbmRmb3JtCgkJKTsK CQlpZiAoJHN0ZXA9PSdidWlsZCcpIHsKCQkJJGludmFyc1snbmFtZSddID0gJHhuYW1lOwoJ CQkkb3V0IC49ICgkYWRkcmVzcz09J3knKSA/IHRkYih0YigkbmFtZSwgJGludmFycywgJ1tw bGFjZSBhZHIgaGVyZV0nKSkgOiB0ZGIodGIoJG5hbWUsICRpbnZhcnMpKTsKCQl9CgkJcmV0 dXJuICRvdXQ7Cgl9CglmdW5jdGlvbiB0YWdfcG5oX21mX2FkcigpCgl7CgkJZ2xvYmFsICRz dGVwLCRlbmRmb3JtLCRuYW1lOwoJCSRpbnZhcnMgPSBncHNhKGFycmF5KCd0eXBlJywncG9z dG9mZmljZWJveCcsJ3N0cmVldGFkZHJlc3MnLCdleHRlbmRlZGFkZHJlc3MnLCdsb2NhbGl0 eScsJ3JlZ2lvbicsJ3Bvc3RhbGNvZGUnLCdjb3VudHJ5JykpOwoJCWV4dHJhY3QoJGludmFy cyk7CgkJJG91dCA9IGZvcm0oc3RhcnRUYWJsZSgnbGlzdCcpLgoJCQl0cih0ZGNzKGhlZChn VHh0KCd0YWdfcG5oX21mX2FkcicpLDMpLDIpICkgLgoJCQl0YWdSb3coJ3R5cGUnLGZJbnB1 dCgndGV4dCcsJ3R5cGUnLCR0eXBlLCdlZGl0JywnJywnJywyNSkpIC4KCQkJdGFnUm93KCdw b3N0b2ZmaWNlYm94JywgZklucHV0KCd0ZXh0JywncG9zdG9mZmljZWJveCcsJHBvc3RvZmZp Y2Vib3gsJ2VkaXQnLCcnLCcnLDI1KSkuCgkJCXRhZ1Jvdygnc3RyZWV0YWRkcmVzcycsIGZJ bnB1dCgndGV4dCcsJ3N0cmVldGFkZHJlc3MnLCRzdHJlZXRhZGRyZXNzLCdlZGl0JywnJywn JywyNSkpLgoJCQl0YWdSb3coJ2V4dGVuZGVkYWRkcmVzcycsZklucHV0KCd0ZXh0JywnZXh0 ZW5kZWRhZGRyZXNzJywkZXh0ZW5kZWRhZGRyZXNzLCdlZGl0JywnJywnJywyNSkpIC4KCQkJ dGFnUm93KCdsb2NhbGl0eScsIGZJbnB1dCgndGV4dCcsJ2xvY2FsaXR5JywkbG9jYWxpdHks J2VkaXQnLCcnLCcnLDI1KSkuCgkJCXRhZ1JvdygncmVnaW9uJywgZklucHV0KCd0ZXh0Jywn cmVnaW9uJywkcmVnaW9uLCdlZGl0JywnJywnJywyNSkpLgoJCQl0YWdSb3coJ3Bvc3RhbGNv ZGUnLGZJbnB1dCgndGV4dCcsJ3Bvc3RhbGNvZGUnLCRwb3N0YWxjb2RlLCdlZGl0JywnJywn JywyNSkpIC4KCQkJdGFnUm93KCdjb3VudHJ5JywgZklucHV0KCd0ZXh0JywnY291bnRyeScs JGNvdW50cnksJ2VkaXQnLCcnLCcnLDI1KSkuCgkJCSRlbmRmb3JtCgkJKTsKCQkkb3V0IC49 ICgkc3RlcD09J2J1aWxkJykgPyB0ZGIodGIoJG5hbWUsICRpbnZhcnMpKSA6ICcnOwoJCXJl dHVybiAkb3V0OwoJfQoJZnVuY3Rpb24gdGFnX3BuaF9tZl9oY2FsZW5kYXIoKQoJewoJCWds b2JhbCAkc3RlcCwkZW5kZm9ybSwkbmFtZTsKCQkkbGFiZWwgPSBncHMoJ2xhYmVsJyk7CgkJ JGludmFycyA9IGdwc2EoYXJyYXkoJ3N1bW1hcnknLCdsb2NhdGlvbicsJ2hyZWYnLCdkdHN0 YXJ0Jywnc3RhcnQnLCdkdGVuZCcsJ2VuZCcpKTsKCQlleHRyYWN0KCRpbnZhcnMpOwoJCSRs YWJlbCA9ICghJGxhYmVsKSA/ICdEZXNjcmlwdGlvbicgOiAkbGFiZWw7CgkJJG91dCA9IGZv cm0oc3RhcnRUYWJsZSgnbGlzdCcpLgoJCQl0cih0ZGNzKGhlZChnVHh0KCd0YWdfcG5oX21m X2hjYWxlbmRhcicpLDMpLDIpICkgLgoJCQl0YWdSb3coJ3N1bW1hcnknLCBmSW5wdXQoJ3Rl eHQnLCdzdW1tYXJ5Jywkc3VtbWFyeSwnZWRpdCcsJycsJycsMjUpKS4KCQkJdGFnUm93KCds b2NhdGlvbicsIGZJbnB1dCgndGV4dCcsJ2xvY2F0aW9uJywkbG9jYXRpb24sJ2VkaXQnLCcn LCcnLDI1KSkuCgkJCXRhZ1JvdygnaHJlZicsIGZJbnB1dCgndGV4dCcsJ2hyZWYnLCRocmVm LCdlZGl0JywnJywnJywyNSkpLgoJCQl0YWdSb3coJ2R0c3RhcnQnLCBmSW5wdXQoJ3RleHQn LCdkdHN0YXJ0JywkZHRzdGFydCwnZWRpdCcsJycsJycsMjUpKS4KCQkJdGFnUm93KCdzdGFy dCcsIGZJbnB1dCgndGV4dCcsJ3N0YXJ0Jywkc3RhcnQsJ2VkaXQnLCcnLCcnLDI1KSkuCgkJ CXRhZ1JvdygnZHRlbmQnLCBmSW5wdXQoJ3RleHQnLCdkdGVuZCcsJGR0ZW5kLCdlZGl0Jywn JywnJywyNSkpLgoJCQl0YWdSb3coJ2VuZCcsIGZJbnB1dCgndGV4dCcsJ2VuZCcsJGVuZCwn ZWRpdCcsJycsJycsMjUpKS4KCQkJdGFnUm93KCdkZXNjcmlwdGlvbicsIGZJbnB1dCgndGV4 dCcsJ2xhYmVsJywkbGFiZWwsJ2VkaXQnLCcnLCcnLDI1KSkuCgkJCSRlbmRmb3JtCgkJKTsK CQkkb3V0IC49ICgkc3RlcD09J2J1aWxkJykgPyB0ZGIodGIoJG5hbWUsICRpbnZhcnMsICRs YWJlbCkpIDogJyc7CgkJcmV0dXJuICRvdXQ7Cgl9CglmdW5jdGlvbiB0YWdfcG5oX21mX3Rh ZygpCgl7CgkJZ2xvYmFsICRzdGVwLCRlbmRmb3JtLCRuYW1lOwoJCSRsYWJlbCA9IGdwcygn bGFiZWwnKTsKCQkkaW52YXJzID0gZ3BzYShhcnJheSgnaHJlZicpKTsKCQlleHRyYWN0KCRp bnZhcnMpOwoJCSRsYWJlbCA9ICghJGxhYmVsKSA/ICdUYWcnIDogJGxhYmVsOwoJCSRvdXQg PSBmb3JtKHN0YXJ0VGFibGUoJ2xpc3QnKS4KCQkJdHIodGRjcyhoZWQoZ1R4dCgndGFnX3Bu aF9tZl90YWcnKSwzKSwyKSApIC4KCQkJdGFnUm93KCdocmVmJywgZklucHV0KCd0ZXh0Jywn aHJlZicsJGhyZWYsJ2VkaXQnLCcnLCcnLDI1KSkuCgkJCXRhZ1JvdygndGFnJywgZklucHV0 KCd0ZXh0JywnbGFiZWwnLCRsYWJlbCwnZWRpdCcsJycsJycsMjUpKS4KCQkJJGVuZGZvcm0K CQkpOwoJCSRvdXQgLj0gKCRzdGVwPT0nYnVpbGQnKSA/IHRkYih0YigkbmFtZSwgJGludmFy cywgJGxhYmVsKSkgOiAnJzsKCQlyZXR1cm4gJG91dDsKCX0KCWZ1bmN0aW9uIHRhZ19wbmhf bWZfbGljZW5zZSgpCgl7CgkJZ2xvYmFsICRzdGVwLCRlbmRmb3JtLCRuYW1lOwoJCSRsYWJl bCA9IGdwcygnbGFiZWwnKTsKCQkkaW52YXJzID0gZ3BzYShhcnJheSgnaHJlZicpKTsKCQll eHRyYWN0KCRpbnZhcnMpOwoJCSRsYWJlbCA9ICghJGxhYmVsKSA/ICdMaWNlbnNlJyA6ICRs YWJlbDsKCQkkb3V0ID0gZm9ybShzdGFydFRhYmxlKCdsaXN0JykuCgkJCXRyKHRkY3MoaGVk KGdUeHQoJ3RhZ19wbmhfbWZfbGljZW5zZScpLDMpLDIpICkgLgoJCQl0YWdSb3coJ2hyZWYn LCBmSW5wdXQoJ3RleHQnLCdocmVmJywkaHJlZiwnZWRpdCcsJycsJycsMjUpKS4KCQkJdGFn Um93KCdsaWNlbnNlJywgZklucHV0KCd0ZXh0JywnbGFiZWwnLCRsYWJlbCwnZWRpdCcsJycs JycsMjUpKS4KCQkJJGVuZGZvcm0KCQkpOwoJCSRvdXQgLj0gKCRzdGVwPT0nYnVpbGQnKSA/ IHRkYih0YigkbmFtZSwgJGludmFycywgJGxhYmVsKSkgOiAnJzsKCQlyZXR1cm4gJG91dDsK CX0KCWZ1bmN0aW9uIHRhZ19wbmhfbWZfZ2VvKCkKCXsKCQlnbG9iYWwgJHN0ZXAsJGVuZGZv cm0sJG5hbWU7CgkJJGludmFycyA9IGdwc2EoYXJyYXkoJ2xhdCcsJ2xvbmcnKSk7CgkJZXh0 cmFjdCgkaW52YXJzKTsKCQkkb3V0ID0gZm9ybShzdGFydFRhYmxlKCdsaXN0JykuCgkJCXRy KHRkY3MoaGVkKGdUeHQoJ3RhZ19wbmhfbWZfZ2VvJyksMyksMikgKSAuCgkJCXRhZ1Jvdygn bGF0JyxmSW5wdXQoJ3RleHQnLCdsYXQnLCRsYXQsJ2VkaXQnLCcnLCcnLDI1KSkgLgoJCQl0 YWdSb3coJ2xvbmcnLCBmSW5wdXQoJ3RleHQnLCdsb25nJywkbG9uZywnZWRpdCcsJycsJycs MjUpKS4KCQkJJGVuZGZvcm0KCQkpOwoJCSRvdXQgLj0gKCRzdGVwPT0nYnVpbGQnKSA/IHRk Yih0YigkbmFtZSwgJGludmFycykpIDogJyc7CgkJcmV0dXJuICRvdXQ7Cgl9CgoJLy8gUGFn ZSBlZGl0b3IgaGVscGVyIHRhZ3MKCS8vIEluc2VydHMgdGFnIGhlbHBlcnMgaW4gbGVmdCBj b2x1bW4gdmlhIERPTSBtYW5pcHVsYXRpb24KCWZ1bmN0aW9uIHBuaF9tZl9wYWdlaGVscGVy cygpIHsKICAgIGVjaG88PDxFT0YKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4K PCEtLQoKaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7CgoJLy8gVGhpcyBp cyBzb21lIGF3ZnVsIGxvZ2ljIHRvIGZpbmQgdGhlIHRhYmxlIGNlbGwgSSB3YW50Cgl2YXIg dGJsY2VsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoMicpWzBdLnBhcmVu dE5vZGU7CgoJdmFyIG5ld2hlbHBlcnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQJyk7 CgluZXdoZWxwZXJzLmNsYXNzTmFtZSA9ICdjb2x1bW4nOwoJbmV3aGVscGVycy5pbm5lckhU TUwgPSAnTWljcm9mb3JtYXRzPGJyIC8+PHNtYWxsPjxhIHRhcmdldD0iX2JsYW5rIiBocmVm PSI/ZXZlbnQ9dGFnJiMzODtuYW1lPXBuaF9tZl94Zm4iIG9uY2xpY2s9IndpbmRvdy5vcGVu KHRoaXMuaHJlZiwgXCdwb3B1cHdpbmRvd1wnLCBcJ3dpZHRoPTQwMCxoZWlnaHQ9NDAwLHNj cm9sbGJhcnMscmVzaXphYmxlXCcpOyByZXR1cm4gZmFsc2U7Ij5YRk48L2E+PGJyIC8+PGEg dGFyZ2V0PSJfYmxhbmsiIGhyZWY9Ij9ldmVudD10YWcmIzM4O25hbWU9cG5oX21mX2hjYXJk IiBvbmNsaWNrPSJ3aW5kb3cub3Blbih0aGlzLmhyZWYsIFwncG9wdXB3aW5kb3dcJywgXCd3 aWR0aD00MDAsaGVpZ2h0PTQwMCxzY3JvbGxiYXJzLHJlc2l6YWJsZVwnKTsgcmV0dXJuIGZh bHNlOyI+aENhcmQ8L2E+PGJyIC8+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Ij9ldmVudD10 YWcmIzM4O25hbWU9cG5oX21mX2FkciIgb25jbGljaz0id2luZG93Lm9wZW4odGhpcy5ocmVm LCBcJ3BvcHVwd2luZG93XCcsIFwnd2lkdGg9NDAwLGhlaWdodD00MDAsc2Nyb2xsYmFycyxy ZXNpemFibGVcJyk7IHJldHVybiBmYWxzZTsiPmFkcjwvYT48YnIgLz48YSB0YXJnZXQ9Il9i bGFuayIgaHJlZj0iP2V2ZW50PXRhZyYjMzg7bmFtZT1wbmhfbWZfaGNhbGVuZGFyIiBvbmNs aWNrPSJ3aW5kb3cub3Blbih0aGlzLmhyZWYsIFwncG9wdXB3aW5kb3dcJywgXCd3aWR0aD00 MDAsaGVpZ2h0PTQwMCxzY3JvbGxiYXJzLHJlc2l6YWJsZVwnKTsgcmV0dXJuIGZhbHNlOyI+ aENhbGVuZGFyPC9hPjxiciAvPjxhIGhyZWY9Ij9ldmVudD10YWcmIzM4O25hbWU9cG5oX21m X3RhZyIgb25jbGljaz0id2luZG93Lm9wZW4odGhpcy5ocmVmLCBcJ3BvcHVwd2luZG93XCcs IFwnd2lkdGg9NDAwLGhlaWdodD00MDAsc2Nyb2xsYmFycyxyZXNpemFibGVcJyk7IHJldHVy biBmYWxzZTsiPnJlbC10YWc8L2E+PGJyIC8+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Ij9l dmVudD10YWcmIzM4O25hbWU9cG5oX21mX2xpY2Vuc2UiIG9uY2xpY2s9IndpbmRvdy5vcGVu KHRoaXMuaHJlZiwgXCdwb3B1cHdpbmRvd1wnLCBcJ3dpZHRoPTQwMCxoZWlnaHQ9NDAwLHNj cm9sbGJhcnMscmVzaXphYmxlXCcpOyByZXR1cm4gZmFsc2U7Ij5yZWwtbGljZW5zZTwvYT48 YnIgLz48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iP2V2ZW50PXRhZyYjMzg7bmFtZT1wbmhf bWZfZ2VvIiBvbmNsaWNrPSJ3aW5kb3cub3Blbih0aGlzLmhyZWYsIFwncG9wdXB3aW5kb3dc JywgXCd3aWR0aD00MDAsaGVpZ2h0PTQwMCxzY3JvbGxiYXJzLHJlc2l6YWJsZVwnKTsgcmV0 dXJuIGZhbHNlOyI+Z2VvPC9hPjwvc21hbGw+JzsKCXRibGNlbGwuYXBwZW5kQ2hpbGQobmV3 aGVscGVycyk7Cn0KCgotLT4KPC9zY3JpcHQ+CkVPRjsKCX0KCgkvLyBGb3JtIGVkaXRvciBo ZWxwZXIgdGFncwoJLy8gSW5zZXJ0cyB0YWcgaGVscGVycyBpbiBsZWZ0IGNvbHVtbiB2aWEg RE9NIG1hbmlwdWxhdGlvbgoJZnVuY3Rpb24gcG5oX21mX2Zvcm1oZWxwZXJzKCkgewogICAg ZWNobzw8PEVPRgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgppZiAo ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKCgkvLyBUaGlzIGlzIHNvbWUgYXdm dWwgbG9naWMgdG8gZmluZCB0aGUgdGFibGUgY2VsbCBJIHdhbnQKCXZhciB0YmxjZWxsID0g ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2gyJylbMF0ucGFyZW50Tm9kZTsKCgl2 YXIgbmV3aGVscGVycyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1AnKTsKCW5ld2hlbHBl cnMuaW5uZXJIVE1MID0gJ01pY3JvZm9ybWF0czxiciAvPjxhIHRhcmdldD0iX2JsYW5rIiBo cmVmPSI/ZXZlbnQ9dGFnJiMzODtuYW1lPXBuaF9tZl94Zm4iIG9uY2xpY2s9IndpbmRvdy5v cGVuKHRoaXMuaHJlZiwgXCdwb3B1cHdpbmRvd1wnLCBcJ3dpZHRoPTQwMCxoZWlnaHQ9NDAw LHNjcm9sbGJhcnMscmVzaXphYmxlXCcpOyByZXR1cm4gZmFsc2U7Ij5YRk48L2E+PGJyIC8+ PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Ij9ldmVudD10YWcmIzM4O25hbWU9cG5oX21mX2hj YXJkIiBvbmNsaWNrPSJ3aW5kb3cub3Blbih0aGlzLmhyZWYsIFwncG9wdXB3aW5kb3dcJywg XCd3aWR0aD00MDAsaGVpZ2h0PTQwMCxzY3JvbGxiYXJzLHJlc2l6YWJsZVwnKTsgcmV0dXJu IGZhbHNlOyI+aENhcmQ8L2E+PGJyIC8+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Ij9ldmVu dD10YWcmIzM4O25hbWU9cG5oX21mX2FkciIgb25jbGljaz0id2luZG93Lm9wZW4odGhpcy5o cmVmLCBcJ3BvcHVwd2luZG93XCcsIFwnd2lkdGg9NDAwLGhlaWdodD00MDAsc2Nyb2xsYmFy cyxyZXNpemFibGVcJyk7IHJldHVybiBmYWxzZTsiPmFkcjwvYT48YnIgLz48YSB0YXJnZXQ9 Il9ibGFuayIgaHJlZj0iP2V2ZW50PXRhZyYjMzg7bmFtZT1wbmhfbWZfaGNhbGVuZGFyIiBv bmNsaWNrPSJ3aW5kb3cub3Blbih0aGlzLmhyZWYsIFwncG9wdXB3aW5kb3dcJywgXCd3aWR0 aD00MDAsaGVpZ2h0PTQwMCxzY3JvbGxiYXJzLHJlc2l6YWJsZVwnKTsgcmV0dXJuIGZhbHNl OyI+aENhbGVuZGFyPC9hPjxiciAvPjxhIGhyZWY9Ij9ldmVudD10YWcmIzM4O25hbWU9cG5o X21mX3RhZyIgb25jbGljaz0id2luZG93Lm9wZW4odGhpcy5ocmVmLCBcJ3BvcHVwd2luZG93 XCcsIFwnd2lkdGg9NDAwLGhlaWdodD00MDAsc2Nyb2xsYmFycyxyZXNpemFibGVcJyk7IHJl dHVybiBmYWxzZTsiPnJlbC10YWc8L2E+PGJyIC8+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9 Ij9ldmVudD10YWcmIzM4O25hbWU9cG5oX21mX2xpY2Vuc2UiIG9uY2xpY2s9IndpbmRvdy5v cGVuKHRoaXMuaHJlZiwgXCdwb3B1cHdpbmRvd1wnLCBcJ3dpZHRoPTQwMCxoZWlnaHQ9NDAw LHNjcm9sbGJhcnMscmVzaXphYmxlXCcpOyByZXR1cm4gZmFsc2U7Ij5yZWwtbGljZW5zZTwv YT48YnIgLz48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iP2V2ZW50PXRhZyYjMzg7bmFtZT1w bmhfbWZfZ2VvIiBvbmNsaWNrPSJ3aW5kb3cub3Blbih0aGlzLmhyZWYsIFwncG9wdXB3aW5k b3dcJywgXCd3aWR0aD00MDAsaGVpZ2h0PTQwMCxzY3JvbGxiYXJzLHJlc2l6YWJsZVwnKTsg cmV0dXJuIGZhbHNlOyI+Z2VvPC9hPic7Cgl0YmxjZWxsLmFwcGVuZENoaWxkKG5ld2hlbHBl cnMpOwp9CgotLT4KPC9zY3JpcHQ+CkVPRjsKCX0KCgkvLyBhcnRpY2xlIGVkaXRvciBoZWxw ZXIgdGFncwoJLy8gSW5zZXJ0cyB0YWcgaGVscGVycyBpbiBsZWZ0IGNvbHVtbiB2aWEgRE9N IG1hbmlwdWxhdGlvbgoJZnVuY3Rpb24gcG5oX21mX2FydGljbGVoZWxwZXJzKCkgewogICAg ZWNobzw8PEVPRgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgppZiAo ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQpIHsKCgkvLyBUaGlzIGlzIHNvbWUgYXdmdWwgbG9n aWMgdG8gZmluZCB0aGUgdGFibGUgY2VsbCBJIHdhbnQKCXZhciB0YmxjZWxsID0gZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQoJ3RleHRpbGVfaGVscCcpLnBhcmVudE5vZGU7CgoJdmFyIG5l d2hlbHBlcnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQJyk7CgluZXdoZWxwZXJzLmlu bmVySFRNTCA9ICdNaWNyb2Zvcm1hdHM8YnIgLz48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0i P2V2ZW50PXRhZyYjMzg7bmFtZT1wbmhfbWZfeGZuIiBvbmNsaWNrPSJ3aW5kb3cub3Blbih0 aGlzLmhyZWYsIFwncG9wdXB3aW5kb3dcJywgXCd3aWR0aD00MDAsaGVpZ2h0PTQwMCxzY3Jv bGxiYXJzLHJlc2l6YWJsZVwnKTsgcmV0dXJuIGZhbHNlOyI+WEZOPC9hPjxiciAvPjxhIHRh cmdldD0iX2JsYW5rIiBocmVmPSI/ZXZlbnQ9dGFnJiMzODtuYW1lPXBuaF9tZl9oY2FyZCIg b25jbGljaz0id2luZG93Lm9wZW4odGhpcy5ocmVmLCBcJ3BvcHVwd2luZG93XCcsIFwnd2lk dGg9NDAwLGhlaWdodD00MDAsc2Nyb2xsYmFycyxyZXNpemFibGVcJyk7IHJldHVybiBmYWxz ZTsiPmhDYXJkPC9hPjxiciAvPjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSI/ZXZlbnQ9dGFn JiMzODtuYW1lPXBuaF9tZl9hZHIiIG9uY2xpY2s9IndpbmRvdy5vcGVuKHRoaXMuaHJlZiwg XCdwb3B1cHdpbmRvd1wnLCBcJ3dpZHRoPTQwMCxoZWlnaHQ9NDAwLHNjcm9sbGJhcnMscmVz aXphYmxlXCcpOyByZXR1cm4gZmFsc2U7Ij5hZHI8L2E+PGJyIC8+PGEgdGFyZ2V0PSJfYmxh bmsiIGhyZWY9Ij9ldmVudD10YWcmIzM4O25hbWU9cG5oX21mX2hjYWxlbmRhciIgb25jbGlj az0id2luZG93Lm9wZW4odGhpcy5ocmVmLCBcJ3BvcHVwd2luZG93XCcsIFwnd2lkdGg9NDAw LGhlaWdodD00MDAsc2Nyb2xsYmFycyxyZXNpemFibGVcJyk7IHJldHVybiBmYWxzZTsiPmhD YWxlbmRhcjwvYT48YnIgLz48YSBocmVmPSI/ZXZlbnQ9dGFnJiMzODtuYW1lPXBuaF9tZl90 YWciIG9uY2xpY2s9IndpbmRvdy5vcGVuKHRoaXMuaHJlZiwgXCdwb3B1cHdpbmRvd1wnLCBc J3dpZHRoPTQwMCxoZWlnaHQ9NDAwLHNjcm9sbGJhcnMscmVzaXphYmxlXCcpOyByZXR1cm4g ZmFsc2U7Ij5yZWwtdGFnPC9hPjxiciAvPjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSI/ZXZl bnQ9dGFnJiMzODtuYW1lPXBuaF9tZl9saWNlbnNlIiBvbmNsaWNrPSJ3aW5kb3cub3Blbih0 aGlzLmhyZWYsIFwncG9wdXB3aW5kb3dcJywgXCd3aWR0aD00MDAsaGVpZ2h0PTQwMCxzY3Jv bGxiYXJzLHJlc2l6YWJsZVwnKTsgcmV0dXJuIGZhbHNlOyI+cmVsLWxpY2Vuc2U8L2E+PGJy IC8+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Ij9ldmVudD10YWcmIzM4O25hbWU9cG5oX21m X2dlbyIgb25jbGljaz0id2luZG93Lm9wZW4odGhpcy5ocmVmLCBcJ3BvcHVwd2luZG93XCcs IFwnd2lkdGg9NDAwLGhlaWdodD00MDAsc2Nyb2xsYmFycyxyZXNpemFibGVcJyk7IHJldHVy biBmYWxzZTsiPmdlbzwvYT4nOwoJdGJsY2VsbC5hcHBlbmRDaGlsZChuZXdoZWxwZXJzKTsK fQoKLS0+Cjwvc2NyaXB0PgpFT0Y7Cgl9CgoKCiI7czozOiJtZDUiO3M6MzI6IjEzMDYwNzk1 M2QzMDRlNDVjYTUwZjMxZmE3NDcwNmI5Ijt9