Re: [mh] MH & HA - Integration? Migration?
Dave Neudoerffer <[email protected]> Mon, 25 Mar 2024 15:10:08 -0400
| Newsgroups | gmane.comp.misc.misterhouse.user |
|---|---|
| Message-ID | <CAOFx8LP4j7qk2jkktvHRDvEB1z7=YKYEFUF6jmMRVNMacPLWpg@mail.gmail.com> |
--000000000000a2fe8f061480ecfa Content-Type: multipart/alternative; boundary="000000000000a2fe8d061480ecf8" --000000000000a2fe8d061480ecf8 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Attached is the HA_Item.pm module. Documentation is at the top of the file (such as it is). Probably drop it in your local code directory for now. If you want to add items with a .mht file, the included read_table_snippet.txt can be added to read_table_A.pl or your own read table file. I will work on cleanup and more documentation. I will try to get a pull request together in the next few days. In the meantime, if anyone has fixes or suggestions, please fire my way. Dave On Mon, Mar 25, 2024 at 12:16=E2=80=AFPM <[email protected]> = wrote: > I've been playing with HA and MH for a while, too. I have about 6 Z-wave > switches that replaced Insteon switches, and are attached to HA now. I > also have about 25 Insteon switches attached to MH. MH and HA update > each other through MQTT (provided by Mosquitto). I don't think any of my > customization code cared whether a device was still in MH or got moved > to HA - it still controls the device by name (e.g. "$Porch_Light"), and > still runs the same. > > I have about 12K lines of code in MH. Someday I may migrate it all over > to HA, but my initial goal is similar to what others have said: migrate > all the hardware to HA and keep the existing logic in MH. New logic will > probably go in HA. > > -Brian M > > On 3/25/24 06:45, H Plato wrote: > > Hello, > > > > Is anyone using Home Assistant (HA)? I=E2=80=99ve recently picked up= a new > new devices, and it is impressive the amount of device support available = in > HA. I=E2=80=99d rather spend my time setting up automations than developi= ng device > modules. So I=E2=80=99m thinking about running them in parallel, as my MH= instance > has lots of logic that I don=E2=80=99t know how to replicate in HA, as we= ll as > speech for home events, watering moisture calculations, etc=E2=80=A6 HA w= ould be a > contained VM that would hold the devices and maybe the user interface. I > mainly use the floorplan IA7 interface, and I haven=E2=80=99t seen that i= n HA yet. > > > > Both MH and HA use MQTT, so that could be a communication option, or > using web calls. I also have some older tech that still works fine (weede= r > and W800), which I=E2=80=99ll have to figure out. My hardware is also old= , so I=E2=80=99m > seeing this as an opportunity to architect a bit more of a better solutio= n, > by virtualizing everything. > > > > Anyone gone down any of these paths? > > > > ________________________________________________________ > > To unsubscribe from this list, go to: > https://lists.sourceforge.net/lists/listinfo/misterhouse-users > > > > > > ________________________________________________________ > To unsubscribe from this list, go to: > https://lists.sourceforge.net/lists/listinfo/misterhouse-users > > --000000000000a2fe8d061480ecf8 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Attached is the HA_Item.pm module.=C2=A0 Documentation is = at the top of the file (such as it is).=C2=A0 Probably drop it in your loca= l code directory for now.=C2=A0 If you want to add items with a .mht file, = the included read_table_snippet.txt can be added to read_table_A.pl or your= own read table file.<div><br></div><div>I will work on cleanup and more do= cumentation.=C2=A0 I will try to get a pull request together in the next fe= w days.=C2=A0 In the meantime, if anyone has fixes or suggestions, please f= ire my way.</div><div><br></div><div>Dave</div><div><br></div><div><br></di= v></div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr= ">On Mon, Mar 25, 2024 at 12:16=E2=80=AFPM <<a href=3D"mailto:misterhous= [email protected]">[email protected]</a>> wrote:<br></= div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bor= der-left:1px solid rgb(204,204,204);padding-left:1ex">I've been playing= with HA and MH for a while, too. I have about 6 Z-wave <br> switches that replaced Insteon switches, and are attached to HA now. I <br> also have about 25 Insteon switches attached to MH. MH and HA update <br> each other through MQTT (provided by Mosquitto). I don't think any of m= y <br> customization code cared whether a device was still in MH or got moved <br> to HA - it still controls the device by name (e.g. "$Porch_Light"= ), and <br> still runs the same.<br> <br> I have about 12K lines of code in MH. Someday I may migrate it all over <br= > to HA, but my initial goal is similar to what others have said: migrate <br= > all the hardware to HA and keep the existing logic in MH. New logic will <b= r> probably go in HA.<br> <br> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 -Brian M<br> <br> On 3/25/24 06:45, H Plato wrote:<br> > Hello,<br> ><br> >=C2=A0 =C2=A0 Is anyone using Home Assistant (HA)? I=E2=80=99ve recentl= y picked up a new new devices, and it is impressive the amount of device su= pport available in HA. I=E2=80=99d rather spend my time setting up automati= ons than developing device modules. So I=E2=80=99m thinking about running t= hem in parallel, as my MH instance has lots of logic that I don=E2=80=99t k= now how to replicate in HA, as well as speech for home events, watering moi= sture calculations, etc=E2=80=A6 HA would be a contained VM that would hold= the devices and maybe the user interface. I mainly use the floorplan IA7 i= nterface, and I haven=E2=80=99t seen that in HA yet.<br> ><br> >=C2=A0 =C2=A0 Both MH and HA use MQTT, so that could be a communication= option, or using web calls. I also have some older tech that still works f= ine (weeder and W800), which I=E2=80=99ll have to figure out. My hardware i= s also old, so I=E2=80=99m seeing this as an opportunity to architect a bit= more of a better solution, by virtualizing everything.<br> ><br> >=C2=A0 =C2=A0 Anyone gone down any of these paths?<br> ><br> > ________________________________________________________<br> > To unsubscribe from this list, go to: <a href=3D"https://lists.sourcef= orge.net/lists/listinfo/misterhouse-users" rel=3D"noreferrer" target=3D"_bl= ank">https://lists.sourceforge.net/lists/listinfo/misterhouse-users</a><br> ><br> <br> <br> <br> ________________________________________________________<br> To unsubscribe from this list, go to: <a href=3D"https://lists.sourceforge.= net/lists/listinfo/misterhouse-users" rel=3D"noreferrer" target=3D"_blank">= https://lists.sourceforge.net/lists/listinfo/misterhouse-users</a><br> <br> </blockquote></div> --000000000000a2fe8d061480ecf8-- --000000000000a2fe8f061480ecfa Content-Type: text/plain; charset="US-ASCII"; name="read_table_snippet.txt" Content-Disposition: attachment; filename="read_table_snippet.txt" Content-Transfer-Encoding: base64 Content-ID: <f_lu7bg5wc1> X-Attachment-Id: f_lu7bg5wc1 ICAgIH0gZWxzaWYoICR0eXBlIGVxICJIQV9TRVJWRVIiICkgew0KCW15ICgkb2JqZWN0X25hbWUs ICRhZGRyZXNzLCAka2VlcGFsaXZlLCAkYXBpX2tleSkgPSBAaXRlbV9pbmZvOw0KCXJlcXVpcmUg SEFfSXRlbTsNCgkkY29kZSAuPSAiXCQke29iamVjdF9uYW1lfSA9IG5ldyBIQV9TZXJ2ZXIoICck b2JqZWN0X25hbWUnLCAnJGFkZHJlc3MnLCAnJGtlZXBhbGl2ZScsICckYXBpX2tleScgKTtcbiI7 DQogICAgfSBlbHNpZiggJHR5cGUgZXEgIkhBX0lURU0iICkgew0KCW15ICgkb2JqZWN0X25hbWUs ICRkb21haW4sICRlbnRpdHksICRoYV9zZXJ2ZXIpID0gQGl0ZW1faW5mbzsNCglyZXF1aXJlIEhB X0l0ZW07DQoJJGNvZGUgLj0gIlwkJHtvYmplY3RfbmFtZX0gPSBuZXcgSEFfSXRlbSggJyRkb21h aW4nLCAnJGVudGl0eScsIFwkJGhhX3NlcnZlciApO1xuIjsNCg== --000000000000a2fe8f061480ecfa Content-Type: application/octet-stream; name="HA_Item.pm" Content-Disposition: attachment; filename="HA_Item.pm" Content-Transfer-Encoding: base64 Content-ID: <f_lu7bg5w00> X-Attachment-Id: f_lu7bg5w00 IyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQo9YmVnaW4gY29tbWVudA0KICAgIEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBADQoNCiAgICA9aGVhZDEgQjxIQV9TZXJ2ZXI+DQogICAgPWhlYWQxIEI8 SEFfSXRlbT4NCg0KICAgIERhdmUgTmV1ZG9lcmZmZXIgPGRhdmVAbmV1ZG9lcmZmZXIuY29tPg0K DQogICAgPWhlYWQyIFNZTk9QU0lTDQoNCiAgICBBIEhvbWVBc3Npc3RhbnQgKEhBKSBJdGVtcyBt b2R1bGUgZm9yIE1pc3RlcmhvdXNlLg0KICAgIFVzZXMgSEEgd2ViIHNvY2tldCBpbnRlcmZhY2Uu DQoNCg0KICAgID1oZWFkMiBERVNDUklQVElPTg0KDQogICAgTWlzdGVyaG91c2UgaXRlbXMgY2xh c3MgZm9yIGNvbnRyb2wgb2YgSG9tZUFzc2lzdGFudCBFbnRpdGllcw0KDQogICAgUHJvY2Vzc2Vz IHRoZSBIb21lQXNzaXN0YW50IGVudGl0eSBzdGF0ZXMgcmVzcG9uc2Ugb24gc3RhcnR1cC4NCg0K ICAgIEhBIHdlYiBzb2NrZXQgZG9jOiAgaHR0cHM6Ly9kZXZlbG9wZXJzLmhvbWUtYXNzaXN0YW50 LmlvL2RvY3MvYXBpL3dlYnNvY2tldC8NCg0KRmlsZToNCiAgICBIQV9JdGVtLnBtDQoNCkRlc2Ny aXB0aW9uOg0KICAgIFRoaXMgaXMgYSBtaXN0ZXJob3VzZSBzdHlsZSBpdGVtcyBpbnRlcmZhY2Ug Zm9yIEhvbWVBc3Npc3RhbnQgZW50aXRpZXMNCg0KICAgIEF1dGhvcihzKToNCiAgICBEYXZlIE5l dWRvZXJmZmVyIDxkYXZlQG5ldWRvZXJmZmVyLmNvbT4NCg0KICAgIEhBIEl0ZW1zIChIQV9JdGVt LnBtKQ0KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICBUaGVyZSBhcmUgc2V2 ZXJhbCBIQSBlbnRpdHkgdHlwZXMgaW1wbGVtZW50ZWQgaW4gdGhpcyBtb2R1bGUgKHNlZSBiZWxv dykuDQoNCiAgICBFYWNoIE1IIGl0ZW0gY2FuIGhhbmRsZSBib3RoIGNvbW1hbmRzIGFuZCBzdGF0 ZSBtZXNzYWdlcyB0by9mcm9tIE1RVFQgZGV2aWNlcy4NCg0KICAgIFRoZXJlIGFyZSB0d28gY2xh c3NlcyBpbXBsZW1lbnRlZCBpbiBIQV9JdGVtLnBtOg0KDQogICAgSEFfU2VydmVyOg0KICAgICAg ICAgLSB0aGlzIGNsYXNzIGNvbm5lY3RzIHRvIGFuZCBtYW5hZ2VzIHRoZSBjb25uZWN0aW9uIHRv IEhvbWVBc3Npc3RhbnQgc2VydmVyDQoJIC0gaXQgdXNlcyBhIFNvY2tldF9JdGVtIHRvIG1hbmFn ZSB0aGUgdGNwL2lwIGNvbm5lY3Rpb24NCgkgLSBpdCB1c2VzIHBlcmwgbW9kdWxlIFByb3RvY29s OjpXZWJTb2NrZXQ6OkNsaWVudCB0byBtYW5hZ2UgdGhlIHdlYnNvY2tldA0KCSAtIGlmIHRoZSBz b2NrZXQgZHJvcHMsIHJlY29ubmVjdHMgd2lsbCBiZSBhdHRlbXB0ZWQgZXZlcnkgMTBzIHVudGls IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bA0KCSAtIHNlbmRzIGEgcGluZyByZXF1ZXN0IGV2ZXJ5IDxr ZWVwX2FsaXZlX3RpbWVyPiBzZWNvbmRzIC0tIGRlZmF1bHQgMTBzDQoJIC0gdGhpcyBvYmplY3Qg cmVxdWlyZXMgYSBIb21lQXNzaXN0YW50IExvbmcgTGl2ZWQgQWNjZXNzIFRva2VuDQoJICAgIC0g YXF1aXJlIGluIEhvbWVBc3Npc3RhbnQgVUkNCgkgICAgLSBnbyB0byB5b3VyIHByb2ZpbGUgdW5k ZXIgeW91ciB1c2VyIG5hbWUgbG93ZXIgbGVmdCBjb3JuZXINCgkgICAgLSBjcmVhdGUgdG9rZW4N CgkgICAgLSAqKiogTWFrZSBzdXJlIHlvdSBjb3B5IHRoZSB3aG9sZSB0aGluZw0KCSAtIHNlbmRz IGVudGl0eSBzdGF0ZSByZXF1ZXN0IG9uIHN0YXJ0dXAgYW5kIHByb2Nlc3NlcyBzdGF0ZXMgZm9y IGFsbCBkZXZpY2VzDQoNCiAgICBIQV9JdGVtDQoJLSBpbXBsZW1lbnRzIGFuIE1IIGl0ZW0gdGhh dCBpcyB0aWVkIHRvIGEgSEEgZW50aXR5IG9uIHRoZSBzcGVjaWZpZWQgSEEgU2VydmVyDQoJLSBz dGF0ZSBjaGFuZ2VzIGZyb20gSEEgYXJlIG1vbml0b3JlZCBhbmQgcmVmbGVjdGVkIGluIHRoZSBt aCBpdGVtIHN0YXRlDQoJLSB3aGVuIHRoZSBNSCBpdGVtIGlzIHNldCBsb2NhbGx5LCBhIHN0YXRl IGNoYW5nZSBpcyBzZW50IHRvIEhBDQoJICAgIC0gc3RhdGUgaXMgbm90IHJlZmxlY3RlZCBsb2Nh bGx5IHVudGlsIHRoZSBzdGF0ZSBjaGFuZ2UgaXMgcmVjZWl2ZWQgYmFjayBmcm9tIEhBDQoJLSBz ZXZlcmFsIEhBIEVudGl0eSB0eXBlcyBhcmUgc3VwcG9ydGVkOg0KCSAgICAtIGxpZ2h0OiAgY3Vy cmVudGx5IG9ubHkgYnJpZ2h0bmVzcyBhdHRyaWJ1dGUgaW1wbGVtZW50ZWQsIG5vIGNvbG91cg0K CSAgICAtIHN3aXRjaDogb24vb2ZmIHN3aXRjaA0KCSAgICAtIHNlbnNvciwgYmluYXJ5X3NlbnNv cjoNCgkgICAgICAgIC0gY2FuIGdyb3VwIG11bHRpcGxlIHNlbnNvcnMgaW50byBhIHNpbmdsZSBN SCBpdGVtIC0tIHBvcHVsYXRlcyAkaXRlbS0+e2F0dHJ9IGhhc2gNCgkJLSB1c2Ugb25lIG9yIG1v cmUgcGF0dGVybnMgdG8gbWF0Y2ggSEEgZW50aXR5IG5hbWVzLCBzZXBhcmF0ZWQgYnkgfA0KCQkt IGN1cnJlbnRseSBvbmx5IHBhdHRlcm4gc3VwcG9ydGVkIGlzIGVudGl0eV9wcmVmaXhfKiAodGV4 dCB3aXRoIGEgJyonIGF0IHRoZSBlbmQpDQoJICAgIC0gY2xpbWF0ZToNCgkgICAgICAgIC0gcG9w dWxhdGVzICR0aGVybW9zdGF0LT57YXR0cn0gd2l0aCB0aGVybW9zdGF0IGF0dHJpYnV0ZXMgbGlr ZSBzZXRwb2ludHMsIHRlbXBlcmF0dXJlcywgbW9kZSwgcHJlc2V0cyBldGMuDQoJCS0gY2FuIHNw ZWNpZnkgdGhlIEhBIHNlcnZpY2UgZm9yIG1vZGlmaWNhdGlvbnMNCgkJICAgIGVnLiAgJHRoZXJt b3N0YXQtPnNldCgic2V0X3RlbXBlcmF0dXJlOjcyIikNCgkJICAgIGVnICAgJHRoZXJtb3N0YXQt PnNldCgic2V0X2h2YWNfbW9kZTpoZWF0IikNCg0KICAgIA0KDQogICAgRGlzY292ZXJ5Og0KICAg IC0tLS0tLS0tLS0NCg0KICAgIFRoZSBIQV9TZXJ2ZXIgb2JqZWN0IHdpbGwgc2VuZCBvdXQgYW4g SEEgZW50aXR5IHN0YXRlIHF1ZXJ5IG9uIGNvbm5lY3Rpb24uDQogICAgVGhlIHJlc3BvbnNlIGlz IHByb2Nlc3NlZCBmb3IgYWxsIGVudGl0aWVzIHRoYXQgaGF2ZSBoYWQgYSBsb2NhbCBNSCBpdGVt IGRlZmluZWQuDQoNCiAgICBUaGVyZSBpcyBhIHN0YXRpYyBmdW5jdGlvbiBkZWZpbmVkIHRoYXQg d2lsbCBwcmludF9sb2cgYWxsIHVuaGFuZGxlZCBIQSBlbnRpdGllczoNCiAgICAgICAgSEFfU2Vy dmVyOjpsaXN0X3VuaGFuZGxlZF9lbnRpdGllcygpDQoNCg0KDQpMaWNlbnNlOg0KICAgIFRoaXMg ZnJlZSBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBwdWJs aWMgbGljZW5zZS4NCg0KVXNhZ2U6DQoNCiAgICBjb25maWcgcGFybXM6DQogICAgICAgIGhvbWVh c3Npc3RhbnRfYWRkcmVzcz0NCglob21lYXNzaXN0YW50X2FwaV9rZXk9DQoNCg0KICAgIC5taHQg ZmlsZToNCg0KCSMgSEFfU0VSVkVSLAlvYmogbmFtZSwJYWRkcmVzcywJa2VlcGFsaXZlLCAJYXBp X2tleSAgIA0KCUhBX1NFUlZFUiwJaGFfaG91c2UsCTEwLjMuMS4yMDo4MTIzLCAxMCwJCVhYWFhY WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhY WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhY WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhY WFhYWFhYWA0KDQoJI0hBX0lURU0sCW9iamVjdF9uYW1lLAkJZG9tYWluLAkJaGFfZW50aXR5LAkJ aGFfc2VydmVyLCAgc3lzdGVtbGlzdCwJICAgIGZyaWVuZGx5X25hbWUNCglIQV9JVEVNLAlzaGVk X2NvdW50ZXJfcG90cywJbGlnaHQsCQlzaGVkX2NvdW50ZXJfcG90cywJaGFfaG91c2UNCglIQV9J VEVNLAl3YXRlciwJCQlzd2l0Y2gsCQlob3VzZV93YXRlcl9zb2NrZXQsCWhhX2hvdXNlDQoJSEFf SVRFTSwJdGhlcm1vc3RhdCwJCWNsaW1hdGUsCWZhbWlseV9yb29tX3RoZXJtb3N0YXQsCWhhX2hv dXNlDQoJSEFfSVRFTSwJZWNvd2l0dF93ZWF0aGVyLAlzZW5zb3IsCQlocDI1NTFidV9wcm9fdjFf N182Xyp8ZWNvd2l0dF9jb3R0YWdlX3dlYXRoZXJfKiwgaGFfaG91c2UNCg0KDQoNCiAgICBhbmQg bWlzdGVyaG91c2UgdXNlciBjb2RlOg0KDQogICAgICAgIHJlcXVpcmUgSEFfSXRlbTsNCg0KCSRo YV9ob3VzZSA9IG5ldyBIQV9TZXJ2ZXIoICdoYV9ob3VzZScsICcxMC4yLjEuMjA6ODEyMycsICcx MCcsICd4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHgnICk7DQoJJGhhX2hvdXNlID0gbmV3IEhBX1NlcnZlciggJ2hhX2hv dXNlJyApOyAgIyBhZGRyZXNzIGFuZCBhcGlfa2V5IGZyb20gLmluaSBmaWxlDQoNCgkkd2F0ZXIg PSBuZXcgSEFfSXRlbSggJ3N3aXRjaCcsICdob3VzZV93YXRlcl9zb2NrZXQnLCAkaGFfaG91c2Ug KTsNCg0KICAgICAgICAjDQoJaWYoIHN0YXRlX2NoYW5nZWQgJHdhdGVyICkgew0KCSAgICAmcHJp bnRfbG9nKCAiQm9vdHJvb20gbGlnaHQgc2V0ICIgLiAkYm9vdHJvb21fc3dpdGNoLT5zdGF0ZV9j aGFuZ2VkKCkgKTsNCgl9DQoNCgkjDQoJaWYoIG5ld19taW51dGUoMTApICkgew0KCSAgICAjIHRo aXMgd2lsbCB0b2dnbGUgdGhlIGxpZ2h0IGJ5IHNlbmRpbmcgYSBIQSBtZXNzYWdlDQoJICAgICRz aGVkX2NvdW50ZXJfbGlnaHRzLT5zZXQoICd0b2dnbGUnICk7DQoJfQ0KDQoJIyB0aGlzIHdpbGwg cHJpbnRfbG9nIGFsbCBIQSB0b3BpY3MgdGhhdCBoYXZlIG5vdCBiZWVuIGhhbmRsZWQgYnkgYSBs b2NhbCBNSCBIQV9JdGVtDQoJJGhhX2hvdXNlLT5saXN0X3VuaGFuZGxlZF90b3BpY3MoKTsNCg0K DQpOb3RlczoNCiAgICBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCg0KICAgIFJlZmVyZW5j ZXM6DQogICAgICAgIGh0dHBzOi8vZGV2ZWxvcGVycy5ob21lLWFzc2lzdGFudC5pby9kb2NzL2Fw aS9yZXN0DQoJaHR0cHM6Ly9kZXZlbG9wZXJzLmhvbWUtYXNzaXN0YW50LmlvL2RvY3MvYXBpL3dl YnNvY2tldA0KDQogICAgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQoNCiAgICA9aGVhZDIg QjxOb3Rlczo+DQoNCiAgICBUaGlzIHByb2Nlc3NpbmcgcmVjZWl2ZXMgYWxsIGV2ZW50cyBmcm9t IEhvbWVBc3Npc3RhbnQuICBJdCBpcyBmYWlybHkgZWZmaWNpZW50DQogICAgYXQgd2VlZGluZyBv dXQgdGhlIG5vbmUgcmVsZXZhbnQgZXZlbnRzLiAgSSBoYXZlIG5vdCBzZWVuIGFueSBuZXR3b3Jr IGxvYWQgY2F1c2VkDQogICAgYnkgdm9sdW1lLiAgSXQgaXMgbGlrZWx5IG1vc3QgZWZmaWNpZW50 IHRvIGhhdmUgTUggYW5kIEhBIHJ1bm5pbmcgb24gdGhlIHNhbWUgbWFjaGluZS4NCg0KICAgID1o ZWFkMiBJTkhFUklUUw0KDQogICAgQjxOT05FPg0KDQogICAgPWhlYWQyIE1FVEhPRFMNCg0KICAg ID1vdmVyDQoNCiAgICA9aXRlbSBCPFVuRG9jPg0KDQogICAgPWl0ZW0gQjxUb0RvPg0KDQogICAg VGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgZG9uZS4NCiAgICAt IHRoZSBwYXR0ZXJuIG5lZWRzIHRvIGJlIG1hZGUgdG8gYmUgYSByZWdleHANCiAgICAtIG1heSBu ZWVkIGEgdGltZW91dCBpZiBoYXZlbid0IHJlY2VpdmVkIGEgcG9uZyBpbiBhIGNlcnRhaW4gdGlt ZSBhbmQgZm9yY2UgcmVjb25uZWN0DQogICAgLSBzdXBwb3J0IG1vcmUgSEEgZW50aXR5IGRvbWFp bnMNCg0KDQo9Y3V0DQoNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpwYWNrYWdlIEhBX1NlcnZl cjsNCg0KdXNlIHdhcm5pbmdzOw0KIyB1c2Ugc3RyaWN0Ow0KDQpASEFfU2VydmVyOjpJU0EgPSAo J0dlbmVyaWNfSXRlbScpOw0KDQp1c2UgUHJvdG9jb2w6OldlYlNvY2tldDo6Q2xpZW50Ow0KDQp1 c2UgSlNPTiBxdyggZGVjb2RlX2pzb24gZW5jb2RlX2pzb24gKTsgICANCnVzZSBFbmNvZGUgcXco ZGVjb2RlIGVuY29kZSk7DQoNCnVzZSBEYXRhOjpEdW1wZXI7DQoNCm15ICVIQV9TZXJ2ZXJfTGlz dDsNCg0Kc3ViIGxvZyB7DQogICAgbXkgKCRzZWxmLCAkc3RyLCAkcHJlZml4KSA9IEBfOw0KICAg IG15ICRtYXhsZW5ndGggPSAzMDA7DQoNCiAgICAkcHJlZml4ID0gJHByZWZpeCB8fCAnSEFTVlI6 ICc7DQogICAgJHN0ciA9ICRzdHIgfHwgJyc7DQogICAgd2hpbGUoIGxlbmd0aCggJHN0ciApID4g JG1heGxlbmd0aCApIHsNCglteSAkbCA9IDA7DQoJbXkgJGk7DQoJZm9yKCAkaT0wOyAkaTxsZW5n dGgoJHN0cikgJiYgJGw8JG1heGxlbmd0aDsgKyskaSwrKyRsICkgew0KCSAgICBpZiggc3Vic3Ry KCAkc3RyLCAkaSwgMSApIGVxICJcbiIgKSB7DQoJCSRsID0gMDsNCgkgICAgfQ0KCX0NCglwcmlu dCAkcHJlZml4IC4gc3Vic3RyKCRzdHIsMCwkaSkgLiAiXG4iOw0KCSZtYWluOjpwcmludF9sb2co ICRwcmVmaXggLiBzdWJzdHIoJHN0ciwwLCRpKSApOw0KCSRzdHIgPSBzdWJzdHIoICRzdHIsICRp ICk7DQoJJHByZWZpeCA9ICcuLi4uICAnOw0KICAgIH0NCiAgICBpZiggJHN0ciApIHsNCglwcmlu dCAkcHJlZml4IC4gJHN0ciAuICJcbiI7DQoJJm1haW46OnByaW50X2xvZyggJHByZWZpeCAuICRz dHIgKTsNCiAgICB9DQp9DQoNCnN1YiBkZWJ1ZyB7DQogICAgbXkoICRzZWxmLCAkbGV2ZWwsICRz dHIgKSA9IEBfOw0KICAgIGlmKCAkbWFpbjo6RGVidWd7aGFzdnJ9ID49ICRsZXZlbCApIHsNCgkk bGV2ZWwgPSAnRCcgaWYgJGxldmVsID09IDA7DQoJJHNlbGYtPmxvZyggJHN0ciwgIkhBU1ZSIEQk bGV2ZWw6ICIgKTsNCiAgICB9DQp9DQoNCnN1YiBlcnJvciB7DQogICAgbXkgKCRzZWxmLCAkc3Ry LCAkbGV2ZWwgKSA9IEBfOw0KICAgICZIQV9TZXJ2ZXI6OmxvZyggJHNlbGYsICRzdHIsICJIQVNW UiBFUlJPUjogIiApOw0KfQ0KDQpzdWIgZHVtcCB7DQogICAgbXkoICRzZWxmLCAkb2JqICkgPSBA XzsNCiAgICAkb2JqID0gJG9iaiB8fCAkc2VsZjsNCiAgICBteSAkZHVtcGVyID0gRGF0YTo6RHVt cGVyLT5uZXcoIFskb2JqXSApOw0KICAgICRkdW1wZXItPk1heGRlcHRoKCAyICk7DQogICAgcmV0 dXJuICRkdW1wZXItPkR1bXAoKTsNCn0NCg0KDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpz dWIgbmV3IHsNCiAgICBteSAoICRjbGFzcywgJG5hbWUsICRhZGRyZXNzLCAka2VlcF9hbGl2ZV90 aW1lciwgJGFwaV9rZXkgKSA9IEBfOw0KICAgIG15ICRzZWxmOw0KDQogICAgcHJpbnQgImNyZWF0 aW5nIEhBIFNlcnZlciAkbmFtZSBvbiAkYWRkcmVzc1xuIjsNCg0KICAgIGlmKCAhZGVmaW5lZCAk bWFpbjo6RGVidWd7aGFzdnJ9ICkgew0KCSRtYWluOjpEZWJ1Z3toYXN2cn0gPSAwOw0KCSMgJG1h aW46OkRlYnVne2hhc3ZyfSA9IDI7DQogICAgfQ0KDQogICAgJGFkZHJlc3MJCT0gJGFkZHJlc3Mg IHx8ICQ6OmNvbmZpZ19wYXJtc3tob21lYXNzaXN0YW50X2FkZHJlc3N9CXx8ICdsb2NhbGhvc3Q6 ODEyMyc7DQogICAgJGFwaV9rZXkJCT0gJGFwaV9rZXkgIHx8ICQ6OmNvbmZpZ19wYXJtc3tob21l YXNzaXN0YW50X2FwaV9rZXl9Ow0KICAgICRrZWVwX2FsaXZlX3RpbWVyCT0gJGtlZXBfYWxpdmVf dGltZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJzEwJzsNCiAgICAk a2VlcF9hbGl2ZV90aW1lciArPSAwOw0KDQogICAgJHNlbGYgPSB7fTsNCg0KICAgIGJsZXNzICRz ZWxmLCAkY2xhc3M7DQoNCiAgICAkJHNlbGZ7c3RhdGV9CQk9ICdvZmYnOw0KICAgICQkc2VsZntz YWlkfQkJPSAnJzsNCiAgICAkJHNlbGZ7c3RhdGVfbm93fQkJPSAnb2ZmJzsNCg0KICAgICRzZWxm LT57aXBfYWRkcmVzc30JCT0gJGFkZHJlc3M7DQogICAgJHNlbGYtPntrZWVwX2FsaXZlX3RpbWVy fQk9ICRrZWVwX2FsaXZlX3RpbWVyOw0KICAgICRzZWxmLT57cmVjb25uZWN0X3RpbWVyfQk9IDEw Ow0KICAgICRzZWxmLT57bmV4dF9pZH0JCT0gMjA7DQogICAgJHNlbGYtPntzdWJzY3JpYmVfaWR9 CT0gMDsNCiAgICAkc2VsZi0+e2FwaV9rZXl9CQk9ICRhcGlfa2V5Ow0KDQogICAgJHNlbGYtPntu ZXh0X3Bpbmd9CQk9IDA7DQogICAgJHNlbGYtPntnb3RfcGluZ19yZXNwb25zZX0JPSAxOw0KICAg ICRzZWxmLT57cGluZ19taXNzZWRfY291bnR9CT0gMDsNCg0KICAgICRzZWxmLT57cmVjb25fdGlt ZXJ9CT0gOjpUaW1lcjo6bmV3KCk7DQoNCiAgICAkc2VsZi0+e25hbWV9ID0gJG5hbWU7DQoNCg0K ICAgICRzZWxmLT5sb2coIkNyZWF0aW5nICRuYW1lIG9uICQkc2VsZntpcF9hZGRyZXNzfSIpOw0K DQoNCiAgICAkSEFfU2VydmVyX0xpc3R7JHNlbGYtPntuYW1lfX0gPSAkc2VsZjsNCg0KICAgICY6 Ok1haW5Mb29wX3ByZV9hZGRfaG9vayggXCZIQV9TZXJ2ZXI6OmNoZWNrX2Zvcl9kYXRhLCAxICk7 DQoNCiAgICAkc2VsZi0+Y29ubmVjdCgpOw0KICAgIHJldHVybiAkc2VsZjsNCn0NCg0KDQpzdWIg Y29ubmVjdCB7DQogICAgbXkgKCRzZWxmKSA9IEBfOw0KDQogICAgJHNlbGYtPntzb2NrZXRfaXRl bX0gPSBuZXcgU29ja2V0X0l0ZW0oIHVuZGVmLCB1bmRlZiwgJHNlbGYtPntpcF9hZGRyZXNzfSwg JHNlbGYtPntuYW1lfSwgJ3RjcCcsICdyYXcnICk7DQoNCiAgICBpZiggISRzZWxmLT57c29ja2V0 X2l0ZW19LT5zdGFydCgpICkgew0KCSRzZWxmLT5sb2coICJVbmFibGUgdG8gY29ubmVjdCBzb2Nr ZXQgdG8gJHNlbGYtPntpcF9hZGRyZXNzfSAuLi4gdHJ5aW5nIGFnYWluIGluICRzZWxmLT57cmVj b25uZWN0X3RpbWVyfXMiICk7DQogICAgICAgIGlmICgkc2VsZi0+e3JlY29uX3RpbWVyfS0+aW5h Y3RpdmUpIHsNCgkgICAgJHNlbGYtPntyZWNvbl90aW1lcn0tPnNldCgkc2VsZi0+e3JlY29ubmVj dF90aW1lcn0sIHN1YiB7ICZIQV9TZXJ2ZXI6OmNvbm5lY3QoICRzZWxmICkgfSk7DQoJfQ0KCXJl dHVybjsNCiAgICB9IGVsc2Ugew0KCSRzZWxmLT5sb2coICJDb25uZWN0ZWQgdG8gSG9tZUFzc2lz dGFudCBzZXJ2ZXIgYXQgJHNlbGYtPntpcF9hZGRyZXNzfSIgKTsNCiAgICB9DQoNCiAgICBteSAk d3NfY2xpZW50ID0gUHJvdG9jb2w6OldlYlNvY2tldDo6Q2xpZW50LT5uZXcodXJsID0+ICd3czov LycgLiAkc2VsZi0+e2lwX2FkZHJlc3N9IC4gJy9hcGkvd2Vic29ja2V0JyApOw0KICAgIA0KICAg ICR3c19jbGllbnQtPntoYV9zZXJ2ZXJ9ID0gJHNlbGY7DQogICAgJHNlbGYtPnt3c19jbGllbnR9 ID0gJHdzX2NsaWVudDsNCg0KICAgICR3c19jbGllbnQtPm9uKA0KCXdyaXRlID0+IHN1YiB7DQoJ ICAgIG15ICgkY2xpZW50LCRidWYpID0gQF87DQoJICAgIG15ICRzZWxmID0gJGNsaWVudC0+e2hh X3NlcnZlcn07DQogICAgIA0KCSAgICBpZiggJHNlbGYtPntzb2NrZXRfaXRlbX0gKSB7DQoJCSRz ZWxmLT57c29ja2V0X2l0ZW19LT5zZXQoICRidWYgKTsNCgkgICAgfQ0KCX0NCiAgICApOw0KICAg ICR3c19jbGllbnQtPm9uKA0KCXJlYWQgPT4gc3ViIHsNCgkgICAgbXkgKCRjbGllbnQsJGJ1Zikg PSBAXzsNCgkgICAgbXkgJHNlbGYgPSAkY2xpZW50LT57aGFfc2VydmVyfTsNCiAgICAgDQoJICAg ICRzZWxmLT5oYV9wcm9jZXNzX3JlYWQoICRidWYgKTsNCgl9DQogICAgKTsNCiAgICAkd3NfY2xp ZW50LT5vbigNCgllcnJvciA9PiBzdWIgew0KCSAgICBteSAoJGNsaWVudCwkYnVmKSA9IEBfOw0K CSAgICBteSAkc2VsZiA9ICRjbGllbnQtPntoYV9zZXJ2ZXJ9Ow0KICAgICANCgkgICAgJHNlbGYt PmVycm9yKCAiaGFfc2VydmVyIHJlY2VpdmVkIGVycm9yOiAkYnVmIiApOw0KCX0NCiAgICApOw0K ICAgICR3c19jbGllbnQtPntmcmFtZV9idWZmZXJ9LT57bWF4X3BheWxvYWRfc2l6ZX0gPSAyMDAw MDA7DQoNCiAgICAkc2VsZi0+e3dzX2NsaWVudH0tPmNvbm5lY3QoKTsNCn0NCg0Kc3ViIGNoZWNr X2Zvcl9kYXRhIHsNCiAgICBteSAkaGFfZGF0YTsNCg0KICAgIGZvcmVhY2ggbXkgJGhhX3NlcnZl ciAoIHZhbHVlcyAlSEFfU2VydmVyX0xpc3QgKSB7DQoJaWYoICRoYV9zZXJ2ZXItPntzb2NrZXRf aXRlbX0gKSB7DQoJICAgIGlmKCAkaGFfc2VydmVyLT57c29ja2V0X2l0ZW19LT5hY3RpdmVfbm93 KCkgKSB7DQoJCSRoYV9zZXJ2ZXItPmRlYnVnKCAxLCAiSG9tZWFzc2lzdGFudCBzZXJ2ZXIgc3Rh cnRlZCIgKTsNCgkgICAgfQ0KCSAgICBpZiggJGhhX3NlcnZlci0+e3NvY2tldF9pdGVtfS0+aW5h Y3RpdmVfbm93KCkgKSB7DQoJCSRoYV9zZXJ2ZXItPmRlYnVnKCAxLCAiSG9tZWFzc2lzdGFudCBz ZXJ2ZXIgY2xvc2UiICk7DQoJCSRoYV9zZXJ2ZXItPmRpc2Nvbm5lY3QoKTsNCgkJJGhhX3NlcnZl ci0+Y29ubmVjdCgpOw0KCQluZXh0Ow0KCSAgICB9DQoJfQ0KCQ0KCSMgUGFyc2VzIGluY29taW5n IGRhdGEgYW5kIG9uIGV2ZXJ5IGZyYW1lIGNhbGxzIG9uX3JlYWQNCglpZiggJGhhX3NlcnZlci0+ e3NvY2tldF9pdGVtfSAgYW5kICAkaGFfZGF0YSA9ICRoYV9zZXJ2ZXItPntzb2NrZXRfaXRlbX0t PnNhaWQoKSApIHsNCgkgICAgIyBwcmludCAiUmVjZWl2ZWQgZGF0YSBmcm9tIGhvbWUgYXNzaXN0 YW50OlxuICAgICAkaGFfZGF0YVxuIjsNCgkgICAgJGhhX3NlcnZlci0+e3dzX2NsaWVudH0tPnJl YWQoICRoYV9kYXRhICk7DQoJfQ0KCSANCglpZiggJjo6bmV3X3NlY29uZCgkaGFfc2VydmVyLT57 a2VlcF9hbGl2ZV90aW1lfSkgYW5kICAkaGFfc2VydmVyLT57d3NfY2xpZW50fSApIHsNCgkgICAg JGhhX3NlcnZlci0+e3dzX2NsaWVudH0tPndyaXRlKCAneyJpZCI6JyAuICsrJGhhX3NlcnZlci0+ e25leHRfaWR9IC4gJywgInR5cGUiOiJwaW5nIn0nICk7DQoJfQ0KICAgIH0NCn0NCg0Kc3ViIGhh X3Byb2Nlc3Nfd3JpdGUgew0KICAgIG15ICgkc2VsZiwgJGRhdGEpID0gQF87DQoNCiAgICBpZigg cmVmICRkYXRhICkgew0KCSRkYXRhID0gZW5jb2RlX2pzb24oICRkYXRhICk7DQogICAgfQ0KICAg IGlmKCAhJHNlbGYtPntzb2NrZXRfaXRlbX0tPmFjdGl2ZSgpICkgew0KICAgICAgICByZXR1cm47 DQogICAgfQ0KICAgICRzZWxmLT5kZWJ1ZyggMSwgInNlbmRpbmcgZGF0YSB0byBoYTogJGRhdGEi ICk7DQogICAgJHNlbGYtPnt3c19jbGllbnR9LT53cml0ZSggJGRhdGEgKTsNCn0NCg0Kc3ViIGhh X3Byb2Nlc3NfcmVhZCB7DQogICAgbXkgKCRzZWxmLCAkZGF0YSkgPSBAXzsNCiAgICBteSAkZGF0 YV9vYmo7DQogICAgbXkgJGpzb25fdGV4dDsNCg0KICAgICMgcHJpbnQgImhhX3NlcnZlciByZWNl aXZlZDogXG4gICAgIjsNCiAgICAjIHByaW50ICRkYXRhIC4gIlxuIjsNCg0KICAgICRqc29uX3Rl eHQgPSBlbmNvZGUoICJVVEYtOCIsICRkYXRhICk7DQogICAgZXZhbCB7JGRhdGFfb2JqID0gSlNP Ti0+bmV3LT51dGY4LT5kZWNvZGUoICRqc29uX3RleHQgKX07DQogICAgaWYoICRAICkgew0KCSRz ZWxmLT5lcnJvciggInBhcnNpbmcganNvbiBmcm9tIGhvbWVhc3Npc3RhbnQ6ICRAICBbJGpzb25f dGV4dF0iICk7DQoJcHJpbnQgIkVycm9yIHBhcnNpbmcganNvbiBmcm9tIGhvbWVhc3Npc3RhbnQ6 ICRAXG4iOw0KCXByaW50ICIgICBbJGpzb25fdGV4dF1cbiI7DQoJcmV0dXJuOw0KICAgIH0NCiAg ICBpZiggISRkYXRhX29iaiApIHsNCgkkc2VsZi0+ZXJyb3IoICJVbmFibGUgdG8gZGVjb2RlIGpz b246ICRkYXRhIiApOw0KCXJldHVybjsNCiAgICB9DQogICAgaWYoICRkYXRhX29iai0+e3R5cGV9 IGVxICdwb25nJyApIHsNCgkkc2VsZi0+ZGVidWcoIDEsICJSZWNlaXZlZCBwb25nIGZyb20gSEEi ICk7DQoJcmV0dXJuOw0KICAgIH0gZWxzaWYoICRkYXRhX29iai0+e3R5cGV9IGVxICdldmVudCcg ICYmICAkZGF0YV9vYmotPntpZH0gPT0gJHNlbGYtPntzdWJzY3JpYmVfaWR9ICkgew0KCSRzZWxm LT5wYXJzZV9kYXRhX3RvX29iaiggJGRhdGFfb2JqLT57ZXZlbnR9LT57ZGF0YX0tPntuZXdfc3Rh dGV9LCAiaGFzdnIiICk7DQogICAgICAgIHJldHVybjsNCiAgICB9IGVsc2lmKCAkZGF0YV9vYmot Pnt0eXBlfSBlcSAnYXV0aF9yZXF1aXJlZCcgKSB7DQoJbXkgJGF1dGhfbWVzc2FnZSA9ICJ7IFwi dHlwZVwiOiBcImF1dGhcIiwgXCJhY2Nlc3NfdG9rZW5cIjogXCIkJHNlbGZ7YXBpX2tleX1cIiB9 IjsNCgkkc2VsZi0+aGFfcHJvY2Vzc193cml0ZSggJGF1dGhfbWVzc2FnZSApOw0KCXJldHVybjsN CiAgICB9IGVsc2lmKCAkZGF0YV9vYmotPnt0eXBlfSBlcSAnYXV0aF9vaycgKSB7DQoJbXkgJHN1 YnNjcmliZTsNCgkkc2VsZi0+bG9nKCAiQXV0aGVudGljYXRlZCB0byBIb21lQXNzaXN0YW50IHNl cnZlciIgKTsNCgkkc2VsZi0+e3N1YnNjcmliZV9pZH0gPSArKyRzZWxmLT57bmV4dF9pZH07DQoJ JHN1YnNjcmliZS0+e2lkfSA9ICRzZWxmLT57c3Vic2NyaWJlX2lkfTsNCgkkc3Vic2NyaWJlLT57 dHlwZX0gPSAnc3Vic2NyaWJlX2V2ZW50cyc7DQoJJHN1YnNjcmliZS0+e2V2ZW50X3R5cGV9ID0g J3N0YXRlX2NoYW5nZWQnOw0KICAgICAgICAkc2VsZi0+aGFfcHJvY2Vzc193cml0ZSggJHN1YnNj cmliZSApOw0KCW15ICRnZXRzdGF0ZXM7DQoJJHNlbGYtPntnZXRzdGF0ZXNfaWR9ID0gKyskc2Vs Zi0+e25leHRfaWR9Ow0KCSRnZXRzdGF0ZXMtPntpZH0gPSAkc2VsZi0+e2dldHN0YXRlc19pZH07 DQoJJGdldHN0YXRlcy0+e3R5cGV9ID0gJ2dldF9zdGF0ZXMnOw0KICAgICAgICAkc2VsZi0+aGFf cHJvY2Vzc193cml0ZSggJGdldHN0YXRlcyApOw0KCXJldHVybjsNCiAgICB9IGVsc2lmKCAkZGF0 YV9vYmotPnt0eXBlfSBlcSAnYXV0aF9pbnZhbGlkJyApIHsNCgkkc2VsZi0+ZXJyb3IoICJBdXRo ZW50aWNhdGlvbiBpbnZhbGlkOiAiIC4gJHNlbGYtPmR1bXAoJGRhdGFfb2JqKSApOw0KICAgIH0g ZWxzaWYoICRkYXRhX29iai0+e3R5cGV9IGVxICdyZXN1bHQnICkgew0KCWlmKCAkZGF0YV9vYmot PntzdWNjZXNzfSApIHsNCgkgICAgJHNlbGYtPmRlYnVnKCAxLCAiUmVjZWl2ZWQgc3VjY2VzcyBv biByZXF1ZXN0ICRkYXRhX29iai0+e2lkfSIgKTsNCgkgICAgaWYoICRkYXRhX29iai0+e2lkfSA9 PSAkc2VsZi0+e2dldHN0YXRlc19pZH0gKSB7DQoJCSRzZWxmLT5wcm9jZXNzX2VudGl0eV9zdGF0 ZXMoICRkYXRhX29iaiApOw0KCSAgICB9DQoJICAgIHJldHVybjsNCgl9IGVsc2Ugew0KCSAgICAk c2VsZi0+ZXJyb3IoICJSZWNlaXZlZCBGQUlMVVJFIG9uIHJlcXVlc3QgJGRhdGFfb2JqLT57aWR9 OiAiIC4gJHNlbGYtPmR1bXAoICRkYXRhX29iaiApICk7DQoJfQ0KICAgIH0NCn0NCg0KPWl0ZW0g QzxwYXJzZV9kYXRhX3RvX29iaigpPg0KICAgIFRha2UgdGhlIGRhdGEgYW5kIHBhcnNlIGl0IHRv IHRoZSBNSCBvYmooKQ0KDQo9Y3V0DQoNCnN1YiBwYXJzZV9kYXRhX3RvX29iaiB7DQogICAgbXkg KCAkc2VsZiwgJGNtZCwgJHBfc2V0YnkgKSA9IEBfOw0KICAgIG15ICRoYW5kbGVkID0gMDsNCg0K ICAgICRzZWxmLT5kZWJ1ZyggMiwgIk1zZyBvYmplY3Q6ICIgLiAkc2VsZi0+ZHVtcCggJGNtZCAp ICk7DQoNCiAgICBteSAoJGNtZF9kb21haW4sJGNtZF9lbnRpdHkpID0gc3BsaXQoICdcLicsICRj bWQtPntlbnRpdHlfaWR9ICk7DQogICAgZm9yIG15ICRvYmogKCBAeyAkc2VsZi0+e29iamVjdHN9 IH0gKSB7DQoJaWYoICRvYmotPntlbnRpdHlfcHJlZml4ZXN9ICkgew0KCSAgICBmb3IgbXkgJHBy ZWZpeCAoQHskb2JqLT57ZW50aXR5X3ByZWZpeGVzfX0pIHsNCgkJaWYoICRwcmVmaXggZXEgc3Vi c3RyKCRjbWRfZW50aXR5LDAsbGVuZ3RoKCRwcmVmaXgpKSApIHsNCgkJICAgIG15ICRhdHRyX25h bWUgPSBzdWJzdHIoJGNtZF9lbnRpdHksbGVuZ3RoKCRwcmVmaXgpKTsNCgkJICAgICRvYmotPnth dHRyfS0+eyRhdHRyX25hbWV9ID0gJGNtZC0+e3N0YXRlfTsNCgkJICAgICRzZWxmLT5kZWJ1Zygg MSwgImhhbmRsZWQgZXZlbnQgZm9yICRvYmotPntvYmplY3RfbmFtZX0gLS0gYXR0ciAkYXR0cl9u YW1lIHNldCB0byAkY21kLT57c3RhdGV9IiApOw0KCQkgICAgIyAkb2JqLT5zZXQoICd0b2dnbGUn LCB1bmRlZiApOw0KCQkgICAgaWYoICRwX3NldGJ5IGVxICJoYXN2cl9pbml0IiApIHsNCgkJCSRv YmotPntoYV9pbml0fSA9IDE7DQoJCSAgICB9DQoJCSAgICAkaGFuZGxlZCA9IDE7DQoJCX0NCgkg ICAgfQ0KCX0gZWxzaWYoICRjbWQtPntlbnRpdHlfaWR9IGVxICRvYmotPntlbnRpdHlfaWR9ICkg ew0KCSAgICAkc2VsZi0+ZGVidWcoIDEsICJoYW5kbGVkIGV2ZW50IGZvciAkb2JqLT57b2JqZWN0 X25hbWV9IHNldCB0byAkY21kLT57c3RhdGV9IiApOw0KCSAgICAkb2JqLT5zZXQoICRjbWQsICRw X3NldGJ5ICk7DQoJICAgIGlmKCAkcF9zZXRieSBlcSAiaGFzdnJfaW5pdCIgKSB7DQoJCSRvYmot PntoYV9pbml0fSA9IDE7DQoJICAgIH0NCgkgICAgJGhhbmRsZWQgPSAxOw0KCX0NCiAgICB9DQog ICAgaWYoICEkaGFuZGxlZCApIHsNCgkkc2VsZi0+ZGVidWcoIDEsICJ1bmhhbmRsZWQgZXZlbnQg JGNtZC0+e2VudGl0eV9pZH0gKCRjbWQtPntzdGF0ZX0pIiApOw0KICAgIH0NCiAgICByZXR1cm4g JGhhbmRsZWQ7DQp9DQoNCj1pdGVtIEM8cHJvY2Vzc19lbnRpdHlfc3RhdGVzKCk+DQogICAgUHJv Y2VzcyBhbGwgZW50aXR5IHN0YXRlcyByZXNwb25zZSANCg0KPWN1dA0KDQpzdWIgcHJvY2Vzc19l bnRpdHlfc3RhdGVzIHsNCiAgICBteSAoICRzZWxmLCAkY21kICkgPSBAXzsNCg0KICAgICMgcHJp bnQgIkVudGl0eSBzdGF0ZXMgcmVzcG9uc2U6IFxuIiAuICRzZWxmLT5kdW1wKCAkY21kICk7DQog ICAgZm9yZWFjaCBteSAkc3RhdGVfb2JqIChAeyRjbWQtPntyZXN1bHR9fSkgew0KCWlmKCAhJHNl bGYtPnBhcnNlX2RhdGFfdG9fb2JqKCAkc3RhdGVfb2JqLCAiaGFzdnJfaW5pdCIgKSApIHsNCgkg ICAgcHVzaCBAeyAkJHNlbGZ7dW5oYW5kbGVkX2VudGl0aWVzfSB9LCAkc3RhdGVfb2JqLT57ZW50 aXR5X2lkfTsNCgl9DQogICAgfQ0KICAgICMgY2hlY2sgdGhhdCBhbGwgaGFfaXRlbSBvYmplY3Rz IGhhZCBhbiBpbml0aWFsIHN0YXRlDQogICAgZm9yIG15ICRvYmogKCBAeyAkc2VsZi0+e29iamVj dHN9IH0gKSB7DQoJaWYoICEkb2JqLT57aGFfaW5pdH0gKSB7DQoJICAgICRzZWxmLT5sb2coICJu byBIb21lQXNzaXN0YW50IGluaXRpYWwgc3RhdGUgZm9yIEhBX0l0ZW0gb2JqZWN0ICRvYmotPntv YmplY3RfbmFtZX0gZW50aXR5X2lkOiRvYmotPntlbnRpdHlfaWR9IiApOw0KCX0NCiAgICB9DQp9 DQoNCnN1YiBsaXN0X3VuaGFuZGxlZF9lbnRpdGllcyB7DQogICAgZm9yZWFjaCBteSAkaGFfc2Vy dmVyICggdmFsdWVzICVIQV9TZXJ2ZXJfTGlzdCApIHsNCglmb3IgbXkgJGVudGl0eV9pZCAoIEB7 ICRoYV9zZXJ2ZXItPnt1bmhhbmRsZWRfZW50aXRpZXN9IH0gKSB7DQoJICAgICRoYV9zZXJ2ZXIt PmxvZyggInVuaGFuZGxlZCBIb21lQXNzaXN0YW50IGVudGl0eTogJGhhX3NlcnZlci0+e25hbWV9 OiR7ZW50aXR5X2lkfSIgKTsNCgl9DQogICAgfQ0KfQ0KDQpzdWIgZGlzY29ubmVjdCB7DQogICAg bXkgKCRzZWxmKSA9IEBfOw0KDQogICAgaWYoICRzZWxmLT57d3NfY2xpZW50fSApIHsNCgkkc2Vs Zi0+e3dzX2NsaWVudH0tPmRpc2Nvbm5lY3QoKTsNCglkZWxldGUgJHNlbGYtPnt3c19jbGllbnR9 Ow0KICAgIH0NCiAgICBpZiggJHNlbGYtPntzb2NrZXRfaXRlbX0gICYmICAkc2VsZi0+e3NvY2tl dF9pdGVtfS0+YWN0aXZlKCkgKSB7DQoJJHNlbGYtPntzb2NrZXRfaXRlbX0tPnN0b3AoKTsNCiAg ICB9DQp9DQogDQo9aXRlbSBDPChhZGQpPg0KPWN1dA0KDQpzdWIgYWRkIHsNCiAgICBteSAoICRz ZWxmLCBAcF9vYmplY3RzICkgPSBAXzsNCg0KICAgIG15IEBsX29iamVjdHM7DQoNCiAgICBmb3Ig bXkgJGxfb2JqZWN0IChAcF9vYmplY3RzKSB7DQogICAgICAgIGlmICggJGxfb2JqZWN0LT5pc2Eo J0dyb3VwX0l0ZW0nKSApIHsNCiAgICAgICAgICAgIEBsX29iamVjdHMgPSAkJGxfb2JqZWN0e21l bWJlcnN9Ow0KICAgICAgICAgICAgZm9yIG15ICRvYmogKEBsX29iamVjdHMpIHsNCiAgICAgICAg ICAgICAgICAkc2VsZi0+YWRkKCRvYmopOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAg ICAgIGVsc2Ugew0KICAgICAgICAgICAgJHNlbGYtPmFkZF9pdGVtKCRsX29iamVjdCk7DQogICAg ICAgIH0NCiAgICB9DQp9DQoNCj1pdGVtIEM8KGFkZF9pdGVtKT4NCj1jdXQNCg0Kc3ViIGFkZF9p dGVtIHsNCiAgICBteSAoICRzZWxmLCAkcF9vYmplY3QgKSA9IEBfOw0KDQogICAgcHVzaCBAeyAk JHNlbGZ7b2JqZWN0c30gfSwgJHBfb2JqZWN0Ow0KDQogICAgcmV0dXJuICRwX29iamVjdDsNCn0N Cg0KPWl0ZW0gQzwocmVtb3ZlX2FsbF9pdGVtcyk+DQo9Y3V0DQoNCnN1YiByZW1vdmVfYWxsX2l0 ZW1zIHsNCiAgICBteSAoJHNlbGYpID0gQF87DQoNCiAgICAkc2VsZi0+bG9nKCJyZW1vdmVfYWxs X2l0ZW1zKCkiKTsNCiAgICBkZWxldGUgJHNlbGYtPntvYmplY3RzfTsNCn0NCg0KPWl0ZW0gQzwo YWRkX2l0ZW1faWZfbm90X3ByZXNlbnQpPg0KPWN1dA0KDQpzdWIgYWRkX2l0ZW1faWZfbm90X3By ZXNlbnQgew0KICAgIG15ICggJHNlbGYsICRwX29iamVjdCApID0gQF87DQoNCiAgICBpZiAoIHJl ZiAkJHNlbGZ7b2JqZWN0c30gKSB7DQogICAgICAgIGZvcmVhY2ggKCBAeyAkJHNlbGZ7b2JqZWN0 c30gfSApIHsNCiAgICAgICAgICAgIGlmICggJF8gZXEgJHBfb2JqZWN0ICkgew0KICAgICAgICAg ICAgICAgIHJldHVybiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgICRz ZWxmLT5hZGRfaXRlbSgkcF9vYmplY3QpOw0KICAgIHJldHVybiAxOw0KfQ0KDQo9aXRlbSBDPChy ZW1vdmVfaXRlbSk+DQo9Y3V0DQoNCnN1YiByZW1vdmVfaXRlbSB7DQogICAgbXkgKCAkc2VsZiwg JHBfb2JqZWN0ICkgPSBAXzsNCg0KICAgIGlmICggcmVmICQkc2VsZntvYmplY3RzfSApIHsNCiAg ICAgICAgZm9yICggbXkgJGkgPSAwOyAkaSA8IHNjYWxhciggQHsgJCRzZWxme29iamVjdHN9IH0g KTsgJGkrKyApIHsNCiAgICAgICAgICAgIGlmICggJCRzZWxme29iamVjdHN9LT5bJGldIGVxICRw X29iamVjdCApIHsNCiAgICAgICAgICAgICAgICBzcGxpY2UgQHsgJCRzZWxme29iamVjdHN9IH0s ICRpLCAxOw0KICAgICAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICAgICAgfQ0KICAgICAg ICB9DQogICAgfQ0KICAgIHJldHVybiAwOw0KfQ0KIyAtLS0tLS0tLS0tLS0tRW5kIG9mIEhBX1Nl cnZlci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0K DQpwYWNrYWdlIEhBX0l0ZW07DQoNCnVzZSB3YXJuaW5nczsNCg0KQEhBX0l0ZW06OklTQSA9ICgn R2VuZXJpY19JdGVtJyk7DQoNCnVzZSBKU09OIHF3KCBkZWNvZGVfanNvbiBlbmNvZGVfanNvbiAp OyAgIA0KDQp1c2UgRGF0YTo6RHVtcGVyOw0KDQpzdWIgbmV3IHsNCiAgICBteSAoJGNsYXNzLCAk ZG9tYWluLCAkZW50aXR5LCAkaGFfc2VydmVyICkgPSBAXzsNCiAgICBteSAkc2VsZiA9IG5ldyBH ZW5lcmljX0l0ZW0oKTsNCiAgICBibGVzcyAkc2VsZiwgJGNsYXNzOw0KDQogICAgaWYoICEkaGFf c2VydmVyICkgew0KCSRzZWxmLT5lcnJvciggIk5vIGhvbWVhc3Npc3RhbnQgc2VydmVyIHNldCIg KTsNCglyZXR1cm47DQogICAgfQ0KICAgICRzZWxmLT57aGFfc2VydmVyfSA9ICRoYV9zZXJ2ZXI7 DQogICAgJHNlbGYtPmRlYnVnKCAxLCAiTmV3IEhBX0l0ZW0gKCAkY2xhc3MsICRkb21haW4sICRl bnRpdHkgKSIgKTsNCiAgICBpZiggJGRvbWFpbiBlcSAnc3dpdGNoJyApIHsNCgkkc2VsZi0+c2V0 X3N0YXRlcyggIm9mZiIsICJvbiIgKTsNCiAgICB9IGVsc2lmKCAkZG9tYWluIGVxICdsaWdodCcg KSB7DQoJJHNlbGYtPnNldF9zdGF0ZXMoICJvZmYiLCAiMjAlIiwgIjQwJSIsICI1MCUiLCAiNjAl IiwgIjgwJSIsICJvbiIgKTsNCiAgICB9IGVsc2lmKCAkZG9tYWluIGVxICdjbGltYXRlJyApIHsN Cgkkc2VsZi0+e2F0dHJ9ID0ge307DQogICAgfSBlbHNpZiggJGRvbWFpbiBlcSAnc2Vuc29yJyAg fHwgICRkb21haW4gZXEgJ2JpbmFyeV9zZW5zb3InICkgew0KCSRzZWxmLT57YXR0cn0gPSB7fTsN CiAgICB9IGVsc2Ugew0KCSRzZWxmLT5lcnJvciggIkludmFsaWQgdHlwZSBmb3IgSEFfSXRlbSAt LSAnJGRvbWFpbiciICk7DQoJcmV0dXJuOw0KICAgIH0NCiAgICAkc2VsZi0+e2RvbWFpbn0gPSAk ZG9tYWluOw0KICAgIG15IEBwcmVmaXhlcyA9IHNwbGl0KCAnXHwnLCAkZW50aXR5ICk7DQogICAg aWYoICQjcHJlZml4ZXMgIHx8ICBzdWJzdHIoICRlbnRpdHksIGxlbmd0aCgkZW50aXR5KS0xLCAx ICkgZXEgJyonICkgew0KCWlmKCAkI3ByZWZpeGVzID09IDAgKSB7DQoJICAgIEBwcmVmaXhlcyA9 ICgkZW50aXR5KTsNCgl9DQoJZm9yIG15ICRwcmVmaXggKEBwcmVmaXhlcykgew0KCSAgICBpZigg c3Vic3RyKCAkcHJlZml4LCBsZW5ndGgoJHByZWZpeCktMSwgMSApIGVxICcqJyApIHsNCgkJJHBy ZWZpeCA9IHN1YnN0ciggJHByZWZpeCwgMCwgbGVuZ3RoKCRwcmVmaXgpLTEgKTsNCgkgICAgfQ0K CSAgICBwdXNoIEB7JHNlbGYtPntlbnRpdHlfcHJlZml4ZXN9fSwgJHByZWZpeDsNCgl9DQoJJHNl bGYtPmRlYnVnKCAxLCAiJHtkb21haW59LiR7ZW50aXR5fSBwcmVmaXhlczogIiAuIGpvaW4oICd8 JywgQHskc2VsZi0+e2VudGl0eV9wcmVmaXhlc319KSApOw0KICAgIH0NCg0KICAgICRzZWxmLT57 ZW50aXR5fSA9ICRlbnRpdHk7DQogICAgJHNlbGYtPntlbnRpdHlfaWR9ID0gIiR7ZG9tYWlufS4k e2VudGl0eX0iOw0KDQogICAgJHNlbGYtPntoYV9zZXJ2ZXJ9LT5hZGQoICRzZWxmICk7DQoNCiAg ICByZXR1cm4gJHNlbGY7DQp9DQoNCnN1YiBsb2cgew0KICAgIG15KCAkc2VsZiwgJHN0ciApID0g QF87DQogICAgJHNlbGYtPntoYV9zZXJ2ZXJ9LT5sb2coICRzdHIgKTsNCn0NCg0Kc3ViIGVycm9y IHsNCiAgICBteSggJHNlbGYsICRzdHIgKSA9IEBfOw0KICAgICRzZWxmLT57aGFfc2VydmVyfS0+ ZXJyb3IoICRzdHIgKTsNCn0NCg0Kc3ViIGRlYnVnIHsNCiAgICBteSggJHNlbGYsICRsZXZlbCwg JHN0ciApID0gQF87DQogICAgaWYoICRzZWxmLT5kZWJ1Z2xldmVsKCAkbGV2ZWwsICdoYXN2cicg KSApIHsNCgkkc2VsZi0+e2hhX3NlcnZlcn0tPmxvZyggJHN0ciwgIkhBU1ZSIEQkbGV2ZWw6ICIg KTsNCiAgICB9DQp9DQoNCnN1YiBkdW1wIHsNCiAgICBteSggJHNlbGYsICRvYmogKSA9IEBfOw0K ICAgICRvYmogPSAkb2JqIHx8ICRzZWxmOw0KICAgIG15ICRkdW1wZXIgPSBEYXRhOjpEdW1wZXIt Pm5ldyggWyRvYmpdICk7DQogICAgJGR1bXBlci0+TWF4ZGVwdGgoIDIgKTsNCiAgICByZXR1cm4g JGR1bXBlci0+RHVtcCgpOw0KfQ0KDQpzdWIgc2V0X29iamVjdF9kZWJ1ZyB7DQogICAgbXkoICRz ZWxmLCAkbGV2ZWwgKSA9IEBfOw0KICAgIG15ICRvYmpuYW1lID0gbGMgJHNlbGYtPmdldF9vYmpl Y3RfbmFtZSgpOw0KICAgICRsZXZlbCA9IDEgaWYgIWRlZmluZWQgJGxldmVsOw0KICAgICRtYWlu OjpEZWJ1Z3skb2JqbmFtZX0gPSAkbGV2ZWw7DQp9DQoNCnN1YiBzZXQgew0KICAgIG15ICggJHNl bGYsICRzZXR2YWwsICRwX3NldGJ5LCAkcF9yZXNwb25zZSApID0gQF87DQoNCiAgICAkc2VsZi0+ ZGVidWcoIDEsICIkc2VsZi0+e29iamVjdF9uYW1lfSBzZXQgYnkgJHBfc2V0YnkgdG86ICIuICRz ZWxmLT5kdW1wKCRzZXR2YWwpICk7DQogICAgaWYoICRwX3NldGJ5ID1+IC9oYXN2ciovICkgew0K CSMgVGhpcyBpcyBob21lIGFzc2lzdGFudCBzZW5kaW5nIGEgc3RhdGUgY2hhbmdlIHZpYSB3ZWJz b2NrZXQNCgkjIFRoaXMgc3RhdGUgY2hhbmdlIG1heSBvciBtYXkgbm90IGhhdmUgYmVlbiBpbml0 aWF0ZWQgYnkgdXMNCgkjIFRoaXMgaXMgc2VudCBhcyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRo ZSBqc29uIG5ld19zdGF0ZQ0KCW15ICRuZXdfc3RhdGUgPSAkc2V0dmFsOw0KCWlmKCAkc2VsZi0+ e2RvbWFpbn0gZXEgJ3N3aXRjaCcgKSB7DQoJICAgICRzZWxmLT5TVVBFUjo6c2V0KCAkbmV3X3N0 YXRlLT57c3RhdGV9LCAkcF9zZXRieSwgJHBfcmVzcG9uc2UgKTsNCgl9IGVsc2lmKCAkc2VsZi0+ e2RvbWFpbn0gZXEgJ2xpZ2h0JyApIHsNCgkgICAgbXkgJGxldmVsID0gJG5ld19zdGF0ZS0+e3N0 YXRlfTsNCgkgICAgaWYoICRuZXdfc3RhdGUtPntzdGF0ZX0gZXEgJ29uJyApew0KCQlpZiggJG5l d19zdGF0ZS0+e2F0dHJpYnV0ZXN9LT57YnJpZ2h0bmVzc30gKSB7DQoJCSAgICAkbGV2ZWwgPSAk bmV3X3N0YXRlLT57YXR0cmlidXRlc30tPnticmlnaHRuZXNzfSAqIDEwMCAvIDI1NTsNCgkJfQ0K CSAgICB9DQoJICAgICRzZWxmLT5TVVBFUjo6c2V0KCAkbGV2ZWwsICRwX3NldGJ5LCAkcF9yZXNw b25zZSApOw0KCX0gZWxzaWYoICRzZWxmLT57ZG9tYWlufSBlcSAnc2Vuc29yJyAgfHwgICRzZWxm LT57ZG9tYWlufSBlcSAnYmluYXJ5X3NlbnNvcicgKSB7DQoJICAgICRzZWxmLT5TVVBFUjo6c2V0 KCAkbmV3X3N0YXRlLT57c3RhdGV9LCAkcF9zZXRieSwgJHBfcmVzcG9uc2UgKTsNCgl9IGVsc2lm KCAkc2VsZi0+e2RvbWFpbn0gZXEgJ2NsaW1hdGUnICkgew0KCSAgICBmb3JlYWNoIG15ICRhdHRy bmFtZSAoa2V5cyAleyRuZXdfc3RhdGUtPnthdHRyaWJ1dGVzfX0gKSB7DQoJCSRzZWxmLT57YXR0 cn0tPnskYXR0cm5hbWV9ID0gJG5ld19zdGF0ZS0+e2F0dHJpYnV0ZXN9LT57JGF0dHJuYW1lfTsN CgkgICAgfQ0KCSAgICAkc2VsZi0+ZGVidWcoIDEsICJjbGltYXRlIGF0dHJpYnV0ZXMgc2V0OiAi IC4gJHNlbGYtPmR1bXAoJHNlbGYtPnthdHRyfSkgKTsNCgkgICAgJHNlbGYtPlNVUEVSOjpzZXQo ICRuZXdfc3RhdGUtPntzdGF0ZX0sICRwX3NldGJ5LCAkcF9yZXNwb25zZSApOw0KCX0NCiAgICB9 IGVsc2Ugew0KCW15ICRjbWQ7DQoJIyBJdGVtIGhhcyBiZWVuIHNldCBsb2NhbGx5IC0tIHVzZSBI QSBXZWJTb2NrZXQgdG8gY2hhbmdlIHN0YXRlDQoJaWYoICRzZWxmLT57ZG9tYWlufSBlcSAnbGln aHQnICB8fCAgJHNlbGYtPntkb21haW59IGVxICdzd2l0Y2gnICkgew0KCSAgICAkY21kID0gJHNl bGYtPmhhX3Jlc3Rfc2V0X2xpZ2h0KCAkc2V0dmFsICk7DQoJfSBlbHNpZiggJHNlbGYtPntkb21h aW59IGVxICdjbGltYXRlJyApIHsNCgkgICAgJGNtZCA9ICRzZWxmLT5oYV9yZXN0X3NldF90aGVy bSggJHNldHZhbCApOw0KCX0NCiAgICANCglpZiggISRjbWQgKSB7DQoJICAgICRzZWxmLT5lcnJv ciggImludmFsaWQgZG9tYWluIHR5cGUgaW4gc2V0IG1ldGhvZCAoJHNlbGYtPntkb21haW59IiAp Ow0KCX0gZWxzZSB7DQoJICAgICRzZWxmLT57aGFfc2VydmVyfS0+aGFfcHJvY2Vzc193cml0ZSgg JGNtZCApOw0KCX0NCiAgICB9DQp9DQoNCg0Kc3ViIGhhX3Jlc3Rfc2V0X2xpZ2h0IHsNCiAgICBt eSAoJHNlbGYsICRtb2RlKSA9IEBfOw0KICAgIG15ICRoYV9kYXRhID0ge307DQogICAgbXkgJGhh X3Jlc3RfY21kOw0KICAgIG15ICRoYV9kYXRhX3RleHQ7DQogICAgbXkgJGNtZDsNCg0KICAgICRo YV9kYXRhLT57aWR9ID0gKyskc2VsZi0+e2hhX3NlcnZlcn0tPntuZXh0X2lkfTsNCiAgICAkaGFf ZGF0YS0+e3R5cGV9ID0gJ2NhbGxfc2VydmljZSc7DQogICAgJGhhX2RhdGEtPntkb21haW59ID0g JHNlbGYtPntkb21haW59Ow0KICAgICRoYV9kYXRhLT57dGFyZ2V0fSA9IHt9Ow0KICAgICRoYV9k YXRhLT57dGFyZ2V0fS0+e2VudGl0eV9pZH0gPSAkc2VsZi0+e2VudGl0eV9pZH07DQogICAgbXkg KCRudW12YWwpID0gJG1vZGUgPX4gL14oWzEtOV0/WzAtOV0/WzAtOV0pJT8kLzsNCiAgICBpZigg JG51bXZhbCApIHsNCgkkaGFfZGF0YS0+e3NlcnZpY2V9ID0gJ3R1cm5fb24nOw0KCSRoYV9kYXRh LT57c2VydmljZV9kYXRhfSA9IHt9Ow0KCSRoYV9kYXRhLT57c2VydmljZV9kYXRhfS0+e2JyaWdo dG5lc3NfcGN0fSA9ICRudW12YWw7DQogICAgfSBlbHNpZiggJG1vZGUgZXEgJ29uJyApIHsNCgkk aGFfZGF0YS0+e3NlcnZpY2V9ID0gJ3R1cm5fb24nOw0KICAgIH0gZWxzaWYoICRtb2RlIGVxICd0 b2dnbGUnICkgew0KCSRoYV9kYXRhLT57c2VydmljZX0gPSAndG9nZ2xlJzsNCiAgICB9IGVsc2Ug ew0KCSRoYV9kYXRhLT57c2VydmljZX0gPSAndHVybl9vZmYnOw0KICAgIH0NCiAgICByZXR1cm4o ICRoYV9kYXRhICk7DQp9DQoNCnN1YiBoYV9yZXN0X3NldF90aGVybSB7DQogICAgbXkgKCRzZWxm LCAkc2V0dmFsKSA9IEBfOw0KICAgIG15ICRoYV9kYXRhID0ge307DQogICAgbXkgJGNtZDsNCg0K ICAgICMgdmFsaWQgc2VydmljZXMgYXJlOiAgdGVtcGVyYXR1cmUsIGZhbl9tb2RlLCBodmFjX21v ZGUsIGF1eF9oZWF0DQogICAgbXkgKCRzZXJ2aWNlLCR2YWx1ZSkgPSBzcGxpdCggJzonLCAkc2V0 dmFsICk7DQogICAgaWYoICFkZWZpbmVkICRzZXJ2aWNlIHx8ICFkZWZpbmVkICR2YWx1ZSApIHsN Cgkkc2VydmljZSA9ICRzZXR2YWw7DQogICAgfQ0KICAgIG15ICgkc2VydmljZV9uYW1lKSA9ICRz ZXJ2aWNlID1+IC9zZXRfKC4qKS87DQogICAgaWYoICRzZXJ2aWNlID1+IC9zZXRfLiovICAmJiAg IWRlZmluZWQgJHZhbHVlICkgew0KCSRzZWxmLT5lcnJvciggIkludmFsaWQgc2V0IHZhbHVlIGZv ciBvYmplY3QgJHNlbGYtPntvYmplY3RfbmFtZX0gLS0gZm9ybSA8c2VydmljZT46PHZhbHVlPiIg KTsNCglyZXR1cm47DQogICAgfQ0KICAgICRoYV9kYXRhLT57aWR9ID0gKyskc2VsZi0+e2hhX3Nl cnZlcn0tPntuZXh0X2lkfTsNCiAgICAkaGFfZGF0YS0+e3R5cGV9ID0gJ2NhbGxfc2VydmljZSc7 DQogICAgJGhhX2RhdGEtPntkb21haW59ID0gJHNlbGYtPntkb21haW59Ow0KICAgICRoYV9kYXRh LT57dGFyZ2V0fSA9IHt9Ow0KICAgICRoYV9kYXRhLT57dGFyZ2V0fS0+e2VudGl0eV9pZH0gPSAk c2VsZi0+e2VudGl0eV9pZH07DQogICAgJGhhX2RhdGEtPntzZXJ2aWNlX2RhdGF9ID0ge307DQog ICAgJGhhX2RhdGEtPntzZXJ2aWNlfSA9ICIke3NlcnZpY2V9IjsNCiAgICBpZiggZGVmaW5lZCAk dmFsdWUgKSB7DQoJJGhhX2RhdGEtPntzZXJ2aWNlX2RhdGF9LT57JHNlcnZpY2VfbmFtZX0gPSAk dmFsdWU7DQogICAgfQ0KICAgIHJldHVybiAkaGFfZGF0YTsNCn0NCg0KIyAtWyBGaW5pIC0gSEFf SXRlbSBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tDQoNCjE7DQo= --000000000000a2fe8f061480ecfa Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline --000000000000a2fe8f061480ecfa Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ________________________________________________________ To unsubscribe from this list, go to: https://lists.sourceforge.net/lists/listinfo/misterhouse-users --000000000000a2fe8f061480ecfa--