# smd_lib v0.22 # Shared function library used by smd_ plugins and others. # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6NDoiMC4yMiI7czo2OiJhdXRob3IiO3M6MTE6IlN0ZWYg RGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIyOiJodHRwOi8vc3RlZmRhd3Nvbi5jb20v IjtzOjExOiJkZXNjcmlwdGlvbiI7czo1NjoiU2hhcmVkIGZ1bmN0aW9uIGxpYnJhcnkgdXNl ZCBieSBzbWRfIHBsdWdpbnMgYW5kIG90aGVycy4iO3M6NDoidHlwZSI7aToyO3M6NDoibmFt ZSI7czo3OiJzbWRfbGliIjtzOjQ6ImhlbHAiO3M6OTYyOiIJPGgxPnNtZF8gcGx1Z2luIGxp YnJhcnk8L2gxPgoKCTxwPk9mZmVycyBubyBwdWJsaWMgdGV4dHBhdHRlcm4gdGFncy4gSXQg aXMgc2ltcGx5IGEgc2hhcmVkIGxpYnJhcnkgb2YgY29tbW9uIGZ1bmN0aW9ucyB1c2VkIGJ5 IHNtZF8gcGx1Z2lucy48L3A+CgoJPGgyPkNoYW5nZWxvZzwvaDI+CgoJPHVsPgoJCTxsaT52 MC4xICAgMDctMDItMjUgSW5pdGlhbCBwdWJsaWMgcmVsZWFzZTwvbGk+CgkJPGxpPnYwLjIg ICAwNy0wMy0wMyBBZGRlZCA8c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFuPiAoTXVsdGkt TGluZ3VhbCBQYWNrKSBsaWJyYXJ5IHN1cHBvcnQ8L2xpPgoJCTxsaT52MC4yMSAgMDctMDMt MDYgQWRkZWQgaW50ZWdlciByYW5nZSBmdW5jdGlvbmFsaXR5LiBnZXRBdHRzIG5vdyB0YWtl cyBhIHJlZ2V4cCBhcmcuPC9saT4KCQk8bGk+djAuMjFhIDA3LTAzLTIxIEZpeGVkOiBDaGFy YWN0ZXIgcmFuZ2VzIGlnbm9yZWQgKHRoYW5rcyBtcmRhbGUpPC9saT4KCQk8bGk+djAuMjFi IDA3LTA0LTAyIEZpeGVkOiBTdGlja3kgYXJ0aWNsZSBzdXBwb3J0IGluIGdldEF0dHMgKHRo YW5rcyBwaWVtYW4pPC9saT4KCQk8bGk+djAuMjFjIDA3LTA3LTI5IEZpeGVkOiBOdW1lcmlj IHJhbmdlcyBpbiBjYXRlZ29yaWVzICh0aGFua3Mgd29sbGUpPC9saT4KCQk8bGk+djAuMjFk IDA3LTA4LTAzIEZpeGVkOiBOZWdhdGlvbiB3aXRoIG11bHRpcGxlIGVsZW1lbnRzPC9saT4K CQk8bGk+djAuMjFlIDA3LTA5LTE0IEZpeGVkOiBBYmlsaXR5IHRvIGxlYXZlIGVtcHR5IHNw bGl0UmFuZ2UgcGFyYW1ldGVycyBpbnRhY3Q8L2xpPgoJCTxsaT52MC4yMiAgMDctMDktMjAg Rml4ZWQ6IFVuZGVmaW5lZCBpbmRleCB3YXJuaW5ncyAodGhhbmtzIEFtYml0aW91c2xlbW9u KS4gRWhhbmNlZCBtYXRjaGVzIHNvIHNwYWNlcyBhcmUgYWxsb3dlZCBpbiBzdHJpbmdzICh0 aGFua3MgRHJSb2dnKTwvbGk+Cgk8L3VsPiI7czo0OiJjb2RlIjtzOjc5MTg6IgpnbG9iYWwg JHNtZE1MUDsKJHNtZE1MUCA9IGFycmF5KAoJCSdzbWRfc2xpbWJveCcgPT4gJ3NtZF9zYm94 JywKCQknc21kX3NsaW1ib3hfaW5jJyA9PiAnc21kX3Nib3gnLAoJCSdzbWRfcmFuZG9tX2Jh bm5lcicgPT4gJ3NtZF9yYmFuJywKCSk7CmZ1bmN0aW9uIHNtZF9hZGRRU1ZhcigkdXJsLCAk a2V5LCAkdmFsdWUpIHsKCSR1cmwgPSBzbWRfcmVtb3ZlUVNWYXIoJHVybCwgJGtleSk7Cglp ZiAoc3RycG9zKCR1cmwsICc/JykgPT09IGZhbHNlKSB7CgkJcmV0dXJuICgkdXJsIC4gJz8n IC4gJGtleSAuICc9JyAuICR2YWx1ZSk7Cgl9IGVsc2UgewoJCXJldHVybiAoJHVybCAuICcm JyAuICRrZXkgLiAnPScgLiAkdmFsdWUpOwoJfQp9CmZ1bmN0aW9uIHNtZF9yZW1vdmVRU1Zh cigkdXJsLCAka2V5KSB7CgkkdXJsID0gcHJlZ19yZXBsYWNlKCcvKC4qKShcP3wmKScgLiAk a2V5IC4gJz1bXiZdKz8oJikoLiopL2knLCAnJDEkMiQ0JywgJHVybCAuICcmJyk7CgkkdXJs ID0gc3Vic3RyKCR1cmwsIDAsIC0xKTsKCXJldHVybiAoJHVybCk7Cn0KLy8gcmV0dXJuIGEg bGlzdCBvZiBjYXRlZ29yaWVzIHVuZGVyIChhbmQgaW5jbHVkaW5nKSB0aGUgZ2l2ZW4gcGFy ZW50IGNhdGVnb3J5CmZ1bmN0aW9uIHNtZF9nZXRTdWJDYXRzKCRwYXJlbnQsJGNhdHR5cGUp IHsKCSRwYXJlbnQgPSBkb1NsYXNoKCRwYXJlbnQpOwoJJGxleHRyZW0gPSAxOyAkcmV4dHJl bSA9IDE7CglleHRyYWN0KHNhZmVfcm93KCJsZnQgYXMgbGV4dHJlbSwgcmd0IGFzIHJleHRy ZW0iLCAidHhwX2NhdGVnb3J5IiwgIm5hbWU9JyRwYXJlbnQnIGFuZCB0eXBlID0gJyRjYXR0 eXBlJyIpKTsKCSRycyA9IHNhZmVfcm93c19zdGFydCgiaWQsbmFtZSx0aXRsZSIsInR4cF9j YXRlZ29yeSIsICJsZnQgYmV0d2VlbiAkbGV4dHJlbSBhbmQgJHJleHRyZW0gYW5kIHR5cGUg PSAnJGNhdHR5cGUnIG9yZGVyIGJ5IGxmdCBhc2MiKTsKCSRjYXRzID0gYXJyYXkoKTsKCgl3 aGlsZSAoJHJvdyA9IG5leHRSb3coJHJzKSkgewoJCSRjYXRzW10gPSBhcnJheSgKCQkJJ2lk JyA9PiAkcm93WydpZCddLAoJCQknbmFtZScgPT4gJHJvd1snbmFtZSddLAoJCQkndGl0bGUn ID0+ICRyb3dbJ3RpdGxlJ10KCQkpOwoJfQoJcmV0dXJuICRjYXRzOwp9Ci8vIFNlYXJjaGVz IHRoZSBwYXNzZWQgJHN0ciBmb3IgcHJlZGV0ZXJtaW5lZCBzZXF1ZW5jZXMgb2YgY2hhcmFj dGVycwovLyBhbmQsIGlmIHRoYXQgc2VxdWVuY2UgaXMgaW4gJGFsbG93ZWQsIHJlcGxhY2Vz IGl0IGFzIGZvbGxvd3M6Ci8vICA/YyA9IGN1cnJlbnQgZ2xvYmFsIGNhdGVnb3J5ICghYyA9 IG5vdCBjdXJyZW50IGNhdGVnb3J5KQovLyAgP3MgPSBjdXJyZW50IHNlY3Rpb24gKCFzID0g bm90IGN1cnJlbnQgc2VjdGlvbikKLy8gID90ID0gY3VycmVudCBhcnRpY2xlIHRpdGxlICgh dCA9IG5vdCBjdXJyZW50IHRpdGxlKQovLyAgP2lkID0gY3VycmVudCBhcnRpY2xlIElELCBw cmVwZW5kZWQgd2l0aCAkaWRwcmVmaXggKCFpZCA9IG5vdCBjdXJyZW50IElEKQovLyAgP2Zp ZWxkID0gY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSdzIGZpZWxkIChjb3VsZCBi ZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0KQovLyAgIWZpZWxkID0gbm90IHRoZSBjb250ZW50 cyBvZiB0aGUgY3VycmVudCBhcnRpY2xlJ3MgZmllbGQgKGNvdWxkIGJlIGEgY29tbWEtc2Vw YXJhdGVkIGxpc3QpCi8vIFJhbmdlcyAoZS5nLiAxLTUgb3IgYS16KSB3aWxsIGJlIGV4cGFu ZGVkIGludG8gdGhlaXIgaW5kaXZpZHVhbCB2YWx1ZXMgKFBIUD40LjEuMCBmb3IgY2hhcnMp LgovLyBBbnl0aGluZyBlbHNlIGlzIHJldHVybmVkIHZlcmJhdGltLgovLyBPdXRwdXRzIHR3 byBhcnJheXM7IHRoZSAxc3QgY29udGFpbmluZyBpdGVtcyBmb3IgaW5jbHVzaW9uLCB0aGUg Mm5kIGZvciBleGNsdXNpb24uCmZ1bmN0aW9uIHNtZF9nZXRBdHRzKCRzdHIsICRhbGxvd2Vk LCAkaWRwcmVmaXg9IiIsICRzcGxpdGF0PSIvKCx8LFxzKSsvIiwgJHByZWdvcHQgPSBQUkVH X1NQTElUX05PX0VNUFRZKSB7CglnbG9iYWwgJHByZXRleHQsICR0aGlzYXJ0aWNsZTsKCgkk b3V0ID0gYXJyYXkoKTsKCSRzdWJvdXQgPSBhcnJheSgpOwoJJG5vdG91dCA9IGFycmF5KCk7 CgkkbWF0Y2hlcyA9IHNtZF9zcGxpdFJhbmdlKCRzdHIsICRzcGxpdGF0LCAkcHJlZ29wdCk7 CgoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRtYXRjaGVzKTsgJGlkeCsrKSB7CgkJ JHRoaXNtYXRjaCA9ICRtYXRjaGVzWyRpZHhdOwoJCWlmICgoJHRoaXNtYXRjaCA9PT0gIj9j IikgJiYgaW5fYXJyYXkoIj9jIiwkYWxsb3dlZCkpIHsKCQkJLy8gVXNlIGdsb2JhbCBhcnRp Y2xlIGNhdGVnb3J5LCBpZiBpdCBleGlzdHMKCQkJaWYgKCRwcmV0ZXh0WydjJ10gIT0gIiIp IHsKCQkJCWlmICghaW5fYXJyYXkoJHByZXRleHRbJ2MnXSwgJG91dCkpIHsKCQkJCQkkb3V0 W10gPSAkcHJldGV4dFsnYyddOwoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmICgoJHRoaXNtYXRj aCA9PT0gIiFjIikgJiYgaW5fYXJyYXkoIiFjIiwkYWxsb3dlZCkpIHsKCQkJLy8gRG9uJ3Qg dXNlIGdsb2JhbCBhcnRpY2xlIGNhdGVnb3J5CgkJCWlmICgkcHJldGV4dFsnYyddICE9ICIi KSB7CgkJCQlpZiAoIWluX2FycmF5KCRwcmV0ZXh0WydjJ10sICRub3RvdXQpKSB7CgkJCQkJ JG5vdG91dFtdID0gJHByZXRleHRbJ2MnXTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0 aGlzbWF0Y2ggPT09ICI/cyIpICYmIGluX2FycmF5KCI/cyIsJGFsbG93ZWQpKSB7CgkJCS8v IFVzZSBhcnRpY2xlIHNlY3Rpb24KCQkJaWYgKCRwcmV0ZXh0WydzJ10gIT0gIiIpIHsKCQkJ CWlmICghaW5fYXJyYXkoJHByZXRleHRbJ3MnXSwgJG91dCkpIHsKCQkJCQkkb3V0W10gPSAk cHJldGV4dFsncyddOwoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmICgoJHRoaXNtYXRjaCA9PT0g IiFzIikgJiYgaW5fYXJyYXkoIiFzIiwkYWxsb3dlZCkpIHsKCQkJLy8gRG9uJ3QgdXNlIGFy dGljbGUgc2VjdGlvbgoJCQlpZiAoJHByZXRleHRbJ3MnXSAhPSAiIikgewoJCQkJaWYgKCFp bl9hcnJheSgkcHJldGV4dFsncyddLCAkbm90b3V0KSkgewoJCQkJCSRub3RvdXRbXSA9ICRw cmV0ZXh0WydzJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoID09PSAi P3QiKSAmJiBpbl9hcnJheSgiP3QiLCRhbGxvd2VkKSkgewoJCQkvLyBVc2UgYXJ0aWNsZSBV UkwgdGl0bGUgaWYgdGhpcyBpcyBhbiBhcnRpY2xlLgoJCQlpZiAoJHRoaXNhcnRpY2xlICE9 IE5VTEwgJiYgJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSAhPSAiIikgewoJCQkJaWYgKCFp bl9hcnJheSgkdGhpc2FydGljbGVbJ3VybF90aXRsZSddLCAkb3V0KSkgewoJCQkJCSRvdXRb XSA9ICR0aGlzYXJ0aWNsZVsndXJsX3RpdGxlJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYg KCgkdGhpc21hdGNoID09PSAiIXQiKSAmJiBpbl9hcnJheSgiIXQiLCRhbGxvd2VkKSkgewoJ CQkvLyBEb24ndCB1c2UgYXJ0aWNsZSBVUkwgdGl0bGUKCQkJaWYgKCR0aGlzYXJ0aWNsZSAh PSBOVUxMICYmICR0aGlzYXJ0aWNsZVsndXJsX3RpdGxlJ10gIT0gIiIpIHsKCQkJCWlmICgh aW5fYXJyYXkoJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJG5vdG91dCkpIHsKCQkJCQkk bm90b3V0W10gPSAkdGhpc2FydGljbGVbJ3VybF90aXRsZSddOwoJCQkJfQoJCQl9CgkJfSBl bHNlIGlmICgoJHRoaXNtYXRjaCA9PT0gIj9pZCIpICYmIGluX2FycmF5KCI/aWQiLCRhbGxv d2VkKSkgewoJCQkvLyBVc2UgYXJ0aWNsZSBJRCwgcHJlcGVuZGVkIHdpdGggJGlkcHJlZml4 CgkJCWlmICgkdGhpc2FydGljbGUgIT0gTlVMTCkgewoJCQkJaWYgKCFpbl9hcnJheSgkaWRw cmVmaXggLiAkcHJldGV4dFsnaWQnXSwgJG91dCkpIHsKCQkJCQkkb3V0W10gPSAkaWRwcmVm aXggLiAkcHJldGV4dFsnaWQnXTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0 Y2ggPT09ICIhaWQiKSAmJiBpbl9hcnJheSgiIWlkIiwkYWxsb3dlZCkpIHsKCQkJLy8gRG9u J3QgdXNlIGFydGljbGUgSUQKCQkJaWYgKCR0aGlzYXJ0aWNsZSAhPSBOVUxMKSB7CgkJCQlp ZiAoIWluX2FycmF5KCRpZHByZWZpeCAuICRwcmV0ZXh0WydpZCddLCAkbm90b3V0KSkgewoJ CQkJCSRub3RvdXRbXSA9ICRpZHByZWZpeCAuICRwcmV0ZXh0WydpZCddOwoJCQkJfQoJCQl9 CgkJfSBlbHNlIGlmICgoc3Vic3RyKCR0aGlzbWF0Y2gsMCwxKSA9PT0gIj8iKSAmJiBpbl9h cnJheSgiP2ZpZWxkIiwkYWxsb3dlZCkpIHsKCQkJLy8gVXNlIHRoZSBnaXZlbiBmaWVsZCBu YW1lOyB3aGljaCBtYXkgYmUgYSBjb21tYS1zZXBhcmF0ZWQgc3VibGlzdC4KCQkJLy8gU3Bs aXQgb2ZmIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhlIHF1ZXN0aW9uIG1hcmsKCQkJJGZpZWxk bmFtZSA9IHN1YnN0cigkdGhpc21hdGNoLDEpOwoJCQlpZiAoKCR0aGlzYXJ0aWNsZSAhPSBO VUxMKSAmJiAoaXNzZXQoJHRoaXNhcnRpY2xlW3N0cnRvbG93ZXIoJGZpZWxkbmFtZSldKSkp IHsKCQkJCSRmaWVsZENvbnRlbnRzID0gJHRoaXNhcnRpY2xlW3N0cnRvbG93ZXIoJGZpZWxk bmFtZSldOwoJCQl9IGVsc2UgewoJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOwoJ CQl9CgkJCWlmICghZW1wdHkoJGZpZWxkQ29udGVudHMpKSB7CgkJCQkkc3Vib3V0ID0gc21k X3NwbGl0UmFuZ2Uoc3RyaXBfdGFncygkZmllbGRDb250ZW50cyksICRzcGxpdGF0KTsKCQkJ CWZvcmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUpIHsKCQkJCQlpZiAoIWluX2FycmF5KCRz dWJuYW1lLCAkb3V0KSkgewoJCQkJCQkkb3V0W10gPSAkc3VibmFtZTsKCQkJCQl9CgkJCQl9 CgkJCX0KCQl9IGVsc2UgaWYgKChzdWJzdHIoJHRoaXNtYXRjaCwwLDEpID09PSAiISIpICYm IGluX2FycmF5KCIhZmllbGQiLCRhbGxvd2VkKSkgewoJCQkvLyBOZWdhdGlvbi4gTWF5IGVp dGhlciBiZSBhIGZpZWxkIG5hbWUgKGFuZCBtYXliZSBhbm90aGVyIENTTCkgb3IgYSBmaXhl ZCB0ZXJtLgoJCQkvLyBTcGxpdCBvZmYgdGhlIG5hbWUgZnJvbSB0aGUgZXhjbGFtYXRpb24g bWFyawoJCQkkZmllbGRuYW1lID0gc3Vic3RyKCR0aGlzbWF0Y2gsMSk7CgkJCWlmICgoJHRo aXNhcnRpY2xlICE9IE5VTEwpICYmIChpc3NldCgkdGhpc2FydGljbGVbc3RydG9sb3dlcigk ZmllbGRuYW1lKV0pKSkgewoJCQkJJGZpZWxkQ29udGVudHMgPSAkdGhpc2FydGljbGVbc3Ry dG9sb3dlcigkZmllbGRuYW1lKV07CgkJCX0gZWxzZSB7CgkJCQkkZmllbGRDb250ZW50cyA9 ICRmaWVsZG5hbWU7CgkJCX0KCQkJaWYgKCFlbXB0eSgkZmllbGRDb250ZW50cykpIHsKCQkJ CSRzdWJvdXQgPSBzbWRfc3BsaXRSYW5nZShzdHJpcF90YWdzKCRmaWVsZENvbnRlbnRzKSwg JHNwbGl0YXQpOwoJCQkJZm9yZWFjaCAoJHN1Ym91dCBhcyAkc3VibmFtZSkgewoJCQkJCWlm ICghaW5fYXJyYXkoJHN1Ym5hbWUsICRub3RvdXQpKSB7CgkJCQkJCSRub3RvdXRbXSA9ICRz dWJuYW1lOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWlmICghaW5fYXJyYXko JHRoaXNtYXRjaCwgJG91dCkpIHsKCQkJCSRvdXRbXSA9ICR0aGlzbWF0Y2g7CgkJCX0KCQl9 Cgl9CglyZXR1cm4gYXJyYXkoJG91dCwkbm90b3V0KTsKfQovLyBSZXR1cm4gYW4gYXJyYXkg b2YgaXRlbXMgZnJvbSBhIHN0cmluZyBvZiAodXN1YWxseSkgY29tbWEtc2VwYXJhdGVkIHZh bHVlcy4KLy8gU29tZSB2YWx1ZXMgbWF5IGNvbnRhaW4gcmFuZ2VzIG9mIG51bWJlcnMgbGlr ZSAxLTUgdGhhdCBuZWVkICdleHBhbmRpbmcnIGZpcnN0CmZ1bmN0aW9uIHNtZF9zcGxpdFJh bmdlKCRzdHIsICRzcGxpdGF0PSIvKCx8LFxzKSsvIiwgJHByZWdPcHQgPSBQUkVHX1NQTElU X05PX0VNUFRZKSB7CgkkcmV0YXJyID0gYXJyYXkoKTsKCWlmICgoc3Vic3RyKCRzcGxpdGF0 LDAsMSkgPT0gIi8iKSAmJiAoc3Vic3RyKCRzcGxpdGF0LCBzdHJsZW4oJHNwbGl0YXQpLTEs IDEpID09ICIvIikpIHsKCQkkcGF0ID0gJHNwbGl0YXQ7Cgl9IGVsc2UgewoJCSRwYXQgPSAn L1snLiRzcGxpdGF0LiddKy8nOwoJfQoJJGVsZW1zID0gcHJlZ19zcGxpdCgkcGF0LCAkc3Ry LCAtMSwgJHByZWdPcHQpOwoJZm9yZWFjaCAoJGVsZW1zIGFzICRpdGVtKSB7CgkJJGl0ZW0g PSB0cmltKCRpdGVtKTsKCQkkbmVnYXRlID0gZmFsc2U7CgkJLy8gRG9lcyB0aGUgaXRlbSBz dGFydCB3aXRoIGEgbmVnYXRpb24gY2hhcmFjdGVyCgkJaWYgKHN1YnN0cigkaXRlbSwwLDEp ID09PSAiISIpIHsKCQkJJG5lZ2F0ZSA9IHRydWU7CgkJCSRpdGVtID0gc3Vic3RyKCRpdGVt LDEpOwoJCX0KCQkvLyBJcyB0aGUgaXRlbSBhbiBpbnRlZ2VyIGxpc3QgcmFuZ2UKCQlpZiAo cHJlZ19tYXRjaCgnL14oXGQrKVwtKFxkKykkLycsICRpdGVtKSkgewoJCQlsaXN0KCRsbywg JGhpKSA9IGV4cGxvZGUoIi0iLCAkaXRlbSwgMik7CgkJCSRybmcgPSByYW5nZSgkbG8sICRo aSk7CgkJCS8vIFJlYXBwbHkgdGhlIG5lZ2F0aW9uIGlmIG5lY2Vzc2FyeQoJCQlmb3IoJGlk eCA9IDA7ICRpZHggPCBjb3VudCgkcm5nKTsgJGlkeCsrKSB7CgkJCQkkcm5nWyRpZHhdID0g KCgkbmVnYXRlKSA/ICIhIiA6ICIiKSAuICRybmdbJGlkeF07CgkJCX0KCQkJJHJldGFyciA9 IGFycmF5X21lcmdlKCRyZXRhcnIsICRybmcpOwoJCX0gZWxzZSB7CgkJCSRyZXRhcnJbXSA9 ICgoJG5lZ2F0ZSkgPyAiISIgOiAiIikgLiAkaXRlbTsKCQl9Cgl9CglyZXR1cm4gJHJldGFy cjsKfQovLyBHZW5lcmljIGxvb2t1cCBmdW5jdGlvbiBmb3IgaW50ZXJmYWNpbmcgd2l0aCBN TFAgdG8gbG9jYWxpc2Ugc3RyaW5ncy4KLy8gICRzdHJheSA9IGFycmF5IG9mIGRlZmF1bHQg c3RyaW5ncwovLyAgJHdoYXQgPSBrZXkgdG8gbG9vayB1cAovLyAgJGFyZ3MgPSBhbnkgYXJn dW1lbnRzIHRoZSBrZXkgaXMgZXhwZWN0aW5nIGZvciByZXBsYWNlbWVudApmdW5jdGlvbiBz bWRfZ1R4dCgkc3RyYXksICR3aGF0LCAkYXJncyA9IGFycmF5KCkpIHsKCWdsb2JhbCAkdGV4 dGFycmF5LCAkc21kTUxQOwoJJGZuID0gc21kX2dldENhbGxlcigpOwoKCS8vIERyb3Agb3V0 IGlmIHRoZSBpZCBpc24ndCBkZWZpbmVkLgoJLy8gV291bGQgYmUgbmljZSB0byB1c2UgcmVm bGVjdGlvbiB0byBmaW5kIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBhbmQgcGFzcyB0aGF0 LAoJLy8gYnV0IHRoYXQncyBQSFA1IHRlcnJpdG9yeSBvbmx5CglpZiAoZW1wdHkoJGZuKSkg ewoJCSRzdHIgPSAkd2hhdDsKCX0gZWxzZSB7CgkJLy8gUHJlcGFyZSB0aGUgcHJlZml4ZWQg a2V5IGZvciB1c2UKCQkka2V5ID0gJHNtZE1MUFskZm5dIC4gJy0nIC4gJHdoYXQ7CgkJJGtl eSA9IHN0cnRvbG93ZXIoJGtleSk7CgoJCS8vIEdyYWIgZnJvbSB0aGUgZ2xvYmFsIHRleHRh cnJheSAocG9zc2libHkgZWRpdGVkIGJ5IE1MUCkgaWYgd2UgY2FuCgkJaWYoaXNzZXQoJHRl eHRhcnJheVska2V5XSkpIHsKCQkJJHN0ciA9ICR0ZXh0YXJyYXlbJGtleV07CgkJfSBlbHNl IHsKCQkJLy8gVGhlIHN0cmluZyBpc24ndCBpbiB0aGUgbG9jYWxpc2VkICR0ZXh0YXJyYXkg c28gZmFsbGJhY2sgdG8gdXNpbmcKCQkJLy8gdGhlIChub24gcHJlZml4ZWQpIHN0cmluZyBh cnJheSBpbiB0aGUgcGx1Z2luCgkJCSRrZXkgPSBzdHJ0b2xvd2VyKCR3aGF0KTsKCQkJJHN0 ciA9IChpc3NldCgkc3RyYXlbJGtleV0pKSA/ICRzdHJheVska2V5XSA6ICR3aGF0OwoJCX0K CX0KCS8vIFBlcmZvcm0gc3Vic3RpdHV0aW9ucwoJaWYoIWVtcHR5KCRhcmdzKSkgewoJCSRz dHIgPSBzdHJ0cigkc3RyLCAkYXJncyk7Cgl9CglyZXR1cm4gJHN0cjsKfQovLyBDaGVhdGlu ZyB3YXkgb2YgZmluZGluZyBhIGZ1bmN0aW9uJ3MgY2FsbGVyCmZ1bmN0aW9uIHNtZF9nZXRD YWxsZXIoKSB7CgkkYmFja3RyYWNlID0gZGVidWdfYmFja3RyYWNlKCk7CglyZXR1cm4gJGJh Y2t0cmFjZVsyXVsnZnVuY3Rpb24nXTsKfQoiO3M6MzoibWQ1IjtzOjMyOiIwNzlmZDA0ZDBk ODkzYzY0YmRjZGIxZWI0ZTg2OTA4NyI7fQ==