# smd_lib v0.21 # Shared function library used by smd_ plugins. # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6NDoiMC4yMSI7czo2OiJhdXRob3IiO3M6MTE6IlN0ZWYg RGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjI2OiJodHRwOi8vd3d3LnN0ZWZkYXdzb24u Y29tLyI7czoxMToiZGVzY3JpcHRpb24iO3M6NDU6IlNoYXJlZCBmdW5jdGlvbiBsaWJyYXJ5 IHVzZWQgYnkgc21kXyBwbHVnaW5zLiI7czo0OiJ0eXBlIjtpOjI7czo0OiJuYW1lIjtzOjc6 InNtZF9saWIiO3M6NDoiaGVscCI7czo0MjY6Igk8aDE+c21kXyBwbHVnaW4gbGlicmFyeTwv aDE+CgoJPHA+T2ZmZXJzIG5vIHB1YmxpYyB0ZXh0cGF0dGVybiB0YWdzLiBJdCBpcyBzaW1w bHkgYSBzaGFyZWQgbGlicmFyeSBvZiBjb21tb24gZnVuY3Rpb25zIHVzZWQgYnkgc21kXyBw bHVnaW5zLjwvcD4KCgk8aDI+Q2hhbmdlbG9nPC9oMj4KCgk8dWw+CgkJPGxpPnYwLjEgICAw Ny0wMi0yNSBJbml0aWFsIHB1YmxpYyByZWxlYXNlPC9saT4KCQk8bGk+djAuMiAgIDA3LTAz LTAzIEFkZGVkIDxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+IChNdWx0aS1MaW5ndWFs IFBhY2spIGxpYnJhcnkgc3VwcG9ydDwvbGk+CgkJPGxpPnYwLjIxICAwNy0wMy0wNiBBZGRl ZCBpbnRlZ2VyIHJhbmdlIGZ1bmN0aW9uYWxpdHkuIGdldEF0dHMgbm93IHRha2VzIGEgcmVn ZXhwIGFyZy48L2xpPgoJPC91bD4KCiI7czo0OiJjb2RlIjtzOjc5NDQ6IgpnbG9iYWwgJHNt ZE1MUDsKJHNtZE1MUCA9IGFycmF5KAoJCSdzbWRfc2xpbWJveCcgPT4gJ3NtZF9zYm94JywK CQknc21kX3NsaW1ib3hfaW5jJyA9PiAnc21kX3Nib3gnLAoJCSdzbWRfcmFuZG9tX2Jhbm5l cicgPT4gJ3NtZF9yYmFuJywKCSk7CmZ1bmN0aW9uIHNtZF9hZGRRU1ZhcigkdXJsLCAka2V5 LCAkdmFsdWUpIHsKCSR1cmwgPSBzbWRfcmVtb3ZlUVNWYXIoJHVybCwgJGtleSk7CglpZiAo c3RycG9zKCR1cmwsICc/JykgPT09IGZhbHNlKSB7CgkJcmV0dXJuICgkdXJsIC4gJz8nIC4g JGtleSAuICc9JyAuICR2YWx1ZSk7Cgl9IGVsc2UgewoJCXJldHVybiAoJHVybCAuICcmJyAu ICRrZXkgLiAnPScgLiAkdmFsdWUpOwoJfQp9CmZ1bmN0aW9uIHNtZF9yZW1vdmVRU1Zhcigk dXJsLCAka2V5KSB7CgkkdXJsID0gcHJlZ19yZXBsYWNlKCcvKC4qKShcP3wmKScgLiAka2V5 IC4gJz1bXiZdKz8oJikoLiopL2knLCAnJDEkMiQ0JywgJHVybCAuICcmJyk7CgkkdXJsID0g c3Vic3RyKCR1cmwsIDAsIC0xKTsKCXJldHVybiAoJHVybCk7Cn0KLy8gcmV0dXJuIGEgbGlz dCBvZiBjYXRlZ29yaWVzIHVuZGVyIChhbmQgaW5jbHVkaW5nKSB0aGUgZ2l2ZW4gcGFyZW50 IGNhdGVnb3J5CmZ1bmN0aW9uIHNtZF9nZXRTdWJDYXRzKCRwYXJlbnQsJGNhdHR5cGUpIHsK CSRwYXJlbnQgPSBkb1NsYXNoKCRwYXJlbnQpOwoJJGxleHRyZW0gPSAxOyAkcmV4dHJlbSA9 IDE7CglleHRyYWN0KHNhZmVfcm93KCJsZnQgYXMgbGV4dHJlbSwgcmd0IGFzIHJleHRyZW0i LCAidHhwX2NhdGVnb3J5IiwgIm5hbWU9JyRwYXJlbnQnIGFuZCB0eXBlID0gJyRjYXR0eXBl JyIpKTsKCSRycyA9IHNhZmVfcm93c19zdGFydCgiaWQsbmFtZSx0aXRsZSIsInR4cF9jYXRl Z29yeSIsICJsZnQgYmV0d2VlbiAkbGV4dHJlbSBhbmQgJHJleHRyZW0gYW5kIHR5cGUgPSAn JGNhdHR5cGUnIG9yZGVyIGJ5IGxmdCBhc2MiKTsKCSRjYXRzID0gYXJyYXkoKTsKCgl3aGls ZSAoJHJvdyA9IG5leHRSb3coJHJzKSkgewoJCSRjYXRzW10gPSBhcnJheSgKCQkJJ2lkJyA9 PiAkcm93WydpZCddLAoJCQknbmFtZScgPT4gJHJvd1snbmFtZSddLAoJCQkndGl0bGUnID0+ ICRyb3dbJ3RpdGxlJ10KCQkpOwoJfQoJcmV0dXJuICRjYXRzOwp9Ci8vIFNlYXJjaGVzIHRo ZSBwYXNzZWQgJHN0ciBmb3IgcHJlZGV0ZXJtaW5lZCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVy cwovLyBhbmQsIGlmIHRoYXQgc2VxdWVuY2UgaXMgaW4gJGFsbG93ZWQsIHJlcGxhY2VzIGl0 IGFzIGZvbGxvd3M6Ci8vICA/YyA9IGN1cnJlbnQgZ2xvYmFsIGNhdGVnb3J5ICghYyA9IG5v dCBjdXJyZW50IGNhdGVnb3J5KQovLyAgP3MgPSBjdXJyZW50IHNlY3Rpb24gKCFzID0gbm90 IGN1cnJlbnQgc2VjdGlvbikKLy8gID90ID0gY3VycmVudCBhcnRpY2xlIHRpdGxlICghdCA9 IG5vdCBjdXJyZW50IHRpdGxlKQovLyAgP2lkID0gY3VycmVudCBhcnRpY2xlIElELCBwcmVw ZW5kZWQgd2l0aCAkaWRwcmVmaXggKCFpZCA9IG5vdCBjdXJyZW50IElEKQovLyAgP2ZpZWxk ID0gY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSdzIGZpZWxkIChjb3VsZCBiZSBh IGNvbW1hLXNlcGFyYXRlZCBsaXN0KQovLyAgIWZpZWxkID0gbm90IHRoZSBjb250ZW50cyBv ZiB0aGUgY3VycmVudCBhcnRpY2xlJ3MgZmllbGQgKGNvdWxkIGJlIGEgY29tbWEtc2VwYXJh dGVkIGxpc3QpCi8vIFJhbmdlcyAoZS5nLiAxLTUgb3IgYS16KSB3aWxsIGJlIGV4cGFuZGVk IGludG8gdGhlaXIgaW5kaXZpZHVhbCB2YWx1ZXMgKFBIUD40LjEuMCBmb3IgY2hhcnMpLgov LyBBbnl0aGluZyBlbHNlIGlzIHJldHVybmVkIHZlcmJhdGltLgovLyBPdXRwdXRzIHR3byBh cnJheXM7IHRoZSAxc3QgY29udGFpbmluZyBpdGVtcyBmb3IgaW5jbHVzaW9uLCB0aGUgMm5k IGZvciBleGNsdXNpb24uCmZ1bmN0aW9uIHNtZF9nZXRBdHRzKCRzdHIsICRhbGxvd2VkLCAk aWRwcmVmaXg9IiIsICRzcGxpdGF0PSIsXHMiKSB7CglnbG9iYWwgJHByZXRleHQsICR0aGlz YXJ0aWNsZTsKCgkkb3V0ID0gYXJyYXkoKTsKCSRzdWJvdXQgPSBhcnJheSgpOwoJJG5vdG91 dCA9IGFycmF5KCk7CgkkbWF0Y2hlcyA9IHNtZF9zcGxpdFJhbmdlKCRzdHIsICRzcGxpdGF0 KTsKCglmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJG1hdGNoZXMpOyAkaWR4KyspIHsK CQkkdGhpc21hdGNoID0gJG1hdGNoZXNbJGlkeF07CgkJaWYgKCgkdGhpc21hdGNoID09PSAi P2MiKSAmJiBpbl9hcnJheSgiP2MiLCRhbGxvd2VkKSkgewoJCQkvLyBVc2UgZ2xvYmFsIGFy dGljbGUgY2F0ZWdvcnksIGlmIGl0IGV4aXN0cwoJCQlpZiAoJHByZXRleHRbJ2MnXSAhPSAi IikgewoJCQkJaWYgKCFpbl9hcnJheSgkcHJldGV4dFsnYyddLCAkb3V0KSkgewoJCQkJCSRv dXRbXSA9ICRwcmV0ZXh0WydjJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21h dGNoID09PSAiIWMiKSAmJiBpbl9hcnJheSgiIWMiLCRhbGxvd2VkKSkgewoJCQkvLyBEb24n dCB1c2UgZ2xvYmFsIGFydGljbGUgY2F0ZWdvcnkKCQkJaWYgKCRwcmV0ZXh0WydjJ10gIT0g IiIpIHsKCQkJCWlmICghaW5fYXJyYXkoJHByZXRleHRbJ2MnXSwgJG5vdG91dCkpIHsKCQkJ CQkkbm90b3V0W10gPSAkcHJldGV4dFsnYyddOwoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmICgo JHRoaXNtYXRjaCA9PT0gIj9zIikgJiYgaW5fYXJyYXkoIj9zIiwkYWxsb3dlZCkpIHsKCQkJ Ly8gVXNlIGFydGljbGUgc2VjdGlvbgoJCQlpZiAoJHByZXRleHRbJ3MnXSAhPSAiIikgewoJ CQkJaWYgKCFpbl9hcnJheSgkcHJldGV4dFsncyddLCAkb3V0KSkgewoJCQkJCSRvdXRbXSA9 ICRwcmV0ZXh0WydzJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoID09 PSAiIXMiKSAmJiBpbl9hcnJheSgiIXMiLCRhbGxvd2VkKSkgewoJCQkvLyBEb24ndCB1c2Ug YXJ0aWNsZSBzZWN0aW9uCgkJCWlmICgkcHJldGV4dFsncyddICE9ICIiKSB7CgkJCQlpZiAo IWluX2FycmF5KCRwcmV0ZXh0WydzJ10sICRub3RvdXQpKSB7CgkJCQkJJG5vdG91dFtdID0g JHByZXRleHRbJ3MnXTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2ggPT09 ICI/dCIpICYmIGluX2FycmF5KCI/dCIsJGFsbG93ZWQpKSB7CgkJCS8vIFVzZSBhcnRpY2xl IFVSTCB0aXRsZSBpZiB0aGlzIGlzIGFuIGFydGljbGUuCgkJCS8vIEl0J3MgYW4gYXJ0aWNs ZSBpZiB0aGUgbmV4dF9pZCBhdHRyaWJ1dGUgZXhpc3RzCgkJCWlmIChhcnJheV9rZXlfZXhp c3RzKCduZXh0X2lkJywkcHJldGV4dCkpIHsKCQkJCWlmICgkdGhpc2FydGljbGVbJ3VybF90 aXRsZSddICE9ICIiKSB7CgkJCQkJaWYgKCFpbl9hcnJheSgkdGhpc2FydGljbGVbJ3VybF90 aXRsZSddLCAkb3V0KSkgewoJCQkJCQkkb3V0W10gPSAkdGhpc2FydGljbGVbJ3VybF90aXRs ZSddOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2ggPT09ICIh dCIpICYmIGluX2FycmF5KCIhdCIsJGFsbG93ZWQpKSB7CgkJCS8vIERvbid0IHVzZSBhcnRp Y2xlIFVSTCB0aXRsZQoJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnbmV4dF9pZCcsJHByZXRl eHQpKSB7CgkJCQlpZiAoJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSAhPSAiIikgewoJCQkJ CWlmICghaW5fYXJyYXkoJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJG5vdG91dCkpIHsK CQkJCQkJJG5vdG91dFtdID0gJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXTsKCQkJCQl9CgkJ CQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoID09PSAiP2lkIikgJiYgaW5fYXJy YXkoIj9pZCIsJGFsbG93ZWQpKSB7CgkJCS8vIFVzZSBhcnRpY2xlIElELCBwcmVwZW5kZWQg d2l0aCAkaWRwcmVmaXgKCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ25leHRfaWQnLCRwcmV0 ZXh0KSkgewoJCQkJaWYgKCFpbl9hcnJheSgkaWRwcmVmaXggLiAkcHJldGV4dFsnaWQnXSwg JG91dCkpIHsKCQkJCQkkb3V0W10gPSAkaWRwcmVmaXggLiAkcHJldGV4dFsnaWQnXTsKCQkJ CX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2ggPT09ICIhaWQiKSAmJiBpbl9hcnJh eSgiIWlkIiwkYWxsb3dlZCkpIHsKCQkJLy8gRG9uJ3QgdXNlIGFydGljbGUgSUQKCQkJaWYg KGFycmF5X2tleV9leGlzdHMoJ25leHRfaWQnLCRwcmV0ZXh0KSkgewoJCQkJaWYgKCFpbl9h cnJheSgkaWRwcmVmaXggLiAkcHJldGV4dFsnaWQnXSwgJG5vdG91dCkpIHsKCQkJCQkkbm90 b3V0W10gPSAkaWRwcmVmaXggLiAkcHJldGV4dFsnaWQnXTsKCQkJCX0KCQkJfQoJCX0gZWxz ZSBpZiAoKCR0aGlzbWF0Y2hbMF0gPT09ICI/IikgJiYgaW5fYXJyYXkoIj9maWVsZCIsJGFs bG93ZWQpKSB7CgkJCS8vIFVzZSB0aGUgZ2l2ZW4gZmllbGQgbmFtZTsgd2hpY2ggbWF5IGJl IGEgY29tbWEtc2VwYXJhdGVkIHN1Ymxpc3QuCgkJCS8vIFNwbGl0IG9mZiB0aGUgZmllbGQg bmFtZSBmcm9tIHRoZSBxdWVzdGlvbiBtYXJrCgkJCSRmaWVsZG5hbWUgPSBzdWJzdHIoJHRo aXNtYXRjaCwxKTsKCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJ25leHRfaWQnLCRwcmV0ZXh0 KSkgeyAgLy8gQ2hlY2sgdGhpcyBpcyBhbiBhcnRpY2xlCgkJCQlpZiAoaXNzZXQoJHRoaXNh cnRpY2xlWyRmaWVsZG5hbWVdKSkgewoJCQkJCSRmaWVsZENvbnRlbnRzID0gJHRoaXNhcnRp Y2xlWyRmaWVsZG5hbWVdOwoJCQkJfSBlbHNlIHsKCQkJCQkkZmllbGRDb250ZW50cyA9ICRm aWVsZG5hbWU7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkZmllbGRDb250ZW50cyA9ICRmaWVs ZG5hbWU7CgkJCX0KCQkJaWYgKCFlbXB0eSgkZmllbGRDb250ZW50cykpIHsKCQkJCSRzdWJv dXQgPSBzbWRfc3BsaXRSYW5nZShzdHJpcF90YWdzKCRmaWVsZENvbnRlbnRzKSwgJHNwbGl0 YXQpOwoJCQkJZm9yZWFjaCAoJHN1Ym91dCBhcyAkc3VibmFtZSkgewoJCQkJCWlmICghaW5f YXJyYXkoJHN1Ym5hbWUsICRvdXQpKSB7CgkJCQkJCSRvdXRbXSA9ICRzdWJuYW1lOwoJCQkJ CX0KCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2hbMF0gPT09ICIhIikgJiYg aW5fYXJyYXkoIiFmaWVsZCIsJGFsbG93ZWQpKSB7CgkJCS8vIE5lZ2F0aW9uLiBNYXkgZWl0 aGVyIGJlIGEgZmllbGQgbmFtZSAoYW5kIG1heWJlIGFub3RoZXIgQ1NMKSBvciBhIGZpeGVk IHRlcm0uCgkJCS8vIFNwbGl0IG9mZiB0aGUgbmFtZSBmcm9tIHRoZSBleGNsYW1hdGlvbiBt YXJrCgkJCSRmaWVsZG5hbWUgPSBzdWJzdHIoJHRoaXNtYXRjaCwxKTsKCQkJaWYgKGFycmF5 X2tleV9leGlzdHMoJ25leHRfaWQnLCRwcmV0ZXh0KSkgeyAgLy8gQ2hlY2sgdGhpcyBpcyBh biBhcnRpY2xlCgkJCQlpZiAoaXNzZXQoJHRoaXNhcnRpY2xlWyRmaWVsZG5hbWVdKSkgewoJ CQkJCSRmaWVsZENvbnRlbnRzID0gJHRoaXNhcnRpY2xlWyRmaWVsZG5hbWVdOwoJCQkJfSBl bHNlIHsKCQkJCQkkZmllbGRDb250ZW50cyA9ICRmaWVsZG5hbWU7CgkJCQl9CgkJCX0gZWxz ZSB7CgkJCQkkZmllbGRDb250ZW50cyA9ICRmaWVsZG5hbWU7CgkJCX0KCQkJaWYgKCFlbXB0 eSgkZmllbGRDb250ZW50cykpIHsKCQkJCSRzdWJvdXQgPSBzbWRfc3BsaXRSYW5nZShzdHJp cF90YWdzKCRmaWVsZENvbnRlbnRzKSwgJHNwbGl0YXQpOwoJCQkJZm9yZWFjaCAoJHN1Ym91 dCBhcyAkc3VibmFtZSkgewoJCQkJCWlmICghaW5fYXJyYXkoJHN1Ym5hbWUsICRub3RvdXQp KSB7CgkJCQkJCSRub3RvdXRbXSA9ICRzdWJuYW1lOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0g ZWxzZSB7CgkJCWlmICghaW5fYXJyYXkoJHRoaXNtYXRjaCwgJG91dCkpIHsKCQkJCSRvdXRb XSA9ICR0aGlzbWF0Y2g7CgkJCX0KCQl9Cgl9CglyZXR1cm4gYXJyYXkoJG91dCwkbm90b3V0 KTsKfQovLyBSZXR1cm4gYW4gYXJyYXkgb2YgaXRlbXMgZnJvbSBhIHN0cmluZyBvZiAodXN1 YWxseSkgY29tbWEtc2VwYXJhdGVkIHZhbHVlcy4KLy8gU29tZSB2YWx1ZXMgbWF5IGNvbnRh aW4gcmFuZ2VzIG9mIG51bWJlcnMgbGlrZSAxLTUgdGhhdCBuZWVkICdleHBhbmRpbmcnIGZp cnN0CmZ1bmN0aW9uIHNtZF9zcGxpdFJhbmdlKCRzdHIsICRzcGxpdGF0PSIsXHMiKSB7Cgkk cmV0YXJyID0gYXJyYXkoKTsKCSRlbGVtcyA9IHByZWdfc3BsaXQoJy9bJy4kc3BsaXRhdC4n XSsvJywgJHN0ciwgLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOwoJZm9yZWFjaCAoJGVsZW1z IGFzICRpdGVtKSB7CgkJJG5lZ2F0ZSA9IGZhbHNlOwoJCS8vIERvZXMgdGhlIGl0ZW0gc3Rh cnQgd2l0aCBhIG5lYWdhdGlvbiBjaGFyYWN0ZXIKCQlpZiAoJGl0ZW1bMF0gPT0gIiEiKSB7 CgkJCSRuZWdhdGUgPSB0cnVlOwoJCQkkaXRlbSA9IHN1YnN0cigkaXRlbSwxKTsKCQl9CgkJ Ly8gSXMgdGhlIGl0ZW0gYW4gaW50ZWdlciBsaXN0IHJhbmdlCgkJaWYgKHByZWdfbWF0Y2go Jy8oXGQrfFthLXpBLVpdKVwtKFxkK3xbYS16QS1aXSkvJywgJGl0ZW0pKSB7CgkJCWxpc3Qo JGxvLCAkaGkpID0gZXhwbG9kZSgiLSIsICRpdGVtLCAyKTsKCQkJJHJldGFyciA9IGFycmF5 X21lcmdlKCRyZXRhcnIsIHJhbmdlKCRsbywgJGhpKSk7CgkJfSBlbHNlIHsKCQkJJHJldGFy cltdID0gJGl0ZW07CgkJfQoJCS8vIE5lZ2F0ZSBlYWNoIGl0ZW0gaWYgbmVjZXNzYXJ5CgkJ aWYgKCRuZWdhdGUpIHsKCQkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRyZXRhcnIp OyAkaWR4KyspIHsKCQkJCSRyZXRhcnJbJGlkeF0gPSAiISIuJHJldGFyclskaWR4XTsKCQkJ fQoJCX0KCX0KCXJldHVybiAkcmV0YXJyOwp9Ci8vIEdlbmVyaWMgbG9va3VwIGZ1bmN0aW9u IGZvciBpbnRlcmZhY2luZyB3aXRoIE1MUCB0byBsb2NhbGlzZSBzdHJpbmdzLgovLyAgJHN0 cmF5ID0gYXJyYXkgb2YgZGVmYXVsdCBzdHJpbmdzCi8vICAkd2hhdCA9IGtleSB0byBsb29r IHVwCi8vICAkYXJncyA9IGFueSBhcmd1bWVudHMgdGhlIGtleSBpcyBleHBlY3RpbmcgZm9y IHJlcGxhY2VtZW50CmZ1bmN0aW9uIHNtZF9nVHh0KCRzdHJheSwgJHdoYXQsICRhcmdzID0g YXJyYXkoKSkgewoJZ2xvYmFsICR0ZXh0YXJyYXksICRzbWRNTFA7CgkkZm4gPSBzbWRfZ2V0 Q2FsbGVyKCk7CgoJLy8gRHJvcCBvdXQgaWYgdGhlIGlkIGlzbid0IGRlZmluZWQuCgkvLyBX b3VsZCBiZSBuaWNlIHRvIHVzZSByZWZsZWN0aW9uIHRvIGZpbmQgdGhlIG5hbWUgb2YgdGhl IGZ1bmN0aW9uIGFuZCBwYXNzIHRoYXQsCgkvLyBidXQgdGhhdCdzIFBIUDUgdGVycml0b3J5 IG9ubHkKCWlmIChlbXB0eSgkZm4pKSB7CgkJJHN0ciA9ICR3aGF0OwoJfSBlbHNlIHsKCQkv LyBQcmVwYXJlIHRoZSBwcmVmaXhlZCBrZXkgZm9yIHVzZQoJCSRrZXkgPSAkc21kTUxQWyRm bl0gLiAnLScgLiAkd2hhdDsKCQkka2V5ID0gc3RydG9sb3dlcigka2V5KTsKCgkJLy8gR3Jh YiBmcm9tIHRoZSBnbG9iYWwgdGV4dGFycmF5IChwb3NzaWJseSBlZGl0ZWQgYnkgTUxQKSBp ZiB3ZSBjYW4KCQlpZihpc3NldCgkdGV4dGFycmF5WyRrZXldKSkgewoJCQkkc3RyID0gJHRl eHRhcnJheVska2V5XTsKCQl9IGVsc2UgewoJCQkvLyBUaGUgc3RyaW5nIGlzbid0IGluIHRo ZSBsb2NhbGlzZWQgJHRleHRhcnJheSBzbyBmYWxsYmFjayB0byB1c2luZwoJCQkvLyB0aGUg KG5vbiBwcmVmaXhlZCkgc3RyaW5nIGFycmF5IGluIHRoZSBwbHVnaW4KCQkJJGtleSA9IHN0 cnRvbG93ZXIoJHdoYXQpOwoJCQkkc3RyID0gKGlzc2V0KCRzdHJheVska2V5XSkpID8gJHN0 cmF5WyRrZXldIDogJHdoYXQ7CgkJfQoJfQoJLy8gUGVyZm9ybSBzdWJzdGl0dXRpb25zCglp ZighZW1wdHkoJGFyZ3MpKSB7CgkJJHN0ciA9IHN0cnRyKCRzdHIsICRhcmdzKTsKCX0KCXJl dHVybiAkc3RyOwp9Ci8vIENoZWF0aW5nIHdheSBvZiBmaW5kaW5nIGEgZnVuY3Rpb24ncyBj YWxsZXIKZnVuY3Rpb24gc21kX2dldENhbGxlcigpIHsKCSRiYWNrdHJhY2UgPSBkZWJ1Z19i YWNrdHJhY2UoKTsKCXJldHVybiAkYmFja3RyYWNlWzJdWydmdW5jdGlvbiddOwp9CiI7czoz OiJtZDUiO3M6MzI6ImI0NzE4OTgyNTM1NTYyMWM0ZDg1NTAxZDFiMTY3OWJkIjt9