# smd_lib v0.31 # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6NDoiMC4zMSI7czo2OiJhdXRob3IiO3M6MTE6IlN0ZWYg RGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIyOiJodHRwOi8vc3RlZmRhd3Nvbi5jb20v IjtzOjExOiJkZXNjcmlwdGlvbiI7czo1NjoiU2hhcmVkIGZ1bmN0aW9uIGxpYnJhcnkgdXNl ZCBieSBzbWRfIHBsdWdpbnMgYW5kIG90aGVycy4iO3M6NDoidHlwZSI7aToyO3M6NDoibmFt ZSI7czo3OiJzbWRfbGliIjtzOjQ6ImhlbHAiO3M6ODU0NjoiCTxoMT5zbWRfIHBsdWdpbiBs aWJyYXJ5PC9oMT4KCgk8cD5PZmZlcnMgbm8gcHVibGljIHRleHRwYXR0ZXJuIHRhZ3MuIEl0 IGlzIHNpbXBseSBhIHNoYXJlZCBsaWJyYXJ5IG9mIGNvbW1vbiBmdW5jdGlvbnMgdXNlZCBi eSBzbWRfIHBsdWdpbnMuPC9wPgoKCTxoMj5DaGFuZ2Vsb2c8L2gyPgoKCTx1bD4KCQk8bGk+ djAuMSAgIDA3LTAyLTI1IEluaXRpYWwgcHVibGljIHJlbGVhc2U8L2xpPgoJCTxsaT52MC4y ICAgMDctMDMtMDMgQWRkZWQ6IDxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+IChNdWx0 aS1MaW5ndWFsIFBhY2spIGxpYnJhcnkgc3VwcG9ydDwvbGk+CgkJPGxpPnYwLjIxICAwNy0w My0wNiBBZGRlZDogaW50ZWdlciByYW5nZSBmdW5jdGlvbmFsaXR5LiA8Y29kZT5zbWRfZ2V0 QXR0czwvY29kZT4gbm93IHRha2VzIGEgUmVnRXggYXJnPC9saT4KCQk8bGk+djAuMjFhIDA3 LTAzLTIxIEZpeGVkOiBDaGFyYWN0ZXIgcmFuZ2VzIGlnbm9yZWQgKHRoYW5rcyBtcmRhbGUp PC9saT4KCQk8bGk+djAuMjFiIDA3LTA0LTAyIEZpeGVkOiBTdGlja3kgYXJ0aWNsZSBzdXBw b3J0IGluIDxjb2RlPnNtZF9nZXRBdHRzPC9jb2RlPiAodGhhbmtzIHBpZW1hbik8L2xpPgoJ CTxsaT52MC4yMWMgMDctMDctMjkgRml4ZWQ6IE51bWVyaWMgcmFuZ2VzIGluIGNhdGVnb3Jp ZXMgKHRoYW5rcyB3b2xsZSk8L2xpPgoJCTxsaT52MC4yMWQgMDctMDgtMDMgRml4ZWQ6IE5l Z2F0aW9uIHdpdGggbXVsdGlwbGUgZWxlbWVudHM8L2xpPgoJCTxsaT52MC4yMWUgMDctMDkt MTQgRml4ZWQ6IEFiaWxpdHkgdG8gbGVhdmUgZW1wdHkgc3BsaXRSYW5nZSBwYXJhbWV0ZXJz IGludGFjdDwvbGk+CgkJPGxpPnYwLjIyICAwNy0wOS0yMCBGaXhlZDogVW5kZWZpbmVkIGlu ZGV4IHdhcm5pbmdzICh0aGFua3MgQW1iaXRpb3VzbGVtb24pLiBFbmhhbmNlZCBtYXRjaGVz IHNvIHNwYWNlcyBhcmUgYWxsb3dlZCBpbiBzdHJpbmdzICh0aGFua3MgRHJSb2dnKTwvbGk+ CgkJPGxpPnYwLjIzICAwNy0wNC0wOSA8c3BhbiBjbGFzcz0iY2FwcyI+QkVUQTwvc3Bhbj4g OiBBZGRlZCB0aGUgRnV6enlGaW5kIGNsYXNzIGFuZCBnZXRXb3JkIGZ1bmN0aW9uLiBnZXRB dHRzKCkgbm93IGFsbG93cyA8Y29kZT4/cTwvY29kZT48L2xpPgoJCTxsaT52MC4zICAgMDct MTAtMjkgUmV3cm90ZSA8Y29kZT5zbWRfZ2V0QXR0czwvY29kZT4gYXMgPGNvZGU+c21kX2dl dE9wdHM8L2NvZGU+IHRvIGFsbG93IHJlcGxhY2VkIHZhcnMgd2l0aGluIHRleHQuIERlcHJl Y2F0ZWQgPGNvZGU+c21kX2dldEF0dHM8L2NvZGU+LCBhZGRlZCA8Y29kZT5zbWRfcHJlZ1Bv czwvY29kZT4uIENoYW5nZWQgPGNvZGU+c21kX3NwbGl0UmFuZ2U8L2NvZGU+IGFzIDxjb2Rl PnNtZF9zcGxpdDwvY29kZT4gdG8gYWxsb3cgcmFuZ2VzIHRvIGJlIHN3aXRjaGVkIG9uIG9y IG9mZi4gRGVwcmVjYXRlZCA8Y29kZT5zbWRfc3BsaXRSYW5nZTwvY29kZT4uIEFkZGVkIGdl bmVyaWMgPHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj4gY2xhc3Mgc3VwcG9ydCAoPGNv ZGU+c21kX01MUDwvY29kZT4pLiBEZXByZWNhdGVkIDxjb2RlPnNtZE1MUDwvY29kZT4gYXJy YXksIDxjb2RlPnNtZF9nVHh0PC9jb2RlPiBhbmQgPGNvZGU+c21kX2dldENhbGxlcjwvY29k ZT4uIE1hZGUgPGNvZGU+c21kX0Z1enp5RmluZDwvY29kZT4gYW5kIDxjb2RlPnNtZF9nZXRX b3JkPC9jb2RlPiBvZmZpY2lhbDwvbGk+CgkJPGxpPnYwLjMxICAwNy0xMS0yNyBSZW1vdmVk IDxjb2RlPnNtZE1MUDwvY29kZT4gYXJyYXksIDxjb2RlPnNtZF9nVHh0PC9jb2RlPiBhbmQg PGNvZGU+c21kX2dldENhbGxlcjwvY29kZT4uIERlcHJlY2F0ZWQgPGNvZGU+c21kX2dldFN1 YkNhdHM8L2NvZGU+LiBBZGRlZCBhIGZldyBQSFA0IGhlbHBlciBmdW5jdGlvbnM8L2xpPgoJ PC91bD4KCgk8aDI+RnVuY3Rpb24gUmVmZXJlbmNlPC9oMj4KCgk8cD48c3Ryb25nPnNtZF9h ZGRRU1Zhcjwvc3Ryb25nPjxiciAvPgo8c3Ryb25nPnNtZF9yZW1vdmVRU1Zhcjwvc3Ryb25n PjwvcD4KCgk8cD5BZGQgb3IgcmVtb3ZlIGEgcXVlcnkgc3RyaW5nIHZhcmlhYmxlIHRvIHRo ZSBnaXZlbiA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPiwgdGFraW5nIGludG8gYWNj b3VudCBhbnkgZXhpc3RpbmcgdmFyaWFibGVzIHRoYXQgbWF5IGJlIGluIHRoZSA8c3BhbiBj bGFzcz0iY2FwcyI+VVJMPC9zcGFuPiBhbHJlYWR5LiAmIzgyMjA7QWRkJiM4MjIxOyB0YWtl cyB0aHJlZSBhcmd1bWVudHMsICYjODIyMDtSZW1vdmUmIzgyMjE7IGp1c3QgdGFrZXMgdGhl IGZpcnN0IHR3bzo8L3A+CgoJPG9sPgoJCTxsaT5UaGUgPHNwYW4gY2xhc3M9ImNhcHMiPlVS TDwvc3Bhbj4gc3RyaW5nIHRvIGFkZCB0by9yZW1vdmUgZnJvbTwvbGk+CgkJPGxpPlRoZSBp ZCBvZiB0aGUgcXVlcnlzdHJpbmcgKHRoZSBiaXQgYmVmb3JlIHRoZSA9IHNpZ24pPC9saT4K CQk8bGk+VGhlIHZhbHVlIG9mIHRoZSBuZXcgcXVlcnlzdHJpbmcgKHRoZSBiaXQgYWZ0ZXIg dGhlID0gc2lnbik8L2xpPgoJPC9vbD4KCgk8cD5lLmcuIDxjb2RlPnNtZF9hZGRRU1Zhcigk dGhpc2FydGljbGVbJiMzOTt1cmxfdGl0bGUmIzM5O10sICYjMzk7dHBnJiMzOTssIDE1KTs8 L2NvZGU+IHdvdWxkIGFkZCA8Y29kZT50cGc9MTU8L2NvZGU+IHRvIHRoZSBjdXJyZW50IGFy dGljbGUmIzgyMTc7cyA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPi4gSWYgdGhlcmUg YXJlIG5vIG90aGVyIHZhcmlhYmxlcyBjdXJyZW50bHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJj YXBzIj5VUkw8L3NwYW4+LCBpdCBpcyBhZGRlZCB3aXRoIGEgcXVlc3Rpb24gbWFyaywgb3Ro ZXJ3aXNlIGl0IGlzIGFwcGVuZGVkIHdpdGggYW4gYW1wZXJzYW5kLjwvcD4KCgk8cD48c3Ry b25nPnNtZF9nZXRTdWJDYXRzPC9zdHJvbmc+PC9wPgoKCTxwPlJldHVybnMgYWxsIDxzcGFu IGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IGNhdGVnb3JpZXMgb2YgdGhlIHNwZWNpZmllZCB0 eXBlIGJlbG93IDxlbT5hbmQgaW5jbHVkaW5nPC9lbT4gdGhlIGdpdmVuIHBhcmVudCBjYXRl Z29yeS48L3A+CgoJPHA+PHN0cm9uZz5zbWRfZ2V0T3B0czwvc3Ryb25nPjwvcD4KCgk8cD5T ZWFyY2hlcyB0aGUgcGFzc2VkIHN0cmluZyBmb3IgcHJlZGV0ZXJtaW5lZCBzZXF1ZW5jZXMg b2YgY2hhcmFjdGVycyBhbmQsIGlmIHRoYXQgc2VxdWVuY2UgaXMgaW4gdGhlIGdpdmVuICRh bGxvd2VkIGFycmF5LCByZXBsYWNlcyBpdCBhcyBmb2xsb3dzOjwvcD4KCgk8dWw+CgkJPGxp Pj9jID0gY3VycmVudCBnbG9iYWwgY2F0ZWdvcnkgKCFjID0gbm90IGN1cnJlbnQgY2F0ZWdv cnkpPC9saT4KCQk8bGk+P3MgPSBjdXJyZW50IHNlY3Rpb24gKCFzID0gbm90IGN1cnJlbnQg c2VjdGlvbik8L2xpPgoJCTxsaT4/dCA9IGN1cnJlbnQgYXJ0aWNsZSB0aXRsZSAoIXQgPSBu b3QgY3VycmVudCB0aXRsZSk8L2xpPgoJCTxsaT4/aWQgPSBjdXJyZW50IGFydGljbGUgSUQs IHByZXBlbmRlZCB3aXRoICRpZHByZWZpeCAoIWlkID0gbm90IGN1cnJlbnQgSUQpPC9saT4K CQk8bGk+P3EgPSBjdXJyZW50IHF1ZXJ5IHRlcm0gKCFxID0gbm90IGN1cnJlbnQgcXVlcnkg dGVybSk8L2xpPgoJCTxsaT4/ZmllbGQgPSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcnRp Y2xlJiM4MjE3O3MgZmllbGQgKGNvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QpPC9s aT4KCQk8bGk+IWZpZWxkID0gbm90IHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcnRp Y2xlJiM4MjE3O3MgZmllbGQgKGNvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QpPC9s aT4KCTwvdWw+CgoJPHA+SW50ZWdlciByYW5nZXMgKGUuZy4gMS01KSB3aWxsIGJlIGV4cGFu ZGVkIGludG8gdGhlaXIgaW5kaXZpZHVhbCB2YWx1ZXMgaWYgdGhlICRhbGxvd1JhbmdlIG9w dGlvbiBpcyB0cnVlOyBhbnl0aGluZyBlbHNlIGlzIHJldHVybmVkIHZlcmJhdGltLiBJdCBv dXRwdXRzIHR3byBhcnJheXM6IHRoZSAxc3QgY29udGFpbnMgaXRlbXMgZm9yIGluY2x1c2lv biwgdGhlIDJuZCBjb250YWlucyBpdGVtcyBmb3IgZXhjbHVzaW9uLjwvcD4KCgk8cD5Bcmdz ICggWypdID0gbWFuZGF0b3J5ICkgOgoJPG9sPgoJCTxsaT5bKl0gVGhlIHN0cmluZyB0byBz ZWFyY2ggZm9yIG1hdGNoZXM8L2xpPgoJCTxsaT5bKl0gQW4gYXJyYXkgY29udGFpbmluZyBz aG9ydGN1dHMgdGhhdCBhcmUgJiM4MjIwO2FsbG93ZWQmIzgyMjE7IHRvIGJlIGZvdW5kIGlu IHRoZSBzdHJpbmcgKD9jLCA/cywgP3QsID9maWVsZCBldGMpPC9saT4KCQk8bGk+VGhlIHBy ZWZpeCBmb3IgP2lkIHN0cmluZ3M8L2xpPgoJCTxsaT5Cb29sZWFuIGluZGljYXRpbmcgd2hl dGhlciB0byBhbGxvdyByYW5nZSBleHBhbnNpb24gb3Igbm90PC9saT4KCQk8bGk+UmVnRXgg c3RyaW5nIHRvIHNwbGl0IG9wdGlvbnMgYXQgKHNlZSBzbWRfc3BsaXQpPC9saT4KCQk8bGk+ cHJlZ19zcGxpdCBvcHRpb24gKHNlZSBzbWRfc3BsaXQpPC9saT4KCTwvb2w+PC9wPgoKCTxw PjxzdHJvbmc+c21kX3NwbGl0PC9zdHJvbmc+PC9wPgoKCTxwPlJldHVybiBhbiBhcnJheSBv ZiBpdGVtcyBmcm9tIGEgc3RyaW5nIG9mICh1c3VhbGx5KSBjb21tYS1zZXBhcmF0ZWQgdmFs dWVzLiBJZiBhbnkgdmFsdWVzIGNvbnRhaW4gcmFuZ2VzIG9mIG51bWJlcnMgbGlrZSAxLTUg dGhhdCBuZWVkICYjODIxNjtleHBhbmRpbmcmIzgyMTc7IGZpcnN0IChhbmQgJGFsbG93UmFu Z2UgaXMgdHJ1ZSksIHRoZXkgYXJlIGRlYWx0IHdpdGguIFRha2VzIHRoZSBmb2xsb3dpbmcg YXJndW1lbnRzICggWypdID0gbWFuZGF0b3J5IGFyZ3MpIDo8L3A+CgoJPG9sPgoJCTxsaT5b Kl0gVGhlIHN0cmluZyB0byBzcGxpdCB1cDwvbGk+CgkJPGxpPkJvb2xlYW4gaW5kaWNhdGlu ZyB3aGV0aGVyIHRvIGFsbG93IHJhbmdlIGV4cGFuc2lvbiBvciBub3QgKGkuZS4gMS01IGJl Y29tZXMgMSwyLDMsNCw1KTwvbGk+CgkJPGxpPlRoZSByZWd1bGFyIGV4cHJlc3Npb24gY2hh cmFjdGVyIGNsYXNzZXMgdG8gbWF0Y2guIElmIGEgZnVsbCBSZWdFeCBzdGFydGluZyBhbmQg ZW5kaW5nIHdpdGggJiM4MjE2Oy8mIzgyMTc7IGNoYXJhY3RlcnMgaXMgc3VwcGxpZWQsIHRo ZSBleHByZXNzaW9uIGlzIHVzZWQgdmVyYmF0aW0uIFdpdGhvdXQgdGhlICYjODIxNjsvJiM4 MjE3OyBjaGFyYWN0ZXJzLCB0aGUgZXhwcmVzc2lvbiBpcyB0cmVhdGVkIGFzIGEgbGlzdCBv ZiBjaGFyYWN0ZXIgY2xhc3NlcyB0byBmaW5kLiBEZWZhdWx0cyB0byAmIzgyMjA7LygsfCxc cykrLyYjODIyMTsgd2hpY2ggaXMgYSBjb21tYSwgb3IgY29tbWEgYW5kIGEgd2hpdGVzcGFj ZSBjaGFyYWN0ZXIuPC9saT4KCQk8bGk+cHJlZ19zcGxpdCBvcHRpb24gY29uc3RhbnQgYXMg ZGVmaW5lZCBpbiB0aGUgcGhwIG1hbnVhbDwvbGk+Cgk8L29sPgoKCTxwPjxzdHJvbmc+c21k X01MUDwvc3Ryb25nPjxiciAvPgpJbnN0YW50aWF0ZSBvbmUgb2YgdGhlc2UgdG8gaGFuZGxl IDxhY3JvbnltIHRpdGxlPSJNdWx0aS1MaW5ndWFsIFBhY2siPk1MUDwvYWNyb255bT4gaW4g eW91ciBwbHVnaW4gbGlrZSB0aGlzOjwvcD4KCgk8cD4xKSBEZWNsYXJlIGEgdW5pcXVlIGds b2JhbCB2YXJpYWJsZSwgZS5nLiBnbG9iYWwgJG15UGx1ZzxiciAvPgoyKSBEZWZpbmUgeW91 ciBkZWZhdWx0IHN0cmluZyByZXBsYWNlbWVudCBhcnJheSAoZG9lc24mIzgyMTc7dCBuZWVk IHRvIGJlIGdsb2JhbCksIGUuZzo8L3A+CgoJPHA+CSRteVN0cmluZ3MgPSBhcnJheSAoJiM4 MjIwO21zZzEmIzgyMjE7ID0+ICYjODIyMDtUaGlzIGlzIG1lc3NhZ2UgMSYjODIyMTssICYj ODIyMDttc2cyJiM4MjIxOyA9PiAmIzgyMjA7VGhpcyBpcyBtZXNzYWdlIDImIzgyMjE7KTs8 L3A+CgoJPHA+MykgQ3JlYXRlIGFuIDxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+IGhh bmRsZXI6PC9wPgoKCTxwPgkkbXlQbHVnID0gbmV3IHNtZF9NTFAoJiM4MjIwO3BsdWdpbl9u YW1lJiM4MjIxOywgJiM4MjIwO3BsdWdpbl9wcmVmaXgmIzgyMjE7LCAkbXlTdHJpbmdzKTs8 L3A+CgoJPHA+NCkgVGhhdCYjODIxNztzIGl0ISBUaGVyZSBhcmUgdHdvIG9wdGlvbmFsIGFy Z3MgdG8gc21kX01MUDoKCWEpIHRoZSBkZWZhdWx0IChmdWxsKSBsYW5ndWFnZSB0byB1c2Us IGUuZyAmIzgyMjA7ZGEtZGsmIzgyMjE7LiBEZWZhdWx0cyB0byAmIzgyMjA7ZW4tZ2ImIzgy MjE7LgoJYikgdGhlIGludGVyZmFjZSB0aGUgc3RyaW5ncyBhcmUgZm9yLiBDaG9vc2UgZnJv bSAmIzgyMjA7cHVibGljJiM4MjIxOyAodGhlIGRlZmF1bHQpLCAmIzgyMjA7YWRtaW4mIzgy MjE7IG9yICYjODIyMDtjb21tb24mIzgyMjE7PC9wPgoKCTxwPjUpIFRvIHVzZSBhIHJlcGxh Y2VtZW50IHN0cmluZyBpbiB5b3VyIGNvZGU6CglhKSBNYWtlIHN1cmUgdG8gaW1wb3J0IHRo ZSB1bmlxdWUgZ2xvYmFsIHZhcmlhYmxlOiBlLmcuIGdsb2JhbCAkbXlQbHVnOwoJYikgQ2Fs bCAkbXlQbHVnLT5nVHh0KCYjODIyMDttZXNzYWdlSUQmIzgyMjE7KTsgWyBlLmcuICRteVBs dWctPmdUeHQoJiM4MjIwO21zZzEmIzgyMjE7KSBdCgljKSBJZiB5b3Ugd2FudCB0byByZXBs YWNlIGFueSBhcmdzIGluIHlvdXIgbWVzc2FnZSBzdHJpbmcsIHBhc3MgYW4gYXNzb2NpYXRp dmUgYXJyYXkgYXMgdGhlIDJuZCBhcmcgdG8gZ1R4dCgpPC9wPgoKCTxwPjxzdHJvbmc+c21k X0Z1enp5RmluZDwvc3Ryb25nPjwvcD4KCgk8cD5BIDxzcGFuIGNsYXNzPSJjYXBzIj5QSFA8 L3NwYW4+IGNsYXNzIGZvciBhcHByb3hpbWF0ZSBzdHJpbmcgc2VhcmNoaW5nIG9mIGxhcmdl IHRleHQgbWFzc2VzLCBhZGFwdGVkICgqY291Z2gqIGJvcnJvd2VkKSBmcm9tIGh0dHA6Ly9l bG9uZW4uaWtpLmZpL2NvZGUvbWlzYy1ub3Rlcy9hcHByLXNlYXJjaC1waHAvLiBJbnN0YW50 aWF0ZSBvbmUgb2YgdGhlc2UgYW5kIHBhc3MgaXQgdGhlIHN0cmluZyBwYXR0ZXJuL3dvcmQg eW91IGFyZSBsb29raW5nIGZvciBhbmQgYSBudW1iZXIgaW5kaWNhdGluZyBob3cgY2xvc2Ug dGhhdCBtYXRjaCBoYXMgdG8gYmUvbWluaW11bSBsZW5ndGggb2Ygc3RyaW5ncyB0byBjb25z aWRlciAoaS5lLiB0aGUgYW1vdW50IG9mIGVycm9yIHRvbGVyYWJsZSkuIDA9Y2xvc2UgbWF0 Y2gvc2hvcnQgd29yZHM7IDEwPXByZXR0eSBtdWNoIGV2ZXJ5IGxvbmcgKDEwIGNoYXIgbWlu aW11bSkgc3RyaW5nIGluIHRoZSB3b3JsZC4gUHJhY3RpY2FsIHZhbHVlcyBhcmUgdXN1YWxs eSAxIG9yIDIsIHNvbWV0aW1lcyAzLjwvcD4KCgk8cD5Vc2FnZSBleGFtcGxlOjxiciAvPgou cHJlICAkZmluZGVyID0gbmV3IHNtZF9GdXp6eUZpbmQoJHBhdHQsICRtYXhfZXJyKTsKICBp ZiAoJGZpbmRlci0+dG9vX3Nob3J0X2VycikKICAgICRlcnJvciA9ICYjODIyMDtVbmFibGUg dG8gc2VhcmNoOiB1c2UgbG9uZ2VyIHBhdHRlcm4gb3IgcmVkdWNlIGVycm9yIHRvbGVyYW5j ZS4mIzgyMjE7OzwvcD4KCiAgd2hpbGUoJHRleHQgPSBnZXRfbmV4dF9wYWdlX29mX3RleHQo KSkgewogICAgJG1hdGNoZXMgPSAkZmluZGVyLT5zZWFyY2goJHRleHQpOwogICAgd2hpbGUo bGlzdCgkaWR4LCRybmcpID0gZWFjaCgkbWF0Y2hlcykpCiAgICAgIHByaW50ICYjODIyMDtN YXRjaCBmb3VuZCBlbmRpbmcgYXQgcG9zaXRpb24gJGlkeCB3aXRoIGEgY2xvc2VuZXNzIG9m ICR2YWxcbiYjODIyMTs7CiAgfQoKCTxwPlRoZSBjb2RlIHVzZXMgaW5pdGlhbCBmaWx0ZXJp bmcgdG8gc29ydCBvdXQgcG9zc2libGUgbWF0Y2ggY2FuZGlkYXRlcyBhbmQgdGhlbiBhcHBs aWVzIGEgc2xvd2VyIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgc2VhcmNoIChzZWFyY2hfc2hv cnQoKSkgYWdhaW5zdCB0aGVtLjwvcD4KCgk8cD48c3Ryb25nPnNtZF9nZXRXb3JkPC9zdHJv bmc+PC9wPgoKCTxwPlVzZWZ1bCB3aXRoIEZ1enp5RmluZDogaXQgdGFrZXMgYSBzdHJpbmcg YW5kIGFuIG9mZnNldCBpbnRvIHRoYXQgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSBuZWFyZXN0 ICYjODIyMDt3b3JkJiM4MjIxOyBiZWZvcmUgdGhhdCBvZmZzZXQgcG9zaXRpb24uIElmIHRo ZSBvZmZzZXQgaXMgbm90IHN1cHBsaWVkIGl0IHN0YXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmcg b2YgdGhlIHN0cmluZywgdGh1cyByZXR1cm5pbmcgdGhlIGZpcnN0IHdvcmQuPC9wPgoKCTxw PlRha2VzIDMgYXJnczoKCTxvbD4KCQk8bGk+WypdIFRoZSAodXN1YWxseSBsb29vbmcpIHN0 cmluZyB0byBsb29rIGluPC9saT4KCQk8bGk+WypdIFRoZSB3b3JkIHRvIGxvb2sgZm9yPC9s aT4KCQk8bGk+VGhlIG9mZnNldCBpbnRvIHRoZSBzdHJpbmcgYXQgd2hpY2ggdG8gc3RhcnQg bG9va2luZzwvbGk+Cgk8L29sPjwvcD4KCgk8cD48c3Ryb25nPnNtZF9wcmVnUG9zPC9zdHJv bmc+PC9wPgoKCTxwPkxpZnRlZCBmcm9tIG9uZSBvZiB0aGUgY29tbWVudHMgaW4gdGhlIDxz cGFuIGNsYXNzPSJjYXBzIj5QSFA8L3NwYW4+IG1hbnVhbCwgdGhpcyBqdXN0IGxvb2tzIGZv ciBhIFJlZ0V4IHN0cmluZyB3aXRoaW4gYW5vdGhlciwgcmV0dXJuaW5nIHRoZSBtYXRjaGVz IGl0IGZpbmRzIGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG1hdGNoLjwvcD4iO3M6 NDoiY29kZSI7czoxNjEwMToiCi8vIFNvZnR3YXJlIGVuZ2luZWVycyBsb29rIGF3YXkgbm93 IHVubGVzcyB5b3Ugd2lzaCB0byBiZSBob3JyaWZpZWQgYnkgdGhlIGFtb3VudAovLyBvZiBj b3VwbGluZyBhbmQgY29oZXNpb24gaW4gdGhlc2UgZnVuY3Rpb25zLiBJJ20gd2FybmluZyB5 b3UuLi4gaXQncyBub3QgcHJldHR5CmNsYXNzIHNtZF9GdXp6eUZpbmQgewoJLy8gVGhlIGxh c3QgMyBwYXJhbWV0ZXJzIGFyZSBmb3Igb3B0aW1pemF0aW9uIG9ubHksIHRvIGF2b2lkIHRo ZQoJLy8gc3VycHJpc2luZ2x5IHNsb3cgc3RybGVuKCkgYW5kIHN1YnN0cigpIGNhbGxzOgoJ Ly8gIC0gJHN0YXJ0X2luZGV4ID0gZnJvbSB3aGljaCBjaGFyYWN0ZXIgb2YgJHRleHQgdG8g c3RhcnQgdGhlIHNlYXJjaAoJLy8gIC0gJG1heF9sZW4gPSBtYXhpbXVtIGNoYXJhY3RlciB0 byBzZWFyY2ggKHN0YXJ0aW5nIGZyb20gJHN0YXJ0X2luZGV4KQoJLy8gIC0gJHRleHRfc3Ry bGVuID0KCS8vIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gYXJyYXkgb2YgbWF0Y2hlczoKCS8v ICAgQXJyYXkoIFs8bWF0Y2gtZW5kLWluZGV4Pl0gPT4gPGVycm9yPiwgLi4uICkKCS8vIE5v dGU6IDxlcnJvcj4gaXMgZ2VuZXJhbGx5IE5PVCBhbiBleGFjdCBlZGl0IGRpc3RhbmNlIGJ1 dCByYXRoZXIgYQoJLy8gbG93ZXIgYm91bmQuIFRoaXMgaXMgdW5mb3J0dW5hdGUgYnV0IHRo ZSByb3V0aW5lIHdvdWxkIGJlIHNsb3dlciBpZgoJLy8gdGhlIGV4YWN0IGVycm9yIHdhcyBj YWxjdWxhdGUgYWxvbmcgd2l0aCB0aGUgbWF0Y2hlcy4KCS8vIFRoZSBmdW5jdGlvbiBpcyBi YXNlZCBvbiB0aGUgbm9uLWRldGVybWluaXN0aWMgYXV0b21hdG9uIHNpbXVsYXRpb24KCS8v IGFsZ29yaXRobSAod2l0aG91dCBiaXQgcGFyYWxsZWxpc20gb3B0aW1pemF0aW9ucykuCglm dW5jdGlvbiBzZWFyY2hfc2hvcnQoJHBhdHQsICRrLCAkdGV4dCwgJHN0YXJ0X2luZGV4PTAs ICRtYXhfbGVuPS0xLCAkdGV4dF9zdHJsZW49LTEpIHsKCQlpZiAoICR0ZXh0X3N0cmxlbiA8 IDAgKQoJCQkkdGV4dF9zdHJsZW4gPSBzdHJsZW4oICR0ZXh0ICk7CgoJCWlmICggJG1heF9s ZW4gPCAwICkKCQkJJG1heF9sZW4gPSAkdGV4dF9zdHJsZW47CgoJCSRzdGFydF9pbmRleCA9 IG1heCggMCwgJHN0YXJ0X2luZGV4ICk7CgkJJG4gPSBtaW4oICRtYXhfbGVuLCAkdGV4dF9z dHJsZW4tJHN0YXJ0X2luZGV4ICk7CgkJJG0gPSBzdHJsZW4oICRwYXR0ICk7CgkJJGVuZF9p bmRleCA9ICRzdGFydF9pbmRleCArICRuOwoKCQkvLyBJZiAkdGV4dCBpcyBzaG9ydGVyIHRo YW4gJHBhdHQsIHVzZSB0aGUgYnVpbHQtaW4KCQkvLyBsZXZlbnNodGVpbigpIGluc3RlYWQ6 CgkJaWYgKCRuIDwgJG0pCgkJewoJCQkkbGV2ID0gbGV2ZW5zaHRlaW4oc3Vic3RyKCR0ZXh0 LCAkc3RhcnRfaW5kZXgsICRuKSwgJHBhdHQpOwoJCQlpZiAoICRsZXYgPD0gJGsgKQoJCQkJ cmV0dXJuIEFycmF5KCAkc3RhcnRfaW5kZXgrJG4tMSA9PiAkbGV2ICk7CgkJCWVsc2UKCQkJ CXJldHVybiBBcnJheSgpOwoJCX0KCgkJJHMgPSBBcnJheSgpOwoJCWZvciAoJGk9MDsgJGk8 JG07ICRpKyspCgkJewoJCQkkYyA9ICRwYXR0eyRpfTsKCQkJaWYgKCBpc3NldCgkc1skY10p KQoJCQkJJHNbJGNdID0gbWluKCRpLCAkc1skY10pOwoJCQllbHNlCgkJCQkkc1skY10gPSAk aTsKCQl9CgoJCWlmICggJGVuZF9pbmRleCA8ICRzdGFydF9pbmRleCApCgkJCXJldHVybiBB cnJheSgpOwoKCQkkbWF0Y2hlcyA9IEFycmF5KCk7CgkJJGRhID0gJGRiID0gcmFuZ2UoMCwg JG0tJGsrMSk7CgoJCSRtayA9ICRtLSRrOwoKCQlmb3IgKCR0PSRzdGFydF9pbmRleDsgJHQ8 JGVuZF9pbmRleDsgJHQrKykKCQl7CgkJCSRjID0gJHRleHR7JHR9OwoJCQkkaW5fcGF0dCA9 IGlzc2V0KCRzWyRjXSk7CgoJCQlpZiAoJHQmMSkgeyAkZD0mJGRhOyAkZT0mJGRiOyB9CgkJ CWVsc2UgeyAkZD0mJGRiOyAkZT0mJGRhOyB9CgoJCQlmb3IgKCRpPTE7ICRpPD0kbWs7ICRp KyspCgkJCXsKCQkJCSRnID0gbWluKCAkaysxLCAkZVskaV0rMSwgJGVbJGkrMV0rMSApOwoK CQkJCS8vIFRPRE86IG9wdGltaXplIHRoaXMgd2l0aCBhIGxvb2stdXAtdGFibGU/CgkJCQlp ZiAoICRpbl9wYXR0ICkKCQkJCQlmb3IgKCRqPSRlWyRpLTFdOyAoJGo8JGcgJiYgJGo8PSRt ayk7ICRqKyspCgkJCQkJCWlmICggJHBhdHR7JGkrJGotMX0gPT0gJGMgKQoJCQkJCQkJJGcg PSAkajsKCgkJCQkkZFskaV0gPSAkZzsKCQkJfQoKCQkJaWYgKCAkZFskbWtdIDw9ICRrICkK CQkJewoJCQkJJGVyciA9ICRkWyRta107CgkJCQkkaSA9IG1pbiggJHQtJGVyciskaysxLCAk c3RhcnRfaW5kZXgrJG4tMSk7CgkJCQlpZiAoICFpc3NldCgkbWF0Y2hlc1skaV0pIHx8ICRl cnIgPCAkbWF0Y2hlc1skaV0pCgkJCQkJJG1hdGNoZXNbJGldID0gJGVycjsKCQkJfQoJCX0K CgkJdW5zZXQoICRkYSwgJGRiICk7CgkJcmV0dXJuICRtYXRjaGVzOwoJfQoJZnVuY3Rpb24g dGVzdF9zaG9ydF9zZWFyY2goKSB7CgkJJHRlc3RfdGV4dCA9ICJPbGlwYSBrZXJyYW4ganVz c2kgYmomeGxpbmcgamEga29sbWVcbiBpbG9pc3RhICIuCgkJCSJqdXNzaSBiZm9ybGluZzpp YSBtdXR0YSBlaSB5aHRhYW4ganVzc2kgYmpvcmxpbmctbmltaXN0YSBsYXVsYWphYS4iOwoJ CSR0ZXN0X3BhdHQgPSAianVzc2kgYmpvcmxpbmciOwoJCWFzc2VydCggJHRoaXMtPnNlYXJj aF9zaG9ydCgkdGVzdF9wYXR0LCA0LCAkdGVzdF90ZXh0KSA9PSBBcnJheSgyNz0+MiwgNjA9 PjEsIDk0PT4wKSk7CgkJYXNzZXJ0KCAkdGhpcy0+c2VhcmNoX3Nob3J0KCR0ZXN0X3BhdHQs IDIsICR0ZXN0X3RleHQpID09IEFycmF5KDI3PT4yLCA2MD0+MSwgOTQ9PjApKTsKCQlhc3Nl cnQoICR0aGlzLT5zZWFyY2hfc2hvcnQoJHRlc3RfcGF0dCwgMSwgJHRlc3RfdGV4dCkgPT0g QXJyYXkoNjA9PjEsIDk0PT4wKSk7CgkJYXNzZXJ0KCAkdGhpcy0+c2VhcmNoX3Nob3J0KCR0 ZXN0X3BhdHQsIDAsICR0ZXN0X3RleHQpID09IEFycmF5KDk0PT4wKSk7CgkJYXNzZXJ0KCAk dGhpcy0+c2VhcmNoX3Nob3J0KCJiam9ybGluZyIsIDIsICR0ZXN0X3RleHQsIDE5LCA3KSA9 PSBBcnJheSgpKTsKCQlhc3NlcnQoICR0aGlzLT5zZWFyY2hfc2hvcnQoImJqb3JsaW5nIiwg MiwgJHRlc3RfdGV4dCwgMTksIDgpID09IEFycmF5KDI2PT4yKSk7CgkJYXNzZXJ0KCAkdGhp cy0+c2VhcmNoX3Nob3J0KCJiam9ybGluZyIsIDIsICR0ZXN0X3RleHQsIDIwLCA4KSA9PSBB cnJheSgpKTsKCX0KCgl2YXIgJHBhdHQsICRwYXR0X2xlbiwgJG1heF9lcnI7Cgl2YXIgJHBh cnRzLCAkbl9wYXJ0cywgJHVuaXF1ZV9wYXJ0cywgJG1heF9wYXJ0X2xlbjsKCXZhciAkdHJh bnNmX3BhdHQ7Cgl2YXIgJHRvb19zaG9ydF9lcnI7CglmdW5jdGlvbiBzbWRfRnV6enlGaW5k KCAkcGF0dGVybiwgJG1heF9lcnJvciApIHsKCQkkdGhpcy0+cGF0dCA9ICRwYXR0ZXJuOwoJ CSR0aGlzLT5wYXR0X2xlbiA9IHN0cmxlbigkdGhpcy0+cGF0dCk7CgkJJHRoaXMtPm1heF9l cnIgPSAkbWF4X2Vycm9yOwoKCQkvLyBDYWxjdWxhdGUgcGF0dGVybiBwYXJ0aXRpb24gc2l6 ZQoJCSRpbnRwYXJ0bGVuID0gZmxvb3IoJHRoaXMtPnBhdHRfbGVuLygkdGhpcy0+bWF4X2Vy cisyKSk7CgkJaWYgKCRpbnRwYXJ0bGVuIDwgMSkKCQl7CgkJCSR0aGlzLT50b29fc2hvcnRf ZXJyID0gVHJ1ZTsKCQkJcmV0dXJuOwoJCX0KCQllbHNlICR0aGlzLT50b29fc2hvcnRfZXJy ID0gRmFsc2U7CgoJCS8vIFBhcnRpdGlvbiB0aGUgcGF0dGVybiBmb3IgcHJ1bmluZwoJCSR0 aGlzLT5wYXJ0cyA9IEFycmF5KCk7CgkJZm9yICgkaT0wOyAkaTwkdGhpcy0+cGF0dF9sZW47 ICRpKz0kaW50cGFydGxlbikKCQl7CgkJCWlmICggJGkgKyAkaW50cGFydGxlbioyID4gJHRo aXMtPnBhdHRfbGVuICkKCQkJewoJCQkJJHRoaXMtPnBhcnRzW10gPSBzdWJzdHIoICR0aGlz LT5wYXR0LCAkaSApOwoJCQkJYnJlYWs7CgkJCX0KCQkJZWxzZQoJCQkJJHRoaXMtPnBhcnRz W10gPSBzdWJzdHIoICR0aGlzLT5wYXR0LCAkaSwgJGludHBhcnRsZW4gKTsKCQl9CgkJJHRo aXMtPm5fcGFydHMgPSBjb3VudCgkdGhpcy0+cGFydHMpOwoKCQkvLyBUaGUgaW50cGFydGxl biB0ZXN0IGFib3ZlIHNob3VsZCBoYXZlIGNvdmVyZWQgdGhpczoKCQlhc3NlcnQoICR0aGlz LT5uX3BhcnRzID49ICR0aGlzLT5tYXhfZXJyKzEgKTsKCgkJLy8gRmluZCBtYXhpbXVtIHBh cnQgbGVuZ3RoCgkJZm9yZWFjaCggJHRoaXMtPnBhcnRzIGFzICRwICkKCQkJJHRoaXMtPm1h eF9wYXJ0X2xlbiA9IG1heCggJHRoaXMtPm1heF9wYXJ0X2xlbiwgc3RybGVuKCRwKSk7CgoJ CS8vIE1ha2UgYSBuZXcgcGFydCBhcnJheSB3aXRoIGR1cGxpY2F0ZSBzdHJpbmdzIHJlbW92 ZWQKCQkkdGhpcy0+dW5pcXVlX3BhcnRzID0gYXJyYXlfdW5pcXVlKCR0aGlzLT5wYXJ0cyk7 CgoJCS8vIFRyYW5zZm9ybSB0aGUgcGF0dGVybiBpbnRvIGEgbG93IHJlc29sdXRpb24gcHJ1 bmluZyBzdHJpbmcKCQkvLyBieSByZXBsYWNpbmcgcGFydHMgd2l0aCBzaW5nbGUgY2hhcmFj dGVycwoJCSR0aGlzLT50cmFuc2ZfcGF0dCA9ICIiOwoJCXJlc2V0KCAkdGhpcy0+cGFydHMg KTsKCQl3aGlsZSAobGlzdCgsJHApID0gZWFjaCgkdGhpcy0+cGFydHMpKQoJCSAgICR0aGlz LT50cmFuc2ZfcGF0dCAuPSBjaHIoYXJyYXlfc2VhcmNoKCRwLCAkdGhpcy0+dW5pcXVlX3Bh cnRzKStvcmQoIkEiKSk7CgoJCS8vIFNlbGYgZGlhZ25vc3RpY3MKCQkkdGhpcy0+dGVzdF9z aG9ydF9zZWFyY2goKTsKCX0KCWZ1bmN0aW9uIHNlYXJjaCggJHRleHQgKSB7CgkJLy8gRmlu ZCBhbGwgb2NjdXJlbmNlcyBvZiB1bmlxdWUgcGFydHMgaW4gdGhlCgkJLy8gZnVsbCB0ZXh0 LiBUaGUgcmVzdWx0IGlzIGFuIGFycmF5OgoJCS8vICAgQXJyYXkoIDxpbmRleD4gPT4gPHBh cnQjPiwgLi4gKQoJCSRwYXJ0X21hcCA9IEFycmF5KCk7CgkJcmVzZXQoICR0aGlzLT51bmlx dWVfcGFydHMgKTsKCQl3aGlsZSAobGlzdCgkcGksICRwYXJ0X3N0cikgPSBlYWNoKCR0aGlz LT51bmlxdWVfcGFydHMpKQoJCXsKCQkJJHBvcyA9IHN0cnBvcygkdGV4dCwgJHBhcnRfc3Ry KTsKCQkJd2hpbGUgKCAkcG9zICE9PSBGYWxzZSApCgkJCXsKCQkJCSRwYXJ0X21hcFskcG9z XSA9ICRwaTsKCQkJCSRwb3MgPSBzdHJwb3MoJHRleHQsICRwYXJ0X3N0ciwgJHBvcysxKTsK CQkJfQoJCX0KCQlrc29ydCggJHBhcnRfbWFwICk7IC8vIFNvcnQgYnkgc3RyaW5nIGluZGV4 CgoJCS8vIFRoZSBmb2xsb3dpbmcgY29kZSBkb2VzIHNldmVyYWwgdGhpbmdzIHNpbXVsdGFu ZW91c2x5OgoJCS8vICAxKSBEaXZpZGUgdGhlIGluZGljZXMgaW50byBncm91cHMgdXNpbmcg Z2FwcwoJCS8vCSAgbGFyZ2VyIHRoYW4gJHRoaXMtPm1heF9lcnIgYXMgYm91bmRhcmllcy4K CQkvLyAgMikgVHJhbnNsYXRlIHRoZSBncm91cHMgaW50byBzdHJpbmdzIHNvIHRoYXQKCQkv LwkgIHBhcnQjIDAgPSAnQScsIHBhcnQjIDEgPSAnQicgZXRjLiB0byBtYWtlCgkJLy8JICBh IGxvdyByZXNvbHV0aW9uIGFwcHJveGltYXRlIHNlYXJjaCBwb3NzaWJsZSBsYXRlcgoJCS8v ICAzKSBTYXZlIHRoZSBzdHJpbmcgaW5kaWNlcyBpbiB0aGUgZnVsbCBzdHJpbmcKCQkvLwkg IHRoYXQgY29ycmVzcG9uZCB0byBjaGFyYWN0ZXJzIGluIHRoZSB0cmFuc2xhdGVkIHN0cmlu Zy4KCQkvLyAgNCkgRGlzY2FyZCBncm91cHMgKD1wYXJ0IHNlcXVlbmNlcykgdGhhdCBhcmUg dG9vCgkJLy8JICBzaG9ydCB0byBjb250YWluIHRoZSBhcHByb3hpbWF0ZSBwYXR0ZXJuLgoJ CS8vIFRoZSBmb3JtYXQgb2YgcmVzdWx0aW5nIGFycmF5OgoJCS8vICAgQXJyYXkoCgkJLy8J ICBBcnJheSggIjx0cmFuc2xhdGUtc3RyaW5nPiIsCgkJLy8JCQkgQXJyYXkoIDx0cmFuc2xh dGVkLWlkeD4gPT4gPGZ1bGwtaW5kZXg+LCAuLi4gKSApLAoJCS8vCSAgLi4uICkKCQkkdHJh bnNmID0gQXJyYXkoKTsKCQkkdHJhbnNmX3RleHQgPSAiIjsKCQkkdHJhbnNmX3BvcyA9IEFy cmF5KCk7CgkJJGxhc3RfZW5kID0gMDsKCQkkZ3JvdXBfbGVuID0gMDsKCQlyZXNldCggJHBh cnRfbWFwICk7CgkJd2hpbGUgKGxpc3QoJGksJHApID0gZWFjaCgkcGFydF9tYXApKQoJCXsK CQkJaWYgKCAkaS0kbGFzdF9lbmQgPiAkdGhpcy0+bWF4X3BhcnRfbGVuKyR0aGlzLT5tYXhf ZXJyICkKCQkJewoJCQkJaWYgKCAkZ3JvdXBfbGVuID49ICgkdGhpcy0+bl9wYXJ0cy0kdGhp cy0+bWF4X2VycikpCgkJCQkJJHRyYW5zZltdID0gQXJyYXkoICR0cmFuc2ZfdGV4dCwgJHRy YW5zZl9wb3MgKTsKCgkJCQkkdHJhbnNmX3RleHQgPSAiIjsKCQkJCSR0cmFuc2ZfcG9zID0g QXJyYXkoKTsKCQkJCSRncm91cF9sZW4gPSAwOwoJCQl9CgoJCQkkdHJhbnNmX3RleHQgLj0g Y2hyKCRwICsgb3JkKCJBIikpOwoJCQkkdHJhbnNmX3Bvc1tdID0gJGk7CgkJCSRncm91cF9s ZW4rKzsKCQkJJGxhc3RfZW5kID0gJGkgKyBzdHJsZW4oJHRoaXMtPnBhcnRzWyRwXSk7CgkJ fQoJCWlmICggc3RybGVuKCAkdHJhbnNmX3RleHQgKSA+PSAoJHRoaXMtPm5fcGFydHMtJHRo aXMtPm1heF9lcnIpKQoJCQkkdHJhbnNmW10gPSBBcnJheSggJHRyYW5zZl90ZXh0LCAkdHJh bnNmX3BvcyApOwoKCQl1bnNldCggJHRyYW5zZl90ZXh0LCAkdHJhbnNmX3BvcyApOwoKCQlp ZiAoIGN1cnJlbnQoJHRyYW5zZikgPT09IEZhbHNlICkKCQkJcmV0dXJuIEFycmF5KCk7CgoJ CS8vIEZpbHRlciB0aGUgcmVtYWluaW5nIGdyb3VwcyAoImFwcHJveGltYXRlIGFuYWdyYW1z IgoJCS8vIG9mIHRoZSBwYXR0ZXJuKSBhbmQgbGVhdmUgb25seSB0aGUgb25lcyB0aGF0IGhh dmUgZW5vdWdoCgkJLy8gcGFydHMgaW4gY29ycmVjdCBvcmRlci4gWW91IGNhbiB0aGluayBv ZiB0aGlzIGxhc3Qgc3RlcCBvZiB0aGUKCQkvLyBhbGdvcml0aG0gYXMgYSAqbG93IHJlc29s dXRpb24qIGFwcHJveGltYXRlIHN0cmluZyBzZWFyY2guCgkJLy8gVGhlIHJlc3VsdCBpcyBh biBhcnJheSBvZiBjYW5kaWRhdGUgdGV4dCBzcGFucyB0byBiZSBzY2FubmVkOgoJCS8vICAg QXJyYXkoIEFycmF5KDxmdWxsLXN0YXJ0LWlkeD4sIDxmdWxsLWVuZC1pZHg+KSwgLi4uICkK CQkkcGFydF9wb3NpdGlvbnMgPSBBcnJheSgpOwoJCXdoaWxlIChsaXN0KCxsaXN0KCRzdHIs ICRwb3NfbWFwKSkgPSBlYWNoKCR0cmFuc2YpKQoJCXsKLy8JCQlwcmludCAifCR0cmFuc2Zf cGF0dHwgLSB8JHN0cnxcbiI7CgkJCSRsb3Jlc19tYXRjaGVzID0gJHRoaXMtPnNlYXJjaF9z aG9ydCggJHRoaXMtPnRyYW5zZl9wYXR0LCAkdGhpcy0+bWF4X2VyciwgJHN0ciApOwoJCQl3 aGlsZSAobGlzdCgkdHJfZW5kLCApID0gZWFjaCgkbG9yZXNfbWF0Y2hlcykpCgkJCXsKCQkJ CSR0cl9zdGFydCA9IG1heCgwLCAkdHJfZW5kIC0gJHRoaXMtPm5fcGFydHMpOwoJCQkJaWYg KCAkdHJfZW5kID49ICR0cl9zdGFydCApCgkJCQl7CgkJCQkJJG1lZGlhbl9wb3MgPSAkcG9z X21hcFsgKGludCkoKCR0cl9zdGFydCskdHJfZW5kKS8yKSBdOwoJCQkJCSRzdGFydCA9ICRt ZWRpYW5fcG9zIC0gKCR0aGlzLT5wYXR0X2xlbi8yKzEpIC0gJHRoaXMtPm1heF9lcnIgLSAk dGhpcy0+bWF4X3BhcnRfbGVuOwoJCQkJCSRlbmQgPSAkbWVkaWFuX3BvcyArICgkdGhpcy0+ cGF0dF9sZW4vMisxKSArICR0aGlzLT5tYXhfZXJyICsgJHRoaXMtPm1heF9wYXJ0X2xlbjsK Ci8vCQkJCQlwcmludCAiIyIgLiBzdHJ0cihzdWJzdHIoICR0ZXh0LCAkc3RhcnQsICRlbmQt JHN0YXJ0ICksICJcblxyIiwgIiQkIikgLiAiI1xuIjsKLy8JCQkJCXByaW50X3IoICR0aGlz LT5zZWFyY2hfc2hvcnQoICYkdGhpcy0+cGF0dCwgJHRoaXMtPm1heF9lcnIsICYkdGV4dCwg JHN0YXJ0LCAkZW5kLSRzdGFydCApKTsKCgkJCQkJJHBhcnRfcG9zaXRpb25zW10gPSBBcnJh eSgkc3RhcnQsICRlbmQpOwoJCQkJfQoJCQl9CgkJCXVuc2V0KCAkbG9yZXNfbWF0Y2hlcyAp OwoJCX0KCQl1bnNldCggJHRyYW5zZiApOwoKCQlpZiAoIGN1cnJlbnQoJHBhcnRfcG9zaXRp b25zKSA9PT0gRmFsc2UgKQoJCQlyZXR1cm4gQXJyYXkoKTsKCgkJLy8gU2NhbiB0aGUgZmlu YWwgY2FuZGlkYXRlcyBhbmQgcHV0IHRoZSBtYXRjaGVzIGluIGEgbmV3IGFycmF5OgoJCSRt YXRjaGVzID0gQXJyYXkoKTsKCQkkdGV4dF9sZW4gPSBzdHJsZW4oJHRleHQpOwoJCXdoaWxl IChsaXN0KCwgbGlzdCgkc3RhcnQsICRlbmQpKSA9IGVhY2goJHBhcnRfcG9zaXRpb25zKSkK CQl7CgkJCSRtID0gJHRoaXMtPnNlYXJjaF9zaG9ydCggJHRoaXMtPnBhdHQsICR0aGlzLT5t YXhfZXJyLCAkdGV4dCwgJHN0YXJ0LCAkZW5kLSRzdGFydCwgJHRleHRfbGVuICk7CgkJCXdo aWxlIChsaXN0KCRpLCAkY29zdCkgPSBlYWNoKCRtKSkKCQkJCSRtYXRjaGVzWyRpXSA9ICRj b3N0OwoJCX0KCQl1bnNldCgkcGFydF9wb3NpdGlvbnMpOwoKCQlyZXR1cm4gJG1hdGNoZXM7 Cgl9Cn0KY2xhc3Mgc21kX01MUCB7Cgl2YXIgJHNtZF9zdHJpbmdzOwoJdmFyICRzbWRfb3du ZXI7Cgl2YXIgJHNtZF9wcmVmaXg7Cgl2YXIgJHNtZF9sYW5nOwoJdmFyICRzbWRfZXZlbnQ7 CglmdW5jdGlvbiBzbWRfTUxQKCRwbHVnLCAkcHJlZngsICRzdHJhcnJheSwgJGxuZz0nZW4t Z2InLCAkZXY9J3B1YmxpYycpIHsKCQkkdGhpcy0+c21kX293bmVyID0gJHBsdWc7CgkJJHRo aXMtPnNtZF9wcmVmaXggPSAkcHJlZng7CgkJJHRoaXMtPnNtZF9zdHJpbmdzID0gJHN0cmFy cmF5OwoJCSR0aGlzLT5zbWRfbGFuZyA9ICRsbmc7CgkJJHRoaXMtPnNtZF9ldmVudCA9ICRl djsKCQlyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJHRoaXMsICdzbWRfQ2FsbGJhY2snKSwg J2wxMG4uZW51bWVyYXRlX3N0cmluZ3MnKTsKCX0KCWZ1bmN0aW9uIHNtZF9DYWxsYmFjaygk ZXZlbnQ9J2wxMG4uZW51bWVyYXRlX3N0cmluZ3MnLCAkc3RlcD0nJywgJHByZT0wKSB7CgkJ JHIgPSBhcnJheSgKCQkJJ293bmVyJyA9PiAkdGhpcy0+c21kX293bmVyLAoJCQkncHJlZml4 JyA9PiAkdGhpcy0+c21kX3ByZWZpeCwKCQkJJ2xhbmcnID0+ICR0aGlzLT5zbWRfbGFuZywK CQkJJ2V2ZW50JyA9PiAkdGhpcy0+c21kX2V2ZW50LAoJCQknc3RyaW5ncycgPT4gJHRoaXMt PnNtZF9zdHJpbmdzLAoJCSk7CgkJcmV0dXJuICRyOwoJfQoJLy8gR2VuZXJpYyBsb29rdXAK CS8vICAkd2hhdCA9IGtleSB0byBsb29rIHVwCgkvLyAgJGFyZ3MgPSBhbnkgYXJndW1lbnRz IHRoZSBrZXkgaXMgZXhwZWN0aW5nIGZvciByZXBsYWNlbWVudAoJZnVuY3Rpb24gZ1R4dCgk d2hhdCwgJGFyZ3MgPSBhcnJheSgpKSB7CgkJZ2xvYmFsICR0ZXh0YXJyYXk7CgoJCS8vIFBy ZXBhcmUgdGhlIHByZWZpeGVkIGtleSBmb3IgdXNlCgkJJGtleSA9ICR0aGlzLT5zbWRfcHJl Zml4IC4gJy0nIC4gJHdoYXQ7CgkJJGtleSA9IHN0cnRvbG93ZXIoJGtleSk7CgoJCS8vIEdy YWIgZnJvbSB0aGUgZ2xvYmFsIHRleHRhcnJheSAocG9zc2libHkgZWRpdGVkIGJ5IE1MUCkg aWYgd2UgY2FuCgkJaWYoaXNzZXQoJHRleHRhcnJheVska2V5XSkpIHsKCQkJJHN0ciA9ICR0 ZXh0YXJyYXlbJGtleV07CgkJfSBlbHNlIHsKCQkJLy8gVGhlIHN0cmluZyBpc24ndCBpbiB0 aGUgbG9jYWxpc2VkIHRleHRhcnJheSBzbyBmYWxsYmFjayB0byB1c2luZwoJCQkvLyB0aGUg KG5vbiBwcmVmaXhlZCkgc3RyaW5nIGFycmF5IGluIHRoZSBwbHVnaW4KCQkJJGtleSA9IHN0 cnRvbG93ZXIoJHdoYXQpOwoJCQkkc3RyID0gKGlzc2V0KCR0aGlzLT5zbWRfc3RyaW5nc1sk a2V5XSkpID8gJHRoaXMtPnNtZF9zdHJpbmdzWyRrZXldIDogJHdoYXQ7CgkJfQoJCS8vIFBl cmZvcm0gc3Vic3RpdHV0aW9ucwoJCWlmKCFlbXB0eSgkYXJncykpIHsKCQkJJHN0ciA9IHN0 cnRyKCRzdHIsICRhcmdzKTsKCQl9CgoJCXJldHVybiAkc3RyOwoJfQp9CmZ1bmN0aW9uIHNt ZF9hZGRRU1ZhcigkdXJsLCAka2V5LCAkdmFsdWUpIHsKCSR1cmwgPSBzbWRfcmVtb3ZlUVNW YXIoJHVybCwgJGtleSk7CglpZiAoc3RycG9zKCR1cmwsICc/JykgPT09IGZhbHNlKSB7CgkJ cmV0dXJuICgkdXJsIC4gJz8nIC4gJGtleSAuICc9JyAuICR2YWx1ZSk7Cgl9IGVsc2UgewoJ CXJldHVybiAoJHVybCAuICcmJyAuICRrZXkgLiAnPScgLiAkdmFsdWUpOwoJfQp9CmZ1bmN0 aW9uIHNtZF9yZW1vdmVRU1ZhcigkdXJsLCAka2V5KSB7CgkkdXJsID0gcHJlZ19yZXBsYWNl KCcvKC4qKShcP3wmKScgLiAka2V5IC4gJz1bXiZdKz8oJikoLiopL2knLCAnJDEkMiQ0Jywg JHVybCAuICcmJyk7CgkkdXJsID0gc3Vic3RyKCR1cmwsIDAsIC0xKTsKCXJldHVybiAoJHVy bCk7Cn0KLy8gREVQUkVDQVRFRDogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkK ZnVuY3Rpb24gc21kX2dldFN1YkNhdHMoJHBhcmVudCwkY2F0dHlwZSkgewoJcmV0dXJuIGdl dFRyZWUoJHBhcmVudCwkY2F0dHlwZSk7IC8vZ2V0VHJlZSgpIG9yIGdldFRyZWVQYXRoKCk/ Pwp9Ci8vIERFUFJFQ0FURUQ6IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5CmZ1 bmN0aW9uIHNtZF9nZXRBdHRzKCRzdHIsICRhbGxvd2VkLCAkaWRwcmVmaXg9IiIsICRzcGxp dGF0PSIvKCx8LFxzKSsvIiwgJHByZWdvcHQgPSBQUkVHX1NQTElUX05PX0VNUFRZKSB7Cgly ZXR1cm4gc21kX2dldE9wdHMoJHN0ciwgJGFsbG93ZWQsICRpZHByZWZpeCwgdHJ1ZSwgJHNw bGl0YXQsICRwcmVnb3B0KTsKfQpmdW5jdGlvbiBzbWRfZ2V0T3B0cygkc3RyLCAkYWxsb3dl ZCwgJGlkcHJlZml4PSIiLCAkYWxsb3dSYW5nZT10cnVlLCAkc3BsaXRhdD0iLygsfCxccykr LyIsICRwcmVnb3B0ID0gUFJFR19TUExJVF9OT19FTVBUWSkgewoJZ2xvYmFsICRwcmV0ZXh0 LCAkdGhpc2FydGljbGU7CgoJJG91dCA9IGFycmF5KCk7Cgkkbm90b3V0ID0gYXJyYXkoKTsK CSRtYXRjaGVzID0gc21kX3NwbGl0KCRzdHIsICRhbGxvd1JhbmdlLCAkc3BsaXRhdCwgJHBy ZWdvcHQpOwoJLy8gQW4gYXJyYXkgdGhhdCB0ZWxscyB0aGUgbG9vcCB3aGF0IHRvIGRvIHdp dGggZWFjaCBvZiB0aGUgdmFsaWQgc3RyaW5ncwoJLy8gIGFyZzE6IHR5cGUgKDE9ZXhhY3Qg bWF0Y2gsIDI9YW55d2hlcmUgd2l0aGluIHN0cmluZywgMz1jdXN0b20gZmllbGQpCgkvLyAg YXJnMjogcHJlZml4LCBpZiBhbnkKCS8vICBhcmczOiB2YXJpYWJsZSB0byBzdWJzdGl0dXRl CgkvLyAgYXJnNDogZXh0cmEgY2hlY2ssIGlmIGFwcGxpY2FibGUKCS8vICBhcmc1OiBzdG9y ZSBpbiB0aGUgaW4vZXhjbHVkZSBsaXN0ICgxPWluY2x1ZGU7IDI9ZXhjbHVkZSkKCSRvcHQg PSBhcnJheSgKCQkiP2MiID0+IGFycmF5KDIsICIiLCAkcHJldGV4dFsnYyddLCAiMSIsIDEp LAoJCSIhYyIgPT4gYXJyYXkoMiwgIiIsICRwcmV0ZXh0WydjJ10sICIxIiwgMiksCgkJIj9z IiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3MnXSwgIjEiLCAxKSwKCQkiIXMiID0+IGFy cmF5KDIsICIiLCAkcHJldGV4dFsncyddLCAiMSIsIDIpLAoJCSI/cSIgPT4gYXJyYXkoMiwg IiIsICRwcmV0ZXh0WydxJ10sICIxIiwgMSksCgkJIiFxIiA9PiBhcnJheSgyLCAiIiwgJHBy ZXRleHRbJ3EnXSwgIjEiLCAyKSwKCQkiP3QiID0+IGFycmF5KDIsICIiLCAkdGhpc2FydGlj bGVbJ3VybF90aXRsZSddLCAnJHRoaXNhcnRpY2xlIT1OVUxMJywgMSksCgkJIiF0IiA9PiBh cnJheSgyLCAiIiwgJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJyR0aGlzYXJ0aWNsZSE9 TlVMTCcsIDIpLAoJCSI/aWQiID0+IGFycmF5KDEsICRpZHByZWZpeCwgJHByZXRleHRbJ2lk J10sICckdGhpc2FydGljbGUhPU5VTEwnLCAxKSwKCQkiIWlkIiA9PiBhcnJheSgxLCAkaWRw cmVmaXgsICRwcmV0ZXh0WydpZCddLCAnJHRoaXNhcnRpY2xlIT1OVUxMJywgMiksCgkJIj8i ID0+IGFycmF5KDMsICIiLCAiIiwgJyR0aGlzYXJ0aWNsZSE9TlVMTCcsIDEpLAoJCSIhIiA9 PiBhcnJheSgzLCAiIiwgIiIsICckdGhpc2FydGljbGUhPU5VTEwnLCAyKSwKCSk7CgoJZm9y ICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRtYXRjaGVzKTsgJGlkeCsrKSB7CgkJJG1hdGNo ZWQgPSBmYWxzZTsKCQkkdGhpc21hdGNoID0gJG1hdGNoZXNbJGlkeF07CgkJZm9yZWFjaCAo JG9wdCBhcyAkdmFyID0+ICRhcmdzKSB7CgkJCSRvcHZhciA9ICgkYXJnc1s0XSA9PSAxKSA/ ICJvdXQiIDogIm5vdG91dCI7CgkJCXN3aXRjaCAoJGFyZ3NbMF0pIHsKCQkJCWNhc2UgMToK CQkJCQlpZiAoKCR0aGlzbWF0Y2ggPT09ICR2YXIpICYmIGluX2FycmF5KCR2YXIsJGFsbG93 ZWQpKSB7CgkJCQkJCSRtYXRjaGVkID0gdHJ1ZTsKCQkJCQkJaWYgKCRhcmdzWzJdICE9ICIi ICYmICRhcmdzWzNdKSB7CgkJCQkJCQkkcmVwID0gc3RyX3JlcGxhY2UoJHZhciwgJGFyZ3Nb MV0uJGFyZ3NbMl0sICR0aGlzbWF0Y2gpOwoJCQkJCQkJaWYgKCFpbl9hcnJheSgkcmVwLCAk eyRvcHZhcn0pKSB7CgkJCQkJCQkJJHskb3B2YXJ9W10gPSAkcmVwOwoJCQkJCQkJfQoJCQkJ CQl9CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAyOgoJCQkJCSRwYXQgPSAnL1xcJy4k dmFyLickfFxcJy4kdmFyLidbXkEtWmEtejAtOV0vJzsKCQkJCQlpZiAoKGlzX2ludChzbWRf cHJlZ1BvcygkcGF0LCAkdGhpc21hdGNoLCAkZm5kKSkpICYmIGluX2FycmF5KCR2YXIsJGFs bG93ZWQpKSB7CgkJCQkJCSRtYXRjaGVkID0gdHJ1ZTsKCQkJCQkJaWYgKCRhcmdzWzJdICE9 ICIiICYmICRhcmdzWzNdKSB7CgkJCQkJCQkkcmVwID0gc3RyX3JlcGxhY2UoJHZhciwgJGFy Z3NbMV0uJGFyZ3NbMl0sICR0aGlzbWF0Y2gpOwoJCQkJCQkJaWYgKCFpbl9hcnJheSgkcmVw LCAkeyRvcHZhcn0pKSB7CgkJCQkJCQkJJHskb3B2YXJ9W10gPSAkcmVwOwoJCQkJCQkJfQoJ CQkJCQl9CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAzOgoJCQkJCSRsZW4gPSBzdHJs ZW4oJHZhcik7CgkJCQkJaWYgKChzdWJzdHIoJHRoaXNtYXRjaCwwLCRsZW4pID09PSAkdmFy KSAmJiBpbl9hcnJheSgkdmFyLiJmaWVsZCIsJGFsbG93ZWQpKSB7CgkJCQkJCSRtYXRjaGVk ID0gdHJ1ZTsKCQkJCQkJLy8gVXNlIHRoZSBnaXZlbiBmaWVsZCBuYW1lOyB3aGljaCBtYXkg YmUgYSBjb21tYS1zZXBhcmF0ZWQgc3VibGlzdC4KCQkJCQkJLy8gU3BsaXQgb2ZmIHRoZSBm aWVsZCBuYW1lIGZyb20gdGhlIHF1ZXN0aW9uIG1hcmsKCQkJCQkJJGZpZWxkbmFtZSA9IHN1 YnN0cigkdGhpc21hdGNoLCRsZW4pOwoJCQkJCQlpZiAoKCRhcmdzWzNdKSAmJiAoaXNzZXQo JHRoaXNhcnRpY2xlW3N0cnRvbG93ZXIoJGZpZWxkbmFtZSldKSkpIHsKCQkJCQkJCSRmaWVs ZENvbnRlbnRzID0gJHRoaXNhcnRpY2xlW3N0cnRvbG93ZXIoJGZpZWxkbmFtZSldOwoJCQkJ CQl9IGVsc2UgewoJCQkJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOwoJCQkJCQl9 CgkJCQkJCWlmICghZW1wdHkoJGZpZWxkQ29udGVudHMpKSB7CgkJCQkJCQkkc3Vib3V0ID0g c21kX3NwbGl0KHN0cmlwX3RhZ3MoJGZpZWxkQ29udGVudHMpLCAkYWxsb3dSYW5nZSwgJHNw bGl0YXQsICRwcmVnb3B0KTsKCQkJCQkJCWZvcmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUp IHsKCQkJCQkJCQlpZiAoIWluX2FycmF5KCRzdWJuYW1lLCAkeyRvcHZhcn0pKSB7CgkJCQkJ CQkJCSR7JG9wdmFyfVtdID0gJHN1Ym5hbWU7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9 CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQl9CgkJCWlmICgkbWF0Y2hlZCkgewoJCQkJYnJlYWs7 CgkJCX0KCQl9CgkJaWYgKCEkbWF0Y2hlZCkgewoJCQkvLyBBc3NpZ24gdGhlIHZhcmlhYmxl IHZlcmJhdGltCgkJCWlmICghaW5fYXJyYXkoJHRoaXNtYXRjaCwgJG91dCkpIHsKCQkJCSRv dXRbXSA9ICR0aGlzbWF0Y2g7CgkJCX0KCQl9Cgl9CglyZXR1cm4gYXJyYXkoJG91dCwkbm90 b3V0KTsKfQovLyBERVBSRUNBVEVEOiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25s eQpmdW5jdGlvbiBzbWRfc3BsaXRSYW5nZSgkc3RyLCAkc3BsaXRhdD0iLygsfCxccykrLyIs ICRwcmVnb3B0ID0gUFJFR19TUExJVF9OT19FTVBUWSkgewoJcmV0dXJuIHNtZF9zcGxpdCgk c3RyLCB0cnVlLCAkc3BsaXRhdCwgJHByZWdvcHQpOwp9CmZ1bmN0aW9uIHNtZF9zcGxpdCgk c3RyLCAkYWxsb3dSYW5nZT10cnVlLCAkc3BsaXRhdD0iLygsfCxccykrLyIsICRwcmVnb3B0 ID0gUFJFR19TUExJVF9OT19FTVBUWSkgewoJJHJldGFyciA9IGFycmF5KCk7CglpZiAoKHN1 YnN0cigkc3BsaXRhdCwwLDEpID09ICIvIikgJiYgKHN1YnN0cigkc3BsaXRhdCwgc3RybGVu KCRzcGxpdGF0KS0xLCAxKSA9PSAiLyIpKSB7CgkJJHBhdCA9ICRzcGxpdGF0OwoJfSBlbHNl IHsKCQkkcGF0ID0gJy9bJy4kc3BsaXRhdC4nXSsvJzsKCX0KCSRlbGVtcyA9IHByZWdfc3Bs aXQoJHBhdCwgJHN0ciwgLTEsICRwcmVnb3B0KTsKCWZvcmVhY2ggKCRlbGVtcyBhcyAkaXRl bSkgewoJCSRpdGVtID0gdHJpbSgkaXRlbSk7CgkJJG5lZ2F0ZSA9IGZhbHNlOwoJCS8vIERv ZXMgdGhlIGl0ZW0gc3RhcnQgd2l0aCBhIG5lZ2F0aW9uIGNoYXJhY3RlcgoJCWlmIChzdWJz dHIoJGl0ZW0sMCwxKSA9PT0gIiEiKSB7CgkJCSRuZWdhdGUgPSB0cnVlOwoJCQkkaXRlbSA9 IHN1YnN0cigkaXRlbSwxKTsKCQl9CgkJLy8gSXMgdGhlIGl0ZW0gYW4gaW50ZWdlciBsaXN0 IHJhbmdlCgkJaWYgKCRhbGxvd1JhbmdlICYmIHByZWdfbWF0Y2goJy9eKFxkKylcLShcZCsp JC8nLCAkaXRlbSkpIHsKCQkJbGlzdCgkbG8sICRoaSkgPSBleHBsb2RlKCItIiwgJGl0ZW0s IDIpOwoJCQkkcm5nID0gcmFuZ2UoJGxvLCAkaGkpOwoJCQkvLyBSZWFwcGx5IHRoZSBuZWdh dGlvbiBpZiBuZWNlc3NhcnkKCQkJZm9yKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHJuZyk7 ICRpZHgrKykgewoJCQkJJHJuZ1skaWR4XSA9ICgoJG5lZ2F0ZSkgPyAiISIgOiAiIikgLiAk cm5nWyRpZHhdOwoJCQl9CgkJCSRyZXRhcnIgPSBhcnJheV9tZXJnZSgkcmV0YXJyLCAkcm5n KTsKCQl9IGVsc2UgewoJCQkkcmV0YXJyW10gPSAoKCRuZWdhdGUpID8gIiEiIDogIiIpIC4g JGl0ZW07CgkJfQoJfQoJcmV0dXJuICRyZXRhcnI7Cn0KLy8gU3RvbGVuIGZyb20gcGhwLm5l dDogc3RycG9zIHBhZ2UgY29tbWVudHMuLi4KZnVuY3Rpb24gc21kX3ByZWdQb3MoJHNQYXR0 ZXJuLCAkc1N1YmplY3QsICYkRm91bmRTdHJpbmcsICRpT2Zmc2V0ID0gMCkgewoJJEZvdW5k U3RyaW5nID0gbnVsbDsKCWlmIChwcmVnX21hdGNoKCRzUGF0dGVybiwgJHNTdWJqZWN0LCAk YU1hdGNoZXMsIFBSRUdfT0ZGU0VUX0NBUFRVUkUsICRpT2Zmc2V0KSA+IDApIHsKCQkkRm91 bmRTdHJpbmcgPSAkYU1hdGNoZXNbMF1bMF07CgkJcmV0dXJuICRhTWF0Y2hlc1swXVsxXTsK CX0gZWxzZSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9Ci8vLi4uIGFuZCBhcnJheV9jb21iaW5l Li4uCmlmICghZnVuY3Rpb25fZXhpc3RzKCJhcnJheV9jb21iaW5lIikpIHsKCWZ1bmN0aW9u IGFycmF5X2NvbWJpbmUoJGFycjEsJGFycjIpIHsKCQkkb3V0ID0gYXJyYXkoKTsKCQlmb3Jl YWNoKCRhcnIxIGFzICRrZXkxID0+ICR2YWx1ZTEpIHsKCQkJJG91dFskdmFsdWUxXSA9ICRh cnIyWyRrZXkxXTsKCQl9CiAgIAlyZXR1cm4gJG91dDsKCX0KfQovLy4uLiBhbmQgaHRtbHNw ZWNpYWxjaGFyc19kZWNvZGUKaWYgKCFmdW5jdGlvbl9leGlzdHMoImh0bWxzcGVjaWFsY2hh cnNfZGVjb2RlIikpIHsKCWZ1bmN0aW9uIGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCRzdHJp bmcsICRxdW90ZV9zdHlsZSA9IEVOVF9DT01QQVQpIHsKCQlyZXR1cm4gc3RydHIoJHN0cmlu ZywgYXJyYXlfZmxpcChnZXRfaHRtbF90cmFuc2xhdGlvbl90YWJsZShIVE1MX1NQRUNJQUxD SEFSUywgJHF1b3RlX3N0eWxlKSkpOwoJfQp9CmZ1bmN0aW9uIHNtZF9nZXRXb3JkKCRoYXlz dGFjaywkc2VhcmNodGVybSwkb2Zmc2V0PTApIHsKCSRudW13b3JkcyA9IHN0cl93b3JkX2Nv dW50KCRzZWFyY2h0ZXJtKTsKCSRoYXlzdGFjayA9IHN0cnJldihzdWJzdHIoJGhheXN0YWNr LDAsJG9mZnNldCsxKSk7Cgkkc3BhY2VQb3MgPSAxOwoJZm9yICgkaWR4ID0gMDsgJGlkeCA8 ICRudW13b3JkczsgJGlkeCsrKSB7CgkJJHNwYWNlUG9zID0gKHN0cnBvcygkaGF5c3RhY2ss ICIgIiwgJHNwYWNlUG9zKSkrMTsKCX0KCXJldHVybiB0cmltKHN0cnJldihzdWJzdHIoJGhh eXN0YWNrLCAwLCAkc3BhY2VQb3MpKSk7Cn0KIjtzOjM6Im1kNSI7czozMjoiNzQyMzBkM2Fk YjNlZGJkY2M1NmVjZjU5NzAzZmJjYTEiO30=