# smd_lib v0.21c # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6NToiMC4yMWMiO3M6NjoiYXV0aG9yIjtzOjExOiJTdGVm IERhd3NvbiI7czoxMDoiYXV0aG9yX3VyaSI7czoyMjoiaHR0cDovL3N0ZWZkYXdzb24uY29t LyI7czoxMToiZGVzY3JpcHRpb24iO3M6NTY6IlNoYXJlZCBmdW5jdGlvbiBsaWJyYXJ5IHVz ZWQgYnkgc21kXyBwbHVnaW5zIGFuZCBvdGhlcnMuIjtzOjQ6InR5cGUiO2k6MjtzOjQ6Im5h bWUiO3M6Nzoic21kX2xpYiI7czo0OiJoZWxwIjtzOjY2MToiCTxoMT5zbWRfIHBsdWdpbiBs aWJyYXJ5PC9oMT4KCgk8cD5PZmZlcnMgbm8gcHVibGljIHRleHRwYXR0ZXJuIHRhZ3MuIEl0 IGlzIHNpbXBseSBhIHNoYXJlZCBsaWJyYXJ5IG9mIGNvbW1vbiBmdW5jdGlvbnMgdXNlZCBi eSBzbWRfIHBsdWdpbnMuPC9wPgoKCTxoMj5DaGFuZ2Vsb2c8L2gyPgoKCTx1bD4KCQk8bGk+ djAuMSAgIDA3LTAyLTI1IEluaXRpYWwgcHVibGljIHJlbGVhc2U8L2xpPgoJCTxsaT52MC4y ICAgMDctMDMtMDMgQWRkZWQgPHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj4gKE11bHRp LUxpbmd1YWwgUGFjaykgbGlicmFyeSBzdXBwb3J0PC9saT4KCQk8bGk+djAuMjEgIDA3LTAz LTA2IEFkZGVkIGludGVnZXIgcmFuZ2UgZnVuY3Rpb25hbGl0eS4gZ2V0QXR0cyBub3cgdGFr ZXMgYSByZWdleHAgYXJnLjwvbGk+CgkJPGxpPnYwLjIxYSAwNy0wMy0yMSBGaXhlZDogQ2hh cmFjdGVyIHJhbmdlcyBpZ25vcmVkICh0aGFua3MgbXJkYWxlKTwvbGk+CgkJPGxpPnYwLjIx YiAwNy0wNC0wMiBGaXhlZDogU3RpY2t5IGFydGljbGUgc3VwcG9ydCBpbiBnZXRBdHRzICh0 aGFua3MgcGllbWFuKTwvbGk+CgkJPGxpPnYwLjIxYyAwNy0wNy0yOSBGaXhlZDogTnVtZXJp YyByYW5nZXMgaW4gY2F0ZWdvcmllcyAodGhhbmtzIHdvbGxlKTwvbGk+Cgk8L3VsPiI7czo0 OiJjb2RlIjtzOjc1NzA6IgpnbG9iYWwgJHNtZE1MUDsKJHNtZE1MUCA9IGFycmF5KAoJCSdz bWRfc2xpbWJveCcgPT4gJ3NtZF9zYm94JywKCQknc21kX3NsaW1ib3hfaW5jJyA9PiAnc21k X3Nib3gnLAoJCSdzbWRfcmFuZG9tX2Jhbm5lcicgPT4gJ3NtZF9yYmFuJywKCSk7CmZ1bmN0 aW9uIHNtZF9hZGRRU1ZhcigkdXJsLCAka2V5LCAkdmFsdWUpIHsKCSR1cmwgPSBzbWRfcmVt b3ZlUVNWYXIoJHVybCwgJGtleSk7CglpZiAoc3RycG9zKCR1cmwsICc/JykgPT09IGZhbHNl KSB7CgkJcmV0dXJuICgkdXJsIC4gJz8nIC4gJGtleSAuICc9JyAuICR2YWx1ZSk7Cgl9IGVs c2UgewoJCXJldHVybiAoJHVybCAuICcmJyAuICRrZXkgLiAnPScgLiAkdmFsdWUpOwoJfQp9 CmZ1bmN0aW9uIHNtZF9yZW1vdmVRU1ZhcigkdXJsLCAka2V5KSB7CgkkdXJsID0gcHJlZ19y ZXBsYWNlKCcvKC4qKShcP3wmKScgLiAka2V5IC4gJz1bXiZdKz8oJikoLiopL2knLCAnJDEk MiQ0JywgJHVybCAuICcmJyk7CgkkdXJsID0gc3Vic3RyKCR1cmwsIDAsIC0xKTsKCXJldHVy biAoJHVybCk7Cn0KLy8gcmV0dXJuIGEgbGlzdCBvZiBjYXRlZ29yaWVzIHVuZGVyIChhbmQg aW5jbHVkaW5nKSB0aGUgZ2l2ZW4gcGFyZW50IGNhdGVnb3J5CmZ1bmN0aW9uIHNtZF9nZXRT dWJDYXRzKCRwYXJlbnQsJGNhdHR5cGUpIHsKCSRwYXJlbnQgPSBkb1NsYXNoKCRwYXJlbnQp OwoJJGxleHRyZW0gPSAxOyAkcmV4dHJlbSA9IDE7CglleHRyYWN0KHNhZmVfcm93KCJsZnQg YXMgbGV4dHJlbSwgcmd0IGFzIHJleHRyZW0iLCAidHhwX2NhdGVnb3J5IiwgIm5hbWU9JyRw YXJlbnQnIGFuZCB0eXBlID0gJyRjYXR0eXBlJyIpKTsKCSRycyA9IHNhZmVfcm93c19zdGFy dCgiaWQsbmFtZSx0aXRsZSIsInR4cF9jYXRlZ29yeSIsICJsZnQgYmV0d2VlbiAkbGV4dHJl bSBhbmQgJHJleHRyZW0gYW5kIHR5cGUgPSAnJGNhdHR5cGUnIG9yZGVyIGJ5IGxmdCBhc2Mi KTsKCSRjYXRzID0gYXJyYXkoKTsKCgl3aGlsZSAoJHJvdyA9IG5leHRSb3coJHJzKSkgewoJ CSRjYXRzW10gPSBhcnJheSgKCQkJJ2lkJyA9PiAkcm93WydpZCddLAoJCQknbmFtZScgPT4g JHJvd1snbmFtZSddLAoJCQkndGl0bGUnID0+ICRyb3dbJ3RpdGxlJ10KCQkpOwoJfQoJcmV0 dXJuICRjYXRzOwp9Ci8vIFNlYXJjaGVzIHRoZSBwYXNzZWQgJHN0ciBmb3IgcHJlZGV0ZXJt aW5lZCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycwovLyBhbmQsIGlmIHRoYXQgc2VxdWVuY2Ug aXMgaW4gJGFsbG93ZWQsIHJlcGxhY2VzIGl0IGFzIGZvbGxvd3M6Ci8vICA/YyA9IGN1cnJl bnQgZ2xvYmFsIGNhdGVnb3J5ICghYyA9IG5vdCBjdXJyZW50IGNhdGVnb3J5KQovLyAgP3Mg PSBjdXJyZW50IHNlY3Rpb24gKCFzID0gbm90IGN1cnJlbnQgc2VjdGlvbikKLy8gID90ID0g Y3VycmVudCBhcnRpY2xlIHRpdGxlICghdCA9IG5vdCBjdXJyZW50IHRpdGxlKQovLyAgP2lk ID0gY3VycmVudCBhcnRpY2xlIElELCBwcmVwZW5kZWQgd2l0aCAkaWRwcmVmaXggKCFpZCA9 IG5vdCBjdXJyZW50IElEKQovLyAgP2ZpZWxkID0gY29udGVudHMgb2YgdGhlIGN1cnJlbnQg YXJ0aWNsZSdzIGZpZWxkIChjb3VsZCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0KQovLyAg IWZpZWxkID0gbm90IHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcnRpY2xlJ3MgZmll bGQgKGNvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QpCi8vIFJhbmdlcyAoZS5nLiAx LTUgb3IgYS16KSB3aWxsIGJlIGV4cGFuZGVkIGludG8gdGhlaXIgaW5kaXZpZHVhbCB2YWx1 ZXMgKFBIUD40LjEuMCBmb3IgY2hhcnMpLgovLyBBbnl0aGluZyBlbHNlIGlzIHJldHVybmVk IHZlcmJhdGltLgovLyBPdXRwdXRzIHR3byBhcnJheXM7IHRoZSAxc3QgY29udGFpbmluZyBp dGVtcyBmb3IgaW5jbHVzaW9uLCB0aGUgMm5kIGZvciBleGNsdXNpb24uCmZ1bmN0aW9uIHNt ZF9nZXRBdHRzKCRzdHIsICRhbGxvd2VkLCAkaWRwcmVmaXg9IiIsICRzcGxpdGF0PSIsXHMi KSB7CglnbG9iYWwgJHByZXRleHQsICR0aGlzYXJ0aWNsZTsKCgkkb3V0ID0gYXJyYXkoKTsK CSRzdWJvdXQgPSBhcnJheSgpOwoJJG5vdG91dCA9IGFycmF5KCk7CgkkbWF0Y2hlcyA9IHNt ZF9zcGxpdFJhbmdlKCRzdHIsICRzcGxpdGF0KTsKCglmb3IgKCRpZHggPSAwOyAkaWR4IDwg Y291bnQoJG1hdGNoZXMpOyAkaWR4KyspIHsKCQkkdGhpc21hdGNoID0gJG1hdGNoZXNbJGlk eF07CgkJaWYgKCgkdGhpc21hdGNoID09PSAiP2MiKSAmJiBpbl9hcnJheSgiP2MiLCRhbGxv d2VkKSkgewoJCQkvLyBVc2UgZ2xvYmFsIGFydGljbGUgY2F0ZWdvcnksIGlmIGl0IGV4aXN0 cwoJCQlpZiAoJHByZXRleHRbJ2MnXSAhPSAiIikgewoJCQkJaWYgKCFpbl9hcnJheSgkcHJl dGV4dFsnYyddLCAkb3V0KSkgewoJCQkJCSRvdXRbXSA9ICRwcmV0ZXh0WydjJ107CgkJCQl9 CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoID09PSAiIWMiKSAmJiBpbl9hcnJheSgi IWMiLCRhbGxvd2VkKSkgewoJCQkvLyBEb24ndCB1c2UgZ2xvYmFsIGFydGljbGUgY2F0ZWdv cnkKCQkJaWYgKCRwcmV0ZXh0WydjJ10gIT0gIiIpIHsKCQkJCWlmICghaW5fYXJyYXkoJHBy ZXRleHRbJ2MnXSwgJG5vdG91dCkpIHsKCQkJCQkkbm90b3V0W10gPSAkcHJldGV4dFsnYydd OwoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmICgoJHRoaXNtYXRjaCA9PT0gIj9zIikgJiYgaW5f YXJyYXkoIj9zIiwkYWxsb3dlZCkpIHsKCQkJLy8gVXNlIGFydGljbGUgc2VjdGlvbgoJCQlp ZiAoJHByZXRleHRbJ3MnXSAhPSAiIikgewoJCQkJaWYgKCFpbl9hcnJheSgkcHJldGV4dFsn cyddLCAkb3V0KSkgewoJCQkJCSRvdXRbXSA9ICRwcmV0ZXh0WydzJ107CgkJCQl9CgkJCX0K CQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoID09PSAiIXMiKSAmJiBpbl9hcnJheSgiIXMiLCRh bGxvd2VkKSkgewoJCQkvLyBEb24ndCB1c2UgYXJ0aWNsZSBzZWN0aW9uCgkJCWlmICgkcHJl dGV4dFsncyddICE9ICIiKSB7CgkJCQlpZiAoIWluX2FycmF5KCRwcmV0ZXh0WydzJ10sICRu b3RvdXQpKSB7CgkJCQkJJG5vdG91dFtdID0gJHByZXRleHRbJ3MnXTsKCQkJCX0KCQkJfQoJ CX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2ggPT09ICI/dCIpICYmIGluX2FycmF5KCI/dCIsJGFs bG93ZWQpKSB7CgkJCS8vIFVzZSBhcnRpY2xlIFVSTCB0aXRsZSBpZiB0aGlzIGlzIGFuIGFy dGljbGUuCgkJCWlmICgkdGhpc2FydGljbGUgIT0gTlVMTCAmJiAkdGhpc2FydGljbGVbJ3Vy bF90aXRsZSddICE9ICIiKSB7CgkJCQlpZiAoIWluX2FycmF5KCR0aGlzYXJ0aWNsZVsndXJs X3RpdGxlJ10sICRvdXQpKSB7CgkJCQkJJG91dFtdID0gJHRoaXNhcnRpY2xlWyd1cmxfdGl0 bGUnXTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2ggPT09ICIhdCIpICYm IGluX2FycmF5KCIhdCIsJGFsbG93ZWQpKSB7CgkJCS8vIERvbid0IHVzZSBhcnRpY2xlIFVS TCB0aXRsZQoJCQlpZiAoJHRoaXNhcnRpY2xlICE9IE5VTEwgJiYgJHRoaXNhcnRpY2xlWyd1 cmxfdGl0bGUnXSAhPSAiIikgewoJCQkJaWYgKCFpbl9hcnJheSgkdGhpc2FydGljbGVbJ3Vy bF90aXRsZSddLCAkbm90b3V0KSkgewoJCQkJCSRub3RvdXRbXSA9ICR0aGlzYXJ0aWNsZVsn dXJsX3RpdGxlJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoID09PSAi P2lkIikgJiYgaW5fYXJyYXkoIj9pZCIsJGFsbG93ZWQpKSB7CgkJCS8vIFVzZSBhcnRpY2xl IElELCBwcmVwZW5kZWQgd2l0aCAkaWRwcmVmaXgKCQkJaWYgKCR0aGlzYXJ0aWNsZSAhPSBO VUxMKSB7CgkJCQlpZiAoIWluX2FycmF5KCRpZHByZWZpeCAuICRwcmV0ZXh0WydpZCddLCAk b3V0KSkgewoJCQkJCSRvdXRbXSA9ICRpZHByZWZpeCAuICRwcmV0ZXh0WydpZCddOwoJCQkJ fQoJCQl9CgkJfSBlbHNlIGlmICgoJHRoaXNtYXRjaCA9PT0gIiFpZCIpICYmIGluX2FycmF5 KCIhaWQiLCRhbGxvd2VkKSkgewoJCQkvLyBEb24ndCB1c2UgYXJ0aWNsZSBJRAoJCQlpZiAo JHRoaXNhcnRpY2xlICE9IE5VTEwpIHsKCQkJCWlmICghaW5fYXJyYXkoJGlkcHJlZml4IC4g JHByZXRleHRbJ2lkJ10sICRub3RvdXQpKSB7CgkJCQkJJG5vdG91dFtdID0gJGlkcHJlZml4 IC4gJHByZXRleHRbJ2lkJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21hdGNo WzBdID09PSAiPyIpICYmIGluX2FycmF5KCI/ZmllbGQiLCRhbGxvd2VkKSkgewoJCQkvLyBV c2UgdGhlIGdpdmVuIGZpZWxkIG5hbWU7IHdoaWNoIG1heSBiZSBhIGNvbW1hLXNlcGFyYXRl ZCBzdWJsaXN0LgoJCQkvLyBTcGxpdCBvZmYgdGhlIGZpZWxkIG5hbWUgZnJvbSB0aGUgcXVl c3Rpb24gbWFyawoJCQkkZmllbGRuYW1lID0gc3Vic3RyKCR0aGlzbWF0Y2gsMSk7CgkJCWlm ICgoJHRoaXNhcnRpY2xlICE9IE5VTEwpICYmIChpc3NldCgkdGhpc2FydGljbGVbJGZpZWxk bmFtZV0pKSkgewoJCQkJJGZpZWxkQ29udGVudHMgPSAkdGhpc2FydGljbGVbJGZpZWxkbmFt ZV07CgkJCX0gZWxzZSB7CgkJCQkkZmllbGRDb250ZW50cyA9ICRmaWVsZG5hbWU7CgkJCX0K CQkJaWYgKCFlbXB0eSgkZmllbGRDb250ZW50cykpIHsKCQkJCSRzdWJvdXQgPSBzbWRfc3Bs aXRSYW5nZShzdHJpcF90YWdzKCRmaWVsZENvbnRlbnRzKSwgJHNwbGl0YXQpOwoJCQkJZm9y ZWFjaCAoJHN1Ym91dCBhcyAkc3VibmFtZSkgewoJCQkJCWlmICghaW5fYXJyYXkoJHN1Ym5h bWUsICRvdXQpKSB7CgkJCQkJCSRvdXRbXSA9ICRzdWJuYW1lOwoJCQkJCX0KCQkJCX0KCQkJ fQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2hbMF0gPT09ICIhIikgJiYgaW5fYXJyYXkoIiFm aWVsZCIsJGFsbG93ZWQpKSB7CgkJCS8vIE5lZ2F0aW9uLiBNYXkgZWl0aGVyIGJlIGEgZmll bGQgbmFtZSAoYW5kIG1heWJlIGFub3RoZXIgQ1NMKSBvciBhIGZpeGVkIHRlcm0uCgkJCS8v IFNwbGl0IG9mZiB0aGUgbmFtZSBmcm9tIHRoZSBleGNsYW1hdGlvbiBtYXJrCgkJCSRmaWVs ZG5hbWUgPSBzdWJzdHIoJHRoaXNtYXRjaCwxKTsKCQkJaWYgKCgkdGhpc2FydGljbGUgIT0g TlVMTCkgJiYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXSkpKSB7CgkJCQkkZmll bGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsKCQkJfSBlbHNlIHsKCQkJ CSRmaWVsZENvbnRlbnRzID0gJGZpZWxkbmFtZTsKCQkJfQoJCQlpZiAoIWVtcHR5KCRmaWVs ZENvbnRlbnRzKSkgewoJCQkJJHN1Ym91dCA9IHNtZF9zcGxpdFJhbmdlKHN0cmlwX3RhZ3Mo JGZpZWxkQ29udGVudHMpLCAkc3BsaXRhdCk7CgkJCQlmb3JlYWNoICgkc3Vib3V0IGFzICRz dWJuYW1lKSB7CgkJCQkJaWYgKCFpbl9hcnJheSgkc3VibmFtZSwgJG5vdG91dCkpIHsKCQkJ CQkJJG5vdG91dFtdID0gJHN1Ym5hbWU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBlbHNlIHsK CQkJaWYgKCFpbl9hcnJheSgkdGhpc21hdGNoLCAkb3V0KSkgewoJCQkJJG91dFtdID0gJHRo aXNtYXRjaDsKCQkJfQoJCX0KCX0KCXJldHVybiBhcnJheSgkb3V0LCRub3RvdXQpOwp9Ci8v IFJldHVybiBhbiBhcnJheSBvZiBpdGVtcyBmcm9tIGEgc3RyaW5nIG9mICh1c3VhbGx5KSBj b21tYS1zZXBhcmF0ZWQgdmFsdWVzLgovLyBTb21lIHZhbHVlcyBtYXkgY29udGFpbiByYW5n ZXMgb2YgbnVtYmVycyBsaWtlIDEtNSB0aGF0IG5lZWQgJ2V4cGFuZGluZycgZmlyc3QKZnVu Y3Rpb24gc21kX3NwbGl0UmFuZ2UoJHN0ciwgJHNwbGl0YXQ9IixccyIpIHsKCSRyZXRhcnIg PSBhcnJheSgpOwoJJGVsZW1zID0gcHJlZ19zcGxpdCgnL1snLiRzcGxpdGF0LiddKy8nLCAk c3RyLCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7Cglmb3JlYWNoICgkZWxlbXMgYXMgJGl0 ZW0pIHsKCQkkbmVnYXRlID0gZmFsc2U7CgkJLy8gRG9lcyB0aGUgaXRlbSBzdGFydCB3aXRo IGEgbmVhZ2F0aW9uIGNoYXJhY3RlcgoJCWlmICgkaXRlbVswXSA9PSAiISIpIHsKCQkJJG5l Z2F0ZSA9IHRydWU7CgkJCSRpdGVtID0gc3Vic3RyKCRpdGVtLDEpOwoJCX0KCQkvLyBJcyB0 aGUgaXRlbSBhbiBpbnRlZ2VyIGxpc3QgcmFuZ2UKCQlpZiAocHJlZ19tYXRjaCgnL14oXGQr KVwtKFxkKykkLycsICRpdGVtKSkgewoJCQlsaXN0KCRsbywgJGhpKSA9IGV4cGxvZGUoIi0i LCAkaXRlbSwgMik7CgkJCSRyZXRhcnIgPSBhcnJheV9tZXJnZSgkcmV0YXJyLCByYW5nZSgk bG8sICRoaSkpOwoJCX0gZWxzZSB7CgkJCSRyZXRhcnJbXSA9ICRpdGVtOwoJCX0KCQkvLyBO ZWdhdGUgZWFjaCBpdGVtIGlmIG5lY2Vzc2FyeQoJCWlmICgkbmVnYXRlKSB7CgkJCWZvciAo JGlkeCA9IDA7ICRpZHggPCBjb3VudCgkcmV0YXJyKTsgJGlkeCsrKSB7CgkJCQkkcmV0YXJy WyRpZHhdID0gIiEiLiRyZXRhcnJbJGlkeF07CgkJCX0KCQl9Cgl9CglyZXR1cm4gJHJldGFy cjsKfQovLyBHZW5lcmljIGxvb2t1cCBmdW5jdGlvbiBmb3IgaW50ZXJmYWNpbmcgd2l0aCBN TFAgdG8gbG9jYWxpc2Ugc3RyaW5ncy4KLy8gICRzdHJheSA9IGFycmF5IG9mIGRlZmF1bHQg c3RyaW5ncwovLyAgJHdoYXQgPSBrZXkgdG8gbG9vayB1cAovLyAgJGFyZ3MgPSBhbnkgYXJn dW1lbnRzIHRoZSBrZXkgaXMgZXhwZWN0aW5nIGZvciByZXBsYWNlbWVudApmdW5jdGlvbiBz bWRfZ1R4dCgkc3RyYXksICR3aGF0LCAkYXJncyA9IGFycmF5KCkpIHsKCWdsb2JhbCAkdGV4 dGFycmF5LCAkc21kTUxQOwoJJGZuID0gc21kX2dldENhbGxlcigpOwoKCS8vIERyb3Agb3V0 IGlmIHRoZSBpZCBpc24ndCBkZWZpbmVkLgoJLy8gV291bGQgYmUgbmljZSB0byB1c2UgcmVm bGVjdGlvbiB0byBmaW5kIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBhbmQgcGFzcyB0aGF0 LAoJLy8gYnV0IHRoYXQncyBQSFA1IHRlcnJpdG9yeSBvbmx5CglpZiAoZW1wdHkoJGZuKSkg ewoJCSRzdHIgPSAkd2hhdDsKCX0gZWxzZSB7CgkJLy8gUHJlcGFyZSB0aGUgcHJlZml4ZWQg a2V5IGZvciB1c2UKCQkka2V5ID0gJHNtZE1MUFskZm5dIC4gJy0nIC4gJHdoYXQ7CgkJJGtl eSA9IHN0cnRvbG93ZXIoJGtleSk7CgoJCS8vIEdyYWIgZnJvbSB0aGUgZ2xvYmFsIHRleHRh cnJheSAocG9zc2libHkgZWRpdGVkIGJ5IE1MUCkgaWYgd2UgY2FuCgkJaWYoaXNzZXQoJHRl eHRhcnJheVska2V5XSkpIHsKCQkJJHN0ciA9ICR0ZXh0YXJyYXlbJGtleV07CgkJfSBlbHNl IHsKCQkJLy8gVGhlIHN0cmluZyBpc24ndCBpbiB0aGUgbG9jYWxpc2VkICR0ZXh0YXJyYXkg c28gZmFsbGJhY2sgdG8gdXNpbmcKCQkJLy8gdGhlIChub24gcHJlZml4ZWQpIHN0cmluZyBh cnJheSBpbiB0aGUgcGx1Z2luCgkJCSRrZXkgPSBzdHJ0b2xvd2VyKCR3aGF0KTsKCQkJJHN0 ciA9IChpc3NldCgkc3RyYXlbJGtleV0pKSA/ICRzdHJheVska2V5XSA6ICR3aGF0OwoJCX0K CX0KCS8vIFBlcmZvcm0gc3Vic3RpdHV0aW9ucwoJaWYoIWVtcHR5KCRhcmdzKSkgewoJCSRz dHIgPSBzdHJ0cigkc3RyLCAkYXJncyk7Cgl9CglyZXR1cm4gJHN0cjsKfQovLyBDaGVhdGlu ZyB3YXkgb2YgZmluZGluZyBhIGZ1bmN0aW9uJ3MgY2FsbGVyCmZ1bmN0aW9uIHNtZF9nZXRD YWxsZXIoKSB7CgkkYmFja3RyYWNlID0gZGVidWdfYmFja3RyYWNlKCk7CglyZXR1cm4gJGJh Y2t0cmFjZVsyXVsnZnVuY3Rpb24nXTsKfQoiO3M6MzoibWQ1IjtzOjMyOiIxZDJhYWI1NDcx OTM2ZDE2YjgzOTA5Zjg5ZGU3MzFlYSI7fQ==