# smd_remote_file 0.3 # Allows remote URL files to be handled from the Files tab # 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: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTU6InNtZF9yZW1vdGVfZmlsZSI7czo2OiJhdXRob3IiO3M6MTE6IlN0ZWYgRGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIyOiJodHRwOi8vc3RlZmRhd3Nvbi5jb20vIjtzOjc6InZlcnNpb24iO3M6MzoiMC4zIjtzOjExOiJkZXNjcmlwdGlvbiI7czo1NjoiQWxsb3dzIHJlbW90ZSBVUkwgZmlsZXMgdG8gYmUgaGFuZGxlZCBmcm9tIHRoZSBGaWxlcyB0YWIiO3M6NDoiaGVscCI7czoyNzEyOiI8c3R5bGU+DQpjb2RlIHtjb2xvcjogIzIwNDY2Zn0NCnByZSB7cGFkZGluZzogMC41ZW0gMWVtOyBiYWNrZ3JvdW5kOiAjZWVlOyBib3JkZXI6IDFweCBkYXNoZWQgI2NjYzt9DQpoMSwgaDIsIGgzLCBoMyBjb2RlIHtmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGQ7fQ0KaDEsIGgyLCBoMyB7bWFyZ2luLWxlZnQ6IC0xZW07fQ0KaDIsIGgzIHttYXJnaW4tdG9wOiAyZW07fQ0KaDEge2ZvbnQtc2l6ZTogM2VtO30NCmgyIHtmb250LXNpemU6IDJlbTt9DQpoMyB7Zm9udC1zaXplOiAxLjVlbTt9DQpsaSBhIGNvZGUge2ZvbnQtd2VpZ2h0OiBub3JtYWw7fQ0KLnJlcXVpcmVkLCAud2FybmluZyB7Y29sb3I6cmVkO30NCiNlZ3RhYiB0ZCwjZWd0YWIgdGgge3BhZGRpbmc6LjdlbTsgYm9yZGVyOjFweCBzb2xpZCAjODg4O3RleHQtYWxpZ246Y2VudGVyO30NCjwvc3R5bGU+DQo8aDEgaWQ9InRvcCI+c21kX3JlbW90ZV9maWxlPC9oMT4NCjxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHVzYWdlLCBidWdzLCBmZWF0dXJlcyBldGMsIHBsZWFzZSA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MjQ2NzMiPnZpc2l0IHRoZSBmb3J1bSB0aHJlYWQ8L2E+LiBGb3Igb3RoZXIgc29mdHdhcmUgYnkgbWUsIG9yIHRvIG1ha2UgYSBkb25hdGlvbiwgc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc3ciPnNvZnR3YXJlIHBhZ2U8L2E+LjwvcD4NCg0KPHA+VG8gc2F2ZSBzcGFjZSBpbiB0aGUgcGx1Z2luLCB0aGUgZm9sbG93aW5nIHRhYmxlIG9mIGNvbnRlbnRzIGFsbCBsaW5rIGJhY2sgdG8gbXkgd2ViIHNpdGUgZm9yIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgZnVsbCB2ZXJzaW9uIG9mIHRoZSBkb2NzIGFyZSBzdXBwbGllZCBpbiB0aGUgcGx1Z2luIHppcCBwYWNrYWdlIGluIGNhc2UgdGhlIHNpdGUgaXMgdW5hdmFpbGFibGUgZm9yIHNvbWUgcmVhc29uLjwvcD4NCg0KPGgyIGlkPSJjb250ZW50cyI+Q29udGVudHM8L2gyPg0KPHVsPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjb3ZlcnZpZXciPk92ZXJ2aWV3PC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNwcmVyZXEiPkJlZm9yZSB5b3UgYmVnaW48L2E+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZpbGVzdGFiIj5UaGUgRmlsZXMgdGFiPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNtdWx0aXBsZXMiPk11bHRpcGxlIHBlcnNvbmFsaXRpZXM8L2E+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZkbCI+c21kX2ZpbGVfZG93bmxvYWRfbGluazwvYT4NCjx1bD4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZkbGlkIj5pZDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjZmRsZmlsZW5hbWUiPmZpbGVuYW1lPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNmZGxjaG9vc2UiPmNob29zZTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjZmRsc2hvd2xpbmsiPnNob3dfbGluazwvYT48L2xpPg0KPC91bD48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjZmRpIj5zbWRfZmlsZV9kb3dubG9hZF9pbWFnZTwvYT4NCjx1bD4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2ZkaWlkIj5pZDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjZmRpZmlsZW5hbWUiPmZpbGVuYW1lPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNmZGlleHRlbnNpb24iPmV4dGVuc2lvbjwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjZmRpdGh1bWIiPnRodW1iPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNmZGlpZm1pc3NpbmciPmlmbWlzc2luZzwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjZmRpd3JhcHRhZyI+d3JhcHRhZzwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjZmRpY2xhc3MiPmNsYXNzPC9hPjwvbGk+DQo8L3VsPjwvbGk+DQo8bGk+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3NtZF9yZW1vdGVfZmlsZSNob3dpdHdvcmtzIj5Ib3cgaXQgd29ya3M8L2E+PC9saT4NCjxsaT48YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlI2V4YW1wbGVzIj5FeGFtcGxlczwvYT48L2xpPg0KPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zbWRfcmVtb3RlX2ZpbGUjY3JlZGl0cyI+Q3JlZGl0czwvYT48L2xpPg0KPC91bD4iO3M6NDoiY29kZSI7czoxMjAxMzoiLy8gdjAuMSAgIEluaXRpYWwgcHVibGljIHJlbGVhc2UNCi8vIHYwLjIgICBGaXhlZCBkb3dubG9hZCBjb3VudGVyLiBBZGRlZCAodGVudGF0aXZlKSBpbnRlcmZhY2UgbWVzc2FnZXMgdGhhdCBtYXkgYnJlYWsgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgVFhQDQovLyB2MC4zICAgUmVtb3ZlZCAubGluayB3aGVuIHVzaW5nIHNtZF9maWxlX2Rvd25sb2FkX2xpbmsuIEFkZGVkIHNob3dfbGluayBvcHRpb24gdG8gcmVpbnN0YXRlIGl0IGlmIHJlcXVpcmVkLiBJbXByb3ZlZCBlcnJvciBoYW5kbGluZyBjb2RlOiBub3cgcGFzc2VzIGJhY2sgdG8gVFhQIHRvIGhhbmRsZS4gRG93bmxvYWQgY291bnQgb25seSBpbmNyZWFzZXMgaWYgZmlsZSBzaXplcyBtYXRjaA0KDQppZiAodHhwaW50ZXJmYWNlID09PSAnYWRtaW4nKSB7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9yZW1vdGVfZmlsZV9yZXBsYWNlJywgJ2ZpbGUnLCAnZmlsZV9yZXBsYWNlJyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9yZW1vdGVfZmlsZV9yZXBsYWNlJywgJ2ZpbGUnLCAnZmlsZV9zYXZlJyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9yZW1vdGVfZmlsZV9jcmVhdGUnLCAnZmlsZScsICdzbWRfcmVtb3RlX2ZpbGVfY3JlYXRlJywgMSk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9yZW1vdGVfZmlsZScsICdmaWxlJyk7DQp9DQoNCmlmICh0eHBpbnRlcmZhY2UgPT09ICdwdWJsaWMnKSB7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9yZW1vdGVfZG93bmxvYWQnLCAnZmlsZV9kb3dubG9hZCcpOw0KfQ0KDQovLyBZdWsgOi0oDQpnbG9iYWwgJHNtZF9yZW1vdGVfZmlsZV92YXJzOw0KJHNtZF9yZW1vdGVfZmlsZV92YXJzID0gYXJyYXkoDQoJCSdtc2cnID0+ICcnLA0KCSk7DQoNCi8vIEJsb3ctYnktYmxvdyBlcXVpdmFsZW50IG9mIGZpbGVfZG93bmxvYWRfbGluaywganVzdCBhIHJlbW90ZS1hd2FyZSB2ZXJzaW9uLg0KLy8gQWRkcyB0aGUgY2hvb3NlIG9wdGlvbi4gRGVmYXVsdHMgdG8gMCAoID0gcmFuZG9tLCBmb3IgbG9hZCBiYWxhbmNpbmcpLiBTcGVjaWZ5DQovLyBhbnkgaGlnaGVyIGludGVnZXIgdG8gZ3JhYiB0aGF0IHBhcnRpY3VsYXIgZW50cnkgZnJvbSB0aGUgZmlsZSAoaWYgaXQgZXhpc3RzLCBlbHNlIHVzZSAxc3QpDQpmdW5jdGlvbiBzbWRfZmlsZV9kb3dubG9hZF9saW5rKCRhdHRzLCAkdGhpbmcpIHsNCglnbG9iYWwgJHRoaXNmaWxlOw0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdmaWxlbmFtZScJPT4gJycsDQoJCSdpZCcJCQk9PiAnJywNCgkJJ2Nob29zZScJCT0+ICcwJywNCgkJJ3Nob3dfbGluaycJPT4gJzAnLA0KCSksICRhdHRzKSk7DQoNCgkvLyBSZW1vdmUgdGhlIGV4dHJhIGF0dHJpYnV0ZXMgbm90IGluIHRoZSBvcmdpbmFsIHRhZw0KCXVuc2V0KCRhdHRzWydzaG93X2xpbmsnXSk7DQoJdW5zZXQoJGF0dHNbJ2Nob29zZSddKTsNCg0KCSRrZXlzID0gYXJyYXkoInNtZF9jaG9vc2UiID0+ICRjaG9vc2UpOw0KCSRvdXQgPSBmaWxlX2Rvd25sb2FkX2xpbmsoJGF0dHMsICR0aGluZyk7DQoJaWYgKHN0cnBvcygkdGhpc2ZpbGVbJ2ZpbGVuYW1lJ10sICIubGluayIpKSB7DQoJCSRvcmlnTGluayA9IGV4cGxvZGUoJyInLCAkb3V0KTsNCgkJJG9yaWdMaW5rWzFdID0gKCgkc2hvd19saW5rKSA/ICRvcmlnTGlua1sxXSA6IHN0cl9yZXBsYWNlKCIubGluayIsICIiLCAkb3JpZ0xpbmtbMV0pKSAuIGpvaW5fcXMoJGtleXMpOyAvLyBXaWxsIGlnbm9yZSBqb2luX3FzIGlmIGNob29zZSBpcyAwDQoJCSRvdXQgPSBpbXBsb2RlKCciJywgJG9yaWdMaW5rKTsNCgl9DQoJcmV0dXJuICRvdXQ7DQp9DQoNCi8vIEFkZCBhbiBpbWFnZSB0byB0aGUgZG93bmxvYWQgZm9ybSB3aGljaCwgYnkgZGVmYXVsdCwgaXMgYmFzZWQgb24gdGhlIGZpbGVuYW1lIG9mIHRoZSBkb3dubG9hZCBpdHNlbGYNCmZ1bmN0aW9uIHNtZF9maWxlX2Rvd25sb2FkX2ltYWdlKCRhdHRzKSB7DQoJZ2xvYmFsICR0aGlzZmlsZTsNCglhc3NlcnRfZmlsZSgpOw0KDQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ2ZpbGVuYW1lJwk9PiAnJywNCgkJJ2lkJwkJCSA9PiAnJywNCgkJJ2V4dGVuc2lvbicJID0+ICdqcGcnLA0KCQknaWZtaXNzaW5nJwkgPT4gJz9maWxlJywNCgkJJ3RodW1iJwkJPT4gJzAnLA0KCQknY2xhc3MnCQk9PiAnJywNCgkJJ3dyYXB0YWcnCT0+ICcnLA0KCSksICRhdHRzKSk7DQoJJGZpbGVsaW5rID0gJHRoaXNmaWxlWydmaWxlbmFtZSddOw0KCWlmICgkZmlsZW5hbWUgPT0gIiIpIHsNCgkJJGZpbGVuYW1lID0gJGZpbGVsaW5rOw0KCX0NCgkkZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgiLmxpbmsiLCAiIiwgJGZpbGVuYW1lKSAuICgoJGV4dGVuc2lvbj09IiIpID8gJycgOiAnLicuJGV4dGVuc2lvbik7DQoNCgkkaW1nID0gJyc7DQoJaWYgKCRpZCkgew0KCQkkaW1nID0gKCR0aHVtYj09MCkgPyBAaW1hZ2UoYXJyYXkoImlkIiA9PiAkaWQsICJjbGFzcyIgPT4gJGNsYXNzLCAid3JhcHRhZyIgPT4gJHdyYXB0YWcpKSA6IEB0aHVtYm5haWwoYXJyYXkoImlkIiA9PiAkaWQsICJjbGFzcyIgPT4gJGNsYXNzLCAid3JhcHRhZyIgPT4gJHdyYXB0YWcpKTsNCgl9IGVsc2UgaWYgKChzdHJwb3MoJGZpbGVuYW1lLCAiaHR0cDovLyIpID09PSAwKSB8fCAoc3RycG9zKCRmaWxlbmFtZSwgIi8iKSA9PT0gMCkpIHsNCgkJJGltZyA9ICgoJHdyYXB0YWc9PSIiKSA/ICcnIDogJzwnLiR3cmFwdGFnLiAoKCRjbGFzcz09IiIpID8gJycgOiAnIGNsYXNzPSInLiRjbGFzcy4nIicpIC4nPicpIC4gJzxpbWcgc3JjPSInLiRmaWxlbmFtZS4nIicuICgoJHdyYXB0YWc9PSIiICYmICRjbGFzcykgPyAnIGNsYXNzPSInLiRjbGFzcy4nIicgOiAnJykgLiAnLz4nLiAoKCR3cmFwdGFnPT0iIikgPyAnJyA6ICc8LycuJHdyYXB0YWcuJz4nKTsNCgl9IGVsc2Ugew0KCQkkaW1nID0gKCR0aHVtYj09MCkgPyBAaW1hZ2UoYXJyYXkoIm5hbWUiID0+ICRmaWxlbmFtZSwgImNsYXNzIiA9PiAkY2xhc3MsICJ3cmFwdGFnIiA9PiAkd3JhcHRhZykpIDogQHRodW1ibmFpbChhcnJheSgibmFtZSIgPT4gJGZpbGVuYW1lLCAiY2xhc3MiID0+ICRjbGFzcywgIndyYXB0YWciID0+ICR3cmFwdGFnKSk7DQoJfQ0KCSRkaXNwbGF5ID0gKCRpZCkgPyAkaWQgOiAkZmlsZW5hbWU7DQoJJHdyYXBwZXIgPSAoKCR3cmFwdGFnPT0iIikgPyAnQEBSRVBMJyA6ICc8Jy4kd3JhcHRhZy4gKCgkY2xhc3M9PSIiKSA/ICcnIDogJyBjbGFzcz0iJy4kY2xhc3MuJyInKSAuJz5AQFJFUEw8LycuJHdyYXB0YWcuJz4nKTsNCglyZXR1cm4gKCRpbWcpID8gJGltZyA6ICgoJGlmbWlzc2luZz09Ij9maWxlIikgPyBzdHJfcmVwbGFjZSgiQEBSRVBMIiwgJGRpc3BsYXksICR3cmFwcGVyKSA6ICgoJGlmbWlzc2luZz09IiIpID8gJycgOiBzdHJfcmVwbGFjZSgiQEBSRVBMIiwgJGlmbWlzc2luZywgJHdyYXBwZXIpKSk7DQp9DQoNCi8vIEdlbmVyaWMgY2FsbGJhY2sgd2hpY2ggaXMgZmlyZWQgX2FmdGVyXyB0aGUgRmlsZXMgcGFnZSBoYXMgbG9hZGVkLg0KLy8gUGVyZm9ybXMgZGlzcGxheSBjbGVhbnVwL2luc2VydGlvbiBhbmQgcG9zdCBwcm9jZXNzaW5nIG9mIGFueSBmaWxlIGluc2VydHMvZWRpdHMNCmZ1bmN0aW9uIHNtZF9yZW1vdGVfZmlsZSgkZXZlbnQsICRzdGVwKSB7DQoJZ2xvYmFsICRzbWRfcmVtb3RlX2ZpbGVfdmFyczsNCg0KCSRoZWxwTGluayA9ICc8YSB0YXJnZXQ9Il9ibGFuayInLg0KCQkJJyBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc21kX3JlbW90ZV9maWxlX3VybF9wb3B1cCInLg0KCQkJJyBvbmNsaWNrPSJwb3BXaW4odGhpcy5ocmVmKTsgcmV0dXJuIGZhbHNlOyIgY2xhc3M9InBvcGhlbHAiPj88L2E+JzsNCgkkdWxfZm9ybSA9IHRyaW0oZm9ybShlSW5wdXQoJ2ZpbGUnKS4gc0lucHV0KCdzbWRfcmVtb3RlX2ZpbGVfY3JlYXRlJykuDQoJCQkJCWdyYWYoJ29yIFVSTCcuc3AuJGhlbHBMaW5rLnNwLmZJbnB1dCgndGV4dCcsICdzbWRfcmVtb3RlX3VybCcsICcnLCAnZWRpdCcsICdFbnRlciBhIFVSTCB0byB1cGxvYWQgdG8gVFhQJywgJycsICczMicpLnNwLg0KCQkJCQkJZklucHV0KCdzdWJtaXQnLCAnJywgJ1VwbG9hZCcsICdzbWFsbGVyYm94JykpDQoJCQkJLCAndGV4dC1hbGlnbjogY2VudGVyOycpKTsNCgllY2hvIHNtZF9yZW1vdGVfanMoJyQoIi51cGxvYWQtZm9ybSIpLmFwcGVuZChcJycuJHVsX2Zvcm0uJ1wnKTsnKTsNCg0KCWlmICgkc21kX3JlbW90ZV9maWxlX3ZhcnNbJ21zZyddICE9ICIiKSB7DQoJCWVjaG8gc21kX3JlbW90ZV9qcygnJCgiI25hdi1wcmltYXJ5IHRhYmxlIHRkOmVxKDApIikuYXBwZW5kKFwnJy4kc21kX3JlbW90ZV9maWxlX3ZhcnNbJ21zZyddLidcJyk7Jyk7DQoJfQ0KfQ0KDQovLyBFdmVyeSB0aW1lIGEgZmlsZSBpcyBzYXZlZC9lZGl0ZWQsIFRYUCByZWNhbGN1bGF0ZXMgaXRzIHNpemUgZnJvbSB0aGUgcmVhbCBmaWxlIChncnJyKS4NCi8vIFRoaXMgaXMgdW5kZXNpcmFibGUgc28gaXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgcmVtb3RlIFVSTCBmaWxlIGluc3RlYWQuDQpmdW5jdGlvbiBzbWRfcmVtb3RlX2ZpbGVfcmVwbGFjZSgpIHsNCglleHRyYWN0KGdwc2EoYXJyYXkoJ2lkJykpKTsNCglzbWRfcmVtb3RlX3NldF9zaXplKCRpZCk7DQp9DQoNCi8vIFNldHMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIFRYUCBkYXRhYmFzZSBmaWxlIHRvIHRoYXQgb2YgaXRzIGNvcnJlc3BvbmRpbmcgInJlYWwiIHJlbW90ZSBVUkwgZmlsZSBzaXplDQpmdW5jdGlvbiBzbWRfcmVtb3RlX3NldF9zaXplKCRpZF9vcl9maWxlKSB7DQoJZ2xvYmFsICRmaWxlX2Jhc2VfcGF0aDsNCg0KCWlmIChpc19udW1lcmljKCRpZF9vcl9maWxlKSkgew0KCQkkZmlsZW5hbWUgPSB0cmltKHNhZmVfZmllbGQoImZpbGVuYW1lIiwgInR4cF9maWxlIiwgImlkPSIuaW50dmFsKCRpZF9vcl9maWxlKSkpOw0KCX0gZWxzZSB7DQoJCSRmaWxlbmFtZSA9IHRyaW0oZG9TbGFzaCgkaWRfb3JfZmlsZSkpOw0KCX0NCglpZiAoc3RycG9zKCRmaWxlbmFtZSwgIi5saW5rIikpIHsNCgkJJGZpbGVwYXRoID0gYnVpbGRfZmlsZV9wYXRoKCRmaWxlX2Jhc2VfcGF0aCwgJGZpbGVuYW1lKTsNCgkJJHVybCA9IHNtZF9yZW1vdGVfZmlsZV9saXN0KCRmaWxlcGF0aCwgMSwgMSk7DQoJCWlmIChjb3VudCgkdXJsKSA+IDApIHsNCgkJCSRoZHJzID0gc21kX2dldF9oZWFkZXJzKCR1cmxbMF0sIDEpOw0KCQkJJHNpemUgPSAoJGhkcnMgPT09IGZhbHNlIHx8ICFpc3NldCgkaGRyc1snY29udGVudC1sZW5ndGgnXSkpID8gMSA6ICRoZHJzWydjb250ZW50LWxlbmd0aCddOw0KCQkJc2FmZV91cGRhdGUoInR4cF9maWxlIiwgInNpemU9Ii4kc2l6ZSwgImZpbGVuYW1lPSciLiRmaWxlbmFtZS4iJyIpOw0KCQl9DQoJfQ0KfQ0KDQovLyBDYWxsYmFjayBmb3IgdXBsb2FkaW5nIGEgVVJMIGZyb20gdGhlIEZpbGVzIHRhYg0KZnVuY3Rpb24gc21kX3JlbW90ZV9maWxlX2NyZWF0ZSgpIHsNCglnbG9iYWwgJGZpbGVfYmFzZV9wYXRoLCAkc21kX3JlbW90ZV9maWxlX3ZhcnM7DQoNCglleHRyYWN0KGRvU2xhc2goZ3BzYShhcnJheSgnc21kX3JlbW90ZV91cmwnLCdjYXRlZ29yeScsJ3Blcm1pc3Npb25zJywnZGVzY3JpcHRpb24nKSkpKTsNCg0KCSR1cmwgPSB0cmltKCRzbWRfcmVtb3RlX3VybCk7DQoJLy8gT25seSBpbnRlcmNlcHQgcmVtb3RlIGZpbGVzOyBsZWF2ZSBldmVyeXRoaW5nIGVsc2UgZm9yIFRYUCB0byBtYW5hZ2UNCglpZiAoc3RycG9zKCR1cmwsICJodHRwIikgPT09IDApIHsNCgkJJGhkcnMgPSBzbWRfZ2V0X2hlYWRlcnMoJHVybCwgMSk7DQoJCSRzaXplID0gKCRoZHJzID09PSBmYWxzZSB8fCAhaXNzZXQoJGhkcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pKSA/IDEgOiAkaGRyc1snY29udGVudC1sZW5ndGgnXTsNCg0KCQkvLyBNYWtlIGEgZmlsZW5hbWUgYW5kIGZ1bGwgcGF0aDogdW5lbmNvZGVkDQoJCSRkZXN0X2ZpbGVuYW1lID0gYmFzZW5hbWUodXJsZGVjb2RlKCR1cmwpKS4iLmxpbmsiOw0KCQkkZGVzdF9maWxlcGF0aCA9IGJ1aWxkX2ZpbGVfcGF0aCgkZmlsZV9iYXNlX3BhdGgsICRkZXN0X2ZpbGVuYW1lKTsNCg0KCQlpZiAoZmlsZV9leGlzdHMoJGRlc3RfZmlsZXBhdGgpKSB7DQoJCQkvLyBSZWFkIHRoZSB3aG9sZSBmaWxlIGJlY2F1c2Ugd2Ugb25seSB3YW50IHRvIGFkZCB0aGUgVVJMIGlmIGl0J3Mgbm90IHRoZXJlIGFscmVhZHkNCgkJCSRsaW5lcyA9IHNtZF9yZW1vdGVfZmlsZV9saXN0KCRkZXN0X2ZpbGVwYXRoLCAwLCAxKTsNCgkJCWlmICghaW5fYXJyYXkoJHVybCwgJGxpbmVzKSkgew0KCQkJCSRoYW5kbGUgPSBmb3BlbigkZGVzdF9maWxlcGF0aCwgImEiKTsNCgkJCQlmd3JpdGUoJGhhbmRsZSwgJHVybC5uKTsNCgkJCQlmY2xvc2UoJGhhbmRsZSk7DQoJCQkJJHNtZF9yZW1vdGVfZmlsZV92YXJzWydtc2cnXSA9IGdUeHQoJ2ZpbGVfdXBsb2FkZWQnLCBhcnJheSgne25hbWV9JyA9PiB1cmxkZWNvZGUoJHVybCkpKTsNCgkJCX0gZWxzZSB7DQoJCQkJJHNtZF9yZW1vdGVfZmlsZV92YXJzWydtc2cnXSA9IGdUeHQoJ2ZpbGVfYWxyZWFkeS1leGlzdHMnLCBhcnJheSgne25hbWV9JyA9PiB1cmxkZWNvZGUoJHVybCkpKTsNCgkJCX0NCgkJCS8vIFNldCB0aGUgc2l6ZSBqdXN0IGluIGNhc2UNCgkJCXNtZF9yZW1vdGVfc2V0X3NpemUoJGRlc3RfZmlsZW5hbWUpOw0KCQl9IGVsc2Ugew0KCQkJLy8gRmlsZSBkb2Vzbid0IGV4aXN0IHNvIGNyZWF0ZSBpdCBhbmQgcHV0IHRoZSBVUkwgaW5zaWRlDQoJCQkkdG1wID0gdGVtcG5hbSgiL3RtcCIsICJzbWRfIik7DQoJCQkkaGFuZGxlID0gZm9wZW4oJHRtcCwgInciKTsNCgkJCWZ3cml0ZSgkaGFuZGxlLCAkdXJsLm4pOw0KCQkJZmNsb3NlKCRoYW5kbGUpOw0KCQkJcmVuYW1lKCR0bXAsICRkZXN0X2ZpbGVwYXRoKTsNCg0KCQkJLy8gQWRkIHRoZSBmaWxlIHRvIFRYUA0KCQkJJHJldCA9IHNhZmVfaW5zZXJ0KCJ0eHBfZmlsZSIsDQoJCQkJImZpbGVuYW1lID0gJyRkZXN0X2ZpbGVuYW1lJywNCgkJCQkgY2F0ZWdvcnkgPSAnJGNhdGVnb3J5JywNCgkJCQkgcGVybWlzc2lvbnMgPSAnJHBlcm1pc3Npb25zJywNCgkJCQkgZGVzY3JpcHRpb24gPSAnJGRlc2NyaXB0aW9uJywNCgkJCQkgc2l6ZSA9ICckc2l6ZScsDQoJCQkJIGNyZWF0ZWQgPSBub3coKSwNCgkJCQkgbW9kaWZpZWQgPSBub3coKQ0KCQkJIik7DQoJCQkkc21kX3JlbW90ZV9maWxlX3ZhcnNbJ21zZyddID0gZ1R4dCgnZmlsZV91cGxvYWRlZCcsIGFycmF5KCd7bmFtZX0nID0+IHVybGRlY29kZSgkdXJsKSkpOw0KCQl9DQoJfSBlbHNlIHsNCgkJJHNtZF9yZW1vdGVfZmlsZV92YXJzWydtc2cnXSA9IGdUeHQoJ2ZpbGVfdXBsb2FkX2ZhaWxlZCcpOw0KCX0NCn0NCg0KLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGNob3NlbiBmaWxlIChmdWxsIHBhdGggcmVxdWlyZWQpIGFuZCBnZXQgbGluZXMgZnJvbSB3aXRoaW4sIGFkZGluZyB0aGVtIHRvIGFuIGFycmF5Lg0KLy8gICRvZmZzZXQgaXMgd2hlcmUgdG8gc3RhcnQgZnJvbS4gTm9ybWFsbHkgMSA9IDFzdCByb3csIDIgPSAybmQgcm93IGFuZCBzbyBvbi4gMCA9IGEgcmFuZG9tIHJvdy4NCi8vICAkcXR5IHNwZWNpZmllcyBob3cgbWFueSByb3dzIHRvIHB1bGwuIDAgPSB1bmxpbWl0ZWQuDQpmdW5jdGlvbiBzbWRfcmVtb3RlX2ZpbGVfbGlzdCgkZm5hbWUsICRxdHk9MSwgJG9mZnNldD0wKSB7DQoJJG91dCA9IGFycmF5KCk7DQoJaWYgKGZpbGVfZXhpc3RzKCRmbmFtZSkpIHsNCgkJJGZkID0gZm9wZW4oJGZuYW1lLCAiciIpOw0KCQkvLyBSZWFkIHRoZSB3aG9sZSBmaWxlIGluICh5ZXMgdGhlcmUncyB0aGUgZmlsZSgpIGNhbGwsIGJ1dCBmZ2V0cygpIGlzIHN1cHBvc2VkbHkgcXVpY2tlciBvbiB0eHQgZmlsZXMpDQoJCXdoaWxlICghZmVvZigkZmQpKSB7DQoJCQkkbGluZSA9IHJ0cmltKGZnZXRzKCRmZCkpOw0KCQkJaWYgKCRsaW5lICE9ICIiKSB7DQoJCQkgICAkbGluZXNbXSA9ICRsaW5lOw0KCQkJfQ0KCQl9DQoJCWZjbG9zZSAoJGZkKTsNCgkJaWYgKCRvZmZzZXQgPT0gMCkgew0KCQkJc2h1ZmZsZSgkbGluZXMpOw0KCQkJJG9mZnNldCA9IDE7DQoJCX0NCgkJJG9mZnNldCA9ICgkb2Zmc2V0ID4gY291bnQoJGxpbmVzKSkgPyAxIDogJG9mZnNldDsNCgkJJG91dCA9ICgkcXR5ID09IDApID8gJGxpbmVzIDogYXJyYXlfc2xpY2UoJGxpbmVzLCAkb2Zmc2V0LTEsICRxdHkpOw0KCX0NCglyZXR1cm4gJG91dDsNCn0NCg0KLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkDQpmdW5jdGlvbiBzbWRfcmVtb3RlX2Rvd25sb2FkKCRldmVudCwgJHN0ZXApIHsNCglnbG9iYWwgJHByZXRleHQsICRpZCwgJGZpbGVfYmFzZV9wYXRoLCAkZmlsZV9lcnJvcjsNCg0KCS8vIEdldCB0aGUgInRydWUiIGZpbGVuYW1lICh1bmZvcnR1bmF0ZWx5IGZyb20gdGhlIGRhdGFiYXNlID0gMSBleHRyYSBxdWVyeSkuDQoJJHJlYWxfZmlsZSA9IHNhZmVfcm93KCJmaWxlbmFtZSwgc2l6ZSwgc3RhdHVzIiwgInR4cF9maWxlIiwgImlkPSIuaW50dmFsKCRpZCkpOw0KCWlmICgkcmVhbF9maWxlWydzdGF0dXMnXSA9PSBnZXRTdGF0dXNOdW0oImxpdmUiKSkgew0KCQlpZiAoc3RycG9zKCRyZWFsX2ZpbGVbJ2ZpbGVuYW1lJ10sICIubGluayIpID4gMCkgew0KCQkJJGNob29zZSA9IDA7DQoJCQkvLyBHZXQgYW55IG92ZXJyaWRpbmcgdmFsdWUgb2Ygc21kX2Nob29zZSBmcm9tIHRoZSBxdWVyeSBzdHJpbmcNCgkJCWlmICgkcHJldGV4dFsncXMnXSkgew0KCQkJCWxpc3QoJHFrZXksICRxdmFsKSA9IGV4cGxvZGUoIj0iLCAkcHJldGV4dFsncXMnXSk7DQoJCQkJaWYgKCRxa2V5ID09ICJzbWRfY2hvb3NlIikgew0KCQkJCQlpZiAoJHF2YWwgPiAwKSB7DQoJCQkJCQkkY2hvb3NlID0gaW50dmFsKCRxdmFsKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCS8vIFRoZSBmaWxlIHNpemUsIGhvd2V2ZXIsIGlzIHRoYXQgb2YgdGhlIHJlbW90ZSBmaWxlDQoJCQkkcmVtb3RlVVJMID0gc21kX3JlbW90ZV9maWxlX2xpc3QoYnVpbGRfZmlsZV9wYXRoKCRmaWxlX2Jhc2VfcGF0aCwgJHJlYWxfZmlsZVsnZmlsZW5hbWUnXSksIDEsICRjaG9vc2UpOw0KCQkJaWYgKGNvdW50KCRyZW1vdGVVUkwpID4gMCkgew0KCQkJCSR1cmwgPSAkcmVtb3RlVVJMWzBdOw0KCQkJCS8vIFRlc3QgdGhlIGZpbGUgZXhpc3RzOiBzbG93LCBidXQgcmVkdWNlcyBmYWxzZSBkb3dubG9hZCBjb3VudCBpbmNyZW1lbnRzDQoJCQkJJGhkcnMgPSBzbWRfZ2V0X2hlYWRlcnMoJHVybCwgMSk7DQoJCQkJJGFsbGtleSA9IHN0cnRvbG93ZXIoaW1wbG9kZSgiICIsIGFycmF5X2tleXMoJGhkcnMpKSk7DQoJCQkJaWYgKHN0cnBvcygkYWxsa2V5LCAiMjAwIikgPiAwICYmIHN0cnBvcygkYWxsa2V5LCAib2siKSA+IDApIHsNCgkJCQkJaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIERvd25sb2FkJyk7DQoJCQkJCWhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsNCgkJCQkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iJyAuIGJhc2VuYW1lKCRyZWFsX2ZpbGVbJ2ZpbGVuYW1lJ10pIC4gJyI7IHNpemUgPSAiJy4kcmVhbF9maWxlWydzaXplJ10uJyInKTsNCgkJCQkJLy8gRml4IGZvciBsYW1lIElFIDYgcGRmIGJ1ZyBvbiBzZXJ2ZXJzIGNvbmZpZ3VyZWQgdG8gc2VuZCBjYWNoZSBoZWFkZXJzDQoJCQkJCWhlYWRlcignQ2FjaGUtQ29udHJvbDogcHJpdmF0ZScpOw0KCQkJCQlAaW5pX3NldCgiemxpYi5vdXRwdXRfY29tcHJlc3Npb24iLCAiT2ZmIik7DQoJCQkJCUBzZXRfdGltZV9saW1pdCgwKTsNCgkJCQkJQGlnbm9yZV91c2VyX2Fib3J0KHRydWUpOw0KDQoJCQkJCS8vIEhhbmQtb2ZmIHRvIHRoZSByZW1vdGUgZmlsZQ0KCQkJCQloZWFkZXIoJ0xvY2F0aW9uOiAnIC4gJHVybCk7DQoNCgkJCQkJLy8gcmVjb3JkIGRvd25sb2FkIGlmIHRoZSBmaWxlIHNpemVzIG1hdGNoDQoJCQkJCWlmIChpbnR2YWwoJGhkcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pID09IGludHZhbCgkcmVhbF9maWxlWydzaXplJ10pKSB7DQoJCQkJCQlzYWZlX3VwZGF0ZSgidHhwX2ZpbGUiLCAiZG93bmxvYWRzPWRvd25sb2FkcysxIiwgJ2lkPScuaW50dmFsKCRpZCkpOw0KCQkJCQkJbG9nX2hpdCgnMjAwJyk7DQoJCQkJCX0NCgkJCQkJLy8gcmVtb3RlIGRvd25sb2FkIGRvbmU6IGdhbWUgb3Zlcg0KCQkJCQlleGl0KDApOw0KDQoJCQkJfSBlbHNlIHsNCgkJCQkJJGZpbGVfZXJyb3IgPSA0MDQ7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkZmlsZV9lcnJvciA9IDQwNDsNCgkJCX0NCgkJfQ0KCX0gZWxzZSB7DQoJCQkkZmlsZV9lcnJvciA9IDQwMzsNCgl9DQoNCgkvLyByZW1vdGUgZG93bmxvYWQgbm90IGRvbmUgLSBsZWF2ZSB0byBUWFAgdG8gaGFuZGxlIGVycm9yIG9yICJsb2NhbCIgZmlsZSBkb3dubG9hZA0KCXJldHVybjsNCn0NCg0KZnVuY3Rpb24gc21kX3JlbW90ZV9qcygkY29udGVudCkgew0KCSRvdXQgPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPicubjsNCgkkb3V0IC49ICRjb250ZW50Lm47DQoJJG91dCAuPSAnPC9zY3JpcHQ+Jy5uOw0KCXJldHVybiAkb3V0Ow0KfQ0KDQovLyBQSFA0IGVtdWxhdGlvbihpc2gpIG9mIFBIUDUncyBnZXRfaGVhZGVycygpLiBTdG9sZW4gZnJvbSBwaHAubmV0IGFuZCBtb2RkZWQNCmZ1bmN0aW9uIHNtZF9nZXRfaGVhZGVycygkdXJsLCAkZm9ybWF0PTApIHsNCglpZiAoISR1cmwpIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCgkkdWluZm89cGFyc2VfdXJsKCR1cmwpOw0KCSRoZWFkZXJzID0gYXJyYXkoKTsNCglpZiAoaXNfY2FsbGFibGUoJ2NoZWNrZG5zcnInKSAmJiAhY2hlY2tkbnNycigkdWluZm9bJ2hvc3QnXS4nLicsJ01YJykgJiYgIWNoZWNrZG5zcnIoJHVpbmZvWydob3N0J10uJy4nLCdBJykpIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCgkkcG9ydCA9IGlzc2V0KCR1aW5mb1sncG9ydCddKSA/ICR1aW5mb1sncG9ydCddIDogODA7DQoJJGZwPWZzb2Nrb3BlbigkdWluZm9bJ2hvc3QnXSwgJHBvcnQsICRlcnJubywgJGVycnN0ciwgMTUpOw0KDQoJaWYoJGZwKSB7DQoJCSRoZWFkID0gIkdFVCAiLkAkdWluZm9bJ3BhdGgnXS4iPyIuQCR1aW5mb1sncXVlcnknXS4iIEhUVFAvMS4wXHJcbiI7DQoJCSRoZWFkIC49ICJIb3N0OiAiLkAkdWluZm9bJ2hvc3QnXS4iOiIuJHBvcnQuIlxyXG4iOw0KCQkkaGVhZCAuPSAiQ29ubmVjdGlvbjogQ2xvc2VcclxuIjsNCgkJJGhlYWQgLj0gIkFjY2VwdDogKi8qXHJcbiI7DQoJCWlmIChAJHVpbmZvWyd1c2VyJ10pIHsNCgkJCSRoZWFkIC49ICJBdXRob3JpemF0aW9uOiBCYXNpYyAiLmJhc2U2NF9lbmNvZGUoJHVpbmZvWyd1c2VyJ10uJzonLiR1aW5mb1sncGFzcyddKS4iXHJcbiI7DQoJCX0NCgkJJGhlYWQgLj0gIlxyXG4iOw0KCQlmcHV0cygkZnAsICRoZWFkKTsNCgkJJGVvaGVhZGVyID0gZmFsc2U7DQoJCXdoaWxlKCFmZW9mKCRmcCkgb3IgKCRlb2hlYWRlcj09dHJ1ZSkpIHsNCgkJCWlmKCRoZWFkZXI9ZmdldHMoJGZwLCAxMDI0KSkgew0KCQkJCWlmICgkaGVhZGVyID09ICJcclxuIikgew0KCQkJCQkkZW9oZWFkZXIgPSB0cnVlOw0KCQkJCQlicmVhazsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkaGVhZGVyID0gdHJpbSgkaGVhZGVyKTsNCgkJCQl9DQoJCQkJaWYoJGZvcm1hdCA9PSAxKSB7DQoJCQkJCSRrZXkgPSBzdHJ0b2xvd2VyKGFycmF5X3NoaWZ0KGV4cGxvZGUoJzogJywkaGVhZGVyKSkpOw0KCQkJCQlpZigka2V5ID09ICRoZWFkZXIpIHsNCgkJCQkJCSRoZWFkZXJzW10gPSAkaGVhZGVyOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJGhlYWRlcnNbJGtleV09c3Vic3RyKCRoZWFkZXIsc3RybGVuKCRrZXkpKzIpOw0KCQkJCQl9DQoJCQkJCXVuc2V0KCRrZXkpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRoZWFkZXJzW10gPSAkaGVhZGVyOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJGhlYWRlcnM7DQoNCgl9IGVsc2Ugew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KfSI7czo0OiJ0eXBlIjtzOjE6IjEiO3M6MzoibWQ1IjtzOjMyOiIwNWMxOGYyNTllMzc2NzgxZGI0NGFkNzAyZDQyMzhiZiI7fQ==