LyogaHR0cF9sb2FkIC0gbXVsdGlwcm9jZXNzaW5nIGh0dHAgdGVzdCBjbGllbnQKKioKKiogQ29weXJpZ2h0IKkgMTk5OCwxOTk5LDIwMDEgYnkgSmVmIFBvc2thbnplciA8amVmQG1haWwuYWNtZS5jb20+LgoqKiBBbGwgcmlnaHRzIHJlc2VydmVkLgoqKgoqKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCioqIGFyZSBtZXQ6CioqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CioqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKiogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKiogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQoqKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoqKgoqKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECioqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQoqKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQoqKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQoqKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAoqKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwoqKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKiogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKiogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQoqKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCioqIFNVQ0ggREFNQUdFLgoqLwoKI2luY2x1ZGUgInRzY29yZS9pbmtfY29uZmlnLmgiCgojaW5jbHVkZSA8c3lzL2Vwb2xsLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNpbmNsdWRlIDxuZXRkYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgoKI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CiNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CgojaW5jbHVkZSAicG9ydC5oIgojaW5jbHVkZSAidGltZXJzLmgiCgojaWYgZGVmaW5lZChBRl9JTkVUNikgJiYgZGVmaW5lZChJTjZfSVNfQUREUl9WNE1BUFBFRCkKI2RlZmluZSBVU0VfSVBWNgojZW5kaWYKCiNkZWZpbmUgbWF4KGEsIGIpICgoYSkgPj0gKGIpID8gKGEpIDogKGIpKQojZGVmaW5lIG1pbihhLCBiKSAoKGEpIDw9IChiKSA/IChhKSA6IChiKSkKCi8qIEhvdyBsb25nIGEgY29ubmVjdGlvbiBjYW4gc3RheSBpZGxlIGJlZm9yZSB3ZSBnaXZlIHVwIG9uIGl0LiAqLwojZGVmaW5lIElETEVfU0VDUyA2MAoKLyogRGVmYXVsdCBtYXggYnl0ZXMvc2Vjb25kIGluIHRocm90dGxlIG1vZGUuICovCiNkZWZpbmUgVEhST1RUTEUgMzM2MAoKLyogSG93IG9mdGVuIHRvIHNob3cgcHJvZ3Jlc3MgcmVwb3J0cy4gKi8KI2RlZmluZSBQUk9HUkVTU19TRUNTIDYwCgovKiBIb3cgbWFueSBmaWxlIGRlc2NyaXB0b3JzIHRvIG5vdCB1c2UuICovCiNkZWZpbmUgUkVTRVJWRURfRkRTIDMKCnR5cGVkZWYgc3RydWN0IHsKICBjaGFyICp1cmxfc3RyOwogIGludCBwcm90b2NvbDsKICBjaGFyICpob3N0bmFtZTsKICB1bnNpZ25lZCBzaG9ydCBwb3J0OwojaWZkZWYgVVNFX0lQVjYKICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHNhOwojZWxzZSAgLyogVVNFX0lQVjYgKi8KICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CiNlbmRpZiAvKiBVU0VfSVBWNiAqLwogIGludCBzYV9sZW4sIHNvY2tfZmFtaWx5LCBzb2NrX3R5cGUsIHNvY2tfcHJvdG9jb2w7CiAgY2hhciAqZmlsZW5hbWU7CiAgaW50IGdvdF9ieXRlczsKICBsb25nIGJ5dGVzOwogIGludCBnb3RfY2hlY2tzdW07CiAgbG9uZyBjaGVja3N1bTsKICBjaGFyICpidWY7CiAgaW50IGJ1Zl9ieXRlczsKICBpbnQgdW5pcXVlX2lkX29mZnNldDsKICBzdHJ1Y3QgewogICAgaW50IGNvbXBsZXRlZDsKICAgIGludCBtYXhfcmVzcG9uc2U7CiAgICBpbnQgbWluX3Jlc3BvbnNlOwogIH0gc3RhdHM7Cgp9IHVybDsKc3RhdGljIHVybCAqdXJsczsKc3RhdGljIGludCBudW1fdXJscywgbWF4X3VybHMsIGN1cl91cmw7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgY2hhciAqc3RyOwogIHN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKfSBzaXA7CnN0YXRpYyBzaXAgKnNpcHM7CnN0YXRpYyBpbnQgbnVtX3NpcHMsIG1heF9zaXBzOwoKLyogUHJvdG9jb2wgc3ltYm9scy4gKi8KI2RlZmluZSBQUk9UT19IVFRQIDAKI2RlZmluZSBQUk9UT19IVFRQUyAxCgovKiBDb25uZWN0aW9uIHN0YXRlcyAqLwp0eXBlZGVmIGVudW0gewogIENOU1RfRlJFRSA9IDAsCiAgQ05TVF9DT05ORUNUSU5HLAogIENOU1RfSEVBREVSUywKICBDTlNUX1JFQURJTkcsCiAgQ05TVF9QQVVTSU5HLAp9IGNvbm5lY3Rpb25fc3RhdGVzOwoKLyogU3RhdGVzIGZvciB0aGUgSGVhZGVyIFN0YXRlIE1hY2hpbmUgKi8KdHlwZWRlZiBlbnVtIHsKICAvKiBTTSBiYXNpYyBzdGF0ZXMgKi8KICBIRFNUX0xJTkUxX1BST1RPQ09MID0gMCwKICBIRFNUX0xJTkUxX1dTLAogIEhEU1RfTElORTFfU1RBVFVTLAogIEhEU1RfQk9MLAogIEhEU1RfVEVYVCwKICBIRFNUX0xGLAogIEhEU1RfQ1IsCiAgSERTVF9DUkxGLAogIEhEU1RfQ1JMRkNSLAogIC8qIFNNIHN0YXRlcyBmb3IgQ29udGVudC1MZW5ndGggaGVhZGVyICovCiAgSERTVF9DLAogIEhEU1RfQ08sCiAgSERTVF9DT04sCiAgSERTVF9DT05ULAogIEhEU1RfQ09OVEUsCiAgSERTVF9DT05URU4sCiAgSERTVF9DT05URU5ULAogIEhEU1RfQ09OVEVOVF8sCiAgSERTVF9DT05URU5UX0wsCiAgSERTVF9DT05URU5UX0xFLAogIEhEU1RfQ09OVEVOVF9MRU4sCiAgSERTVF9DT05URU5UX0xFTkcsCiAgSERTVF9DT05URU5UX0xFTkdULAogIEhEU1RfQ09OVEVOVF9MRU5HVEgsCiAgSERTVF9DT05URU5UX0xFTkdUSF9DT0xPTiwKICBIRFNUX0NPTlRFTlRfTEVOR1RIX0NPTE9OX1dTLAogIEhEU1RfQ09OVEVOVF9MRU5HVEhfQ09MT05fV1NfTlVNLAogIC8qIFNNIHN0YXRlcyBmb3IgQ29ubmVjdGlvbjogY2xvc2UgKi8KICBIRFNUX0NPTk4sCiAgSERTVF9DT05ORSwKICBIRFNUX0NPTk5FQywKICBIRFNUX0NPTk5FQ1QsCiAgSERTVF9DT05ORUNUSSwKICBIRFNUX0NPTk5FQ1RJTywKICBIRFNUX0NPTk5FQ1RJT04sCiAgSERTVF9DT05ORUNUSU9OX0NPTE9OLAogIEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XUywKICBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfQywKICBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfQ0wsCiAgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0NMTywKICBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfQ0xPUywKICBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfQ0xPU0UsCiAgLyogU00gc3RhdGVzIGZvciBDb25uZWN0aW9uOiBrZWVwLWFsaXZlICovCiAgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0ssCiAgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFLAogIEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XU19LRUUsCiAgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVAsCiAgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVBfLAogIEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XU19LRUVQX0EsCiAgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVBfQUwsCiAgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVBfQUxJLAogIEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XU19LRUVQX0FMSVYsCiAgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVBfQUxJVkUsCiAgLyogU00gc3RhdGVzIGZvciBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCAqLwogIEhEU1RfVCwKICBIRFNUX1RSLAogIEhEU1RfVFJBLAogIEhEU1RfVFJBTiwKICBIRFNUX1RSQU5TLAogIEhEU1RfVFJBTlNGLAogIEhEU1RfVFJBTlNGRSwKICBIRFNUX1RSQU5TRkVSLAogIEhEU1RfVFJBTlNGRVJfREFTSCwKICBIRFNUX1RSQU5TRkVSX0RBU0hfRSwKICBIRFNUX1RSQU5TRkVSX0RBU0hfRU4sCiAgSERTVF9UUkFOU0ZFUl9EQVNIX0VOQywKICBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DTywKICBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0QsCiAgSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESSwKICBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTiwKICBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkcsCiAgSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OLAogIEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRElOR19DT0xPTl9XUywKICBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkdfQ09MT05fV1NfQywKICBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkdfQ09MT05fV1NfQ0gsCiAgSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OX1dTX0NIVSwKICBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkdfQ09MT05fV1NfQ0hVTiwKICBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkdfQ09MT05fV1NfQ0hVTkssCiAgSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OX1dTX0NIVU5LRSwKICBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkdfQ09MT05fV1NfQ0hVTktFRAp9IGhlYWRlcl9zdGF0ZXM7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgaW50IHVybF9udW07CiAgc3RydWN0IHNvY2thZGRyX2luIHNhOwogIGludCBzYV9sZW47CiAgaW50IGNvbm5fZmQ7CiAgU1NMICpzc2w7CiAgY29ubmVjdGlvbl9zdGF0ZXMgY29ubl9zdGF0ZTsKICBoZWFkZXJfc3RhdGVzIGhlYWRlcl9zdGF0ZTsKICBpbnQgZGlkX2Nvbm5lY3QsIGRpZF9yZXNwb25zZTsKICBzdHJ1Y3QgdGltZXZhbCBzdGFydGVkX2F0OwogIHN0cnVjdCB0aW1ldmFsIGNvbm5lY3RfYXQ7CiAgc3RydWN0IHRpbWV2YWwgcmVxdWVzdF9hdDsKICBzdHJ1Y3QgdGltZXZhbCByZXNwb25zZV9hdDsKICBUaW1lciAqaWRsZV90aW1lcjsKICBUaW1lciAqd2FrZXVwX3RpbWVyOwogIGxvbmcgY29udGVudF9sZW5ndGg7CiAgbG9uZyBieXRlczsKICBsb25nIGNoZWNrc3VtOwogIGludCBodHRwX3N0YXR1czsKICBpbnQgcmV1c2FibGU7CiAgaW50IGtlZXBfYWxpdmU7CiAgaW50IGNodW5rZWQ7CiAgdW5zaWduZWQgaW50IHVuaXF1ZV9pZDsKICBzdHJ1Y3QgewogICAgaW50IGNvbm5lY3Rpb25zOwogICAgaW50IHJlcXVlc3RzOwogICAgaW50IHJlc3BvbnNlczsKICAgIGludCByZXF1ZXN0c19wZXJfY29ubmVjdGlvbjsKICB9IHN0YXRzOwp9IGNvbm5lY3Rpb247CgpzdGF0aWMgY29ubmVjdGlvbiAqY29ubmVjdGlvbnM7CnN0YXRpYyBpbnQgbWF4X2Nvbm5lY3Rpb25zLCBudW1fY29ubmVjdGlvbnMsIG1heF9wYXJhbGxlbCwgbnVtX2thX2Nvbm5zOwoKc3RhdGljIGludCBodHRwX3N0YXR1c19jb3VudHNbMTAwMF07IC8qIHJvb20gZm9yIGFsbCB0aHJlZS1kaWdpdCBzdGF0dXNlcyAqLwpzdGF0aWMgY2hhciAqYXJndjA7CnN0YXRpYyBpbnQgZG9fY2hlY2tzdW0sIGRvX3Rocm90dGxlLCBkb192ZXJib3NlLCBkb19qaXR0ZXIsIGRvX3Byb3h5OwpzdGF0aWMgaW50IGRvX2FjY2VwdF9nemlwLCBkb19zZXF1ZW50aWFsOwpzdGF0aWMgZmxvYXQgdGhyb3R0bGU7CnN0YXRpYyBpbnQgaWRsZV9zZWNzOwpzdGF0aWMgY2hhciAqcHJveHlfaG9zdG5hbWU7CnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm94eV9wb3J0OwpzdGF0aWMgY2hhciAqdXNlcl9hZ2VudDsKc3RhdGljIGNoYXIgKmNvb2tpZTsKc3RhdGljIGNoYXIgKmh0dHBfdmVyc2lvbjsKc3RhdGljIGludCBpc19odHRwXzFfMTsKc3RhdGljIGludCBpZ25vcmVfYnl0ZXM7CnN0YXRpYyBpbnQga2VlcF9hbGl2ZTsKc3RhdGljIGNoYXIgKmV4dHJhX2hlYWRlcnM7CnN0YXRpYyB1bnNpZ25lZCBpbnQgdW5pcXVlX2lkX2NvdW50ZXI7CnN0YXRpYyBpbnQgdW5pcXVlX2lkID0gMDsKc3RhdGljIGludCBzb2NrZXRfcG9vbDsKc3RhdGljIGludCBlcGZkOwpzdGF0aWMgaW50IG1heF9jb25uZWN0X2ZhaWx1cmVzID0gMDsKCnN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBzdGFydF9hdDsKc3RhdGljIGludCBmZXRjaGVzX3N0YXJ0ZWQsIGNvbm5lY3RzX2NvbXBsZXRlZCwgcmVzcG9uc2VzX2NvbXBsZXRlZCwgZmV0Y2hlc19jb21wbGV0ZWQ7CnN0YXRpYyBsb25nIGxvbmcgdG90YWxfYnl0ZXM7CnN0YXRpYyBsb25nIGxvbmcgdG90YWxfY29ubmVjdF91c2VjcywgbWF4X2Nvbm5lY3RfdXNlY3MsIG1pbl9jb25uZWN0X3VzZWNzOwpzdGF0aWMgbG9uZyBsb25nIHRvdGFsX3Jlc3BvbnNlX3VzZWNzLCBtYXhfcmVzcG9uc2VfdXNlY3MsIG1pbl9yZXNwb25zZV91c2VjczsKaW50IHRvdGFsX3RpbWVvdXRzLCB0b3RhbF9iYWRieXRlcywgdG90YWxfYmFkY2hlY2tzdW1zOwoKc3RhdGljIGxvbmcgc3RhcnRfaW50ZXJ2YWwsIGxvd19pbnRlcnZhbCwgaGlnaF9pbnRlcnZhbCwgcmFuZ2VfaW50ZXJ2YWw7CgpzdGF0aWMgU1NMX0NUWCAqc3NsX2N0eCA9IChTU0xfQ1RYICopMDsKc3RhdGljIGNoYXIgKmNpcGhlciAgICAgPSAoY2hhciAqKTA7CgovKiBGb3J3YXJkcy4gKi8Kc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCk7CnN0YXRpYyB2b2lkIHJlYWRfdXJsX2ZpbGUoY2hhciAqdXJsX2ZpbGUpOwpzdGF0aWMgdm9pZCBsb29rdXBfYWRkcmVzcyhpbnQgdXJsX251bSk7CnN0YXRpYyB2b2lkIHJlYWRfc2lwX2ZpbGUoY2hhciAqc2lwX2ZpbGUpOwpzdGF0aWMgdm9pZCBzdGFydF9jb25uZWN0aW9uKHN0cnVjdCB0aW1ldmFsICpub3dQKTsKc3RhdGljIHZvaWQgc3RhcnRfc29ja2V0KGludCB1cmxfbnVtLCBpbnQgY251bSwgc3RydWN0IHRpbWV2YWwgKm5vd1ApOwpzdGF0aWMgdm9pZCBoYW5kbGVfY29ubmVjdChpbnQgY251bSwgc3RydWN0IHRpbWV2YWwgKm5vd1AsIGludCBkb3VibGVfY2hlY2spOwpzdGF0aWMgdm9pZCBoYW5kbGVfcmVhZChpbnQgY251bSwgc3RydWN0IHRpbWV2YWwgKm5vd1ApOwpzdGF0aWMgdm9pZCBpZGxlX2Nvbm5lY3Rpb24oQ2xpZW50RGF0YSBjbGllbnRfZGF0YSwgc3RydWN0IHRpbWV2YWwgKm5vd1ApOwpzdGF0aWMgdm9pZCB3YWtldXBfY29ubmVjdGlvbihDbGllbnREYXRhIGNsaWVudF9kYXRhLCBzdHJ1Y3QgdGltZXZhbCAqbm93UCk7CnN0YXRpYyB2b2lkIGNsb3NlX2Nvbm5lY3Rpb24oaW50IGNudW0pOwpzdGF0aWMgdm9pZCBwcm9ncmVzc19yZXBvcnQoQ2xpZW50RGF0YSBjbGllbnRfZGF0YSwgc3RydWN0IHRpbWV2YWwgKm5vd1ApOwpzdGF0aWMgdm9pZCBzdGFydF90aW1lcihDbGllbnREYXRhIGNsaWVudF9kYXRhLCBzdHJ1Y3QgdGltZXZhbCAqbm93UCk7CnN0YXRpYyB2b2lkIGVuZF90aW1lcihDbGllbnREYXRhIGNsaWVudF9kYXRhLCBzdHJ1Y3QgdGltZXZhbCAqbm93UCk7CnN0YXRpYyB2b2lkIGZpbmlzaChzdHJ1Y3QgdGltZXZhbCAqbm93UCk7CnN0YXRpYyBsb25nIGxvbmcgZGVsdGFfdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqc3RhcnQsIHN0cnVjdCB0aW1ldmFsICpmaW5pc2gpOwpzdGF0aWMgdm9pZCAqbWFsbG9jX2NoZWNrKHNpemVfdCBzaXplKTsKc3RhdGljIHZvaWQgKnJlYWxsb2NfY2hlY2sodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CnN0YXRpYyBjaGFyICpzdHJkdXBfY2hlY2soY2hhciAqc3RyKTsKc3RhdGljIHZvaWQgY2hlY2sodm9pZCAqcHRyKTsKCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogIGludCBhcmduOwogIGludCBzdGFydDsKI2RlZmluZSBTVEFSVF9OT05FIDAKI2RlZmluZSBTVEFSVF9QQVJBTExFTCAxCiNkZWZpbmUgU1RBUlRfUkFURSAyCiAgaW50IHN0YXJ0X3BhcmFsbGVsID0gLTEsIHN0YXJ0X3JhdGUgPSAtMTsKICBpbnQgZW5kOwojZGVmaW5lIEVORF9OT05FIDAKI2RlZmluZSBFTkRfRkVUQ0hFUyAxCiNkZWZpbmUgRU5EX1NFQ09ORFMgMgogIGludCBlbmRfZmV0Y2hlcyA9IC0xLCBlbmRfc2Vjb25kcyA9IC0xOwogIGludCBjbnVtOwogIGNoYXIgKnVybF9maWxlOwogIGNoYXIgKnNpcF9maWxlOwojaWZkZWYgUkxJTUlUX05PRklMRQogIHN0cnVjdCBybGltaXQgbGltaXRzOwojZW5kaWYgLyogUkxJTUlUX05PRklMRSAqLwogIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnRzOwogIHN0cnVjdCB0aW1ldmFsIG5vdzsKICBpbnQgaSwgciwgcGVyaW9kaWNfdG1yOwoKICBtYXhfY29ubmVjdGlvbnMgPSA2NCAtIFJFU0VSVkVEX0ZEUzsgLyogYSBndWVzcyAqLwojaWZkZWYgUkxJTUlUX05PRklMRQogIC8qIFRyeSBhbmQgaW5jcmVhc2UgdGhlIGxpbWl0IG9uICMgb2YgZmlsZXMgdG8gdGhlIG1heGltdW0uICovCiAgaWYgKGdldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmbGltaXRzKSA9PSAwKSB7CiAgICBpZiAobGltaXRzLnJsaW1fY3VyICE9IGxpbWl0cy5ybGltX21heCkgewogICAgICBpZiAobGltaXRzLnJsaW1fbWF4ID09IFJMSU1fSU5GSU5JVFkpCiAgICAgICAgbGltaXRzLnJsaW1fY3VyID0gODE5MjsgLyogYXJiaXRyYXJ5ICovCiAgICAgIGVsc2UgaWYgKGxpbWl0cy5ybGltX21heCA+IGxpbWl0cy5ybGltX2N1cikKICAgICAgICBsaW1pdHMucmxpbV9jdXIgPSBsaW1pdHMucmxpbV9tYXg7CiAgICAgICh2b2lkKXNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmbGltaXRzKTsKICAgIH0KICAgIG1heF9jb25uZWN0aW9ucyA9IGxpbWl0cy5ybGltX2N1ciAtIFJFU0VSVkVEX0ZEUzsKICB9CiNlbmRpZiAvKiBSTElNSVRfTk9GSUxFICovCgogIC8qIFBhcnNlIGFyZ3MuICovCiAgYXJndjAgICAgICAgPSBhcmd2WzBdOwogIGFyZ24gICAgICAgID0gMTsKICBkb19jaGVja3N1bSA9IGRvX3Rocm90dGxlID0gZG9fdmVyYm9zZSA9IGRvX2ppdHRlciA9IGRvX3Byb3h5ID0gMDsKICBkb19hY2NlcHRfZ3ppcCA9IGRvX3NlcXVlbnRpYWwgPSAwOwogIHRocm90dGxlICAgICAgICAgICAgICAgICAgICAgICA9IFRIUk9UVExFOwogIHNpcF9maWxlICAgICAgICAgICAgICAgICAgICAgICA9IChjaGFyICopMDsKICB1c2VyX2FnZW50ICAgICAgICAgICAgICAgICAgICAgPSBWRVJTSU9OOwogIGNvb2tpZSAgICAgICAgICAgICAgICAgICAgICAgICA9IE5VTEw7CiAgaHR0cF92ZXJzaW9uICAgICAgICAgICAgICAgICAgID0gIjEuMSI7CiAgaXNfaHR0cF8xXzEgICAgICAgICAgICAgICAgICAgID0gMTsKICBpZGxlX3NlY3MgICAgICAgICAgICAgICAgICAgICAgPSBJRExFX1NFQ1M7CiAgc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgID0gU1RBUlRfTk9ORTsKICBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFTkRfTk9ORTsKICBrZWVwX2FsaXZlICAgICAgICAgICAgICAgICAgICAgPSAwOwogIHNvY2tldF9wb29sICAgICAgICAgICAgICAgICAgICA9IDA7CiAgZXh0cmFfaGVhZGVycyAgICAgICAgICAgICAgICAgID0gTlVMTDsKICB3aGlsZSAoYXJnbiA8IGFyZ2MgJiYgYXJndlthcmduXVswXSA9PSAnLScgJiYgYXJndlthcmduXVsxXSAhPSAnXDAnKSB7CiAgICBpZiAoc3RybmNtcChhcmd2W2FyZ25dLCAiLWNoZWNrc3VtIiwgc3RybGVuKGFyZ3ZbYXJnbl0pKSA9PSAwKQogICAgICBkb19jaGVja3N1bSA9IDE7CiAgICBlbHNlIGlmIChzdHJuY21wKGFyZ3ZbYXJnbl0sICItc2VxdWVudGlhbCIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCkKICAgICAgZG9fc2VxdWVudGlhbCA9IDE7CiAgICBlbHNlIGlmIChzdHJuY21wKGFyZ3ZbYXJnbl0sICItdGhyb3R0bGUiLCBzdHJsZW4oYXJndlthcmduXSkpID09IDApCiAgICAgIGRvX3Rocm90dGxlID0gMTsKICAgIGVsc2UgaWYgKHN0cm5jbXAoYXJndlthcmduXSwgIi1UaHJvdHRsZSIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCAmJiBhcmduICsgMSA8IGFyZ2MpIHsKICAgICAgZG9fdGhyb3R0bGUgPSAxOwogICAgICB0aHJvdHRsZSAgICA9IGF0b2koYXJndlsrK2FyZ25dKSAvIDEwLjA7CiAgICB9IGVsc2UgaWYgKHN0cm5jbXAoYXJndlthcmduXSwgIi12ZXJib3NlIiwgc3RybGVuKGFyZ3ZbYXJnbl0pKSA9PSAwKQogICAgICBkb192ZXJib3NlID0gMTsKICAgIGVsc2UgaWYgKHN0cm5jbXAoYXJndlthcmduXSwgIi10aW1lb3V0Iiwgc3RybGVuKGFyZ3ZbYXJnbl0pKSA9PSAwICYmIGFyZ24gKyAxIDwgYXJnYykKICAgICAgaWRsZV9zZWNzID0gYXRvaShhcmd2WysrYXJnbl0pOwogICAgZWxzZSBpZiAoc3RybmNtcChhcmd2W2FyZ25dLCAiLWppdHRlciIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCkKICAgICAgZG9faml0dGVyID0gMTsKICAgIGVsc2UgaWYgKHN0cm5jbXAoYXJndlthcmduXSwgIi1hY2NlcHRfZ3ppcCIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCkKICAgICAgZG9fYWNjZXB0X2d6aXAgPSAxOwogICAgZWxzZSBpZiAoc3RybmNtcChhcmd2W2FyZ25dLCAiLXBhcmFsbGVsIiwgc3RybGVuKGFyZ3ZbYXJnbl0pKSA9PSAwICYmIGFyZ24gKyAxIDwgYXJnYykgewogICAgICBzdGFydCAgICAgICAgICA9IFNUQVJUX1BBUkFMTEVMOwogICAgICBzdGFydF9wYXJhbGxlbCA9IGF0b2koYXJndlsrK2FyZ25dKTsKICAgICAgaWYgKHN0YXJ0X3BhcmFsbGVsIDwgMSkgewogICAgICAgICh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6IHBhcmFsbGVsIG11c3QgYmUgYXQgbGVhc3QgMVxuIiwgYXJndjApOwogICAgICAgIGV4aXQoMSk7CiAgICAgIH0KICAgICAgaWYgKHN0YXJ0X3BhcmFsbGVsID4gbWF4X2Nvbm5lY3Rpb25zKSB7CiAgICAgICAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogcGFyYWxsZWwgbWF5IGJlIGF0IG1vc3QgJWRcbiIsIGFyZ3YwLCBtYXhfY29ubmVjdGlvbnMpOwogICAgICAgIGV4aXQoMSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RybmNtcChhcmd2W2FyZ25dLCAiLXJhdGUiLCBzdHJsZW4oYXJndlthcmduXSkpID09IDAgJiYgYXJnbiArIDEgPCBhcmdjKSB7CiAgICAgIHN0YXJ0ICAgICAgPSBTVEFSVF9SQVRFOwogICAgICBzdGFydF9yYXRlID0gYXRvaShhcmd2WysrYXJnbl0pOwogICAgICBpZiAoc3RhcnRfcmF0ZSA8IDEpIHsKICAgICAgICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiByYXRlIG11c3QgYmUgYXQgbGVhc3QgMVxuIiwgYXJndjApOwogICAgICAgIGV4aXQoMSk7CiAgICAgIH0KICAgICAgaWYgKHN0YXJ0X3JhdGUgPiAxMDAwKSB7CiAgICAgICAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogcmF0ZSBtYXkgYmUgYXQgbW9zdCAxMDAwXG4iLCBhcmd2MCk7CiAgICAgICAgZXhpdCgxKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJuY21wKGFyZ3ZbYXJnbl0sICItc29ja2V0cyIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCAmJiBhcmduICsgMSA8IGFyZ2MpIHsKICAgICAgc29ja2V0X3Bvb2wgPSBhdG9pKGFyZ3ZbKythcmduXSkgLSAxOwogICAgICBpZiAoc29ja2V0X3Bvb2wgPCAwKSB7CiAgICAgICAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogc29ja2V0cyBtdXN0IGJlIGF0IGxlYXN0IDFcbiIsIGFyZ3YwKTsKICAgICAgICBleGl0KDEpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHN0cm5jbXAoYXJndlthcmduXSwgIi1mZXRjaGVzIiwgc3RybGVuKGFyZ3ZbYXJnbl0pKSA9PSAwICYmIGFyZ24gKyAxIDwgYXJnYykgewogICAgICBlbmQgICAgICAgICA9IEVORF9GRVRDSEVTOwogICAgICBlbmRfZmV0Y2hlcyA9IGF0b2koYXJndlsrK2FyZ25dKTsKICAgICAgaWYgKGVuZF9mZXRjaGVzIDwgMSkgewogICAgICAgICh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6IGZldGNoZXMgbXVzdCBiZSBhdCBsZWFzdCAxXG4iLCBhcmd2MCk7CiAgICAgICAgZXhpdCgxKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJuY21wKGFyZ3ZbYXJnbl0sICItc2Vjb25kcyIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCAmJiBhcmduICsgMSA8IGFyZ2MpIHsKICAgICAgZW5kICAgICAgICAgPSBFTkRfU0VDT05EUzsKICAgICAgZW5kX3NlY29uZHMgPSBhdG9pKGFyZ3ZbKythcmduXSk7CiAgICAgIGlmIChlbmRfc2Vjb25kcyA8IDEpIHsKICAgICAgICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBzZWNvbmRzIG11c3QgYmUgYXQgbGVhc3QgMVxuIiwgYXJndjApOwogICAgICAgIGV4aXQoMSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RybmNtcChhcmd2W2FyZ25dLCAiLWtlZXBfYWxpdmUiLCBzdHJsZW4oYXJndlthcmduXSkpID09IDAgJiYgYXJnbiArIDEgPCBhcmdjKSB7CiAgICAgIGtlZXBfYWxpdmUgPSBhdG9pKGFyZ3ZbKythcmduXSk7CiAgICAgIGlmIChrZWVwX2FsaXZlIDwgMSkgewogICAgICAgICh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6IGtlZXBfYWxpdmUgbXVzdCBiZSBhdCBsZWFzdCAxXG4iLCBhcmd2MCk7CiAgICAgICAgZXhpdCgxKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJuY21wKGFyZ3ZbYXJnbl0sICItdW5pcXVlX2lkIiwgc3RybGVuKGFyZ3ZbYXJnbl0pKSA9PSAwKSB7CiAgICAgIHVuaXF1ZV9pZCA9IDE7CiAgICB9IGVsc2UgaWYgKHN0cm5jbXAoYXJndlthcmduXSwgIi1zaXAiLCBzdHJsZW4oYXJndlthcmduXSkpID09IDAgJiYgYXJnbiArIDEgPCBhcmdjKQogICAgICBzaXBfZmlsZSA9IGFyZ3ZbKythcmduXTsKICAgIGVsc2UgaWYgKHN0cm5jbXAoYXJndlthcmduXSwgIi1hZ2VudCIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCAmJiBhcmduICsgMSA8IGFyZ2MpCiAgICAgIHVzZXJfYWdlbnQgPSBhcmd2WysrYXJnbl07CiAgICBlbHNlIGlmIChzdHJuY21wKGFyZ3ZbYXJnbl0sICItY29va2llIiwgc3RybGVuKGFyZ3ZbYXJnbl0pKSA9PSAwICYmIGFyZ24gKyAxIDwgYXJnYykKICAgICAgY29va2llID0gYXJndlsrK2FyZ25dOwogICAgZWxzZSBpZiAoc3RybmNtcChhcmd2W2FyZ25dLCAiLWlnbm9yZV9ieXRlcyIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCkKICAgICAgaWdub3JlX2J5dGVzID0gMTsKICAgIGVsc2UgaWYgKHN0cm5jbXAoYXJndlthcmduXSwgIi1tYXhfY29ubmVjdF9mYWlsdXJlcyIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCkgewogICAgICBtYXhfY29ubmVjdF9mYWlsdXJlcyA9IGF0b2koYXJndlsrK2FyZ25dKTsKICAgICAgaWYgKG1heF9jb25uZWN0X2ZhaWx1cmVzIDwgMSkgewogICAgICAgICh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6IG1heF9jb25uZWN0aW9uIGZhaWx1cmVzIHNob3VsZCBiZSAxIG9yIGhpZ2hlclxuIiwgYXJndjApOwogICAgICAgIGV4aXQoMSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RybmNtcChhcmd2W2FyZ25dLCAiLWhlYWRlciIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCAmJiBhcmduICsgMSA8IGFyZ2MpIHsKICAgICAgaWYgKGV4dHJhX2hlYWRlcnMpIHsKICAgICAgICBzdHJjYXQoZXh0cmFfaGVhZGVycywgIlxyXG4iKTsKICAgICAgICBzdHJjYXQoZXh0cmFfaGVhZGVycywgYXJndlsrK2FyZ25dKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBleHRyYV9oZWFkZXJzID0gbWFsbG9jX2NoZWNrKDY1NTM2KTsKICAgICAgICBzdHJuY3B5KGV4dHJhX2hlYWRlcnMsIGFyZ3ZbKythcmduXSwgNjU1MzYgLSAxKTsKICAgICAgICBleHRyYV9oZWFkZXJzWzY1NTM2XSA9ICdcMCc7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RybmNtcChhcmd2W2FyZ25dLCAiLWh0dHBfdmVyc2lvbiIsIHN0cmxlbihhcmd2W2FyZ25dKSkgPT0gMCAmJiBhcmduICsgMSA8IGFyZ2MpIHsKICAgICAgaHR0cF92ZXJzaW9uID0gYXJndlsrK2FyZ25dOwogICAgICBpc19odHRwXzFfMSAgPSAoc3RyY21wKGh0dHBfdmVyc2lvbiwgIjEuMSIpID09IDApOwogICAgfSBlbHNlIGlmIChzdHJuY21wKGFyZ3ZbYXJnbl0sICItY2lwaGVyIiwgc3RybGVuKGFyZ3ZbYXJnbl0pKSA9PSAwICYmIGFyZ24gKyAxIDwgYXJnYykgewogICAgICBjaXBoZXIgPSBhcmd2WysrYXJnbl07CiAgICAgIGlmIChzdHJjYXNlY21wKGNpcGhlciwgImZhc3RzZWMiKSA9PSAwKQogICAgICAgIGNpcGhlciA9ICJSQzQtTUQ1IjsKICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcChjaXBoZXIsICJoaWdoc2VjIikgPT0gMCkKICAgICAgICBjaXBoZXIgPSAiREVTLUNCQzMtU0hBIjsKICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcChjaXBoZXIsICJwYXJhbm9pZCIpID09IDApCiAgICAgICAgY2lwaGVyID0gIkFFUzI1Ni1TSEEiOwogICAgfSBlbHNlIGlmIChzdHJuY21wKGFyZ3ZbYXJnbl0sICItcHJveHkiLCBzdHJsZW4oYXJndlthcmduXSkpID09IDAgJiYgYXJnbiArIDEgPCBhcmdjKSB7CiAgICAgIGNoYXIgKmNvbG9uOwogICAgICBkb19wcm94eSAgICAgICA9IDE7CiAgICAgIHByb3h5X2hvc3RuYW1lID0gYXJndlsrK2FyZ25dOwogICAgICBjb2xvbiAgICAgICAgICA9IHN0cmNocihwcm94eV9ob3N0bmFtZSwgJzonKTsKICAgICAgaWYgKGNvbG9uID09IChjaGFyICopMCkKICAgICAgICBwcm94eV9wb3J0ID0gODA7CiAgICAgIGVsc2UgewogICAgICAgIHByb3h5X3BvcnQgPSAodW5zaWduZWQgc2hvcnQpYXRvaShjb2xvbiArIDEpOwogICAgICAgICpjb2xvbiAgICAgPSAnXDAnOwogICAgICB9CiAgICB9IGVsc2UKICAgICAgdXNhZ2UoKTsKICAgICsrYXJnbjsKICB9CiAgaWYgKGFyZ24gKyAxICE9IGFyZ2MpCiAgICB1c2FnZSgpOwogIGlmIChzdGFydCA9PSBTVEFSVF9OT05FIHx8IGVuZCA9PSBFTkRfTk9ORSkKICAgIHVzYWdlKCk7CiAgaWYgKGRvX2ppdHRlciAmJiBzdGFydCAhPSBTVEFSVF9SQVRFKQogICAgdXNhZ2UoKTsKICB1cmxfZmlsZSA9IGFyZ3ZbYXJnbl07CgogIC8qIFJlYWQgaW4gYW5kIHBhcnNlIHRoZSBVUkxzLiAqLwogIHJlYWRfdXJsX2ZpbGUodXJsX2ZpbGUpOwoKICAvKiBSZWFkIGluIHRoZSBzb3VyY2UgSVAgZmlsZSwgaWYgc3BlY2lmaWVkLiAqLwogIGlmIChzaXBfZmlsZSAhPSAoY2hhciAqKTApCiAgICByZWFkX3NpcF9maWxlKHNpcF9maWxlKTsKCiAgLyogSW5pdGlhbGl6ZSB0aGUgY29ubmVjdGlvbnMgdGFibGUuICovCiAgaWYgKHN0YXJ0ID09IFNUQVJUX1BBUkFMTEVMKQogICAgbWF4X2Nvbm5lY3Rpb25zID0gc3RhcnRfcGFyYWxsZWw7CiAgY29ubmVjdGlvbnMgPSAoY29ubmVjdGlvbiAqKW1hbGxvY19jaGVjayhtYXhfY29ubmVjdGlvbnMgKiBzaXplb2YoY29ubmVjdGlvbikpOwogIGZvciAoY251bSA9IDA7IGNudW0gPCBtYXhfY29ubmVjdGlvbnM7ICsrY251bSkgewogICAgY29ubmVjdGlvbnNbY251bV0uY29ubl9zdGF0ZSAgICAgICAgPSBDTlNUX0ZSRUU7CiAgICBjb25uZWN0aW9uc1tjbnVtXS5yZXVzYWJsZSAgICAgICAgICA9IDA7CiAgICBjb25uZWN0aW9uc1tjbnVtXS5zdGF0cy5yZXF1ZXN0cyAgICA9IDA7CiAgICBjb25uZWN0aW9uc1tjbnVtXS5zdGF0cy5yZXNwb25zZXMgICA9IDA7CiAgICBjb25uZWN0aW9uc1tjbnVtXS5zdGF0cy5jb25uZWN0aW9ucyA9IDA7CiAgfQogIG51bV9jb25uZWN0aW9ucyA9IG1heF9wYXJhbGxlbCA9IG51bV9rYV9jb25ucyA9IDA7CgogIC8qIEluaXRpYWxpemUgdGhlIEhUVFAgc3RhdHVzLWNvZGUgaGlzdG9ncmFtLiAqLwogIGZvciAoaSA9IDA7IGkgPCAxMDAwOyArK2kpCiAgICBodHRwX3N0YXR1c19jb3VudHNbaV0gPSAwOwoKICAvKiBJbml0aWFsaXplIHRoZSBzdGF0aXN0aWNzLiAqLwogIGZldGNoZXNfc3RhcnRlZCAgICAgID0gMDsKICBjb25uZWN0c19jb21wbGV0ZWQgICA9IDA7CiAgcmVzcG9uc2VzX2NvbXBsZXRlZCAgPSAwOwogIGZldGNoZXNfY29tcGxldGVkICAgID0gMDsKICB0b3RhbF9ieXRlcyAgICAgICAgICA9IDA7CiAgdG90YWxfY29ubmVjdF91c2VjcyAgPSAwOwogIG1heF9jb25uZWN0X3VzZWNzICAgID0gMDsKICBtaW5fY29ubmVjdF91c2VjcyAgICA9IDEwMDAwMDAwMDBMOwogIHRvdGFsX3Jlc3BvbnNlX3VzZWNzID0gMDsKICBtYXhfcmVzcG9uc2VfdXNlY3MgICA9IDA7CiAgbWluX3Jlc3BvbnNlX3VzZWNzICAgPSAxMDAwMDAwMDAwTDsKICB0b3RhbF90aW1lb3V0cyAgICAgICA9IDA7CiAgdG90YWxfYmFkYnl0ZXMgICAgICAgPSAwOwogIHRvdGFsX2JhZGNoZWNrc3VtcyAgID0gMDsKCiAgLyogSW5pdGlhbGl6ZSBlcG9sbCgpIGFuZCBrcXVldWUoKSBldGMuICovCiAgZXBmZCA9IGVwb2xsX2NyZWF0ZShtYXhfY29ubmVjdGlvbnMpOwogIGlmIChlcGZkID09IC0xKSB7CiAgICBwZXJyb3IoImVwb2xsX2NyZWF0ZSIpOwogICAgZXhpdCgxKTsKICB9CiAgZXZlbnRzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXBvbGxfZXZlbnQpICogbWF4X2Nvbm5lY3Rpb25zKTsKCi8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAqLwojaWZkZWYgSEFWRV9TUkFORE9NREVWCiAgc3JhbmRvbWRldigpOwojZWxzZQogIHNyYW5kb20oKGludCl0aW1lKCh0aW1lX3QgKikwKSBeIGdldHBpZCgpKTsKI2VuZGlmCgogIC8qIEluaXRpYWxpemUgdGhlIHJlc3QuICovCiAgdG1yX2luaXQoKTsKICAodm9pZClnZXR0aW1lb2ZkYXkoJm5vdywgKHN0cnVjdCB0aW1lem9uZSAqKTApOwogIHN0YXJ0X2F0ID0gbm93OwogIGlmIChkb192ZXJib3NlKQogICAgKHZvaWQpdG1yX2NyZWF0ZSgmbm93LCBwcm9ncmVzc19yZXBvcnQsIEp1bmtDbGllbnREYXRhLCBQUk9HUkVTU19TRUNTICogMTAwMEwsIDEpOwogIGlmIChzdGFydCA9PSBTVEFSVF9SQVRFKSB7CiAgICBzdGFydF9pbnRlcnZhbCA9IDEwMDBMIC8gc3RhcnRfcmF0ZTsKICAgIGlmIChkb19qaXR0ZXIpIHsKICAgICAgbG93X2ludGVydmFsICAgPSBzdGFydF9pbnRlcnZhbCAqIDkgLyAxMDsKICAgICAgaGlnaF9pbnRlcnZhbCAgPSBzdGFydF9pbnRlcnZhbCAqIDExIC8gMTA7CiAgICAgIHJhbmdlX2ludGVydmFsID0gaGlnaF9pbnRlcnZhbCAtIGxvd19pbnRlcnZhbCArIDE7CiAgICB9CiAgICAodm9pZCl0bXJfY3JlYXRlKCZub3csIHN0YXJ0X3RpbWVyLCBKdW5rQ2xpZW50RGF0YSwgc3RhcnRfaW50ZXJ2YWwsICFkb19qaXR0ZXIpOwogIH0KICBpZiAoZW5kID09IEVORF9TRUNPTkRTKQogICAgKHZvaWQpdG1yX2NyZWF0ZSgmbm93LCBlbmRfdGltZXIsIEp1bmtDbGllbnREYXRhLCBlbmRfc2Vjb25kcyAqIDEwMDBMLCAwKTsKICAodm9pZClzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CgogIC8qIE1haW4gbG9vcC4gKi8KICBmb3IgKDs7KSB7CiAgICBpZiAoZW5kID09IEVORF9GRVRDSEVTICYmIGZldGNoZXNfY29tcGxldGVkID49IGVuZF9mZXRjaGVzKQogICAgICBmaW5pc2goJm5vdyk7CgogICAgaWYgKHN0YXJ0ID09IFNUQVJUX1BBUkFMTEVMKSB7CiAgICAgIC8qIFNlZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IGFueSBuZXcgY29ubmVjdGlvbnM7IGJ1dCBhdCBtb3N0IDEwLiAqLwogICAgICBmb3IgKGkgPSAwOyBpIDwgMTAgJiYgbnVtX2Nvbm5lY3Rpb25zIDwgc3RhcnRfcGFyYWxsZWwgJiYgKGVuZCAhPSBFTkRfRkVUQ0hFUyB8fCBmZXRjaGVzX3N0YXJ0ZWQgPCBlbmRfZmV0Y2hlcyk7ICsraSkgewogICAgICAgIHN0YXJ0X2Nvbm5lY3Rpb24oJm5vdyk7CiAgICAgICAgKHZvaWQpZ2V0dGltZW9mZGF5KCZub3csIChzdHJ1Y3QgdGltZXpvbmUgKikwKTsKICAgICAgICB0bXJfcnVuKCZub3cpOwogICAgICB9CiAgICB9CgogICAgciA9IGVwb2xsX3dhaXQoZXBmZCwgZXZlbnRzLCBtYXhfY29ubmVjdGlvbnMsIHRtcl9tc3RpbWVvdXQoJm5vdykpOwojaWZkZWYgREVCVUcKICAgIGZwcmludGYoc3RkZXJyLCAiZXBvbGxfd2FpdCgpIGdvdCAlZCBldmVudHNcbiIsIHIpOwojZW5kaWYKICAgIGlmIChyIDwgMCkgewogICAgICBwZXJyb3IoImVwb2xsX3dhaXQiKTsKICAgICAgZXhpdCgxKTsKICAgIH0KICAgICh2b2lkKWdldHRpbWVvZmRheSgmbm93LCAoc3RydWN0IHRpbWV6b25lICopMCk7CgogICAgLyogU2VydmljZSB0aGVtLiAqLwogICAgcGVyaW9kaWNfdG1yID0gNTA7CiAgICB3aGlsZSAoci0tID4gMCkgewogICAgICBpZiAoLS1wZXJpb2RpY190bXIgPT0gMCkgewogICAgICAgIHBlcmlvZGljX3RtciA9IDUwOwogICAgICAgIHRtcl9ydW4oJm5vdyk7CiAgICAgIH0KICAgICAgY251bSA9IGV2ZW50c1tyXS5kYXRhLnUzMjsKI2lmZGVmIERFQlVHCiAgICAgIGZwcmludGYoc3RkZXJyLCAicHJvY2Vzc2luZyBldmVudCAlZCAoJWQpLCBmb3IgQ05VTSAlZFxuIiwgciArIDEsIGV2ZW50c1tyXS5ldmVudHMsIGNudW0pOwojZW5kaWYKICAgICAgc3dpdGNoIChjb25uZWN0aW9uc1tjbnVtXS5jb25uX3N0YXRlKSB7CiAgICAgIGNhc2UgQ05TVF9DT05ORUNUSU5HOgogICAgICAgIGhhbmRsZV9jb25uZWN0KGNudW0sICZub3csIDEpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENOU1RfSEVBREVSUzoKICAgICAgY2FzZSBDTlNUX1JFQURJTkc6CiAgICAgICAgaGFuZGxlX3JlYWQoY251bSwgJm5vdyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgLyogTm90aGluZyAqLwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICAvKiBBbmQgcnVuIHRoZSB0aW1lcnMuICovCiAgICB0bXJfcnVuKCZub3cpOwogIH0KCiAgLyogTk9UX1JFQUNIRUQgKi8KfQoKc3RhdGljIHZvaWQKdXNhZ2Uodm9pZCkKewogICh2b2lkKWZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgInVzYWdlOgklcyBbLWNoZWNrc3VtXSBbLXRocm90dGxlXSBbLXNlcXVlbnRpYWxdIFstcHJveHkgaG9zdDpwb3J0XVxuIgogICAgICAgICAgICAgICAgIgkJWy12ZXJib3NlXSBbLXRpbWVvdXQgc2Vjc10gWy1zaXAgc2lwX2ZpbGVdIFstYWdlbnQgdXNlcl9hZ2VudF1cbiIKICAgICAgICAgICAgICAgICIJCVstY29va2llIGh0dHBfY29va2llXSBbLWFjY2VwdF9nemlwXSBbLWh0dHBfdmVyc2lvbiB2ZXJzaW9uX3N0cl1cbiIKICAgICAgICAgICAgICAgICIJCVsta2VlcF9hbGl2ZSBudW1fcmVxc19wZXJfY29ubl0gWy11bmlxdWVfaWRdXG4iCiAgICAgICAgICAgICAgICAiCQlbLW1heF9jb25uZWN0X2ZhaWx1cmVzIE5dIFstaWdub3JlX2J5dGVzXSBbIFstaGVhZGVyIHN0cl0gLi4uIF1cbiIsCiAgICAgICAgICAgICAgICBhcmd2MCk7CiAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIJWy1jaXBoZXIgc3RyXVxuIik7CiAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIJLXBhcmFsbGVsIE4gfCAtcmF0ZSBOIFstaml0dGVyXVxuIik7CiAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIJLWZldGNoZXMgTiB8IC1zZWNvbmRzIE5cbiIpOwogICh2b2lkKWZwcmludGYoc3RkZXJyLCAiCXVybF9maWxlXG4iKTsKICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIk9uZSBzdGFydCBzcGVjaWZpZXIsIGVpdGhlciAtcGFyYWxsZWwgb3IgLXJhdGUsIGlzIHJlcXVpcmVkLlxuIik7CiAgKHZvaWQpZnByaW50ZihzdGRlcnIsICJPbmUgZW5kIHNwZWNpZmllciwgZWl0aGVyIC1mZXRjaGVzIG9yIC1zZWNvbmRzLCBpcyByZXF1aXJlZC5cbiIpOwogIGV4aXQoMSk7Cn0KCnN0YXRpYyB2b2lkCnJlYWRfdXJsX2ZpbGUoY2hhciAqdXJsX2ZpbGUpCnsKICBjaGFyIGxpbmVbNTAwMF0sIGhvc3RuYW1lWzUwMDBdOwogIGNoYXIgKmh0dHAgICAgPSAiaHR0cDovLyI7CiAgaW50IGh0dHBfbGVuICA9IHN0cmxlbihodHRwKTsKICBjaGFyICpodHRwcyAgID0gImh0dHBzOi8vIjsKICBpbnQgaHR0cHNfbGVuID0gc3RybGVuKGh0dHBzKTsKICBpbnQgcHJvdG9fbGVuLCBob3N0X2xlbjsKICBjaGFyICpjcDsKCiAgRklMRSAqZnAgPSBmb3Blbih1cmxfZmlsZSwgInIiKTsKICBpZiAoZnAgPT0gTlVMTCkgewogICAgcGVycm9yKHVybF9maWxlKTsKICAgIGV4aXQoMSk7CiAgfQoKICBtYXhfdXJscyA9IDEwMDsKICB1cmxzICAgICA9ICh1cmwgKiltYWxsb2NfY2hlY2sobWF4X3VybHMgKiBzaXplb2YodXJsKSk7CiAgbnVtX3VybHMgPSAwOwogIGN1cl91cmwgID0gMDsKCiAgLyogVGhlIEhvc3Q6IGhlYWRlciBjYW4gZWl0aGVyIGJlIHVzZXIgcHJvdmlkZWQgKHZpYSAtaGVhZGVyKSwgb3IKICAgICBjb25zdHJ1Y3RlZCBieSB0aGUgVVJMIGhvc3QgYW5kIHBvc3NpYmx5IHBvcnQgKGlmIG5vdCBwb3J0IDgwKSAqLwoKICBjaGFyIGhkcl9idWZbMjA0OF07CiAgaW50IGhkcl9ieXRlcyA9IDA7CiAgaGRyX2J5dGVzICs9IHNucHJpbnRmKCZoZHJfYnVmW2hkcl9ieXRlc10sIHNpemVvZihoZHJfYnVmKSAtIGhkcl9ieXRlcywgIlVzZXItQWdlbnQ6ICVzXHJcbiIsIHVzZXJfYWdlbnQpOwogIGlmIChjb29raWUpCiAgICBoZHJfYnl0ZXMgKz0gc25wcmludGYoJmhkcl9idWZbaGRyX2J5dGVzXSwgc2l6ZW9mKGhkcl9idWYpIC0gaGRyX2J5dGVzLCAiQ29va2llOiAlc1xyXG4iLCBjb29raWUpOwogIGlmIChkb19hY2NlcHRfZ3ppcCkKICAgIGhkcl9ieXRlcyArPSBzbnByaW50ZigmaGRyX2J1ZltoZHJfYnl0ZXNdLCBzaXplb2YoaGRyX2J1ZikgLSBoZHJfYnl0ZXMsICJBY2NlcHQtRW5jb2Rpbmc6IGd6aXBcclxuIik7CiAgLyogQWRkIENvbm5lY3Rpb246IGtlZXAtYWxpdmUgaGVhZGVyIGlmIGtlZXBfYWxpdmUgcmVxdWVzdGVkLCBhbmQgdmVyc2lvbiAhPSAiMS4xIiAqLwogIGlmICgoa2VlcF9hbGl2ZSA+IDApICYmICFpc19odHRwXzFfMSkKICAgIGhkcl9ieXRlcyArPSBzbnByaW50ZigmaGRyX2J1ZltoZHJfYnl0ZXNdLCBzaXplb2YoaGRyX2J1ZikgLSBoZHJfYnl0ZXMsICJDb25uZWN0aW9uOiBrZWVwLWFsaXZlXHJcbiIpOwogIGlmIChleHRyYV9oZWFkZXJzICE9IE5VTEwpIHsKICAgIGhkcl9ieXRlcyArPSBzbnByaW50ZigmaGRyX2J1ZltoZHJfYnl0ZXNdLCBzaXplb2YoaGRyX2J1ZikgLSBoZHJfYnl0ZXMsICIlc1xyXG4iLCBleHRyYV9oZWFkZXJzKTsKICB9CiAgc25wcmludGYoJmhkcl9idWZbaGRyX2J5dGVzXSwgc2l6ZW9mKGhkcl9idWYpIC0gaGRyX2J5dGVzLCAiXHJcbiIpOwoKICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgIT0gKGNoYXIgKikwKSB7CiAgICBjaGFyIHJlcV9idWZbMjA0OF07CiAgICBpbnQgcmVxX2J5dGVzID0gMDsKCiAgICAvKiBOdWtlIHRyYWlsaW5nIG5ld2xpbmUuICovCiAgICBpZiAobGluZVtzdHJsZW4obGluZSkgLSAxXSA9PSAnXG4nKQogICAgICBsaW5lW3N0cmxlbihsaW5lKSAtIDFdID0gJ1wwJzsKCiAgICAvKiBDaGVjayBmb3Igcm9vbSBpbiB1cmxzLiAqLwogICAgaWYgKG51bV91cmxzID49IG1heF91cmxzKSB7CiAgICAgIG1heF91cmxzICo9IDI7CiAgICAgIHVybHMgPSAodXJsICopcmVhbGxvY19jaGVjaygodm9pZCAqKXVybHMsIG1heF91cmxzICogc2l6ZW9mKHVybCkpOwogICAgfQoKICAgIC8qIEFkZCB0byB0YWJsZS4gKi8KICAgIHVybHNbbnVtX3VybHNdLnVybF9zdHIgPSBzdHJkdXBfY2hlY2sobGluZSk7CgogICAgLyogUGFyc2UgaXQuICovCiAgICBpZiAoc3RybmNtcChodHRwLCBsaW5lLCBodHRwX2xlbikgPT0gMCkgewogICAgICBwcm90b19sZW4gICAgICAgICAgICAgICA9IGh0dHBfbGVuOwogICAgICB1cmxzW251bV91cmxzXS5wcm90b2NvbCA9IFBST1RPX0hUVFA7CiAgICB9IGVsc2UgaWYgKHN0cm5jbXAoaHR0cHMsIGxpbmUsIGh0dHBzX2xlbikgPT0gMCkgewogICAgICBwcm90b19sZW4gICAgICAgICAgICAgICA9IGh0dHBzX2xlbjsKICAgICAgdXJsc1tudW1fdXJsc10ucHJvdG9jb2wgPSBQUk9UT19IVFRQUzsKICAgIH0gZWxzZSB7CiAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHVua25vd24gcHJvdG9jb2wgLSAlc1xuIiwgYXJndjAsIGxpbmUpOwogICAgICBleGl0KDEpOwogICAgfQogICAgZm9yIChjcCA9IGxpbmUgKyBwcm90b19sZW47ICpjcCAhPSAnXDAnICYmICpjcCAhPSAnOicgJiYgKmNwICE9ICcvJzsgKytjcCkKICAgICAgOwogICAgaG9zdF9sZW4gPSBjcCAtIGxpbmU7CiAgICBob3N0X2xlbiAtPSBwcm90b19sZW47CiAgICBzdHJuY3B5KGhvc3RuYW1lLCBsaW5lICsgcHJvdG9fbGVuLCBob3N0X2xlbik7CiAgICBob3N0bmFtZVtob3N0X2xlbl0gICAgICA9ICdcMCc7CiAgICB1cmxzW251bV91cmxzXS5ob3N0bmFtZSA9IHN0cmR1cF9jaGVjayhob3N0bmFtZSk7CiAgICBpZiAoKmNwID09ICc6JykgewogICAgICB1cmxzW251bV91cmxzXS5wb3J0ID0gKHVuc2lnbmVkIHNob3J0KWF0b2koKytjcCk7CiAgICAgIHdoaWxlICgqY3AgIT0gJ1wwJyAmJiAqY3AgIT0gJy8nKQogICAgICAgICsrY3A7CiAgICB9IGVsc2UgaWYgKHVybHNbbnVtX3VybHNdLnByb3RvY29sID09IFBST1RPX0hUVFBTKQogICAgICB1cmxzW251bV91cmxzXS5wb3J0ID0gNDQzOwogICAgZWxzZQogICAgICB1cmxzW251bV91cmxzXS5wb3J0ID0gODA7CiAgICBpZiAoKmNwID09ICdcMCcpCiAgICAgIHVybHNbbnVtX3VybHNdLmZpbGVuYW1lID0gc3RyZHVwX2NoZWNrKCIvIik7CiAgICBlbHNlCiAgICAgIHVybHNbbnVtX3VybHNdLmZpbGVuYW1lID0gc3RyZHVwX2NoZWNrKGNwKTsKCiAgICBsb29rdXBfYWRkcmVzcyhudW1fdXJscyk7CgogICAgdXJsc1tudW1fdXJsc10uZ290X2J5dGVzICAgICAgICA9IDA7CiAgICB1cmxzW251bV91cmxzXS5nb3RfY2hlY2tzdW0gICAgID0gMDsKICAgIHVybHNbbnVtX3VybHNdLnVuaXF1ZV9pZF9vZmZzZXQgPSAwOwoKICAgIC8qIFByZS1nZW5lcmF0ZSB0aGUgcmVxdWVzdCBzdHJpbmcsIG1ham9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LiAqLwogICAgaWYgKGRvX3Byb3h5KSB7CiAgICAgIHJlcV9ieXRlcyA9IHNucHJpbnRmKHJlcV9idWYsIHNpemVvZihyZXFfYnVmKSwgIkdFVCAlczovLyUuNTAwczolZCUuNTAwcyBIVFRQLyVzXHJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybHNbbnVtX3VybHNdLnByb3RvY29sID09IFBST1RPX0hUVFBTID8gImh0dHBzIiA6ICJodHRwIiwgdXJsc1tudW1fdXJsc10uaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpdXJsc1tudW1fdXJsc10ucG9ydCwgdXJsc1tudW1fdXJsc10uZmlsZW5hbWUsIGh0dHBfdmVyc2lvbik7CiAgICB9IGVsc2UKICAgICAgcmVxX2J5dGVzID0gc25wcmludGYocmVxX2J1Ziwgc2l6ZW9mKHJlcV9idWYpLCAiR0VUICUuNTAwcyBIVFRQLyVzXHJcbiIsIHVybHNbbnVtX3VybHNdLmZpbGVuYW1lLCBodHRwX3ZlcnNpb24pOwoKICAgIGlmIChleHRyYV9oZWFkZXJzID09IE5VTEwgfHwgIXN0cnN0cihleHRyYV9oZWFkZXJzLCAiSG9zdDoiKSkgewogICAgICBpZiAodXJsc1tudW1fdXJsc10ucG9ydCAhPSA4MCkKICAgICAgICByZXFfYnl0ZXMgKz0gc25wcmludGYoJnJlcV9idWZbcmVxX2J5dGVzXSwgc2l6ZW9mKHJlcV9idWYpIC0gcmVxX2J5dGVzLCAiSG9zdDogJXM6JWRcclxuIiwgdXJsc1tudW1fdXJsc10uaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybHNbbnVtX3VybHNdLnBvcnQpOwogICAgICBlbHNlCiAgICAgICAgcmVxX2J5dGVzICs9IHNucHJpbnRmKCZyZXFfYnVmW3JlcV9ieXRlc10sIHNpemVvZihyZXFfYnVmKSAtIHJlcV9ieXRlcywgIkhvc3Q6ICVzXHJcbiIsIHVybHNbbnVtX3VybHNdLmhvc3RuYW1lKTsKICAgIH0KICAgIGlmICh1bmlxdWVfaWQgPT0gMSkgewogICAgICByZXFfYnl0ZXMgKz0gc25wcmludGYoJnJlcV9idWZbcmVxX2J5dGVzXSwgc2l6ZW9mKHJlcV9idWYpIC0gcmVxX2J5dGVzLCAiWC1JRDogIik7CiAgICAgIHVybHNbbnVtX3VybHNdLnVuaXF1ZV9pZF9vZmZzZXQgPSByZXFfYnl0ZXM7CiAgICAgIHJlcV9ieXRlcyArPSBzbnByaW50ZigmcmVxX2J1ZltyZXFfYnl0ZXNdLCBzaXplb2YocmVxX2J1ZikgLSByZXFfYnl0ZXMsICIlMDl1XHJcbiIsIDApOwogICAgfQoKICAgIC8vIGFkZCB0aGUgY29tbW9uIGhkciBoZXJlCiAgICByZXFfYnl0ZXMgKz0gc25wcmludGYoJnJlcV9idWZbcmVxX2J5dGVzXSwgc2l6ZW9mKHJlcV9idWYpIC0gcmVxX2J5dGVzLCBoZHJfYnVmLCAwKTsKCiAgICB1cmxzW251bV91cmxzXS5idWZfYnl0ZXMgPSByZXFfYnl0ZXM7CiAgICB1cmxzW251bV91cmxzXS5idWYgICAgICAgPSBzdHJkdXBfY2hlY2socmVxX2J1Zik7CgogICAgKytudW1fdXJsczsKICB9CiAgZmNsb3NlKGZwKTsKfQoKc3RhdGljIHZvaWQKbG9va3VwX2FkZHJlc3MoaW50IHVybF9udW0pCnsKICBpZiAoZG9fcHJveHkgJiYgdXJsX251bSA+IDApIHsKICAgIHVybHNbdXJsX251bV0uc29ja19mYW1pbHkgICA9IHVybHNbdXJsX251bSAtIDFdLnNvY2tfZmFtaWx5OwogICAgdXJsc1t1cmxfbnVtXS5zb2NrX3R5cGUgICAgID0gdXJsc1t1cmxfbnVtIC0gMV0uc29ja190eXBlOwogICAgdXJsc1t1cmxfbnVtXS5zb2NrX3Byb3RvY29sID0gdXJsc1t1cmxfbnVtIC0gMV0uc29ja19wcm90b2NvbDsKICAgIHVybHNbdXJsX251bV0uc2FfbGVuICAgICAgICA9IHVybHNbdXJsX251bSAtIDFdLnNhX2xlbjsKICAgIHVybHNbdXJsX251bV0uc2EgICAgICAgICAgICA9IHVybHNbdXJsX251bSAtIDFdLnNhOwogICAgcmV0dXJuOwogIH0KICBpbnQgaTsKICBjaGFyICpob3N0bmFtZTsKICB1bnNpZ25lZCBzaG9ydCBwb3J0OwojaWZkZWYgVVNFX0lQVjYKICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CiAgY2hhciBwb3J0c3RyWzEwXTsKICBpbnQgZ2FpZXJyOwogIHN0cnVjdCBhZGRyaW5mbyAqYWk7CiAgc3RydWN0IGFkZHJpbmZvICphaTI7CiAgc3RydWN0IGFkZHJpbmZvICphaXY0OwogIHN0cnVjdCBhZGRyaW5mbyAqYWl2NjsKI2Vsc2UgIC8qIFVTRV9JUFY2ICovCiAgc3RydWN0IGhvc3RlbnQgKmhlOwojZW5kaWYgLyogVVNFX0lQVjYgKi8KCiAgdXJsc1t1cmxfbnVtXS5zYV9sZW4gPSBzaXplb2YodXJsc1t1cmxfbnVtXS5zYSk7CiAgKHZvaWQpbWVtc2V0KCh2b2lkICopJnVybHNbdXJsX251bV0uc2EsIDAsIHVybHNbdXJsX251bV0uc2FfbGVuKTsKCiAgaWYgKGRvX3Byb3h5KQogICAgaG9zdG5hbWUgPSBwcm94eV9ob3N0bmFtZTsKICBlbHNlCiAgICBob3N0bmFtZSA9IHVybHNbdXJsX251bV0uaG9zdG5hbWU7CiAgaWYgKGRvX3Byb3h5KQogICAgcG9ydCA9IHByb3h5X3BvcnQ7CiAgZWxzZQogICAgcG9ydCA9IHVybHNbdXJsX251bV0ucG9ydDsKCiAgLyogVHJ5IHRvIGRvIHRoaXMgdXNpbmcgZXhpc3RpbmcgaW5mb3JtYXRpb24gICovCiAgZm9yIChpID0gMDsgaSA8IHVybF9udW07IGkrKykgewogICAgaWYgKChzdHJjbXAoaG9zdG5hbWUsIHVybHNbaV0uaG9zdG5hbWUpID09IDApICYmIChwb3J0ID09IHVybHNbaV0ucG9ydCkpIHsKICAgICAgdXJsc1t1cmxfbnVtXS5zb2NrX2ZhbWlseSAgID0gdXJsc1tpXS5zb2NrX2ZhbWlseTsKICAgICAgdXJsc1t1cmxfbnVtXS5zb2NrX3R5cGUgICAgID0gdXJsc1tpXS5zb2NrX3R5cGU7CiAgICAgIHVybHNbdXJsX251bV0uc29ja19wcm90b2NvbCA9IHVybHNbaV0uc29ja19wcm90b2NvbDsKICAgICAgdXJsc1t1cmxfbnVtXS5zYSAgICAgICAgICAgID0gdXJsc1tpXS5zYTsKICAgICAgdXJsc1t1cmxfbnVtXS5zYV9sZW4gICAgICAgID0gdXJsc1tpXS5zYV9sZW47CiAgICAgIHJldHVybjsKICAgIH0KICB9CgojaWZkZWYgVVNFX0lQVjYKCiAgKHZvaWQpbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CiAgaGludHMuYWlfZmFtaWx5ICAgPSBQRl9VTlNQRUM7CiAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKICAodm9pZClzbnByaW50Zihwb3J0c3RyLCBzaXplb2YocG9ydHN0ciksICIlZCIsIChpbnQpcG9ydCk7CiAgaWYgKChnYWllcnIgPSBnZXRhZGRyaW5mbyhob3N0bmFtZSwgcG9ydHN0ciwgJmhpbnRzLCAmYWkpKSAhPSAwKSB7CiAgICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBnZXRhZGRyaW5mbyAlcyAtICVzXG4iLCBhcmd2MCwgaG9zdG5hbWUsIGdhaV9zdHJlcnJvcihnYWllcnIpKTsKICAgIGV4aXQoMSk7CiAgfQoKICAvKiBGaW5kIHRoZSBmaXJzdCBJUHY0IGFuZCBJUHY2IGVudHJpZXMuICovCiAgYWl2NCA9IChzdHJ1Y3QgYWRkcmluZm8gKikwOwogIGFpdjYgPSAoc3RydWN0IGFkZHJpbmZvICopMDsKICBmb3IgKGFpMiA9IGFpOyBhaTIgIT0gKHN0cnVjdCBhZGRyaW5mbyAqKTA7IGFpMiA9IGFpMi0+YWlfbmV4dCkgewogICAgc3dpdGNoIChhaTItPmFpX2ZhbWlseSkgewogICAgY2FzZSBBRl9JTkVUOgogICAgICBpZiAoYWl2NCA9PSAoc3RydWN0IGFkZHJpbmZvICopMCkKICAgICAgICBhaXY0ID0gYWkyOwogICAgICBicmVhazsKICAgIGNhc2UgQUZfSU5FVDY6CiAgICAgIGlmIChhaXY2ID09IChzdHJ1Y3QgYWRkcmluZm8gKikwKQogICAgICAgIGFpdjYgPSBhaTI7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgLyogSWYgdGhlcmUncyBhbiBJUHY0IGFkZHJlc3MsIHVzZSB0aGF0LCBvdGhlcndpc2UgdHJ5IElQdjYuICovCiAgaWYgKGFpdjQgIT0gKHN0cnVjdCBhZGRyaW5mbyAqKTApIHsKICAgIGlmIChzaXplb2YodXJsc1t1cmxfbnVtXS5zYSkgPCBhaXY0LT5haV9hZGRybGVuKSB7CiAgICAgICh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXMgLSBzb2NrYWRkciB0b28gc21hbGwgKCVsdSA8ICVsdSlcbiIsIGhvc3RuYW1lLCAodW5zaWduZWQgbG9uZylzaXplb2YodXJsc1t1cmxfbnVtXS5zYSksCiAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpYWl2NC0+YWlfYWRkcmxlbik7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgICB1cmxzW3VybF9udW1dLnNvY2tfZmFtaWx5ICAgPSBhaXY0LT5haV9mYW1pbHk7CiAgICB1cmxzW3VybF9udW1dLnNvY2tfdHlwZSAgICAgPSBhaXY0LT5haV9zb2NrdHlwZTsKICAgIHVybHNbdXJsX251bV0uc29ja19wcm90b2NvbCA9IGFpdjQtPmFpX3Byb3RvY29sOwogICAgdXJsc1t1cmxfbnVtXS5zYV9sZW4gICAgICAgID0gYWl2NC0+YWlfYWRkcmxlbjsKICAgICh2b2lkKW1lbW1vdmUoJnVybHNbdXJsX251bV0uc2EsIGFpdjQtPmFpX2FkZHIsIGFpdjQtPmFpX2FkZHJsZW4pOwogICAgZnJlZWFkZHJpbmZvKGFpKTsKICAgIHJldHVybjsKICB9CiAgaWYgKGFpdjYgIT0gKHN0cnVjdCBhZGRyaW5mbyAqKTApIHsKICAgIGlmIChzaXplb2YodXJsc1t1cmxfbnVtXS5zYSkgPCBhaXY2LT5haV9hZGRybGVuKSB7CiAgICAgICh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXMgLSBzb2NrYWRkciB0b28gc21hbGwgKCVsdSA8ICVsdSlcbiIsIGhvc3RuYW1lLCAodW5zaWduZWQgbG9uZylzaXplb2YodXJsc1t1cmxfbnVtXS5zYSksCiAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpYWl2Ni0+YWlfYWRkcmxlbik7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgICB1cmxzW3VybF9udW1dLnNvY2tfZmFtaWx5ICAgPSBhaXY2LT5haV9mYW1pbHk7CiAgICB1cmxzW3VybF9udW1dLnNvY2tfdHlwZSAgICAgPSBhaXY2LT5haV9zb2NrdHlwZTsKICAgIHVybHNbdXJsX251bV0uc29ja19wcm90b2NvbCA9IGFpdjYtPmFpX3Byb3RvY29sOwogICAgdXJsc1t1cmxfbnVtXS5zYV9sZW4gICAgICAgID0gYWl2Ni0+YWlfYWRkcmxlbjsKICAgICh2b2lkKW1lbW1vdmUoJnVybHNbdXJsX251bV0uc2EsIGFpdjYtPmFpX2FkZHIsIGFpdjYtPmFpX2FkZHJsZW4pOwogICAgZnJlZWFkZHJpbmZvKGFpKTsKICAgIHJldHVybjsKICB9CgogICh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6IG5vIHZhbGlkIGFkZHJlc3MgZm91bmQgZm9yIGhvc3QgJXNcbiIsIGFyZ3YwLCBob3N0bmFtZSk7CiAgZXhpdCgxKTsKCiNlbHNlIC8qIFVTRV9JUFY2ICovCgogIC8qIE5vIG1hdGNoIGluIHByZXZpb3VzIGxvb2t1cHMgKi8KICBoZSA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOwogIGlmIChoZSA9PSAoc3RydWN0IGhvc3RlbnQgKikwKSB7CiAgICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmtub3duIGhvc3QgLSAlc1xuIiwgYXJndjAsIGhvc3RuYW1lKTsKICAgIGV4aXQoMSk7CiAgfQogIHVybHNbdXJsX251bV0uc29ja19mYW1pbHkgPSB1cmxzW3VybF9udW1dLnNhLnNpbl9mYW1pbHkgPSBoZS0+aF9hZGRydHlwZTsKICB1cmxzW3VybF9udW1dLnNvY2tfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU09DS19TVFJFQU07CiAgdXJsc1t1cmxfbnVtXS5zb2NrX3Byb3RvY29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CiAgdXJsc1t1cmxfbnVtXS5zYV9sZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNpemVvZih1cmxzW3VybF9udW1dLnNhKTsKICAodm9pZCltZW1tb3ZlKCZ1cmxzW3VybF9udW1dLnNhLnNpbl9hZGRyLCBoZS0+aF9hZGRyLCBoZS0+aF9sZW5ndGgpOwogIHVybHNbdXJsX251bV0uc2Euc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKCiNlbmRpZiAvKiBVU0VfSVBWNiAqLwp9CgpzdGF0aWMgdm9pZApyZWFkX3NpcF9maWxlKGNoYXIgKnNpcF9maWxlKQp7CiAgRklMRSAqZnA7CiAgY2hhciBsaW5lWzUwMDBdOwoKICBmcCA9IGZvcGVuKHNpcF9maWxlLCAiciIpOwogIGlmIChmcCA9PSAoRklMRSAqKTApIHsKICAgIHBlcnJvcihzaXBfZmlsZSk7CiAgICBleGl0KDEpOwogIH0KCiAgbWF4X3NpcHMgPSAxMDA7CiAgc2lwcyAgICAgPSAoc2lwICopbWFsbG9jX2NoZWNrKG1heF9zaXBzICogc2l6ZW9mKHNpcCkpOwogIG51bV9zaXBzID0gMDsKICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgIT0gKGNoYXIgKikwKSB7CiAgICAvKiBOdWtlIHRyYWlsaW5nIG5ld2xpbmUuICovCiAgICBpZiAobGluZVtzdHJsZW4obGluZSkgLSAxXSA9PSAnXG4nKQogICAgICBsaW5lW3N0cmxlbihsaW5lKSAtIDFdID0gJ1wwJzsKCiAgICAvKiBDaGVjayBmb3Igcm9vbSBpbiBzaXBzLiAqLwogICAgaWYgKG51bV9zaXBzID49IG1heF9zaXBzKSB7CiAgICAgIG1heF9zaXBzICo9IDI7CiAgICAgIHNpcHMgPSAoc2lwICopcmVhbGxvY19jaGVjaygodm9pZCAqKXNpcHMsIG1heF9zaXBzICogc2l6ZW9mKHNpcCkpOwogICAgfQoKICAgIC8qIEFkZCB0byB0YWJsZS4gKi8KICAgIHNpcHNbbnVtX3NpcHNdLnN0ciA9IHN0cmR1cF9jaGVjayhsaW5lKTsKICAgICh2b2lkKW1lbXNldCgodm9pZCAqKSZzaXBzW251bV9zaXBzXS5zYSwgMCwgc2l6ZW9mKHNpcHNbbnVtX3NpcHNdLnNhKSk7CiAgICBpZiAoIWluZXRfYXRvbihzaXBzW251bV9zaXBzXS5zdHIsICZzaXBzW251bV9zaXBzXS5zYS5zaW5fYWRkcikpIHsKICAgICAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IGNvbnZlcnQgc291cmNlIElQIGFkZHJlc3MgJXNcbiIsIGFyZ3YwLCBzaXBzW251bV9zaXBzXS5zdHIpOwogICAgICBleGl0KDEpOwogICAgfQogICAgKytudW1fc2lwczsKICB9CiAgZmNsb3NlKGZwKTsKfQoKc3RhdGljIHZvaWQKc3RhcnRfY29ubmVjdGlvbihzdHJ1Y3QgdGltZXZhbCAqbm93UCkKewogIGludCBjbnVtLCB1cmxfbnVtOwogIHN0YXRpYyBpbnQgY3ljbGVfc2xvdCA9IDA7CgogIC8qIEZpbmQgYW4gZW1wdHkgY29ubmVjdGlvbiBzbG90LiAqLwogIGlmIChzb2NrZXRfcG9vbCA+IDApIHsKICAgIGludCBwcmV2X2N5Y2xlX3Nsb3QgPSBjeWNsZV9zbG90OwoKICAgIHdoaWxlICgxKSB7CiAgICAgICsrY3ljbGVfc2xvdDsKICAgICAgaWYgKGN5Y2xlX3Nsb3QgPiBzb2NrZXRfcG9vbCkKICAgICAgICBjeWNsZV9zbG90ID0gMDsKICAgICAgaWYgKHByZXZfY3ljbGVfc2xvdCA9PSBjeWNsZV9zbG90KSB7CiAgICAgICAgcmV0dXJuOwojaWYgMAogICAgICAgIC8qIFVudXNlZCByaWdodCBub3csIG5vdCBzdXJlIHdoeSAqLwogICAgICAgIHByaW50ZigiV2FybmluZzogY3ljbGluZyB0aHJvdWdoIGFsbCBzb2NrZXQgc2xvdHNcbiIpOwogICAgICAgIHRtcl9ydW4obm93UCk7CiNlbmRpZgogICAgICB9CiAgICAgIGlmIChjb25uZWN0aW9uc1tjeWNsZV9zbG90XS5jb25uX3N0YXRlID09IENOU1RfRlJFRSkgewogICAgICAgIC8qIENob29zZSBhIFVSTC4gKi8KICAgICAgICBpZiAoZG9fc2VxdWVudGlhbCkgewogICAgICAgICAgdXJsX251bSA9IGN1cl91cmwrKzsKICAgICAgICAgIGlmIChjdXJfdXJsID49IG51bV91cmxzKQogICAgICAgICAgICBjdXJfdXJsID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdXJsX251bSA9ICgodW5zaWduZWQgbG9uZylyYW5kb20oKSkgJSAoKHVuc2lnbmVkIGludCludW1fdXJscyk7CiAgICAgICAgfQoKICAgICAgICAvKiBTdGFydCB0aGUgc29ja2V0LiAqLwogICAgICAgIHN0YXJ0X3NvY2tldCh1cmxfbnVtLCBjeWNsZV9zbG90LCBub3dQKTsKICAgICAgICBpZiAoY29ubmVjdGlvbnNbY3ljbGVfc2xvdF0uY29ubl9zdGF0ZSAhPSBDTlNUX0ZSRUUpIHsKICAgICAgICAgICsrbnVtX2Nvbm5lY3Rpb25zOwogICAgICAgICAgLyoKICAgICAgICAgICAgIGlmICggbnVtX2Nvbm5lY3Rpb25zID4gbWF4X3BhcmFsbGVsICkKICAgICAgICAgICAgIG1heF9wYXJhbGxlbCA9IG51bV9jb25uZWN0aW9uczsKICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICArK2ZldGNoZXNfc3RhcnRlZDsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICB9IGVsc2UgewogICAgZm9yIChjbnVtID0gMDsgY251bSA8IG1heF9jb25uZWN0aW9uczsgKytjbnVtKQogICAgICBpZiAoY29ubmVjdGlvbnNbY251bV0uY29ubl9zdGF0ZSA9PSBDTlNUX0ZSRUUpIHsKICAgICAgICAvKiBDaG9vc2UgYSBVUkwuICovCiAgICAgICAgaWYgKGRvX3NlcXVlbnRpYWwpIHsKICAgICAgICAgIHVybF9udW0gPSBjdXJfdXJsKys7CiAgICAgICAgICBpZiAoY3VyX3VybCA+PSBudW1fdXJscykKICAgICAgICAgICAgY3VyX3VybCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVybF9udW0gPSAoKHVuc2lnbmVkIGxvbmcpcmFuZG9tKCkpICUgKCh1bnNpZ25lZCBpbnQpbnVtX3VybHMpOwogICAgICAgIH0KICAgICAgICAvKiBTdGFydCB0aGUgc29ja2V0LiAqLwogICAgICAgIHN0YXJ0X3NvY2tldCh1cmxfbnVtLCBjbnVtLCBub3dQKTsKICAgICAgICBpZiAoY29ubmVjdGlvbnNbY251bV0uY29ubl9zdGF0ZSAhPSBDTlNUX0ZSRUUpIHsKICAgICAgICAgICsrbnVtX2Nvbm5lY3Rpb25zOwogICAgICAgICAgLyoKICAgICAgICAgICAgIGlmICggbnVtX2Nvbm5lY3Rpb25zID4gbWF4X3BhcmFsbGVsICkKICAgICAgICAgICAgIG1heF9wYXJhbGxlbCA9IG51bV9jb25uZWN0aW9uczsKICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICArK2ZldGNoZXNfc3RhcnRlZDsKICAgICAgICByZXR1cm47CiAgICAgIH0KICB9CiAgLyogTm8gc2xvdHMgbGVmdC4gKi8KICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiByYW4gb3V0IG9mIGNvbm5lY3Rpb24gc2xvdHNcbiIsIGFyZ3YwKTsKICBmaW5pc2gobm93UCk7Cn0KCnN0YXRpYyB2b2lkCnN0YXJ0X3NvY2tldChpbnQgdXJsX251bSwgaW50IGNudW0sIHN0cnVjdCB0aW1ldmFsICpub3dQKQp7CiAgQ2xpZW50RGF0YSBjbGllbnRfZGF0YTsKICBpbnQgZmxhZ3M7CiAgaW50IHNpcF9udW07CiAgaW50IHJldXNhYmxlID0gY29ubmVjdGlvbnNbY251bV0ucmV1c2FibGU7CgogIC8qIFN0YXJ0IGZpbGxpbmcgaW4gdGhlIGNvbm5lY3Rpb24gc2xvdC4gKi8KICBjb25uZWN0aW9uc1tjbnVtXS51cmxfbnVtICAgICAgICA9IHVybF9udW07CiAgY29ubmVjdGlvbnNbY251bV0uc3RhcnRlZF9hdCAgICAgPSAqbm93UDsKICBjbGllbnRfZGF0YS5pICAgICAgICAgICAgICAgICAgICA9IGNudW07CiAgY29ubmVjdGlvbnNbY251bV0uZGlkX2Nvbm5lY3QgICAgPSAwOwogIGNvbm5lY3Rpb25zW2NudW1dLmRpZF9yZXNwb25zZSAgID0gMDsKICBjb25uZWN0aW9uc1tjbnVtXS5pZGxlX3RpbWVyICAgICA9IHRtcl9jcmVhdGUobm93UCwgaWRsZV9jb25uZWN0aW9uLCBjbGllbnRfZGF0YSwgaWRsZV9zZWNzICogMTAwMEwsIDApOwogIGNvbm5lY3Rpb25zW2NudW1dLndha2V1cF90aW1lciAgID0gKFRpbWVyICopMDsKICBjb25uZWN0aW9uc1tjbnVtXS5jb250ZW50X2xlbmd0aCA9IC0xOwogIGNvbm5lY3Rpb25zW2NudW1dLmJ5dGVzICAgICAgICAgID0gMDsKICBjb25uZWN0aW9uc1tjbnVtXS5jaGVja3N1bSAgICAgICA9IDA7CiAgY29ubmVjdGlvbnNbY251bV0uaHR0cF9zdGF0dXMgICAgPSAtMTsKICBjb25uZWN0aW9uc1tjbnVtXS5yZXVzYWJsZSAgICAgICA9IDA7CiAgY29ubmVjdGlvbnNbY251bV0uY2h1bmtlZCAgICAgICAgPSAwOwogIGNvbm5lY3Rpb25zW2NudW1dLnVuaXF1ZV9pZCAgICAgID0gMDsKCiAgLy8gc2V0IHVuaXF1ZSBpZAogIGlmICh1bmlxdWVfaWQgPT0gMSAmJiB1cmxzW3VybF9udW1dLnVuaXF1ZV9pZF9vZmZzZXQgPiAwKSB7CiAgICBjaGFyIGJ1ZmZlclsxMF07CiAgICBzbnByaW50ZihidWZmZXIsIDEwLCAiJTA5dSIsICsrdW5pcXVlX2lkX2NvdW50ZXIpOwogICAgLy8gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzICVzXG4iLCBidWZmZXIsICZ1cmxzW3VybF9udW1dLmJ1Zlt1bmlxdWVfaWRfb2Zmc2V0XSk7CiAgICBtZW1jcHkoKHZvaWQgKikmdXJsc1t1cmxfbnVtXS5idWZbdXJsc1t1cmxfbnVtXS51bmlxdWVfaWRfb2Zmc2V0XSwgKHZvaWQgKilidWZmZXIsIDkpOwogICAgY29ubmVjdGlvbnNbY251bV0udW5pcXVlX2lkID0gdW5pcXVlX2lkX2NvdW50ZXI7CiAgfQoKICAvKiBNYWtlIGEgc29ja2V0LiAqLwogIGlmICghcmV1c2FibGUpIHsKICAgIHN0cnVjdCBlcG9sbF9ldmVudCBldjsKCiAgICBjb25uZWN0aW9uc1tjbnVtXS5rZWVwX2FsaXZlID0ga2VlcF9hbGl2ZTsKICAgIGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fZmQgICAgPSBzb2NrZXQodXJsc1t1cmxfbnVtXS5zb2NrX2ZhbWlseSwgdXJsc1t1cmxfbnVtXS5zb2NrX3R5cGUsIHVybHNbdXJsX251bV0uc29ja19wcm90b2NvbCk7CiAgICBpZiAoY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCA8IDApIHsKICAgICAgcGVycm9yKHVybHNbdXJsX251bV0udXJsX3N0cik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbm5lY3Rpb25zW2NudW1dLnN0YXRzLmNvbm5lY3Rpb25zKys7CgogICAgLyogU2V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gbm8tZGVsYXkgbW9kZS4gKi8KICAgIGZsYWdzID0gZmNudGwoY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCwgRl9HRVRGTCwgMCk7CiAgICBpZiAoZmxhZ3MgPT0gLTEpIHsKICAgICAgcGVycm9yKHVybHNbdXJsX251bV0udXJsX3N0cik7CiAgICAgICh2b2lkKWNsb3NlKGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fZmQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZmNudGwoY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCwgRl9TRVRGTCwgZmxhZ3MgfCBPX05ERUxBWSkgPCAwKSB7CiAgICAgIHBlcnJvcih1cmxzW3VybF9udW1dLnVybF9zdHIpOwogICAgICAodm9pZCljbG9zZShjb25uZWN0aW9uc1tjbnVtXS5jb25uX2ZkKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChudW1fc2lwcyA+IDApIHsKICAgICAgLyogVHJ5IGEgcmFuZG9tIHNvdXJjZSBJUCBhZGRyZXNzLiAqLwogICAgICBzaXBfbnVtID0gKCh1bnNpZ25lZCBsb25nKXJhbmRvbSgpKSAlICgodW5zaWduZWQgaW50KW51bV9zaXBzKTsKICAgICAgaWYgKGJpbmQoY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzaXBzW3NpcF9udW1dLnNhLCBzaXplb2Yoc2lwc1tzaXBfbnVtXS5zYSkpIDwgMCkgewogICAgICAgIHBlcnJvcigiYmluZGluZyBsb2NhbCBhZGRyZXNzIik7CiAgICAgICAgKHZvaWQpY2xvc2UoY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBldi5ldmVudHMgICA9IEVQT0xMT1VUOwogICAgZXYuZGF0YS51MzIgPSBjbnVtOwojaWZkZWYgREVCVUcKICAgIGZwcmludGYoc3RkZXJyLCAiQWRkaW5nIEZEICVkIGZvciBDTlVNICVkXG4iLCBjb25uZWN0aW9uc1tjbnVtXS5jb25uX2ZkLCBjbnVtKTsKI2VuZGlmCiAgICBpZiAoZXBvbGxfY3RsKGVwZmQsIEVQT0xMX0NUTF9BREQsIGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fZmQsICZldikpIHsKICAgICAgcGVycm9yKCJlcG9sbCBhZGQgZmQiKTsKICAgICAgKHZvaWQpY2xvc2UoY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8qIENvbm5lY3QgdG8gdGhlIGhvc3QuICovCiAgICBjb25uZWN0aW9uc1tjbnVtXS5zYV9sZW4gPSB1cmxzW3VybF9udW1dLnNhX2xlbjsKICAgICh2b2lkKW1lbW1vdmUoKHZvaWQgKikmY29ubmVjdGlvbnNbY251bV0uc2EsICh2b2lkICopJnVybHNbdXJsX251bV0uc2EsIHVybHNbdXJsX251bV0uc2FfbGVuKTsKICAgIGNvbm5lY3Rpb25zW2NudW1dLmNvbm5lY3RfYXQgPSAqbm93UDsKICAgIGlmIChjb25uZWN0KGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmY29ubmVjdGlvbnNbY251bV0uc2EsIGNvbm5lY3Rpb25zW2NudW1dLnNhX2xlbikgPCAwKSB7CiAgICAgIGlmIChlcnJubyA9PSBFSU5QUk9HUkVTUykgewogICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fc3RhdGUgPSBDTlNUX0NPTk5FQ1RJTkc7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgewogICAgICAgIC8qIHJlbW92ZSB0aGUgRkQgZnJvbSB0aGUgZXBvbGwgZGVzY3JpcHRvciAqLwogICAgICAgIGlmIChlcG9sbF9jdGwoZXBmZCwgRVBPTExfQ1RMX0RFTCwgY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCwgJmV2KSA8IDApCiAgICAgICAgICBwZXJyb3IoImVwb2xsIGRlbGV0ZSBmZCIpOwogICAgICAgIHBlcnJvcih1cmxzW3VybF9udW1dLnVybF9zdHIpOwogICAgICAgICh2b2lkKWNsb3NlKGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fZmQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIC8qIENvbm5lY3Qgc3VjY2VlZGVkIGluc3RhbnRseSwgc28gaGFuZGxlIGl0IG5vdy4gKi8KICAgICh2b2lkKWdldHRpbWVvZmRheShub3dQLCAoc3RydWN0IHRpbWV6b25lICopMCk7CiAgICBoYW5kbGVfY29ubmVjdChjbnVtLCBub3dQLCAwKTsKICB9IGVsc2UgewogICAgLyogU2VuZCB0aGUgcmVxdWVzdCBvbiBhIHJldXNlZCBjb25uZWN0aW9uICovCiAgICBpbnQgcjsKCiAgICBjb25uZWN0aW9uc1tjbnVtXS5zdGF0cy5yZXF1ZXN0cysrOwogICAgY29ubmVjdGlvbnNbY251bV0uc3RhdHMucmVxdWVzdHNfcGVyX2Nvbm5lY3Rpb24rKzsKICAgIGNvbm5lY3Rpb25zW2NudW1dLnJlcXVlc3RfYXQgPSAqbm93UDsKCiAgICBpZiAodXJsc1t1cmxfbnVtXS5wcm90b2NvbCA9PSBQUk9UT19IVFRQUykKICAgICAgciA9IFNTTF93cml0ZShjb25uZWN0aW9uc1tjbnVtXS5zc2wsIHVybHNbdXJsX251bV0uYnVmLCB1cmxzW3VybF9udW1dLmJ1Zl9ieXRlcyk7CiAgICBlbHNlCiAgICAgIHIgPSB3cml0ZShjb25uZWN0aW9uc1tjbnVtXS5jb25uX2ZkLCB1cmxzW3VybF9udW1dLmJ1ZiwgdXJsc1t1cmxfbnVtXS5idWZfYnl0ZXMpOwogICAgaWYgKHIgPD0gMCkgewogICAgICBwZXJyb3IodXJsc1t1cmxfbnVtXS51cmxfc3RyKTsKICAgICAgY29ubmVjdGlvbnNbY251bV0ucmV1c2FibGUgPSAwOwogICAgICBjbG9zZV9jb25uZWN0aW9uKGNudW0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25uZWN0aW9uc1tjbnVtXS5jb25uX3N0YXRlICAgPSBDTlNUX0hFQURFUlM7CiAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xJTkUxX1BST1RPQ09MOwogIH0KfQoKc3RhdGljIGludApjZXJ0X3ZlcmlmeV9jYWxsYmFjayhpbnQgb2sgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIFg1MDlfU1RPUkVfQ1RYICpjdHggX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCnsKICByZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQKaGFuZGxlX2Nvbm5lY3QoaW50IGNudW0sIHN0cnVjdCB0aW1ldmFsICpub3dQLCBpbnQgZG91YmxlX2NoZWNrKQp7CiAgc3RhdGljIGludCBjb25uZWN0X2ZhaWx1cmVzID0gMDsKICBpbnQgdXJsX251bTsKICBpbnQgcjsKICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXY7CgojaWZkZWYgREVCVUcKICBmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIGhhbmRsZV9jb25uZWN0KCkgZm9yIENOVU0gJWRcbiIsIGNudW0pOwojZW5kaWYKCiAgdXJsX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb25uZWN0aW9uc1tjbnVtXS51cmxfbnVtOwogIGNvbm5lY3Rpb25zW2NudW1dLnN0YXRzLnJlcXVlc3RzX3Blcl9jb25uZWN0aW9uID0gMDsKICBpZiAoZG91YmxlX2NoZWNrKSB7CiAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIG5vbi1ibG9ja2luZyBjb25uZWN0IHN1Y2NlZWRlZC4gKi8KICAgIGludCBlcnIsIGVycmxlbjsKCiAgICBpZiAoY29ubmVjdChjb25uZWN0aW9uc1tjbnVtXS5jb25uX2ZkLCAoc3RydWN0IHNvY2thZGRyICopJmNvbm5lY3Rpb25zW2NudW1dLnNhLCBjb25uZWN0aW9uc1tjbnVtXS5zYV9sZW4pIDwgMCkgewogICAgICBpZiAobWF4X2Nvbm5lY3RfZmFpbHVyZXMgJiYgKCsrY29ubmVjdF9mYWlsdXJlcyA+IG1heF9jb25uZWN0X2ZhaWx1cmVzKSkKICAgICAgICBleGl0KDApOwogICAgICBzd2l0Y2ggKGVycm5vKSB7CiAgICAgIGNhc2UgRUlTQ09OTjoKICAgICAgICAvKiBPayEgKi8KICAgICAgICBicmVhazsKICAgICAgY2FzZSBFSU5WQUw6CiAgICAgICAgZXJybGVuID0gc2l6ZW9mKGVycik7CiAgICAgICAgaWYgKGdldHNvY2tvcHQoY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsICh2b2lkICopJmVyciwgKHNvY2tsZW5fdCAqKSZlcnJsZW4pIDwgMCkKICAgICAgICAgICh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6IHVua25vd24gY29ubmVjdCBlcnJvclxuIiwgdXJsc1t1cmxfbnVtXS51cmxfc3RyKTsKICAgICAgICBlbHNlCiAgICAgICAgICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgdXJsc1t1cmxfbnVtXS51cmxfc3RyLCBzdHJlcnJvcihlcnIpKTsKICAgICAgICBjbG9zZV9jb25uZWN0aW9uKGNudW0pOwogICAgICAgIHJldHVybjsKICAgICAgZGVmYXVsdDoKICAgICAgICBwZXJyb3IodXJsc1t1cmxfbnVtXS51cmxfc3RyKTsKICAgICAgICBjbG9zZV9jb25uZWN0aW9uKGNudW0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogIH0KCiAgaWYgKHVybHNbdXJsX251bV0ucHJvdG9jb2wgPT0gUFJPVE9fSFRUUFMpIHsKICAgIGludCBmbGFnczsKCiAgICAvKiBNYWtlIFNTTCBjb25uZWN0aW9uLiAqLwogICAgaWYgKHNzbF9jdHggPT0gKFNTTF9DVFggKikwKSB7CiAgICAgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKICAgICAgU1NMX2xpYnJhcnlfaW5pdCgpOwogICAgICBzc2xfY3R4ID0gU1NMX0NUWF9uZXcoU1NMdjIzX2NsaWVudF9tZXRob2QoKSk7CiAgICAgIC8qIEZvciBzb21lIHJlYXNvbiB0aGlzIGRvZXMgbm90IHNlZW0gdG8gd29yaywgYnV0IGluZGljYXRpb25zIGFyZSB0aGF0IGl0IHNob3VsZC4uLgogICAgICAgICBNYXliZSBzb21ldGhpbmcgd2l0aCBob3cgd2UgY3JlYXRlIGNvbm5lY3Rpb25zPyBUT0RPOiBGaXggaXQuLi4gKi8KICAgICAgU1NMX0NUWF9zZXRfdmVyaWZ5KHNzbF9jdHgsIFNTTF9WRVJJRllfTk9ORSwgY2VydF92ZXJpZnlfY2FsbGJhY2spOwogICAgICBpZiAoY2lwaGVyICE9IChjaGFyICopMCkgewogICAgICAgIGlmICghU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3Qoc3NsX2N0eCwgY2lwaGVyKSkgewogICAgICAgICAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IHNldCBjaXBoZXIgbGlzdFxuIiwgYXJndjApOwogICAgICAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwogICAgICAgICAgY2xvc2VfY29ubmVjdGlvbihjbnVtKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIVJBTkRfc3RhdHVzKCkpIHsKICAgICAgdW5zaWduZWQgY2hhciBieXRlc1sxMDI0XTsKICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoYnl0ZXMpOyArK2kpCiAgICAgICAgYnl0ZXNbaV0gPSByYW5kb20oKSAlIDB4ZmY7CiAgICAgIFJBTkRfc2VlZChieXRlcywgc2l6ZW9mKGJ5dGVzKSk7CiAgICB9CiAgICBmbGFncyA9IGZjbnRsKGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fZmQsIEZfR0VURkwsIDApOwogICAgaWYgKGZsYWdzICE9IC0xKQogICAgICAodm9pZClmY250bChjb25uZWN0aW9uc1tjbnVtXS5jb25uX2ZkLCBGX1NFVEZMLCBmbGFncyAmIH4oaW50KU9fTkRFTEFZKTsKICAgIGNvbm5lY3Rpb25zW2NudW1dLnNzbCA9IFNTTF9uZXcoc3NsX2N0eCk7CiAgICBTU0xfc2V0X2ZkKGNvbm5lY3Rpb25zW2NudW1dLnNzbCwgY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCk7CiAgICByID0gU1NMX2Nvbm5lY3QoY29ubmVjdGlvbnNbY251bV0uc3NsKTsKICAgIGlmIChyIDw9IDApIHsKICAgICAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogU1NMIGNvbm5lY3Rpb24gZmFpbGVkIC0gJWRcbiIsIGFyZ3YwLCByKTsKICAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwogICAgICBjbG9zZV9jb25uZWN0aW9uKGNudW0pOwogICAgICByZXR1cm47CiAgICB9CiAgfQoKICBldi5ldmVudHMgICA9IEVQT0xMSU47CiAgZXYuZGF0YS51MzIgPSBjbnVtOwoKI2lmZGVmIERFQlVHCiAgZnByaW50ZihzdGRlcnIsICJNb2QgRkQgJWQgdG8gcmVhZCBmb3IgQ05VTSAlZFxuIiwgY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCwgY251bSk7CiNlbmRpZgogIGlmIChlcG9sbF9jdGwoZXBmZCwgRVBPTExfQ1RMX01PRCwgY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCwgJmV2KSkgewogICAgcGVycm9yKCJlcG9sbCBtb2QgZmQiKTsKICAgICh2b2lkKWNsb3NlKGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fZmQpOwogICAgcmV0dXJuOwogIH0KICAvKiBTZW5kIHRoZSByZXF1ZXN0LiAqLwogIGNvbm5lY3Rpb25zW2NudW1dLmRpZF9jb25uZWN0ID0gMTsKICBjb25uZWN0aW9uc1tjbnVtXS5yZXF1ZXN0X2F0ICA9ICpub3dQOwogIGNvbm5lY3Rpb25zW2NudW1dLnN0YXRzLnJlcXVlc3RzKys7CiAgaWYgKHVybHNbdXJsX251bV0ucHJvdG9jb2wgPT0gUFJPVE9fSFRUUFMpCiAgICByID0gU1NMX3dyaXRlKGNvbm5lY3Rpb25zW2NudW1dLnNzbCwgdXJsc1t1cmxfbnVtXS5idWYsIHVybHNbdXJsX251bV0uYnVmX2J5dGVzKTsKICBlbHNlCiAgICByID0gd3JpdGUoY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCwgdXJsc1t1cmxfbnVtXS5idWYsIHVybHNbdXJsX251bV0uYnVmX2J5dGVzKTsKICBpZiAociA8PSAwKSB7CiAgICBwZXJyb3IodXJsc1t1cmxfbnVtXS51cmxfc3RyKTsKICAgIGNvbm5lY3Rpb25zW2NudW1dLnJldXNhYmxlID0gMDsKICAgIGNsb3NlX2Nvbm5lY3Rpb24oY251bSk7CiAgICByZXR1cm47CiAgfQogIGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fc3RhdGUgICA9IENOU1RfSEVBREVSUzsKICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xJTkUxX1BST1RPQ09MOwp9CgpzdGF0aWMgdm9pZApoYW5kbGVfcmVhZChpbnQgY251bSwgc3RydWN0IHRpbWV2YWwgKm5vd1ApCnsKICBjaGFyIGJ1ZlszMDAwMF07IC8qIG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhyb3R0bGUgLyAyICovCiAgaW50IGJ5dGVzX3RvX3JlYWQsIGJ5dGVzX3JlYWQsIGJ5dGVzX2hhbmRsZWQ7CiAgZmxvYXQgZWxhcHNlZDsKICBDbGllbnREYXRhIGNsaWVudF9kYXRhOwogIGxvbmcgY2hlY2tzdW07CgogIHRtcl9yZXNldChub3dQLCBjb25uZWN0aW9uc1tjbnVtXS5pZGxlX3RpbWVyKTsKCiAgaWYgKGRvX3Rocm90dGxlKQogICAgYnl0ZXNfdG9fcmVhZCA9IHRocm90dGxlIC8gMi4wOwogIGVsc2UKICAgIGJ5dGVzX3RvX3JlYWQgPSBzaXplb2YoYnVmKTsKICBpZiAoIWNvbm5lY3Rpb25zW2NudW1dLmRpZF9yZXNwb25zZSkgewogICAgY29ubmVjdGlvbnNbY251bV0uZGlkX3Jlc3BvbnNlID0gMTsKICAgIGNvbm5lY3Rpb25zW2NudW1dLnJlc3BvbnNlX2F0ICA9ICpub3dQOwogICAgaWYgKGNvbm5lY3Rpb25zW2NudW1dLmRpZF9jb25uZWN0KSB7CiAgICAgIGlmIChjb25uZWN0aW9uc1tjbnVtXS5rZWVwX2FsaXZlID09IGtlZXBfYWxpdmUpIHsKICAgICAgICBudW1fa2FfY29ubnMrKzsKICAgICAgICBpZiAobnVtX2thX2Nvbm5zID4gbWF4X3BhcmFsbGVsKSB7CiAgICAgICAgICBtYXhfcGFyYWxsZWwgPSBudW1fa2FfY29ubnM7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoY29ubmVjdGlvbnNbY251bV0ua2VlcF9hbGl2ZSA9PSAwKSB7CiAgICAgIG51bV9rYV9jb25ucy0tOwogICAgfQogIH0KICBpZiAodXJsc1tjb25uZWN0aW9uc1tjbnVtXS51cmxfbnVtXS5wcm90b2NvbCA9PSBQUk9UT19IVFRQUykKICAgIGJ5dGVzX3JlYWQgPSBTU0xfcmVhZChjb25uZWN0aW9uc1tjbnVtXS5zc2wsIGJ1ZiwgYnl0ZXNfdG9fcmVhZCAtIDEpOwogIGVsc2UKICAgIGJ5dGVzX3JlYWQgPSByZWFkKGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fZmQsIGJ1ZiwgYnl0ZXNfdG9fcmVhZCAtIDEpOwogIGlmIChieXRlc19yZWFkIDw9IDApIHsKICAgIGNvbm5lY3Rpb25zW2NudW1dLnJldXNhYmxlID0gMDsKICAgIGNsb3NlX2Nvbm5lY3Rpb24oY251bSk7CiAgICByZXR1cm47CiAgfQoKICBidWZbYnl0ZXNfcmVhZF0gPSAwOwogIGZvciAoYnl0ZXNfaGFuZGxlZCA9IDA7IGJ5dGVzX2hhbmRsZWQgPCBieXRlc19yZWFkOykgewogICAgc3dpdGNoIChjb25uZWN0aW9uc1tjbnVtXS5jb25uX3N0YXRlKSB7CiAgICBjYXNlIENOU1RfSEVBREVSUzoKICAgICAgLyogU3RhdGUgbWFjaGluZSB0byByZWFkIHVudGlsIHdlIHJlYWNoIHRoZSBmaWxlIHBhcnQuICBMb29rcyBmb3IKICAgICAgICoqIENvbnRlbnQtTGVuZ3RoIGhlYWRlciB0b28uCiAgICAgICAqLwogICAgICBmb3IgKDsgYnl0ZXNfaGFuZGxlZCA8IGJ5dGVzX3JlYWQgJiYgY29ubmVjdGlvbnNbY251bV0uY29ubl9zdGF0ZSA9PSBDTlNUX0hFQURFUlM7ICsrYnl0ZXNfaGFuZGxlZCkgewogICAgICAgIHN3aXRjaCAoY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlKSB7CiAgICAgICAgY2FzZSBIRFNUX0xJTkUxX1BST1RPQ09MOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJyAnOgogICAgICAgICAgY2FzZSAnXHQnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xJTkUxX1dTOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9MSU5FMV9XUzoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICcgJzoKICAgICAgICAgIGNhc2UgJ1x0JzoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICcwJzoKICAgICAgICAgIGNhc2UgJzEnOgogICAgICAgICAgY2FzZSAnMic6CiAgICAgICAgICBjYXNlICczJzoKICAgICAgICAgIGNhc2UgJzQnOgogICAgICAgICAgY2FzZSAnNSc6CiAgICAgICAgICBjYXNlICc2JzoKICAgICAgICAgIGNhc2UgJzcnOgogICAgICAgICAgY2FzZSAnOCc6CiAgICAgICAgICBjYXNlICc5JzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaHR0cF9zdGF0dXMgID0gYnVmW2J5dGVzX2hhbmRsZWRdIC0gJzAnOwogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xJTkUxX1NUQVRVUzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0xJTkUxX1NUQVRVUzoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICcwJzoKICAgICAgICAgIGNhc2UgJzEnOgogICAgICAgICAgY2FzZSAnMic6CiAgICAgICAgICBjYXNlICczJzoKICAgICAgICAgIGNhc2UgJzQnOgogICAgICAgICAgY2FzZSAnNSc6CiAgICAgICAgICBjYXNlICc2JzoKICAgICAgICAgIGNhc2UgJzcnOgogICAgICAgICAgY2FzZSAnOCc6CiAgICAgICAgICBjYXNlICc5JzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaHR0cF9zdGF0dXMgPSBjb25uZWN0aW9uc1tjbnVtXS5odHRwX3N0YXR1cyAqIDEwICsgYnVmW2J5dGVzX2hhbmRsZWRdIC0gJzAnOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQk9MOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1QnOgogICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9URVhUOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0xGOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uY29ubl9zdGF0ZSA9IENOU1RfUkVBRElORzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1QnOgogICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DUjoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1JMRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fc3RhdGUgPSBDTlNUX1JFQURJTkc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1QnOgogICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DUkxGOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uY29ubl9zdGF0ZSA9IENOU1RfUkVBRElORzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1JMRkNSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ0MnOgogICAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdUJzoKICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ1JMRkNSOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uY29ubl9zdGF0ZSA9IENOU1RfUkVBRElORzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdDJzoKICAgICAgICAgIGNhc2UgJ2MnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0M7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnVCc6CiAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0M6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnTyc6CiAgICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DTzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0NPOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ04nOgogICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ09OOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ1QnOgogICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ09OVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdOJzoKICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk47CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05UOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ09OVEU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05URToKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdOJzoKICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTlRFTjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0NPTlRFTjoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdUJzoKICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTlRFTlQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05URU5UOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTlRFTlRfOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OVEVOVF86CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnTCc6CiAgICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05URU5UX0w7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05URU5UX0w6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05URU5UX0xFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OVEVOVF9MRToKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdOJzoKICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTlRFTlRfTEVOOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OVEVOVF9MRU46CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnRyc6CiAgICAgICAgICBjYXNlICdnJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05URU5UX0xFTkc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05URU5UX0xFTkc6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnVCc6CiAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05URU5UX0xFTkdUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OVEVOVF9MRU5HVDoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTlRFTlRfTEVOR1RIOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OVEVOVF9MRU5HVEg6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnOic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ09OVEVOVF9MRU5HVEhfQ09MT047CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05URU5UX0xFTkdUSF9DT0xPTjoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICcgJzoKICAgICAgICAgIGNhc2UgJ1x0JzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05URU5UX0xFTkdUSF9DT0xPTl9XUzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0NPTlRFTlRfTEVOR1RIX0NPTE9OX1dTOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJyAnOgogICAgICAgICAgY2FzZSAnXHQnOgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJzAnOgogICAgICAgICAgY2FzZSAnMSc6CiAgICAgICAgICBjYXNlICcyJzoKICAgICAgICAgIGNhc2UgJzMnOgogICAgICAgICAgY2FzZSAnNCc6CiAgICAgICAgICBjYXNlICc1JzoKICAgICAgICAgIGNhc2UgJzYnOgogICAgICAgICAgY2FzZSAnNyc6CiAgICAgICAgICBjYXNlICc4JzoKICAgICAgICAgIGNhc2UgJzknOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5jb250ZW50X2xlbmd0aCA9IGJ1ZltieXRlc19oYW5kbGVkXSAtICcwJzsKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlICAgPSBIRFNUX0NPTlRFTlRfTEVOR1RIX0NPTE9OX1dTX05VTTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0NPTlRFTlRfTEVOR1RIX0NPTE9OX1dTX05VTToKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICcwJzoKICAgICAgICAgIGNhc2UgJzEnOgogICAgICAgICAgY2FzZSAnMic6CiAgICAgICAgICBjYXNlICczJzoKICAgICAgICAgIGNhc2UgJzQnOgogICAgICAgICAgY2FzZSAnNSc6CiAgICAgICAgICBjYXNlICc2JzoKICAgICAgICAgIGNhc2UgJzcnOgogICAgICAgICAgY2FzZSAnOCc6CiAgICAgICAgICBjYXNlICc5JzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uY29udGVudF9sZW5ndGggPSBjb25uZWN0aW9uc1tjbnVtXS5jb250ZW50X2xlbmd0aCAqIDEwICsgYnVmW2J5dGVzX2hhbmRsZWRdIC0gJzAnOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICAvKiBTdHVmZiBmb3IgQ29ubmVjdGlvbjogY2xvc2UgKi8KICAgICAgICBjYXNlIEhEU1RfQ09OTjoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdFJzoKICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OTkU6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05ORUM7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05ORUM6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnVCc6CiAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05ORUNUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OTkVDVDoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdJJzoKICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FQ1RJOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OTkVDVEk6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnTyc6CiAgICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05ORUNUSU87CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05ORUNUSU86CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnTic6CiAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05ORUNUSU9OOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OTkVDVElPTjoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICc6JzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05ORUNUSU9OX0NPTE9OOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OTkVDVElPTl9DT0xPTjoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICcgJzoKICAgICAgICAgIGNhc2UgJ1x0JzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XUzoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdDJzoKICAgICAgICAgIGNhc2UgJ2MnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfQzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdLJzoKICAgICAgICAgIGNhc2UgJ2snOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfSzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfQzoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdMJzoKICAgICAgICAgIGNhc2UgJ2wnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfQ0w7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0NMOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ08nOgogICAgICAgICAgY2FzZSAnbyc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XU19DTE87CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0NMTzoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdTJzoKICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfQ0xPUzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfQ0xPUzoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdFJzoKICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfQ0xPU0U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0NMT1NFOgogICAgICAgICAgLyogR290IHRoZSBjb21wbGV0ZSBIVFRQLzEuMSAiQ29ubmVjdGlvbjogY2xvc2UiIGhlYWRlciwgbWFrZSBzdXJlIHRoaXMKICAgICAgICAgICAgIGlzIHRoZSBsYXN0IHJlcXVlc3Qgb24gdGhpcyBjb25uZWN0aW9uLiAqLwogICAgICAgICAgLyogQ2xvc2UgVG9EbzogRml4IHRoaXMgKi8KICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfSzoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdFJzoKICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfS0U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XU19LRUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRToKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdQJzoKICAgICAgICAgIGNhc2UgJ3AnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfS0VFUDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfS0VFUDoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVBfOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XU19LRUVQXzoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdBJzoKICAgICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfS0VFUF9BOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XU19LRUVQX0E6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnTCc6CiAgICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVBfQUw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVBfQUw6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnSSc6CiAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVBfQUxJOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XU19LRUVQX0FMSToKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdWJzoKICAgICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NPTk5FQ1RJT05fQ09MT05fV1NfS0VFUF9BTElWOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfQ09OTkVDVElPTl9DT0xPTl9XU19LRUVQX0FMSVY6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVBfQUxJVkU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9DT05ORUNUSU9OX0NPTE9OX1dTX0tFRVBfQUxJVkU6CiAgICAgICAgICAvKiBIYW5kbGUgQ29ubmVjdGlvbjoga2VlcC1hbGl2ZSByZXNwb25zZSBoZWFkZXIsIG1ha2UgdGhlCiAgICAgICAgICAgICBjb25uZWN0aW9uIHJldXNhYmxlIGlmIHdlIGhhdmUgc29tZSBrZWVwX2FsaXZlIHF1b3RhIGxlZnQuICovCiAgICAgICAgICAvKiBUb0RvOiBGaXggdGhpcyAqLwogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICAvKiBTdGF0ZXMgZm9yIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkICovCiAgICAgICAgY2FzZSBIRFNUX1Q6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnUic6CiAgICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ0EnOgogICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfVFJBOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ04nOgogICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU46CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UUkFOUzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU5TOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ0YnOgogICAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTlNGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfVFJBTlNGOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTlNGRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU5TRkU6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnUic6CiAgICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UUkFOU0ZFUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU5TRkVSOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RSQU5TRkVSX0RBU0g7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9UUkFOU0ZFUl9EQVNIOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTlNGRVJfREFTSF9FOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfVFJBTlNGRVJfREFTSF9FOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ04nOgogICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTlNGRVJfREFTSF9FTjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU5TRkVSX0RBU0hfRU46CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UUkFOU0ZFUl9EQVNIX0VOQzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ08nOgogICAgICAgICAgY2FzZSAnbyc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ0QnOgogICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0Q6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnSSc6CiAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ04nOgogICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRElOOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRElOOgogICAgICAgICAgc3dpdGNoIChidWZbYnl0ZXNfaGFuZGxlZF0pIHsKICAgICAgICAgIGNhc2UgJ0cnOgogICAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRElORzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkc6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnOic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRElOR19DT0xPTjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkdfQ09MT046CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnICc6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRElOR19DT0xPTl9XUzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkdfQ09MT05fV1M6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OX1dTX0M7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OX1dTX0M6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OX1dTX0NIOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRElOR19DT0xPTl9XU19DSDoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdVJzoKICAgICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkdfQ09MT05fV1NfQ0hVOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRElOR19DT0xPTl9XU19DSFU6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnTic6CiAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OX1dTX0NIVU47CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OX1dTX0NIVU46CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnSyc6CiAgICAgICAgICBjYXNlICdrJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OX1dTX0NIVU5LOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRElOR19DT0xPTl9XU19DSFVOSzoKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdFJzoKICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RSQU5TRkVSX0RBU0hfRU5DT0RJTkdfQ09MT05fV1NfQ0hVTktFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9MRjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdccic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfQ1I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9URVhUOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEhEU1RfVFJBTlNGRVJfREFTSF9FTkNPRElOR19DT0xPTl9XU19DSFVOS0U6CiAgICAgICAgICBzd2l0Y2ggKGJ1ZltieXRlc19oYW5kbGVkXSkgewogICAgICAgICAgY2FzZSAnRCc6CiAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OX1dTX0NIVU5LRUQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0xGOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uaGVhZGVyX3N0YXRlID0gSERTVF9DUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX1RFWFQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSERTVF9UUkFOU0ZFUl9EQVNIX0VOQ09ESU5HX0NPTE9OX1dTX0NIVU5LRUQ6CiAgICAgICAgICAvKiBUb0RvOiB3aGF0IHRvIGRvIGhlcmU/ICovCiAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5jaHVua2VkID0gMTsKICAgICAgICAgIHN3aXRjaCAoYnVmW2J5dGVzX2hhbmRsZWRdKSB7CiAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfTEY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5oZWFkZXJfc3RhdGUgPSBIRFNUX0NSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmhlYWRlcl9zdGF0ZSA9IEhEU1RfVEVYVDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChjb25uZWN0aW9uc1tjbnVtXS5jb25uX3N0YXRlID09IENOU1RfUkVBRElORyAmJiBjb25uZWN0aW9uc1tjbnVtXS5jb250ZW50X2xlbmd0aCA9PSAwKSB7CiNpZmRlZiBERUJVRwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiW2hhbmRsZV9yZWFkXSBjb250ZW50X2xlbmd0aCBpcyAwLCBjbG9zZSBjb25uZWN0aW9uXG4iKTsKI2VuZGlmCiAgICAgICAgaWYgKGNvbm5lY3Rpb25zW2NudW1dLmtlZXBfYWxpdmUgPiAwKQogICAgICAgICAgY29ubmVjdGlvbnNbY251bV0ucmV1c2FibGUgPSAxOwoKICAgICAgICBjbG9zZV9jb25uZWN0aW9uKGNudW0pOwoKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGJyZWFrOwoKICAgIGNhc2UgQ05TVF9SRUFESU5HOgogICAgICBjb25uZWN0aW9uc1tjbnVtXS5ieXRlcyArPSBieXRlc19yZWFkIC0gYnl0ZXNfaGFuZGxlZDsKICAgICAgaWYgKGRvX3Rocm90dGxlKSB7CiAgICAgICAgLyogQ2hlY2sgaWYgd2UncmUgcmVhZGluZyB0b28gZmFzdC4gKi8KICAgICAgICBlbGFwc2VkID0gZGVsdGFfdGltZXZhbCgmY29ubmVjdGlvbnNbY251bV0uc3RhcnRlZF9hdCwgbm93UCkgLyAxMDAwMDAwLjA7CiAgICAgICAgaWYgKGVsYXBzZWQgPiAwLjAxICYmIGNvbm5lY3Rpb25zW2NudW1dLmJ5dGVzIC8gZWxhcHNlZCA+IHRocm90dGxlKSB7CiAgICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5jb25uX3N0YXRlICAgPSBDTlNUX1BBVVNJTkc7CiAgICAgICAgICBjbGllbnRfZGF0YS5pICAgICAgICAgICAgICAgICAgPSBjbnVtOwogICAgICAgICAgY29ubmVjdGlvbnNbY251bV0ud2FrZXVwX3RpbWVyID0gdG1yX2NyZWF0ZShub3dQLCB3YWtldXBfY29ubmVjdGlvbiwgY2xpZW50X2RhdGEsIDEwMDBMLCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRvX2NoZWNrc3VtKSB7CiAgICAgICAgY2hlY2tzdW0gPSBjb25uZWN0aW9uc1tjbnVtXS5jaGVja3N1bTsKICAgICAgICBmb3IgKDsgYnl0ZXNfaGFuZGxlZCA8IGJ5dGVzX3JlYWQ7ICsrYnl0ZXNfaGFuZGxlZCkgewogICAgICAgICAgaWYgKGNoZWNrc3VtICYgMSkKICAgICAgICAgICAgY2hlY2tzdW0gPSAoY2hlY2tzdW0gPj4gMSkgKyAweDgwMDA7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGNoZWNrc3VtID4+PSAxOwogICAgICAgICAgY2hlY2tzdW0gKz0gYnVmW2J5dGVzX2hhbmRsZWRdOwogICAgICAgICAgY2hlY2tzdW0gJj0gMHhmZmZmOwogICAgICAgIH0KICAgICAgICBjb25uZWN0aW9uc1tjbnVtXS5jaGVja3N1bSA9IGNoZWNrc3VtOwogICAgICB9IGVsc2UKICAgICAgICBieXRlc19oYW5kbGVkID0gYnl0ZXNfcmVhZDsKCiAgICAgIC8qIFRoaXMgaXMgYW4gdXR0ZXIgaGFjaywgdG8gdHJ5IHRvIHN1cHBvcnQgY2h1bmtlZCBlbmNvZGluZ3MuLi4gSSBvbmx5CiAgICAgICAgIGV4YW1pbmUgdGhlICJmb290ZXIiLCB0byBzZWUgaWYgaXQgbG9va3MgbGlrZSBhIGNodW5rZWQgImVuZCIuCiAgICAgICAgIFRvRG86IFdlIHNob3VsZCBwcm9wZXJseSBwYXJzZSB0aGUgYm9keSwgYW5kIGZpbmQgdGhlIGNodW5rZWQgc2l6ZXMuICovCiAgICAgIGlmIChjb25uZWN0aW9uc1tjbnVtXS5jaHVua2VkICYmICFzdHJuY21wKGJ1ZiArIGJ5dGVzX3JlYWQgLSA1LCAiMFxyXG5cclxuIiwgNSkpCiAgICAgICAgY29ubmVjdGlvbnNbY251bV0uY29udGVudF9sZW5ndGggPSBjb25uZWN0aW9uc1tjbnVtXS5ieXRlczsKCiAgICAgIGlmIChjb25uZWN0aW9uc1tjbnVtXS5jb250ZW50X2xlbmd0aCAhPSAtMSAmJiBjb25uZWN0aW9uc1tjbnVtXS5ieXRlcyA+PSBjb25uZWN0aW9uc1tjbnVtXS5jb250ZW50X2xlbmd0aCkgewogICAgICAgIGlmIChjb25uZWN0aW9uc1tjbnVtXS5rZWVwX2FsaXZlID4gMCkKICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLnJldXNhYmxlID0gMTsKICAgICAgICBjbG9zZV9jb25uZWN0aW9uKGNudW0pOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAvKiBOb3RoaW5nICovCiAgICAgIGJyZWFrOwogICAgfQogIH0KfQoKc3RhdGljIHZvaWQKaWRsZV9jb25uZWN0aW9uKENsaWVudERhdGEgY2xpZW50X2RhdGEsIHN0cnVjdCB0aW1ldmFsICpub3dQIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQp7CiAgaW50IGNudW07CiAgc3RydWN0IHRpbWV2YWwgdHY7CiAgY2hhciBzdHJUaW1lWzMyXTsKICBzdHJ1Y3QgdG0gbG9jYWx0djsKICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKICBzdHJmdGltZShzdHJUaW1lLCAzMiwgIiVUIiwgbG9jYWx0aW1lX3IoJnR2LnR2X3NlYywgJmxvY2FsdHYpKTsKCiAgY251bSAgICAgICAgICAgICAgICAgICAgICAgICA9IGNsaWVudF9kYXRhLmk7CiAgY29ubmVjdGlvbnNbY251bV0uaWRsZV90aW1lciA9IChUaW1lciAqKTA7CiAgaWYgKHVuaXF1ZV9pZCkgewogICAgKHZvaWQpZnByaW50ZihzdGRlcnIsICJbJXMuJWxsZF0gJXM6IHRpbWVkIG91dCAoJWQgc2VjKSBpbiBzdGF0ZSAlZCwgcmVxdWVzdHMgJWQsIHVuaXF1ZSBpZDogJXVcbiIsIHN0clRpbWUsCiAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdHYudHZfdXNlYywgdXJsc1tjb25uZWN0aW9uc1tjbnVtXS51cmxfbnVtXS51cmxfc3RyLCBpZGxlX3NlY3MsIGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fc3RhdGUsCiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLnN0YXRzLnJlcXVlc3RzX3Blcl9jb25uZWN0aW9uLCBjb25uZWN0aW9uc1tjbnVtXS51bmlxdWVfaWQpOwogIH0gZWxzZSB7CiAgICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIlslcy4lbGxkXSAlczogdGltZWQgb3V0ICglZCBzZWMpIGluIHN0YXRlICVkLCByZXF1ZXN0cyAlZFxuIiwgc3RyVGltZSwgKGxvbmcgbG9uZyl0di50dl91c2VjLAogICAgICAgICAgICAgICAgICB1cmxzW2Nvbm5lY3Rpb25zW2NudW1dLnVybF9udW1dLnVybF9zdHIsIGlkbGVfc2VjcywgY29ubmVjdGlvbnNbY251bV0uY29ubl9zdGF0ZSwKICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnNbY251bV0uc3RhdHMucmVxdWVzdHNfcGVyX2Nvbm5lY3Rpb24pOwogIH0KICBjb25uZWN0aW9uc1tjbnVtXS5yZXVzYWJsZSA9IDA7CiAgY2xvc2VfY29ubmVjdGlvbihjbnVtKTsKICArK3RvdGFsX3RpbWVvdXRzOwp9CgpzdGF0aWMgdm9pZAp3YWtldXBfY29ubmVjdGlvbihDbGllbnREYXRhIGNsaWVudF9kYXRhLCBzdHJ1Y3QgdGltZXZhbCAqbm93UCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKewogIGludCBjbnVtOwoKICBjbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjbGllbnRfZGF0YS5pOwogIGNvbm5lY3Rpb25zW2NudW1dLndha2V1cF90aW1lciA9IChUaW1lciAqKTA7CiAgY29ubmVjdGlvbnNbY251bV0uY29ubl9zdGF0ZSAgID0gQ05TVF9SRUFESU5HOwp9CgpzdGF0aWMgdm9pZApjbG9zZV9jb25uZWN0aW9uKGludCBjbnVtKQp7CiAgaW50IHVybF9udW07CgogIGlmICghY29ubmVjdGlvbnNbY251bV0ucmV1c2FibGUpIHsKICAgIHN0cnVjdCBlcG9sbF9ldmVudCBldjsKCiAgICBldi5ldmVudHMgICA9IEVQT0xMSU4gfCBFUE9MTE9VVDsKICAgIGV2LmRhdGEudTMyID0gY251bTsKICAgIGlmIChlcG9sbF9jdGwoZXBmZCwgRVBPTExfQ1RMX0RFTCwgY29ubmVjdGlvbnNbY251bV0uY29ubl9mZCwgJmV2KSA8IDApCiAgICAgIHBlcnJvcigiZXBvbGwgZGVsZXRlIGZkIik7CiAgICBpZiAodXJsc1tjb25uZWN0aW9uc1tjbnVtXS51cmxfbnVtXS5wcm90b2NvbCA9PSBQUk9UT19IVFRQUykKICAgICAgU1NMX2ZyZWUoY29ubmVjdGlvbnNbY251bV0uc3NsKTsKICAgICh2b2lkKWNsb3NlKGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fZmQpOwogIH0gZWxzZSB7CiAgICAtLWNvbm5lY3Rpb25zW2NudW1dLmtlZXBfYWxpdmU7CiAgfQogIGNvbm5lY3Rpb25zW2NudW1dLmNvbm5fc3RhdGUgPSBDTlNUX0ZSRUU7CiAgaWYgKGNvbm5lY3Rpb25zW2NudW1dLmlkbGVfdGltZXIgIT0gKFRpbWVyICopMCkKICAgIHRtcl9jYW5jZWwoY29ubmVjdGlvbnNbY251bV0uaWRsZV90aW1lcik7CiAgaWYgKGNvbm5lY3Rpb25zW2NudW1dLndha2V1cF90aW1lciAhPSAoVGltZXIgKikwKQogICAgdG1yX2NhbmNlbChjb25uZWN0aW9uc1tjbnVtXS53YWtldXBfdGltZXIpOwogIC0tbnVtX2Nvbm5lY3Rpb25zOwogICsrZmV0Y2hlc19jb21wbGV0ZWQ7CiAgdG90YWxfYnl0ZXMgKz0gY29ubmVjdGlvbnNbY251bV0uYnl0ZXM7CiAgaWYgKGNvbm5lY3Rpb25zW2NudW1dLmRpZF9jb25uZWN0KSB7CiAgICBsb25nIGxvbmcgY29ubmVjdF91c2VjcyA9IGRlbHRhX3RpbWV2YWwoJmNvbm5lY3Rpb25zW2NudW1dLmNvbm5lY3RfYXQsICZjb25uZWN0aW9uc1tjbnVtXS5yZXF1ZXN0X2F0KTsKICAgIC8qCiAgICAgICAgICAgIGlmICggY29ubmVjdF91c2VjcyA+ICggbWF4X2Nvbm5lY3RfdXNlY3MgPDwgMyApICYmIG1heF9jb25uZWN0X3VzZWNzICkKICAgICAgICAgICAgICAgIGNvbm5lY3RfdXNlY3MgPSBtYXhfY29ubmVjdF91c2VjczsKICAgICovCiAgICB0b3RhbF9jb25uZWN0X3VzZWNzICs9IGNvbm5lY3RfdXNlY3M7CiAgICBtYXhfY29ubmVjdF91c2VjcyA9IG1heChtYXhfY29ubmVjdF91c2VjcywgY29ubmVjdF91c2Vjcyk7CiAgICBtaW5fY29ubmVjdF91c2VjcyA9IG1pbihtaW5fY29ubmVjdF91c2VjcywgY29ubmVjdF91c2Vjcyk7CiAgICArK2Nvbm5lY3RzX2NvbXBsZXRlZDsKICB9CiAgaWYgKGNvbm5lY3Rpb25zW2NudW1dLmRpZF9yZXNwb25zZSkgewogICAgbG9uZyBsb25nIHJlc3BvbnNlX3VzZWNzID0gZGVsdGFfdGltZXZhbCgmY29ubmVjdGlvbnNbY251bV0ucmVxdWVzdF9hdCwgJmNvbm5lY3Rpb25zW2NudW1dLnJlc3BvbnNlX2F0KTsKICAgIC8qCiAgICAgICAgICAgIGlmICggcmVzcG9uc2VfdXNlY3MgPiAoIG1heF9yZXNwb25zZV91c2VjcyA8PCAxICkgJiYgbWF4X3Jlc3BvbnNlX3VzZWNzICkKICAgICAgICAgICAgICAgIHJlc3BvbnNlX3VzZWNzID0gbWF4X3Jlc3BvbnNlX3VzZWNzOwogICAgKi8KICAgIHRvdGFsX3Jlc3BvbnNlX3VzZWNzICs9IHJlc3BvbnNlX3VzZWNzOwogICAgbWF4X3Jlc3BvbnNlX3VzZWNzID0gbWF4KG1heF9yZXNwb25zZV91c2VjcywgcmVzcG9uc2VfdXNlY3MpOwogICAgbWluX3Jlc3BvbnNlX3VzZWNzID0gbWluKG1pbl9yZXNwb25zZV91c2VjcywgcmVzcG9uc2VfdXNlY3MpOwogICAgKytyZXNwb25zZXNfY29tcGxldGVkOwogIH0KICBpZiAoY29ubmVjdGlvbnNbY251bV0uaHR0cF9zdGF0dXMgPj0gMCAmJiBjb25uZWN0aW9uc1tjbnVtXS5odHRwX3N0YXR1cyA8PSA5OTkpIHsKICAgICsraHR0cF9zdGF0dXNfY291bnRzW2Nvbm5lY3Rpb25zW2NudW1dLmh0dHBfc3RhdHVzXTsKICAgIGNvbm5lY3Rpb25zW2NudW1dLnN0YXRzLnJlc3BvbnNlcysrOwogIH0KCiAgdXJsX251bSA9IGNvbm5lY3Rpb25zW2NudW1dLnVybF9udW07CgogIC8qIE9ubHkgY2hlY2sgdG8gdXBkYXRlIGdvdF9ieXRlcywgYnl0ZSBjb3VudCBlcnJvcnMgYW5kL29yIGNoZWNrc3VtcwogICAgIGlmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIChpLmUuIG5vIEhUVFAgZXJyb3IpLiAqLwogIGlmIChjb25uZWN0aW9uc1tjbnVtXS5odHRwX3N0YXR1cyA+PSAwICYmIGNvbm5lY3Rpb25zW2NudW1dLmh0dHBfc3RhdHVzIDwgNDAwKSB7CiAgICBpZiAoZG9fY2hlY2tzdW0pIHsKICAgICAgaWYgKCF1cmxzW3VybF9udW1dLmdvdF9jaGVja3N1bSkgewogICAgICAgIHVybHNbdXJsX251bV0uY2hlY2tzdW0gICAgID0gY29ubmVjdGlvbnNbY251bV0uY2hlY2tzdW07CiAgICAgICAgdXJsc1t1cmxfbnVtXS5nb3RfY2hlY2tzdW0gPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChjb25uZWN0aW9uc1tjbnVtXS5jaGVja3N1bSAhPSB1cmxzW3VybF9udW1dLmNoZWNrc3VtKSB7CiAgICAgICAgICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBjaGVja3N1bSB3cm9uZ1xuIiwgdXJsc1t1cmxfbnVtXS51cmxfc3RyKTsKICAgICAgICAgICsrdG90YWxfYmFkY2hlY2tzdW1zOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKCF1cmxzW3VybF9udW1dLmdvdF9ieXRlcykgewogICAgICAgIHVybHNbdXJsX251bV0uYnl0ZXMgICAgID0gY29ubmVjdGlvbnNbY251bV0uYnl0ZXM7CiAgICAgICAgdXJsc1t1cmxfbnVtXS5nb3RfYnl0ZXMgPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChjb25uZWN0aW9uc1tjbnVtXS5ieXRlcyAhPSB1cmxzW3VybF9udW1dLmJ5dGVzKSB7CiAgICAgICAgICBpZiAoIWlnbm9yZV9ieXRlcykKICAgICAgICAgICAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogYnl0ZSBjb3VudCB3cm9uZyAoZXhwZWN0ZWQgJWxkLCBnb3QgJWxkKVxuIiwgdXJsc1t1cmxfbnVtXS51cmxfc3RyLCB1cmxzW3VybF9udW1dLmJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zW2NudW1dLmJ5dGVzKTsKICAgICAgICAgICsrdG90YWxfYmFkYnl0ZXM7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpzdGF0aWMgdm9pZApwcm9ncmVzc19yZXBvcnQoQ2xpZW50RGF0YSBjbGllbnRfZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IHRpbWV2YWwgKm5vd1AgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCnsKICBmbG9hdCBlbGFwc2VkOwoKICBlbGFwc2VkID0gZGVsdGFfdGltZXZhbCgmc3RhcnRfYXQsIG5vd1ApIC8gMTAwMDAwMC4wOwogICh2b2lkKWZwcmludGYoc3RkZXJyLCAiLS0tICVnIHNlY3MsICVkIGZldGNoZXMgc3RhcnRlZCwgJWQgY29tcGxldGVkLCAlZCBjdXJyZW50XG4iLCBlbGFwc2VkLCBmZXRjaGVzX3N0YXJ0ZWQsIGZldGNoZXNfY29tcGxldGVkLAogICAgICAgICAgICAgICAgbnVtX2Nvbm5lY3Rpb25zKTsKfQoKc3RhdGljIHZvaWQKc3RhcnRfdGltZXIoQ2xpZW50RGF0YSBjbGllbnRfZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IHRpbWV2YWwgKm5vd1AgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCnsKICBzdGFydF9jb25uZWN0aW9uKG5vd1ApOwogIGlmIChkb19qaXR0ZXIpCiAgICAodm9pZCl0bXJfY3JlYXRlKG5vd1AsIHN0YXJ0X3RpbWVyLCBKdW5rQ2xpZW50RGF0YSwgKGxvbmcpKHJhbmRvbSgpICUgcmFuZ2VfaW50ZXJ2YWwpICsgbG93X2ludGVydmFsLCAwKTsKfQoKc3RhdGljIHZvaWQKZW5kX3RpbWVyKENsaWVudERhdGEgY2xpZW50X2RhdGEgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHN0cnVjdCB0aW1ldmFsICpub3dQIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQp7CiAgZmluaXNoKG5vd1ApOwp9CgpzdGF0aWMgdm9pZApmaW5pc2goc3RydWN0IHRpbWV2YWwgKm5vd1ApCnsKICBmbG9hdCBlbGFwc2VkOwogIGludCBpOwoKICAvKiBSZXBvcnQgc3RhdGlzdGljcy4gKi8KICBlbGFwc2VkID0gZGVsdGFfdGltZXZhbCgmc3RhcnRfYXQsIG5vd1ApIC8gMTAwMDAwMC4wOwogICh2b2lkKXByaW50ZigiJWQgZmV0Y2hlcyBvbiAlZCBjb25ucywgJWQgbWF4IHBhcmFsbGVsLCAlZyBieXRlcywgaW4gJWcgc2Vjb25kc1xuIiwgZmV0Y2hlc19jb21wbGV0ZWQsIGNvbm5lY3RzX2NvbXBsZXRlZCwKICAgICAgICAgICAgICAgbWF4X3BhcmFsbGVsLCAoZmxvYXQpdG90YWxfYnl0ZXMsIGVsYXBzZWQpOwogIGlmIChmZXRjaGVzX2NvbXBsZXRlZCA+IDApCiAgICAodm9pZClwcmludGYoIiVnIG1lYW4gYnl0ZXMvZmV0Y2hcbiIsIChmbG9hdCl0b3RhbF9ieXRlcyAvIChmbG9hdClmZXRjaGVzX2NvbXBsZXRlZCk7CiAgaWYgKGVsYXBzZWQgPiAwLjAxKSB7CiAgICAodm9pZClwcmludGYoIiVnIGZldGNoZXMvc2VjLCAlZyBieXRlcy9zZWNcbiIsIChmbG9hdClmZXRjaGVzX2NvbXBsZXRlZCAvIGVsYXBzZWQsIChmbG9hdCl0b3RhbF9ieXRlcyAvIGVsYXBzZWQpOwogIH0KICBpZiAoY29ubmVjdHNfY29tcGxldGVkID4gMCkKICAgICh2b2lkKXByaW50ZigibXNlY3MvY29ubmVjdDogJWcgbWVhbiwgJWcgbWF4LCAlZyBtaW5cbiIsIChmbG9hdCl0b3RhbF9jb25uZWN0X3VzZWNzIC8gKGZsb2F0KWNvbm5lY3RzX2NvbXBsZXRlZCAvIDEwMDAuMCwKICAgICAgICAgICAgICAgICAoZmxvYXQpbWF4X2Nvbm5lY3RfdXNlY3MgLyAxMDAwLjAsIChmbG9hdCltaW5fY29ubmVjdF91c2VjcyAvIDEwMDAuMCk7CiAgaWYgKHJlc3BvbnNlc19jb21wbGV0ZWQgPiAwKQogICAgKHZvaWQpcHJpbnRmKCJtc2Vjcy9maXJzdC1yZXNwb25zZTogJWcgbWVhbiwgJWcgbWF4LCAlZyBtaW5cbiIsCiAgICAgICAgICAgICAgICAgKGZsb2F0KXRvdGFsX3Jlc3BvbnNlX3VzZWNzIC8gKGZsb2F0KXJlc3BvbnNlc19jb21wbGV0ZWQgLyAxMDAwLjAsIChmbG9hdCltYXhfcmVzcG9uc2VfdXNlY3MgLyAxMDAwLjAsCiAgICAgICAgICAgICAgICAgKGZsb2F0KW1pbl9yZXNwb25zZV91c2VjcyAvIDEwMDAuMCk7CiAgaWYgKHRvdGFsX3RpbWVvdXRzICE9IDApCiAgICAodm9pZClwcmludGYoIiVkIHRpbWVvdXRzXG4iLCB0b3RhbF90aW1lb3V0cyk7CiAgaWYgKGRvX2NoZWNrc3VtKSB7CiAgICBpZiAodG90YWxfYmFkY2hlY2tzdW1zICE9IDApCiAgICAgICh2b2lkKXByaW50ZigiJWQgYmFkIGNoZWNrc3Vtc1xuIiwgdG90YWxfYmFkY2hlY2tzdW1zKTsKICB9IGVsc2UgewogICAgaWYgKHRvdGFsX2JhZGJ5dGVzICE9IDApCiAgICAgICh2b2lkKXByaW50ZigiJWQgYmFkIGJ5dGUgY291bnRzXG4iLCB0b3RhbF9iYWRieXRlcyk7CiAgfQoKICAodm9pZClwcmludGYoIkhUVFAgcmVzcG9uc2UgY29kZXM6XG4iKTsKICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKQogICAgaWYgKGh0dHBfc3RhdHVzX2NvdW50c1tpXSA+IDApCiAgICAgICh2b2lkKXByaW50ZigiICBjb2RlICUwM2QgLS0gJWRcbiIsIGksIGh0dHBfc3RhdHVzX2NvdW50c1tpXSk7CiAgaWYgKGRvX3ZlcmJvc2UpIHsKICAgICh2b2lkKXByaW50ZigiU29ja2V0IHNsb3Qgc3RhdHM6XG4iKTsKICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfY29ubmVjdGlvbnM7IGkrKykKICAgICAgaWYgKGNvbm5lY3Rpb25zW2ldLnN0YXRzLmNvbm5lY3Rpb25zID4gMCkKICAgICAgICAodm9pZClwcmludGYoIiAgc2xvdCAlMDRkIC0tICVkIGNvbm5lY3Rpb25zLCAlZCByZXF1ZXN0cywgJWQgcmVzcG9uc2VzXG4iLCBpLCBjb25uZWN0aW9uc1tpXS5zdGF0cy5jb25uZWN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnNbaV0uc3RhdHMucmVxdWVzdHMsIGNvbm5lY3Rpb25zW2ldLnN0YXRzLnJlc3BvbnNlcyk7CiAgfQoKICB0bXJfZGVzdHJveSgpOwogIGlmIChzc2xfY3R4ICE9IChTU0xfQ1RYICopMCkKICAgIFNTTF9DVFhfZnJlZShzc2xfY3R4KTsKICBleGl0KDApOwp9CgpzdGF0aWMgbG9uZyBsb25nCmRlbHRhX3RpbWV2YWwoc3RydWN0IHRpbWV2YWwgKnN0YXJ0LCBzdHJ1Y3QgdGltZXZhbCAqZmluaXNoKQp7CiAgbG9uZyBsb25nIGRlbHRhX3NlY3MgID0gZmluaXNoLT50dl9zZWMgLSBzdGFydC0+dHZfc2VjOwogIGxvbmcgbG9uZyBkZWx0YV91c2VjcyA9IGZpbmlzaC0+dHZfdXNlYyAtIHN0YXJ0LT50dl91c2VjOwogIHJldHVybiBkZWx0YV9zZWNzICogKGxvbmcgbG9uZykxMDAwMDAwTCArIGRlbHRhX3VzZWNzOwp9CgpzdGF0aWMgdm9pZCAqCm1hbGxvY19jaGVjayhzaXplX3Qgc2l6ZSkKewogIHZvaWQgKnB0ciA9IG1hbGxvYyhzaXplKTsKICBjaGVjayhwdHIpOwogIHJldHVybiBwdHI7Cn0KCnN0YXRpYyB2b2lkICoKcmVhbGxvY19jaGVjayh2b2lkICpwdHIsIHNpemVfdCBzaXplKQp7CiAgcHRyID0gcmVhbGxvYyhwdHIsIHNpemUpOwogIGNoZWNrKHB0cik7CiAgcmV0dXJuIHB0cjsKfQoKc3RhdGljIGNoYXIgKgpzdHJkdXBfY2hlY2soY2hhciAqc3RyKQp7CiAgc3RyID0gc3RyZHVwKHN0cik7CiAgY2hlY2soKHZvaWQgKilzdHIpOwogIHJldHVybiBzdHI7Cn0KCnN0YXRpYyB2b2lkCmNoZWNrKHZvaWQgKnB0cikKewogIGlmIChwdHIgPT0gKHZvaWQgKikwKSB7CiAgICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBhcmd2MCk7CiAgICBleGl0KDEpOwogIH0KfQo=