LyoNCg0KQ29weXJpZ2h0IChjKSAyMDEzLCBNaWNoYWVsIEJvc3RvY2sNCkFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQoNCiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzDQogIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KDQoqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCg0KKiBUaGUgbmFtZSBNaWNoYWVsIEJvc3RvY2sgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cw0KICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiDQpBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQpJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUNCkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE1JQ0hBRUwgQk9TVE9DSyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQpJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywNCkJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQpEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZDQpPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCg0KKi8NCg0KKGZ1bmN0aW9uKCl7aWYgKCFEYXRlLm5vdykgRGF0ZS5ub3cgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuICtuZXcgRGF0ZTsNCn07DQp0cnkgew0KICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsIDAsICIiKTsNCn0gY2F0Y2ggKGVycm9yKSB7DQogIHZhciBkM19zdHlsZV9wcm90b3R5cGUgPSBDU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSwNCiAgICAgIGQzX3N0eWxlX3NldFByb3BlcnR5ID0gZDNfc3R5bGVfcHJvdG90eXBlLnNldFByb3BlcnR5Ow0KICBkM19zdHlsZV9wcm90b3R5cGUuc2V0UHJvcGVydHkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsNCiAgICBkM19zdHlsZV9zZXRQcm9wZXJ0eS5jYWxsKHRoaXMsIG5hbWUsIHZhbHVlICsgIiIsIHByaW9yaXR5KTsNCiAgfTsNCn0NCmQzID0ge3ZlcnNpb246ICIyLjguMSJ9OyAvLyBzZW12ZXINCmZ1bmN0aW9uIGQzX2NsYXNzKGN0b3IsIHByb3BlcnRpZXMpIHsNCiAgdHJ5IHsNCiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykgew0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0b3IucHJvdG90eXBlLCBrZXksIHsNCiAgICAgICAgdmFsdWU6IHByb3BlcnRpZXNba2V5XSwNCiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UNCiAgICAgIH0pOw0KICAgIH0NCiAgfSBjYXRjaCAoZSkgew0KICAgIGN0b3IucHJvdG90eXBlID0gcHJvcGVydGllczsNCiAgfQ0KfQ0KdmFyIGQzX2FycmF5ID0gZDNfYXJyYXlTbGljZTsgLy8gY29udmVyc2lvbiBmb3IgTm9kZUxpc3RzDQoNCmZ1bmN0aW9uIGQzX2FycmF5Q29weShwc2V1ZG9hcnJheSkgew0KICB2YXIgaSA9IC0xLCBuID0gcHNldWRvYXJyYXkubGVuZ3RoLCBhcnJheSA9IFtdOw0KICB3aGlsZSAoKytpIDwgbikgYXJyYXkucHVzaChwc2V1ZG9hcnJheVtpXSk7DQogIHJldHVybiBhcnJheTsNCn0NCg0KZnVuY3Rpb24gZDNfYXJyYXlTbGljZShwc2V1ZG9hcnJheSkgew0KICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocHNldWRvYXJyYXkpOw0KfQ0KDQp0cnkgew0KICBkM19hcnJheShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcylbMF0ubm9kZVR5cGU7DQp9IGNhdGNoKGUpIHsNCiAgZDNfYXJyYXkgPSBkM19hcnJheUNvcHk7DQp9DQoNCnZhciBkM19hcnJheVN1YmNsYXNzID0gW10uX19wcm90b19fPw0KDQovLyBVbnRpbCBFQ01BU2NyaXB0IHN1cHBvcnRzIGFycmF5IHN1YmNsYXNzaW5nLCBwcm90b3R5cGUgaW5qZWN0aW9uIHdvcmtzIHdlbGwuDQpmdW5jdGlvbihhcnJheSwgcHJvdG90eXBlKSB7DQogIGFycmF5Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsNCn06DQoNCi8vIEFuZCBpZiB5b3VyIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IF9fcHJvdG9fXywgd2UnbGwgdXNlIGRpcmVjdCBleHRlbnNpb24uDQpmdW5jdGlvbihhcnJheSwgcHJvdG90eXBlKSB7DQogIGZvciAodmFyIHByb3BlcnR5IGluIHByb3RvdHlwZSkgYXJyYXlbcHJvcGVydHldID0gcHJvdG90eXBlW3Byb3BlcnR5XTsNCn07DQpkMy5tYXAgPSBmdW5jdGlvbihvYmplY3QpIHsNCiAgdmFyIG1hcCA9IG5ldyBkM19NYXA7DQogIGZvciAodmFyIGtleSBpbiBvYmplY3QpIG1hcC5zZXQoa2V5LCBvYmplY3Rba2V5XSk7DQogIHJldHVybiBtYXA7DQp9Ow0KDQpmdW5jdGlvbiBkM19NYXAoKSB7fQ0KDQpkM19jbGFzcyhkM19NYXAsIHsNCiAgaGFzOiBmdW5jdGlvbihrZXkpIHsNCiAgICByZXR1cm4gZDNfbWFwX3ByZWZpeCArIGtleSBpbiB0aGlzOw0KICB9LA0KICBnZXQ6IGZ1bmN0aW9uKGtleSkgew0KICAgIHJldHVybiB0aGlzW2QzX21hcF9wcmVmaXggKyBrZXldOw0KICB9LA0KICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsNCiAgICByZXR1cm4gdGhpc1tkM19tYXBfcHJlZml4ICsga2V5XSA9IHZhbHVlOw0KICB9LA0KICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgew0KICAgIGtleSA9IGQzX21hcF9wcmVmaXggKyBrZXk7DQogICAgcmV0dXJuIGtleSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW2tleV07DQogIH0sDQogIGtleXM6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBrZXlzID0gW107DQogICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgeyBrZXlzLnB1c2goa2V5KTsgfSk7DQogICAgcmV0dXJuIGtleXM7DQogIH0sDQogIHZhbHVlczogZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlcyA9IFtdOw0KICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7IHZhbHVlcy5wdXNoKHZhbHVlKTsgfSk7DQogICAgcmV0dXJuIHZhbHVlczsNCiAgfSwNCiAgZW50cmllczogZnVuY3Rpb24oKSB7DQogICAgdmFyIGVudHJpZXMgPSBbXTsNCiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeyBlbnRyaWVzLnB1c2goe2tleToga2V5LCB2YWx1ZTogdmFsdWV9KTsgfSk7DQogICAgcmV0dXJuIGVudHJpZXM7DQogIH0sDQogIGZvckVhY2g6IGZ1bmN0aW9uKGYpIHsNCiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykgew0KICAgICAgaWYgKGtleS5jaGFyQ29kZUF0KDApID09PSBkM19tYXBfcHJlZml4Q29kZSkgew0KICAgICAgICBmLmNhbGwodGhpcywga2V5LnN1YnN0cmluZygxKSwgdGhpc1trZXldKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0pOw0KDQp2YXIgZDNfbWFwX3ByZWZpeCA9ICJcMCIsIC8vIHByZXZlbnQgY29sbGlzaW9uIHdpdGggYnVpbHQtaW5zDQogICAgZDNfbWFwX3ByZWZpeENvZGUgPSBkM19tYXBfcHJlZml4LmNoYXJDb2RlQXQoMCk7DQpmdW5jdGlvbiBkM190aGlzKCkgew0KICByZXR1cm4gdGhpczsNCn0NCmQzLmZ1bmN0b3IgPSBmdW5jdGlvbih2KSB7DQogIHJldHVybiB0eXBlb2YgdiA9PT0gImZ1bmN0aW9uIiA/IHYgOiBmdW5jdGlvbigpIHsgcmV0dXJuIHY7IH07DQp9Ow0KLy8gQ29waWVzIGEgdmFyaWFibGUgbnVtYmVyIG9mIG1ldGhvZHMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0Lg0KZDMucmViaW5kID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsNCiAgdmFyIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgbWV0aG9kOw0KICB3aGlsZSAoKytpIDwgbikgdGFyZ2V0W21ldGhvZCA9IGFyZ3VtZW50c1tpXV0gPSBkM19yZWJpbmQodGFyZ2V0LCBzb3VyY2UsIHNvdXJjZVttZXRob2RdKTsNCiAgcmV0dXJuIHRhcmdldDsNCn07DQoNCi8vIE1ldGhvZCBpcyBhc3N1bWVkIHRvIGJlIGEgc3RhbmRhcmQgRDMgZ2V0dGVyLXNldHRlcjoNCi8vIElmIHBhc3NlZCB3aXRoIG5vIGFyZ3VtZW50cywgZ2V0cyB0aGUgdmFsdWUuDQovLyBJZiBwYXNzZWQgd2l0aCBhcmd1bWVudHMsIHNldHMgdGhlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSB0YXJnZXQuDQpmdW5jdGlvbiBkM19yZWJpbmQodGFyZ2V0LCBzb3VyY2UsIG1ldGhvZCkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlID0gbWV0aG9kLmFwcGx5KHNvdXJjZSwgYXJndW1lbnRzKTsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRhcmdldCA6IHZhbHVlOw0KICB9Ow0KfQ0KZDMuYXNjZW5kaW5nID0gZnVuY3Rpb24oYSwgYikgew0KICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47DQp9Ow0KZDMuZGVzY2VuZGluZyA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOOw0KfTsNCmQzLm1lYW4gPSBmdW5jdGlvbihhcnJheSwgZikgew0KICB2YXIgbiA9IGFycmF5Lmxlbmd0aCwNCiAgICAgIGEsDQogICAgICBtID0gMCwNCiAgICAgIGkgPSAtMSwNCiAgICAgIGogPSAwOw0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgew0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoZDNfbnVtYmVyKGEgPSBhcnJheVtpXSkpIG0gKz0gKGEgLSBtKSAvICsrajsNCiAgfSBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKGQzX251bWJlcihhID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpKSBtICs9IChhIC0gbSkgLyArK2o7DQogIH0NCiAgcmV0dXJuIGogPyBtIDogdW5kZWZpbmVkOw0KfTsNCmQzLm1lZGlhbiA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7DQogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgYXJyYXkgPSBhcnJheS5tYXAoZik7DQogIGFycmF5ID0gYXJyYXkuZmlsdGVyKGQzX251bWJlcik7DQogIHJldHVybiBhcnJheS5sZW5ndGggPyBkMy5xdWFudGlsZShhcnJheS5zb3J0KGQzLmFzY2VuZGluZyksIC41KSA6IHVuZGVmaW5lZDsNCn07DQpkMy5taW4gPSBmdW5jdGlvbihhcnJheSwgZikgew0KICB2YXIgaSA9IC0xLA0KICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCiAgICAgIGEsDQogICAgICBiOw0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgew0KICAgIHdoaWxlICgrK2kgPCBuICYmICgoYSA9IGFycmF5W2ldKSA9PSBudWxsIHx8IGEgIT0gYSkpIGEgPSB1bmRlZmluZWQ7DQogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjsNCiAgfSBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gdW5kZWZpbmVkOw0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBhID4gYikgYSA9IGI7DQogIH0NCiAgcmV0dXJuIGE7DQp9Ow0KZDMubWF4ID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCiAgdmFyIGkgPSAtMSwNCiAgICAgIG4gPSBhcnJheS5sZW5ndGgsDQogICAgICBhLA0KICAgICAgYjsNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsNCiAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBhcnJheVtpXSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gdW5kZWZpbmVkOw0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID4gYSkgYSA9IGI7DQogIH0gZWxzZSB7DQogICAgd2hpbGUgKCsraSA8IG4gJiYgKChhID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpID09IG51bGwgfHwgYSAhPSBhKSkgYSA9IHVuZGVmaW5lZDsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwgJiYgYiA+IGEpIGEgPSBiOw0KICB9DQogIHJldHVybiBhOw0KfTsNCmQzLmV4dGVudCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7DQogIHZhciBpID0gLTEsDQogICAgICBuID0gYXJyYXkubGVuZ3RoLA0KICAgICAgYSwNCiAgICAgIGIsDQogICAgICBjOw0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgew0KICAgIHdoaWxlICgrK2kgPCBuICYmICgoYSA9IGMgPSBhcnJheVtpXSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gYyA9IHVuZGVmaW5lZDsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwpIHsNCiAgICAgIGlmIChhID4gYikgYSA9IGI7DQogICAgICBpZiAoYyA8IGIpIGMgPSBiOw0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBjID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpID09IG51bGwgfHwgYSAhPSBhKSkgYSA9IHVuZGVmaW5lZDsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwpIHsNCiAgICAgIGlmIChhID4gYikgYSA9IGI7DQogICAgICBpZiAoYyA8IGIpIGMgPSBiOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gW2EsIGNdOw0KfTsNCmQzLnJhbmRvbSA9IHsNCiAgbm9ybWFsOiBmdW5jdGlvbihtZWFuLCBkZXZpYXRpb24pIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGRldmlhdGlvbiA9IDE7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSBtZWFuID0gMDsNCiAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgeCwgeSwgcjsNCiAgICAgIGRvIHsNCiAgICAgICAgeCA9IE1hdGgucmFuZG9tKCkgKiAyIC0gMTsNCiAgICAgICAgeSA9IE1hdGgucmFuZG9tKCkgKiAyIC0gMTsNCiAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7DQogICAgICB9IHdoaWxlICghciB8fCByID4gMSk7DQogICAgICByZXR1cm4gbWVhbiArIGRldmlhdGlvbiAqIHggKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpOw0KICAgIH07DQogIH0NCn07DQpmdW5jdGlvbiBkM19udW1iZXIoeCkgew0KICByZXR1cm4geCAhPSBudWxsICYmICFpc05hTih4KTsNCn0NCmQzLnN1bSA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7DQogIHZhciBzID0gMCwNCiAgICAgIG4gPSBhcnJheS5sZW5ndGgsDQogICAgICBhLA0KICAgICAgaSA9IC0xOw0KDQogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7DQogICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9ICthcnJheVtpXSkpIHMgKz0gYTsNCiAgfSBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gK2YuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSkgcyArPSBhOw0KICB9DQoNCiAgcmV0dXJuIHM7DQp9Ow0KLy8gUi03IHBlciA8aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9RdWFudGlsZT4NCmQzLnF1YW50aWxlID0gZnVuY3Rpb24odmFsdWVzLCBwKSB7DQogIHZhciBIID0gKHZhbHVlcy5sZW5ndGggLSAxKSAqIHAgKyAxLA0KICAgICAgaCA9IE1hdGguZmxvb3IoSCksDQogICAgICB2ID0gdmFsdWVzW2ggLSAxXSwNCiAgICAgIGUgPSBIIC0gaDsNCiAgcmV0dXJuIGUgPyB2ICsgZSAqICh2YWx1ZXNbaF0gLSB2KSA6IHY7DQp9Ow0KZDMudHJhbnNwb3NlID0gZnVuY3Rpb24obWF0cml4KSB7DQogIHJldHVybiBkMy56aXAuYXBwbHkoZDMsIG1hdHJpeCk7DQp9Ow0KZDMuemlwID0gZnVuY3Rpb24oKSB7DQogIGlmICghKG4gPSBhcmd1bWVudHMubGVuZ3RoKSkgcmV0dXJuIFtdOw0KICBmb3IgKHZhciBpID0gLTEsIG0gPSBkMy5taW4oYXJndW1lbnRzLCBkM196aXBMZW5ndGgpLCB6aXBzID0gbmV3IEFycmF5KG0pOyArK2kgPCBtOykgew0KICAgIGZvciAodmFyIGogPSAtMSwgbiwgemlwID0gemlwc1tpXSA9IG5ldyBBcnJheShuKTsgKytqIDwgbjspIHsNCiAgICAgIHppcFtqXSA9IGFyZ3VtZW50c1tqXVtpXTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIHppcHM7DQp9Ow0KDQpmdW5jdGlvbiBkM196aXBMZW5ndGgoZCkgew0KICByZXR1cm4gZC5sZW5ndGg7DQp9DQpkMy5iaXNlY3RvciA9IGZ1bmN0aW9uKGYpIHsNCiAgcmV0dXJuIHsNCiAgICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsNCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgbG8gPSAwOw0KICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSBoaSA9IGEubGVuZ3RoOw0KICAgICAgd2hpbGUgKGxvIDwgaGkpIHsNCiAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4gMTsNCiAgICAgICAgaWYgKGYuY2FsbChhLCBhW21pZF0sIG1pZCkgPCB4KSBsbyA9IG1pZCArIDE7DQogICAgICAgIGVsc2UgaGkgPSBtaWQ7DQogICAgICB9DQogICAgICByZXR1cm4gbG87DQogICAgfSwNCiAgICByaWdodDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7DQogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGxvID0gMDsNCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkgaGkgPSBhLmxlbmd0aDsNCiAgICAgIHdoaWxlIChsbyA8IGhpKSB7DQogICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+IDE7DQogICAgICAgIGlmICh4IDwgZi5jYWxsKGEsIGFbbWlkXSwgbWlkKSkgaGkgPSBtaWQ7DQogICAgICAgIGVsc2UgbG8gPSBtaWQgKyAxOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGxvOw0KICAgIH0NCiAgfTsNCn07DQoNCnZhciBkM19iaXNlY3RvciA9IGQzLmJpc2VjdG9yKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQ7IH0pOw0KZDMuYmlzZWN0TGVmdCA9IGQzX2Jpc2VjdG9yLmxlZnQ7DQpkMy5iaXNlY3QgPSBkMy5iaXNlY3RSaWdodCA9IGQzX2Jpc2VjdG9yLnJpZ2h0Ow0KZDMuZmlyc3QgPSBmdW5jdGlvbihhcnJheSwgZikgew0KICB2YXIgaSA9IDAsDQogICAgICBuID0gYXJyYXkubGVuZ3RoLA0KICAgICAgYSA9IGFycmF5WzBdLA0KICAgICAgYjsNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIGYgPSBkMy5hc2NlbmRpbmc7DQogIHdoaWxlICgrK2kgPCBuKSB7DQogICAgaWYgKGYuY2FsbChhcnJheSwgYSwgYiA9IGFycmF5W2ldKSA+IDApIHsNCiAgICAgIGEgPSBiOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gYTsNCn07DQpkMy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCiAgdmFyIGkgPSAwLA0KICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCiAgICAgIGEgPSBhcnJheVswXSwNCiAgICAgIGI7DQogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSBmID0gZDMuYXNjZW5kaW5nOw0KICB3aGlsZSAoKytpIDwgbikgew0KICAgIGlmIChmLmNhbGwoYXJyYXksIGEsIGIgPSBhcnJheVtpXSkgPD0gMCkgew0KICAgICAgYSA9IGI7DQogICAgfQ0KICB9DQogIHJldHVybiBhOw0KfTsNCmQzLm5lc3QgPSBmdW5jdGlvbigpIHsNCiAgdmFyIG5lc3QgPSB7fSwNCiAgICAgIGtleXMgPSBbXSwNCiAgICAgIHNvcnRLZXlzID0gW10sDQogICAgICBzb3J0VmFsdWVzLA0KICAgICAgcm9sbHVwOw0KDQogIGZ1bmN0aW9uIG1hcChhcnJheSwgZGVwdGgpIHsNCiAgICBpZiAoZGVwdGggPj0ga2V5cy5sZW5ndGgpIHJldHVybiByb2xsdXANCiAgICAgICAgPyByb2xsdXAuY2FsbChuZXN0LCBhcnJheSkgOiAoc29ydFZhbHVlcw0KICAgICAgICA/IGFycmF5LnNvcnQoc29ydFZhbHVlcykNCiAgICAgICAgOiBhcnJheSk7DQoNCiAgICB2YXIgaSA9IC0xLA0KICAgICAgICBuID0gYXJyYXkubGVuZ3RoLA0KICAgICAgICBrZXkgPSBrZXlzW2RlcHRoKytdLA0KICAgICAgICBrZXlWYWx1ZSwNCiAgICAgICAgb2JqZWN0LA0KICAgICAgICB2YWx1ZXNCeUtleSA9IG5ldyBkM19NYXAsDQogICAgICAgIHZhbHVlcywNCiAgICAgICAgbyA9IHt9Ow0KDQogICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkob2JqZWN0ID0gYXJyYXlbaV0pKSkgew0KICAgICAgICB2YWx1ZXMucHVzaChvYmplY3QpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbb2JqZWN0XSk7DQogICAgICB9DQogICAgfQ0KDQogICAgdmFsdWVzQnlLZXkuZm9yRWFjaChmdW5jdGlvbihrZXlWYWx1ZSkgew0KICAgICAgb1trZXlWYWx1ZV0gPSBtYXAodmFsdWVzQnlLZXkuZ2V0KGtleVZhbHVlKSwgZGVwdGgpOw0KICAgIH0pOw0KDQogICAgcmV0dXJuIG87DQogIH0NCg0KICBmdW5jdGlvbiBlbnRyaWVzKG1hcCwgZGVwdGgpIHsNCiAgICBpZiAoZGVwdGggPj0ga2V5cy5sZW5ndGgpIHJldHVybiBtYXA7DQoNCiAgICB2YXIgYSA9IFtdLA0KICAgICAgICBzb3J0S2V5ID0gc29ydEtleXNbZGVwdGgrK10sDQogICAgICAgIGtleTsNCg0KICAgIGZvciAoa2V5IGluIG1hcCkgew0KICAgICAgYS5wdXNoKHtrZXk6IGtleSwgdmFsdWVzOiBlbnRyaWVzKG1hcFtrZXldLCBkZXB0aCl9KTsNCiAgICB9DQoNCiAgICBpZiAoc29ydEtleSkgYS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsNCiAgICAgIHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7DQogICAgfSk7DQoNCiAgICByZXR1cm4gYTsNCiAgfQ0KDQogIG5lc3QubWFwID0gZnVuY3Rpb24oYXJyYXkpIHsNCiAgICByZXR1cm4gbWFwKGFycmF5LCAwKTsNCiAgfTsNCg0KICBuZXN0LmVudHJpZXMgPSBmdW5jdGlvbihhcnJheSkgew0KICAgIHJldHVybiBlbnRyaWVzKG1hcChhcnJheSwgMCksIDApOw0KICB9Ow0KDQogIG5lc3Qua2V5ID0gZnVuY3Rpb24oZCkgew0KICAgIGtleXMucHVzaChkKTsNCiAgICByZXR1cm4gbmVzdDsNCiAgfTsNCg0KICAvLyBTcGVjaWZpZXMgdGhlIG9yZGVyIGZvciB0aGUgbW9zdC1yZWNlbnRseSBzcGVjaWZpZWQga2V5Lg0KICAvLyBOb3RlOiBvbmx5IGFwcGxpZXMgdG8gZW50cmllcy4gTWFwIGtleXMgYXJlIHVub3JkZXJlZCENCiAgbmVzdC5zb3J0S2V5cyA9IGZ1bmN0aW9uKG9yZGVyKSB7DQogICAgc29ydEtleXNba2V5cy5sZW5ndGggLSAxXSA9IG9yZGVyOw0KICAgIHJldHVybiBuZXN0Ow0KICB9Ow0KDQogIC8vIFNwZWNpZmllcyB0aGUgb3JkZXIgZm9yIGxlYWYgdmFsdWVzLg0KICAvLyBBcHBsaWVzIHRvIGJvdGggbWFwcyBhbmQgZW50cmllcyBhcnJheS4NCiAgbmVzdC5zb3J0VmFsdWVzID0gZnVuY3Rpb24ob3JkZXIpIHsNCiAgICBzb3J0VmFsdWVzID0gb3JkZXI7DQogICAgcmV0dXJuIG5lc3Q7DQogIH07DQoNCiAgbmVzdC5yb2xsdXAgPSBmdW5jdGlvbihmKSB7DQogICAgcm9sbHVwID0gZjsNCiAgICByZXR1cm4gbmVzdDsNCiAgfTsNCg0KICByZXR1cm4gbmVzdDsNCn07DQpkMy5rZXlzID0gZnVuY3Rpb24obWFwKSB7DQogIHZhciBrZXlzID0gW107DQogIGZvciAodmFyIGtleSBpbiBtYXApIGtleXMucHVzaChrZXkpOw0KICByZXR1cm4ga2V5czsNCn07DQpkMy52YWx1ZXMgPSBmdW5jdGlvbihtYXApIHsNCiAgdmFyIHZhbHVlcyA9IFtdOw0KICBmb3IgKHZhciBrZXkgaW4gbWFwKSB2YWx1ZXMucHVzaChtYXBba2V5XSk7DQogIHJldHVybiB2YWx1ZXM7DQp9Ow0KZDMuZW50cmllcyA9IGZ1bmN0aW9uKG1hcCkgew0KICB2YXIgZW50cmllcyA9IFtdOw0KICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goe2tleToga2V5LCB2YWx1ZTogbWFwW2tleV19KTsNCiAgcmV0dXJuIGVudHJpZXM7DQp9Ow0KZDMucGVybXV0ZSA9IGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7DQogIHZhciBwZXJtdXRlcyA9IFtdLA0KICAgICAgaSA9IC0xLA0KICAgICAgbiA9IGluZGV4ZXMubGVuZ3RoOw0KICB3aGlsZSAoKytpIDwgbikgcGVybXV0ZXNbaV0gPSBhcnJheVtpbmRleGVzW2ldXTsNCiAgcmV0dXJuIHBlcm11dGVzOw0KfTsNCmQzLm1lcmdlID0gZnVuY3Rpb24oYXJyYXlzKSB7DQogIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnJheXMpOw0KfTsNCmQzLnNwbGl0ID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCiAgdmFyIGFycmF5cyA9IFtdLA0KICAgICAgdmFsdWVzID0gW10sDQogICAgICB2YWx1ZSwNCiAgICAgIGkgPSAtMSwNCiAgICAgIG4gPSBhcnJheS5sZW5ndGg7DQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgZiA9IGQzX3NwbGl0dGVyOw0KICB3aGlsZSAoKytpIDwgbikgew0KICAgIGlmIChmLmNhbGwodmFsdWVzLCB2YWx1ZSA9IGFycmF5W2ldLCBpKSkgew0KICAgICAgdmFsdWVzID0gW107DQogICAgfSBlbHNlIHsNCiAgICAgIGlmICghdmFsdWVzLmxlbmd0aCkgYXJyYXlzLnB1c2godmFsdWVzKTsNCiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIGFycmF5czsNCn07DQoNCmZ1bmN0aW9uIGQzX3NwbGl0dGVyKGQpIHsNCiAgcmV0dXJuIGQgPT0gbnVsbDsNCn0NCmZ1bmN0aW9uIGQzX2NvbGxhcHNlKHMpIHsNCiAgcmV0dXJuIHMucmVwbGFjZSgvKF5ccyspfChccyskKS9nLCAiIikucmVwbGFjZSgvXHMrL2csICIgIik7DQp9DQpkMy5yYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7DQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgew0KICAgIHN0ZXAgPSAxOw0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgew0KICAgICAgc3RvcCA9IHN0YXJ0Ow0KICAgICAgc3RhcnQgPSAwOw0KICAgIH0NCiAgfQ0KICBpZiAoKHN0b3AgLSBzdGFydCkgLyBzdGVwID09PSBJbmZpbml0eSkgdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpOw0KICB2YXIgcmFuZ2UgPSBbXSwNCiAgICAgICBrID0gZDNfcmFuZ2VfaW50ZWdlclNjYWxlKE1hdGguYWJzKHN0ZXApKSwNCiAgICAgICBpID0gLTEsDQogICAgICAgajsNCiAgc3RhcnQgKj0gaywgc3RvcCAqPSBrLCBzdGVwICo9IGs7DQogIGlmIChzdGVwIDwgMCkgd2hpbGUgKChqID0gc3RhcnQgKyBzdGVwICogKytpKSA+IHN0b3ApIHJhbmdlLnB1c2goaiAvIGspOw0KICBlbHNlIHdoaWxlICgoaiA9IHN0YXJ0ICsgc3RlcCAqICsraSkgPCBzdG9wKSByYW5nZS5wdXNoKGogLyBrKTsNCiAgcmV0dXJuIHJhbmdlOw0KfTsNCg0KZnVuY3Rpb24gZDNfcmFuZ2VfaW50ZWdlclNjYWxlKHgpIHsNCiAgdmFyIGsgPSAxOw0KICB3aGlsZSAoeCAqIGsgJSAxKSBrICo9IDEwOw0KICByZXR1cm4gazsNCn0NCmQzLnJlcXVvdGUgPSBmdW5jdGlvbihzKSB7DQogIHJldHVybiBzLnJlcGxhY2UoZDNfcmVxdW90ZV9yZSwgIlxcJCYiKTsNCn07DQoNCnZhciBkM19yZXF1b3RlX3JlID0gL1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nOw0KZDMucm91bmQgPSBmdW5jdGlvbih4LCBuKSB7DQogIHJldHVybiBuDQogICAgICA/IE1hdGgucm91bmQoeCAqIChuID0gTWF0aC5wb3coMTAsIG4pKSkgLyBuDQogICAgICA6IE1hdGgucm91bmQoeCk7DQp9Ow0KZDMueGhyID0gZnVuY3Rpb24odXJsLCBtaW1lLCBjYWxsYmFjaykgew0KICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0Ow0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGNhbGxiYWNrID0gbWltZSwgbWltZSA9IG51bGw7DQogIGVsc2UgaWYgKG1pbWUgJiYgcmVxLm92ZXJyaWRlTWltZVR5cGUpIHJlcS5vdmVycmlkZU1pbWVUeXBlKG1pbWUpOw0KICByZXEub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsNCiAgaWYgKG1pbWUpIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLCBtaW1lKTsNCiAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgew0KICAgIGlmIChyZXEucmVhZHlTdGF0ZSA9PT0gNCkgY2FsbGJhY2socmVxLnN0YXR1cyA8IDMwMCA/IHJlcSA6IG51bGwpOw0KICB9Ow0KICByZXEuc2VuZChudWxsKTsNCn07DQpkMy50ZXh0ID0gZnVuY3Rpb24odXJsLCBtaW1lLCBjYWxsYmFjaykgew0KICBmdW5jdGlvbiByZWFkeShyZXEpIHsNCiAgICBjYWxsYmFjayhyZXEgJiYgcmVxLnJlc3BvbnNlVGV4dCk7DQogIH0NCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7DQogICAgY2FsbGJhY2sgPSBtaW1lOw0KICAgIG1pbWUgPSBudWxsOw0KICB9DQogIGQzLnhocih1cmwsIG1pbWUsIHJlYWR5KTsNCn07DQpkMy5qc29uID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgew0KICBkMy50ZXh0KHVybCwgImFwcGxpY2F0aW9uL2pzb24iLCBmdW5jdGlvbih0ZXh0KSB7DQogICAgY2FsbGJhY2sodGV4dCA/IEpTT04ucGFyc2UodGV4dCkgOiBudWxsKTsNCiAgfSk7DQp9Ow0KZDMuaHRtbCA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHsNCiAgZDMudGV4dCh1cmwsICJ0ZXh0L2h0bWwiLCBmdW5jdGlvbih0ZXh0KSB7DQogICAgaWYgKHRleHQgIT0gbnVsbCkgeyAvLyBUcmVhdCBlbXB0eSBzdHJpbmcgYXMgdmFsaWQgSFRNTC4NCiAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7DQogICAgICByYW5nZS5zZWxlY3ROb2RlKGRvY3VtZW50LmJvZHkpOw0KICAgICAgdGV4dCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0ZXh0KTsNCiAgICB9DQogICAgY2FsbGJhY2sodGV4dCk7DQogIH0pOw0KfTsNCmQzLnhtbCA9IGZ1bmN0aW9uKHVybCwgbWltZSwgY2FsbGJhY2spIHsNCiAgZnVuY3Rpb24gcmVhZHkocmVxKSB7DQogICAgY2FsbGJhY2socmVxICYmIHJlcS5yZXNwb25zZVhNTCk7DQogIH0NCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7DQogICAgY2FsbGJhY2sgPSBtaW1lOw0KICAgIG1pbWUgPSBudWxsOw0KICB9DQogIGQzLnhocih1cmwsIG1pbWUsIHJlYWR5KTsNCn07DQp2YXIgZDNfbnNQcmVmaXggPSB7DQogIHN2ZzogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwNCiAgeGh0bWw6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwNCiAgeGxpbms6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwNCiAgeG1sOiAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwNCiAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyINCn07DQoNCmQzLm5zID0gew0KICBwcmVmaXg6IGQzX25zUHJlZml4LA0KICBxdWFsaWZ5OiBmdW5jdGlvbihuYW1lKSB7DQogICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoIjoiKSwNCiAgICAgICAgcHJlZml4ID0gbmFtZTsNCiAgICBpZiAoaSA+PSAwKSB7DQogICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpKTsNCiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpICsgMSk7DQogICAgfQ0KICAgIHJldHVybiBkM19uc1ByZWZpeC5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpDQogICAgICAgID8ge3NwYWNlOiBkM19uc1ByZWZpeFtwcmVmaXhdLCBsb2NhbDogbmFtZX0NCiAgICAgICAgOiBuYW1lOw0KICB9DQp9Ow0KZDMuZGlzcGF0Y2ggPSBmdW5jdGlvbigpIHsNCiAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoLA0KICAgICAgaSA9IC0xLA0KICAgICAgbiA9IGFyZ3VtZW50cy5sZW5ndGg7DQogIHdoaWxlICgrK2kgPCBuKSBkaXNwYXRjaFthcmd1bWVudHNbaV1dID0gZDNfZGlzcGF0Y2hfZXZlbnQoZGlzcGF0Y2gpOw0KICByZXR1cm4gZGlzcGF0Y2g7DQp9Ow0KDQpmdW5jdGlvbiBkM19kaXNwYXRjaCgpIHt9DQoNCmQzX2Rpc3BhdGNoLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7DQogIHZhciBpID0gdHlwZS5pbmRleE9mKCIuIiksDQogICAgICBuYW1lID0gIiI7DQoNCiAgLy8gRXh0cmFjdCBvcHRpb25hbCBuYW1lc3BhY2UsIGUuZy4sICJjbGljay5mb28iDQogIGlmIChpID4gMCkgew0KICAgIG5hbWUgPSB0eXBlLnN1YnN0cmluZyhpICsgMSk7DQogICAgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDAsIGkpOw0KICB9DQoNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyDQogICAgICA/IHRoaXNbdHlwZV0ub24obmFtZSkNCiAgICAgIDogdGhpc1t0eXBlXS5vbihuYW1lLCBsaXN0ZW5lcik7DQp9Ow0KDQpmdW5jdGlvbiBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCkgew0KICB2YXIgbGlzdGVuZXJzID0gW10sDQogICAgICBsaXN0ZW5lckJ5TmFtZSA9IG5ldyBkM19NYXA7DQoNCiAgZnVuY3Rpb24gZXZlbnQoKSB7DQogICAgdmFyIHogPSBsaXN0ZW5lcnMsIC8vIGRlZmVuc2l2ZSByZWZlcmVuY2UNCiAgICAgICAgaSA9IC0xLA0KICAgICAgICBuID0gei5sZW5ndGgsDQogICAgICAgIGw7DQogICAgd2hpbGUgKCsraSA8IG4pIGlmIChsID0geltpXS5vbikgbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIHJldHVybiBkaXNwYXRjaDsNCiAgfQ0KDQogIGV2ZW50Lm9uID0gZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHsNCiAgICB2YXIgbCA9IGxpc3RlbmVyQnlOYW1lLmdldChuYW1lKSwNCiAgICAgICAgaTsNCg0KICAgIC8vIHJldHVybiB0aGUgY3VycmVudCBsaXN0ZW5lciwgaWYgYW55DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gbCAmJiBsLm9uOw0KDQogICAgLy8gcmVtb3ZlIHRoZSBvbGQgbGlzdGVuZXIsIGlmIGFueSAod2l0aCBjb3B5LW9uLXdyaXRlKQ0KICAgIGlmIChsKSB7DQogICAgICBsLm9uID0gbnVsbDsNCiAgICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5zbGljZSgwLCBpID0gbGlzdGVuZXJzLmluZGV4T2YobCkpLmNvbmNhdChsaXN0ZW5lcnMuc2xpY2UoaSArIDEpKTsNCiAgICAgIGxpc3RlbmVyQnlOYW1lLnJlbW92ZShuYW1lKTsNCiAgICB9DQoNCiAgICAvLyBhZGQgdGhlIG5ldyBsaXN0ZW5lciwgaWYgYW55DQogICAgaWYgKGxpc3RlbmVyKSBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lckJ5TmFtZS5zZXQobmFtZSwge29uOiBsaXN0ZW5lcn0pKTsNCg0KICAgIHJldHVybiBkaXNwYXRjaDsNCiAgfTsNCg0KICByZXR1cm4gZXZlbnQ7DQp9DQovLyBUT0RPIGFsaWduDQpkMy5mb3JtYXQgPSBmdW5jdGlvbihzcGVjaWZpZXIpIHsNCiAgdmFyIG1hdGNoID0gZDNfZm9ybWF0X3JlLmV4ZWMoc3BlY2lmaWVyKSwNCiAgICAgIGZpbGwgPSBtYXRjaFsxXSB8fCAiICIsDQogICAgICBzaWduID0gbWF0Y2hbM10gfHwgIiIsDQogICAgICB6ZmlsbCA9IG1hdGNoWzVdLA0KICAgICAgd2lkdGggPSArbWF0Y2hbNl0sDQogICAgICBjb21tYSA9IG1hdGNoWzddLA0KICAgICAgcHJlY2lzaW9uID0gbWF0Y2hbOF0sDQogICAgICB0eXBlID0gbWF0Y2hbOV0sDQogICAgICBzY2FsZSA9IDEsDQogICAgICBzdWZmaXggPSAiIiwNCiAgICAgIGludGVnZXIgPSBmYWxzZTsNCg0KICBpZiAocHJlY2lzaW9uKSBwcmVjaXNpb24gPSArcHJlY2lzaW9uLnN1YnN0cmluZygxKTsNCg0KICBpZiAoemZpbGwpIHsNCiAgICBmaWxsID0gIjAiOyAvLyBUT0RPIGFsaWduID0gIj0iOw0KICAgIGlmIChjb21tYSkgd2lkdGggLT0gTWF0aC5mbG9vcigod2lkdGggLSAxKSAvIDQpOw0KICB9DQoNCiAgc3dpdGNoICh0eXBlKSB7DQogICAgY2FzZSAibiI6IGNvbW1hID0gdHJ1ZTsgdHlwZSA9ICJnIjsgYnJlYWs7DQogICAgY2FzZSAiJSI6IHNjYWxlID0gMTAwOyBzdWZmaXggPSAiJSI7IHR5cGUgPSAiZiI7IGJyZWFrOw0KICAgIGNhc2UgInAiOiBzY2FsZSA9IDEwMDsgc3VmZml4ID0gIiUiOyB0eXBlID0gInIiOyBicmVhazsNCiAgICBjYXNlICJkIjogaW50ZWdlciA9IHRydWU7IHByZWNpc2lvbiA9IDA7IGJyZWFrOw0KICAgIGNhc2UgInMiOiBzY2FsZSA9IC0xOyB0eXBlID0gInIiOyBicmVhazsNCiAgfQ0KDQogIC8vIElmIG5vIHByZWNpc2lvbiBpcyBzcGVjaWZpZWQgZm9yIHIsIGZhbGxiYWNrIHRvIGdlbmVyYWwgbm90YXRpb24uDQogIGlmICh0eXBlID09ICJyIiAmJiAhcHJlY2lzaW9uKSB0eXBlID0gImciOw0KDQogIHR5cGUgPSBkM19mb3JtYXRfdHlwZXMuZ2V0KHR5cGUpIHx8IGQzX2Zvcm1hdF90eXBlRGVmYXVsdDsNCg0KICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsNCg0KICAgIC8vIFJldHVybiB0aGUgZW1wdHkgc3RyaW5nIGZvciBmbG9hdHMgZm9ybWF0dGVkIGFzIGludHMuDQogICAgaWYgKGludGVnZXIgJiYgKHZhbHVlICUgMSkpIHJldHVybiAiIjsNCg0KICAgIC8vIENvbnZlcnQgbmVnYXRpdmUgdG8gcG9zaXRpdmUsIGFuZCByZWNvcmQgdGhlIHNpZ24gcHJlZml4Lg0KICAgIHZhciBuZWdhdGl2ZSA9ICh2YWx1ZSA8IDApICYmICh2YWx1ZSA9IC12YWx1ZSkgPyAiXHUyMjEyIiA6IHNpZ247DQoNCiAgICAvLyBBcHBseSB0aGUgc2NhbGUsIGNvbXB1dGluZyBpdCBmcm9tIHRoZSB2YWx1ZSdzIGV4cG9uZW50IGZvciBzaSBmb3JtYXQuDQogICAgaWYgKHNjYWxlIDwgMCkgew0KICAgICAgdmFyIHByZWZpeCA9IGQzLmZvcm1hdFByZWZpeCh2YWx1ZSwgcHJlY2lzaW9uKTsNCiAgICAgIHZhbHVlICo9IHByZWZpeC5zY2FsZTsNCiAgICAgIHN1ZmZpeCA9IHByZWZpeC5zeW1ib2w7DQogICAgfSBlbHNlIHsNCiAgICAgIHZhbHVlICo9IHNjYWxlOw0KICAgIH0NCg0KICAgIC8vIENvbnZlcnQgdG8gdGhlIGRlc2lyZWQgcHJlY2lzaW9uLg0KICAgIHZhbHVlID0gdHlwZSh2YWx1ZSwgcHJlY2lzaW9uKTsNCg0KICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyAwLCB0aGUgc2lnbiBhbmQgZ3JvdXAgaXMgYXBwbGllZCBhZnRlciB0aGUgZmlsbC4NCiAgICBpZiAoemZpbGwpIHsNCiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyBuZWdhdGl2ZS5sZW5ndGg7DQogICAgICBpZiAobGVuZ3RoIDwgd2lkdGgpIHZhbHVlID0gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSArIHZhbHVlOw0KICAgICAgaWYgKGNvbW1hKSB2YWx1ZSA9IGQzX2Zvcm1hdF9ncm91cCh2YWx1ZSk7DQogICAgICB2YWx1ZSA9IG5lZ2F0aXZlICsgdmFsdWU7DQogICAgfQ0KDQogICAgLy8gT3RoZXJ3aXNlIChlLmcuLCBzcGFjZS1maWxsaW5nKSwgdGhlIHNpZ24gYW5kIGdyb3VwIGlzIGFwcGxpZWQgYmVmb3JlLg0KICAgIGVsc2Ugew0KICAgICAgaWYgKGNvbW1hKSB2YWx1ZSA9IGQzX2Zvcm1hdF9ncm91cCh2YWx1ZSk7DQogICAgICB2YWx1ZSA9IG5lZ2F0aXZlICsgdmFsdWU7DQogICAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoOw0KICAgICAgaWYgKGxlbmd0aCA8IHdpZHRoKSB2YWx1ZSA9IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgKyB2YWx1ZTsNCiAgICB9DQoNCiAgICByZXR1cm4gdmFsdWUgKyBzdWZmaXg7DQogIH07DQp9Ow0KDQovLyBbW2ZpbGxdYWxpZ25dW3NpZ25dWyNdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt0eXBlXQ0KdmFyIGQzX2Zvcm1hdF9yZSA9IC8oPzooW157XSk/KFs8Pj1eXSkpPyhbK1wtIF0pPygjKT8oMCk/KFswLTldKyk/KCwpPyhcLlswLTldKyk/KFthLXpBLVolXSk/LzsNCg0KdmFyIGQzX2Zvcm1hdF90eXBlcyA9IGQzLm1hcCh7DQogIGc6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9QcmVjaXNpb24ocCk7IH0sDQogIGU6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9FeHBvbmVudGlhbChwKTsgfSwNCiAgZjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0ZpeGVkKHApOyB9LA0KICByOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiBkMy5yb3VuZCh4LCBwID0gZDNfZm9ybWF0X3ByZWNpc2lvbih4LCBwKSkudG9GaXhlZChNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcCkpKTsgfQ0KfSk7DQoNCmZ1bmN0aW9uIGQzX2Zvcm1hdF9wcmVjaXNpb24oeCwgcCkgew0KICByZXR1cm4gcCAtICh4ID8gMSArIE1hdGguZmxvb3IoTWF0aC5sb2coeCArIE1hdGgucG93KDEwLCAxICsgTWF0aC5mbG9vcihNYXRoLmxvZyh4KSAvIE1hdGguTE4xMCkgLSBwKSkgLyBNYXRoLkxOMTApIDogMSk7DQp9DQoNCmZ1bmN0aW9uIGQzX2Zvcm1hdF90eXBlRGVmYXVsdCh4KSB7DQogIHJldHVybiB4ICsgIiI7DQp9DQoNCi8vIEFwcGx5IGNvbW1hIGdyb3VwaW5nIGZvciB0aG91c2FuZHMuDQpmdW5jdGlvbiBkM19mb3JtYXRfZ3JvdXAodmFsdWUpIHsNCiAgdmFyIGkgPSB2YWx1ZS5sYXN0SW5kZXhPZigiLiIpLA0KICAgICAgZiA9IGkgPj0gMCA/IHZhbHVlLnN1YnN0cmluZyhpKSA6IChpID0gdmFsdWUubGVuZ3RoLCAiIiksDQogICAgICB0ID0gW107DQogIHdoaWxlIChpID4gMCkgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IDMsIGkgKyAzKSk7DQogIHJldHVybiB0LnJldmVyc2UoKS5qb2luKCIsIikgKyBmOw0KfQ0KdmFyIGQzX2Zvcm1hdFByZWZpeGVzID0gWyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLOvCIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdLm1hcChkM19mb3JtYXRQcmVmaXgpOw0KDQpkMy5mb3JtYXRQcmVmaXggPSBmdW5jdGlvbih2YWx1ZSwgcHJlY2lzaW9uKSB7DQogIHZhciBpID0gMDsNCiAgaWYgKHZhbHVlKSB7DQogICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgKj0gLTE7DQogICAgaWYgKHByZWNpc2lvbikgdmFsdWUgPSBkMy5yb3VuZCh2YWx1ZSwgZDNfZm9ybWF0X3ByZWNpc2lvbih2YWx1ZSwgcHJlY2lzaW9uKSk7DQogICAgaSA9IDEgKyBNYXRoLmZsb29yKDFlLTEyICsgTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjEwKTsNCiAgICBpID0gTWF0aC5tYXgoLTI0LCBNYXRoLm1pbigyNCwgTWF0aC5mbG9vcigoaSA8PSAwID8gaSArIDEgOiBpIC0gMSkgLyAzKSAqIDMpKTsNCiAgfQ0KICByZXR1cm4gZDNfZm9ybWF0UHJlZml4ZXNbOCArIGkgLyAzXTsNCn07DQoNCmZ1bmN0aW9uIGQzX2Zvcm1hdFByZWZpeChkLCBpKSB7DQogIHJldHVybiB7DQogICAgc2NhbGU6IE1hdGgucG93KDEwLCAoOCAtIGkpICogMyksDQogICAgc3ltYm9sOiBkDQogIH07DQp9DQoNCi8qDQogKiBURVJNUyBPRiBVU0UgLSBFQVNJTkcgRVFVQVRJT05TDQogKg0KICogT3BlbiBzb3VyY2UgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLg0KICoNCiAqIENvcHlyaWdodCAyMDAxIFJvYmVydCBQZW5uZXINCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAqDQogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcw0KICogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCiAqDQogKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCiAqDQogKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bw0KICogICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYw0KICogICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogKg0KICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiDQogKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQ0KICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFDQogKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SDQogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRg0KICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTDQogKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTg0KICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkNCiAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFDQogKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqLw0KDQp2YXIgZDNfZWFzZV9xdWFkID0gZDNfZWFzZV9wb2x5KDIpLA0KICAgIGQzX2Vhc2VfY3ViaWMgPSBkM19lYXNlX3BvbHkoMyksDQogICAgZDNfZWFzZV9kZWZhdWx0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBkM19lYXNlX2lkZW50aXR5OyB9Ow0KDQp2YXIgZDNfZWFzZSA9IGQzLm1hcCh7DQogIGxpbmVhcjogZDNfZWFzZV9kZWZhdWx0LA0KICBwb2x5OiBkM19lYXNlX3BvbHksDQogIHF1YWQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZDNfZWFzZV9xdWFkOyB9LA0KICBjdWJpYzogZnVuY3Rpb24oKSB7IHJldHVybiBkM19lYXNlX2N1YmljOyB9LA0KICBzaW46IGZ1bmN0aW9uKCkgeyByZXR1cm4gZDNfZWFzZV9zaW47IH0sDQogIGV4cDogZnVuY3Rpb24oKSB7IHJldHVybiBkM19lYXNlX2V4cDsgfSwNCiAgY2lyY2xlOiBmdW5jdGlvbigpIHsgcmV0dXJuIGQzX2Vhc2VfY2lyY2xlOyB9LA0KICBlbGFzdGljOiBkM19lYXNlX2VsYXN0aWMsDQogIGJhY2s6IGQzX2Vhc2VfYmFjaywNCiAgYm91bmNlOiBmdW5jdGlvbigpIHsgcmV0dXJuIGQzX2Vhc2VfYm91bmNlOyB9DQp9KTsNCg0KdmFyIGQzX2Vhc2VfbW9kZSA9IGQzLm1hcCh7DQogICJpbiI6IGQzX2Vhc2VfaWRlbnRpdHksDQogICJvdXQiOiBkM19lYXNlX3JldmVyc2UsDQogICJpbi1vdXQiOiBkM19lYXNlX3JlZmxlY3QsDQogICJvdXQtaW4iOiBmdW5jdGlvbihmKSB7IHJldHVybiBkM19lYXNlX3JlZmxlY3QoZDNfZWFzZV9yZXZlcnNlKGYpKTsgfQ0KfSk7DQoNCmQzLmVhc2UgPSBmdW5jdGlvbihuYW1lKSB7DQogIHZhciBpID0gbmFtZS5pbmRleE9mKCItIiksDQogICAgICB0ID0gaSA+PSAwID8gbmFtZS5zdWJzdHJpbmcoMCwgaSkgOiBuYW1lLA0KICAgICAgbSA9IGkgPj0gMCA/IG5hbWUuc3Vic3RyaW5nKGkgKyAxKSA6ICJpbiI7DQogIHQgPSBkM19lYXNlLmdldCh0KSB8fCBkM19lYXNlX2RlZmF1bHQ7DQogIG0gPSBkM19lYXNlX21vZGUuZ2V0KG0pIHx8IGQzX2Vhc2VfaWRlbnRpdHk7DQogIHJldHVybiBkM19lYXNlX2NsYW1wKG0odC5hcHBseShudWxsLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSkpOw0KfTsNCg0KZnVuY3Rpb24gZDNfZWFzZV9jbGFtcChmKSB7DQogIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgcmV0dXJuIHQgPD0gMCA/IDAgOiB0ID49IDEgPyAxIDogZih0KTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gZDNfZWFzZV9yZXZlcnNlKGYpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICByZXR1cm4gMSAtIGYoMSAtIHQpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBkM19lYXNlX3JlZmxlY3QoZikgew0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHJldHVybiAuNSAqICh0IDwgLjUgPyBmKDIgKiB0KSA6ICgyIC0gZigyIC0gMiAqIHQpKSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGQzX2Vhc2VfaWRlbnRpdHkodCkgew0KICByZXR1cm4gdDsNCn0NCg0KZnVuY3Rpb24gZDNfZWFzZV9wb2x5KGUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICByZXR1cm4gTWF0aC5wb3codCwgZSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGQzX2Vhc2Vfc2luKHQpIHsNCiAgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogTWF0aC5QSSAvIDIpOw0KfQ0KDQpmdW5jdGlvbiBkM19lYXNlX2V4cCh0KSB7DQogIHJldHVybiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpOw0KfQ0KDQpmdW5jdGlvbiBkM19lYXNlX2NpcmNsZSh0KSB7DQogIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCk7DQp9DQoNCmZ1bmN0aW9uIGQzX2Vhc2VfZWxhc3RpYyhhLCBwKSB7DQogIHZhciBzOw0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHAgPSAwLjQ1Ow0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHsgYSA9IDE7IHMgPSBwIC8gNDsgfQ0KICBlbHNlIHMgPSBwIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbigxIC8gYSk7DQogIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgcmV0dXJuIDEgKyBhICogTWF0aC5wb3coMiwgMTAgKiAtdCkgKiBNYXRoLnNpbigodCAtIHMpICogMiAqIE1hdGguUEkgLyBwKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gZDNfZWFzZV9iYWNrKHMpIHsNCiAgaWYgKCFzKSBzID0gMS43MDE1ODsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gZDNfZWFzZV9ib3VuY2UodCkgew0KICByZXR1cm4gdCA8IDEgLyAyLjc1ID8gNy41NjI1ICogdCAqIHQNCiAgICAgIDogdCA8IDIgLyAyLjc1ID8gNy41NjI1ICogKHQgLT0gMS41IC8gMi43NSkgKiB0ICsgLjc1DQogICAgICA6IHQgPCAyLjUgLyAyLjc1ID8gNy41NjI1ICogKHQgLT0gMi4yNSAvIDIuNzUpICogdCArIC45Mzc1DQogICAgICA6IDcuNTYyNSAqICh0IC09IDIuNjI1IC8gMi43NSkgKiB0ICsgLjk4NDM3NTsNCn0NCmQzLmV2ZW50ID0gbnVsbDsNCg0KZnVuY3Rpb24gZDNfZXZlbnRDYW5jZWwoKSB7DQogIGQzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KfQ0KDQpmdW5jdGlvbiBkM19ldmVudFNvdXJjZSgpIHsNCiAgdmFyIGUgPSBkMy5ldmVudCwgczsNCiAgd2hpbGUgKHMgPSBlLnNvdXJjZUV2ZW50KSBlID0gczsNCiAgcmV0dXJuIGU7DQp9DQoNCi8vIExpa2UgZDMuZGlzcGF0Y2gsIGJ1dCBmb3IgY3VzdG9tIGV2ZW50cyBhYnN0cmFjdGluZyBuYXRpdmUgVUkgZXZlbnRzLiBUaGVzZQ0KLy8gZXZlbnRzIGhhdmUgYSB0YXJnZXQgY29tcG9uZW50IChzdWNoIGFzIGEgYnJ1c2gpLCBhIHRhcmdldCBlbGVtZW50IChzdWNoIGFzDQovLyB0aGUgc3ZnOmcgZWxlbWVudCBjb250YWluaW5nIHRoZSBicnVzaCkgYW5kIHRoZSBzdGFuZGFyZCBhcmd1bWVudHMgYGRgICh0aGUNCi8vIHRhcmdldCBlbGVtZW50J3MgZGF0YSkgYW5kIGBpYCAodGhlIHNlbGVjdGlvbiBpbmRleCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQpLg0KZnVuY3Rpb24gZDNfZXZlbnREaXNwYXRjaCh0YXJnZXQpIHsNCiAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoLA0KICAgICAgaSA9IDAsDQogICAgICBuID0gYXJndW1lbnRzLmxlbmd0aDsNCg0KICB3aGlsZSAoKytpIDwgbikgZGlzcGF0Y2hbYXJndW1lbnRzW2ldXSA9IGQzX2Rpc3BhdGNoX2V2ZW50KGRpc3BhdGNoKTsNCg0KICAvLyBDcmVhdGVzIGEgZGlzcGF0Y2ggY29udGV4dCBmb3IgdGhlIHNwZWNpZmllZCBgdGhpemAgKHR5cGljYWxseSwgdGhlIHRhcmdldA0KICAvLyBET00gZWxlbWVudCB0aGF0IHJlY2VpdmVkIHRoZSBzb3VyY2UgZXZlbnQpIGFuZCBgYXJndW1lbnR6YCAodHlwaWNhbGx5LCB0aGUNCiAgLy8gZGF0YSBgZGAgYW5kIGluZGV4IGBpYCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQpLiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gY2FuIGJlDQogIC8vIHVzZWQgdG8gZGlzcGF0Y2ggYW4gZXZlbnQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzOyB0aGUgZnVuY3Rpb24gdGFrZXMgYQ0KICAvLyBzaW5nbGUgYXJndW1lbnQgYXMgaW5wdXQsIGJlaW5nIHRoZSBldmVudCB0byBkaXNwYXRjaC4gVGhlIGV2ZW50IG11c3QgaGF2ZQ0KICAvLyBhICJ0eXBlIiBhdHRyaWJ1dGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSB0eXBlIHJlZ2lzdGVyZWQgaW4gdGhlDQogIC8vIGNvbnN0cnVjdG9yLiBUaGlzIGNvbnRleHQgd2lsbCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlIHRoZSAic291cmNlRXZlbnQiIGFuZA0KICAvLyAidGFyZ2V0IiBhdHRyaWJ1dGVzIG9mIHRoZSBldmVudCwgYXMgd2VsbCBhcyBzZXR0aW5nIHRoZSBgZDMuZXZlbnRgIGdsb2JhbA0KICAvLyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBub3RpZmljYXRpb24uDQogIGRpc3BhdGNoLm9mID0gZnVuY3Rpb24odGhpeiwgYXJndW1lbnR6KSB7DQogICAgcmV0dXJuIGZ1bmN0aW9uKGUxKSB7DQogICAgICB0cnkgew0KICAgICAgICB2YXIgZTAgPQ0KICAgICAgICBlMS5zb3VyY2VFdmVudCA9IGQzLmV2ZW50Ow0KICAgICAgICBlMS50YXJnZXQgPSB0YXJnZXQ7DQogICAgICAgIGQzLmV2ZW50ID0gZTE7DQogICAgICAgIGRpc3BhdGNoW2UxLnR5cGVdLmFwcGx5KHRoaXosIGFyZ3VtZW50eik7DQogICAgICB9IGZpbmFsbHkgew0KICAgICAgICBkMy5ldmVudCA9IGUwOw0KICAgICAgfQ0KICAgIH07DQogIH07DQoNCiAgcmV0dXJuIGRpc3BhdGNoOw0KfQ0KZDMuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihhLCBiKSB7DQogIHZhciBpID0gZDMuaW50ZXJwb2xhdG9ycy5sZW5ndGgsIGY7DQogIHdoaWxlICgtLWkgPj0gMCAmJiAhKGYgPSBkMy5pbnRlcnBvbGF0b3JzW2ldKGEsIGIpKSk7DQogIHJldHVybiBmOw0KfTsNCg0KZDMuaW50ZXJwb2xhdGVOdW1iZXIgPSBmdW5jdGlvbihhLCBiKSB7DQogIGIgLT0gYTsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsgcmV0dXJuIGEgKyBiICogdDsgfTsNCn07DQoNCmQzLmludGVycG9sYXRlUm91bmQgPSBmdW5jdGlvbihhLCBiKSB7DQogIGIgLT0gYTsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsgcmV0dXJuIE1hdGgucm91bmQoYSArIGIgKiB0KTsgfTsNCn07DQoNCmQzLmludGVycG9sYXRlU3RyaW5nID0gZnVuY3Rpb24oYSwgYikgew0KICB2YXIgbSwgLy8gY3VycmVudCBtYXRjaA0KICAgICAgaSwgLy8gY3VycmVudCBpbmRleA0KICAgICAgaiwgLy8gY3VycmVudCBpbmRleCAoZm9yIGNvYWxsZXNjaW5nKQ0KICAgICAgczAgPSAwLCAvLyBzdGFydCBpbmRleCBvZiBjdXJyZW50IHN0cmluZyBwcmVmaXgNCiAgICAgIHMxID0gMCwgLy8gZW5kIGluZGV4IG9mIGN1cnJlbnQgc3RyaW5nIHByZWZpeA0KICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMNCiAgICAgIHEgPSBbXSwgLy8gbnVtYmVyIGludGVycG9sYXRvcnMNCiAgICAgIG4sIC8vIHEubGVuZ3RoDQogICAgICBvOw0KDQogIC8vIFJlc2V0IG91ciByZWd1bGFyIGV4cHJlc3Npb24hDQogIGQzX2ludGVycG9sYXRlX251bWJlci5sYXN0SW5kZXggPSAwOw0KDQogIC8vIEZpbmQgYWxsIG51bWJlcnMgaW4gYi4NCiAgZm9yIChpID0gMDsgbSA9IGQzX2ludGVycG9sYXRlX251bWJlci5leGVjKGIpOyArK2kpIHsNCiAgICBpZiAobS5pbmRleCkgcy5wdXNoKGIuc3Vic3RyaW5nKHMwLCBzMSA9IG0uaW5kZXgpKTsNCiAgICBxLnB1c2goe2k6IHMubGVuZ3RoLCB4OiBtWzBdfSk7DQogICAgcy5wdXNoKG51bGwpOw0KICAgIHMwID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmxhc3RJbmRleDsNCiAgfQ0KICBpZiAoczAgPCBiLmxlbmd0aCkgcy5wdXNoKGIuc3Vic3RyaW5nKHMwKSk7DQoNCiAgLy8gRmluZCBhbGwgbnVtYmVycyBpbiBhLg0KICBmb3IgKGkgPSAwLCBuID0gcS5sZW5ndGg7IChtID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmV4ZWMoYSkpICYmIGkgPCBuOyArK2kpIHsNCiAgICBvID0gcVtpXTsNCiAgICBpZiAoby54ID09IG1bMF0pIHsgLy8gVGhlIG51bWJlcnMgbWF0Y2gsIHNvIGNvYWxsZXNjZS4NCiAgICAgIGlmIChvLmkpIHsNCiAgICAgICAgaWYgKHNbby5pICsgMV0gPT0gbnVsbCkgeyAvLyBUaGlzIG1hdGNoIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgbnVtYmVyLg0KICAgICAgICAgIHNbby5pIC0gMV0gKz0gby54Ow0KICAgICAgICAgIHMuc3BsaWNlKG8uaSwgMSk7DQogICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBuOyArK2opIHFbal0uaS0tOw0KICAgICAgICB9IGVsc2UgeyAvLyBUaGlzIG1hdGNoIGlzIGZvbGxvd2VkIGJ5IGEgc3RyaW5nLCBzbyBjb2FsbGVzY2UgdHdpY2UuDQogICAgICAgICAgc1tvLmkgLSAxXSArPSBvLnggKyBzW28uaSArIDFdOw0KICAgICAgICAgIHMuc3BsaWNlKG8uaSwgMik7DQogICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBuOyArK2opIHFbal0uaSAtPSAyOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICAgIGlmIChzW28uaSArIDFdID09IG51bGwpIHsgLy8gVGhpcyBtYXRjaCBpcyBmb2xsb3dlZCBieSBhbm90aGVyIG51bWJlci4NCiAgICAgICAgICBzW28uaV0gPSBvLng7DQogICAgICAgIH0gZWxzZSB7IC8vIFRoaXMgbWF0Y2ggaXMgZm9sbG93ZWQgYnkgYSBzdHJpbmcsIHNvIGNvYWxsZXNjZSB0d2ljZS4NCiAgICAgICAgICBzW28uaV0gPSBvLnggKyBzW28uaSArIDFdOw0KICAgICAgICAgIHMuc3BsaWNlKG8uaSArIDEsIDEpOw0KICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbjsgKytqKSBxW2pdLmktLTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcS5zcGxpY2UoaSwgMSk7DQogICAgICBuLS07DQogICAgICBpLS07DQogICAgfSBlbHNlIHsNCiAgICAgIG8ueCA9IGQzLmludGVycG9sYXRlTnVtYmVyKHBhcnNlRmxvYXQobVswXSksIHBhcnNlRmxvYXQoby54KSk7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVtb3ZlIGFueSBudW1iZXJzIGluIGIgbm90IGZvdW5kIGluIGEuDQogIHdoaWxlIChpIDwgbikgew0KICAgIG8gPSBxLnBvcCgpOw0KICAgIGlmIChzW28uaSArIDFdID09IG51bGwpIHsgLy8gVGhpcyBtYXRjaCBpcyBmb2xsb3dlZCBieSBhbm90aGVyIG51bWJlci4NCiAgICAgIHNbby5pXSA9IG8ueDsNCiAgICB9IGVsc2UgeyAvLyBUaGlzIG1hdGNoIGlzIGZvbGxvd2VkIGJ5IGEgc3RyaW5nLCBzbyBjb2FsbGVzY2UgdHdpY2UuDQogICAgICBzW28uaV0gPSBvLnggKyBzW28uaSArIDFdOw0KICAgICAgcy5zcGxpY2Uoby5pICsgMSwgMSk7DQogICAgfQ0KICAgIG4tLTsNCiAgfQ0KDQogIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLg0KICBpZiAocy5sZW5ndGggPT09IDEpIHsNCiAgICByZXR1cm4gc1swXSA9PSBudWxsID8gcVswXS54IDogZnVuY3Rpb24oKSB7IHJldHVybiBiOyB9Ow0KICB9DQoNCiAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy4NCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7DQogICAgcmV0dXJuIHMuam9pbigiIik7DQogIH07DQp9Ow0KDQpkMy5pbnRlcnBvbGF0ZVRyYW5zZm9ybSA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzDQogICAgICBxID0gW10sIC8vIG51bWJlciBpbnRlcnBvbGF0b3JzDQogICAgICBuLA0KICAgICAgQSA9IGQzLnRyYW5zZm9ybShhKSwNCiAgICAgIEIgPSBkMy50cmFuc2Zvcm0oYiksDQogICAgICB0YSA9IEEudHJhbnNsYXRlLA0KICAgICAgdGIgPSBCLnRyYW5zbGF0ZSwNCiAgICAgIHJhID0gQS5yb3RhdGUsDQogICAgICByYiA9IEIucm90YXRlLA0KICAgICAgd2EgPSBBLnNrZXcsDQogICAgICB3YiA9IEIuc2tldywNCiAgICAgIGthID0gQS5zY2FsZSwNCiAgICAgIGtiID0gQi5zY2FsZTsNCg0KICBpZiAodGFbMF0gIT0gdGJbMF0gfHwgdGFbMV0gIT0gdGJbMV0pIHsNCiAgICBzLnB1c2goInRyYW5zbGF0ZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7DQogICAgcS5wdXNoKHtpOiAxLCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcih0YVswXSwgdGJbMF0pfSwge2k6IDMsIHg6IGQzLmludGVycG9sYXRlTnVtYmVyKHRhWzFdLCB0YlsxXSl9KTsNCiAgfSBlbHNlIGlmICh0YlswXSB8fCB0YlsxXSkgew0KICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB0YiArICIpIik7DQogIH0gZWxzZSB7DQogICAgcy5wdXNoKCIiKTsNCiAgfQ0KDQogIGlmIChyYSAhPSByYikgew0KICAgIHEucHVzaCh7aTogcy5wdXNoKHMucG9wKCkgKyAicm90YXRlKCIsIG51bGwsICIpIikgLSAyLCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcihyYSwgcmIpfSk7DQogIH0gZWxzZSBpZiAocmIpIHsNCiAgICBzLnB1c2gocy5wb3AoKSArICJyb3RhdGUoIiArIHJiICsgIikiKTsNCiAgfQ0KDQogIGlmICh3YSAhPSB3Yikgew0KICAgIHEucHVzaCh7aTogcy5wdXNoKHMucG9wKCkgKyAic2tld1goIiwgbnVsbCwgIikiKSAtIDIsIHg6IGQzLmludGVycG9sYXRlTnVtYmVyKHdhLCB3Yil9KTsNCiAgfSBlbHNlIGlmICh3Yikgew0KICAgIHMucHVzaChzLnBvcCgpICsgInNrZXdYKCIgKyB3YiArICIpIik7DQogIH0NCg0KICBpZiAoa2FbMF0gIT0ga2JbMF0gfHwga2FbMV0gIT0ga2JbMV0pIHsNCiAgICBuID0gcy5wdXNoKHMucG9wKCkgKyAic2NhbGUoIiwgbnVsbCwgIiwiLCBudWxsLCAiKSIpOw0KICAgIHEucHVzaCh7aTogbiAtIDQsIHg6IGQzLmludGVycG9sYXRlTnVtYmVyKGthWzBdLCBrYlswXSl9LCB7aTogbiAtIDIsIHg6IGQzLmludGVycG9sYXRlTnVtYmVyKGthWzFdLCBrYlsxXSl9KTsNCiAgfSBlbHNlIGlmIChrYlswXSAhPSAxIHx8IGtiWzFdICE9IDEpIHsNCiAgICBzLnB1c2gocy5wb3AoKSArICJzY2FsZSgiICsga2IgKyAiKSIpOw0KICB9DQoNCiAgbiA9IHEubGVuZ3RoOw0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHZhciBpID0gLTEsIG87DQogICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsNCiAgICByZXR1cm4gcy5qb2luKCIiKTsNCiAgfTsNCn07DQoNCmQzLmludGVycG9sYXRlUmdiID0gZnVuY3Rpb24oYSwgYikgew0KICBhID0gZDMucmdiKGEpOw0KICBiID0gZDMucmdiKGIpOw0KICB2YXIgYXIgPSBhLnIsDQogICAgICBhZyA9IGEuZywNCiAgICAgIGFiID0gYS5iLA0KICAgICAgYnIgPSBiLnIgLSBhciwNCiAgICAgIGJnID0gYi5nIC0gYWcsDQogICAgICBiYiA9IGIuYiAtIGFiOw0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHJldHVybiAiIyINCiAgICAgICAgKyBkM19yZ2JfaGV4KE1hdGgucm91bmQoYXIgKyBiciAqIHQpKQ0KICAgICAgICArIGQzX3JnYl9oZXgoTWF0aC5yb3VuZChhZyArIGJnICogdCkpDQogICAgICAgICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFiICsgYmIgKiB0KSk7DQogIH07DQp9Ow0KDQovLyBpbnRlcnBvbGF0ZXMgSFNMIHNwYWNlLCBidXQgb3V0cHV0cyBSR0Igc3RyaW5nIChmb3IgY29tcGF0aWJpbGl0eSkNCmQzLmludGVycG9sYXRlSHNsID0gZnVuY3Rpb24oYSwgYikgew0KICBhID0gZDMuaHNsKGEpOw0KICBiID0gZDMuaHNsKGIpOw0KICB2YXIgaDAgPSBhLmgsDQogICAgICBzMCA9IGEucywNCiAgICAgIGwwID0gYS5sLA0KICAgICAgaDEgPSBiLmggLSBoMCwNCiAgICAgIHMxID0gYi5zIC0gczAsDQogICAgICBsMSA9IGIubCAtIGwwOw0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHJldHVybiBkM19oc2xfcmdiKGgwICsgaDEgKiB0LCBzMCArIHMxICogdCwgbDAgKyBsMSAqIHQpLnRvU3RyaW5nKCk7DQogIH07DQp9Ow0KDQpkMy5pbnRlcnBvbGF0ZUFycmF5ID0gZnVuY3Rpb24oYSwgYikgew0KICB2YXIgeCA9IFtdLA0KICAgICAgYyA9IFtdLA0KICAgICAgbmEgPSBhLmxlbmd0aCwNCiAgICAgIG5iID0gYi5sZW5ndGgsDQogICAgICBuMCA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCksDQogICAgICBpOw0KICBmb3IgKGkgPSAwOyBpIDwgbjA7ICsraSkgeC5wdXNoKGQzLmludGVycG9sYXRlKGFbaV0sIGJbaV0pKTsNCiAgZm9yICg7IGkgPCBuYTsgKytpKSBjW2ldID0gYVtpXTsNCiAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ldID0gYltpXTsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICBmb3IgKGkgPSAwOyBpIDwgbjA7ICsraSkgY1tpXSA9IHhbaV0odCk7DQogICAgcmV0dXJuIGM7DQogIH07DQp9Ow0KDQpkMy5pbnRlcnBvbGF0ZU9iamVjdCA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgdmFyIGkgPSB7fSwNCiAgICAgIGMgPSB7fSwNCiAgICAgIGs7DQogIGZvciAoayBpbiBhKSB7DQogICAgaWYgKGsgaW4gYikgew0KICAgICAgaVtrXSA9IGQzX2ludGVycG9sYXRlQnlOYW1lKGspKGFba10sIGJba10pOw0KICAgIH0gZWxzZSB7DQogICAgICBjW2tdID0gYVtrXTsNCiAgICB9DQogIH0NCiAgZm9yIChrIGluIGIpIHsNCiAgICBpZiAoIShrIGluIGEpKSB7DQogICAgICBjW2tdID0gYltrXTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlba10odCk7DQogICAgcmV0dXJuIGM7DQogIH07DQp9DQoNCnZhciBkM19pbnRlcnBvbGF0ZV9udW1iZXIgPSAvWy0rXT8oPzpcZCpcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZzsNCg0KZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVCeU5hbWUobikgew0KICByZXR1cm4gbiA9PSAidHJhbnNmb3JtIg0KICAgICAgPyBkMy5pbnRlcnBvbGF0ZVRyYW5zZm9ybQ0KICAgICAgOiBkMy5pbnRlcnBvbGF0ZTsNCn0NCg0KZDMuaW50ZXJwb2xhdG9ycyA9IFsNCiAgZDMuaW50ZXJwb2xhdGVPYmplY3QsDQogIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIChiIGluc3RhbmNlb2YgQXJyYXkpICYmIGQzLmludGVycG9sYXRlQXJyYXkoYSwgYik7IH0sDQogIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuICh0eXBlb2YgYSA9PT0gInN0cmluZyIgfHwgdHlwZW9mIGIgPT09ICJzdHJpbmciKSAmJiBkMy5pbnRlcnBvbGF0ZVN0cmluZyhhICsgIiIsIGIgKyAiIik7IH0sDQogIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuICh0eXBlb2YgYiA9PT0gInN0cmluZyIgPyBkM19yZ2JfbmFtZXMuaGFzKGIpIHx8IC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KGIpIDogYiBpbnN0YW5jZW9mIGQzX1JnYiB8fCBiIGluc3RhbmNlb2YgZDNfSHNsKSAmJiBkMy5pbnRlcnBvbGF0ZVJnYihhLCBiKTsgfSwNCiAgZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gIWlzTmFOKGEgPSArYSkgJiYgIWlzTmFOKGIgPSArYikgJiYgZDMuaW50ZXJwb2xhdGVOdW1iZXIoYSwgYik7IH0NCl07DQpmdW5jdGlvbiBkM191bmludGVycG9sYXRlTnVtYmVyKGEsIGIpIHsNCiAgYiA9IGIgLSAoYSA9ICthKSA/IDEgLyAoYiAtIGEpIDogMDsNCiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuICh4IC0gYSkgKiBiOyB9Ow0KfQ0KDQpmdW5jdGlvbiBkM191bmludGVycG9sYXRlQ2xhbXAoYSwgYikgew0KICBiID0gYiAtIChhID0gK2EpID8gMSAvIChiIC0gYSkgOiAwOw0KICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKHggLSBhKSAqIGIpKTsgfTsNCn0NCmQzLnJnYiA9IGZ1bmN0aW9uKHIsIGcsIGIpIHsNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDENCiAgICAgID8gKHIgaW5zdGFuY2VvZiBkM19SZ2IgPyBkM19yZ2Ioci5yLCByLmcsIHIuYikNCiAgICAgIDogZDNfcmdiX3BhcnNlKCIiICsgciwgZDNfcmdiLCBkM19oc2xfcmdiKSkNCiAgICAgIDogZDNfcmdiKH5+ciwgfn5nLCB+fmIpOw0KfTsNCg0KZnVuY3Rpb24gZDNfcmdiKHIsIGcsIGIpIHsNCiAgcmV0dXJuIG5ldyBkM19SZ2IociwgZywgYik7DQp9DQoNCmZ1bmN0aW9uIGQzX1JnYihyLCBnLCBiKSB7DQogIHRoaXMuciA9IHI7DQogIHRoaXMuZyA9IGc7DQogIHRoaXMuYiA9IGI7DQp9DQoNCmQzX1JnYi5wcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7DQogIGsgPSBNYXRoLnBvdygwLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7DQogIHZhciByID0gdGhpcy5yLA0KICAgICAgZyA9IHRoaXMuZywNCiAgICAgIGIgPSB0aGlzLmIsDQogICAgICBpID0gMzA7DQogIGlmICghciAmJiAhZyAmJiAhYikgcmV0dXJuIGQzX3JnYihpLCBpLCBpKTsNCiAgaWYgKHIgJiYgciA8IGkpIHIgPSBpOw0KICBpZiAoZyAmJiBnIDwgaSkgZyA9IGk7DQogIGlmIChiICYmIGIgPCBpKSBiID0gaTsNCiAgcmV0dXJuIGQzX3JnYigNCiAgICAgIE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyIC8gaykpLA0KICAgICAgTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGcgLyBrKSksDQogICAgICBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IoYiAvIGspKSk7DQp9Ow0KDQpkM19SZ2IucHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHsNCiAgayA9IE1hdGgucG93KDAuNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTsNCiAgcmV0dXJuIGQzX3JnYigNCiAgICAgIE1hdGguZmxvb3IoayAqIHRoaXMuciksDQogICAgICBNYXRoLmZsb29yKGsgKiB0aGlzLmcpLA0KICAgICAgTWF0aC5mbG9vcihrICogdGhpcy5iKSk7DQp9Ow0KDQpkM19SZ2IucHJvdG90eXBlLmhzbCA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gZDNfcmdiX2hzbCh0aGlzLnIsIHRoaXMuZywgdGhpcy5iKTsNCn07DQoNCmQzX1JnYi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuICIjIiArIGQzX3JnYl9oZXgodGhpcy5yKSArIGQzX3JnYl9oZXgodGhpcy5nKSArIGQzX3JnYl9oZXgodGhpcy5iKTsNCn07DQoNCmZ1bmN0aW9uIGQzX3JnYl9oZXgodikgew0KICByZXR1cm4gdiA8IDB4MTANCiAgICAgID8gIjAiICsgTWF0aC5tYXgoMCwgdikudG9TdHJpbmcoMTYpDQogICAgICA6IE1hdGgubWluKDI1NSwgdikudG9TdHJpbmcoMTYpOw0KfQ0KDQpmdW5jdGlvbiBkM19yZ2JfcGFyc2UoZm9ybWF0LCByZ2IsIGhzbCkgew0KICB2YXIgciA9IDAsIC8vIHJlZCBjaGFubmVsOyBpbnQgaW4gWzAsIDI1NV0NCiAgICAgIGcgPSAwLCAvLyBncmVlbiBjaGFubmVsOyBpbnQgaW4gWzAsIDI1NV0NCiAgICAgIGIgPSAwLCAvLyBibHVlIGNoYW5uZWw7IGludCBpbiBbMCwgMjU1XQ0KICAgICAgbTEsIC8vIENTUyBjb2xvciBzcGVjaWZpY2F0aW9uIG1hdGNoDQogICAgICBtMiwgLy8gQ1NTIGNvbG9yIHNwZWNpZmljYXRpb24gdHlwZSAoZS5nLiwgcmdiKQ0KICAgICAgbmFtZTsNCg0KICAvKiBIYW5kbGUgaHNsLCByZ2IuICovDQogIG0xID0gLyhbYS16XSspXCgoLiopXCkvaS5leGVjKGZvcm1hdCk7DQogIGlmIChtMSkgew0KICAgIG0yID0gbTFbMl0uc3BsaXQoIiwiKTsNCiAgICBzd2l0Y2ggKG0xWzFdKSB7DQogICAgICBjYXNlICJoc2wiOiB7DQogICAgICAgIHJldHVybiBoc2woDQogICAgICAgICAgcGFyc2VGbG9hdChtMlswXSksIC8vIGRlZ3JlZXMNCiAgICAgICAgICBwYXJzZUZsb2F0KG0yWzFdKSAvIDEwMCwgLy8gcGVyY2VudGFnZQ0KICAgICAgICAgIHBhcnNlRmxvYXQobTJbMl0pIC8gMTAwIC8vIHBlcmNlbnRhZ2UNCiAgICAgICAgKTsNCiAgICAgIH0NCiAgICAgIGNhc2UgInJnYiI6IHsNCiAgICAgICAgcmV0dXJuIHJnYigNCiAgICAgICAgICBkM19yZ2JfcGFyc2VOdW1iZXIobTJbMF0pLA0KICAgICAgICAgIGQzX3JnYl9wYXJzZU51bWJlcihtMlsxXSksDQogICAgICAgICAgZDNfcmdiX3BhcnNlTnVtYmVyKG0yWzJdKQ0KICAgICAgICApOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8qIE5hbWVkIGNvbG9ycy4gKi8NCiAgaWYgKG5hbWUgPSBkM19yZ2JfbmFtZXMuZ2V0KGZvcm1hdCkpIHJldHVybiByZ2IobmFtZS5yLCBuYW1lLmcsIG5hbWUuYik7DQoNCiAgLyogSGV4YWRlY2ltYWwgY29sb3JzOiAjcmdiIGFuZCAjcnJnZ2JiLiAqLw0KICBpZiAoZm9ybWF0ICE9IG51bGwgJiYgZm9ybWF0LmNoYXJBdCgwKSA9PT0gIiMiKSB7DQogICAgaWYgKGZvcm1hdC5sZW5ndGggPT09IDQpIHsNCiAgICAgIHIgPSBmb3JtYXQuY2hhckF0KDEpOyByICs9IHI7DQogICAgICBnID0gZm9ybWF0LmNoYXJBdCgyKTsgZyArPSBnOw0KICAgICAgYiA9IGZvcm1hdC5jaGFyQXQoMyk7IGIgKz0gYjsNCiAgICB9IGVsc2UgaWYgKGZvcm1hdC5sZW5ndGggPT09IDcpIHsNCiAgICAgIHIgPSBmb3JtYXQuc3Vic3RyaW5nKDEsIDMpOw0KICAgICAgZyA9IGZvcm1hdC5zdWJzdHJpbmcoMywgNSk7DQogICAgICBiID0gZm9ybWF0LnN1YnN0cmluZyg1LCA3KTsNCiAgICB9DQogICAgciA9IHBhcnNlSW50KHIsIDE2KTsNCiAgICBnID0gcGFyc2VJbnQoZywgMTYpOw0KICAgIGIgPSBwYXJzZUludChiLCAxNik7DQogIH0NCg0KICByZXR1cm4gcmdiKHIsIGcsIGIpOw0KfQ0KDQpmdW5jdGlvbiBkM19yZ2JfaHNsKHIsIGcsIGIpIHsNCiAgdmFyIG1pbiA9IE1hdGgubWluKHIgLz0gMjU1LCBnIC89IDI1NSwgYiAvPSAyNTUpLA0KICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksDQogICAgICBkID0gbWF4IC0gbWluLA0KICAgICAgaCwNCiAgICAgIHMsDQogICAgICBsID0gKG1heCArIG1pbikgLyAyOw0KICBpZiAoZCkgew0KICAgIHMgPSBsIDwgLjUgPyBkIC8gKG1heCArIG1pbikgOiBkIC8gKDIgLSBtYXggLSBtaW4pOw0KICAgIGlmIChyID09IG1heCkgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOw0KICAgIGVsc2UgaWYgKGcgPT0gbWF4KSBoID0gKGIgLSByKSAvIGQgKyAyOw0KICAgIGVsc2UgaCA9IChyIC0gZykgLyBkICsgNDsNCiAgICBoICo9IDYwOw0KICB9IGVsc2Ugew0KICAgIHMgPSBoID0gMDsNCiAgfQ0KICByZXR1cm4gZDNfaHNsKGgsIHMsIGwpOw0KfQ0KDQpmdW5jdGlvbiBkM19yZ2JfcGFyc2VOdW1iZXIoYykgeyAvLyBlaXRoZXIgaW50ZWdlciBvciBwZXJjZW50YWdlDQogIHZhciBmID0gcGFyc2VGbG9hdChjKTsNCiAgcmV0dXJuIGMuY2hhckF0KGMubGVuZ3RoIC0gMSkgPT09ICIlIiA/IE1hdGgucm91bmQoZiAqIDIuNTUpIDogZjsNCn0NCg0KdmFyIGQzX3JnYl9uYW1lcyA9IGQzLm1hcCh7DQogIGFsaWNlYmx1ZTogIiNmMGY4ZmYiLA0KICBhbnRpcXVld2hpdGU6ICIjZmFlYmQ3IiwNCiAgYXF1YTogIiMwMGZmZmYiLA0KICBhcXVhbWFyaW5lOiAiIzdmZmZkNCIsDQogIGF6dXJlOiAiI2YwZmZmZiIsDQogIGJlaWdlOiAiI2Y1ZjVkYyIsDQogIGJpc3F1ZTogIiNmZmU0YzQiLA0KICBibGFjazogIiMwMDAwMDAiLA0KICBibGFuY2hlZGFsbW9uZDogIiNmZmViY2QiLA0KICBibHVlOiAiIzAwMDBmZiIsDQogIGJsdWV2aW9sZXQ6ICIjOGEyYmUyIiwNCiAgYnJvd246ICIjYTUyYTJhIiwNCiAgYnVybHl3b29kOiAiI2RlYjg4NyIsDQogIGNhZGV0Ymx1ZTogIiM1ZjllYTAiLA0KICBjaGFydHJldXNlOiAiIzdmZmYwMCIsDQogIGNob2NvbGF0ZTogIiNkMjY5MWUiLA0KICBjb3JhbDogIiNmZjdmNTAiLA0KICBjb3JuZmxvd2VyYmx1ZTogIiM2NDk1ZWQiLA0KICBjb3Juc2lsazogIiNmZmY4ZGMiLA0KICBjcmltc29uOiAiI2RjMTQzYyIsDQogIGN5YW46ICIjMDBmZmZmIiwNCiAgZGFya2JsdWU6ICIjMDAwMDhiIiwNCiAgZGFya2N5YW46ICIjMDA4YjhiIiwNCiAgZGFya2dvbGRlbnJvZDogIiNiODg2MGIiLA0KICBkYXJrZ3JheTogIiNhOWE5YTkiLA0KICBkYXJrZ3JlZW46ICIjMDA2NDAwIiwNCiAgZGFya2dyZXk6ICIjYTlhOWE5IiwNCiAgZGFya2toYWtpOiAiI2JkYjc2YiIsDQogIGRhcmttYWdlbnRhOiAiIzhiMDA4YiIsDQogIGRhcmtvbGl2ZWdyZWVuOiAiIzU1NmIyZiIsDQogIGRhcmtvcmFuZ2U6ICIjZmY4YzAwIiwNCiAgZGFya29yY2hpZDogIiM5OTMyY2MiLA0KICBkYXJrcmVkOiAiIzhiMDAwMCIsDQogIGRhcmtzYWxtb246ICIjZTk5NjdhIiwNCiAgZGFya3NlYWdyZWVuOiAiIzhmYmM4ZiIsDQogIGRhcmtzbGF0ZWJsdWU6ICIjNDgzZDhiIiwNCiAgZGFya3NsYXRlZ3JheTogIiMyZjRmNGYiLA0KICBkYXJrc2xhdGVncmV5OiAiIzJmNGY0ZiIsDQogIGRhcmt0dXJxdW9pc2U6ICIjMDBjZWQxIiwNCiAgZGFya3Zpb2xldDogIiM5NDAwZDMiLA0KICBkZWVwcGluazogIiNmZjE0OTMiLA0KICBkZWVwc2t5Ymx1ZTogIiMwMGJmZmYiLA0KICBkaW1ncmF5OiAiIzY5Njk2OSIsDQogIGRpbWdyZXk6ICIjNjk2OTY5IiwNCiAgZG9kZ2VyYmx1ZTogIiMxZTkwZmYiLA0KICBmaXJlYnJpY2s6ICIjYjIyMjIyIiwNCiAgZmxvcmFsd2hpdGU6ICIjZmZmYWYwIiwNCiAgZm9yZXN0Z3JlZW46ICIjMjI4YjIyIiwNCiAgZnVjaHNpYTogIiNmZjAwZmYiLA0KICBnYWluc2Jvcm86ICIjZGNkY2RjIiwNCiAgZ2hvc3R3aGl0ZTogIiNmOGY4ZmYiLA0KICBnb2xkOiAiI2ZmZDcwMCIsDQogIGdvbGRlbnJvZDogIiNkYWE1MjAiLA0KICBncmF5OiAiIzgwODA4MCIsDQogIGdyZWVuOiAiIzAwODAwMCIsDQogIGdyZWVueWVsbG93OiAiI2FkZmYyZiIsDQogIGdyZXk6ICIjODA4MDgwIiwNCiAgaG9uZXlkZXc6ICIjZjBmZmYwIiwNCiAgaG90cGluazogIiNmZjY5YjQiLA0KICBpbmRpYW5yZWQ6ICIjY2Q1YzVjIiwNCiAgaW5kaWdvOiAiIzRiMDA4MiIsDQogIGl2b3J5OiAiI2ZmZmZmMCIsDQogIGtoYWtpOiAiI2YwZTY4YyIsDQogIGxhdmVuZGVyOiAiI2U2ZTZmYSIsDQogIGxhdmVuZGVyYmx1c2g6ICIjZmZmMGY1IiwNCiAgbGF3bmdyZWVuOiAiIzdjZmMwMCIsDQogIGxlbW9uY2hpZmZvbjogIiNmZmZhY2QiLA0KICBsaWdodGJsdWU6ICIjYWRkOGU2IiwNCiAgbGlnaHRjb3JhbDogIiNmMDgwODAiLA0KICBsaWdodGN5YW46ICIjZTBmZmZmIiwNCiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6ICIjZmFmYWQyIiwNCiAgbGlnaHRncmF5OiAiI2QzZDNkMyIsDQogIGxpZ2h0Z3JlZW46ICIjOTBlZTkwIiwNCiAgbGlnaHRncmV5OiAiI2QzZDNkMyIsDQogIGxpZ2h0cGluazogIiNmZmI2YzEiLA0KICBsaWdodHNhbG1vbjogIiNmZmEwN2EiLA0KICBsaWdodHNlYWdyZWVuOiAiIzIwYjJhYSIsDQogIGxpZ2h0c2t5Ymx1ZTogIiM4N2NlZmEiLA0KICBsaWdodHNsYXRlZ3JheTogIiM3Nzg4OTkiLA0KICBsaWdodHNsYXRlZ3JleTogIiM3Nzg4OTkiLA0KICBsaWdodHN0ZWVsYmx1ZTogIiNiMGM0ZGUiLA0KICBsaWdodHllbGxvdzogIiNmZmZmZTAiLA0KICBsaW1lOiAiIzAwZmYwMCIsDQogIGxpbWVncmVlbjogIiMzMmNkMzIiLA0KICBsaW5lbjogIiNmYWYwZTYiLA0KICBtYWdlbnRhOiAiI2ZmMDBmZiIsDQogIG1hcm9vbjogIiM4MDAwMDAiLA0KICBtZWRpdW1hcXVhbWFyaW5lOiAiIzY2Y2RhYSIsDQogIG1lZGl1bWJsdWU6ICIjMDAwMGNkIiwNCiAgbWVkaXVtb3JjaGlkOiAiI2JhNTVkMyIsDQogIG1lZGl1bXB1cnBsZTogIiM5MzcwZGIiLA0KICBtZWRpdW1zZWFncmVlbjogIiMzY2IzNzEiLA0KICBtZWRpdW1zbGF0ZWJsdWU6ICIjN2I2OGVlIiwNCiAgbWVkaXVtc3ByaW5nZ3JlZW46ICIjMDBmYTlhIiwNCiAgbWVkaXVtdHVycXVvaXNlOiAiIzQ4ZDFjYyIsDQogIG1lZGl1bXZpb2xldHJlZDogIiNjNzE1ODUiLA0KICBtaWRuaWdodGJsdWU6ICIjMTkxOTcwIiwNCiAgbWludGNyZWFtOiAiI2Y1ZmZmYSIsDQogIG1pc3R5cm9zZTogIiNmZmU0ZTEiLA0KICBtb2NjYXNpbjogIiNmZmU0YjUiLA0KICBuYXZham93aGl0ZTogIiNmZmRlYWQiLA0KICBuYXZ5OiAiIzAwMDA4MCIsDQogIG9sZGxhY2U6ICIjZmRmNWU2IiwNCiAgb2xpdmU6ICIjODA4MDAwIiwNCiAgb2xpdmVkcmFiOiAiIzZiOGUyMyIsDQogIG9yYW5nZTogIiNmZmE1MDAiLA0KICBvcmFuZ2VyZWQ6ICIjZmY0NTAwIiwNCiAgb3JjaGlkOiAiI2RhNzBkNiIsDQogIHBhbGVnb2xkZW5yb2Q6ICIjZWVlOGFhIiwNCiAgcGFsZWdyZWVuOiAiIzk4ZmI5OCIsDQogIHBhbGV0dXJxdW9pc2U6ICIjYWZlZWVlIiwNCiAgcGFsZXZpb2xldHJlZDogIiNkYjcwOTMiLA0KICBwYXBheWF3aGlwOiAiI2ZmZWZkNSIsDQogIHBlYWNocHVmZjogIiNmZmRhYjkiLA0KICBwZXJ1OiAiI2NkODUzZiIsDQogIHBpbms6ICIjZmZjMGNiIiwNCiAgcGx1bTogIiNkZGEwZGQiLA0KICBwb3dkZXJibHVlOiAiI2IwZTBlNiIsDQogIHB1cnBsZTogIiM4MDAwODAiLA0KICByZWQ6ICIjZmYwMDAwIiwNCiAgcm9zeWJyb3duOiAiI2JjOGY4ZiIsDQogIHJveWFsYmx1ZTogIiM0MTY5ZTEiLA0KICBzYWRkbGVicm93bjogIiM4YjQ1MTMiLA0KICBzYWxtb246ICIjZmE4MDcyIiwNCiAgc2FuZHlicm93bjogIiNmNGE0NjAiLA0KICBzZWFncmVlbjogIiMyZThiNTciLA0KICBzZWFzaGVsbDogIiNmZmY1ZWUiLA0KICBzaWVubmE6ICIjYTA1MjJkIiwNCiAgc2lsdmVyOiAiI2MwYzBjMCIsDQogIHNreWJsdWU6ICIjODdjZWViIiwNCiAgc2xhdGVibHVlOiAiIzZhNWFjZCIsDQogIHNsYXRlZ3JheTogIiM3MDgwOTAiLA0KICBzbGF0ZWdyZXk6ICIjNzA4MDkwIiwNCiAgc25vdzogIiNmZmZhZmEiLA0KICBzcHJpbmdncmVlbjogIiMwMGZmN2YiLA0KICBzdGVlbGJsdWU6ICIjNDY4MmI0IiwNCiAgdGFuOiAiI2QyYjQ4YyIsDQogIHRlYWw6ICIjMDA4MDgwIiwNCiAgdGhpc3RsZTogIiNkOGJmZDgiLA0KICB0b21hdG86ICIjZmY2MzQ3IiwNCiAgdHVycXVvaXNlOiAiIzQwZTBkMCIsDQogIHZpb2xldDogIiNlZTgyZWUiLA0KICB3aGVhdDogIiNmNWRlYjMiLA0KICB3aGl0ZTogIiNmZmZmZmYiLA0KICB3aGl0ZXNtb2tlOiAiI2Y1ZjVmNSIsDQogIHllbGxvdzogIiNmZmZmMDAiLA0KICB5ZWxsb3dncmVlbjogIiM5YWNkMzIiDQp9KTsNCg0KZDNfcmdiX25hbWVzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgew0KICBkM19yZ2JfbmFtZXMuc2V0KGtleSwgZDNfcmdiX3BhcnNlKHZhbHVlLCBkM19yZ2IsIGQzX2hzbF9yZ2IpKTsNCn0pOw0KZDMuaHNsID0gZnVuY3Rpb24oaCwgcywgbCkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMQ0KICAgICAgPyAoaCBpbnN0YW5jZW9mIGQzX0hzbCA/IGQzX2hzbChoLmgsIGgucywgaC5sKQ0KICAgICAgOiBkM19yZ2JfcGFyc2UoIiIgKyBoLCBkM19yZ2JfaHNsLCBkM19oc2wpKQ0KICAgICAgOiBkM19oc2woK2gsICtzLCArbCk7DQp9Ow0KDQpmdW5jdGlvbiBkM19oc2woaCwgcywgbCkgew0KICByZXR1cm4gbmV3IGQzX0hzbChoLCBzLCBsKTsNCn0NCg0KZnVuY3Rpb24gZDNfSHNsKGgsIHMsIGwpIHsNCiAgdGhpcy5oID0gaDsNCiAgdGhpcy5zID0gczsNCiAgdGhpcy5sID0gbDsNCn0NCg0KZDNfSHNsLnByb3RvdHlwZS5icmlnaHRlciA9IGZ1bmN0aW9uKGspIHsNCiAgayA9IE1hdGgucG93KDAuNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTsNCiAgcmV0dXJuIGQzX2hzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sIC8gayk7DQp9Ow0KDQpkM19Ic2wucHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHsNCiAgayA9IE1hdGgucG93KDAuNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTsNCiAgcmV0dXJuIGQzX2hzbCh0aGlzLmgsIHRoaXMucywgayAqIHRoaXMubCk7DQp9Ow0KDQpkM19Ic2wucHJvdG90eXBlLnJnYiA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gZDNfaHNsX3JnYih0aGlzLmgsIHRoaXMucywgdGhpcy5sKTsNCn07DQoNCmQzX0hzbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIHRoaXMucmdiKCkudG9TdHJpbmcoKTsNCn07DQoNCmZ1bmN0aW9uIGQzX2hzbF9yZ2IoaCwgcywgbCkgew0KICB2YXIgbTEsDQogICAgICBtMjsNCg0KICAvKiBTb21lIHNpbXBsZSBjb3JyZWN0aW9ucyBmb3IgaCwgcyBhbmQgbC4gKi8NCiAgaCA9IGggJSAzNjA7IGlmIChoIDwgMCkgaCArPSAzNjA7DQogIHMgPSBzIDwgMCA/IDAgOiBzID4gMSA/IDEgOiBzOw0KICBsID0gbCA8IDAgPyAwIDogbCA+IDEgPyAxIDogbDsNCg0KICAvKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovDQogIG0yID0gbCA8PSAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogczsNCiAgbTEgPSAyICogbCAtIG0yOw0KDQogIGZ1bmN0aW9uIHYoaCkgew0KICAgIGlmIChoID4gMzYwKSBoIC09IDM2MDsNCiAgICBlbHNlIGlmIChoIDwgMCkgaCArPSAzNjA7DQogICAgaWYgKGggPCA2MCkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAvIDYwOw0KICAgIGlmIChoIDwgMTgwKSByZXR1cm4gbTI7DQogICAgaWYgKGggPCAyNDApIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwOw0KICAgIHJldHVybiBtMTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHZ2KGgpIHsNCiAgICByZXR1cm4gTWF0aC5yb3VuZCh2KGgpICogMjU1KTsNCiAgfQ0KDQogIHJldHVybiBkM19yZ2IodnYoaCArIDEyMCksIHZ2KGgpLCB2dihoIC0gMTIwKSk7DQp9DQpmdW5jdGlvbiBkM19zZWxlY3Rpb24oZ3JvdXBzKSB7DQogIGQzX2FycmF5U3ViY2xhc3MoZ3JvdXBzLCBkM19zZWxlY3Rpb25Qcm90b3R5cGUpOw0KICByZXR1cm4gZ3JvdXBzOw0KfQ0KDQp2YXIgZDNfc2VsZWN0ID0gZnVuY3Rpb24ocywgbikgeyByZXR1cm4gbi5xdWVyeVNlbGVjdG9yKHMpOyB9LA0KICAgIGQzX3NlbGVjdEFsbCA9IGZ1bmN0aW9uKHMsIG4pIHsgcmV0dXJuIG4ucXVlcnlTZWxlY3RvckFsbChzKTsgfSwNCiAgICBkM19zZWxlY3RSb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LA0KICAgIGQzX3NlbGVjdE1hdGNoZXIgPSBkM19zZWxlY3RSb290Lm1hdGNoZXNTZWxlY3RvciB8fCBkM19zZWxlY3RSb290LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBkM19zZWxlY3RSb290Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBkM19zZWxlY3RSb290Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGQzX3NlbGVjdFJvb3Qub01hdGNoZXNTZWxlY3RvciwNCiAgICBkM19zZWxlY3RNYXRjaGVzID0gZnVuY3Rpb24obiwgcykgeyByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlci5jYWxsKG4sIHMpOyB9Ow0KDQovLyBQcmVmZXIgU2l6emxlLCBpZiBhdmFpbGFibGUuDQppZiAodHlwZW9mIFNpenpsZSA9PT0gImZ1bmN0aW9uIikgew0KICBkM19zZWxlY3QgPSBmdW5jdGlvbihzLCBuKSB7IHJldHVybiBTaXp6bGUocywgbilbMF07IH07DQogIGQzX3NlbGVjdEFsbCA9IGZ1bmN0aW9uKHMsIG4pIHsgcmV0dXJuIFNpenpsZS51bmlxdWVTb3J0KFNpenpsZShzLCBuKSk7IH07DQogIGQzX3NlbGVjdE1hdGNoZXMgPSBTaXp6bGUubWF0Y2hlc1NlbGVjdG9yOw0KfQ0KDQp2YXIgZDNfc2VsZWN0aW9uUHJvdG90eXBlID0gW107DQoNCmQzLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gZDNfc2VsZWN0aW9uUm9vdDsNCn07DQoNCmQzLnNlbGVjdGlvbi5wcm90b3R5cGUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGU7DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCiAgdmFyIHN1Ymdyb3VwcyA9IFtdLA0KICAgICAgc3ViZ3JvdXAsDQogICAgICBzdWJub2RlLA0KICAgICAgZ3JvdXAsDQogICAgICBub2RlOw0KDQogIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICJmdW5jdGlvbiIpIHNlbGVjdG9yID0gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKHNlbGVjdG9yKTsNCg0KICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTspIHsNCiAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsNCiAgICBzdWJncm91cC5wYXJlbnROb2RlID0gKGdyb3VwID0gdGhpc1tqXSkucGFyZW50Tm9kZTsNCiAgICBmb3IgKHZhciBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIHN1Ymdyb3VwLnB1c2goc3Vibm9kZSA9IHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpOw0KICAgICAgICBpZiAoc3Vibm9kZSAmJiAiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7DQp9Ow0KDQpmdW5jdGlvbiBkM19zZWxlY3Rpb25fc2VsZWN0b3Ioc2VsZWN0b3IpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBkM19zZWxlY3Qoc2VsZWN0b3IsIHRoaXMpOw0KICB9Ow0KfQ0KZDNfc2VsZWN0aW9uUHJvdG90eXBlLnNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogIHZhciBzdWJncm91cHMgPSBbXSwNCiAgICAgIHN1Ymdyb3VwLA0KICAgICAgbm9kZTsNCg0KICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvckFsbChzZWxlY3Rvcik7DQoNCiAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gZDNfYXJyYXkoc2VsZWN0b3IuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpKSkpOw0KICAgICAgICBzdWJncm91cC5wYXJlbnROb2RlID0gbm9kZTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7DQp9Ow0KDQpmdW5jdGlvbiBkM19zZWxlY3Rpb25fc2VsZWN0b3JBbGwoc2VsZWN0b3IpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBkM19zZWxlY3RBbGwoc2VsZWN0b3IsIHRoaXMpOw0KICB9Ow0KfQ0KZDNfc2VsZWN0aW9uUHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lKTsNCg0KICAvLyBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgZmlyc3QgdmFsdWUuDQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgew0KICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7DQogICAgcmV0dXJuIG5hbWUubG9jYWwNCiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpDQogICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7DQogIH0NCg0KICBmdW5jdGlvbiBhdHRyTnVsbCgpIHsNCiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGF0dHJOdWxsTlMoKSB7DQogICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGF0dHJDb25zdGFudCgpIHsNCiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7DQogIH0NCg0KICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUygpIHsNCiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwsIHZhbHVlKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbigpIHsNCiAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgaWYgKHggPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7DQogICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB4KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKCkgew0KICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICBpZiAoeCA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpOw0KICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsLCB4KTsNCiAgfQ0KDQogIHJldHVybiB0aGlzLmVhY2godmFsdWUgPT0gbnVsbA0KICAgICAgPyAobmFtZS5sb2NhbCA/IGF0dHJOdWxsTlMgOiBhdHRyTnVsbCkgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQogICAgICA/IChuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pDQogICAgICA6IChuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSk7DQp9Ow0KZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNsYXNzZWQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICB2YXIgbmFtZXMgPSBuYW1lLnNwbGl0KGQzX3NlbGVjdGlvbl9jbGFzc2VkV2hpdGVzcGFjZSksDQogICAgICBuID0gbmFtZXMubGVuZ3RoLA0KICAgICAgaSA9IC0xOw0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgZDNfc2VsZWN0aW9uX2NsYXNzZWQuY2FsbCh0aGlzLCBuYW1lc1tpXSwgdmFsdWUpOw0KICAgIHJldHVybiB0aGlzOw0KICB9IGVsc2Ugew0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWQzX3NlbGVjdGlvbl9jbGFzc2VkLmNhbGwodGhpcywgbmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7DQogICAgcmV0dXJuIHRydWU7DQogIH0NCn07DQoNCnZhciBkM19zZWxlY3Rpb25fY2xhc3NlZFdoaXRlc3BhY2UgPSAvXHMrL2c7DQoNCmZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSB7DQogIHZhciByZSA9IG5ldyBSZWdFeHAoIihefFxccyspIiArIGQzLnJlcXVvdGUobmFtZSkgKyAiKFxccyt8JCkiLCAiZyIpOw0KDQogIC8vIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZS4NCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7DQogICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTsNCiAgICBpZiAoYyA9IG5vZGUuY2xhc3NMaXN0KSByZXR1cm4gYy5jb250YWlucyhuYW1lKTsNCiAgICB2YXIgYyA9IG5vZGUuY2xhc3NOYW1lOw0KICAgIHJlLmxhc3RJbmRleCA9IDA7DQogICAgcmV0dXJuIHJlLnRlc3QoYy5iYXNlVmFsICE9IG51bGwgPyBjLmJhc2VWYWwgOiBjKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGNsYXNzZWRBZGQoKSB7DQogICAgaWYgKGMgPSB0aGlzLmNsYXNzTGlzdCkgcmV0dXJuIGMuYWRkKG5hbWUpOw0KICAgIHZhciBjID0gdGhpcy5jbGFzc05hbWUsDQogICAgICAgIGNiID0gYy5iYXNlVmFsICE9IG51bGwsDQogICAgICAgIGN2ID0gY2IgPyBjLmJhc2VWYWwgOiBjOw0KICAgIHJlLmxhc3RJbmRleCA9IDA7DQogICAgaWYgKCFyZS50ZXN0KGN2KSkgew0KICAgICAgY3YgPSBkM19jb2xsYXBzZShjdiArICIgIiArIG5hbWUpOw0KICAgICAgaWYgKGNiKSBjLmJhc2VWYWwgPSBjdjsNCiAgICAgIGVsc2UgdGhpcy5jbGFzc05hbWUgPSBjdjsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKCkgew0KICAgIGlmIChjID0gdGhpcy5jbGFzc0xpc3QpIHJldHVybiBjLnJlbW92ZShuYW1lKTsNCiAgICB2YXIgYyA9IHRoaXMuY2xhc3NOYW1lLA0KICAgICAgICBjYiA9IGMuYmFzZVZhbCAhPSBudWxsLA0KICAgICAgICBjdiA9IGNiID8gYy5iYXNlVmFsIDogYzsNCiAgICBjdiA9IGQzX2NvbGxhcHNlKGN2LnJlcGxhY2UocmUsICIgIikpOw0KICAgIGlmIChjYikgYy5iYXNlVmFsID0gY3Y7DQogICAgZWxzZSB0aGlzLmNsYXNzTmFtZSA9IGN2Ow0KICB9DQoNCiAgZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKCkgew0KICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpDQogICAgICAgID8gY2xhc3NlZEFkZA0KICAgICAgICA6IGNsYXNzZWRSZW1vdmUpLmNhbGwodGhpcyk7DQogIH0NCg0KICByZXR1cm4gdGhpcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZQ0KICAgICAgPyBjbGFzc2VkQWRkDQogICAgICA6IGNsYXNzZWRSZW1vdmUpOw0KfQ0KZDNfc2VsZWN0aW9uUHJvdG90eXBlLnN0eWxlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7DQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgcHJpb3JpdHkgPSAiIjsNCg0KICAvLyBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgZmlyc3QgdmFsdWUuDQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHdpbmRvdw0KICAgICAgLmdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKCksIG51bGwpDQogICAgICAuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTsNCg0KICBmdW5jdGlvbiBzdHlsZU51bGwoKSB7DQogICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQoKSB7DQogICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpOw0KICB9DQoNCiAgZnVuY3Rpb24gc3R5bGVGdW5jdGlvbigpIHsNCiAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgaWYgKHggPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsNCiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgeCwgcHJpb3JpdHkpOw0KICB9DQoNCiAgcmV0dXJuIHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsDQogICAgICA/IHN0eWxlTnVsbCA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgID8gc3R5bGVGdW5jdGlvbiA6IHN0eWxlQ29uc3RhbnQpKTsNCn07DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUucHJvcGVydHkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KDQogIC8vIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZS4NCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gdGhpcy5ub2RlKClbbmFtZV07DQoNCiAgZnVuY3Rpb24gcHJvcGVydHlOdWxsKCkgew0KICAgIGRlbGV0ZSB0aGlzW25hbWVdOw0KICB9DQoNCiAgZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudCgpIHsNCiAgICB0aGlzW25hbWVdID0gdmFsdWU7DQogIH0NCg0KICBmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKCkgew0KICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICBpZiAoeCA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTsNCiAgICBlbHNlIHRoaXNbbmFtZV0gPSB4Ow0KICB9DQoNCiAgcmV0dXJuIHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsDQogICAgICA/IHByb3BlcnR5TnVsbCA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgID8gcHJvcGVydHlGdW5jdGlvbiA6IHByb3BlcnR5Q29uc3RhbnQpKTsNCn07DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7DQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMQ0KICAgICAgPyB0aGlzLm5vZGUoKS50ZXh0Q29udGVudCA6IHRoaXMuZWFjaCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgID8gZnVuY3Rpb24oKSB7IHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/ICIiIDogdjsgfSA6IHZhbHVlID09IG51bGwNCiAgICAgID8gZnVuY3Rpb24oKSB7IHRoaXMudGV4dENvbnRlbnQgPSAiIjsgfQ0KICAgICAgOiBmdW5jdGlvbigpIHsgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOyB9KTsNCn07DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUuaHRtbCA9IGZ1bmN0aW9uKHZhbHVlKSB7DQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMQ0KICAgICAgPyB0aGlzLm5vZGUoKS5pbm5lckhUTUwgOiB0aGlzLmVhY2godHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQogICAgICA/IGZ1bmN0aW9uKCkgeyB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gIiIgOiB2OyB9IDogdmFsdWUgPT0gbnVsbA0KICAgICAgPyBmdW5jdGlvbigpIHsgdGhpcy5pbm5lckhUTUwgPSAiIjsgfQ0KICAgICAgOiBmdW5jdGlvbigpIHsgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTsgfSk7DQp9Ow0KLy8gVE9ETyBhcHBlbmQobm9kZSk/DQovLyBUT0RPIGFwcGVuZChmdW5jdGlvbik/DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSkgew0KICBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lKTsNCg0KICBmdW5jdGlvbiBhcHBlbmQoKSB7DQogICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLCBuYW1lKSk7DQogIH0NCg0KICBmdW5jdGlvbiBhcHBlbmROUygpIHsNCiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCkpOw0KICB9DQoNCiAgcmV0dXJuIHRoaXMuc2VsZWN0KG5hbWUubG9jYWwgPyBhcHBlbmROUyA6IGFwcGVuZCk7DQp9Ow0KLy8gVE9ETyBpbnNlcnQobm9kZSwgZnVuY3Rpb24pPw0KLy8gVE9ETyBpbnNlcnQoZnVuY3Rpb24sIHN0cmluZyk/DQovLyBUT0RPIGluc2VydChmdW5jdGlvbiwgZnVuY3Rpb24pPw0KZDNfc2VsZWN0aW9uUHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkgew0KICBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lKTsNCg0KICBmdW5jdGlvbiBpbnNlcnQoKSB7DQogICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKA0KICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksIG5hbWUpLA0KICAgICAgICBkM19zZWxlY3QoYmVmb3JlLCB0aGlzKSk7DQogIH0NCg0KICBmdW5jdGlvbiBpbnNlcnROUygpIHsNCiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoDQogICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSwNCiAgICAgICAgZDNfc2VsZWN0KGJlZm9yZSwgdGhpcykpOw0KICB9DQoNCiAgcmV0dXJuIHRoaXMuc2VsZWN0KG5hbWUubG9jYWwgPyBpbnNlcnROUyA6IGluc2VydCk7DQp9Ow0KLy8gVE9ETyByZW1vdmUoc2VsZWN0b3IpPw0KLy8gVE9ETyByZW1vdmUobm9kZSk/DQovLyBUT0RPIHJlbW92ZShmdW5jdGlvbik/DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7DQogICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsNCiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7DQogIH0pOw0KfTsNCmQzX3NlbGVjdGlvblByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24odmFsdWUsIGtleSkgew0KICB2YXIgaSA9IC0xLA0KICAgICAgbiA9IHRoaXMubGVuZ3RoLA0KICAgICAgZ3JvdXAsDQogICAgICBub2RlOw0KDQogIC8vIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZS4NCiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7DQogICAgdmFsdWUgPSBuZXcgQXJyYXkobiA9IChncm91cCA9IHRoaXNbMF0pLmxlbmd0aCk7DQogICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCiAgICAgICAgdmFsdWVbaV0gPSBub2RlLl9fZGF0YV9fOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gdmFsdWU7DQogIH0NCg0KICBmdW5jdGlvbiBiaW5kKGdyb3VwLCBncm91cERhdGEpIHsNCiAgICB2YXIgaSwNCiAgICAgICAgbiA9IGdyb3VwLmxlbmd0aCwNCiAgICAgICAgbSA9IGdyb3VwRGF0YS5sZW5ndGgsDQogICAgICAgIG4wID0gTWF0aC5taW4obiwgbSksDQogICAgICAgIG4xID0gTWF0aC5tYXgobiwgbSksDQogICAgICAgIHVwZGF0ZU5vZGVzID0gW10sDQogICAgICAgIGVudGVyTm9kZXMgPSBbXSwNCiAgICAgICAgZXhpdE5vZGVzID0gW10sDQogICAgICAgIG5vZGUsDQogICAgICAgIG5vZGVEYXRhOw0KDQogICAgaWYgKGtleSkgew0KICAgICAgdmFyIG5vZGVCeUtleVZhbHVlID0gbmV3IGQzX01hcCwNCiAgICAgICAgICBrZXlWYWx1ZXMgPSBbXSwNCiAgICAgICAgICBrZXlWYWx1ZSwNCiAgICAgICAgICBqID0gZ3JvdXBEYXRhLmxlbmd0aDsNCg0KICAgICAgZm9yIChpID0gLTE7ICsraSA8IG47KSB7DQogICAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSA9IGdyb3VwW2ldLCBub2RlLl9fZGF0YV9fLCBpKTsNCiAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHsNCiAgICAgICAgICBleGl0Tm9kZXNbaisrXSA9IG5vZGU7IC8vIGR1cGxpY2F0ZSBrZXkNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpOw0KICAgICAgICB9DQogICAgICAgIGtleVZhbHVlcy5wdXNoKGtleVZhbHVlKTsNCiAgICAgIH0NCg0KICAgICAgZm9yIChpID0gLTE7ICsraSA8IG07KSB7DQogICAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwoZ3JvdXBEYXRhLCBub2RlRGF0YSA9IGdyb3VwRGF0YVtpXSwgaSkNCiAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHsNCiAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpOw0KICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBub2RlRGF0YTsNCiAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZXhpdE5vZGVzW2ldID0gbnVsbDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKG5vZGVEYXRhKTsNCiAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IGV4aXROb2Rlc1tpXSA9IG51bGw7DQogICAgICAgIH0NCiAgICAgICAgbm9kZUJ5S2V5VmFsdWUucmVtb3ZlKGtleVZhbHVlKTsNCiAgICAgIH0NCg0KICAgICAgZm9yIChpID0gLTE7ICsraSA8IG47KSB7DQogICAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWVzW2ldKSkgew0KICAgICAgICAgIGV4aXROb2Rlc1tpXSA9IGdyb3VwW2ldOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBuMDspIHsNCiAgICAgICAgbm9kZSA9IGdyb3VwW2ldOw0KICAgICAgICBub2RlRGF0YSA9IGdyb3VwRGF0YVtpXTsNCiAgICAgICAgaWYgKG5vZGUpIHsNCiAgICAgICAgICBub2RlLl9fZGF0YV9fID0gbm9kZURhdGE7DQogICAgICAgICAgdXBkYXRlTm9kZXNbaV0gPSBub2RlOw0KICAgICAgICAgIGVudGVyTm9kZXNbaV0gPSBleGl0Tm9kZXNbaV0gPSBudWxsOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGVudGVyTm9kZXNbaV0gPSBkM19zZWxlY3Rpb25fZGF0YU5vZGUobm9kZURhdGEpOw0KICAgICAgICAgIHVwZGF0ZU5vZGVzW2ldID0gZXhpdE5vZGVzW2ldID0gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgZm9yICg7IGkgPCBtOyArK2kpIHsNCiAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGQzX3NlbGVjdGlvbl9kYXRhTm9kZShncm91cERhdGFbaV0pOw0KICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IGV4aXROb2Rlc1tpXSA9IG51bGw7DQogICAgICB9DQogICAgICBmb3IgKDsgaSA8IG4xOyArK2kpIHsNCiAgICAgICAgZXhpdE5vZGVzW2ldID0gZ3JvdXBbaV07DQogICAgICAgIGVudGVyTm9kZXNbaV0gPSB1cGRhdGVOb2Rlc1tpXSA9IG51bGw7DQogICAgICB9DQogICAgfQ0KDQogICAgZW50ZXJOb2Rlcy51cGRhdGUNCiAgICAgICAgPSB1cGRhdGVOb2RlczsNCg0KICAgIGVudGVyTm9kZXMucGFyZW50Tm9kZQ0KICAgICAgICA9IHVwZGF0ZU5vZGVzLnBhcmVudE5vZGUNCiAgICAgICAgPSBleGl0Tm9kZXMucGFyZW50Tm9kZQ0KICAgICAgICA9IGdyb3VwLnBhcmVudE5vZGU7DQoNCiAgICBlbnRlci5wdXNoKGVudGVyTm9kZXMpOw0KICAgIHVwZGF0ZS5wdXNoKHVwZGF0ZU5vZGVzKTsNCiAgICBleGl0LnB1c2goZXhpdE5vZGVzKTsNCiAgfQ0KDQogIHZhciBlbnRlciA9IGQzX3NlbGVjdGlvbl9lbnRlcihbXSksDQogICAgICB1cGRhdGUgPSBkM19zZWxlY3Rpb24oW10pLA0KICAgICAgZXhpdCA9IGQzX3NlbGVjdGlvbihbXSk7DQoNCiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIikgew0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBiaW5kKGdyb3VwID0gdGhpc1tpXSwgdmFsdWUuY2FsbChncm91cCwgZ3JvdXAucGFyZW50Tm9kZS5fX2RhdGFfXywgaSkpOw0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgYmluZChncm91cCA9IHRoaXNbaV0sIHZhbHVlKTsNCiAgICB9DQogIH0NCg0KICB1cGRhdGUuZW50ZXIgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGVudGVyOyB9Ow0KICB1cGRhdGUuZXhpdCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZXhpdDsgfTsNCiAgcmV0dXJuIHVwZGF0ZTsNCn07DQoNCmZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9kYXRhTm9kZShkYXRhKSB7DQogIHJldHVybiB7X19kYXRhX186IGRhdGF9Ow0KfQ0KZDNfc2VsZWN0aW9uUHJvdG90eXBlLmRhdHVtID0NCmQzX3NlbGVjdGlvblByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDENCiAgICAgID8gdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iKQ0KICAgICAgOiB0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsIHZhbHVlKTsNCn07DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyKSB7DQogIHZhciBzdWJncm91cHMgPSBbXSwNCiAgICAgIHN1Ymdyb3VwLA0KICAgICAgZ3JvdXAsDQogICAgICBub2RlOw0KDQogIGlmICh0eXBlb2YgZmlsdGVyICE9PSAiZnVuY3Rpb24iKSBmaWx0ZXIgPSBkM19zZWxlY3Rpb25fZmlsdGVyKGZpbHRlcik7DQoNCiAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykgew0KICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOw0KICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSAoZ3JvdXAgPSB0aGlzW2pdKS5wYXJlbnROb2RlOw0KICAgIGZvciAodmFyIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQogICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgZmlsdGVyLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpIHsNCiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7DQp9Ow0KDQpmdW5jdGlvbiBkM19zZWxlY3Rpb25fZmlsdGVyKHNlbGVjdG9yKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlcyh0aGlzLCBzZWxlY3Rvcik7DQogIH07DQp9DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUub3JkZXIgPSBmdW5jdGlvbigpIHsNCiAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCiAgICAgICAgaWYgKG5leHQgJiYgbmV4dCAhPT0gbm9kZS5uZXh0U2libGluZykgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsNCiAgICAgICAgbmV4dCA9IG5vZGU7DQogICAgICB9DQogICAgfQ0KICB9DQogIHJldHVybiB0aGlzOw0KfTsNCmQzX3NlbGVjdGlvblByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24oY29tcGFyYXRvcikgew0KICBjb21wYXJhdG9yID0gZDNfc2VsZWN0aW9uX3NvcnRDb21wYXJhdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgdGhpc1tqXS5zb3J0KGNvbXBhcmF0b3IpOw0KICByZXR1cm4gdGhpcy5vcmRlcigpOw0KfTsNCg0KZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NvcnRDb21wYXJhdG9yKGNvbXBhcmF0b3IpIHsNCiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSBjb21wYXJhdG9yID0gZDMuYXNjZW5kaW5nOw0KICByZXR1cm4gZnVuY3Rpb24oYSwgYikgew0KICAgIHJldHVybiBjb21wYXJhdG9yKGEgJiYgYS5fX2RhdGFfXywgYiAmJiBiLl9fZGF0YV9fKTsNCiAgfTsNCn0NCi8vIHR5cGUgY2FuIGJlIG5hbWVzcGFjZWQsIGUuZy4sICJjbGljay5mb28iDQovLyBsaXN0ZW5lciBjYW4gYmUgbnVsbCBmb3IgcmVtb3ZhbA0KZDNfc2VsZWN0aW9uUHJvdG90eXBlLm9uID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpIHsNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBjYXB0dXJlID0gZmFsc2U7DQoNCiAgLy8gcGFyc2UgdGhlIHR5cGUgc3BlY2lmaWVyDQogIHZhciBuYW1lID0gIl9fb24iICsgdHlwZSwgaSA9IHR5cGUuaW5kZXhPZigiLiIpOw0KICBpZiAoaSA+IDApIHR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCBpKTsNCg0KICAvLyBpZiBjYWxsZWQgd2l0aCBvbmx5IG9uZSBhcmd1bWVudCwgcmV0dXJuIHRoZSBjdXJyZW50IGxpc3RlbmVyDQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChpID0gdGhpcy5ub2RlKClbbmFtZV0pICYmIGkuXzsNCg0KICAvLyByZW1vdmUgdGhlIG9sZCBldmVudCBsaXN0ZW5lciwgYW5kIGFkZCB0aGUgbmV3IGV2ZW50IGxpc3RlbmVyDQogIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZCwgaSkgew0KICAgIHZhciBub2RlID0gdGhpcywNCiAgICAgICAgbyA9IG5vZGVbbmFtZV07DQoNCiAgICAvLyByZW1vdmUgdGhlIG9sZCBsaXN0ZW5lciwgaWYgYW55ICh1c2luZyB0aGUgcHJldmlvdXNseS1zZXQgY2FwdHVyZSkNCiAgICBpZiAobykgew0KICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIG8sIG8uJCk7DQogICAgICBkZWxldGUgbm9kZVtuYW1lXTsNCiAgICB9DQoNCiAgICAvLyBhZGQgdGhlIG5ldyBsaXN0ZW5lciwgaWYgYW55IChyZW1lbWJlcmluZyB0aGUgY2FwdHVyZSBmbGFnKQ0KICAgIGlmIChsaXN0ZW5lcikgew0KICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIG5vZGVbbmFtZV0gPSBsLCBsLiQgPSBjYXB0dXJlKTsNCiAgICAgIGwuXyA9IGxpc3RlbmVyOyAvLyBzdGFzaCB0aGUgdW53cmFwcGVkIGxpc3RlbmVyIGZvciBnZXQNCiAgICB9DQoNCiAgICAvLyB3cmFwcGVkIGV2ZW50IGxpc3RlbmVyIHRoYXQgcHJlc2VydmVzIGkNCiAgICBmdW5jdGlvbiBsKGUpIHsNCiAgICAgIHZhciBvID0gZDMuZXZlbnQ7IC8vIEV2ZW50cyBjYW4gYmUgcmVlbnRyYW50IChlLmcuLCBmb2N1cykuDQogICAgICBkMy5ldmVudCA9IGU7DQogICAgICB0cnkgew0KICAgICAgICBsaXN0ZW5lci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpOw0KICAgICAgfSBmaW5hbGx5IHsNCiAgICAgICAgZDMuZXZlbnQgPSBvOw0KICAgICAgfQ0KICAgIH0NCiAgfSk7DQp9Ow0KZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykgew0KICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTspIHsNCiAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjspIHsNCiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07DQogICAgICBpZiAobm9kZSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIHRoaXM7DQp9Ow0KLy8NCi8vIE5vdGU6IGFzc2lnbmluZyB0byB0aGUgYXJndW1lbnRzIGFycmF5IHNpbXVsdGFuZW91c2x5IGNoYW5nZXMgdGhlIHZhbHVlIG9mDQovLyB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudCENCi8vDQovLyBUT0RPIFRoZSBgdGhpc2AgYXJndW1lbnQgcHJvYmFibHkgc2hvdWxkbid0IGJlIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUNCi8vIGNhbGxiYWNrLCBhbnl3YXksIHNpbmNlIGl0J3MgcmVkdW5kYW50LiBIb3dldmVyLCB0aGF0IHdpbGwgcmVxdWlyZSBhIG1ham9yDQovLyB2ZXJzaW9uIGJ1bXAgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzbyBJJ20gbm90IGNoYW5naW5nIGl0IHJpZ2h0DQovLyBhd2F5Lg0KLy8NCmQzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24oY2FsbGJhY2spIHsNCiAgY2FsbGJhY2suYXBwbHkodGhpcywgKGFyZ3VtZW50c1swXSA9IHRoaXMsIGFyZ3VtZW50cykpOw0KICByZXR1cm4gdGhpczsNCn07DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuICF0aGlzLm5vZGUoKTsNCn07DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogIGZvciAodmFyIGogPSAwLCBtID0gdGhpcy5sZW5ndGg7IGogPCBtOyBqKyspIHsNCiAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQogICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldOw0KICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gbnVsbDsNCn07DQpkM19zZWxlY3Rpb25Qcm90b3R5cGUudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkgew0KICB2YXIgc3ViZ3JvdXBzID0gW10sDQogICAgICBzdWJncm91cCwNCiAgICAgIG5vZGU7DQoNCiAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7DQogICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7DQogICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7DQogICAgICBzdWJncm91cC5wdXNoKChub2RlID0gZ3JvdXBbaV0pID8ge25vZGU6IG5vZGUsIGRlbGF5OiBkM190cmFuc2l0aW9uRGVsYXksIGR1cmF0aW9uOiBkM190cmFuc2l0aW9uRHVyYXRpb259IDogbnVsbCk7DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCBkM190cmFuc2l0aW9uSWQgfHwgKytkM190cmFuc2l0aW9uTmV4dElkLCBEYXRlLm5vdygpKTsNCn07DQp2YXIgZDNfc2VsZWN0aW9uUm9vdCA9IGQzX3NlbGVjdGlvbihbW2RvY3VtZW50XV0pOw0KDQpkM19zZWxlY3Rpb25Sb290WzBdLnBhcmVudE5vZGUgPSBkM19zZWxlY3RSb290Ow0KDQovLyBUT0RPIGZhc3Qgc2luZ2xldG9uIGltcGxlbWVudGF0aW9uIQ0KLy8gVE9ETyBzZWxlY3QoZnVuY3Rpb24pDQpkMy5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3Rvcikgew0KICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIg0KICAgICAgPyBkM19zZWxlY3Rpb25Sb290LnNlbGVjdChzZWxlY3RvcikNCiAgICAgIDogZDNfc2VsZWN0aW9uKFtbc2VsZWN0b3JdXSk7IC8vIGFzc3VtZSBub2RlDQp9Ow0KDQovLyBUT0RPIHNlbGVjdEFsbChmdW5jdGlvbikNCmQzLnNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciDQogICAgICA/IGQzX3NlbGVjdGlvblJvb3Quc2VsZWN0QWxsKHNlbGVjdG9yKQ0KICAgICAgOiBkM19zZWxlY3Rpb24oW2QzX2FycmF5KHNlbGVjdG9yKV0pOyAvLyBhc3N1bWUgbm9kZVtdDQp9Ow0KZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2VudGVyKHNlbGVjdGlvbikgew0KICBkM19hcnJheVN1YmNsYXNzKHNlbGVjdGlvbiwgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlKTsNCiAgcmV0dXJuIHNlbGVjdGlvbjsNCn0NCg0KdmFyIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZSA9IFtdOw0KDQpkMy5zZWxlY3Rpb24uZW50ZXIgPSBkM19zZWxlY3Rpb25fZW50ZXI7DQpkMy5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlID0gZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlOw0KDQpkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuYXBwZW5kID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmFwcGVuZDsNCmQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5pbnNlcnQgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuaW5zZXJ0Ow0KZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmVtcHR5ID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVtcHR5Ow0KZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLm5vZGUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUubm9kZTsNCmQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3Rvcikgew0KICB2YXIgc3ViZ3JvdXBzID0gW10sDQogICAgICBzdWJncm91cCwNCiAgICAgIHN1Ym5vZGUsDQogICAgICB1cGdyb3VwLA0KICAgICAgZ3JvdXAsDQogICAgICBub2RlOw0KDQogIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgew0KICAgIHVwZ3JvdXAgPSAoZ3JvdXAgPSB0aGlzW2pdKS51cGRhdGU7DQogICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7DQogICAgc3ViZ3JvdXAucGFyZW50Tm9kZSA9IGdyb3VwLnBhcmVudE5vZGU7DQogICAgZm9yICh2YXIgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOykgew0KICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgew0KICAgICAgICBzdWJncm91cC5wdXNoKHVwZ3JvdXBbaV0gPSBzdWJub2RlID0gc2VsZWN0b3IuY2FsbChncm91cC5wYXJlbnROb2RlLCBub2RlLl9fZGF0YV9fLCBpKSk7DQogICAgICAgIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7DQp9Ow0KZnVuY3Rpb24gZDNfdHJhbnNpdGlvbihncm91cHMsIGlkLCB0aW1lKSB7DQogIGQzX2FycmF5U3ViY2xhc3MoZ3JvdXBzLCBkM190cmFuc2l0aW9uUHJvdG90eXBlKTsNCg0KICB2YXIgdHdlZW5zID0gbmV3IGQzX01hcCwNCiAgICAgIGV2ZW50ID0gZDMuZGlzcGF0Y2goInN0YXJ0IiwgImVuZCIpLA0KICAgICAgZWFzZSA9IGQzX3RyYW5zaXRpb25FYXNlOw0KDQogIGdyb3Vwcy5pZCA9IGlkOw0KDQogIGdyb3Vwcy50aW1lID0gdGltZTsNCg0KICBncm91cHMudHdlZW4gPSBmdW5jdGlvbihuYW1lLCB0d2Vlbikgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHR3ZWVucy5nZXQobmFtZSk7DQogICAgaWYgKHR3ZWVuID09IG51bGwpIHR3ZWVucy5yZW1vdmUobmFtZSk7DQogICAgZWxzZSB0d2VlbnMuc2V0KG5hbWUsIHR3ZWVuKTsNCiAgICByZXR1cm4gZ3JvdXBzOw0KICB9Ow0KDQogIGdyb3Vwcy5lYXNlID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBlYXNlOw0KICAgIGVhc2UgPSB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyB2YWx1ZSA6IGQzLmVhc2UuYXBwbHkoZDMsIGFyZ3VtZW50cyk7DQogICAgcmV0dXJuIGdyb3VwczsNCiAgfTsNCg0KICBncm91cHMuZWFjaCA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gZDNfdHJhbnNpdGlvbl9lYWNoLmNhbGwoZ3JvdXBzLCB0eXBlKTsNCiAgICBldmVudC5vbih0eXBlLCBsaXN0ZW5lcik7DQogICAgcmV0dXJuIGdyb3VwczsNCiAgfTsNCg0KICBkMy50aW1lcihmdW5jdGlvbihlbGFwc2VkKSB7DQogICAgZ3JvdXBzLmVhY2goZnVuY3Rpb24oZCwgaSwgaikgew0KICAgICAgdmFyIHR3ZWVuZWQgPSBbXSwNCiAgICAgICAgICBub2RlID0gdGhpcywNCiAgICAgICAgICBkZWxheSA9IGdyb3Vwc1tqXVtpXS5kZWxheSwNCiAgICAgICAgICBkdXJhdGlvbiA9IGdyb3Vwc1tqXVtpXS5kdXJhdGlvbiwNCiAgICAgICAgICBsb2NrID0gbm9kZS5fX3RyYW5zaXRpb25fXyB8fCAobm9kZS5fX3RyYW5zaXRpb25fXyA9IHthY3RpdmU6IDAsIGNvdW50OiAwfSk7DQoNCiAgICAgICsrbG9jay5jb3VudDsNCg0KICAgICAgZGVsYXkgPD0gZWxhcHNlZCA/IHN0YXJ0KGVsYXBzZWQpIDogZDMudGltZXIoc3RhcnQsIGRlbGF5LCB0aW1lKTsNCg0KICAgICAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkgew0KICAgICAgICBpZiAobG9jay5hY3RpdmUgPiBpZCkgcmV0dXJuIHN0b3AoKTsNCiAgICAgICAgbG9jay5hY3RpdmUgPSBpZDsNCg0KICAgICAgICB0d2VlbnMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7DQogICAgICAgICAgaWYgKHR3ZWVuID0gdmFsdWUuY2FsbChub2RlLCBkLCBpKSkgew0KICAgICAgICAgICAgdHdlZW5lZC5wdXNoKHR3ZWVuKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGV2ZW50LnN0YXJ0LmNhbGwobm9kZSwgZCwgaSk7DQogICAgICAgIGlmICghdGljayhlbGFwc2VkKSkgZDMudGltZXIodGljaywgMCwgdGltZSk7DQogICAgICAgIHJldHVybiAxOw0KICAgICAgfQ0KDQogICAgICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHsNCiAgICAgICAgaWYgKGxvY2suYWN0aXZlICE9PSBpZCkgcmV0dXJuIHN0b3AoKTsNCg0KICAgICAgICB2YXIgdCA9IChlbGFwc2VkIC0gZGVsYXkpIC8gZHVyYXRpb24sDQogICAgICAgICAgICBlID0gZWFzZSh0KSwNCiAgICAgICAgICAgIG4gPSB0d2VlbmVkLmxlbmd0aDsNCg0KICAgICAgICB3aGlsZSAobiA+IDApIHsNCiAgICAgICAgICB0d2VlbmVkWy0tbl0uY2FsbChub2RlLCBlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0ID49IDEpIHsNCiAgICAgICAgICBzdG9wKCk7DQogICAgICAgICAgZDNfdHJhbnNpdGlvbklkID0gaWQ7DQogICAgICAgICAgZXZlbnQuZW5kLmNhbGwobm9kZSwgZCwgaSk7DQogICAgICAgICAgZDNfdHJhbnNpdGlvbklkID0gMDsNCiAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICBmdW5jdGlvbiBzdG9wKCkgew0KICAgICAgICBpZiAoIS0tbG9jay5jb3VudCkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uX187DQogICAgICAgIHJldHVybiAxOw0KICAgICAgfQ0KICAgIH0pOw0KICAgIHJldHVybiAxOw0KICB9LCAwLCB0aW1lKTsNCg0KICByZXR1cm4gZ3JvdXBzOw0KfQ0KDQp2YXIgZDNfdHJhbnNpdGlvblJlbW92ZSA9IHt9Ow0KDQpmdW5jdGlvbiBkM190cmFuc2l0aW9uTnVsbChkLCBpLCBhKSB7DQogIHJldHVybiBhICE9ICIiICYmIGQzX3RyYW5zaXRpb25SZW1vdmU7DQp9DQoNCmZ1bmN0aW9uIGQzX3RyYW5zaXRpb25Ud2VlbihuYW1lLCBiKSB7DQogIHZhciBpbnRlcnBvbGF0ZSA9IGQzX2ludGVycG9sYXRlQnlOYW1lKG5hbWUpOw0KDQogIGZ1bmN0aW9uIHRyYW5zaXRpb25GdW5jdGlvbihkLCBpLCBhKSB7DQogICAgdmFyIHYgPSBiLmNhbGwodGhpcywgZCwgaSk7DQogICAgcmV0dXJuIHYgPT0gbnVsbA0KICAgICAgICA/IGEgIT0gIiIgJiYgZDNfdHJhbnNpdGlvblJlbW92ZQ0KICAgICAgICA6IGEgIT0gdiAmJiBpbnRlcnBvbGF0ZShhLCB2KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHRyYW5zaXRpb25TdHJpbmcoZCwgaSwgYSkgew0KICAgIHJldHVybiBhICE9IGIgJiYgaW50ZXJwb2xhdGUoYSwgYik7DQogIH0NCg0KICByZXR1cm4gdHlwZW9mIGIgPT09ICJmdW5jdGlvbiIgPyB0cmFuc2l0aW9uRnVuY3Rpb24NCiAgICAgIDogYiA9PSBudWxsID8gZDNfdHJhbnNpdGlvbk51bGwNCiAgICAgIDogKGIgKz0gIiIsIHRyYW5zaXRpb25TdHJpbmcpOw0KfQ0KDQp2YXIgZDNfdHJhbnNpdGlvblByb3RvdHlwZSA9IFtdLA0KICAgIGQzX3RyYW5zaXRpb25OZXh0SWQgPSAwLA0KICAgIGQzX3RyYW5zaXRpb25JZCA9IDAsDQogICAgZDNfdHJhbnNpdGlvbkRlZmF1bHREZWxheSA9IDAsDQogICAgZDNfdHJhbnNpdGlvbkRlZmF1bHREdXJhdGlvbiA9IDI1MCwNCiAgICBkM190cmFuc2l0aW9uRGVmYXVsdEVhc2UgPSBkMy5lYXNlKCJjdWJpYy1pbi1vdXQiKSwNCiAgICBkM190cmFuc2l0aW9uRGVsYXkgPSBkM190cmFuc2l0aW9uRGVmYXVsdERlbGF5LA0KICAgIGQzX3RyYW5zaXRpb25EdXJhdGlvbiA9IGQzX3RyYW5zaXRpb25EZWZhdWx0RHVyYXRpb24sDQogICAgZDNfdHJhbnNpdGlvbkVhc2UgPSBkM190cmFuc2l0aW9uRGVmYXVsdEVhc2U7DQoNCmQzX3RyYW5zaXRpb25Qcm90b3R5cGUuY2FsbCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsOw0KDQpkMy50cmFuc2l0aW9uID0gZnVuY3Rpb24oc2VsZWN0aW9uKSB7DQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoDQogICAgICA/IChkM190cmFuc2l0aW9uSWQgPyBzZWxlY3Rpb24udHJhbnNpdGlvbigpIDogc2VsZWN0aW9uKQ0KICAgICAgOiBkM19zZWxlY3Rpb25Sb290LnRyYW5zaXRpb24oKTsNCn07DQoNCmQzLnRyYW5zaXRpb24ucHJvdG90eXBlID0gZDNfdHJhbnNpdGlvblByb3RvdHlwZTsNCmQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCiAgdmFyIHN1Ymdyb3VwcyA9IFtdLA0KICAgICAgc3ViZ3JvdXAsDQogICAgICBzdWJub2RlLA0KICAgICAgbm9kZTsNCg0KICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihzZWxlY3Rvcik7DQoNCiAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7DQogICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7DQogICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7DQogICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3Rvci5jYWxsKG5vZGUubm9kZSwgbm9kZS5ub2RlLl9fZGF0YV9fLCBpKSkpIHsNCiAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZS5ub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5ub2RlLl9fZGF0YV9fOw0KICAgICAgICBzdWJncm91cC5wdXNoKHtub2RlOiBzdWJub2RlLCBkZWxheTogbm9kZS5kZWxheSwgZHVyYXRpb246IG5vZGUuZHVyYXRpb259KTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHN1Ymdyb3VwLnB1c2gobnVsbCk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLmlkLCB0aGlzLnRpbWUpLmVhc2UodGhpcy5lYXNlKCkpOw0KfTsNCmQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCiAgdmFyIHN1Ymdyb3VwcyA9IFtdLA0KICAgICAgc3ViZ3JvdXAsDQogICAgICBzdWJub2RlcywNCiAgICAgIG5vZGU7DQoNCiAgaWYgKHR5cGVvZiBzZWxlY3RvciAhPT0gImZ1bmN0aW9uIikgc2VsZWN0b3IgPSBkM19zZWxlY3Rpb25fc2VsZWN0b3JBbGwoc2VsZWN0b3IpOw0KDQogIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgew0KICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOykgew0KICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgew0KICAgICAgICBzdWJub2RlcyA9IHNlbGVjdG9yLmNhbGwobm9kZS5ub2RlLCBub2RlLm5vZGUuX19kYXRhX18sIGkpOw0KICAgICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsNCiAgICAgICAgZm9yICh2YXIgayA9IC0xLCBvID0gc3Vibm9kZXMubGVuZ3RoOyArK2sgPCBvOykgew0KICAgICAgICAgIHN1Ymdyb3VwLnB1c2goe25vZGU6IHN1Ym5vZGVzW2tdLCBkZWxheTogbm9kZS5kZWxheSwgZHVyYXRpb246IG5vZGUuZHVyYXRpb259KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5pZCwgdGhpcy50aW1lKS5lYXNlKHRoaXMuZWFzZSgpKTsNCn07DQpkM190cmFuc2l0aW9uUHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgZDNfdHJhbnNpdGlvblR3ZWVuKG5hbWUsIHZhbHVlKSk7DQp9Ow0KDQpkM190cmFuc2l0aW9uUHJvdG90eXBlLmF0dHJUd2VlbiA9IGZ1bmN0aW9uKG5hbWVOUywgdHdlZW4pIHsNCiAgdmFyIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWVOUyk7DQoNCiAgZnVuY3Rpb24gYXR0clR3ZWVuKGQsIGkpIHsNCiAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSkpOw0KICAgIHJldHVybiBmID09PSBkM190cmFuc2l0aW9uUmVtb3ZlDQogICAgICAgID8gKHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpLCBudWxsKQ0KICAgICAgICA6IGYgJiYgZnVuY3Rpb24odCkgeyB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBmKHQpKTsgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGQsIGkpIHsNCiAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgdGhpcy5nZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSk7DQogICAgcmV0dXJuIGYgPT09IGQzX3RyYW5zaXRpb25SZW1vdmUNCiAgICAgICAgPyAodGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSwgbnVsbCkNCiAgICAgICAgOiBmICYmIGZ1bmN0aW9uKHQpIHsgdGhpcy5zZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsLCBmKHQpKTsgfTsNCiAgfQ0KDQogIHJldHVybiB0aGlzLnR3ZWVuKCJhdHRyLiIgKyBuYW1lTlMsIG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2Vlbik7DQp9Ow0KZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgew0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHByaW9yaXR5ID0gIiI7DQogIHJldHVybiB0aGlzLnN0eWxlVHdlZW4obmFtZSwgZDNfdHJhbnNpdGlvblR3ZWVuKG5hbWUsIHZhbHVlKSwgcHJpb3JpdHkpOw0KfTsNCg0KZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zdHlsZVR3ZWVuID0gZnVuY3Rpb24obmFtZSwgdHdlZW4sIHByaW9yaXR5KSB7DQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgcHJpb3JpdHkgPSAiIjsNCiAgcmV0dXJuIHRoaXMudHdlZW4oInN0eWxlLiIgKyBuYW1lLCBmdW5jdGlvbihkLCBpKSB7DQogICAgdmFyIGYgPSB0d2Vlbi5jYWxsKHRoaXMsIGQsIGksIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSkpOw0KICAgIHJldHVybiBmID09PSBkM190cmFuc2l0aW9uUmVtb3ZlDQogICAgICAgID8gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIG51bGwpDQogICAgICAgIDogZiAmJiBmdW5jdGlvbih0KSB7IHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgZih0KSwgcHJpb3JpdHkpOyB9Ow0KICB9KTsNCn07DQpkM190cmFuc2l0aW9uUHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIGZ1bmN0aW9uKGQsIGkpIHsNCiAgICB0aGlzLnRleHRDb250ZW50ID0gdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQogICAgICAgID8gdmFsdWUuY2FsbCh0aGlzLCBkLCBpKQ0KICAgICAgICA6IHZhbHVlOw0KICB9KTsNCn07DQpkM190cmFuc2l0aW9uUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gdGhpcy5lYWNoKCJlbmQudHJhbnNpdGlvbiIsIGZ1bmN0aW9uKCkgew0KICAgIHZhciBwOw0KICAgIGlmICghdGhpcy5fX3RyYW5zaXRpb25fXyAmJiAocCA9IHRoaXMucGFyZW50Tm9kZSkpIHAucmVtb3ZlQ2hpbGQodGhpcyk7DQogIH0pOw0KfTsNCmQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbih2YWx1ZSkgew0KICB2YXIgZ3JvdXBzID0gdGhpczsNCiAgcmV0dXJuIGdyb3Vwcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgPyBmdW5jdGlvbihkLCBpLCBqKSB7IGdyb3Vwc1tqXVtpXS5kZWxheSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfCAwOyB9DQogICAgICA6ICh2YWx1ZSA9IHZhbHVlIHwgMCwgZnVuY3Rpb24oZCwgaSwgaikgeyBncm91cHNbal1baV0uZGVsYXkgPSB2YWx1ZTsgfSkpOw0KfTsNCmQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZHVyYXRpb24gPSBmdW5jdGlvbih2YWx1ZSkgew0KICB2YXIgZ3JvdXBzID0gdGhpczsNCiAgcmV0dXJuIGdyb3Vwcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgPyBmdW5jdGlvbihkLCBpLCBqKSB7IGdyb3Vwc1tqXVtpXS5kdXJhdGlvbiA9IE1hdGgubWF4KDEsIHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfCAwKTsgfQ0KICAgICAgOiAodmFsdWUgPSBNYXRoLm1heCgxLCB2YWx1ZSB8IDApLCBmdW5jdGlvbihkLCBpLCBqKSB7IGdyb3Vwc1tqXVtpXS5kdXJhdGlvbiA9IHZhbHVlOyB9KSk7DQp9Ow0KZnVuY3Rpb24gZDNfdHJhbnNpdGlvbl9lYWNoKGNhbGxiYWNrKSB7DQogIHZhciBpZCA9IGQzX3RyYW5zaXRpb25JZCwNCiAgICAgIGVhc2UgPSBkM190cmFuc2l0aW9uRWFzZSwNCiAgICAgIGRlbGF5ID0gZDNfdHJhbnNpdGlvbkRlbGF5LA0KICAgICAgZHVyYXRpb24gPSBkM190cmFuc2l0aW9uRHVyYXRpb247DQoNCiAgZDNfdHJhbnNpdGlvbklkID0gdGhpcy5pZDsNCiAgZDNfdHJhbnNpdGlvbkVhc2UgPSB0aGlzLmVhc2UoKTsNCiAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykgew0KICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07DQogICAgICBpZiAobm9kZSkgew0KICAgICAgICBkM190cmFuc2l0aW9uRGVsYXkgPSB0aGlzW2pdW2ldLmRlbGF5Ow0KICAgICAgICBkM190cmFuc2l0aW9uRHVyYXRpb24gPSB0aGlzW2pdW2ldLmR1cmF0aW9uOw0KICAgICAgICBjYWxsYmFjay5jYWxsKG5vZGUgPSBub2RlLm5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGQzX3RyYW5zaXRpb25JZCA9IGlkOw0KICBkM190cmFuc2l0aW9uRWFzZSA9IGVhc2U7DQogIGQzX3RyYW5zaXRpb25EZWxheSA9IGRlbGF5Ow0KICBkM190cmFuc2l0aW9uRHVyYXRpb24gPSBkdXJhdGlvbjsNCiAgcmV0dXJuIHRoaXM7DQp9DQpkM190cmFuc2l0aW9uUHJvdG90eXBlLnRyYW5zaXRpb24gPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIHRoaXMuc2VsZWN0KGQzX3RoaXMpOw0KfTsNCnZhciBkM190aW1lcl9xdWV1ZSA9IG51bGwsDQogICAgZDNfdGltZXJfaW50ZXJ2YWwsIC8vIGlzIGFuIGludGVydmFsIChvciBmcmFtZSkgYWN0aXZlPw0KICAgIGQzX3RpbWVyX3RpbWVvdXQ7IC8vIGlzIGEgdGltZW91dCBhY3RpdmU/DQoNCi8vIFRoZSB0aW1lciB3aWxsIGNvbnRpbnVlIHRvIGZpcmUgdW50aWwgY2FsbGJhY2sgcmV0dXJucyB0cnVlLg0KZDMudGltZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRoZW4pIHsNCiAgdmFyIGZvdW5kID0gZmFsc2UsDQogICAgICB0MCwNCiAgICAgIHQxID0gZDNfdGltZXJfcXVldWU7DQoNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBkZWxheSA9IDA7DQogICAgZWxzZSBpZiAoIWlzRmluaXRlKGRlbGF5KSkgcmV0dXJuOw0KICAgIHRoZW4gPSBEYXRlLm5vdygpOw0KICB9DQoNCiAgLy8gU2VlIGlmIHRoZSBjYWxsYmFjaydzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLg0KICB3aGlsZSAodDEpIHsNCiAgICBpZiAodDEuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7DQogICAgICB0MS50aGVuID0gdGhlbjsNCiAgICAgIHQxLmRlbGF5ID0gZGVsYXk7DQogICAgICBmb3VuZCA9IHRydWU7DQogICAgICBicmVhazsNCiAgICB9DQogICAgdDAgPSB0MTsNCiAgICB0MSA9IHQxLm5leHQ7DQogIH0NCg0KICAvLyBPdGhlcndpc2UsIGFkZCB0aGUgY2FsbGJhY2sgdG8gdGhlIHF1ZXVlLg0KICBpZiAoIWZvdW5kKSBkM190aW1lcl9xdWV1ZSA9IHsNCiAgICBjYWxsYmFjazogY2FsbGJhY2ssDQogICAgdGhlbjogdGhlbiwNCiAgICBkZWxheTogZGVsYXksDQogICAgbmV4dDogZDNfdGltZXJfcXVldWUNCiAgfTsNCg0KICAvLyBTdGFydCBhbmltYXRpbichDQogIGlmICghZDNfdGltZXJfaW50ZXJ2YWwpIHsNCiAgICBkM190aW1lcl90aW1lb3V0ID0gY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpOw0KICAgIGQzX3RpbWVyX2ludGVydmFsID0gMTsNCiAgICBkM190aW1lcl9mcmFtZShkM190aW1lcl9zdGVwKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBkM190aW1lcl9zdGVwKCkgew0KICB2YXIgZWxhcHNlZCwNCiAgICAgIG5vdyA9IERhdGUubm93KCksDQogICAgICB0MSA9IGQzX3RpbWVyX3F1ZXVlOw0KDQogIHdoaWxlICh0MSkgew0KICAgIGVsYXBzZWQgPSBub3cgLSB0MS50aGVuOw0KICAgIGlmIChlbGFwc2VkID49IHQxLmRlbGF5KSB0MS5mbHVzaCA9IHQxLmNhbGxiYWNrKGVsYXBzZWQpOw0KICAgIHQxID0gdDEubmV4dDsNCiAgfQ0KDQogIHZhciBkZWxheSA9IGQzX3RpbWVyX2ZsdXNoKCkgLSBub3c7DQogIGlmIChkZWxheSA+IDI0KSB7DQogICAgaWYgKGlzRmluaXRlKGRlbGF5KSkgew0KICAgICAgY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpOw0KICAgICAgZDNfdGltZXJfdGltZW91dCA9IHNldFRpbWVvdXQoZDNfdGltZXJfc3RlcCwgZGVsYXkpOw0KICAgIH0NCiAgICBkM190aW1lcl9pbnRlcnZhbCA9IDA7DQogIH0gZWxzZSB7DQogICAgZDNfdGltZXJfaW50ZXJ2YWwgPSAxOw0KICAgIGQzX3RpbWVyX2ZyYW1lKGQzX3RpbWVyX3N0ZXApOw0KICB9DQp9DQoNCmQzLnRpbWVyLmZsdXNoID0gZnVuY3Rpb24oKSB7DQogIHZhciBlbGFwc2VkLA0KICAgICAgbm93ID0gRGF0ZS5ub3coKSwNCiAgICAgIHQxID0gZDNfdGltZXJfcXVldWU7DQoNCiAgd2hpbGUgKHQxKSB7DQogICAgZWxhcHNlZCA9IG5vdyAtIHQxLnRoZW47DQogICAgaWYgKCF0MS5kZWxheSkgdDEuZmx1c2ggPSB0MS5jYWxsYmFjayhlbGFwc2VkKTsNCiAgICB0MSA9IHQxLm5leHQ7DQogIH0NCg0KICBkM190aW1lcl9mbHVzaCgpOw0KfTsNCg0KLy8gRmx1c2ggYWZ0ZXIgY2FsbGJhY2tzLCB0byBhdm9pZCBjb25jdXJyZW50IHF1ZXVlIG1vZGlmaWNhdGlvbi4NCmZ1bmN0aW9uIGQzX3RpbWVyX2ZsdXNoKCkgew0KICB2YXIgdDAgPSBudWxsLA0KICAgICAgdDEgPSBkM190aW1lcl9xdWV1ZSwNCiAgICAgIHRoZW4gPSBJbmZpbml0eTsNCiAgd2hpbGUgKHQxKSB7DQogICAgaWYgKHQxLmZsdXNoKSB7DQogICAgICB0MSA9IHQwID8gdDAubmV4dCA9IHQxLm5leHQgOiBkM190aW1lcl9xdWV1ZSA9IHQxLm5leHQ7DQogICAgfSBlbHNlIHsNCiAgICAgIHRoZW4gPSBNYXRoLm1pbih0aGVuLCB0MS50aGVuICsgdDEuZGVsYXkpOw0KICAgICAgdDEgPSAodDAgPSB0MSkubmV4dDsNCiAgICB9DQogIH0NCiAgcmV0dXJuIHRoZW47DQp9DQoNCnZhciBkM190aW1lcl9mcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUNCiAgICB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lDQogICAgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZQ0KICAgIHx8IHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lDQogICAgfHwgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lDQogICAgfHwgZnVuY3Rpb24oY2FsbGJhY2spIHsgc2V0VGltZW91dChjYWxsYmFjaywgMTcpOyB9Ow0KZDMudHJhbnNmb3JtID0gZnVuY3Rpb24oc3RyaW5nKSB7DQogIHZhciBnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQzLm5zLnByZWZpeC5zdmcsICJnIiksDQogICAgICBpZGVudGl0eSA9IHthOiAxLCBiOiAwLCBjOiAwLCBkOiAxLCBlOiAwLCBmOiAwfTsNCiAgcmV0dXJuIChkMy50cmFuc2Zvcm0gPSBmdW5jdGlvbihzdHJpbmcpIHsNCiAgICBnLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwgc3RyaW5nKTsNCiAgICB2YXIgdCA9IGcudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKTsNCiAgICByZXR1cm4gbmV3IGQzX3RyYW5zZm9ybSh0ID8gdC5tYXRyaXggOiBpZGVudGl0eSk7DQogIH0pKHN0cmluZyk7DQp9Ow0KDQovLyBDb21wdXRlIHgtc2NhbGUgYW5kIG5vcm1hbGl6ZSB0aGUgZmlyc3Qgcm93Lg0KLy8gQ29tcHV0ZSBzaGVhciBhbmQgbWFrZSBzZWNvbmQgcm93IG9ydGhvZ29uYWwgdG8gZmlyc3QuDQovLyBDb21wdXRlIHktc2NhbGUgYW5kIG5vcm1hbGl6ZSB0aGUgc2Vjb25kIHJvdy4NCi8vIEZpbmFsbHksIGNvbXB1dGUgdGhlIHJvdGF0aW9uLg0KZnVuY3Rpb24gZDNfdHJhbnNmb3JtKG0pIHsNCiAgdmFyIHIwID0gW20uYSwgbS5iXSwNCiAgICAgIHIxID0gW20uYywgbS5kXSwNCiAgICAgIGt4ID0gZDNfdHJhbnNmb3JtTm9ybWFsaXplKHIwKSwNCiAgICAgIGt6ID0gZDNfdHJhbnNmb3JtRG90KHIwLCByMSksDQogICAgICBreSA9IGQzX3RyYW5zZm9ybU5vcm1hbGl6ZShkM190cmFuc2Zvcm1Db21iaW5lKHIxLCByMCwgLWt6KSkgfHwgMDsNCiAgaWYgKHIwWzBdICogcjFbMV0gPCByMVswXSAqIHIwWzFdKSB7DQogICAgcjBbMF0gKj0gLTE7DQogICAgcjBbMV0gKj0gLTE7DQogICAga3ggKj0gLTE7DQogICAga3ogKj0gLTE7DQogIH0NCiAgdGhpcy5yb3RhdGUgPSAoa3ggPyBNYXRoLmF0YW4yKHIwWzFdLCByMFswXSkgOiBNYXRoLmF0YW4yKC1yMVswXSwgcjFbMV0pKSAqIGQzX3RyYW5zZm9ybURlZ3JlZXM7DQogIHRoaXMudHJhbnNsYXRlID0gW20uZSwgbS5mXTsNCiAgdGhpcy5zY2FsZSA9IFtreCwga3ldOw0KICB0aGlzLnNrZXcgPSBreSA/IE1hdGguYXRhbjIoa3osIGt5KSAqIGQzX3RyYW5zZm9ybURlZ3JlZXMgOiAwOw0KfTsNCg0KZDNfdHJhbnNmb3JtLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gInRyYW5zbGF0ZSgiICsgdGhpcy50cmFuc2xhdGUNCiAgICAgICsgIilyb3RhdGUoIiArIHRoaXMucm90YXRlDQogICAgICArICIpc2tld1goIiArIHRoaXMuc2tldw0KICAgICAgKyAiKXNjYWxlKCIgKyB0aGlzLnNjYWxlDQogICAgICArICIpIjsNCn07DQoNCmZ1bmN0aW9uIGQzX3RyYW5zZm9ybURvdChhLCBiKSB7DQogIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdOw0KfQ0KDQpmdW5jdGlvbiBkM190cmFuc2Zvcm1Ob3JtYWxpemUoYSkgew0KICB2YXIgayA9IE1hdGguc3FydChkM190cmFuc2Zvcm1Eb3QoYSwgYSkpOw0KICBpZiAoaykgew0KICAgIGFbMF0gLz0gazsNCiAgICBhWzFdIC89IGs7DQogIH0NCiAgcmV0dXJuIGs7DQp9DQoNCmZ1bmN0aW9uIGQzX3RyYW5zZm9ybUNvbWJpbmUoYSwgYiwgaykgew0KICBhWzBdICs9IGsgKiBiWzBdOw0KICBhWzFdICs9IGsgKiBiWzFdOw0KICByZXR1cm4gYTsNCn0NCg0KdmFyIGQzX3RyYW5zZm9ybURlZ3JlZXMgPSAxODAgLyBNYXRoLlBJOw0KZDMubW91c2UgPSBmdW5jdGlvbihjb250YWluZXIpIHsNCiAgcmV0dXJuIGQzX21vdXNlUG9pbnQoY29udGFpbmVyLCBkM19ldmVudFNvdXJjZSgpKTsNCn07DQoNCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NDA4Mw0KdmFyIGQzX21vdXNlX2J1ZzQ0MDgzID0gL1dlYktpdC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/IC0xIDogMDsNCg0KZnVuY3Rpb24gZDNfbW91c2VQb2ludChjb250YWluZXIsIGUpIHsNCiAgdmFyIHN2ZyA9IGNvbnRhaW5lci5vd25lclNWR0VsZW1lbnQgfHwgY29udGFpbmVyOw0KICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7DQogICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7DQogICAgaWYgKChkM19tb3VzZV9idWc0NDA4MyA8IDApICYmICh3aW5kb3cuc2Nyb2xsWCB8fCB3aW5kb3cuc2Nyb2xsWSkpIHsNCiAgICAgIHN2ZyA9IGQzLnNlbGVjdChkb2N1bWVudC5ib2R5KQ0KICAgICAgICAuYXBwZW5kKCJzdmciKQ0KICAgICAgICAgIC5zdHlsZSgicG9zaXRpb24iLCAiYWJzb2x1dGUiKQ0KICAgICAgICAgIC5zdHlsZSgidG9wIiwgMCkNCiAgICAgICAgICAuc3R5bGUoImxlZnQiLCAwKTsNCiAgICAgIHZhciBjdG0gPSBzdmdbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7DQogICAgICBkM19tb3VzZV9idWc0NDA4MyA9ICEoY3RtLmYgfHwgY3RtLmUpOw0KICAgICAgc3ZnLnJlbW92ZSgpOw0KICAgIH0NCiAgICBpZiAoZDNfbW91c2VfYnVnNDQwODMpIHsNCiAgICAgIHBvaW50LnggPSBlLnBhZ2VYOw0KICAgICAgcG9pbnQueSA9IGUucGFnZVk7DQogICAgfSBlbHNlIHsNCiAgICAgIHBvaW50LnggPSBlLmNsaWVudFg7DQogICAgICBwb2ludC55ID0gZS5jbGllbnRZOw0KICAgIH0NCiAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShjb250YWluZXIuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTsNCiAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldOw0KICB9DQogIHZhciByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOw0KICByZXR1cm4gW2UuY2xpZW50WCAtIHJlY3QubGVmdCAtIGNvbnRhaW5lci5jbGllbnRMZWZ0LCBlLmNsaWVudFkgLSByZWN0LnRvcCAtIGNvbnRhaW5lci5jbGllbnRUb3BdOw0KfTsNCmQzLnRvdWNoZXMgPSBmdW5jdGlvbihjb250YWluZXIsIHRvdWNoZXMpIHsNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB0b3VjaGVzID0gZDNfZXZlbnRTb3VyY2UoKS50b3VjaGVzOw0KICByZXR1cm4gdG91Y2hlcyA/IGQzX2FycmF5KHRvdWNoZXMpLm1hcChmdW5jdGlvbih0b3VjaCkgew0KICAgIHZhciBwb2ludCA9IGQzX21vdXNlUG9pbnQoY29udGFpbmVyLCB0b3VjaCk7DQogICAgcG9pbnQuaWRlbnRpZmllciA9IHRvdWNoLmlkZW50aWZpZXI7DQogICAgcmV0dXJuIHBvaW50Ow0KICB9KSA6IFtdOw0KfTsNCmZ1bmN0aW9uIGQzX25vb3AoKSB7fQ0KZDMuc2NhbGUgPSB7fTsNCg0KZnVuY3Rpb24gZDNfc2NhbGVFeHRlbnQoZG9tYWluKSB7DQogIHZhciBzdGFydCA9IGRvbWFpblswXSwgc3RvcCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07DQogIHJldHVybiBzdGFydCA8IHN0b3AgPyBbc3RhcnQsIHN0b3BdIDogW3N0b3AsIHN0YXJ0XTsNCn0NCg0KZnVuY3Rpb24gZDNfc2NhbGVSYW5nZShzY2FsZSkgew0KICByZXR1cm4gc2NhbGUucmFuZ2VFeHRlbnQgPyBzY2FsZS5yYW5nZUV4dGVudCgpIDogZDNfc2NhbGVFeHRlbnQoc2NhbGUucmFuZ2UoKSk7DQp9DQpmdW5jdGlvbiBkM19zY2FsZV9uaWNlKGRvbWFpbiwgbmljZSkgew0KICB2YXIgaTAgPSAwLA0KICAgICAgaTEgPSBkb21haW4ubGVuZ3RoIC0gMSwNCiAgICAgIHgwID0gZG9tYWluW2kwXSwNCiAgICAgIHgxID0gZG9tYWluW2kxXSwNCiAgICAgIGR4Ow0KDQogIGlmICh4MSA8IHgwKSB7DQogICAgZHggPSBpMDsgaTAgPSBpMTsgaTEgPSBkeDsNCiAgICBkeCA9IHgwOyB4MCA9IHgxOyB4MSA9IGR4Ow0KICB9DQoNCiAgaWYgKGR4ID0geDEgLSB4MCkgew0KICAgIG5pY2UgPSBuaWNlKGR4KTsNCiAgICBkb21haW5baTBdID0gbmljZS5mbG9vcih4MCk7DQogICAgZG9tYWluW2kxXSA9IG5pY2UuY2VpbCh4MSk7DQogIH0NCg0KICByZXR1cm4gZG9tYWluOw0KfQ0KDQpmdW5jdGlvbiBkM19zY2FsZV9uaWNlRGVmYXVsdCgpIHsNCiAgcmV0dXJuIE1hdGg7DQp9DQpkMy5zY2FsZS5saW5lYXIgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhcihbMCwgMV0sIFswLCAxXSwgZDMuaW50ZXJwb2xhdGUsIGZhbHNlKTsNCn07DQoNCmZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhcihkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSwgY2xhbXApIHsNCiAgdmFyIG91dHB1dCwNCiAgICAgIGlucHV0Ow0KDQogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7DQogICAgdmFyIGxpbmVhciA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgPiAyID8gZDNfc2NhbGVfcG9seWxpbmVhciA6IGQzX3NjYWxlX2JpbGluZWFyLA0KICAgICAgICB1bmludGVycG9sYXRlID0gY2xhbXAgPyBkM191bmludGVycG9sYXRlQ2xhbXAgOiBkM191bmludGVycG9sYXRlTnVtYmVyOw0KICAgIG91dHB1dCA9IGxpbmVhcihkb21haW4sIHJhbmdlLCB1bmludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSk7DQogICAgaW5wdXQgPSBsaW5lYXIocmFuZ2UsIGRvbWFpbiwgdW5pbnRlcnBvbGF0ZSwgZDMuaW50ZXJwb2xhdGUpOw0KICAgIHJldHVybiBzY2FsZTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHNjYWxlKHgpIHsNCiAgICByZXR1cm4gb3V0cHV0KHgpOw0KICB9DQoNCiAgLy8gTm90ZTogcmVxdWlyZXMgcmFuZ2UgaXMgY29lcmNpYmxlIHRvIG51bWJlciENCiAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkgew0KICAgIHJldHVybiBpbnB1dCh5KTsNCiAgfTsNCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluOw0KICAgIGRvbWFpbiA9IHgubWFwKE51bWJlcik7DQogICAgcmV0dXJuIHJlc2NhbGUoKTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsNCiAgICByYW5nZSA9IHg7DQogICAgcmV0dXJuIHJlc2NhbGUoKTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBzY2FsZS5yYW5nZSh4KS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZVJvdW5kKTsNCiAgfTsNCg0KICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGFtcDsNCiAgICBjbGFtcCA9IHg7DQogICAgcmV0dXJuIHJlc2NhbGUoKTsNCiAgfTsNCg0KICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbnRlcnBvbGF0ZTsNCiAgICBpbnRlcnBvbGF0ZSA9IHg7DQogICAgcmV0dXJuIHJlc2NhbGUoKTsNCiAgfTsNCg0KICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKG0pIHsNCiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKTsNCiAgfTsNCg0KICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSkgew0KICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSk7DQogIH07DQoNCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgew0KICAgIGQzX3NjYWxlX25pY2UoZG9tYWluLCBkM19zY2FsZV9saW5lYXJOaWNlKTsNCiAgICByZXR1cm4gcmVzY2FsZSgpOw0KICB9Ow0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlLCBjbGFtcCk7DQogIH07DQoNCiAgcmV0dXJuIHJlc2NhbGUoKTsNCn0NCg0KZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpIHsNCiAgcmV0dXJuIGQzLnJlYmluZChzY2FsZSwgbGluZWFyLCAicmFuZ2UiLCAicmFuZ2VSb3VuZCIsICJpbnRlcnBvbGF0ZSIsICJjbGFtcCIpOw0KfQ0KDQpmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJOaWNlKGR4KSB7DQogIGR4ID0gTWF0aC5wb3coMTAsIE1hdGgucm91bmQoTWF0aC5sb2coZHgpIC8gTWF0aC5MTjEwKSAtIDEpOw0KICByZXR1cm4gew0KICAgIGZsb29yOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmZsb29yKHggLyBkeCkgKiBkeDsgfSwNCiAgICBjZWlsOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmNlaWwoeCAvIGR4KSAqIGR4OyB9DQogIH07DQp9DQoNCmZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pIHsNCiAgdmFyIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGRvbWFpbiksDQogICAgICBzcGFuID0gZXh0ZW50WzFdIC0gZXh0ZW50WzBdLA0KICAgICAgc3RlcCA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHNwYW4gLyBtKSAvIE1hdGguTE4xMCkpLA0KICAgICAgZXJyID0gbSAvIHNwYW4gKiBzdGVwOw0KDQogIC8vIEZpbHRlciB0aWNrcyB0byBnZXQgY2xvc2VyIHRvIHRoZSBkZXNpcmVkIGNvdW50Lg0KICBpZiAoZXJyIDw9IC4xNSkgc3RlcCAqPSAxMDsNCiAgZWxzZSBpZiAoZXJyIDw9IC4zNSkgc3RlcCAqPSA1Ow0KICBlbHNlIGlmIChlcnIgPD0gLjc1KSBzdGVwICo9IDI7DQoNCiAgLy8gUm91bmQgc3RhcnQgYW5kIHN0b3AgdmFsdWVzIHRvIHN0ZXAgaW50ZXJ2YWwuDQogIGV4dGVudFswXSA9IE1hdGguY2VpbChleHRlbnRbMF0gLyBzdGVwKSAqIHN0ZXA7DQogIGV4dGVudFsxXSA9IE1hdGguZmxvb3IoZXh0ZW50WzFdIC8gc3RlcCkgKiBzdGVwICsgc3RlcCAqIC41OyAvLyBpbmNsdXNpdmUNCiAgZXh0ZW50WzJdID0gc3RlcDsNCiAgcmV0dXJuIGV4dGVudDsNCn0NCg0KZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKSB7DQogIHJldHVybiBkMy5yYW5nZS5hcHBseShkMywgZDNfc2NhbGVfbGluZWFyVGlja1JhbmdlKGRvbWFpbiwgbSkpOw0KfQ0KDQpmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSkgew0KICByZXR1cm4gZDMuZm9ybWF0KCIsLiIgKyBNYXRoLm1heCgwLCAtTWF0aC5mbG9vcihNYXRoLmxvZyhkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKVsyXSkgLyBNYXRoLkxOMTAgKyAuMDEpKSArICJmIik7DQp9DQpmdW5jdGlvbiBkM19zY2FsZV9iaWxpbmVhcihkb21haW4sIHJhbmdlLCB1bmludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSkgew0KICB2YXIgdSA9IHVuaW50ZXJwb2xhdGUoZG9tYWluWzBdLCBkb21haW5bMV0pLA0KICAgICAgaSA9IGludGVycG9sYXRlKHJhbmdlWzBdLCByYW5nZVsxXSk7DQogIHJldHVybiBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGkodSh4KSk7DQogIH07DQp9DQpmdW5jdGlvbiBkM19zY2FsZV9wb2x5bGluZWFyKGRvbWFpbiwgcmFuZ2UsIHVuaW50ZXJwb2xhdGUsIGludGVycG9sYXRlKSB7DQogIHZhciB1ID0gW10sDQogICAgICBpID0gW10sDQogICAgICBqID0gMCwNCiAgICAgIGsgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpIC0gMTsNCg0KICAvLyBIYW5kbGUgZGVzY2VuZGluZyBkb21haW5zLg0KICBpZiAoZG9tYWluW2tdIDwgZG9tYWluWzBdKSB7DQogICAgZG9tYWluID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpOw0KICAgIHJhbmdlID0gcmFuZ2Uuc2xpY2UoKS5yZXZlcnNlKCk7DQogIH0NCg0KICB3aGlsZSAoKytqIDw9IGspIHsNCiAgICB1LnB1c2godW5pbnRlcnBvbGF0ZShkb21haW5baiAtIDFdLCBkb21haW5bal0pKTsNCiAgICBpLnB1c2goaW50ZXJwb2xhdGUocmFuZ2VbaiAtIDFdLCByYW5nZVtqXSkpOw0KICB9DQoNCiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsNCiAgICB2YXIgaiA9IGQzLmJpc2VjdChkb21haW4sIHgsIDEsIGspIC0gMTsNCiAgICByZXR1cm4gaVtqXSh1W2pdKHgpKTsNCiAgfTsNCn0NCmQzLnNjYWxlLmxvZyA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gZDNfc2NhbGVfbG9nKGQzLnNjYWxlLmxpbmVhcigpLCBkM19zY2FsZV9sb2dwKTsNCn07DQoNCmZ1bmN0aW9uIGQzX3NjYWxlX2xvZyhsaW5lYXIsIGxvZykgew0KICB2YXIgcG93ID0gbG9nLnBvdzsNCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgcmV0dXJuIGxpbmVhcihsb2coeCkpOw0KICB9DQoNCiAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBwb3cobGluZWFyLmludmVydCh4KSk7DQogIH07DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmVhci5kb21haW4oKS5tYXAocG93KTsNCiAgICBsb2cgPSB4WzBdIDwgMCA/IGQzX3NjYWxlX2xvZ24gOiBkM19zY2FsZV9sb2dwOw0KICAgIHBvdyA9IGxvZy5wb3c7DQogICAgbGluZWFyLmRvbWFpbih4Lm1hcChsb2cpKTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH07DQoNCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgew0KICAgIGxpbmVhci5kb21haW4oZDNfc2NhbGVfbmljZShsaW5lYXIuZG9tYWluKCksIGQzX3NjYWxlX25pY2VEZWZhdWx0KSk7DQogICAgcmV0dXJuIHNjYWxlOw0KICB9Ow0KDQogIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oKSB7DQogICAgdmFyIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGxpbmVhci5kb21haW4oKSksDQogICAgICAgIHRpY2tzID0gW107DQogICAgaWYgKGV4dGVudC5ldmVyeShpc0Zpbml0ZSkpIHsNCiAgICAgIHZhciBpID0gTWF0aC5mbG9vcihleHRlbnRbMF0pLA0KICAgICAgICAgIGogPSBNYXRoLmNlaWwoZXh0ZW50WzFdKSwNCiAgICAgICAgICB1ID0gcG93KGV4dGVudFswXSksDQogICAgICAgICAgdiA9IHBvdyhleHRlbnRbMV0pOw0KICAgICAgaWYgKGxvZyA9PT0gZDNfc2NhbGVfbG9nbikgew0KICAgICAgICB0aWNrcy5wdXNoKHBvdyhpKSk7DQogICAgICAgIGZvciAoOyBpKysgPCBqOykgZm9yICh2YXIgayA9IDk7IGsgPiAwOyBrLS0pIHRpY2tzLnB1c2gocG93KGkpICogayk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBmb3IgKDsgaSA8IGo7IGkrKykgZm9yICh2YXIgayA9IDE7IGsgPCAxMDsgaysrKSB0aWNrcy5wdXNoKHBvdyhpKSAqIGspOw0KICAgICAgICB0aWNrcy5wdXNoKHBvdyhpKSk7DQogICAgICB9DQogICAgICBmb3IgKGkgPSAwOyB0aWNrc1tpXSA8IHU7IGkrKykge30gLy8gc3RyaXAgc21hbGwgdmFsdWVzDQogICAgICBmb3IgKGogPSB0aWNrcy5sZW5ndGg7IHRpY2tzW2ogLSAxXSA+IHY7IGotLSkge30gLy8gc3RyaXAgYmlnIHZhbHVlcw0KICAgICAgdGlja3MgPSB0aWNrcy5zbGljZShpLCBqKTsNCiAgICB9DQogICAgcmV0dXJuIHRpY2tzOw0KICB9Ow0KDQogIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihuLCBmb3JtYXQpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGZvcm1hdCA9IGQzX3NjYWxlX2xvZ0Zvcm1hdDsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiBmb3JtYXQ7DQogICAgdmFyIGsgPSBuIC8gc2NhbGUudGlja3MoKS5sZW5ndGgsDQogICAgICAgIGYgPSBsb2cgPT09IGQzX3NjYWxlX2xvZ24gPyAoZSA9IC0xZS0xMiwgTWF0aC5mbG9vcikgOiAoZSA9IDFlLTEyLCBNYXRoLmNlaWwpLA0KICAgICAgICBlOw0KICAgIHJldHVybiBmdW5jdGlvbihkKSB7DQogICAgICByZXR1cm4gZCAvIHBvdyhmKGxvZyhkKSArIGUpKSA8IGsgPyBmb3JtYXQoZCkgOiAiIjsNCiAgICB9Ow0KICB9Ow0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gZDNfc2NhbGVfbG9nKGxpbmVhci5jb3B5KCksIGxvZyk7DQogIH07DQoNCiAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclJlYmluZChzY2FsZSwgbGluZWFyKTsNCn0NCg0KdmFyIGQzX3NjYWxlX2xvZ0Zvcm1hdCA9IGQzLmZvcm1hdCgiLjBlIik7DQoNCmZ1bmN0aW9uIGQzX3NjYWxlX2xvZ3AoeCkgew0KICByZXR1cm4gTWF0aC5sb2coeCA8IDAgPyAwIDogeCkgLyBNYXRoLkxOMTA7DQp9DQoNCmZ1bmN0aW9uIGQzX3NjYWxlX2xvZ24oeCkgew0KICByZXR1cm4gLU1hdGgubG9nKHggPiAwID8gMCA6IC14KSAvIE1hdGguTE4xMDsNCn0NCg0KZDNfc2NhbGVfbG9ncC5wb3cgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiBNYXRoLnBvdygxMCwgeCk7DQp9Ow0KDQpkM19zY2FsZV9sb2duLnBvdyA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIC1NYXRoLnBvdygxMCwgLXgpOw0KfTsNCmQzLnNjYWxlLnBvdyA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gZDNfc2NhbGVfcG93KGQzLnNjYWxlLmxpbmVhcigpLCAxKTsNCn07DQoNCmZ1bmN0aW9uIGQzX3NjYWxlX3BvdyhsaW5lYXIsIGV4cG9uZW50KSB7DQogIHZhciBwb3dwID0gZDNfc2NhbGVfcG93UG93KGV4cG9uZW50KSwNCiAgICAgIHBvd2IgPSBkM19zY2FsZV9wb3dQb3coMSAvIGV4cG9uZW50KTsNCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgcmV0dXJuIGxpbmVhcihwb3dwKHgpKTsNCiAgfQ0KDQogIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gcG93YihsaW5lYXIuaW52ZXJ0KHgpKTsNCiAgfTsNCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGluZWFyLmRvbWFpbigpLm1hcChwb3diKTsNCiAgICBsaW5lYXIuZG9tYWluKHgubWFwKHBvd3ApKTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH07DQoNCiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihtKSB7DQogICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tzKHNjYWxlLmRvbWFpbigpLCBtKTsNCiAgfTsNCg0KICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSkgew0KICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KHNjYWxlLmRvbWFpbigpLCBtKTsNCiAgfTsNCg0KICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkM19zY2FsZV9uaWNlKHNjYWxlLmRvbWFpbigpLCBkM19zY2FsZV9saW5lYXJOaWNlKSk7DQogIH07DQoNCiAgc2NhbGUuZXhwb25lbnQgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZXhwb25lbnQ7DQogICAgdmFyIGRvbWFpbiA9IHNjYWxlLmRvbWFpbigpOw0KICAgIHBvd3AgPSBkM19zY2FsZV9wb3dQb3coZXhwb25lbnQgPSB4KTsNCiAgICBwb3diID0gZDNfc2NhbGVfcG93UG93KDEgLyBleHBvbmVudCk7DQogICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkb21haW4pOw0KICB9Ow0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gZDNfc2NhbGVfcG93KGxpbmVhci5jb3B5KCksIGV4cG9uZW50KTsNCiAgfTsNCg0KICByZXR1cm4gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpOw0KfQ0KDQpmdW5jdGlvbiBkM19zY2FsZV9wb3dQb3coZSkgew0KICByZXR1cm4gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiB4IDwgMCA/IC1NYXRoLnBvdygteCwgZSkgOiBNYXRoLnBvdyh4LCBlKTsNCiAgfTsNCn0NCmQzLnNjYWxlLnNxcnQgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIGQzLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KTsNCn07DQpkMy5zY2FsZS5vcmRpbmFsID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBkM19zY2FsZV9vcmRpbmFsKFtdLCB7dDogInJhbmdlIiwgeDogW119KTsNCn07DQoNCmZ1bmN0aW9uIGQzX3NjYWxlX29yZGluYWwoZG9tYWluLCByYW5nZXIpIHsNCiAgdmFyIGluZGV4LA0KICAgICAgcmFuZ2UsDQogICAgICByYW5nZUJhbmQ7DQoNCiAgZnVuY3Rpb24gc2NhbGUoeCkgew0KICAgIHJldHVybiByYW5nZVsoKGluZGV4LmdldCh4KSB8fCBpbmRleC5zZXQoeCwgZG9tYWluLnB1c2goeCkpKSAtIDEpICUgcmFuZ2UubGVuZ3RoXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHN0ZXBzKHN0YXJ0LCBzdGVwKSB7DQogICAgcmV0dXJuIGQzLnJhbmdlKGRvbWFpbi5sZW5ndGgpLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiBzdGFydCArIHN0ZXAgKiBpOyB9KTsNCiAgfQ0KDQogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47DQogICAgZG9tYWluID0gW107DQogICAgaW5kZXggPSBuZXcgZDNfTWFwOw0KICAgIHZhciBpID0gLTEsIG4gPSB4Lmxlbmd0aCwgeGk7DQogICAgd2hpbGUgKCsraSA8IG4pIGlmICghaW5kZXguaGFzKHhpID0geFtpXSkpIGluZGV4LnNldCh4aSwgZG9tYWluLnB1c2goeGkpKTsNCiAgICByZXR1cm4gc2NhbGVbcmFuZ2VyLnRdKHJhbmdlci54LCByYW5nZXIucCk7DQogIH07DQoNCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7DQogICAgcmFuZ2UgPSB4Ow0KICAgIHJhbmdlQmFuZCA9IDA7DQogICAgcmFuZ2VyID0ge3Q6ICJyYW5nZSIsIHg6IHh9Ow0KICAgIHJldHVybiBzY2FsZTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZVBvaW50cyA9IGZ1bmN0aW9uKHgsIHBhZGRpbmcpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHBhZGRpbmcgPSAwOw0KICAgIHZhciBzdGFydCA9IHhbMF0sDQogICAgICAgIHN0b3AgPSB4WzFdLA0KICAgICAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCAtIDEgKyBwYWRkaW5nKTsNCiAgICByYW5nZSA9IHN0ZXBzKGRvbWFpbi5sZW5ndGggPCAyID8gKHN0YXJ0ICsgc3RvcCkgLyAyIDogc3RhcnQgKyBzdGVwICogcGFkZGluZyAvIDIsIHN0ZXApOw0KICAgIHJhbmdlQmFuZCA9IDA7DQogICAgcmFuZ2VyID0ge3Q6ICJyYW5nZVBvaW50cyIsIHg6IHgsIHA6IHBhZGRpbmd9Ow0KICAgIHJldHVybiBzY2FsZTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZUJhbmRzID0gZnVuY3Rpb24oeCwgcGFkZGluZykgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7DQogICAgdmFyIHJldmVyc2UgPSB4WzFdIDwgeFswXSwNCiAgICAgICAgc3RhcnQgPSB4W3JldmVyc2UgLSAwXSwNCiAgICAgICAgc3RvcCA9IHhbMSAtIHJldmVyc2VdLA0KICAgICAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCArIHBhZGRpbmcpOw0KICAgIHJhbmdlID0gc3RlcHMoc3RhcnQgKyBzdGVwICogcGFkZGluZywgc3RlcCk7DQogICAgaWYgKHJldmVyc2UpIHJhbmdlLnJldmVyc2UoKTsNCiAgICByYW5nZUJhbmQgPSBzdGVwICogKDEgLSBwYWRkaW5nKTsNCiAgICByYW5nZXIgPSB7dDogInJhbmdlQmFuZHMiLCB4OiB4LCBwOiBwYWRkaW5nfTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH07DQoNCiAgc2NhbGUucmFuZ2VSb3VuZEJhbmRzID0gZnVuY3Rpb24oeCwgcGFkZGluZykgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7DQogICAgdmFyIHJldmVyc2UgPSB4WzFdIDwgeFswXSwNCiAgICAgICAgc3RhcnQgPSB4W3JldmVyc2UgLSAwXSwNCiAgICAgICAgc3RvcCA9IHhbMSAtIHJldmVyc2VdLA0KICAgICAgICBzdGVwID0gTWF0aC5mbG9vcigoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoICsgcGFkZGluZykpLA0KICAgICAgICBlcnJvciA9IHN0b3AgLSBzdGFydCAtIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZykgKiBzdGVwOw0KICAgIHJhbmdlID0gc3RlcHMoc3RhcnQgKyBNYXRoLnJvdW5kKGVycm9yIC8gMiksIHN0ZXApOw0KICAgIGlmIChyZXZlcnNlKSByYW5nZS5yZXZlcnNlKCk7DQogICAgcmFuZ2VCYW5kID0gTWF0aC5yb3VuZChzdGVwICogKDEgLSBwYWRkaW5nKSk7DQogICAgcmFuZ2VyID0ge3Q6ICJyYW5nZVJvdW5kQmFuZHMiLCB4OiB4LCBwOiBwYWRkaW5nfTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH07DQoNCiAgc2NhbGUucmFuZ2VCYW5kID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHJhbmdlQmFuZDsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZUV4dGVudCA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBkM19zY2FsZUV4dGVudChyYW5nZXIueCk7DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBkM19zY2FsZV9vcmRpbmFsKGRvbWFpbiwgcmFuZ2VyKTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGUuZG9tYWluKGRvbWFpbik7DQp9DQovKg0KICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNvbG9yIHNwZWNpZmljYXRpb25zIGFuZCBkZXNpZ25zIGRldmVsb3BlZCBieSBDeW50aGlhDQogKiBCcmV3ZXIgKGh0dHA6Ly9jb2xvcmJyZXdlci5vcmcvKS4gU2VlIGxpYi9jb2xvcmJyZXdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCiAqLw0KDQpkMy5zY2FsZS5jYXRlZ29yeTEwID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkxMCk7DQp9Ow0KDQpkMy5zY2FsZS5jYXRlZ29yeTIwID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMCk7DQp9Ow0KDQpkMy5zY2FsZS5jYXRlZ29yeTIwYiA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjBiKTsNCn07DQoNCmQzLnNjYWxlLmNhdGVnb3J5MjBjID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMGMpOw0KfTsNCg0KdmFyIGQzX2NhdGVnb3J5MTAgPSBbDQogICIjMWY3N2I0IiwgIiNmZjdmMGUiLCAiIzJjYTAyYyIsICIjZDYyNzI4IiwgIiM5NDY3YmQiLA0KICAiIzhjNTY0YiIsICIjZTM3N2MyIiwgIiM3ZjdmN2YiLCAiI2JjYmQyMiIsICIjMTdiZWNmIg0KXTsNCg0KdmFyIGQzX2NhdGVnb3J5MjAgPSBbDQogICIjMWY3N2I0IiwgIiNhZWM3ZTgiLA0KICAiI2ZmN2YwZSIsICIjZmZiYjc4IiwNCiAgIiMyY2EwMmMiLCAiIzk4ZGY4YSIsDQogICIjZDYyNzI4IiwgIiNmZjk4OTYiLA0KICAiIzk0NjdiZCIsICIjYzViMGQ1IiwNCiAgIiM4YzU2NGIiLCAiI2M0OWM5NCIsDQogICIjZTM3N2MyIiwgIiNmN2I2ZDIiLA0KICAiIzdmN2Y3ZiIsICIjYzdjN2M3IiwNCiAgIiNiY2JkMjIiLCAiI2RiZGI4ZCIsDQogICIjMTdiZWNmIiwgIiM5ZWRhZTUiDQpdOw0KDQp2YXIgZDNfY2F0ZWdvcnkyMGIgPSBbDQogICIjMzkzYjc5IiwgIiM1MjU0YTMiLCAiIzZiNmVjZiIsICIjOWM5ZWRlIiwNCiAgIiM2Mzc5MzkiLCAiIzhjYTI1MiIsICIjYjVjZjZiIiwgIiNjZWRiOWMiLA0KICAiIzhjNmQzMSIsICIjYmQ5ZTM5IiwgIiNlN2JhNTIiLCAiI2U3Y2I5NCIsDQogICIjODQzYzM5IiwgIiNhZDQ5NGEiLCAiI2Q2NjE2YiIsICIjZTc5NjljIiwNCiAgIiM3YjQxNzMiLCAiI2E1NTE5NCIsICIjY2U2ZGJkIiwgIiNkZTllZDYiDQpdOw0KDQp2YXIgZDNfY2F0ZWdvcnkyMGMgPSBbDQogICIjMzE4MmJkIiwgIiM2YmFlZDYiLCAiIzllY2FlMSIsICIjYzZkYmVmIiwNCiAgIiNlNjU1MGQiLCAiI2ZkOGQzYyIsICIjZmRhZTZiIiwgIiNmZGQwYTIiLA0KICAiIzMxYTM1NCIsICIjNzRjNDc2IiwgIiNhMWQ5OWIiLCAiI2M3ZTljMCIsDQogICIjNzU2YmIxIiwgIiM5ZTlhYzgiLCAiI2JjYmRkYyIsICIjZGFkYWViIiwNCiAgIiM2MzYzNjMiLCAiIzk2OTY5NiIsICIjYmRiZGJkIiwgIiNkOWQ5ZDkiDQpdOw0KZDMuc2NhbGUucXVhbnRpbGUgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aWxlKFtdLCBbXSk7DQp9Ow0KDQpmdW5jdGlvbiBkM19zY2FsZV9xdWFudGlsZShkb21haW4sIHJhbmdlKSB7DQogIHZhciB0aHJlc2hvbGRzOw0KDQogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7DQogICAgdmFyIGsgPSAwLA0KICAgICAgICBuID0gZG9tYWluLmxlbmd0aCwNCiAgICAgICAgcSA9IHJhbmdlLmxlbmd0aDsNCiAgICB0aHJlc2hvbGRzID0gW107DQogICAgd2hpbGUgKCsrayA8IHEpIHRocmVzaG9sZHNbayAtIDFdID0gZDMucXVhbnRpbGUoZG9tYWluLCBrIC8gcSk7DQogICAgcmV0dXJuIHNjYWxlOw0KICB9DQoNCiAgZnVuY3Rpb24gc2NhbGUoeCkgew0KICAgIGlmIChpc05hTih4ID0gK3gpKSByZXR1cm4gTmFOOw0KICAgIHJldHVybiByYW5nZVtkMy5iaXNlY3QodGhyZXNob2xkcywgeCldOw0KICB9DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsNCiAgICBkb21haW4gPSB4LmZpbHRlcihmdW5jdGlvbihkKSB7IHJldHVybiAhaXNOYU4oZCk7IH0pLnNvcnQoZDMuYXNjZW5kaW5nKTsNCiAgICByZXR1cm4gcmVzY2FsZSgpOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlOw0KICAgIHJhbmdlID0geDsNCiAgICByZXR1cm4gcmVzY2FsZSgpOw0KICB9Ow0KDQogIHNjYWxlLnF1YW50aWxlcyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aHJlc2hvbGRzOw0KICB9Ow0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gZDNfc2NhbGVfcXVhbnRpbGUoZG9tYWluLCByYW5nZSk7IC8vIGNvcHkgb24gd3JpdGUhDQogIH07DQoNCiAgcmV0dXJuIHJlc2NhbGUoKTsNCn0NCmQzLnNjYWxlLnF1YW50aXplID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBkM19zY2FsZV9xdWFudGl6ZSgwLCAxLCBbMCwgMV0pOw0KfTsNCg0KZnVuY3Rpb24gZDNfc2NhbGVfcXVhbnRpemUoeDAsIHgxLCByYW5nZSkgew0KICB2YXIga3gsIGk7DQoNCiAgZnVuY3Rpb24gc2NhbGUoeCkgew0KICAgIHJldHVybiByYW5nZVtNYXRoLm1heCgwLCBNYXRoLm1pbihpLCBNYXRoLmZsb29yKGt4ICogKHggLSB4MCkpKSldOw0KICB9DQoNCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsNCiAgICBreCA9IHJhbmdlLmxlbmd0aCAvICh4MSAtIHgwKTsNCiAgICBpID0gcmFuZ2UubGVuZ3RoIC0gMTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH0NCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW3gwLCB4MV07DQogICAgeDAgPSAreFswXTsNCiAgICB4MSA9ICt4W3gubGVuZ3RoIC0gMV07DQogICAgcmV0dXJuIHJlc2NhbGUoKTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsNCiAgICByYW5nZSA9IHg7DQogICAgcmV0dXJuIHJlc2NhbGUoKTsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aXplKHgwLCB4MSwgcmFuZ2UpOyAvLyBjb3B5IG9uIHdyaXRlDQogIH07DQoNCiAgcmV0dXJuIHJlc2NhbGUoKTsNCn0NCmQzLnNjYWxlLmlkZW50aXR5ID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBkM19zY2FsZV9pZGVudGl0eShbMCwgMV0pOw0KfTsNCg0KZnVuY3Rpb24gZDNfc2NhbGVfaWRlbnRpdHkoZG9tYWluKSB7DQoNCiAgZnVuY3Rpb24gaWRlbnRpdHkoeCkgeyByZXR1cm4gK3g7IH0NCg0KICBpZGVudGl0eS5pbnZlcnQgPSBpZGVudGl0eTsNCg0KICBpZGVudGl0eS5kb21haW4gPSBpZGVudGl0eS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47DQogICAgZG9tYWluID0geC5tYXAoaWRlbnRpdHkpOw0KICAgIHJldHVybiBpZGVudGl0eTsNCiAgfTsNCg0KICBpZGVudGl0eS50aWNrcyA9IGZ1bmN0aW9uKG0pIHsNCiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKTsNCiAgfTsNCg0KICBpZGVudGl0eS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSkgew0KICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSk7DQogIH07DQoNCiAgaWRlbnRpdHkuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBkM19zY2FsZV9pZGVudGl0eShkb21haW4pOw0KICB9Ow0KDQogIHJldHVybiBpZGVudGl0eTsNCn0NCmQzLnN2ZyA9IHt9Ow0KZDMuc3ZnLmFyYyA9IGZ1bmN0aW9uKCkgew0KICB2YXIgaW5uZXJSYWRpdXMgPSBkM19zdmdfYXJjSW5uZXJSYWRpdXMsDQogICAgICBvdXRlclJhZGl1cyA9IGQzX3N2Z19hcmNPdXRlclJhZGl1cywNCiAgICAgIHN0YXJ0QW5nbGUgPSBkM19zdmdfYXJjU3RhcnRBbmdsZSwNCiAgICAgIGVuZEFuZ2xlID0gZDNfc3ZnX2FyY0VuZEFuZ2xlOw0KDQogIGZ1bmN0aW9uIGFyYygpIHsNCiAgICB2YXIgcjAgPSBpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLA0KICAgICAgICByMSA9IG91dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksDQogICAgICAgIGEwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgZDNfc3ZnX2FyY09mZnNldCwNCiAgICAgICAgYTEgPSBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgZDNfc3ZnX2FyY09mZnNldCwNCiAgICAgICAgZGEgPSAoYTEgPCBhMCAmJiAoZGEgPSBhMCwgYTAgPSBhMSwgYTEgPSBkYSksIGExIC0gYTApLA0KICAgICAgICBkZiA9IGRhIDwgTWF0aC5QSSA/ICIwIiA6ICIxIiwNCiAgICAgICAgYzAgPSBNYXRoLmNvcyhhMCksDQogICAgICAgIHMwID0gTWF0aC5zaW4oYTApLA0KICAgICAgICBjMSA9IE1hdGguY29zKGExKSwNCiAgICAgICAgczEgPSBNYXRoLnNpbihhMSk7DQogICAgcmV0dXJuIGRhID49IGQzX3N2Z19hcmNNYXgNCiAgICAgID8gKHIwDQogICAgICA/ICJNMCwiICsgcjENCiAgICAgICsgIkEiICsgcjEgKyAiLCIgKyByMSArICIgMCAxLDEgMCwiICsgKC1yMSkNCiAgICAgICsgIkEiICsgcjEgKyAiLCIgKyByMSArICIgMCAxLDEgMCwiICsgcjENCiAgICAgICsgIk0wLCIgKyByMA0KICAgICAgKyAiQSIgKyByMCArICIsIiArIHIwICsgIiAwIDEsMCAwLCIgKyAoLXIwKQ0KICAgICAgKyAiQSIgKyByMCArICIsIiArIHIwICsgIiAwIDEsMCAwLCIgKyByMA0KICAgICAgKyAiWiINCiAgICAgIDogIk0wLCIgKyByMQ0KICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyAoLXIxKQ0KICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyByMQ0KICAgICAgKyAiWiIpDQogICAgICA6IChyMA0KICAgICAgPyAiTSIgKyByMSAqIGMwICsgIiwiICsgcjEgKiBzMA0KICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwICIgKyBkZiArICIsMSAiICsgcjEgKiBjMSArICIsIiArIHIxICogczENCiAgICAgICsgIkwiICsgcjAgKiBjMSArICIsIiArIHIwICogczENCiAgICAgICsgIkEiICsgcjAgKyAiLCIgKyByMCArICIgMCAiICsgZGYgKyAiLDAgIiArIHIwICogYzAgKyAiLCIgKyByMCAqIHMwDQogICAgICArICJaIg0KICAgICAgOiAiTSIgKyByMSAqIGMwICsgIiwiICsgcjEgKiBzMA0KICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwICIgKyBkZiArICIsMSAiICsgcjEgKiBjMSArICIsIiArIHIxICogczENCiAgICAgICsgIkwwLDAiDQogICAgICArICJaIik7DQogIH0NCg0KICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbih2KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW5uZXJSYWRpdXM7DQogICAgaW5uZXJSYWRpdXMgPSBkMy5mdW5jdG9yKHYpOw0KICAgIHJldHVybiBhcmM7DQogIH07DQoNCiAgYXJjLm91dGVyUmFkaXVzID0gZnVuY3Rpb24odikgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG91dGVyUmFkaXVzOw0KICAgIG91dGVyUmFkaXVzID0gZDMuZnVuY3Rvcih2KTsNCiAgICByZXR1cm4gYXJjOw0KICB9Ow0KDQogIGFyYy5zdGFydEFuZ2xlID0gZnVuY3Rpb24odikgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7DQogICAgc3RhcnRBbmdsZSA9IGQzLmZ1bmN0b3Iodik7DQogICAgcmV0dXJuIGFyYzsNCiAgfTsNCg0KICBhcmMuZW5kQW5nbGUgPSBmdW5jdGlvbih2KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZW5kQW5nbGU7DQogICAgZW5kQW5nbGUgPSBkMy5mdW5jdG9yKHYpOw0KICAgIHJldHVybiBhcmM7DQogIH07DQoNCiAgYXJjLmNlbnRyb2lkID0gZnVuY3Rpb24oKSB7DQogICAgdmFyIHIgPSAoaW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKQ0KICAgICAgICArIG91dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiwNCiAgICAgICAgYSA9IChzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykNCiAgICAgICAgKyBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgKyBkM19zdmdfYXJjT2Zmc2V0Ow0KICAgIHJldHVybiBbTWF0aC5jb3MoYSkgKiByLCBNYXRoLnNpbihhKSAqIHJdOw0KICB9Ow0KDQogIHJldHVybiBhcmM7DQp9Ow0KDQp2YXIgZDNfc3ZnX2FyY09mZnNldCA9IC1NYXRoLlBJIC8gMiwNCiAgICBkM19zdmdfYXJjTWF4ID0gMiAqIE1hdGguUEkgLSAxZS02Ow0KDQpmdW5jdGlvbiBkM19zdmdfYXJjSW5uZXJSYWRpdXMoZCkgew0KICByZXR1cm4gZC5pbm5lclJhZGl1czsNCn0NCg0KZnVuY3Rpb24gZDNfc3ZnX2FyY091dGVyUmFkaXVzKGQpIHsNCiAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7DQp9DQoNCmZ1bmN0aW9uIGQzX3N2Z19hcmNTdGFydEFuZ2xlKGQpIHsNCiAgcmV0dXJuIGQuc3RhcnRBbmdsZTsNCn0NCg0KZnVuY3Rpb24gZDNfc3ZnX2FyY0VuZEFuZ2xlKGQpIHsNCiAgcmV0dXJuIGQuZW5kQW5nbGU7DQp9DQpmdW5jdGlvbiBkM19zdmdfbGluZShwcm9qZWN0aW9uKSB7DQogIHZhciB4ID0gZDNfc3ZnX2xpbmVYLA0KICAgICAgeSA9IGQzX3N2Z19saW5lWSwNCiAgICAgIGludGVycG9sYXRlID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JEZWZhdWx0LA0KICAgICAgaW50ZXJwb2xhdG9yID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmdldChpbnRlcnBvbGF0ZSksDQogICAgICB0ZW5zaW9uID0gLjc7DQoNCiAgZnVuY3Rpb24gbGluZShkKSB7DQogICAgcmV0dXJuIGQubGVuZ3RoIDwgMSA/IG51bGwgOiAiTSIgKyBpbnRlcnBvbGF0b3IocHJvamVjdGlvbihkM19zdmdfbGluZVBvaW50cyh0aGlzLCBkLCB4LCB5KSksIHRlbnNpb24pOw0KICB9DQoNCiAgbGluZS54ID0gZnVuY3Rpb24odikgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHg7DQogICAgeCA9IHY7DQogICAgcmV0dXJuIGxpbmU7DQogIH07DQoNCiAgbGluZS55ID0gZnVuY3Rpb24odikgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHk7DQogICAgeSA9IHY7DQogICAgcmV0dXJuIGxpbmU7DQogIH07DQoNCiAgbGluZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHYpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbnRlcnBvbGF0ZTsNCiAgICBpZiAoIWQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5oYXModiArPSAiIikpIHYgPSBkM19zdmdfbGluZUludGVycG9sYXRvckRlZmF1bHQ7DQogICAgaW50ZXJwb2xhdG9yID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmdldChpbnRlcnBvbGF0ZSA9IHYpOw0KICAgIHJldHVybiBsaW5lOw0KICB9Ow0KDQogIGxpbmUudGVuc2lvbiA9IGZ1bmN0aW9uKHYpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0ZW5zaW9uOw0KICAgIHRlbnNpb24gPSB2Ow0KICAgIHJldHVybiBsaW5lOw0KICB9Ow0KDQogIHJldHVybiBsaW5lOw0KfQ0KDQpkMy5zdmcubGluZSA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gZDNfc3ZnX2xpbmUoT2JqZWN0KTsNCn07DQoNCi8vIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZGF0YSBpbnRvIGFuIGFycmF5IG9mIHBvaW50cw0KLy8gKHgteSB0dXBsZXMpLCBieSBldmFsdWF0aW5nIHRoZSBzcGVjaWZpZWQgYHhgIGFuZCBgeWAgZnVuY3Rpb25zIG9uIGVhY2gNCi8vIGRhdGEgcG9pbnQuIFRoZSBgdGhpc2AgY29udGV4dCBvZiB0aGUgZXZhbHVhdGVkIGZ1bmN0aW9ucyBpcyB0aGUgc3BlY2lmaWVkDQovLyAic2VsZiIgb2JqZWN0OyBlYWNoIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgY3VycmVudCBkYXR1bSBhbmQgaW5kZXguDQpmdW5jdGlvbiBkM19zdmdfbGluZVBvaW50cyhzZWxmLCBkLCB4LCB5KSB7DQogIHZhciBwb2ludHMgPSBbXSwNCiAgICAgIGkgPSAtMSwNCiAgICAgIG4gPSBkLmxlbmd0aCwNCiAgICAgIGZ4ID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIsDQogICAgICBmeSA9IHR5cGVvZiB5ID09PSAiZnVuY3Rpb24iLA0KICAgICAgdmFsdWU7DQogIGlmIChmeCAmJiBmeSkgew0KICAgIHdoaWxlICgrK2kgPCBuKSBwb2ludHMucHVzaChbDQogICAgICB4LmNhbGwoc2VsZiwgdmFsdWUgPSBkW2ldLCBpKSwNCiAgICAgIHkuY2FsbChzZWxmLCB2YWx1ZSwgaSkNCiAgICBdKTsNCiAgfSBlbHNlIGlmIChmeCkgew0KICAgIHdoaWxlICgrK2kgPCBuKSBwb2ludHMucHVzaChbeC5jYWxsKHNlbGYsIGRbaV0sIGkpLCB5XSk7DQogIH0gZWxzZSBpZiAoZnkpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgcG9pbnRzLnB1c2goW3gsIHkuY2FsbChzZWxmLCBkW2ldLCBpKV0pOw0KICB9IGVsc2Ugew0KICAgIHdoaWxlICgrK2kgPCBuKSBwb2ludHMucHVzaChbeCwgeV0pOw0KICB9DQogIHJldHVybiBwb2ludHM7DQp9DQoNCi8vIFRoZSBkZWZhdWx0IGB4YCBwcm9wZXJ0eSwgd2hpY2ggcmVmZXJlbmNlcyBkWzBdLg0KZnVuY3Rpb24gZDNfc3ZnX2xpbmVYKGQpIHsNCiAgcmV0dXJuIGRbMF07DQp9DQoNCi8vIFRoZSBkZWZhdWx0IGB5YCBwcm9wZXJ0eSwgd2hpY2ggcmVmZXJlbmNlcyBkWzFdLg0KZnVuY3Rpb24gZDNfc3ZnX2xpbmVZKGQpIHsNCiAgcmV0dXJuIGRbMV07DQp9DQoNCnZhciBkM19zdmdfbGluZUludGVycG9sYXRvckRlZmF1bHQgPSAibGluZWFyIjsNCg0KLy8gVGhlIHZhcmlvdXMgaW50ZXJwb2xhdG9ycyBzdXBwb3J0ZWQgYnkgdGhlIGBsaW5lYCBjbGFzcy4NCnZhciBkM19zdmdfbGluZUludGVycG9sYXRvcnMgPSBkMy5tYXAoew0KICAibGluZWFyIjogZDNfc3ZnX2xpbmVMaW5lYXIsDQogICJzdGVwLWJlZm9yZSI6IGQzX3N2Z19saW5lU3RlcEJlZm9yZSwNCiAgInN0ZXAtYWZ0ZXIiOiBkM19zdmdfbGluZVN0ZXBBZnRlciwNCiAgImJhc2lzIjogZDNfc3ZnX2xpbmVCYXNpcywNCiAgImJhc2lzLW9wZW4iOiBkM19zdmdfbGluZUJhc2lzT3BlbiwNCiAgImJhc2lzLWNsb3NlZCI6IGQzX3N2Z19saW5lQmFzaXNDbG9zZWQsDQogICJidW5kbGUiOiBkM19zdmdfbGluZUJ1bmRsZSwNCiAgImNhcmRpbmFsIjogZDNfc3ZnX2xpbmVDYXJkaW5hbCwNCiAgImNhcmRpbmFsLW9wZW4iOiBkM19zdmdfbGluZUNhcmRpbmFsT3BlbiwNCiAgImNhcmRpbmFsLWNsb3NlZCI6IGQzX3N2Z19saW5lQ2FyZGluYWxDbG9zZWQsDQogICJtb25vdG9uZSI6IGQzX3N2Z19saW5lTW9ub3RvbmUNCn0pOw0KDQovLyBMaW5lYXIgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJMIiBjb21tYW5kcy4NCmZ1bmN0aW9uIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykgew0KICB2YXIgaSA9IDAsDQogICAgICBuID0gcG9pbnRzLmxlbmd0aCwNCiAgICAgIHAgPSBwb2ludHNbMF0sDQogICAgICBwYXRoID0gW3BbMF0sICIsIiwgcFsxXV07DQogIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goIkwiLCAocCA9IHBvaW50c1tpXSlbMF0sICIsIiwgcFsxXSk7DQogIHJldHVybiBwYXRoLmpvaW4oIiIpOw0KfQ0KDQovLyBTdGVwIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiSCIgYW5kICJWIiBjb21tYW5kcy4NCmZ1bmN0aW9uIGQzX3N2Z19saW5lU3RlcEJlZm9yZShwb2ludHMpIHsNCiAgdmFyIGkgPSAwLA0KICAgICAgbiA9IHBvaW50cy5sZW5ndGgsDQogICAgICBwID0gcG9pbnRzWzBdLA0KICAgICAgcGF0aCA9IFtwWzBdLCAiLCIsIHBbMV1dOw0KICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJWIiwgKHAgPSBwb2ludHNbaV0pWzFdLCAiSCIsIHBbMF0pOw0KICByZXR1cm4gcGF0aC5qb2luKCIiKTsNCn0NCg0KLy8gU3RlcCBpbnRlcnBvbGF0aW9uOyBnZW5lcmF0ZXMgIkgiIGFuZCAiViIgY29tbWFuZHMuDQpmdW5jdGlvbiBkM19zdmdfbGluZVN0ZXBBZnRlcihwb2ludHMpIHsNCiAgdmFyIGkgPSAwLA0KICAgICAgbiA9IHBvaW50cy5sZW5ndGgsDQogICAgICBwID0gcG9pbnRzWzBdLA0KICAgICAgcGF0aCA9IFtwWzBdLCAiLCIsIHBbMV1dOw0KICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJIIiwgKHAgPSBwb2ludHNbaV0pWzBdLCAiViIsIHBbMV0pOw0KICByZXR1cm4gcGF0aC5qb2luKCIiKTsNCn0NCg0KLy8gT3BlbiBjYXJkaW5hbCBzcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4NCmZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWxPcGVuKHBvaW50cywgdGVuc2lvbikgew0KICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDQNCiAgICAgID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKQ0KICAgICAgOiBwb2ludHNbMV0gKyBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLnNsaWNlKDEsIHBvaW50cy5sZW5ndGggLSAxKSwNCiAgICAgICAgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpOw0KfQ0KDQovLyBDbG9zZWQgY2FyZGluYWwgc3BsaW5lIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiQyIgY29tbWFuZHMuDQpmdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsQ2xvc2VkKHBvaW50cywgdGVuc2lvbikgew0KICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDMNCiAgICAgID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKQ0KICAgICAgOiBwb2ludHNbMF0gKyBkM19zdmdfbGluZUhlcm1pdGUoKHBvaW50cy5wdXNoKHBvaW50c1swXSksIHBvaW50cyksDQogICAgICAgIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhbcG9pbnRzW3BvaW50cy5sZW5ndGggLSAyXV0NCiAgICAgICAgLmNvbmNhdChwb2ludHMsIFtwb2ludHNbMV1dKSwgdGVuc2lvbikpOw0KfQ0KDQovLyBDYXJkaW5hbCBzcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4NCmZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWwocG9pbnRzLCB0ZW5zaW9uLCBjbG9zZWQpIHsNCiAgcmV0dXJuIHBvaW50cy5sZW5ndGggPCAzDQogICAgICA/IGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykNCiAgICAgIDogcG9pbnRzWzBdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cywNCiAgICAgICAgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpOw0KfQ0KDQovLyBIZXJtaXRlIHNwbGluZSBjb25zdHJ1Y3Rpb247IGdlbmVyYXRlcyAiQyIgY29tbWFuZHMuDQpmdW5jdGlvbiBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLCB0YW5nZW50cykgew0KICBpZiAodGFuZ2VudHMubGVuZ3RoIDwgMQ0KICAgICAgfHwgKHBvaW50cy5sZW5ndGggIT0gdGFuZ2VudHMubGVuZ3RoDQogICAgICAmJiBwb2ludHMubGVuZ3RoICE9IHRhbmdlbnRzLmxlbmd0aCArIDIpKSB7DQogICAgcmV0dXJuIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cyk7DQogIH0NCg0KICB2YXIgcXVhZCA9IHBvaW50cy5sZW5ndGggIT0gdGFuZ2VudHMubGVuZ3RoLA0KICAgICAgcGF0aCA9ICIiLA0KICAgICAgcDAgPSBwb2ludHNbMF0sDQogICAgICBwID0gcG9pbnRzWzFdLA0KICAgICAgdDAgPSB0YW5nZW50c1swXSwNCiAgICAgIHQgPSB0MCwNCiAgICAgIHBpID0gMTsNCg0KICBpZiAocXVhZCkgew0KICAgIHBhdGggKz0gIlEiICsgKHBbMF0gLSB0MFswXSAqIDIgLyAzKSArICIsIiArIChwWzFdIC0gdDBbMV0gKiAyIC8gMykNCiAgICAgICAgKyAiLCIgKyBwWzBdICsgIiwiICsgcFsxXTsNCiAgICBwMCA9IHBvaW50c1sxXTsNCiAgICBwaSA9IDI7DQogIH0NCg0KICBpZiAodGFuZ2VudHMubGVuZ3RoID4gMSkgew0KICAgIHQgPSB0YW5nZW50c1sxXTsNCiAgICBwID0gcG9pbnRzW3BpXTsNCiAgICBwaSsrOw0KICAgIHBhdGggKz0gIkMiICsgKHAwWzBdICsgdDBbMF0pICsgIiwiICsgKHAwWzFdICsgdDBbMV0pDQogICAgICAgICsgIiwiICsgKHBbMF0gLSB0WzBdKSArICIsIiArIChwWzFdIC0gdFsxXSkNCiAgICAgICAgKyAiLCIgKyBwWzBdICsgIiwiICsgcFsxXTsNCiAgICBmb3IgKHZhciBpID0gMjsgaSA8IHRhbmdlbnRzLmxlbmd0aDsgaSsrLCBwaSsrKSB7DQogICAgICBwID0gcG9pbnRzW3BpXTsNCiAgICAgIHQgPSB0YW5nZW50c1tpXTsNCiAgICAgIHBhdGggKz0gIlMiICsgKHBbMF0gLSB0WzBdKSArICIsIiArIChwWzFdIC0gdFsxXSkNCiAgICAgICAgICArICIsIiArIHBbMF0gKyAiLCIgKyBwWzFdOw0KICAgIH0NCiAgfQ0KDQogIGlmIChxdWFkKSB7DQogICAgdmFyIGxwID0gcG9pbnRzW3BpXTsNCiAgICBwYXRoICs9ICJRIiArIChwWzBdICsgdFswXSAqIDIgLyAzKSArICIsIiArIChwWzFdICsgdFsxXSAqIDIgLyAzKQ0KICAgICAgICArICIsIiArIGxwWzBdICsgIiwiICsgbHBbMV07DQogIH0NCg0KICByZXR1cm4gcGF0aDsNCn0NCg0KLy8gR2VuZXJhdGVzIHRhbmdlbnRzIGZvciBhIGNhcmRpbmFsIHNwbGluZS4NCmZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhwb2ludHMsIHRlbnNpb24pIHsNCiAgdmFyIHRhbmdlbnRzID0gW10sDQogICAgICBhID0gKDEgLSB0ZW5zaW9uKSAvIDIsDQogICAgICBwMCwNCiAgICAgIHAxID0gcG9pbnRzWzBdLA0KICAgICAgcDIgPSBwb2ludHNbMV0sDQogICAgICBpID0gMSwNCiAgICAgIG4gPSBwb2ludHMubGVuZ3RoOw0KICB3aGlsZSAoKytpIDwgbikgew0KICAgIHAwID0gcDE7DQogICAgcDEgPSBwMjsNCiAgICBwMiA9IHBvaW50c1tpXTsNCiAgICB0YW5nZW50cy5wdXNoKFthICogKHAyWzBdIC0gcDBbMF0pLCBhICogKHAyWzFdIC0gcDBbMV0pXSk7DQogIH0NCiAgcmV0dXJuIHRhbmdlbnRzOw0KfQ0KDQovLyBCLXNwbGluZSBpbnRlcnBvbGF0aW9uOyBnZW5lcmF0ZXMgIkMiIGNvbW1hbmRzLg0KZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpcyhwb2ludHMpIHsNCiAgaWYgKHBvaW50cy5sZW5ndGggPCAzKSByZXR1cm4gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKTsNCiAgdmFyIGkgPSAxLA0KICAgICAgbiA9IHBvaW50cy5sZW5ndGgsDQogICAgICBwaSA9IHBvaW50c1swXSwNCiAgICAgIHgwID0gcGlbMF0sDQogICAgICB5MCA9IHBpWzFdLA0KICAgICAgcHggPSBbeDAsIHgwLCB4MCwgKHBpID0gcG9pbnRzWzFdKVswXV0sDQogICAgICBweSA9IFt5MCwgeTAsIHkwLCBwaVsxXV0sDQogICAgICBwYXRoID0gW3gwLCAiLCIsIHkwXTsNCiAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOw0KICB3aGlsZSAoKytpIDwgbikgew0KICAgIHBpID0gcG9pbnRzW2ldOw0KICAgIHB4LnNoaWZ0KCk7IHB4LnB1c2gocGlbMF0pOw0KICAgIHB5LnNoaWZ0KCk7IHB5LnB1c2gocGlbMV0pOw0KICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTsNCiAgfQ0KICBpID0gLTE7DQogIHdoaWxlICgrK2kgPCAyKSB7DQogICAgcHguc2hpZnQoKTsgcHgucHVzaChwaVswXSk7DQogICAgcHkuc2hpZnQoKTsgcHkucHVzaChwaVsxXSk7DQogICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOw0KICB9DQogIHJldHVybiBwYXRoLmpvaW4oIiIpOw0KfQ0KDQovLyBPcGVuIEItc3BsaW5lIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiQyIgY29tbWFuZHMuDQpmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzT3Blbihwb2ludHMpIHsNCiAgaWYgKHBvaW50cy5sZW5ndGggPCA0KSByZXR1cm4gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKTsNCiAgdmFyIHBhdGggPSBbXSwNCiAgICAgIGkgPSAtMSwNCiAgICAgIG4gPSBwb2ludHMubGVuZ3RoLA0KICAgICAgcGksDQogICAgICBweCA9IFswXSwNCiAgICAgIHB5ID0gWzBdOw0KICB3aGlsZSAoKytpIDwgMykgew0KICAgIHBpID0gcG9pbnRzW2ldOw0KICAgIHB4LnB1c2gocGlbMF0pOw0KICAgIHB5LnB1c2gocGlbMV0pOw0KICB9DQogIHBhdGgucHVzaChkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB4KQ0KICAgICsgIiwiICsgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweSkpOw0KICAtLWk7IHdoaWxlICgrK2kgPCBuKSB7DQogICAgcGkgPSBwb2ludHNbaV07DQogICAgcHguc2hpZnQoKTsgcHgucHVzaChwaVswXSk7DQogICAgcHkuc2hpZnQoKTsgcHkucHVzaChwaVsxXSk7DQogICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOw0KICB9DQogIHJldHVybiBwYXRoLmpvaW4oIiIpOw0KfQ0KDQovLyBDbG9zZWQgQi1zcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4NCmZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXNDbG9zZWQocG9pbnRzKSB7DQogIHZhciBwYXRoLA0KICAgICAgaSA9IC0xLA0KICAgICAgbiA9IHBvaW50cy5sZW5ndGgsDQogICAgICBtID0gbiArIDQsDQogICAgICBwaSwNCiAgICAgIHB4ID0gW10sDQogICAgICBweSA9IFtdOw0KICB3aGlsZSAoKytpIDwgNCkgew0KICAgIHBpID0gcG9pbnRzW2kgJSBuXTsNCiAgICBweC5wdXNoKHBpWzBdKTsNCiAgICBweS5wdXNoKHBpWzFdKTsNCiAgfQ0KICBwYXRoID0gWw0KICAgIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHgpLCAiLCIsDQogICAgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweSkNCiAgXTsNCiAgLS1pOyB3aGlsZSAoKytpIDwgbSkgew0KICAgIHBpID0gcG9pbnRzW2kgJSBuXTsNCiAgICBweC5zaGlmdCgpOyBweC5wdXNoKHBpWzBdKTsNCiAgICBweS5zaGlmdCgpOyBweS5wdXNoKHBpWzFdKTsNCiAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7DQogIH0NCiAgcmV0dXJuIHBhdGguam9pbigiIik7DQp9DQoNCmZ1bmN0aW9uIGQzX3N2Z19saW5lQnVuZGxlKHBvaW50cywgdGVuc2lvbikgew0KICB2YXIgbiA9IHBvaW50cy5sZW5ndGggLSAxLA0KICAgICAgeDAgPSBwb2ludHNbMF1bMF0sDQogICAgICB5MCA9IHBvaW50c1swXVsxXSwNCiAgICAgIGR4ID0gcG9pbnRzW25dWzBdIC0geDAsDQogICAgICBkeSA9IHBvaW50c1tuXVsxXSAtIHkwLA0KICAgICAgaSA9IC0xLA0KICAgICAgcCwNCiAgICAgIHQ7DQogIHdoaWxlICgrK2kgPD0gbikgew0KICAgIHAgPSBwb2ludHNbaV07DQogICAgdCA9IGkgLyBuOw0KICAgIHBbMF0gPSB0ZW5zaW9uICogcFswXSArICgxIC0gdGVuc2lvbikgKiAoeDAgKyB0ICogZHgpOw0KICAgIHBbMV0gPSB0ZW5zaW9uICogcFsxXSArICgxIC0gdGVuc2lvbikgKiAoeTAgKyB0ICogZHkpOw0KICB9DQogIHJldHVybiBkM19zdmdfbGluZUJhc2lzKHBvaW50cyk7DQp9DQoNCi8vIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoZSBnaXZlbiBmb3VyLWVsZW1lbnQgdmVjdG9ycy4NCmZ1bmN0aW9uIGQzX3N2Z19saW5lRG90NChhLCBiKSB7DQogIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTsNCn0NCg0KLy8gTWF0cml4IHRvIHRyYW5zZm9ybSBiYXNpcyAoYi1zcGxpbmUpIGNvbnRyb2wgcG9pbnRzIHRvIGJlemllcg0KLy8gY29udHJvbCBwb2ludHMuIERlcml2ZWQgZnJvbSBGdkQgMTEuMi44Lg0KdmFyIGQzX3N2Z19saW5lQmFzaXNCZXppZXIxID0gWzAsIDIvMywgMS8zLCAwXSwNCiAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyMiA9IFswLCAxLzMsIDIvMywgMF0sDQogICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMgPSBbMCwgMS82LCAyLzMsIDEvNl07DQoNCi8vIFB1c2hlcyBhICJDIiBCw6l6aWVyIGN1cnZlIG9udG8gdGhlIHNwZWNpZmllZCBwYXRoIGFycmF5LCBnaXZlbiB0aGUNCi8vIHR3byBzcGVjaWZpZWQgZm91ci1lbGVtZW50IGFycmF5cyB3aGljaCBkZWZpbmUgdGhlIGNvbnRyb2wgcG9pbnRzLg0KZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCB4LCB5KSB7DQogIHBhdGgucHVzaCgNCiAgICAgICJDIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIxLCB4KSwNCiAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIxLCB5KSwNCiAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIyLCB4KSwNCiAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIyLCB5KSwNCiAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCB4KSwNCiAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCB5KSk7DQp9DQoNCi8vIENvbXB1dGVzIHRoZSBzbG9wZSBmcm9tIHBvaW50cyBwMCB0byBwMS4NCmZ1bmN0aW9uIGQzX3N2Z19saW5lU2xvcGUocDAsIHAxKSB7DQogIHJldHVybiAocDFbMV0gLSBwMFsxXSkgLyAocDFbMF0gLSBwMFswXSk7DQp9DQoNCi8vIENvbXB1dGUgdGhyZWUtcG9pbnQgZGlmZmVyZW5jZXMgZm9yIHRoZSBnaXZlbiBwb2ludHMuDQovLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1YmljX0hlcm1pdGVfc3BsaW5lI0Zpbml0ZV9kaWZmZXJlbmNlDQpmdW5jdGlvbiBkM19zdmdfbGluZUZpbml0ZURpZmZlcmVuY2VzKHBvaW50cykgew0KICB2YXIgaSA9IDAsDQogICAgICBqID0gcG9pbnRzLmxlbmd0aCAtIDEsDQogICAgICBtID0gW10sDQogICAgICBwMCA9IHBvaW50c1swXSwNCiAgICAgIHAxID0gcG9pbnRzWzFdLA0KICAgICAgZCA9IG1bMF0gPSBkM19zdmdfbGluZVNsb3BlKHAwLCBwMSk7DQogIHdoaWxlICgrK2kgPCBqKSB7DQogICAgbVtpXSA9IGQgKyAoZCA9IGQzX3N2Z19saW5lU2xvcGUocDAgPSBwMSwgcDEgPSBwb2ludHNbaSArIDFdKSk7DQogIH0NCiAgbVtpXSA9IGQ7DQogIHJldHVybiBtOw0KfQ0KDQovLyBJbnRlcnBvbGF0ZXMgdGhlIGdpdmVuIHBvaW50cyB1c2luZyBGcml0c2NoLUNhcmxzb24gTW9ub3RvbmUgY3ViaWMgSGVybWl0ZQ0KLy8gaW50ZXJwb2xhdGlvbi4gUmV0dXJucyBhbiBhcnJheSBvZiB0YW5nZW50IHZlY3RvcnMuIEZvciBkZXRhaWxzLCBzZWUNCi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9ub3RvbmVfY3ViaWNfaW50ZXJwb2xhdGlvbg0KZnVuY3Rpb24gZDNfc3ZnX2xpbmVNb25vdG9uZVRhbmdlbnRzKHBvaW50cykgew0KICB2YXIgdGFuZ2VudHMgPSBbXSwNCiAgICAgIGQsDQogICAgICBhLA0KICAgICAgYiwNCiAgICAgIHMsDQogICAgICBtID0gZDNfc3ZnX2xpbmVGaW5pdGVEaWZmZXJlbmNlcyhwb2ludHMpLA0KICAgICAgaSA9IC0xLA0KICAgICAgaiA9IHBvaW50cy5sZW5ndGggLSAxOw0KDQogIC8vIFRoZSBmaXJzdCB0d28gc3RlcHMgYXJlIGRvbmUgYnkgY29tcHV0aW5nIGZpbml0ZS1kaWZmZXJlbmNlczoNCiAgLy8gMS4gQ29tcHV0ZSB0aGUgc2xvcGVzIG9mIHRoZSBzZWNhbnQgbGluZXMgYmV0d2VlbiBzdWNjZXNzaXZlIHBvaW50cy4NCiAgLy8gMi4gSW5pdGlhbGl6ZSB0aGUgdGFuZ2VudHMgYXQgZXZlcnkgcG9pbnQgYXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHNlY2FudHMuDQoNCiAgLy8gVGhlbiwgZm9yIGVhY2ggc2VnbWVudOKAPw0KICB3aGlsZSAoKytpIDwgaikgew0KICAgIGQgPSBkM19zdmdfbGluZVNsb3BlKHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSk7DQoNCiAgICAvLyAzLiBJZiB0d28gc3VjY2Vzc2l2ZSB5ayA9IHl7ayArIDF9IGFyZSBlcXVhbCAoaS5lLiwgZCBpcyB6ZXJvKSwgdGhlbiBzZXQNCiAgICAvLyBtayA9IG17ayArIDF9ID0gMCBhcyB0aGUgc3BsaW5lIGNvbm5lY3RpbmcgdGhlc2UgcG9pbnRzIG11c3QgYmUgZmxhdCB0bw0KICAgIC8vIHByZXNlcnZlIG1vbm90b25pY2l0eS4gSWdub3JlIHN0ZXAgNCBhbmQgNSBmb3IgdGhvc2Ugay4NCg0KICAgIGlmIChNYXRoLmFicyhkKSA8IDFlLTYpIHsNCiAgICAgIG1baV0gPSBtW2kgKyAxXSA9IDA7DQogICAgfSBlbHNlIHsNCiAgICAgIC8vIDQuIExldCBhayA9IG1rIC8gZGsgYW5kIGJrID0gbXtrICsgMX0gLyBkay4NCiAgICAgIGEgPSBtW2ldIC8gZDsNCiAgICAgIGIgPSBtW2kgKyAxXSAvIGQ7DQoNCiAgICAgIC8vIDUuIFByZXZlbnQgb3ZlcnNob290IGFuZCBlbnN1cmUgbW9ub3RvbmljaXR5IGJ5IHJlc3RyaWN0aW5nIHRoZQ0KICAgICAgLy8gbWFnbml0dWRlIG9mIHZlY3RvciA8YWssIGJrPiB0byBhIGNpcmNsZSBvZiByYWRpdXMgMy4NCiAgICAgIHMgPSBhICogYSArIGIgKiBiOw0KICAgICAgaWYgKHMgPiA5KSB7DQogICAgICAgIHMgPSBkICogMyAvIE1hdGguc3FydChzKTsNCiAgICAgICAgbVtpXSA9IHMgKiBhOw0KICAgICAgICBtW2kgKyAxXSA9IHMgKiBiOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIENvbXB1dGUgdGhlIG5vcm1hbGl6ZWQgdGFuZ2VudCB2ZWN0b3IgZnJvbSB0aGUgc2xvcGVzLiBOb3RlIHRoYXQgaWYgeCBpcw0KICAvLyBub3QgbW9ub3RvbmljLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNsb3BlIHdpbGwgYmUgaW5maW5pdGUsIHNvIHdlIHByb3RlY3QNCiAgLy8gYWdhaW5zdCBOYU4gYnkgc2V0dGluZyB0aGUgY29vcmRpbmF0ZSB0byB6ZXJvLg0KICBpID0gLTE7IHdoaWxlICgrK2kgPD0gaikgew0KICAgIHMgPSAocG9pbnRzW01hdGgubWluKGosIGkgKyAxKV1bMF0gLSBwb2ludHNbTWF0aC5tYXgoMCwgaSAtIDEpXVswXSkNCiAgICAgIC8gKDYgKiAoMSArIG1baV0gKiBtW2ldKSk7DQogICAgdGFuZ2VudHMucHVzaChbcyB8fCAwLCBtW2ldICogcyB8fCAwXSk7DQogIH0NCg0KICByZXR1cm4gdGFuZ2VudHM7DQp9DQoNCmZ1bmN0aW9uIGQzX3N2Z19saW5lTW9ub3RvbmUocG9pbnRzKSB7DQogIHJldHVybiBwb2ludHMubGVuZ3RoIDwgMw0KICAgICAgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpDQogICAgICA6IHBvaW50c1swXSArDQogICAgICAgIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsIGQzX3N2Z19saW5lTW9ub3RvbmVUYW5nZW50cyhwb2ludHMpKTsNCn0NCmQzLnN2Zy5saW5lLnJhZGlhbCA9IGZ1bmN0aW9uKCkgew0KICB2YXIgbGluZSA9IGQzX3N2Z19saW5lKGQzX3N2Z19saW5lUmFkaWFsKTsNCiAgbGluZS5yYWRpdXMgPSBsaW5lLngsIGRlbGV0ZSBsaW5lLng7DQogIGxpbmUuYW5nbGUgPSBsaW5lLnksIGRlbGV0ZSBsaW5lLnk7DQogIHJldHVybiBsaW5lOw0KfTsNCg0KZnVuY3Rpb24gZDNfc3ZnX2xpbmVSYWRpYWwocG9pbnRzKSB7DQogIHZhciBwb2ludCwNCiAgICAgIGkgPSAtMSwNCiAgICAgIG4gPSBwb2ludHMubGVuZ3RoLA0KICAgICAgciwNCiAgICAgIGE7DQogIHdoaWxlICgrK2kgPCBuKSB7DQogICAgcG9pbnQgPSBwb2ludHNbaV07DQogICAgciA9IHBvaW50WzBdOw0KICAgIGEgPSBwb2ludFsxXSArIGQzX3N2Z19hcmNPZmZzZXQ7DQogICAgcG9pbnRbMF0gPSByICogTWF0aC5jb3MoYSk7DQogICAgcG9pbnRbMV0gPSByICogTWF0aC5zaW4oYSk7DQogIH0NCiAgcmV0dXJuIHBvaW50czsNCn0NCmZ1bmN0aW9uIGQzX3N2Z19hcmVhKHByb2plY3Rpb24pIHsNCiAgdmFyIHgwID0gZDNfc3ZnX2xpbmVYLA0KICAgICAgeDEgPSBkM19zdmdfbGluZVgsDQogICAgICB5MCA9IDAsDQogICAgICB5MSA9IGQzX3N2Z19saW5lWSwNCiAgICAgIGludGVycG9sYXRlLA0KICAgICAgaTAsDQogICAgICBpMSwNCiAgICAgIHRlbnNpb24gPSAuNzsNCg0KICBmdW5jdGlvbiBhcmVhKGQpIHsNCiAgICBpZiAoZC5sZW5ndGggPCAxKSByZXR1cm4gbnVsbDsNCiAgICB2YXIgcG9pbnRzMCA9IGQzX3N2Z19saW5lUG9pbnRzKHRoaXMsIGQsIHgwLCB5MCksDQogICAgICAgIHBvaW50czEgPSBkM19zdmdfbGluZVBvaW50cyh0aGlzLCBkLCB4MCA9PT0geDEgPyBkM19zdmdfYXJlYVgocG9pbnRzMCkgOiB4MSwgeTAgPT09IHkxID8gZDNfc3ZnX2FyZWFZKHBvaW50czApIDogeTEpOw0KICAgIHJldHVybiAiTSIgKyBpMChwcm9qZWN0aW9uKHBvaW50czEpLCB0ZW5zaW9uKQ0KICAgICAgICAgKyAiTCIgKyBpMShwcm9qZWN0aW9uKHBvaW50czAucmV2ZXJzZSgpKSwgdGVuc2lvbikNCiAgICAgICAgICsgIloiOw0KICB9DQoNCiAgYXJlYS54ID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxOw0KICAgIHgwID0geDEgPSB4Ow0KICAgIHJldHVybiBhcmVhOw0KICB9Ow0KDQogIGFyZWEueDAgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDA7DQogICAgeDAgPSB4Ow0KICAgIHJldHVybiBhcmVhOw0KICB9Ow0KDQogIGFyZWEueDEgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7DQogICAgeDEgPSB4Ow0KICAgIHJldHVybiBhcmVhOw0KICB9Ow0KDQogIGFyZWEueSA9IGZ1bmN0aW9uKHkpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MTsNCiAgICB5MCA9IHkxID0geTsNCiAgICByZXR1cm4gYXJlYTsNCiAgfTsNCg0KICBhcmVhLnkwID0gZnVuY3Rpb24oeSkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkwOw0KICAgIHkwID0geTsNCiAgICByZXR1cm4gYXJlYTsNCiAgfTsNCg0KICBhcmVhLnkxID0gZnVuY3Rpb24oeSkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxOw0KICAgIHkxID0geTsNCiAgICByZXR1cm4gYXJlYTsNCiAgfTsNCg0KICBhcmVhLmludGVycG9sYXRlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGludGVycG9sYXRlOw0KICAgIGlmICghZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmhhcyh4ICs9ICIiKSkgeCA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9yRGVmYXVsdDsNCiAgICBpMCA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5nZXQoaW50ZXJwb2xhdGUgPSB4KTsNCiAgICBpMSA9IGkwLnJldmVyc2UgfHwgaTA7DQogICAgcmV0dXJuIGFyZWE7DQogIH07DQoNCiAgYXJlYS50ZW5zaW9uID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRlbnNpb247DQogICAgdGVuc2lvbiA9IHg7DQogICAgcmV0dXJuIGFyZWE7DQogIH07DQoNCiAgcmV0dXJuIGFyZWEuaW50ZXJwb2xhdGUoImxpbmVhciIpOw0KfQ0KDQpkM19zdmdfbGluZVN0ZXBCZWZvcmUucmV2ZXJzZSA9IGQzX3N2Z19saW5lU3RlcEFmdGVyOw0KZDNfc3ZnX2xpbmVTdGVwQWZ0ZXIucmV2ZXJzZSA9IGQzX3N2Z19saW5lU3RlcEJlZm9yZTsNCg0KZDMuc3ZnLmFyZWEgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIGQzX3N2Z19hcmVhKE9iamVjdCk7DQp9Ow0KDQpmdW5jdGlvbiBkM19zdmdfYXJlYVgocG9pbnRzKSB7DQogIHJldHVybiBmdW5jdGlvbihkLCBpKSB7DQogICAgcmV0dXJuIHBvaW50c1tpXVswXTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gZDNfc3ZnX2FyZWFZKHBvaW50cykgew0KICByZXR1cm4gZnVuY3Rpb24oZCwgaSkgew0KICAgIHJldHVybiBwb2ludHNbaV1bMV07DQogIH07DQp9DQpkMy5zdmcuYXJlYS5yYWRpYWwgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGFyZWEgPSBkM19zdmdfYXJlYShkM19zdmdfbGluZVJhZGlhbCk7DQogIGFyZWEucmFkaXVzID0gYXJlYS54LCBkZWxldGUgYXJlYS54Ow0KICBhcmVhLmlubmVyUmFkaXVzID0gYXJlYS54MCwgZGVsZXRlIGFyZWEueDA7DQogIGFyZWEub3V0ZXJSYWRpdXMgPSBhcmVhLngxLCBkZWxldGUgYXJlYS54MTsNCiAgYXJlYS5hbmdsZSA9IGFyZWEueSwgZGVsZXRlIGFyZWEueTsNCiAgYXJlYS5zdGFydEFuZ2xlID0gYXJlYS55MCwgZGVsZXRlIGFyZWEueTA7DQogIGFyZWEuZW5kQW5nbGUgPSBhcmVhLnkxLCBkZWxldGUgYXJlYS55MTsNCiAgcmV0dXJuIGFyZWE7DQp9Ow0KZDMuc3ZnLmNob3JkID0gZnVuY3Rpb24oKSB7DQogIHZhciBzb3VyY2UgPSBkM19zdmdfY2hvcmRTb3VyY2UsDQogICAgICB0YXJnZXQgPSBkM19zdmdfY2hvcmRUYXJnZXQsDQogICAgICByYWRpdXMgPSBkM19zdmdfY2hvcmRSYWRpdXMsDQogICAgICBzdGFydEFuZ2xlID0gZDNfc3ZnX2FyY1N0YXJ0QW5nbGUsDQogICAgICBlbmRBbmdsZSA9IGQzX3N2Z19hcmNFbmRBbmdsZTsNCg0KICAvLyBUT0RPIEFsbG93IGNvbnRyb2wgcG9pbnQgdG8gYmUgY3VzdG9taXplZC4NCg0KICBmdW5jdGlvbiBjaG9yZChkLCBpKSB7DQogICAgdmFyIHMgPSBzdWJncm91cCh0aGlzLCBzb3VyY2UsIGQsIGkpLA0KICAgICAgICB0ID0gc3ViZ3JvdXAodGhpcywgdGFyZ2V0LCBkLCBpKTsNCiAgICByZXR1cm4gIk0iICsgcy5wMA0KICAgICAgKyBhcmMocy5yLCBzLnAxLCBzLmExIC0gcy5hMCkgKyAoZXF1YWxzKHMsIHQpDQogICAgICA/IGN1cnZlKHMuciwgcy5wMSwgcy5yLCBzLnAwKQ0KICAgICAgOiBjdXJ2ZShzLnIsIHMucDEsIHQuciwgdC5wMCkNCiAgICAgICsgYXJjKHQuciwgdC5wMSwgdC5hMSAtIHQuYTApDQogICAgICArIGN1cnZlKHQuciwgdC5wMSwgcy5yLCBzLnAwKSkNCiAgICAgICsgIloiOw0KICB9DQoNCiAgZnVuY3Rpb24gc3ViZ3JvdXAoc2VsZiwgZiwgZCwgaSkgew0KICAgIHZhciBzdWJncm91cCA9IGYuY2FsbChzZWxmLCBkLCBpKSwNCiAgICAgICAgciA9IHJhZGl1cy5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSwNCiAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmNhbGwoc2VsZiwgc3ViZ3JvdXAsIGkpICsgZDNfc3ZnX2FyY09mZnNldCwNCiAgICAgICAgYTEgPSBlbmRBbmdsZS5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSArIGQzX3N2Z19hcmNPZmZzZXQ7DQogICAgcmV0dXJuIHsNCiAgICAgIHI6IHIsDQogICAgICBhMDogYTAsDQogICAgICBhMTogYTEsDQogICAgICBwMDogW3IgKiBNYXRoLmNvcyhhMCksIHIgKiBNYXRoLnNpbihhMCldLA0KICAgICAgcDE6IFtyICogTWF0aC5jb3MoYTEpLCByICogTWF0aC5zaW4oYTEpXQ0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBlcXVhbHMoYSwgYikgew0KICAgIHJldHVybiBhLmEwID09IGIuYTAgJiYgYS5hMSA9PSBiLmExOw0KICB9DQoNCiAgZnVuY3Rpb24gYXJjKHIsIHAsIGEpIHsNCiAgICByZXR1cm4gIkEiICsgciArICIsIiArIHIgKyAiIDAgIiArICsoYSA+IE1hdGguUEkpICsgIiwxICIgKyBwOw0KICB9DQoNCiAgZnVuY3Rpb24gY3VydmUocjAsIHAwLCByMSwgcDEpIHsNCiAgICByZXR1cm4gIlEgMCwwICIgKyBwMTsNCiAgfQ0KDQogIGNob3JkLnJhZGl1cyA9IGZ1bmN0aW9uKHYpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYWRpdXM7DQogICAgcmFkaXVzID0gZDMuZnVuY3Rvcih2KTsNCiAgICByZXR1cm4gY2hvcmQ7DQogIH07DQoNCiAgY2hvcmQuc291cmNlID0gZnVuY3Rpb24odikgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTsNCiAgICBzb3VyY2UgPSBkMy5mdW5jdG9yKHYpOw0KICAgIHJldHVybiBjaG9yZDsNCiAgfTsNCg0KICBjaG9yZC50YXJnZXQgPSBmdW5jdGlvbih2KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0Ow0KICAgIHRhcmdldCA9IGQzLmZ1bmN0b3Iodik7DQogICAgcmV0dXJuIGNob3JkOw0KICB9Ow0KDQogIGNob3JkLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbih2KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc3RhcnRBbmdsZTsNCiAgICBzdGFydEFuZ2xlID0gZDMuZnVuY3Rvcih2KTsNCiAgICByZXR1cm4gY2hvcmQ7DQogIH07DQoNCiAgY2hvcmQuZW5kQW5nbGUgPSBmdW5jdGlvbih2KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZW5kQW5nbGU7DQogICAgZW5kQW5nbGUgPSBkMy5mdW5jdG9yKHYpOw0KICAgIHJldHVybiBjaG9yZDsNCiAgfTsNCg0KICByZXR1cm4gY2hvcmQ7DQp9Ow0KDQpmdW5jdGlvbiBkM19zdmdfY2hvcmRTb3VyY2UoZCkgew0KICByZXR1cm4gZC5zb3VyY2U7DQp9DQoNCmZ1bmN0aW9uIGQzX3N2Z19jaG9yZFRhcmdldChkKSB7DQogIHJldHVybiBkLnRhcmdldDsNCn0NCg0KZnVuY3Rpb24gZDNfc3ZnX2Nob3JkUmFkaXVzKGQpIHsNCiAgcmV0dXJuIGQucmFkaXVzOw0KfQ0KDQpmdW5jdGlvbiBkM19zdmdfY2hvcmRTdGFydEFuZ2xlKGQpIHsNCiAgcmV0dXJuIGQuc3RhcnRBbmdsZTsNCn0NCg0KZnVuY3Rpb24gZDNfc3ZnX2Nob3JkRW5kQW5nbGUoZCkgew0KICByZXR1cm4gZC5lbmRBbmdsZTsNCn0NCmQzLnN2Zy5kaWFnb25hbCA9IGZ1bmN0aW9uKCkgew0KICB2YXIgc291cmNlID0gZDNfc3ZnX2Nob3JkU291cmNlLA0KICAgICAgdGFyZ2V0ID0gZDNfc3ZnX2Nob3JkVGFyZ2V0LA0KICAgICAgcHJvamVjdGlvbiA9IGQzX3N2Z19kaWFnb25hbFByb2plY3Rpb247DQoNCiAgZnVuY3Rpb24gZGlhZ29uYWwoZCwgaSkgew0KICAgIHZhciBwMCA9IHNvdXJjZS5jYWxsKHRoaXMsIGQsIGkpLA0KICAgICAgICBwMyA9IHRhcmdldC5jYWxsKHRoaXMsIGQsIGkpLA0KICAgICAgICBtID0gKHAwLnkgKyBwMy55KSAvIDIsDQogICAgICAgIHAgPSBbcDAsIHt4OiBwMC54LCB5OiBtfSwge3g6IHAzLngsIHk6IG19LCBwM107DQogICAgcCA9IHAubWFwKHByb2plY3Rpb24pOw0KICAgIHJldHVybiAiTSIgKyBwWzBdICsgIkMiICsgcFsxXSArICIgIiArIHBbMl0gKyAiICIgKyBwWzNdOw0KICB9DQoNCiAgZGlhZ29uYWwuc291cmNlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTsNCiAgICBzb3VyY2UgPSBkMy5mdW5jdG9yKHgpOw0KICAgIHJldHVybiBkaWFnb25hbDsNCiAgfTsNCg0KICBkaWFnb25hbC50YXJnZXQgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0Ow0KICAgIHRhcmdldCA9IGQzLmZ1bmN0b3IoeCk7DQogICAgcmV0dXJuIGRpYWdvbmFsOw0KICB9Ow0KDQogIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcHJvamVjdGlvbjsNCiAgICBwcm9qZWN0aW9uID0geDsNCiAgICByZXR1cm4gZGlhZ29uYWw7DQogIH07DQoNCiAgcmV0dXJuIGRpYWdvbmFsOw0KfTsNCg0KZnVuY3Rpb24gZDNfc3ZnX2RpYWdvbmFsUHJvamVjdGlvbihkKSB7DQogIHJldHVybiBbZC54LCBkLnldOw0KfQ0KZDMuc3ZnLmRpYWdvbmFsLnJhZGlhbCA9IGZ1bmN0aW9uKCkgew0KICB2YXIgZGlhZ29uYWwgPSBkMy5zdmcuZGlhZ29uYWwoKSwNCiAgICAgIHByb2plY3Rpb24gPSBkM19zdmdfZGlhZ29uYWxQcm9qZWN0aW9uLA0KICAgICAgcHJvamVjdGlvbl8gPSBkaWFnb25hbC5wcm9qZWN0aW9uOw0KDQogIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgNCiAgICAgICAgPyBwcm9qZWN0aW9uXyhkM19zdmdfZGlhZ29uYWxSYWRpYWxQcm9qZWN0aW9uKHByb2plY3Rpb24gPSB4KSkNCiAgICAgICAgOiBwcm9qZWN0aW9uOw0KICB9Ow0KDQogIHJldHVybiBkaWFnb25hbDsNCn07DQoNCmZ1bmN0aW9uIGQzX3N2Z19kaWFnb25hbFJhZGlhbFByb2plY3Rpb24ocHJvamVjdGlvbikgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIGQgPSBwcm9qZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksDQogICAgICAgIHIgPSBkWzBdLA0KICAgICAgICBhID0gZFsxXSArIGQzX3N2Z19hcmNPZmZzZXQ7DQogICAgcmV0dXJuIFtyICogTWF0aC5jb3MoYSksIHIgKiBNYXRoLnNpbihhKV07DQogIH07DQp9DQpkMy5zdmcubW91c2UgPSBkMy5tb3VzZTsNCmQzLnN2Zy50b3VjaGVzID0gZDMudG91Y2hlczsNCmQzLnN2Zy5zeW1ib2wgPSBmdW5jdGlvbigpIHsNCiAgdmFyIHR5cGUgPSBkM19zdmdfc3ltYm9sVHlwZSwNCiAgICAgIHNpemUgPSBkM19zdmdfc3ltYm9sU2l6ZTsNCg0KICBmdW5jdGlvbiBzeW1ib2woZCwgaSkgew0KICAgIHJldHVybiAoZDNfc3ZnX3N5bWJvbHMuZ2V0KHR5cGUuY2FsbCh0aGlzLCBkLCBpKSkNCiAgICAgICAgfHwgZDNfc3ZnX3N5bWJvbENpcmNsZSkNCiAgICAgICAgKHNpemUuY2FsbCh0aGlzLCBkLCBpKSk7DQogIH0NCg0KICBzeW1ib2wudHlwZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0eXBlOw0KICAgIHR5cGUgPSBkMy5mdW5jdG9yKHgpOw0KICAgIHJldHVybiBzeW1ib2w7DQogIH07DQoNCiAgLy8gc2l6ZSBvZiBzeW1ib2wgaW4gc3F1YXJlIHBpeGVscw0KICBzeW1ib2wuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOw0KICAgIHNpemUgPSBkMy5mdW5jdG9yKHgpOw0KICAgIHJldHVybiBzeW1ib2w7DQogIH07DQoNCiAgcmV0dXJuIHN5bWJvbDsNCn07DQoNCmZ1bmN0aW9uIGQzX3N2Z19zeW1ib2xTaXplKCkgew0KICByZXR1cm4gNjQ7DQp9DQoNCmZ1bmN0aW9uIGQzX3N2Z19zeW1ib2xUeXBlKCkgew0KICByZXR1cm4gImNpcmNsZSI7DQp9DQoNCmZ1bmN0aW9uIGQzX3N2Z19zeW1ib2xDaXJjbGUoc2l6ZSkgew0KICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gTWF0aC5QSSk7DQogIHJldHVybiAiTTAsIiArIHINCiAgICAgICsgIkEiICsgciArICIsIiArIHIgKyAiIDAgMSwxIDAsIiArICgtcikNCiAgICAgICsgIkEiICsgciArICIsIiArIHIgKyAiIDAgMSwxIDAsIiArIHINCiAgICAgICsgIloiOw0KfQ0KDQovLyBUT0RPIGNyb3NzLWRpYWdvbmFsPw0KdmFyIGQzX3N2Z19zeW1ib2xzID0gZDMubWFwKHsNCiAgImNpcmNsZSI6IGQzX3N2Z19zeW1ib2xDaXJjbGUsDQogICJjcm9zcyI6IGZ1bmN0aW9uKHNpemUpIHsNCiAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gNSkgLyAyOw0KICAgIHJldHVybiAiTSIgKyAtMyAqIHIgKyAiLCIgKyAtcg0KICAgICAgICArICJIIiArIC1yDQogICAgICAgICsgIlYiICsgLTMgKiByDQogICAgICAgICsgIkgiICsgcg0KICAgICAgICArICJWIiArIC1yDQogICAgICAgICsgIkgiICsgMyAqIHINCiAgICAgICAgKyAiViIgKyByDQogICAgICAgICsgIkgiICsgcg0KICAgICAgICArICJWIiArIDMgKiByDQogICAgICAgICsgIkgiICsgLXINCiAgICAgICAgKyAiViIgKyByDQogICAgICAgICsgIkgiICsgLTMgKiByDQogICAgICAgICsgIloiOw0KICB9LA0KICAiZGlhbW9uZCI6IGZ1bmN0aW9uKHNpemUpIHsNCiAgICB2YXIgcnkgPSBNYXRoLnNxcnQoc2l6ZSAvICgyICogZDNfc3ZnX3N5bWJvbFRhbjMwKSksDQogICAgICAgIHJ4ID0gcnkgKiBkM19zdmdfc3ltYm9sVGFuMzA7DQogICAgcmV0dXJuICJNMCwiICsgLXJ5DQogICAgICAgICsgIkwiICsgcnggKyAiLDAiDQogICAgICAgICsgIiAwLCIgKyByeQ0KICAgICAgICArICIgIiArIC1yeCArICIsMCINCiAgICAgICAgKyAiWiI7DQogIH0sDQogICJzcXVhcmUiOiBmdW5jdGlvbihzaXplKSB7DQogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSkgLyAyOw0KICAgIHJldHVybiAiTSIgKyAtciArICIsIiArIC1yDQogICAgICAgICsgIkwiICsgciArICIsIiArIC1yDQogICAgICAgICsgIiAiICsgciArICIsIiArIHINCiAgICAgICAgKyAiICIgKyAtciArICIsIiArIHINCiAgICAgICAgKyAiWiI7DQogIH0sDQogICJ0cmlhbmdsZS1kb3duIjogZnVuY3Rpb24oc2l6ZSkgew0KICAgIHZhciByeCA9IE1hdGguc3FydChzaXplIC8gZDNfc3ZnX3N5bWJvbFNxcnQzKSwNCiAgICAgICAgcnkgPSByeCAqIGQzX3N2Z19zeW1ib2xTcXJ0MyAvIDI7DQogICAgcmV0dXJuICJNMCwiICsgcnkNCiAgICAgICAgKyAiTCIgKyByeCArIiwiICsgLXJ5DQogICAgICAgICsgIiAiICsgLXJ4ICsgIiwiICsgLXJ5DQogICAgICAgICsgIloiOw0KICB9LA0KICAidHJpYW5nbGUtdXAiOiBmdW5jdGlvbihzaXplKSB7DQogICAgdmFyIHJ4ID0gTWF0aC5zcXJ0KHNpemUgLyBkM19zdmdfc3ltYm9sU3FydDMpLA0KICAgICAgICByeSA9IHJ4ICogZDNfc3ZnX3N5bWJvbFNxcnQzIC8gMjsNCiAgICByZXR1cm4gIk0wLCIgKyAtcnkNCiAgICAgICAgKyAiTCIgKyByeCArIiwiICsgcnkNCiAgICAgICAgKyAiICIgKyAtcnggKyAiLCIgKyByeQ0KICAgICAgICArICJaIjsNCiAgfQ0KfSk7DQoNCmQzLnN2Zy5zeW1ib2xUeXBlcyA9IGQzX3N2Z19zeW1ib2xzLmtleXMoKTsNCg0KdmFyIGQzX3N2Z19zeW1ib2xTcXJ0MyA9IE1hdGguc3FydCgzKSwNCiAgICBkM19zdmdfc3ltYm9sVGFuMzAgPSBNYXRoLnRhbigzMCAqIE1hdGguUEkgLyAxODApOw0KZDMuc3ZnLmF4aXMgPSBmdW5jdGlvbigpIHsNCiAgdmFyIHNjYWxlID0gZDMuc2NhbGUubGluZWFyKCksDQogICAgICBvcmllbnQgPSAiYm90dG9tIiwNCiAgICAgIHRpY2tNYWpvclNpemUgPSA2LA0KICAgICAgdGlja01pbm9yU2l6ZSA9IDYsDQogICAgICB0aWNrRW5kU2l6ZSA9IDYsDQogICAgICB0aWNrUGFkZGluZyA9IDMsDQogICAgICB0aWNrQXJndW1lbnRzXyA9IFsxMF0sDQogICAgICB0aWNrVmFsdWVzID0gbnVsbCwNCiAgICAgIHRpY2tGb3JtYXRfLA0KICAgICAgdGlja1N1YmRpdmlkZSA9IDA7DQoNCiAgZnVuY3Rpb24gYXhpcyhnKSB7DQogICAgZy5lYWNoKGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGcgPSBkMy5zZWxlY3QodGhpcyk7DQoNCiAgICAgIC8vIFRpY2tzLCBvciBkb21haW4gdmFsdWVzIGZvciBvcmRpbmFsIHNjYWxlcy4NCiAgICAgIHZhciB0aWNrcyA9IHRpY2tWYWx1ZXMgPT0gbnVsbCA/IChzY2FsZS50aWNrcyA/IHNjYWxlLnRpY2tzLmFwcGx5KHNjYWxlLCB0aWNrQXJndW1lbnRzXykgOiBzY2FsZS5kb21haW4oKSkgOiB0aWNrVmFsdWVzLA0KICAgICAgICAgIHRpY2tGb3JtYXQgPSB0aWNrRm9ybWF0XyA9PSBudWxsID8gKHNjYWxlLnRpY2tGb3JtYXQgPyBzY2FsZS50aWNrRm9ybWF0LmFwcGx5KHNjYWxlLCB0aWNrQXJndW1lbnRzXykgOiBTdHJpbmcpIDogdGlja0Zvcm1hdF87DQoNCiAgICAgIC8vIE1pbm9yIHRpY2tzLg0KICAgICAgdmFyIHN1YnRpY2tzID0gZDNfc3ZnX2F4aXNTdWJkaXZpZGUoc2NhbGUsIHRpY2tzLCB0aWNrU3ViZGl2aWRlKSwNCiAgICAgICAgICBzdWJ0aWNrID0gZy5zZWxlY3RBbGwoIi5taW5vciIpLmRhdGEoc3VidGlja3MsIFN0cmluZyksDQogICAgICAgICAgc3VidGlja0VudGVyID0gc3VidGljay5lbnRlcigpLmluc2VydCgibGluZSIsICJnIikuYXR0cigiY2xhc3MiLCAidGljayBtaW5vciIpLnN0eWxlKCJvcGFjaXR5IiwgMWUtNiksDQogICAgICAgICAgc3VidGlja0V4aXQgPSBkMy50cmFuc2l0aW9uKHN1YnRpY2suZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsIDFlLTYpLnJlbW92ZSgpLA0KICAgICAgICAgIHN1YnRpY2tVcGRhdGUgPSBkMy50cmFuc2l0aW9uKHN1YnRpY2spLnN0eWxlKCJvcGFjaXR5IiwgMSk7DQoNCiAgICAgIC8vIE1ham9yIHRpY2tzLg0KICAgICAgdmFyIHRpY2sgPSBnLnNlbGVjdEFsbCgiZyIpLmRhdGEodGlja3MsIFN0cmluZyksDQogICAgICAgICAgdGlja0VudGVyID0gdGljay5lbnRlcigpLmluc2VydCgiZyIsICJwYXRoIikuc3R5bGUoIm9wYWNpdHkiLCAxZS02KSwNCiAgICAgICAgICB0aWNrRXhpdCA9IGQzLnRyYW5zaXRpb24odGljay5leGl0KCkpLnN0eWxlKCJvcGFjaXR5IiwgMWUtNikucmVtb3ZlKCksDQogICAgICAgICAgdGlja1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24odGljaykuc3R5bGUoIm9wYWNpdHkiLCAxKSwNCiAgICAgICAgICB0aWNrVHJhbnNmb3JtOw0KDQogICAgICAvLyBEb21haW4uDQogICAgICB2YXIgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHNjYWxlKSwNCiAgICAgICAgICBwYXRoID0gZy5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFswXSksDQogICAgICAgICAgcGF0aEVudGVyID0gcGF0aC5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwgImRvbWFpbiIpLA0KICAgICAgICAgIHBhdGhVcGRhdGUgPSBkMy50cmFuc2l0aW9uKHBhdGgpOw0KDQogICAgICAvLyBTdGFzaCBhIHNuYXBzaG90IG9mIHRoZSBuZXcgc2NhbGUsIGFuZCByZXRyaWV2ZSB0aGUgb2xkIHNuYXBzaG90Lg0KICAgICAgdmFyIHNjYWxlMSA9IHNjYWxlLmNvcHkoKSwNCiAgICAgICAgICBzY2FsZTAgPSB0aGlzLl9fY2hhcnRfXyB8fCBzY2FsZTE7DQogICAgICB0aGlzLl9fY2hhcnRfXyA9IHNjYWxlMTsNCg0KICAgICAgdGlja0VudGVyLmFwcGVuZCgibGluZSIpLmF0dHIoImNsYXNzIiwgInRpY2siKTsNCiAgICAgIHRpY2tFbnRlci5hcHBlbmQoInRleHQiKTsNCiAgICAgIHRpY2tVcGRhdGUuc2VsZWN0KCJ0ZXh0IikudGV4dCh0aWNrRm9ybWF0KTsNCg0KICAgICAgc3dpdGNoIChvcmllbnQpIHsNCiAgICAgICAgY2FzZSAiYm90dG9tIjogew0KICAgICAgICAgIHRpY2tUcmFuc2Zvcm0gPSBkM19zdmdfYXhpc1g7DQogICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoInkyIiwgdGlja01pbm9yU2l6ZSk7DQogICAgICAgICAgc3VidGlja1VwZGF0ZS5hdHRyKCJ4MiIsIDApLmF0dHIoInkyIiwgdGlja01pbm9yU2l6ZSk7DQogICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgibGluZSIpLmF0dHIoInkyIiwgdGlja01ham9yU2l6ZSk7DQogICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgidGV4dCIpLmF0dHIoInkiLCBNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKTsNCiAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgibGluZSIpLmF0dHIoIngyIiwgMCkuYXR0cigieTIiLCB0aWNrTWFqb3JTaXplKTsNCiAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgidGV4dCIpLmF0dHIoIngiLCAwKS5hdHRyKCJ5IiwgTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykuYXR0cigiZHkiLCAiLjcxZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsICJtaWRkbGUiKTsNCiAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoImQiLCAiTSIgKyByYW5nZVswXSArICIsIiArIHRpY2tFbmRTaXplICsgIlYwSCIgKyByYW5nZVsxXSArICJWIiArIHRpY2tFbmRTaXplKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgICBjYXNlICJ0b3AiOiB7DQogICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGQzX3N2Z19heGlzWDsNCiAgICAgICAgICBzdWJ0aWNrRW50ZXIuYXR0cigieTIiLCAtdGlja01pbm9yU2l6ZSk7DQogICAgICAgICAgc3VidGlja1VwZGF0ZS5hdHRyKCJ4MiIsIDApLmF0dHIoInkyIiwgLXRpY2tNaW5vclNpemUpOw0KICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoImxpbmUiKS5hdHRyKCJ5MiIsIC10aWNrTWFqb3JTaXplKTsNCiAgICAgICAgICB0aWNrRW50ZXIuc2VsZWN0KCJ0ZXh0IikuYXR0cigieSIsIC0oTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykpOw0KICAgICAgICAgIHRpY2tVcGRhdGUuc2VsZWN0KCJsaW5lIikuYXR0cigieDIiLCAwKS5hdHRyKCJ5MiIsIC10aWNrTWFqb3JTaXplKTsNCiAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgidGV4dCIpLmF0dHIoIngiLCAwKS5hdHRyKCJ5IiwgLShNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKSkuYXR0cigiZHkiLCAiMGVtIikuYXR0cigidGV4dC1hbmNob3IiLCAibWlkZGxlIik7DQogICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKCJkIiwgIk0iICsgcmFuZ2VbMF0gKyAiLCIgKyAtdGlja0VuZFNpemUgKyAiVjBIIiArIHJhbmdlWzFdICsgIlYiICsgLXRpY2tFbmRTaXplKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgICBjYXNlICJsZWZ0Ijogew0KICAgICAgICAgIHRpY2tUcmFuc2Zvcm0gPSBkM19zdmdfYXhpc1k7DQogICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoIngyIiwgLXRpY2tNaW5vclNpemUpOw0KICAgICAgICAgIHN1YnRpY2tVcGRhdGUuYXR0cigieDIiLCAtdGlja01pbm9yU2l6ZSkuYXR0cigieTIiLCAwKTsNCiAgICAgICAgICB0aWNrRW50ZXIuc2VsZWN0KCJsaW5lIikuYXR0cigieDIiLCAtdGlja01ham9yU2l6ZSk7DQogICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgidGV4dCIpLmF0dHIoIngiLCAtKE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpKTsNCiAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgibGluZSIpLmF0dHIoIngyIiwgLXRpY2tNYWpvclNpemUpLmF0dHIoInkyIiwgMCk7DQogICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IiwgLShNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKSkuYXR0cigieSIsIDApLmF0dHIoImR5IiwgIi4zMmVtIikuYXR0cigidGV4dC1hbmNob3IiLCAiZW5kIik7DQogICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKCJkIiwgIk0iICsgLXRpY2tFbmRTaXplICsgIiwiICsgcmFuZ2VbMF0gKyAiSDBWIiArIHJhbmdlWzFdICsgIkgiICsgLXRpY2tFbmRTaXplKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgICBjYXNlICJyaWdodCI6IHsNCiAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gZDNfc3ZnX2F4aXNZOw0KICAgICAgICAgIHN1YnRpY2tFbnRlci5hdHRyKCJ4MiIsIHRpY2tNaW5vclNpemUpOw0KICAgICAgICAgIHN1YnRpY2tVcGRhdGUuYXR0cigieDIiLCB0aWNrTWlub3JTaXplKS5hdHRyKCJ5MiIsIDApOw0KICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoImxpbmUiKS5hdHRyKCJ4MiIsIHRpY2tNYWpvclNpemUpOw0KICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IiwgTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZyk7DQogICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoImxpbmUiKS5hdHRyKCJ4MiIsIHRpY2tNYWpvclNpemUpLmF0dHIoInkyIiwgMCk7DQogICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IiwgTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykuYXR0cigieSIsIDApLmF0dHIoImR5IiwgIi4zMmVtIikuYXR0cigidGV4dC1hbmNob3IiLCAic3RhcnQiKTsNCiAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoImQiLCAiTSIgKyB0aWNrRW5kU2l6ZSArICIsIiArIHJhbmdlWzBdICsgIkgwViIgKyByYW5nZVsxXSArICJIIiArIHRpY2tFbmRTaXplKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICAvLyBGb3IgcXVhbnRpdGF0aXZlIHNjYWxlczoNCiAgICAgIC8vIC0gZW50ZXIgbmV3IHRpY2tzIGZyb20gdGhlIG9sZCBzY2FsZQ0KICAgICAgLy8gLSBleGl0IG9sZCB0aWNrcyB0byB0aGUgbmV3IHNjYWxlDQogICAgICBpZiAoc2NhbGUudGlja3MpIHsNCiAgICAgICAgdGlja0VudGVyLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUwKTsNCiAgICAgICAgdGlja1VwZGF0ZS5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7DQogICAgICAgIHRpY2tFeGl0LmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsNCiAgICAgICAgc3VidGlja0VudGVyLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUwKTsNCiAgICAgICAgc3VidGlja1VwZGF0ZS5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7DQogICAgICAgIHN1YnRpY2tFeGl0LmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsNCiAgICAgIH0NCg0KICAgICAgLy8gRm9yIG9yZGluYWwgc2NhbGVzOg0KICAgICAgLy8gLSBhbnkgZW50ZXJpbmcgdGlja3MgYXJlIHVuZGVmaW5lZCBpbiB0aGUgb2xkIHNjYWxlDQogICAgICAvLyAtIGFueSBleGl0aW5nIHRpY2tzIGFyZSB1bmRlZmluZWQgaW4gdGhlIG5ldyBzY2FsZQ0KICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBvbmx5IG5lZWQgdG8gdHJhbnNpdGlvbiB1cGRhdGluZyB0aWNrcy4NCiAgICAgIGVsc2Ugew0KICAgICAgICB2YXIgZHggPSBzY2FsZTEucmFuZ2VCYW5kKCkgLyAyLCB4ID0gZnVuY3Rpb24oZCkgeyByZXR1cm4gc2NhbGUxKGQpICsgZHg7IH07DQogICAgICAgIHRpY2tFbnRlci5jYWxsKHRpY2tUcmFuc2Zvcm0sIHgpOw0KICAgICAgICB0aWNrVXBkYXRlLmNhbGwodGlja1RyYW5zZm9ybSwgeCk7DQogICAgICB9DQogICAgfSk7DQogIH0NCg0KICBheGlzLnNjYWxlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOw0KICAgIHNjYWxlID0geDsNCiAgICByZXR1cm4gYXhpczsNCiAgfTsNCg0KICBheGlzLm9yaWVudCA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmllbnQ7DQogICAgb3JpZW50ID0geDsNCiAgICByZXR1cm4gYXhpczsNCiAgfTsNCg0KICBheGlzLnRpY2tzID0gZnVuY3Rpb24oKSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja0FyZ3VtZW50c187DQogICAgdGlja0FyZ3VtZW50c18gPSBhcmd1bWVudHM7DQogICAgcmV0dXJuIGF4aXM7DQogIH07DQoNCiAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tWYWx1ZXM7DQogICAgdGlja1ZhbHVlcyA9IHg7DQogICAgcmV0dXJuIGF4aXM7DQogIH07DQoNCiAgYXhpcy50aWNrRm9ybWF0ID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tGb3JtYXRfOw0KICAgIHRpY2tGb3JtYXRfID0geDsNCiAgICByZXR1cm4gYXhpczsNCiAgfTsNCg0KICBheGlzLnRpY2tTaXplID0gZnVuY3Rpb24oeCwgeSwgeikgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tNYWpvclNpemU7DQogICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsNCiAgICB0aWNrTWFqb3JTaXplID0gK3g7DQogICAgdGlja01pbm9yU2l6ZSA9IG4gPiAxID8gK3kgOiB0aWNrTWFqb3JTaXplOw0KICAgIHRpY2tFbmRTaXplID0gbiA+IDAgPyArYXJndW1lbnRzW25dIDogdGlja01ham9yU2l6ZTsNCiAgICByZXR1cm4gYXhpczsNCiAgfTsNCg0KICBheGlzLnRpY2tQYWRkaW5nID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tQYWRkaW5nOw0KICAgIHRpY2tQYWRkaW5nID0gK3g7DQogICAgcmV0dXJuIGF4aXM7DQogIH07DQoNCiAgYXhpcy50aWNrU3ViZGl2aWRlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tTdWJkaXZpZGU7DQogICAgdGlja1N1YmRpdmlkZSA9ICt4Ow0KICAgIHJldHVybiBheGlzOw0KICB9Ow0KDQogIHJldHVybiBheGlzOw0KfTsNCg0KZnVuY3Rpb24gZDNfc3ZnX2F4aXNYKHNlbGVjdGlvbiwgeCkgew0KICBzZWxlY3Rpb24uYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInRyYW5zbGF0ZSgiICsgeChkKSArICIsMCkiOyB9KTsNCn0NCg0KZnVuY3Rpb24gZDNfc3ZnX2F4aXNZKHNlbGVjdGlvbiwgeSkgew0KICBzZWxlY3Rpb24uYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInRyYW5zbGF0ZSgwLCIgKyB5KGQpICsgIikiOyB9KTsNCn0NCg0KZnVuY3Rpb24gZDNfc3ZnX2F4aXNTdWJkaXZpZGUoc2NhbGUsIHRpY2tzLCBtKSB7DQogIHN1YnRpY2tzID0gW107DQogIGlmIChtICYmIHRpY2tzLmxlbmd0aCA+IDEpIHsNCiAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoc2NhbGUuZG9tYWluKCkpLA0KICAgICAgICBzdWJ0aWNrcywNCiAgICAgICAgaSA9IC0xLA0KICAgICAgICBuID0gdGlja3MubGVuZ3RoLA0KICAgICAgICBkID0gKHRpY2tzWzFdIC0gdGlja3NbMF0pIC8gKyttLA0KICAgICAgICBqLA0KICAgICAgICB2Ow0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBmb3IgKGogPSBtOyAtLWogPiAwOykgew0KICAgICAgICBpZiAoKHYgPSArdGlja3NbaV0gLSBqICogZCkgPj0gZXh0ZW50WzBdKSB7DQogICAgICAgICAgc3VidGlja3MucHVzaCh2KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBmb3IgKC0taSwgaiA9IDA7ICsraiA8IG0gJiYgKHYgPSArdGlja3NbaV0gKyBqICogZCkgPCBleHRlbnRbMV07KSB7DQogICAgICBzdWJ0aWNrcy5wdXNoKHYpOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gc3VidGlja3M7DQp9DQpkMy5zdmcuYnJ1c2ggPSBmdW5jdGlvbigpIHsNCiAgdmFyIGV2ZW50ID0gZDNfZXZlbnREaXNwYXRjaChicnVzaCwgImJydXNoc3RhcnQiLCAiYnJ1c2giLCAiYnJ1c2hlbmQiKSwNCiAgICAgIHggPSBudWxsLCAvLyB4LXNjYWxlLCBvcHRpb25hbA0KICAgICAgeSA9IG51bGwsIC8vIHktc2NhbGUsIG9wdGlvbmFsDQogICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1swXSwNCiAgICAgIGV4dGVudCA9IFtbMCwgMF0sIFswLCAwXV0sIC8vIFt4MCwgeTBdLCBbeDEsIHkxXSwgaW4gcGl4ZWxzIChpbnRlZ2VycykNCiAgICAgIGV4dGVudERvbWFpbjsgLy8gdGhlIGV4dGVudCBpbiBkYXRhIHNwYWNlLCBsYXppbHkgY3JlYXRlZA0KDQogIGZ1bmN0aW9uIGJydXNoKGcpIHsNCiAgICBnLmVhY2goZnVuY3Rpb24oKSB7DQogICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKSwNCiAgICAgICAgICBiZyA9IGcuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpLmRhdGEoWzBdKSwNCiAgICAgICAgICBmZyA9IGcuc2VsZWN0QWxsKCIuZXh0ZW50IikuZGF0YShbMF0pLA0KICAgICAgICAgIHR6ID0gZy5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKHJlc2l6ZXMsIFN0cmluZyksDQogICAgICAgICAgZTsNCg0KICAgICAgLy8gUHJlcGFyZSB0aGUgYnJ1c2ggY29udGFpbmVyIGZvciBldmVudHMuDQogICAgICBnDQogICAgICAgICAgLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKQ0KICAgICAgICAgIC5vbigibW91c2Vkb3duLmJydXNoIiwgYnJ1c2hzdGFydCkNCiAgICAgICAgICAub24oInRvdWNoc3RhcnQuYnJ1c2giLCBicnVzaHN0YXJ0KTsNCg0KICAgICAgLy8gQW4gaW52aXNpYmxlLCBtb3VzZWFibGUgYXJlYSBmb3Igc3RhcnRpbmcgYSBuZXcgYnJ1c2guDQogICAgICBiZy5lbnRlcigpLmFwcGVuZCgicmVjdCIpDQogICAgICAgICAgLmF0dHIoImNsYXNzIiwgImJhY2tncm91bmQiKQ0KICAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKQ0KICAgICAgICAgIC5zdHlsZSgiY3Vyc29yIiwgImNyb3NzaGFpciIpOw0KDQogICAgICAvLyBUaGUgdmlzaWJsZSBicnVzaCBleHRlbnQ7IHN0eWxlIHRoaXMgYXMgeW91IGxpa2UhDQogICAgICBmZy5lbnRlcigpLmFwcGVuZCgicmVjdCIpDQogICAgICAgICAgLmF0dHIoImNsYXNzIiwgImV4dGVudCIpDQogICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCAibW92ZSIpOw0KDQogICAgICAvLyBNb3JlIGludmlzaWJsZSByZWN0cyBmb3IgcmVzaXppbmcgdGhlIGV4dGVudC4NCiAgICAgIHR6LmVudGVyKCkuYXBwZW5kKCJnIikNCiAgICAgICAgICAuYXR0cigiY2xhc3MiLCBmdW5jdGlvbihkKSB7IHJldHVybiAicmVzaXplICIgKyBkOyB9KQ0KICAgICAgICAgIC5zdHlsZSgiY3Vyc29yIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfc3ZnX2JydXNoQ3Vyc29yW2RdOyB9KQ0KICAgICAgICAuYXBwZW5kKCJyZWN0IikNCiAgICAgICAgICAuYXR0cigieCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9bZXddJC8udGVzdChkKSA/IC0zIDogbnVsbDsgfSkNCiAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9eW25zXS8udGVzdChkKSA/IC0zIDogbnVsbDsgfSkNCiAgICAgICAgICAuYXR0cigid2lkdGgiLCA2KQ0KICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCA2KQ0KICAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsNCg0KICAgICAgLy8gU2hvdyBvciBoaWRlIHRoZSByZXNpemVycy4NCiAgICAgIHR6LnN0eWxlKCJkaXNwbGF5IiwgYnJ1c2guZW1wdHkoKSA/ICJub25lIiA6IG51bGwpOw0KDQogICAgICAvLyBSZW1vdmUgYW55IHN1cGVyZmx1b3VzIHJlc2l6ZXJzLg0KICAgICAgdHouZXhpdCgpLnJlbW92ZSgpOw0KDQogICAgICAvLyBJbml0aWFsaXplIHRoZSBiYWNrZ3JvdW5kIHRvIGZpbGwgdGhlIGRlZmluZWQgcmFuZ2UuDQogICAgICAvLyBJZiB0aGUgcmFuZ2UgaXNuJ3QgZGVmaW5lZCwgeW91IGNhbiBwb3N0LXByb2Nlc3MuDQogICAgICBpZiAoeCkgew0KICAgICAgICBlID0gZDNfc2NhbGVSYW5nZSh4KTsNCiAgICAgICAgYmcuYXR0cigieCIsIGVbMF0pLmF0dHIoIndpZHRoIiwgZVsxXSAtIGVbMF0pOw0KICAgICAgICByZWRyYXdYKGcpOw0KICAgICAgfQ0KICAgICAgaWYgKHkpIHsNCiAgICAgICAgZSA9IGQzX3NjYWxlUmFuZ2UoeSk7DQogICAgICAgIGJnLmF0dHIoInkiLCBlWzBdKS5hdHRyKCJoZWlnaHQiLCBlWzFdIC0gZVswXSk7DQogICAgICAgIHJlZHJhd1koZyk7DQogICAgICB9DQogICAgICByZWRyYXcoZyk7DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiByZWRyYXcoZykgew0KICAgIGcuc2VsZWN0QWxsKCIucmVzaXplIikuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgew0KICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIGV4dGVudFsrL2UkLy50ZXN0KGQpXVswXSArICIsIiArIGV4dGVudFsrL15zLy50ZXN0KGQpXVsxXSArICIpIjsNCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHJlZHJhd1goZykgew0KICAgIGcuc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieCIsIGV4dGVudFswXVswXSk7DQogICAgZy5zZWxlY3RBbGwoIi5leHRlbnQsLm4+cmVjdCwucz5yZWN0IikuYXR0cigid2lkdGgiLCBleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0pOw0KICB9DQoNCiAgZnVuY3Rpb24gcmVkcmF3WShnKSB7DQogICAgZy5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IiwgZXh0ZW50WzBdWzFdKTsNCiAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLCBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0pOw0KICB9DQoNCiAgZnVuY3Rpb24gYnJ1c2hzdGFydCgpIHsNCiAgICB2YXIgdGFyZ2V0ID0gdGhpcywNCiAgICAgICAgZXZlbnRUYXJnZXQgPSBkMy5zZWxlY3QoZDMuZXZlbnQudGFyZ2V0KSwNCiAgICAgICAgZXZlbnRfID0gZXZlbnQub2YodGFyZ2V0LCBhcmd1bWVudHMpLA0KICAgICAgICBnID0gZDMuc2VsZWN0KHRhcmdldCksDQogICAgICAgIHJlc2l6aW5nID0gZXZlbnRUYXJnZXQuZGF0dW0oKSwNCiAgICAgICAgcmVzaXppbmdYID0gIS9eKG58cykkLy50ZXN0KHJlc2l6aW5nKSAmJiB4LA0KICAgICAgICByZXNpemluZ1kgPSAhL14oZXx3KSQvLnRlc3QocmVzaXppbmcpICYmIHksDQogICAgICAgIGRyYWdnaW5nID0gZXZlbnRUYXJnZXQuY2xhc3NlZCgiZXh0ZW50IiksDQogICAgICAgIGNlbnRlciwNCiAgICAgICAgb3JpZ2luID0gbW91c2UoKSwNCiAgICAgICAgb2Zmc2V0Ow0KDQogICAgdmFyIHcgPSBkMy5zZWxlY3Qod2luZG93KQ0KICAgICAgICAub24oIm1vdXNlbW92ZS5icnVzaCIsIGJydXNobW92ZSkNCiAgICAgICAgLm9uKCJtb3VzZXVwLmJydXNoIiwgYnJ1c2hlbmQpDQogICAgICAgIC5vbigidG91Y2htb3ZlLmJydXNoIiwgYnJ1c2htb3ZlKQ0KICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIiwgYnJ1c2hlbmQpDQogICAgICAgIC5vbigia2V5ZG93bi5icnVzaCIsIGtleWRvd24pDQogICAgICAgIC5vbigia2V5dXAuYnJ1c2giLCBrZXl1cCk7DQoNCiAgICAvLyBJZiB0aGUgZXh0ZW50IHdhcyBjbGlja2VkIG9uLCBkcmFnIHJhdGhlciB0aGFuIGJydXNoOw0KICAgIC8vIHN0b3JlIHRoZSBwb2ludCBiZXR3ZWVuIHRoZSBtb3VzZSBhbmQgZXh0ZW50IG9yaWdpbiBpbnN0ZWFkLg0KICAgIGlmIChkcmFnZ2luZykgew0KICAgICAgb3JpZ2luWzBdID0gZXh0ZW50WzBdWzBdIC0gb3JpZ2luWzBdOw0KICAgICAgb3JpZ2luWzFdID0gZXh0ZW50WzBdWzFdIC0gb3JpZ2luWzFdOw0KICAgIH0NCg0KICAgIC8vIElmIGEgcmVzaXplciB3YXMgY2xpY2tlZCBvbiwgcmVjb3JkIHdoaWNoIHNpZGUgaXMgdG8gYmUgcmVzaXplZC4NCiAgICAvLyBBbHNvLCBzZXQgdGhlIG9yaWdpbiB0byB0aGUgb3Bwb3NpdGUgc2lkZS4NCiAgICBlbHNlIGlmIChyZXNpemluZykgew0KICAgICAgdmFyIGV4ID0gKy93JC8udGVzdChyZXNpemluZyksDQogICAgICAgICAgZXkgPSArL15uLy50ZXN0KHJlc2l6aW5nKTsNCiAgICAgIG9mZnNldCA9IFtleHRlbnRbMSAtIGV4XVswXSAtIG9yaWdpblswXSwgZXh0ZW50WzEgLSBleV1bMV0gLSBvcmlnaW5bMV1dOw0KICAgICAgb3JpZ2luWzBdID0gZXh0ZW50W2V4XVswXTsNCiAgICAgIG9yaWdpblsxXSA9IGV4dGVudFtleV1bMV07DQogICAgfQ0KDQogICAgLy8gSWYgdGhlIEFMVCBrZXkgaXMgZG93biB3aGVuIHN0YXJ0aW5nIGEgYnJ1c2gsIHRoZSBjZW50ZXIgaXMgYXQgdGhlIG1vdXNlLg0KICAgIGVsc2UgaWYgKGQzLmV2ZW50LmFsdEtleSkgY2VudGVyID0gb3JpZ2luLnNsaWNlKCk7DQoNCiAgICAvLyBQcm9wYWdhdGUgdGhlIGFjdGl2ZSBjdXJzb3IgdG8gdGhlIGJvZHkgZm9yIHRoZSBkcmFnIGR1cmF0aW9uLg0KICAgIGcuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgIm5vbmUiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsIG51bGwpOw0KICAgIGQzLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLCBldmVudFRhcmdldC5zdHlsZSgiY3Vyc29yIikpOw0KDQogICAgLy8gTm90aWZ5IGxpc3RlbmVycy4NCiAgICBldmVudF8oe3R5cGU6ICJicnVzaHN0YXJ0In0pOw0KICAgIGJydXNobW92ZSgpOw0KICAgIGQzX2V2ZW50Q2FuY2VsKCk7DQoNCiAgICBmdW5jdGlvbiBtb3VzZSgpIHsNCiAgICAgIHZhciB0b3VjaGVzID0gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXM7DQogICAgICByZXR1cm4gdG91Y2hlcyA/IGQzLnRvdWNoZXModGFyZ2V0LCB0b3VjaGVzKVswXSA6IGQzLm1vdXNlKHRhcmdldCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24ga2V5ZG93bigpIHsNCiAgICAgIGlmIChkMy5ldmVudC5rZXlDb2RlID09IDMyKSB7DQogICAgICAgIGlmICghZHJhZ2dpbmcpIHsNCiAgICAgICAgICBjZW50ZXIgPSBudWxsOw0KICAgICAgICAgIG9yaWdpblswXSAtPSBleHRlbnRbMV1bMF07DQogICAgICAgICAgb3JpZ2luWzFdIC09IGV4dGVudFsxXVsxXTsNCiAgICAgICAgICBkcmFnZ2luZyA9IDI7DQogICAgICAgIH0NCiAgICAgICAgZDNfZXZlbnRDYW5jZWwoKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBrZXl1cCgpIHsNCiAgICAgIGlmIChkMy5ldmVudC5rZXlDb2RlID09IDMyICYmIGRyYWdnaW5nID09IDIpIHsNCiAgICAgICAgb3JpZ2luWzBdICs9IGV4dGVudFsxXVswXTsNCiAgICAgICAgb3JpZ2luWzFdICs9IGV4dGVudFsxXVsxXTsNCiAgICAgICAgZHJhZ2dpbmcgPSAwOw0KICAgICAgICBkM19ldmVudENhbmNlbCgpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJydXNobW92ZSgpIHsNCiAgICAgIHZhciBwb2ludCA9IG1vdXNlKCksDQogICAgICAgICAgbW92ZWQgPSBmYWxzZTsNCg0KICAgICAgLy8gUHJlc2VydmUgdGhlIG9mZnNldCBmb3IgdGhpY2sgcmVzaXplcnMuDQogICAgICBpZiAob2Zmc2V0KSB7DQogICAgICAgIHBvaW50WzBdICs9IG9mZnNldFswXTsNCiAgICAgICAgcG9pbnRbMV0gKz0gb2Zmc2V0WzFdOw0KICAgICAgfQ0KDQogICAgICBpZiAoIWRyYWdnaW5nKSB7DQoNCiAgICAgICAgLy8gSWYgbmVlZGVkLCBkZXRlcm1pbmUgdGhlIGNlbnRlciBmcm9tIHRoZSBjdXJyZW50IGV4dGVudC4NCiAgICAgICAgaWYgKGQzLmV2ZW50LmFsdEtleSkgew0KICAgICAgICAgIGlmICghY2VudGVyKSBjZW50ZXIgPSBbKGV4dGVudFswXVswXSArIGV4dGVudFsxXVswXSkgLyAyLCAoZXh0ZW50WzBdWzFdICsgZXh0ZW50WzFdWzFdKSAvIDJdOw0KDQogICAgICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW4sIGZvciB3aGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLg0KICAgICAgICAgIG9yaWdpblswXSA9IGV4dGVudFsrKHBvaW50WzBdIDwgY2VudGVyWzBdKV1bMF07DQogICAgICAgICAgb3JpZ2luWzFdID0gZXh0ZW50WysocG9pbnRbMV0gPCBjZW50ZXJbMV0pXVsxXTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFdoZW4gdGhlIEFMVCBrZXkgaXMgcmVsZWFzZWQsIHdlIGNsZWFyIHRoZSBjZW50ZXIuDQogICAgICAgIGVsc2UgY2VudGVyID0gbnVsbDsNCiAgICAgIH0NCg0KICAgICAgLy8gVXBkYXRlIHRoZSBicnVzaCBleHRlbnQgZm9yIGVhY2ggZGltZW5zaW9uLg0KICAgICAgaWYgKHJlc2l6aW5nWCAmJiBtb3ZlMShwb2ludCwgeCwgMCkpIHsNCiAgICAgICAgcmVkcmF3WChnKTsNCiAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgfQ0KICAgICAgaWYgKHJlc2l6aW5nWSAmJiBtb3ZlMShwb2ludCwgeSwgMSkpIHsNCiAgICAgICAgcmVkcmF3WShnKTsNCiAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgfQ0KDQogICAgICAvLyBGaW5hbCByZWRyYXcgYW5kIG5vdGlmeSBsaXN0ZW5lcnMuDQogICAgICBpZiAobW92ZWQpIHsNCiAgICAgICAgcmVkcmF3KGcpOw0KICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaCIsIG1vZGU6IGRyYWdnaW5nID8gIm1vdmUiIDogInJlc2l6ZSJ9KTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBtb3ZlMShwb2ludCwgc2NhbGUsIGkpIHsNCiAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUpLA0KICAgICAgICAgIHIwID0gcmFuZ2VbMF0sDQogICAgICAgICAgcjEgPSByYW5nZVsxXSwNCiAgICAgICAgICBwb3NpdGlvbiA9IG9yaWdpbltpXSwNCiAgICAgICAgICBzaXplID0gZXh0ZW50WzFdW2ldIC0gZXh0ZW50WzBdW2ldLA0KICAgICAgICAgIG1pbiwNCiAgICAgICAgICBtYXg7DQoNCiAgICAgIC8vIFdoZW4gZHJhZ2dpbmcsIHJlZHVjZSB0aGUgcmFuZ2UgYnkgdGhlIGV4dGVudCBzaXplIGFuZCBwb3NpdGlvbi4NCiAgICAgIGlmIChkcmFnZ2luZykgew0KICAgICAgICByMCAtPSBwb3NpdGlvbjsNCiAgICAgICAgcjEgLT0gc2l6ZSArIHBvc2l0aW9uOw0KICAgICAgfQ0KDQogICAgICAvLyBDbGFtcCB0aGUgcG9pbnQgc28gdGhhdCB0aGUgZXh0ZW50IGZpdHMgd2l0aGluIHRoZSByYW5nZSBleHRlbnQuDQogICAgICBtaW4gPSBNYXRoLm1heChyMCwgTWF0aC5taW4ocjEsIHBvaW50W2ldKSk7DQoNCiAgICAgIC8vIENvbXB1dGUgdGhlIG5ldyBleHRlbnQgYm91bmRzLg0KICAgICAgaWYgKGRyYWdnaW5nKSB7DQogICAgICAgIG1heCA9IChtaW4gKz0gcG9zaXRpb24pICsgc2l6ZTsNCiAgICAgIH0gZWxzZSB7DQoNCiAgICAgICAgLy8gSWYgdGhlIEFMVCBrZXkgaXMgcHJlc3NlZCwgdGhlbiBwcmVzZXJ2ZSB0aGUgY2VudGVyIG9mIHRoZSBleHRlbnQuDQogICAgICAgIGlmIChjZW50ZXIpIHBvc2l0aW9uID0gTWF0aC5tYXgocjAsIE1hdGgubWluKHIxLCAyICogY2VudGVyW2ldIC0gbWluKSk7DQoNCiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbWluIGFuZCBtYXggb2YgdGhlIHBvc2l0aW9uIGFuZCBwb2ludC4NCiAgICAgICAgaWYgKHBvc2l0aW9uIDwgbWluKSB7DQogICAgICAgICAgbWF4ID0gbWluOw0KICAgICAgICAgIG1pbiA9IHBvc2l0aW9uOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIG1heCA9IHBvc2l0aW9uOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIFVwZGF0ZSB0aGUgc3RvcmVkIGJvdW5kcy4NCiAgICAgIGlmIChleHRlbnRbMF1baV0gIT09IG1pbiB8fCBleHRlbnRbMV1baV0gIT09IG1heCkgew0KICAgICAgICBleHRlbnREb21haW4gPSBudWxsOw0KICAgICAgICBleHRlbnRbMF1baV0gPSBtaW47DQogICAgICAgIGV4dGVudFsxXVtpXSA9IG1heDsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYnJ1c2hlbmQoKSB7DQogICAgICBicnVzaG1vdmUoKTsNCg0KICAgICAgLy8gcmVzZXQgdGhlIGN1cnNvciBzdHlsZXMNCiAgICAgIGcuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IiwgYnJ1c2guZW1wdHkoKSA/ICJub25lIiA6IG51bGwpOw0KICAgICAgZDMuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsIG51bGwpOw0KDQogICAgICB3IC5vbigibW91c2Vtb3ZlLmJydXNoIiwgbnVsbCkNCiAgICAgICAgLm9uKCJtb3VzZXVwLmJydXNoIiwgbnVsbCkNCiAgICAgICAgLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLCBudWxsKQ0KICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIiwgbnVsbCkNCiAgICAgICAgLm9uKCJrZXlkb3duLmJydXNoIiwgbnVsbCkNCiAgICAgICAgLm9uKCJrZXl1cC5icnVzaCIsIG51bGwpOw0KDQogICAgICBldmVudF8oe3R5cGU6ICJicnVzaGVuZCJ9KTsNCiAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7DQogICAgfQ0KICB9DQoNCiAgYnJ1c2gueCA9IGZ1bmN0aW9uKHopIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4Ow0KICAgIHggPSB6Ow0KICAgIHJlc2l6ZXMgPSBkM19zdmdfYnJ1c2hSZXNpemVzWyF4IDw8IDEgfCAheV07IC8vIGZvcmUhDQogICAgcmV0dXJuIGJydXNoOw0KICB9Ow0KDQogIGJydXNoLnkgPSBmdW5jdGlvbih6KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTsNCiAgICB5ID0gejsNCiAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1sheCA8PCAxIHwgIXldOyAvLyBmb3JlIQ0KICAgIHJldHVybiBicnVzaDsNCiAgfTsNCg0KICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbih6KSB7DQogICAgdmFyIHgwLCB4MSwgeTAsIHkxLCB0Ow0KDQogICAgLy8gSW52ZXJ0IHRoZSBwaXhlbCBleHRlbnQgdG8gZGF0YS1zcGFjZS4NCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsNCiAgICAgIHogPSBleHRlbnREb21haW4gfHwgZXh0ZW50Ow0KICAgICAgaWYgKHgpIHsNCiAgICAgICAgeDAgPSB6WzBdWzBdLCB4MSA9IHpbMV1bMF07DQogICAgICAgIGlmICghZXh0ZW50RG9tYWluKSB7DQogICAgICAgICAgeDAgPSBleHRlbnRbMF1bMF0sIHgxID0gZXh0ZW50WzFdWzBdOw0KICAgICAgICAgIGlmICh4LmludmVydCkgeDAgPSB4LmludmVydCh4MCksIHgxID0geC5pbnZlcnQoeDEpOw0KICAgICAgICAgIGlmICh4MSA8IHgwKSB0ID0geDAsIHgwID0geDEsIHgxID0gdDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKHkpIHsNCiAgICAgICAgeTAgPSB6WzBdWzFdLCB5MSA9IHpbMV1bMV07DQogICAgICAgIGlmICghZXh0ZW50RG9tYWluKSB7DQogICAgICAgICAgeTAgPSBleHRlbnRbMF1bMV0sIHkxID0gZXh0ZW50WzFdWzFdOw0KICAgICAgICAgIGlmICh5LmludmVydCkgeTAgPSB5LmludmVydCh5MCksIHkxID0geS5pbnZlcnQoeTEpOw0KICAgICAgICAgIGlmICh5MSA8IHkwKSB0ID0geTAsIHkwID0geTEsIHkxID0gdDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHggJiYgeSA/IFtbeDAsIHkwXSwgW3gxLCB5MV1dIDogeCA/IFt4MCwgeDFdIDogeSAmJiBbeTAsIHkxXTsNCiAgICB9DQoNCiAgICAvLyBTY2FsZSB0aGUgZGF0YS1zcGFjZSBleHRlbnQgdG8gcGl4ZWxzLg0KICAgIGV4dGVudERvbWFpbiA9IFtbMCwgMF0sIFswLCAwXV07DQogICAgaWYgKHgpIHsNCiAgICAgIHgwID0gelswXSwgeDEgPSB6WzFdOw0KICAgICAgaWYgKHkpIHgwID0geDBbMF0sIHgxID0geDFbMF07DQogICAgICBleHRlbnREb21haW5bMF1bMF0gPSB4MCwgZXh0ZW50RG9tYWluWzFdWzBdID0geDE7DQogICAgICBpZiAoeC5pbnZlcnQpIHgwID0geCh4MCksIHgxID0geCh4MSk7DQogICAgICBpZiAoeDEgPCB4MCkgdCA9IHgwLCB4MCA9IHgxLCB4MSA9IHQ7DQogICAgICBleHRlbnRbMF1bMF0gPSB4MCB8IDAsIGV4dGVudFsxXVswXSA9IHgxIHwgMDsNCiAgICB9DQogICAgaWYgKHkpIHsNCiAgICAgIHkwID0gelswXSwgeTEgPSB6WzFdOw0KICAgICAgaWYgKHgpIHkwID0geTBbMV0sIHkxID0geTFbMV07DQogICAgICBleHRlbnREb21haW5bMF1bMV0gPSB5MCwgZXh0ZW50RG9tYWluWzFdWzFdID0geTE7DQogICAgICBpZiAoeS5pbnZlcnQpIHkwID0geSh5MCksIHkxID0geSh5MSk7DQogICAgICBpZiAoeTEgPCB5MCkgdCA9IHkwLCB5MCA9IHkxLCB5MSA9IHQ7DQogICAgICBleHRlbnRbMF1bMV0gPSB5MCB8IDAsIGV4dGVudFsxXVsxXSA9IHkxIHwgMDsNCiAgICB9DQoNCiAgICByZXR1cm4gYnJ1c2g7DQogIH07DQoNCiAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbigpIHsNCiAgICBleHRlbnREb21haW4gPSBudWxsOw0KICAgIGV4dGVudFswXVswXSA9DQogICAgZXh0ZW50WzBdWzFdID0NCiAgICBleHRlbnRbMV1bMF0gPQ0KICAgIGV4dGVudFsxXVsxXSA9IDA7DQogICAgcmV0dXJuIGJydXNoOw0KICB9Ow0KDQogIGJydXNoLmVtcHR5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuICh4ICYmIGV4dGVudFswXVswXSA9PT0gZXh0ZW50WzFdWzBdKQ0KICAgICAgICB8fCAoeSAmJiBleHRlbnRbMF1bMV0gPT09IGV4dGVudFsxXVsxXSk7DQogIH07DQoNCiAgcmV0dXJuIGQzLnJlYmluZChicnVzaCwgZXZlbnQsICJvbiIpOw0KfTsNCg0KdmFyIGQzX3N2Z19icnVzaEN1cnNvciA9IHsNCiAgbjogIm5zLXJlc2l6ZSIsDQogIGU6ICJldy1yZXNpemUiLA0KICBzOiAibnMtcmVzaXplIiwNCiAgdzogImV3LXJlc2l6ZSIsDQogIG53OiAibndzZS1yZXNpemUiLA0KICBuZTogIm5lc3ctcmVzaXplIiwNCiAgc2U6ICJud3NlLXJlc2l6ZSIsDQogIHN3OiAibmVzdy1yZXNpemUiDQp9Ow0KDQp2YXIgZDNfc3ZnX2JydXNoUmVzaXplcyA9IFsNCiAgWyJuIiwgImUiLCAicyIsICJ3IiwgIm53IiwgIm5lIiwgInNlIiwgInN3Il0sDQogIFsiZSIsICJ3Il0sDQogIFsibiIsICJzIl0sDQogIFtdDQpdOw0KZDMuYmVoYXZpb3IgPSB7fTsNCi8vIFRPRE8gVHJhY2sgdG91Y2ggcG9pbnRzIGJ5IGlkZW50aWZpZXIuDQoNCmQzLmJlaGF2aW9yLmRyYWcgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGV2ZW50ID0gZDNfZXZlbnREaXNwYXRjaChkcmFnLCAiZHJhZyIsICJkcmFnc3RhcnQiLCAiZHJhZ2VuZCIpLA0KICAgICAgb3JpZ2luID0gbnVsbDsNCg0KICBmdW5jdGlvbiBkcmFnKCkgew0KICAgIHRoaXMub24oIm1vdXNlZG93bi5kcmFnIiwgbW91c2Vkb3duKQ0KICAgICAgICAub24oInRvdWNoc3RhcnQuZHJhZyIsIG1vdXNlZG93bik7DQogIH0NCg0KICBmdW5jdGlvbiBtb3VzZWRvd24oKSB7DQogICAgdmFyIHRhcmdldCA9IHRoaXMsDQogICAgICAgIGV2ZW50XyA9IGV2ZW50Lm9mKHRhcmdldCwgYXJndW1lbnRzKSwNCiAgICAgICAgZXZlbnRUYXJnZXQgPSBkMy5ldmVudC50YXJnZXQsDQogICAgICAgIG9mZnNldCwNCiAgICAgICAgb3JpZ2luXyA9IHBvaW50KCksDQogICAgICAgIG1vdmVkID0gMDsNCg0KICAgIHZhciB3ID0gZDMuc2VsZWN0KHdpbmRvdykNCiAgICAgICAgLm9uKCJtb3VzZW1vdmUuZHJhZyIsIGRyYWdtb3ZlKQ0KICAgICAgICAub24oInRvdWNobW92ZS5kcmFnIiwgZHJhZ21vdmUpDQogICAgICAgIC5vbigibW91c2V1cC5kcmFnIiwgZHJhZ2VuZCwgdHJ1ZSkNCiAgICAgICAgLm9uKCJ0b3VjaGVuZC5kcmFnIiwgZHJhZ2VuZCwgdHJ1ZSk7DQoNCiAgICBpZiAob3JpZ2luKSB7DQogICAgICBvZmZzZXQgPSBvcmlnaW4uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOw0KICAgICAgb2Zmc2V0ID0gW29mZnNldC54IC0gb3JpZ2luX1swXSwgb2Zmc2V0LnkgLSBvcmlnaW5fWzFdXTsNCiAgICB9IGVsc2Ugew0KICAgICAgb2Zmc2V0ID0gWzAsIDBdOw0KICAgIH0NCg0KICAgIGV2ZW50Xyh7dHlwZTogImRyYWdzdGFydCJ9KTsNCg0KICAgIGZ1bmN0aW9uIHBvaW50KCkgew0KICAgICAgdmFyIHAgPSB0YXJnZXQucGFyZW50Tm9kZSwNCiAgICAgICAgICB0ID0gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXM7DQogICAgICByZXR1cm4gdCA/IGQzLnRvdWNoZXMocCwgdClbMF0gOiBkMy5tb3VzZShwKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmFnbW92ZSgpIHsNCiAgICAgIGlmICghdGFyZ2V0LnBhcmVudE5vZGUpIHJldHVybiBkcmFnZW5kKCk7IC8vIHRhcmdldCByZW1vdmVkIGZyb20gRE9NDQoNCiAgICAgIHZhciBwID0gcG9pbnQoKSwNCiAgICAgICAgICBkeCA9IHBbMF0gLSBvcmlnaW5fWzBdLA0KICAgICAgICAgIGR5ID0gcFsxXSAtIG9yaWdpbl9bMV07DQoNCiAgICAgIG1vdmVkIHw9IGR4IHwgZHk7DQogICAgICBvcmlnaW5fID0gcDsNCiAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7DQoNCiAgICAgIGV2ZW50Xyh7dHlwZTogImRyYWciLCB4OiBwWzBdICsgb2Zmc2V0WzBdLCB5OiBwWzFdICsgb2Zmc2V0WzFdLCBkeDogZHgsIGR5OiBkeX0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYWdlbmQoKSB7DQogICAgICBldmVudF8oe3R5cGU6ICJkcmFnZW5kIn0pOw0KDQogICAgICAvLyBpZiBtb3ZlZCwgcHJldmVudCB0aGUgbW91c2V1cCAoYW5kIHBvc3NpYmx5IGNsaWNrKSBmcm9tIHByb3BhZ2F0aW5nDQogICAgICBpZiAobW92ZWQpIHsNCiAgICAgICAgZDNfZXZlbnRDYW5jZWwoKTsNCiAgICAgICAgaWYgKGQzLmV2ZW50LnRhcmdldCA9PT0gZXZlbnRUYXJnZXQpIHcub24oImNsaWNrLmRyYWciLCBjbGljaywgdHJ1ZSk7DQogICAgICB9DQoNCiAgICAgIHcgLm9uKCJtb3VzZW1vdmUuZHJhZyIsIG51bGwpDQogICAgICAgIC5vbigidG91Y2htb3ZlLmRyYWciLCBudWxsKQ0KICAgICAgICAub24oIm1vdXNldXAuZHJhZyIsIG51bGwpDQogICAgICAgIC5vbigidG91Y2hlbmQuZHJhZyIsIG51bGwpOw0KICAgIH0NCg0KICAgIC8vIHByZXZlbnQgdGhlIHN1YnNlcXVlbnQgY2xpY2sgZnJvbSBwcm9wYWdhdGluZyAoZS5nLiwgZm9yIGFuY2hvcnMpDQogICAgZnVuY3Rpb24gY2xpY2soKSB7DQogICAgICBkM19ldmVudENhbmNlbCgpOw0KICAgICAgdy5vbigiY2xpY2suZHJhZyIsIG51bGwpOw0KICAgIH0NCiAgfQ0KDQogIGRyYWcub3JpZ2luID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWdpbjsNCiAgICBvcmlnaW4gPSB4Ow0KICAgIHJldHVybiBkcmFnOw0KICB9Ow0KDQogIHJldHVybiBkMy5yZWJpbmQoZHJhZywgZXZlbnQsICJvbiIpOw0KfTsNCmQzLmJlaGF2aW9yLnpvb20gPSBmdW5jdGlvbigpIHsNCiAgdmFyIHRyYW5zbGF0ZSA9IFswLCAwXSwNCiAgICAgIHRyYW5zbGF0ZTAsIC8vIHRyYW5zbGF0ZSB3aGVuIHdlIHN0YXJ0ZWQgem9vbWluZyAodG8gYXZvaWQgZHJpZnQpDQogICAgICBzY2FsZSA9IDEsDQogICAgICBzY2FsZTAsIC8vIHNjYWxlIHdoZW4gd2Ugc3RhcnRlZCB0b3VjaGluZw0KICAgICAgc2NhbGVFeHRlbnQgPSBkM19iZWhhdmlvcl96b29tSW5maW5pdHksDQogICAgICBldmVudCA9IGQzX2V2ZW50RGlzcGF0Y2goem9vbSwgInpvb20iKSwNCiAgICAgIHgwLA0KICAgICAgeDEsDQogICAgICB5MCwNCiAgICAgIHkxLA0KICAgICAgdG91Y2h0aW1lOyAvLyB0aW1lIG9mIGxhc3QgdG91Y2hzdGFydCAodG8gZGV0ZWN0IGRvdWJsZS10YXApDQoNCiAgZnVuY3Rpb24gem9vbSgpIHsNCiAgICB0aGlzDQogICAgICAgIC5vbigibW91c2Vkb3duLnpvb20iLCBtb3VzZWRvd24pDQogICAgICAgIC5vbigibW91c2V3aGVlbC56b29tIiwgbW91c2V3aGVlbCkNCiAgICAgICAgLm9uKCJtb3VzZW1vdmUuem9vbSIsIG1vdXNlbW92ZSkNCiAgICAgICAgLm9uKCJET01Nb3VzZVNjcm9sbC56b29tIiwgbW91c2V3aGVlbCkNCiAgICAgICAgLm9uKCJkYmxjbGljay56b29tIiwgZGJsY2xpY2spDQogICAgICAgIC5vbigidG91Y2hzdGFydC56b29tIiwgdG91Y2hzdGFydCkNCiAgICAgICAgLm9uKCJ0b3VjaG1vdmUuem9vbSIsIHRvdWNobW92ZSkNCiAgICAgICAgLm9uKCJ0b3VjaGVuZC56b29tIiwgdG91Y2hzdGFydCk7DQogIH0NCg0KICB6b29tLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7DQogICAgdHJhbnNsYXRlID0geC5tYXAoTnVtYmVyKTsNCiAgICByZXR1cm4gem9vbTsNCiAgfTsNCg0KICB6b29tLnNjYWxlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOw0KICAgIHNjYWxlID0gK3g7DQogICAgcmV0dXJuIHpvb207DQogIH07DQoNCiAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZUV4dGVudDsNCiAgICBzY2FsZUV4dGVudCA9IHggPT0gbnVsbCA/IGQzX2JlaGF2aW9yX3pvb21JbmZpbml0eSA6IHgubWFwKE51bWJlcik7DQogICAgcmV0dXJuIHpvb207DQogIH07DQoNCiAgem9vbS54ID0gZnVuY3Rpb24oeikgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxOw0KICAgIHgxID0gejsNCiAgICB4MCA9IHouY29weSgpOw0KICAgIHJldHVybiB6b29tOw0KICB9Ow0KDQogIHpvb20ueSA9IGZ1bmN0aW9uKHopIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MTsNCiAgICB5MSA9IHo7DQogICAgeTAgPSB6LmNvcHkoKTsNCiAgICByZXR1cm4gem9vbTsNCiAgfTsNCg0KICBmdW5jdGlvbiBsb2NhdGlvbihwKSB7DQogICAgcmV0dXJuIFsocFswXSAtIHRyYW5zbGF0ZVswXSkgLyBzY2FsZSwgKHBbMV0gLSB0cmFuc2xhdGVbMV0pIC8gc2NhbGVdOw0KICB9DQoNCiAgZnVuY3Rpb24gcG9pbnQobCkgew0KICAgIHJldHVybiBbbFswXSAqIHNjYWxlICsgdHJhbnNsYXRlWzBdLCBsWzFdICogc2NhbGUgKyB0cmFuc2xhdGVbMV1dOw0KICB9DQoNCiAgZnVuY3Rpb24gc2NhbGVUbyhzKSB7DQogICAgc2NhbGUgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHMpKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHRyYW5zbGF0ZVRvKHAsIGwpIHsNCiAgICBsID0gcG9pbnQobCk7DQogICAgdHJhbnNsYXRlWzBdICs9IHBbMF0gLSBsWzBdOw0KICAgIHRyYW5zbGF0ZVsxXSArPSBwWzFdIC0gbFsxXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRpc3BhdGNoKGV2ZW50KSB7DQogICAgaWYgKHgxKSB4MS5kb21haW4oeDAucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4gKHggLSB0cmFuc2xhdGVbMF0pIC8gc2NhbGU7IH0pLm1hcCh4MC5pbnZlcnQpKTsNCiAgICBpZiAoeTEpIHkxLmRvbWFpbih5MC5yYW5nZSgpLm1hcChmdW5jdGlvbih5KSB7IHJldHVybiAoeSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZTsgfSkubWFwKHkwLmludmVydCkpOw0KICAgIGQzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgZXZlbnQoe3R5cGU6ICJ6b29tIiwgc2NhbGU6IHNjYWxlLCB0cmFuc2xhdGU6IHRyYW5zbGF0ZX0pOw0KICB9DQoNCiAgZnVuY3Rpb24gbW91c2Vkb3duKCkgew0KICAgIHZhciB0YXJnZXQgPSB0aGlzLA0KICAgICAgICBldmVudF8gPSBldmVudC5vZih0YXJnZXQsIGFyZ3VtZW50cyksDQogICAgICAgIGV2ZW50VGFyZ2V0ID0gZDMuZXZlbnQudGFyZ2V0LA0KICAgICAgICBtb3ZlZCA9IDAsDQogICAgICAgIHcgPSBkMy5zZWxlY3Qod2luZG93KS5vbigibW91c2Vtb3ZlLnpvb20iLCBtb3VzZW1vdmUpLm9uKCJtb3VzZXVwLnpvb20iLCBtb3VzZXVwKSwNCiAgICAgICAgbCA9IGxvY2F0aW9uKGQzLm1vdXNlKHRhcmdldCkpOw0KDQogICAgd2luZG93LmZvY3VzKCk7DQogICAgZDNfZXZlbnRDYW5jZWwoKTsNCg0KICAgIGZ1bmN0aW9uIG1vdXNlbW92ZSgpIHsNCiAgICAgIG1vdmVkID0gMTsNCiAgICAgIHRyYW5zbGF0ZVRvKGQzLm1vdXNlKHRhcmdldCksIGwpOw0KICAgICAgZGlzcGF0Y2goZXZlbnRfKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBtb3VzZXVwKCkgew0KICAgICAgaWYgKG1vdmVkKSBkM19ldmVudENhbmNlbCgpOw0KICAgICAgdy5vbigibW91c2Vtb3ZlLnpvb20iLCBudWxsKS5vbigibW91c2V1cC56b29tIiwgbnVsbCk7DQogICAgICBpZiAobW92ZWQgJiYgZDMuZXZlbnQudGFyZ2V0ID09PSBldmVudFRhcmdldCkgdy5vbigiY2xpY2suem9vbSIsIGNsaWNrKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjbGljaygpIHsNCiAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7DQogICAgICB3Lm9uKCJjbGljay56b29tIiwgbnVsbCk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gbW91c2V3aGVlbCgpIHsNCiAgICBpZiAoIXRyYW5zbGF0ZTApIHRyYW5zbGF0ZTAgPSBsb2NhdGlvbihkMy5tb3VzZSh0aGlzKSk7DQogICAgc2NhbGVUbyhNYXRoLnBvdygyLCBkM19iZWhhdmlvcl96b29tRGVsdGEoKSAqIC4wMDIpICogc2NhbGUpOw0KICAgIHRyYW5zbGF0ZVRvKGQzLm1vdXNlKHRoaXMpLCB0cmFuc2xhdGUwKTsNCiAgICBkaXNwYXRjaChldmVudC5vZih0aGlzLCBhcmd1bWVudHMpKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG1vdXNlbW92ZSgpIHsNCiAgICB0cmFuc2xhdGUwID0gbnVsbDsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRibGNsaWNrKCkgew0KICAgIHZhciBwID0gZDMubW91c2UodGhpcyksIGwgPSBsb2NhdGlvbihwKTsNCiAgICBzY2FsZVRvKGQzLmV2ZW50LnNoaWZ0S2V5ID8gc2NhbGUgLyAyIDogc2NhbGUgKiAyKTsNCiAgICB0cmFuc2xhdGVUbyhwLCBsKTsNCiAgICBkaXNwYXRjaChldmVudC5vZih0aGlzLCBhcmd1bWVudHMpKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHRvdWNoc3RhcnQoKSB7DQogICAgdmFyIHRvdWNoZXMgPSBkMy50b3VjaGVzKHRoaXMpLA0KICAgICAgICBub3cgPSBEYXRlLm5vdygpOw0KDQogICAgc2NhbGUwID0gc2NhbGU7DQogICAgdHJhbnNsYXRlMCA9IHt9Ow0KICAgIHRvdWNoZXMuZm9yRWFjaChmdW5jdGlvbih0KSB7IHRyYW5zbGF0ZTBbdC5pZGVudGlmaWVyXSA9IGxvY2F0aW9uKHQpOyB9KTsNCiAgICBkM19ldmVudENhbmNlbCgpOw0KDQogICAgaWYgKCh0b3VjaGVzLmxlbmd0aCA9PT0gMSkgJiYgKG5vdyAtIHRvdWNodGltZSA8IDUwMCkpIHsgLy8gZGJsdGFwDQogICAgICB2YXIgcCA9IHRvdWNoZXNbMF0sIGwgPSBsb2NhdGlvbih0b3VjaGVzWzBdKTsNCiAgICAgIHNjYWxlVG8oc2NhbGUgKiAyKTsNCiAgICAgIHRyYW5zbGF0ZVRvKHAsIGwpOw0KICAgICAgZGlzcGF0Y2goZXZlbnQub2YodGhpcywgYXJndW1lbnRzKSk7DQogICAgfQ0KICAgIHRvdWNodGltZSA9IG5vdzsNCiAgfQ0KDQogIGZ1bmN0aW9uIHRvdWNobW92ZSgpIHsNCiAgICB2YXIgdG91Y2hlcyA9IGQzLnRvdWNoZXModGhpcyksDQogICAgICAgIHAwID0gdG91Y2hlc1swXSwNCiAgICAgICAgbDAgPSB0cmFuc2xhdGUwW3AwLmlkZW50aWZpZXJdOw0KICAgIGlmIChwMSA9IHRvdWNoZXNbMV0pIHsNCiAgICAgIHZhciBwMSwgbDEgPSB0cmFuc2xhdGUwW3AxLmlkZW50aWZpZXJdOw0KICAgICAgcDAgPSBbKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMl07DQogICAgICBsMCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTsNCiAgICAgIHNjYWxlVG8oZDMuZXZlbnQuc2NhbGUgKiBzY2FsZTApOw0KICAgIH0NCiAgICB0cmFuc2xhdGVUbyhwMCwgbDApOw0KICAgIGRpc3BhdGNoKGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cykpOw0KICB9DQoNCiAgcmV0dXJuIGQzLnJlYmluZCh6b29tLCBldmVudCwgIm9uIik7DQp9Ow0KDQp2YXIgZDNfYmVoYXZpb3Jfem9vbURpdiwgLy8gZm9yIGludGVycHJldGluZyBtb3VzZXdoZWVsIGV2ZW50cw0KICAgIGQzX2JlaGF2aW9yX3pvb21JbmZpbml0eSA9IFswLCBJbmZpbml0eV07IC8vIGRlZmF1bHQgc2NhbGUgZXh0ZW50DQoNCmZ1bmN0aW9uIGQzX2JlaGF2aW9yX3pvb21EZWx0YSgpIHsNCg0KICAvLyBtb3VzZXdoZWVsIGV2ZW50cyBhcmUgdG90YWxseSBicm9rZW4hDQogIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MDQ0MQ0KICAvLyBub3Qgb25seSB0aGF0LCBidXQgQ2hyb21lIGFuZCBTYWZhcmkgZGlmZmVyIGluIHJlLiB0byBhY2NlbGVyYXRpb24hDQogIGlmICghZDNfYmVoYXZpb3Jfem9vbURpdikgew0KICAgIGQzX2JlaGF2aW9yX3pvb21EaXYgPSBkMy5zZWxlY3QoImJvZHkiKS5hcHBlbmQoImRpdiIpDQogICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKQ0KICAgICAgICAuc3R5bGUoInRvcCIsIDApDQogICAgICAgIC5zdHlsZSgiaGVpZ2h0IiwgMCkNCiAgICAgICAgLnN0eWxlKCJ3aWR0aCIsIDApDQogICAgICAgIC5zdHlsZSgib3ZlcmZsb3cteSIsICJzY3JvbGwiKQ0KICAgICAgLmFwcGVuZCgiZGl2IikNCiAgICAgICAgLnN0eWxlKCJoZWlnaHQiLCAiMjAwMHB4IikNCiAgICAgIC5ub2RlKCkucGFyZW50Tm9kZTsNCiAgfQ0KDQogIHZhciBlID0gZDMuZXZlbnQsIGRlbHRhOw0KICB0cnkgew0KICAgIGQzX2JlaGF2aW9yX3pvb21EaXYuc2Nyb2xsVG9wID0gMTAwMDsNCiAgICBkM19iZWhhdmlvcl96b29tRGl2LmRpc3BhdGNoRXZlbnQoZSk7DQogICAgZGVsdGEgPSAxMDAwIC0gZDNfYmVoYXZpb3Jfem9vbURpdi5zY3JvbGxUb3A7DQogIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgZGVsdGEgPSBlLndoZWVsRGVsdGEgfHwgKC1lLmRldGFpbCAqIDUpOw0KICB9DQoNCiAgcmV0dXJuIGRlbHRhOw0KfQ0KZDMubGF5b3V0ID0ge307DQovLyBJbXBsZW1lbnRzIGhpZXJhcmNoaWNhbCBlZGdlIGJ1bmRsaW5nIHVzaW5nIEhvbHRlbidzIGFsZ29yaXRobS4gRm9yIGVhY2gNCi8vIGlucHV0IGxpbmssIGEgcGF0aCBpcyBjb21wdXRlZCB0aGF0IHRyYXZlbHMgdGhyb3VnaCB0aGUgdHJlZSwgdXAgdGhlIHBhcmVudA0KLy8gaGllcmFyY2h5IHRvIHRoZSBsZWFzdCBjb21tb24gYW5jZXN0b3IsIGFuZCB0aGVuIGJhY2sgZG93biB0byB0aGUgZGVzdGluYXRpb24NCi8vIG5vZGUuIEVhY2ggcGF0aCBpcyBzaW1wbHkgYW4gYXJyYXkgb2Ygbm9kZXMuDQpkMy5sYXlvdXQuYnVuZGxlID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBmdW5jdGlvbihsaW5rcykgew0KICAgIHZhciBwYXRocyA9IFtdLA0KICAgICAgICBpID0gLTEsDQogICAgICAgIG4gPSBsaW5rcy5sZW5ndGg7DQogICAgd2hpbGUgKCsraSA8IG4pIHBhdGhzLnB1c2goZDNfbGF5b3V0X2J1bmRsZVBhdGgobGlua3NbaV0pKTsNCiAgICByZXR1cm4gcGF0aHM7DQogIH07DQp9Ow0KDQpmdW5jdGlvbiBkM19sYXlvdXRfYnVuZGxlUGF0aChsaW5rKSB7DQogIHZhciBzdGFydCA9IGxpbmsuc291cmNlLA0KICAgICAgZW5kID0gbGluay50YXJnZXQsDQogICAgICBsY2EgPSBkM19sYXlvdXRfYnVuZGxlTGVhc3RDb21tb25BbmNlc3RvcihzdGFydCwgZW5kKSwNCiAgICAgIHBvaW50cyA9IFtzdGFydF07DQogIHdoaWxlIChzdGFydCAhPT0gbGNhKSB7DQogICAgc3RhcnQgPSBzdGFydC5wYXJlbnQ7DQogICAgcG9pbnRzLnB1c2goc3RhcnQpOw0KICB9DQogIHZhciBrID0gcG9pbnRzLmxlbmd0aDsNCiAgd2hpbGUgKGVuZCAhPT0gbGNhKSB7DQogICAgcG9pbnRzLnNwbGljZShrLCAwLCBlbmQpOw0KICAgIGVuZCA9IGVuZC5wYXJlbnQ7DQogIH0NCiAgcmV0dXJuIHBvaW50czsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZUFuY2VzdG9ycyhub2RlKSB7DQogIHZhciBhbmNlc3RvcnMgPSBbXSwNCiAgICAgIHBhcmVudCA9IG5vZGUucGFyZW50Ow0KICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHsNCiAgICBhbmNlc3RvcnMucHVzaChub2RlKTsNCiAgICBub2RlID0gcGFyZW50Ow0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7DQogIH0NCiAgYW5jZXN0b3JzLnB1c2gobm9kZSk7DQogIHJldHVybiBhbmNlc3RvcnM7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9idW5kbGVMZWFzdENvbW1vbkFuY2VzdG9yKGEsIGIpIHsNCiAgaWYgKGEgPT09IGIpIHJldHVybiBhOw0KICB2YXIgYU5vZGVzID0gZDNfbGF5b3V0X2J1bmRsZUFuY2VzdG9ycyhhKSwNCiAgICAgIGJOb2RlcyA9IGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMoYiksDQogICAgICBhTm9kZSA9IGFOb2Rlcy5wb3AoKSwNCiAgICAgIGJOb2RlID0gYk5vZGVzLnBvcCgpLA0KICAgICAgc2hhcmVkTm9kZSA9IG51bGw7DQogIHdoaWxlIChhTm9kZSA9PT0gYk5vZGUpIHsNCiAgICBzaGFyZWROb2RlID0gYU5vZGU7DQogICAgYU5vZGUgPSBhTm9kZXMucG9wKCk7DQogICAgYk5vZGUgPSBiTm9kZXMucG9wKCk7DQogIH0NCiAgcmV0dXJuIHNoYXJlZE5vZGU7DQp9DQpkMy5sYXlvdXQuY2hvcmQgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGNob3JkID0ge30sDQogICAgICBjaG9yZHMsDQogICAgICBncm91cHMsDQogICAgICBtYXRyaXgsDQogICAgICBuLA0KICAgICAgcGFkZGluZyA9IDAsDQogICAgICBzb3J0R3JvdXBzLA0KICAgICAgc29ydFN1Ymdyb3VwcywNCiAgICAgIHNvcnRDaG9yZHM7DQoNCiAgZnVuY3Rpb24gcmVsYXlvdXQoKSB7DQogICAgdmFyIHN1Ymdyb3VwcyA9IHt9LA0KICAgICAgICBncm91cFN1bXMgPSBbXSwNCiAgICAgICAgZ3JvdXBJbmRleCA9IGQzLnJhbmdlKG4pLA0KICAgICAgICBzdWJncm91cEluZGV4ID0gW10sDQogICAgICAgIGssDQogICAgICAgIHgsDQogICAgICAgIHgwLA0KICAgICAgICBpLA0KICAgICAgICBqOw0KDQogICAgY2hvcmRzID0gW107DQogICAgZ3JvdXBzID0gW107DQoNCiAgICAvLyBDb21wdXRlIHRoZSBzdW0uDQogICAgayA9IDAsIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIHggPSAwLCBqID0gLTE7IHdoaWxlICgrK2ogPCBuKSB7DQogICAgICAgIHggKz0gbWF0cml4W2ldW2pdOw0KICAgICAgfQ0KICAgICAgZ3JvdXBTdW1zLnB1c2goeCk7DQogICAgICBzdWJncm91cEluZGV4LnB1c2goZDMucmFuZ2UobikpOw0KICAgICAgayArPSB4Ow0KICAgIH0NCg0KICAgIC8vIFNvcnQgZ3JvdXBz4oA/DQogICAgaWYgKHNvcnRHcm91cHMpIHsNCiAgICAgIGdyb3VwSW5kZXguc29ydChmdW5jdGlvbihhLCBiKSB7DQogICAgICAgIHJldHVybiBzb3J0R3JvdXBzKGdyb3VwU3Vtc1thXSwgZ3JvdXBTdW1zW2JdKTsNCiAgICAgIH0pOw0KICAgIH0NCg0KICAgIC8vIFNvcnQgc3ViZ3JvdXBz4oA/DQogICAgaWYgKHNvcnRTdWJncm91cHMpIHsNCiAgICAgIHN1Ymdyb3VwSW5kZXguZm9yRWFjaChmdW5jdGlvbihkLCBpKSB7DQogICAgICAgIGQuc29ydChmdW5jdGlvbihhLCBiKSB7DQogICAgICAgICAgcmV0dXJuIHNvcnRTdWJncm91cHMobWF0cml4W2ldW2FdLCBtYXRyaXhbaV1bYl0pOw0KICAgICAgICB9KTsNCiAgICAgIH0pOw0KICAgIH0NCg0KICAgIC8vIENvbnZlcnQgdGhlIHN1bSB0byBzY2FsaW5nIGZhY3RvciBmb3IgWzAsIDJwaV0uDQogICAgLy8gVE9ETyBBbGxvdyBzdGFydCBhbmQgZW5kIGFuZ2xlIHRvIGJlIHNwZWNpZmllZC4NCiAgICAvLyBUT0RPIEFsbG93IHBhZGRpbmcgdG8gYmUgc3BlY2lmaWVkIGFzIHBlcmNlbnRhZ2U/DQogICAgayA9ICgyICogTWF0aC5QSSAtIHBhZGRpbmcgKiBuKSAvIGs7DQoNCiAgICAvLyBDb21wdXRlIHRoZSBzdGFydCBhbmQgZW5kIGFuZ2xlIGZvciBlYWNoIGdyb3VwIGFuZCBzdWJncm91cC4NCiAgICAvLyBOb3RlOiBPcGVyYSBoYXMgYSBidWcgcmVvcmRlcmluZyBvYmplY3QgbGl0ZXJhbCBwcm9wZXJ0aWVzIQ0KICAgIHggPSAwLCBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7DQogICAgICB4MCA9IHgsIGogPSAtMTsgd2hpbGUgKCsraiA8IG4pIHsNCiAgICAgICAgdmFyIGRpID0gZ3JvdXBJbmRleFtpXSwNCiAgICAgICAgICAgIGRqID0gc3ViZ3JvdXBJbmRleFtkaV1bal0sDQogICAgICAgICAgICB2ID0gbWF0cml4W2RpXVtkal0sDQogICAgICAgICAgICBhMCA9IHgsDQogICAgICAgICAgICBhMSA9IHggKz0gdiAqIGs7DQogICAgICAgIHN1Ymdyb3Vwc1tkaSArICItIiArIGRqXSA9IHsNCiAgICAgICAgICBpbmRleDogZGksDQogICAgICAgICAgc3ViaW5kZXg6IGRqLA0KICAgICAgICAgIHN0YXJ0QW5nbGU6IGEwLA0KICAgICAgICAgIGVuZEFuZ2xlOiBhMSwNCiAgICAgICAgICB2YWx1ZTogdg0KICAgICAgICB9Ow0KICAgICAgfQ0KICAgICAgZ3JvdXBzLnB1c2goew0KICAgICAgICBpbmRleDogZGksDQogICAgICAgIHN0YXJ0QW5nbGU6IHgwLA0KICAgICAgICBlbmRBbmdsZTogeCwNCiAgICAgICAgdmFsdWU6ICh4IC0geDApIC8gaw0KICAgICAgfSk7DQogICAgICB4ICs9IHBhZGRpbmc7DQogICAgfQ0KDQogICAgLy8gR2VuZXJhdGUgY2hvcmRzIGZvciBlYWNoIChub24tZW1wdHkpIHN1Ymdyb3VwLXN1Ymdyb3VwIGxpbmsuDQogICAgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaiA9IGkgLSAxOyB3aGlsZSAoKytqIDwgbikgew0KICAgICAgICB2YXIgc291cmNlID0gc3ViZ3JvdXBzW2kgKyAiLSIgKyBqXSwNCiAgICAgICAgICAgIHRhcmdldCA9IHN1Ymdyb3Vwc1tqICsgIi0iICsgaV07DQogICAgICAgIGlmIChzb3VyY2UudmFsdWUgfHwgdGFyZ2V0LnZhbHVlKSB7DQogICAgICAgICAgY2hvcmRzLnB1c2goc291cmNlLnZhbHVlIDwgdGFyZ2V0LnZhbHVlDQogICAgICAgICAgICAgID8ge3NvdXJjZTogdGFyZ2V0LCB0YXJnZXQ6IHNvdXJjZX0NCiAgICAgICAgICAgICAgOiB7c291cmNlOiBzb3VyY2UsIHRhcmdldDogdGFyZ2V0fSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAoc29ydENob3JkcykgcmVzb3J0KCk7DQogIH0NCg0KICBmdW5jdGlvbiByZXNvcnQoKSB7DQogICAgY2hvcmRzLnNvcnQoZnVuY3Rpb24oYSwgYikgew0KICAgICAgcmV0dXJuIHNvcnRDaG9yZHMoDQogICAgICAgICAgKGEuc291cmNlLnZhbHVlICsgYS50YXJnZXQudmFsdWUpIC8gMiwNCiAgICAgICAgICAoYi5zb3VyY2UudmFsdWUgKyBiLnRhcmdldC52YWx1ZSkgLyAyKTsNCiAgICB9KTsNCiAgfQ0KDQogIGNob3JkLm1hdHJpeCA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBtYXRyaXg7DQogICAgbiA9IChtYXRyaXggPSB4KSAmJiBtYXRyaXgubGVuZ3RoOw0KICAgIGNob3JkcyA9IGdyb3VwcyA9IG51bGw7DQogICAgcmV0dXJuIGNob3JkOw0KICB9Ow0KDQogIGNob3JkLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZzsNCiAgICBwYWRkaW5nID0geDsNCiAgICBjaG9yZHMgPSBncm91cHMgPSBudWxsOw0KICAgIHJldHVybiBjaG9yZDsNCiAgfTsNCg0KICBjaG9yZC5zb3J0R3JvdXBzID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnRHcm91cHM7DQogICAgc29ydEdyb3VwcyA9IHg7DQogICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDsNCiAgICByZXR1cm4gY2hvcmQ7DQogIH07DQoNCiAgY2hvcmQuc29ydFN1Ymdyb3VwcyA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0U3ViZ3JvdXBzOw0KICAgIHNvcnRTdWJncm91cHMgPSB4Ow0KICAgIGNob3JkcyA9IG51bGw7DQogICAgcmV0dXJuIGNob3JkOw0KICB9Ow0KDQogIGNob3JkLnNvcnRDaG9yZHMgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydENob3JkczsNCiAgICBzb3J0Q2hvcmRzID0geDsNCiAgICBpZiAoY2hvcmRzKSByZXNvcnQoKTsNCiAgICByZXR1cm4gY2hvcmQ7DQogIH07DQoNCiAgY2hvcmQuY2hvcmRzID0gZnVuY3Rpb24oKSB7DQogICAgaWYgKCFjaG9yZHMpIHJlbGF5b3V0KCk7DQogICAgcmV0dXJuIGNob3JkczsNCiAgfTsNCg0KICBjaG9yZC5ncm91cHMgPSBmdW5jdGlvbigpIHsNCiAgICBpZiAoIWdyb3VwcykgcmVsYXlvdXQoKTsNCiAgICByZXR1cm4gZ3JvdXBzOw0KICB9Ow0KDQogIHJldHVybiBjaG9yZDsNCn07DQovLyBBIHJ1ZGltZW50YXJ5IGZvcmNlIGxheW91dCB1c2luZyBHYXVzcy1TZWlkZWwuDQpkMy5sYXlvdXQuZm9yY2UgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGZvcmNlID0ge30sDQogICAgICBldmVudCA9IGQzLmRpc3BhdGNoKCJzdGFydCIsICJ0aWNrIiwgImVuZCIpLA0KICAgICAgc2l6ZSA9IFsxLCAxXSwNCiAgICAgIGRyYWcsDQogICAgICBhbHBoYSwNCiAgICAgIGZyaWN0aW9uID0gLjksDQogICAgICBsaW5rRGlzdGFuY2UgPSBkM19sYXlvdXRfZm9yY2VMaW5rRGlzdGFuY2UsDQogICAgICBsaW5rU3RyZW5ndGggPSBkM19sYXlvdXRfZm9yY2VMaW5rU3RyZW5ndGgsDQogICAgICBjaGFyZ2UgPSAtMzAsDQogICAgICBncmF2aXR5ID0gLjEsDQogICAgICB0aGV0YSA9IC44LA0KICAgICAgaW50ZXJ2YWwsDQogICAgICBub2RlcyA9IFtdLA0KICAgICAgbGlua3MgPSBbXSwNCiAgICAgIGRpc3RhbmNlcywNCiAgICAgIHN0cmVuZ3RocywNCiAgICAgIGNoYXJnZXM7DQoNCiAgZnVuY3Rpb24gcmVwdWxzZShub2RlKSB7DQogICAgcmV0dXJuIGZ1bmN0aW9uKHF1YWQsIHgxLCB5MSwgeDIsIHkyKSB7DQogICAgICBpZiAocXVhZC5wb2ludCAhPT0gbm9kZSkgew0KICAgICAgICB2YXIgZHggPSBxdWFkLmN4IC0gbm9kZS54LA0KICAgICAgICAgICAgZHkgPSBxdWFkLmN5IC0gbm9kZS55LA0KICAgICAgICAgICAgZG4gPSAxIC8gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsNCg0KICAgICAgICAvKiBCYXJuZXMtSHV0IGNyaXRlcmlvbi4gKi8NCiAgICAgICAgaWYgKCh4MiAtIHgxKSAqIGRuIDwgdGhldGEpIHsNCiAgICAgICAgICB2YXIgayA9IHF1YWQuY2hhcmdlICogZG4gKiBkbjsNCiAgICAgICAgICBub2RlLnB4IC09IGR4ICogazsNCiAgICAgICAgICBub2RlLnB5IC09IGR5ICogazsNCiAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChxdWFkLnBvaW50ICYmIGlzRmluaXRlKGRuKSkgew0KICAgICAgICAgIHZhciBrID0gcXVhZC5wb2ludENoYXJnZSAqIGRuICogZG47DQogICAgICAgICAgbm9kZS5weCAtPSBkeCAqIGs7DQogICAgICAgICAgbm9kZS5weSAtPSBkeSAqIGs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiAhcXVhZC5jaGFyZ2U7DQogICAgfTsNCiAgfQ0KDQogIGZvcmNlLnRpY2sgPSBmdW5jdGlvbigpIHsNCiAgICAvLyBzaW11bGF0ZWQgYW5uZWFsaW5nLCBiYXNpY2FsbHkNCiAgICBpZiAoKGFscGhhICo9IC45OSkgPCAuMDA1KSB7DQogICAgICBldmVudC5lbmQoe3R5cGU6ICJlbmQiLCBhbHBoYTogYWxwaGEgPSAwfSk7DQogICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICB2YXIgbiA9IG5vZGVzLmxlbmd0aCwNCiAgICAgICAgbSA9IGxpbmtzLmxlbmd0aCwNCiAgICAgICAgcSwNCiAgICAgICAgaSwgLy8gY3VycmVudCBpbmRleA0KICAgICAgICBvLCAvLyBjdXJyZW50IG9iamVjdA0KICAgICAgICBzLCAvLyBjdXJyZW50IHNvdXJjZQ0KICAgICAgICB0LCAvLyBjdXJyZW50IHRhcmdldA0KICAgICAgICBsLCAvLyBjdXJyZW50IGRpc3RhbmNlDQogICAgICAgIGssIC8vIGN1cnJlbnQgZm9yY2UNCiAgICAgICAgeCwgLy8geC1kaXN0YW5jZQ0KICAgICAgICB5OyAvLyB5LWRpc3RhbmNlDQoNCiAgICAvLyBnYXVzcy1zZWlkZWwgcmVsYXhhdGlvbiBmb3IgbGlua3MNCiAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7DQogICAgICBvID0gbGlua3NbaV07DQogICAgICBzID0gby5zb3VyY2U7DQogICAgICB0ID0gby50YXJnZXQ7DQogICAgICB4ID0gdC54IC0gcy54Ow0KICAgICAgeSA9IHQueSAtIHMueTsNCiAgICAgIGlmIChsID0gKHggKiB4ICsgeSAqIHkpKSB7DQogICAgICAgIGwgPSBhbHBoYSAqIHN0cmVuZ3Roc1tpXSAqICgobCA9IE1hdGguc3FydChsKSkgLSBkaXN0YW5jZXNbaV0pIC8gbDsNCiAgICAgICAgeCAqPSBsOw0KICAgICAgICB5ICo9IGw7DQogICAgICAgIHQueCAtPSB4ICogKGsgPSBzLndlaWdodCAvICh0LndlaWdodCArIHMud2VpZ2h0KSk7DQogICAgICAgIHQueSAtPSB5ICogazsNCiAgICAgICAgcy54ICs9IHggKiAoayA9IDEgLSBrKTsNCiAgICAgICAgcy55ICs9IHkgKiBrOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIGFwcGx5IGdyYXZpdHkgZm9yY2VzDQogICAgaWYgKGsgPSBhbHBoYSAqIGdyYXZpdHkpIHsNCiAgICAgIHggPSBzaXplWzBdIC8gMjsNCiAgICAgIHkgPSBzaXplWzFdIC8gMjsNCiAgICAgIGkgPSAtMTsgaWYgKGspIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICAgIG8gPSBub2Rlc1tpXTsNCiAgICAgICAgby54ICs9ICh4IC0gby54KSAqIGs7DQogICAgICAgIG8ueSArPSAoeSAtIG8ueSkgKiBrOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIGNvbXB1dGUgcXVhZHRyZWUgY2VudGVyIG9mIG1hc3MgYW5kIGFwcGx5IGNoYXJnZSBmb3JjZXMNCiAgICBpZiAoY2hhcmdlKSB7DQogICAgICBkM19sYXlvdXRfZm9yY2VBY2N1bXVsYXRlKHEgPSBkMy5nZW9tLnF1YWR0cmVlKG5vZGVzKSwgYWxwaGEsIGNoYXJnZXMpOw0KICAgICAgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgew0KICAgICAgICBpZiAoIShvID0gbm9kZXNbaV0pLmZpeGVkKSB7DQogICAgICAgICAgcS52aXNpdChyZXB1bHNlKG8pKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIHBvc2l0aW9uIHZlcmxldCBpbnRlZ3JhdGlvbg0KICAgIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIG8gPSBub2Rlc1tpXTsNCiAgICAgIGlmIChvLmZpeGVkKSB7DQogICAgICAgIG8ueCA9IG8ucHg7DQogICAgICAgIG8ueSA9IG8ucHk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBvLnggLT0gKG8ucHggLSAoby5weCA9IG8ueCkpICogZnJpY3Rpb247DQogICAgICAgIG8ueSAtPSAoby5weSAtIChvLnB5ID0gby55KSkgKiBmcmljdGlvbjsNCiAgICAgIH0NCiAgICB9DQoNCiAgICBldmVudC50aWNrKHt0eXBlOiAidGljayIsIGFscGhhOiBhbHBoYX0pOw0KICB9Ow0KDQogIGZvcmNlLm5vZGVzID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVzOw0KICAgIG5vZGVzID0geDsNCiAgICByZXR1cm4gZm9yY2U7DQogIH07DQoNCiAgZm9yY2UubGlua3MgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGlua3M7DQogICAgbGlua3MgPSB4Ow0KICAgIHJldHVybiBmb3JjZTsNCiAgfTsNCg0KICBmb3JjZS5zaXplID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7DQogICAgc2l6ZSA9IHg7DQogICAgcmV0dXJuIGZvcmNlOw0KICB9Ow0KDQogIGZvcmNlLmxpbmtEaXN0YW5jZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rRGlzdGFuY2U7DQogICAgbGlua0Rpc3RhbmNlID0gZDMuZnVuY3Rvcih4KTsNCiAgICByZXR1cm4gZm9yY2U7DQogIH07DQoNCiAgLy8gRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5Lg0KICBmb3JjZS5kaXN0YW5jZSA9IGZvcmNlLmxpbmtEaXN0YW5jZTsNCg0KICBmb3JjZS5saW5rU3RyZW5ndGggPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGlua1N0cmVuZ3RoOw0KICAgIGxpbmtTdHJlbmd0aCA9IGQzLmZ1bmN0b3IoeCk7DQogICAgcmV0dXJuIGZvcmNlOw0KICB9Ow0KDQogIGZvcmNlLmZyaWN0aW9uID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGZyaWN0aW9uOw0KICAgIGZyaWN0aW9uID0geDsNCiAgICByZXR1cm4gZm9yY2U7DQogIH07DQoNCiAgZm9yY2UuY2hhcmdlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNoYXJnZTsNCiAgICBjaGFyZ2UgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiAreDsNCiAgICByZXR1cm4gZm9yY2U7DQogIH07DQoNCiAgZm9yY2UuZ3Jhdml0eSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBncmF2aXR5Ow0KICAgIGdyYXZpdHkgPSB4Ow0KICAgIHJldHVybiBmb3JjZTsNCiAgfTsNCg0KICBmb3JjZS50aGV0YSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGV0YTsNCiAgICB0aGV0YSA9IHg7DQogICAgcmV0dXJuIGZvcmNlOw0KICB9Ow0KDQogIGZvcmNlLmFscGhhID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGFscGhhOw0KDQogICAgaWYgKGFscGhhKSB7IC8vIGlmIHdlJ3JlIGFscmVhZHkgcnVubmluZw0KICAgICAgaWYgKHggPiAwKSBhbHBoYSA9IHg7IC8vIHdlIG1pZ2h0IGtlZXAgaXQgaG90DQogICAgICBlbHNlIGFscGhhID0gMDsgLy8gb3IsIG5leHQgdGljayB3aWxsIGRpc3BhdGNoICJlbmQiDQogICAgfSBlbHNlIGlmICh4ID4gMCkgeyAvLyBvdGhlcndpc2UsIGZpcmUgaXQgdXAhDQogICAgICBldmVudC5zdGFydCh7dHlwZTogInN0YXJ0IiwgYWxwaGE6IGFscGhhID0geH0pOw0KICAgICAgZDMudGltZXIoZm9yY2UudGljayk7DQogICAgfQ0KDQogICAgcmV0dXJuIGZvcmNlOw0KICB9Ow0KDQogIGZvcmNlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7DQogICAgdmFyIGksDQogICAgICAgIGosDQogICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsDQogICAgICAgIG0gPSBsaW5rcy5sZW5ndGgsDQogICAgICAgIHcgPSBzaXplWzBdLA0KICAgICAgICBoID0gc2l6ZVsxXSwNCiAgICAgICAgbmVpZ2hib3JzLA0KICAgICAgICBvOw0KDQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgKG8gPSBub2Rlc1tpXSkuaW5kZXggPSBpOw0KICAgICAgby53ZWlnaHQgPSAwOw0KICAgIH0NCg0KICAgIGRpc3RhbmNlcyA9IFtdOw0KICAgIHN0cmVuZ3RocyA9IFtdOw0KICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsNCiAgICAgIG8gPSBsaW5rc1tpXTsNCiAgICAgIGlmICh0eXBlb2Ygby5zb3VyY2UgPT0gIm51bWJlciIpIG8uc291cmNlID0gbm9kZXNbby5zb3VyY2VdOw0KICAgICAgaWYgKHR5cGVvZiBvLnRhcmdldCA9PSAibnVtYmVyIikgby50YXJnZXQgPSBub2Rlc1tvLnRhcmdldF07DQogICAgICBkaXN0YW5jZXNbaV0gPSBsaW5rRGlzdGFuY2UuY2FsbCh0aGlzLCBvLCBpKTsNCiAgICAgIHN0cmVuZ3Roc1tpXSA9IGxpbmtTdHJlbmd0aC5jYWxsKHRoaXMsIG8sIGkpOw0KICAgICAgKytvLnNvdXJjZS53ZWlnaHQ7DQogICAgICArK28udGFyZ2V0LndlaWdodDsNCiAgICB9DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBvID0gbm9kZXNbaV07DQogICAgICBpZiAoaXNOYU4oby54KSkgby54ID0gcG9zaXRpb24oIngiLCB3KTsNCiAgICAgIGlmIChpc05hTihvLnkpKSBvLnkgPSBwb3NpdGlvbigieSIsIGgpOw0KICAgICAgaWYgKGlzTmFOKG8ucHgpKSBvLnB4ID0gby54Ow0KICAgICAgaWYgKGlzTmFOKG8ucHkpKSBvLnB5ID0gby55Ow0KICAgIH0NCg0KICAgIGNoYXJnZXMgPSBbXTsNCiAgICBpZiAodHlwZW9mIGNoYXJnZSA9PT0gImZ1bmN0aW9uIikgew0KICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgICBjaGFyZ2VzW2ldID0gK2NoYXJnZS5jYWxsKHRoaXMsIG5vZGVzW2ldLCBpKTsNCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgICBjaGFyZ2VzW2ldID0gY2hhcmdlOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIGluaXRpYWxpemUgbm9kZSBwb3NpdGlvbiBiYXNlZCBvbiBmaXJzdCBuZWlnaGJvcg0KICAgIGZ1bmN0aW9uIHBvc2l0aW9uKGRpbWVuc2lvbiwgc2l6ZSkgew0KICAgICAgdmFyIG5laWdoYm9ycyA9IG5laWdoYm9yKGkpLA0KICAgICAgICAgIGogPSAtMSwNCiAgICAgICAgICBtID0gbmVpZ2hib3JzLmxlbmd0aCwNCiAgICAgICAgICB4Ow0KICAgICAgd2hpbGUgKCsraiA8IG0pIGlmICghaXNOYU4oeCA9IG5laWdoYm9yc1tqXVtkaW1lbnNpb25dKSkgcmV0dXJuIHg7DQogICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIHNpemU7DQogICAgfQ0KDQogICAgLy8gaW5pdGlhbGl6ZSBuZWlnaGJvcnMgbGF6aWx5DQogICAgZnVuY3Rpb24gbmVpZ2hib3IoKSB7DQogICAgICBpZiAoIW5laWdoYm9ycykgew0KICAgICAgICBuZWlnaGJvcnMgPSBbXTsNCiAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgew0KICAgICAgICAgIG5laWdoYm9yc1tqXSA9IFtdOw0KICAgICAgICB9DQogICAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICAgICAgICB2YXIgbyA9IGxpbmtzW2pdOw0KICAgICAgICAgIG5laWdoYm9yc1tvLnNvdXJjZS5pbmRleF0ucHVzaChvLnRhcmdldCk7DQogICAgICAgICAgbmVpZ2hib3JzW28udGFyZ2V0LmluZGV4XS5wdXNoKG8uc291cmNlKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIG5laWdoYm9yc1tpXTsNCiAgICB9DQoNCiAgICByZXR1cm4gZm9yY2UucmVzdW1lKCk7DQogIH07DQoNCiAgZm9yY2UucmVzdW1lID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGZvcmNlLmFscGhhKC4xKTsNCiAgfTsNCg0KICBmb3JjZS5zdG9wID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGZvcmNlLmFscGhhKDApOw0KICB9Ow0KDQogIC8vIHVzZSBgbm9kZS5jYWxsKGZvcmNlLmRyYWcpYCB0byBtYWtlIG5vZGVzIGRyYWdnYWJsZQ0KICBmb3JjZS5kcmFnID0gZnVuY3Rpb24oKSB7DQogICAgaWYgKCFkcmFnKSBkcmFnID0gZDMuYmVoYXZpb3IuZHJhZygpDQogICAgICAgIC5vcmlnaW4oT2JqZWN0KQ0KICAgICAgICAub24oImRyYWdzdGFydCIsIGRyYWdzdGFydCkNCiAgICAgICAgLm9uKCJkcmFnIiwgZDNfbGF5b3V0X2ZvcmNlRHJhZykNCiAgICAgICAgLm9uKCJkcmFnZW5kIiwgZDNfbGF5b3V0X2ZvcmNlRHJhZ0VuZCk7DQoNCiAgICB0aGlzLm9uKCJtb3VzZW92ZXIuZm9yY2UiLCBkM19sYXlvdXRfZm9yY2VEcmFnT3ZlcikNCiAgICAgICAgLm9uKCJtb3VzZW91dC5mb3JjZSIsIGQzX2xheW91dF9mb3JjZURyYWdPdXQpDQogICAgICAgIC5jYWxsKGRyYWcpOw0KICB9Ow0KDQogIGZ1bmN0aW9uIGRyYWdzdGFydChkKSB7DQogICAgZDNfbGF5b3V0X2ZvcmNlRHJhZ092ZXIoZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGUgPSBkKTsNCiAgICBkM19sYXlvdXRfZm9yY2VEcmFnRm9yY2UgPSBmb3JjZTsNCiAgfQ0KDQogIHJldHVybiBkMy5yZWJpbmQoZm9yY2UsIGV2ZW50LCAib24iKTsNCn07DQoNCnZhciBkM19sYXlvdXRfZm9yY2VEcmFnRm9yY2UsDQogICAgZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGU7DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZURyYWdPdmVyKGQpIHsNCiAgZC5maXhlZCB8PSAyOw0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VEcmFnT3V0KGQpIHsNCiAgaWYgKGQgIT09IGQzX2xheW91dF9mb3JjZURyYWdOb2RlKSBkLmZpeGVkICY9IDE7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZURyYWdFbmQoKSB7DQogIGQzX2xheW91dF9mb3JjZURyYWdOb2RlLmZpeGVkICY9IDE7DQogIGQzX2xheW91dF9mb3JjZURyYWdGb3JjZSA9IGQzX2xheW91dF9mb3JjZURyYWdOb2RlID0gbnVsbDsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlRHJhZygpIHsNCiAgZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGUucHggPSBkMy5ldmVudC54Ow0KICBkM19sYXlvdXRfZm9yY2VEcmFnTm9kZS5weSA9IGQzLmV2ZW50Lnk7DQogIGQzX2xheW91dF9mb3JjZURyYWdGb3JjZS5yZXN1bWUoKTsgLy8gcmVzdGFydCBhbm5lYWxpbmcNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlQWNjdW11bGF0ZShxdWFkLCBhbHBoYSwgY2hhcmdlcykgew0KICB2YXIgY3ggPSAwLA0KICAgICAgY3kgPSAwOw0KICBxdWFkLmNoYXJnZSA9IDA7DQogIGlmICghcXVhZC5sZWFmKSB7DQogICAgdmFyIG5vZGVzID0gcXVhZC5ub2RlcywNCiAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwNCiAgICAgICAgaSA9IC0xLA0KICAgICAgICBjOw0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBjID0gbm9kZXNbaV07DQogICAgICBpZiAoYyA9PSBudWxsKSBjb250aW51ZTsNCiAgICAgIGQzX2xheW91dF9mb3JjZUFjY3VtdWxhdGUoYywgYWxwaGEsIGNoYXJnZXMpOw0KICAgICAgcXVhZC5jaGFyZ2UgKz0gYy5jaGFyZ2U7DQogICAgICBjeCArPSBjLmNoYXJnZSAqIGMuY3g7DQogICAgICBjeSArPSBjLmNoYXJnZSAqIGMuY3k7DQogICAgfQ0KICB9DQogIGlmIChxdWFkLnBvaW50KSB7DQogICAgLy8gaml0dGVyIGludGVybmFsIG5vZGVzIHRoYXQgYXJlIGNvaW5jaWRlbnQNCiAgICBpZiAoIXF1YWQubGVhZikgew0KICAgICAgcXVhZC5wb2ludC54ICs9IE1hdGgucmFuZG9tKCkgLSAuNTsNCiAgICAgIHF1YWQucG9pbnQueSArPSBNYXRoLnJhbmRvbSgpIC0gLjU7DQogICAgfQ0KICAgIHZhciBrID0gYWxwaGEgKiBjaGFyZ2VzW3F1YWQucG9pbnQuaW5kZXhdOw0KICAgIHF1YWQuY2hhcmdlICs9IHF1YWQucG9pbnRDaGFyZ2UgPSBrOw0KICAgIGN4ICs9IGsgKiBxdWFkLnBvaW50Lng7DQogICAgY3kgKz0gayAqIHF1YWQucG9pbnQueTsNCiAgfQ0KICBxdWFkLmN4ID0gY3ggLyBxdWFkLmNoYXJnZTsNCiAgcXVhZC5jeSA9IGN5IC8gcXVhZC5jaGFyZ2U7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZUxpbmtEaXN0YW5jZShsaW5rKSB7DQogIHJldHVybiAyMDsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlTGlua1N0cmVuZ3RoKGxpbmspIHsNCiAgcmV0dXJuIDE7DQp9DQpkMy5sYXlvdXQucGFydGl0aW9uID0gZnVuY3Rpb24oKSB7DQogIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCksDQogICAgICBzaXplID0gWzEsIDFdOyAvLyB3aWR0aCwgaGVpZ2h0DQoNCiAgZnVuY3Rpb24gcG9zaXRpb24obm9kZSwgeCwgZHgsIGR5KSB7DQogICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCiAgICBub2RlLnggPSB4Ow0KICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBkeTsNCiAgICBub2RlLmR4ID0gZHg7DQogICAgbm9kZS5keSA9IGR5Ow0KICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsNCiAgICAgIHZhciBpID0gLTEsDQogICAgICAgICAgbiwNCiAgICAgICAgICBjLA0KICAgICAgICAgIGQ7DQogICAgICBkeCA9IG5vZGUudmFsdWUgPyBkeCAvIG5vZGUudmFsdWUgOiAwOw0KICAgICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgICAgcG9zaXRpb24oYyA9IGNoaWxkcmVuW2ldLCB4LCBkID0gYy52YWx1ZSAqIGR4LCBkeSk7DQogICAgICAgIHggKz0gZDsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBkZXB0aChub2RlKSB7DQogICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwNCiAgICAgICAgZCA9IDA7DQogICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgew0KICAgICAgdmFyIGkgPSAtMSwNCiAgICAgICAgICBuOw0KICAgICAgd2hpbGUgKCsraSA8IG4pIGQgPSBNYXRoLm1heChkLCBkZXB0aChjaGlsZHJlbltpXSkpOw0KICAgIH0NCiAgICByZXR1cm4gMSArIGQ7DQogIH0NCg0KICBmdW5jdGlvbiBwYXJ0aXRpb24oZCwgaSkgew0KICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpOw0KICAgIHBvc2l0aW9uKG5vZGVzWzBdLCAwLCBzaXplWzBdLCBzaXplWzFdIC8gZGVwdGgobm9kZXNbMF0pKTsNCiAgICByZXR1cm4gbm9kZXM7DQogIH0NCg0KICBwYXJ0aXRpb24uc2l6ZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOw0KICAgIHNpemUgPSB4Ow0KICAgIHJldHVybiBwYXJ0aXRpb247DQogIH07DQoNCiAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQocGFydGl0aW9uLCBoaWVyYXJjaHkpOw0KfTsNCmQzLmxheW91dC5waWUgPSBmdW5jdGlvbigpIHsNCiAgdmFyIHZhbHVlID0gTnVtYmVyLA0KICAgICAgc29ydCA9IGQzX2xheW91dF9waWVTb3J0QnlWYWx1ZSwNCiAgICAgIHN0YXJ0QW5nbGUgPSAwLA0KICAgICAgZW5kQW5nbGUgPSAyICogTWF0aC5QSTsNCg0KICBmdW5jdGlvbiBwaWUoZGF0YSwgaSkgew0KDQogICAgLy8gQ29tcHV0ZSB0aGUgbnVtZXJpYyB2YWx1ZXMgZm9yIGVhY2ggZGF0YSBlbGVtZW50Lg0KICAgIHZhciB2YWx1ZXMgPSBkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7IHJldHVybiArdmFsdWUuY2FsbChwaWUsIGQsIGkpOyB9KTsNCg0KICAgIC8vIENvbXB1dGUgdGhlIHN0YXJ0IGFuZ2xlLg0KICAgIHZhciBhID0gKyh0eXBlb2Ygc3RhcnRBbmdsZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgICA/IHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKQ0KICAgICAgICA6IHN0YXJ0QW5nbGUpOw0KDQogICAgLy8gQ29tcHV0ZSB0aGUgYW5ndWxhciBzY2FsZSBmYWN0b3I6IGZyb20gdmFsdWUgdG8gcmFkaWFucy4NCiAgICB2YXIgayA9ICgodHlwZW9mIGVuZEFuZ2xlID09PSAiZnVuY3Rpb24iDQogICAgICAgID8gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKQ0KICAgICAgICA6IGVuZEFuZ2xlKSAtIHN0YXJ0QW5nbGUpDQogICAgICAgIC8gZDMuc3VtKHZhbHVlcyk7DQoNCiAgICAvLyBPcHRpb25hbGx5IHNvcnQgdGhlIGRhdGEuDQogICAgdmFyIGluZGV4ID0gZDMucmFuZ2UoZGF0YS5sZW5ndGgpOw0KICAgIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoc29ydCA9PT0gZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlDQogICAgICAgID8gZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gdmFsdWVzW2pdIC0gdmFsdWVzW2ldOyB9DQogICAgICAgIDogZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydChkYXRhW2ldLCBkYXRhW2pdKTsgfSk7DQoNCiAgICAvLyBDb21wdXRlIHRoZSBhcmNzIQ0KICAgIC8vIFRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgb3JpZ2luYWwgZGF0YSdzIG9yZGVyLg0KICAgIHZhciBhcmNzID0gW107DQogICAgaW5kZXguZm9yRWFjaChmdW5jdGlvbihpKSB7DQogICAgICBhcmNzW2ldID0gew0KICAgICAgICBkYXRhOiBkYXRhW2ldLA0KICAgICAgICB2YWx1ZTogZCA9IHZhbHVlc1tpXSwNCiAgICAgICAgc3RhcnRBbmdsZTogYSwNCiAgICAgICAgZW5kQW5nbGU6IGEgKz0gZCAqIGsNCiAgICAgIH07DQogICAgfSk7DQogICAgcmV0dXJuIGFyY3M7DQogIH0NCg0KICAvKioNCiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmdW5jdGlvbiAqeCosIHdoaWNoIHJldHVybnMgYSBub25uZWdhdGl2ZSBudW1lcmljIHZhbHVlDQogICAqIGZvciBlYWNoIGRhdHVtLiBUaGUgZGVmYXVsdCB2YWx1ZSBmdW5jdGlvbiBpcyBgTnVtYmVyYC4gVGhlIHZhbHVlIGZ1bmN0aW9uDQogICAqIGlzIHBhc3NlZCB0d28gYXJndW1lbnRzOiB0aGUgY3VycmVudCBkYXR1bSBhbmQgdGhlIGN1cnJlbnQgaW5kZXguDQogICAqLw0KICBwaWUudmFsdWUgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWU7DQogICAgdmFsdWUgPSB4Ow0KICAgIHJldHVybiBwaWU7DQogIH07DQoNCiAgLyoqDQogICAqIFNwZWNpZmllcyBhIHNvcnQgY29tcGFyaXNvbiBvcGVyYXRvciAqeCouIFRoZSBjb21wYXJhdG9yIGlzIHBhc3NlZCB0d28gZGF0YQ0KICAgKiBlbGVtZW50cyBmcm9tIHRoZSBkYXRhIGFycmF5LCBhIGFuZCBiOyBpdCByZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgaWYgYSBpcw0KICAgKiBsZXNzIHRoYW4gYiwgYSBwb3NpdGl2ZSB2YWx1ZSBpZiBhIGlzIGdyZWF0ZXIgdGhhbiBiLCBhbmQgemVybyBpZiBhIGVxdWFscw0KICAgKiBiLg0KICAgKi8NCiAgcGllLnNvcnQgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydDsNCiAgICBzb3J0ID0geDsNCiAgICByZXR1cm4gcGllOw0KICB9Ow0KDQogIC8qKg0KICAgKiBTcGVjaWZpZXMgdGhlIG92ZXJhbGwgc3RhcnQgYW5nbGUgb2YgdGhlIHBpZSBjaGFydC4gRGVmYXVsdHMgdG8gMC4gVGhlDQogICAqIHN0YXJ0IGFuZ2xlIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgY29uc3RhbnQgb3IgYXMgYSBmdW5jdGlvbjsgaW4gdGhlDQogICAqIGNhc2Ugb2YgYSBmdW5jdGlvbiwgaXQgaXMgZXZhbHVhdGVkIG9uY2UgcGVyIGFycmF5IChhcyBvcHBvc2VkIHRvIHBlcg0KICAgKiBlbGVtZW50KS4NCiAgICovDQogIHBpZS5zdGFydEFuZ2xlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7DQogICAgc3RhcnRBbmdsZSA9IHg7DQogICAgcmV0dXJuIHBpZTsNCiAgfTsNCg0KICAvKioNCiAgICogU3BlY2lmaWVzIHRoZSBvdmVyYWxsIGVuZCBhbmdsZSBvZiB0aGUgcGllIGNoYXJ0LiBEZWZhdWx0cyB0byAyz4AuIFRoZQ0KICAgKiBlbmQgYW5nbGUgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgYXMgYSBjb25zdGFudCBvciBhcyBhIGZ1bmN0aW9uOyBpbiB0aGUNCiAgICogY2FzZSBvZiBhIGZ1bmN0aW9uLCBpdCBpcyBldmFsdWF0ZWQgb25jZSBwZXIgYXJyYXkgKGFzIG9wcG9zZWQgdG8gcGVyDQogICAqIGVsZW1lbnQpLg0KICAgKi8NCiAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVuZEFuZ2xlOw0KICAgIGVuZEFuZ2xlID0geDsNCiAgICByZXR1cm4gcGllOw0KICB9Ow0KDQogIHJldHVybiBwaWU7DQp9Ow0KDQp2YXIgZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlID0ge307DQovLyBkYXRhIGlzIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiB4LHk7IHdlIHBvcHVsYXRlIHkwDQpkMy5sYXlvdXQuc3RhY2sgPSBmdW5jdGlvbigpIHsNCiAgdmFyIHZhbHVlcyA9IE9iamVjdCwNCiAgICAgIG9yZGVyID0gZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0LA0KICAgICAgb2Zmc2V0ID0gZDNfbGF5b3V0X3N0YWNrT2Zmc2V0WmVybywNCiAgICAgIG91dCA9IGQzX2xheW91dF9zdGFja091dCwNCiAgICAgIHggPSBkM19sYXlvdXRfc3RhY2tYLA0KICAgICAgeSA9IGQzX2xheW91dF9zdGFja1k7DQoNCiAgZnVuY3Rpb24gc3RhY2soZGF0YSwgaW5kZXgpIHsNCg0KICAgIC8vIENvbnZlcnQgc2VyaWVzIHRvIGNhbm9uaWNhbCB0d28tZGltZW5zaW9uYWwgcmVwcmVzZW50YXRpb24uDQogICAgdmFyIHNlcmllcyA9IGRhdGEubWFwKGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgIHJldHVybiB2YWx1ZXMuY2FsbChzdGFjaywgZCwgaSk7DQogICAgfSk7DQoNCiAgICAvLyBDb252ZXJ0IGVhY2ggc2VyaWVzIHRvIGNhbm9uaWNhbCBbW3gseV1dIHJlcHJlc2VudGF0aW9uLg0KICAgIHZhciBwb2ludHMgPSBzZXJpZXMubWFwKGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgIHJldHVybiBkLm1hcChmdW5jdGlvbih2LCBpKSB7DQogICAgICAgIHJldHVybiBbeC5jYWxsKHN0YWNrLCB2LCBpKSwgeS5jYWxsKHN0YWNrLCB2LCBpKV07DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIC8vIENvbXB1dGUgdGhlIG9yZGVyIG9mIHNlcmllcywgYW5kIHBlcm11dGUgdGhlbS4NCiAgICB2YXIgb3JkZXJzID0gb3JkZXIuY2FsbChzdGFjaywgcG9pbnRzLCBpbmRleCk7DQogICAgc2VyaWVzID0gZDMucGVybXV0ZShzZXJpZXMsIG9yZGVycyk7DQogICAgcG9pbnRzID0gZDMucGVybXV0ZShwb2ludHMsIG9yZGVycyk7DQoNCiAgICAvLyBDb21wdXRlIHRoZSBiYXNlbGluZeKAPw0KICAgIHZhciBvZmZzZXRzID0gb2Zmc2V0LmNhbGwoc3RhY2ssIHBvaW50cywgaW5kZXgpOw0KDQogICAgLy8gQW5kIHByb3BhZ2F0ZSBpdCB0byBvdGhlciBzZXJpZXMuDQogICAgdmFyIG4gPSBzZXJpZXMubGVuZ3RoLA0KICAgICAgICBtID0gc2VyaWVzWzBdLmxlbmd0aCwNCiAgICAgICAgaSwNCiAgICAgICAgaiwNCiAgICAgICAgbzsNCiAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgICBvdXQuY2FsbChzdGFjaywgc2VyaWVzWzBdW2pdLCBvID0gb2Zmc2V0c1tqXSwgcG9pbnRzWzBdW2pdWzFdKTsNCiAgICAgIGZvciAoaSA9IDE7IGkgPCBuOyArK2kpIHsNCiAgICAgICAgb3V0LmNhbGwoc3RhY2ssIHNlcmllc1tpXVtqXSwgbyArPSBwb2ludHNbaSAtIDFdW2pdWzFdLCBwb2ludHNbaV1bal1bMV0pOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBkYXRhOw0KICB9DQoNCiAgc3RhY2sudmFsdWVzID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlczsNCiAgICB2YWx1ZXMgPSB4Ow0KICAgIHJldHVybiBzdGFjazsNCiAgfTsNCg0KICBzdGFjay5vcmRlciA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmRlcjsNCiAgICBvcmRlciA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGQzX2xheW91dF9zdGFja09yZGVycy5nZXQoeCkgfHwgZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0Ow0KICAgIHJldHVybiBzdGFjazsNCiAgfTsNCg0KICBzdGFjay5vZmZzZXQgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb2Zmc2V0Ow0KICAgIG9mZnNldCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGQzX2xheW91dF9zdGFja09mZnNldHMuZ2V0KHgpIHx8IGQzX2xheW91dF9zdGFja09mZnNldFplcm87DQogICAgcmV0dXJuIHN0YWNrOw0KICB9Ow0KDQogIHN0YWNrLnggPSBmdW5jdGlvbih6KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDsNCiAgICB4ID0gejsNCiAgICByZXR1cm4gc3RhY2s7DQogIH07DQoNCiAgc3RhY2sueSA9IGZ1bmN0aW9uKHopIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5Ow0KICAgIHkgPSB6Ow0KICAgIHJldHVybiBzdGFjazsNCiAgfTsNCg0KICBzdGFjay5vdXQgPSBmdW5jdGlvbih6KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3V0Ow0KICAgIG91dCA9IHo7DQogICAgcmV0dXJuIHN0YWNrOw0KICB9Ow0KDQogIHJldHVybiBzdGFjazsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrWChkKSB7DQogIHJldHVybiBkLng7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9zdGFja1koZCkgew0KICByZXR1cm4gZC55Ow0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPdXQoZCwgeTAsIHkpIHsNCiAgZC55MCA9IHkwOw0KICBkLnkgPSB5Ow0KfQ0KDQp2YXIgZDNfbGF5b3V0X3N0YWNrT3JkZXJzID0gZDMubWFwKHsNCg0KICAiaW5zaWRlLW91dCI6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLA0KICAgICAgICBpLA0KICAgICAgICBqLA0KICAgICAgICBtYXggPSBkYXRhLm1hcChkM19sYXlvdXRfc3RhY2tNYXhJbmRleCksDQogICAgICAgIHN1bXMgPSBkYXRhLm1hcChkM19sYXlvdXRfc3RhY2tSZWR1Y2VTdW0pLA0KICAgICAgICBpbmRleCA9IGQzLnJhbmdlKG4pLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gbWF4W2FdIC0gbWF4W2JdOyB9KSwNCiAgICAgICAgdG9wID0gMCwNCiAgICAgICAgYm90dG9tID0gMCwNCiAgICAgICAgdG9wcyA9IFtdLA0KICAgICAgICBib3R0b21zID0gW107DQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgaiA9IGluZGV4W2ldOw0KICAgICAgaWYgKHRvcCA8IGJvdHRvbSkgew0KICAgICAgICB0b3AgKz0gc3Vtc1tqXTsNCiAgICAgICAgdG9wcy5wdXNoKGopOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgYm90dG9tICs9IHN1bXNbal07DQogICAgICAgIGJvdHRvbXMucHVzaChqKTsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGJvdHRvbXMucmV2ZXJzZSgpLmNvbmNhdCh0b3BzKTsNCiAgfSwNCg0KICAicmV2ZXJzZSI6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICByZXR1cm4gZDMucmFuZ2UoZGF0YS5sZW5ndGgpLnJldmVyc2UoKTsNCiAgfSwNCg0KICAiZGVmYXVsdCI6IGQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdA0KDQp9KTsNCg0KdmFyIGQzX2xheW91dF9zdGFja09mZnNldHMgPSBkMy5tYXAoew0KDQogICJzaWxob3VldHRlIjogZnVuY3Rpb24oZGF0YSkgew0KICAgIHZhciBuID0gZGF0YS5sZW5ndGgsDQogICAgICAgIG0gPSBkYXRhWzBdLmxlbmd0aCwNCiAgICAgICAgc3VtcyA9IFtdLA0KICAgICAgICBtYXggPSAwLA0KICAgICAgICBpLA0KICAgICAgICBqLA0KICAgICAgICBvLA0KICAgICAgICB5MCA9IFtdOw0KICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICAgIGZvciAoaSA9IDAsIG8gPSAwOyBpIDwgbjsgaSsrKSBvICs9IGRhdGFbaV1bal1bMV07DQogICAgICBpZiAobyA+IG1heCkgbWF4ID0gbzsNCiAgICAgIHN1bXMucHVzaChvKTsNCiAgICB9DQogICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgew0KICAgICAgeTBbal0gPSAobWF4IC0gc3Vtc1tqXSkgLyAyOw0KICAgIH0NCiAgICByZXR1cm4geTA7DQogIH0sDQoNCiAgIndpZ2dsZSI6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLA0KICAgICAgICB4ID0gZGF0YVswXSwNCiAgICAgICAgbSA9IHgubGVuZ3RoLA0KICAgICAgICBtYXggPSAwLA0KICAgICAgICBpLA0KICAgICAgICBqLA0KICAgICAgICBrLA0KICAgICAgICBzMSwNCiAgICAgICAgczIsDQogICAgICAgIHMzLA0KICAgICAgICBkeCwNCiAgICAgICAgbywNCiAgICAgICAgbzAsDQogICAgICAgIHkwID0gW107DQogICAgeTBbMF0gPSBvID0gbzAgPSAwOw0KICAgIGZvciAoaiA9IDE7IGogPCBtOyArK2opIHsNCiAgICAgIGZvciAoaSA9IDAsIHMxID0gMDsgaSA8IG47ICsraSkgczEgKz0gZGF0YVtpXVtqXVsxXTsNCiAgICAgIGZvciAoaSA9IDAsIHMyID0gMCwgZHggPSB4W2pdWzBdIC0geFtqIC0gMV1bMF07IGkgPCBuOyArK2kpIHsNCiAgICAgICAgZm9yIChrID0gMCwgczMgPSAoZGF0YVtpXVtqXVsxXSAtIGRhdGFbaV1baiAtIDFdWzFdKSAvICgyICogZHgpOyBrIDwgaTsgKytrKSB7DQogICAgICAgICAgczMgKz0gKGRhdGFba11bal1bMV0gLSBkYXRhW2tdW2ogLSAxXVsxXSkgLyBkeDsNCiAgICAgICAgfQ0KICAgICAgICBzMiArPSBzMyAqIGRhdGFbaV1bal1bMV07DQogICAgICB9DQogICAgICB5MFtqXSA9IG8gLT0gczEgPyBzMiAvIHMxICogZHggOiAwOw0KICAgICAgaWYgKG8gPCBvMCkgbzAgPSBvOw0KICAgIH0NCiAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB5MFtqXSAtPSBvMDsNCiAgICByZXR1cm4geTA7DQogIH0sDQoNCiAgImV4cGFuZCI6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLA0KICAgICAgICBtID0gZGF0YVswXS5sZW5ndGgsDQogICAgICAgIGsgPSAxIC8gbiwNCiAgICAgICAgaSwNCiAgICAgICAgaiwNCiAgICAgICAgbywNCiAgICAgICAgeTAgPSBbXTsNCiAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgICBmb3IgKGkgPSAwLCBvID0gMDsgaSA8IG47IGkrKykgbyArPSBkYXRhW2ldW2pdWzFdOw0KICAgICAgaWYgKG8pIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIGRhdGFbaV1bal1bMV0gLz0gbzsNCiAgICAgIGVsc2UgZm9yIChpID0gMDsgaSA8IG47IGkrKykgZGF0YVtpXVtqXVsxXSA9IGs7DQogICAgfQ0KICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHkwW2pdID0gMDsNCiAgICByZXR1cm4geTA7DQogIH0sDQoNCiAgInplcm8iOiBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvDQoNCn0pOw0KDQpmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHQoZGF0YSkgew0KICByZXR1cm4gZDMucmFuZ2UoZGF0YS5sZW5ndGgpOw0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvKGRhdGEpIHsNCiAgdmFyIGogPSAtMSwNCiAgICAgIG0gPSBkYXRhWzBdLmxlbmd0aCwNCiAgICAgIHkwID0gW107DQogIHdoaWxlICgrK2ogPCBtKSB5MFtqXSA9IDA7DQogIHJldHVybiB5MDsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrTWF4SW5kZXgoYXJyYXkpIHsNCiAgdmFyIGkgPSAxLA0KICAgICAgaiA9IDAsDQogICAgICB2ID0gYXJyYXlbMF1bMV0sDQogICAgICBrLA0KICAgICAgbiA9IGFycmF5Lmxlbmd0aDsNCiAgZm9yICg7IGkgPCBuOyArK2kpIHsNCiAgICBpZiAoKGsgPSBhcnJheVtpXVsxXSkgPiB2KSB7DQogICAgICBqID0gaTsNCiAgICAgIHYgPSBrOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gajsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrUmVkdWNlU3VtKGQpIHsNCiAgcmV0dXJuIGQucmVkdWNlKGQzX2xheW91dF9zdGFja1N1bSwgMCk7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9zdGFja1N1bShwLCBkKSB7DQogIHJldHVybiBwICsgZFsxXTsNCn0NCmQzLmxheW91dC5oaXN0b2dyYW0gPSBmdW5jdGlvbigpIHsNCiAgdmFyIGZyZXF1ZW5jeSA9IHRydWUsDQogICAgICB2YWx1ZXIgPSBOdW1iZXIsDQogICAgICByYW5nZXIgPSBkM19sYXlvdXRfaGlzdG9ncmFtUmFuZ2UsDQogICAgICBiaW5uZXIgPSBkM19sYXlvdXRfaGlzdG9ncmFtQmluU3R1cmdlczsNCg0KICBmdW5jdGlvbiBoaXN0b2dyYW0oZGF0YSwgaSkgew0KICAgIHZhciBiaW5zID0gW10sDQogICAgICAgIHZhbHVlcyA9IGRhdGEubWFwKHZhbHVlciwgdGhpcyksDQogICAgICAgIHJhbmdlID0gcmFuZ2VyLmNhbGwodGhpcywgdmFsdWVzLCBpKSwNCiAgICAgICAgdGhyZXNob2xkcyA9IGJpbm5lci5jYWxsKHRoaXMsIHJhbmdlLCB2YWx1ZXMsIGkpLA0KICAgICAgICBiaW4sDQogICAgICAgIGkgPSAtMSwNCiAgICAgICAgbiA9IHZhbHVlcy5sZW5ndGgsDQogICAgICAgIG0gPSB0aHJlc2hvbGRzLmxlbmd0aCAtIDEsDQogICAgICAgIGsgPSBmcmVxdWVuY3kgPyAxIDogMSAvIG4sDQogICAgICAgIHg7DQoNCiAgICAvLyBJbml0aWFsaXplIHRoZSBiaW5zLg0KICAgIHdoaWxlICgrK2kgPCBtKSB7DQogICAgICBiaW4gPSBiaW5zW2ldID0gW107DQogICAgICBiaW4uZHggPSB0aHJlc2hvbGRzW2kgKyAxXSAtIChiaW4ueCA9IHRocmVzaG9sZHNbaV0pOw0KICAgICAgYmluLnkgPSAwOw0KICAgIH0NCg0KICAgIC8vIEZpbGwgdGhlIGJpbnMsIGlnbm9yaW5nIHZhbHVlcyBvdXRzaWRlIHRoZSByYW5nZS4NCiAgICBpID0gLTE7IHdoaWxlKCsraSA8IG4pIHsNCiAgICAgIHggPSB2YWx1ZXNbaV07DQogICAgICBpZiAoKHggPj0gcmFuZ2VbMF0pICYmICh4IDw9IHJhbmdlWzFdKSkgew0KICAgICAgICBiaW4gPSBiaW5zW2QzLmJpc2VjdCh0aHJlc2hvbGRzLCB4LCAxLCBtKSAtIDFdOw0KICAgICAgICBiaW4ueSArPSBrOw0KICAgICAgICBiaW4ucHVzaChkYXRhW2ldKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gYmluczsNCiAgfQ0KDQogIC8vIFNwZWNpZmllcyBob3cgdG8gZXh0cmFjdCBhIHZhbHVlIGZyb20gdGhlIGFzc29jaWF0ZWQgZGF0YS4gVGhlIGRlZmF1bHQNCiAgLy8gdmFsdWUgZnVuY3Rpb24gaXMgYE51bWJlcmAsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGlkZW50aXR5IGZ1bmN0aW9uLg0KICBoaXN0b2dyYW0udmFsdWUgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWVyOw0KICAgIHZhbHVlciA9IHg7DQogICAgcmV0dXJuIGhpc3RvZ3JhbTsNCiAgfTsNCg0KICAvLyBTcGVjaWZpZXMgdGhlIHJhbmdlIG9mIHRoZSBoaXN0b2dyYW0uIFZhbHVlcyBvdXRzaWRlIHRoZSBzcGVjaWZpZWQgcmFuZ2UNCiAgLy8gd2lsbCBiZSBpZ25vcmVkLiBUaGUgYXJndW1lbnQgYHhgIG1heSBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgdHdvLWVsZW1lbnQNCiAgLy8gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlIG9mIHRoZSByYW5nZSwgb3IgYXMgYQ0KICAvLyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJhbmdlIGdpdmVuIHRoZSBhcnJheSBvZiB2YWx1ZXMgYW5kIHRoZSBjdXJyZW50DQogIC8vIGluZGV4IGBpYC4gVGhlIGRlZmF1bHQgcmFuZ2UgaXMgdGhlIGV4dGVudCAobWluaW11bSBhbmQgbWF4aW11bSkgb2YgdGhlDQogIC8vIHZhbHVlcy4NCiAgaGlzdG9ncmFtLnJhbmdlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlcjsNCiAgICByYW5nZXIgPSBkMy5mdW5jdG9yKHgpOw0KICAgIHJldHVybiBoaXN0b2dyYW07DQogIH07DQoNCiAgLy8gU3BlY2lmaWVzIGhvdyB0byBiaW4gdmFsdWVzIGluIHRoZSBoaXN0b2dyYW0uIFRoZSBhcmd1bWVudCBgeGAgbWF5IGJlDQogIC8vIHNwZWNpZmllZCBhcyBhIG51bWJlciwgaW4gd2hpY2ggY2FzZSB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHdpbGwgYmUgc3BsaXQNCiAgLy8gdW5pZm9ybWx5IGludG8gdGhlIGdpdmVuIG51bWJlciBvZiBiaW5zLiBPciwgYHhgIG1heSBiZSBhbiBhcnJheSBvZg0KICAvLyB0aHJlc2hvbGQgdmFsdWVzLCBkZWZpbmluZyB0aGUgYmluczsgdGhlIHNwZWNpZmllZCBhcnJheSBtdXN0IGNvbnRhaW4gdGhlDQogIC8vIHJpZ2h0bW9zdCAodXBwZXIpIHZhbHVlLCB0aHVzIHNwZWNpZnlpbmcgbiArIDEgdmFsdWVzIGZvciBuIGJpbnMuIE9yLCBgeGANCiAgLy8gbWF5IGJlIGEgZnVuY3Rpb24gd2hpY2ggaXMgZXZhbHVhdGVkLCBiZWluZyBwYXNzZWQgdGhlIHJhbmdlLCB0aGUgYXJyYXkgb2YNCiAgLy8gdmFsdWVzLCBhbmQgdGhlIGN1cnJlbnQgaW5kZXggYGlgLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhyZXNob2xkcy4gVGhlDQogIC8vIGRlZmF1bHQgYmluIGZ1bmN0aW9uIHdpbGwgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB1bmlmb3JtIGJpbnMgdXNpbmcNCiAgLy8gU3R1cmdlcycgZm9ybXVsYS4NCiAgaGlzdG9ncmFtLmJpbnMgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gYmlubmVyOw0KICAgIGJpbm5lciA9IHR5cGVvZiB4ID09PSAibnVtYmVyIg0KICAgICAgICA/IGZ1bmN0aW9uKHJhbmdlKSB7IHJldHVybiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIHgpOyB9DQogICAgICAgIDogZDMuZnVuY3Rvcih4KTsNCiAgICByZXR1cm4gaGlzdG9ncmFtOw0KICB9Ow0KDQogIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoaXN0b2dyYW0ncyBgeWAgdmFsdWUgaXMgYSBjb3VudCAoZnJlcXVlbmN5KSBvciBhDQogIC8vIHByb2JhYmlsaXR5IChkZW5zaXR5KS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4NCiAgaGlzdG9ncmFtLmZyZXF1ZW5jeSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmcmVxdWVuY3k7DQogICAgZnJlcXVlbmN5ID0gISF4Ow0KICAgIHJldHVybiBoaXN0b2dyYW07DQogIH07DQoNCiAgcmV0dXJuIGhpc3RvZ3JhbTsNCn07DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1CaW5TdHVyZ2VzKHJhbmdlLCB2YWx1ZXMpIHsNCiAgcmV0dXJuIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlcy5sZW5ndGgpIC8gTWF0aC5MTjIgKyAxKSk7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgbikgew0KICB2YXIgeCA9IC0xLA0KICAgICAgYiA9ICtyYW5nZVswXSwNCiAgICAgIG0gPSAocmFuZ2VbMV0gLSBiKSAvIG4sDQogICAgICBmID0gW107DQogIHdoaWxlICgrK3ggPD0gbikgZlt4XSA9IG0gKiB4ICsgYjsNCiAgcmV0dXJuIGY7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1SYW5nZSh2YWx1ZXMpIHsNCiAgcmV0dXJuIFtkMy5taW4odmFsdWVzKSwgZDMubWF4KHZhbHVlcyldOw0KfQ0KZDMubGF5b3V0LmhpZXJhcmNoeSA9IGZ1bmN0aW9uKCkgew0KICB2YXIgc29ydCA9IGQzX2xheW91dF9oaWVyYXJjaHlTb3J0LA0KICAgICAgY2hpbGRyZW4gPSBkM19sYXlvdXRfaGllcmFyY2h5Q2hpbGRyZW4sDQogICAgICB2YWx1ZSA9IGQzX2xheW91dF9oaWVyYXJjaHlWYWx1ZTsNCg0KICAvLyBSZWN1cnNpdmVseSBjb21wdXRlIHRoZSBub2RlIGRlcHRoIGFuZCB2YWx1ZS4NCiAgLy8gQWxzbyBjb252ZXJ0cyB0aGUgZGF0YSByZXByZXNlbnRhdGlvbiBpbnRvIGEgc3RhbmRhcmQgaGllcmFyY2h5IHN0cnVjdHVyZS4NCiAgZnVuY3Rpb24gcmVjdXJzZShkYXRhLCBkZXB0aCwgbm9kZXMpIHsNCiAgICB2YXIgY2hpbGRzID0gY2hpbGRyZW4uY2FsbChoaWVyYXJjaHksIGRhdGEsIGRlcHRoKSwNCiAgICAgICAgbm9kZSA9IGQzX2xheW91dF9oaWVyYXJjaHlJbmxpbmUgPyBkYXRhIDoge2RhdGE6IGRhdGF9Ow0KICAgIG5vZGUuZGVwdGggPSBkZXB0aDsNCiAgICBub2Rlcy5wdXNoKG5vZGUpOw0KICAgIGlmIChjaGlsZHMgJiYgKG4gPSBjaGlsZHMubGVuZ3RoKSkgew0KICAgICAgdmFyIGkgPSAtMSwNCiAgICAgICAgICBuLA0KICAgICAgICAgIGMgPSBub2RlLmNoaWxkcmVuID0gW10sDQogICAgICAgICAgdiA9IDAsDQogICAgICAgICAgaiA9IGRlcHRoICsgMTsNCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICAgIGQgPSByZWN1cnNlKGNoaWxkc1tpXSwgaiwgbm9kZXMpOw0KICAgICAgICBkLnBhcmVudCA9IG5vZGU7DQogICAgICAgIGMucHVzaChkKTsNCiAgICAgICAgdiArPSBkLnZhbHVlOw0KICAgICAgfQ0KICAgICAgaWYgKHNvcnQpIGMuc29ydChzb3J0KTsNCiAgICAgIGlmICh2YWx1ZSkgbm9kZS52YWx1ZSA9IHY7DQogICAgfSBlbHNlIGlmICh2YWx1ZSkgew0KICAgICAgbm9kZS52YWx1ZSA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgZGF0YSwgZGVwdGgpIHx8IDA7DQogICAgfQ0KICAgIHJldHVybiBub2RlOw0KICB9DQoNCiAgLy8gUmVjdXJzaXZlbHkgcmUtZXZhbHVhdGVzIHRoZSBub2RlIHZhbHVlLg0KICBmdW5jdGlvbiByZXZhbHVlKG5vZGUsIGRlcHRoKSB7DQogICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwNCiAgICAgICAgdiA9IDA7DQogICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgew0KICAgICAgdmFyIGkgPSAtMSwNCiAgICAgICAgICBuLA0KICAgICAgICAgIGogPSBkZXB0aCArIDE7DQogICAgICB3aGlsZSAoKytpIDwgbikgdiArPSByZXZhbHVlKGNoaWxkcmVuW2ldLCBqKTsNCiAgICB9IGVsc2UgaWYgKHZhbHVlKSB7DQogICAgICB2ID0gK3ZhbHVlLmNhbGwoaGllcmFyY2h5LCBkM19sYXlvdXRfaGllcmFyY2h5SW5saW5lID8gbm9kZSA6IG5vZGUuZGF0YSwgZGVwdGgpIHx8IDA7DQogICAgfQ0KICAgIGlmICh2YWx1ZSkgbm9kZS52YWx1ZSA9IHY7DQogICAgcmV0dXJuIHY7DQogIH0NCg0KICBmdW5jdGlvbiBoaWVyYXJjaHkoZCkgew0KICAgIHZhciBub2RlcyA9IFtdOw0KICAgIHJlY3Vyc2UoZCwgMCwgbm9kZXMpOw0KICAgIHJldHVybiBub2RlczsNCiAgfQ0KDQogIGhpZXJhcmNoeS5zb3J0ID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnQ7DQogICAgc29ydCA9IHg7DQogICAgcmV0dXJuIGhpZXJhcmNoeTsNCiAgfTsNCg0KICBoaWVyYXJjaHkuY2hpbGRyZW4gPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2hpbGRyZW47DQogICAgY2hpbGRyZW4gPSB4Ow0KICAgIHJldHVybiBoaWVyYXJjaHk7DQogIH07DQoNCiAgaGllcmFyY2h5LnZhbHVlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlOw0KICAgIHZhbHVlID0geDsNCiAgICByZXR1cm4gaGllcmFyY2h5Ow0KICB9Ow0KDQogIC8vIFJlLWV2YWx1YXRlcyB0aGUgYHZhbHVlYCBwcm9wZXJ0eSBmb3IgdGhlIHNwZWNpZmllZCBoaWVyYXJjaHkuDQogIGhpZXJhcmNoeS5yZXZhbHVlID0gZnVuY3Rpb24ocm9vdCkgew0KICAgIHJldmFsdWUocm9vdCwgMCk7DQogICAgcmV0dXJuIHJvb3Q7DQogIH07DQoNCiAgcmV0dXJuIGhpZXJhcmNoeTsNCn07DQoNCi8vIEEgbWV0aG9kIGFzc2lnbm1lbnQgaGVscGVyIGZvciBoaWVyYXJjaHkgc3ViY2xhc3Nlcy4NCmZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQob2JqZWN0LCBoaWVyYXJjaHkpIHsNCiAgZDMucmViaW5kKG9iamVjdCwgaGllcmFyY2h5LCAic29ydCIsICJjaGlsZHJlbiIsICJ2YWx1ZSIpOw0KDQogIC8vIEFkZCBhbiBhbGlhcyBmb3IgbGlua3MsIGZvciBjb252ZW5pZW5jZS4NCiAgb2JqZWN0LmxpbmtzID0gZDNfbGF5b3V0X2hpZXJhcmNoeUxpbmtzOw0KDQogIC8vIElmIHRoZSBuZXcgQVBJIGlzIHVzZWQsIGVuYWJsaW5nIGlubGluaW5nLg0KICBvYmplY3Qubm9kZXMgPSBmdW5jdGlvbihkKSB7DQogICAgZDNfbGF5b3V0X2hpZXJhcmNoeUlubGluZSA9IHRydWU7DQogICAgcmV0dXJuIChvYmplY3Qubm9kZXMgPSBvYmplY3QpKGQpOw0KICB9Ow0KDQogIHJldHVybiBvYmplY3Q7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlDaGlsZHJlbihkKSB7DQogIHJldHVybiBkLmNoaWxkcmVuOw0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5VmFsdWUoZCkgew0KICByZXR1cm4gZC52YWx1ZTsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeVNvcnQoYSwgYikgew0KICByZXR1cm4gYi52YWx1ZSAtIGEudmFsdWU7DQp9DQoNCi8vIFJldHVybnMgYW4gYXJyYXkgc291cmNlK3RhcmdldCBvYmplY3RzIGZvciB0aGUgc3BlY2lmaWVkIG5vZGVzLg0KZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeUxpbmtzKG5vZGVzKSB7DQogIHJldHVybiBkMy5tZXJnZShub2Rlcy5tYXAoZnVuY3Rpb24ocGFyZW50KSB7DQogICAgcmV0dXJuIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLm1hcChmdW5jdGlvbihjaGlsZCkgew0KICAgICAgcmV0dXJuIHtzb3VyY2U6IHBhcmVudCwgdGFyZ2V0OiBjaGlsZH07DQogICAgfSk7DQogIH0pKTsNCn0NCg0KLy8gRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCBkb24ndCBlbmFibGUgaW5saW5pbmcgYnkgZGVmYXVsdC4NCnZhciBkM19sYXlvdXRfaGllcmFyY2h5SW5saW5lID0gZmFsc2U7DQpkMy5sYXlvdXQucGFjayA9IGZ1bmN0aW9uKCkgew0KICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQoZDNfbGF5b3V0X3BhY2tTb3J0KSwNCiAgICAgIHNpemUgPSBbMSwgMV07DQoNCiAgZnVuY3Rpb24gcGFjayhkLCBpKSB7DQogICAgdmFyIG5vZGVzID0gaGllcmFyY2h5LmNhbGwodGhpcywgZCwgaSksDQogICAgICAgIHJvb3QgPSBub2Rlc1swXTsNCg0KICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXB1dGUgdGhlIGxheW91dC4NCiAgICByb290LnggPSAwOw0KICAgIHJvb3QueSA9IDA7DQogICAgZDNfbGF5b3V0X3BhY2tUcmVlKHJvb3QpOw0KDQogICAgLy8gU2NhbGUgdGhlIGxheW91dCB0byBmaXQgdGhlIHJlcXVlc3RlZCBzaXplLg0KICAgIHZhciB3ID0gc2l6ZVswXSwNCiAgICAgICAgaCA9IHNpemVbMV0sDQogICAgICAgIGsgPSAxIC8gTWF0aC5tYXgoMiAqIHJvb3QuciAvIHcsIDIgKiByb290LnIgLyBoKTsNCiAgICBkM19sYXlvdXRfcGFja1RyYW5zZm9ybShyb290LCB3IC8gMiwgaCAvIDIsIGspOw0KDQogICAgcmV0dXJuIG5vZGVzOw0KICB9DQoNCiAgcGFjay5zaXplID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7DQogICAgc2l6ZSA9IHg7DQogICAgcmV0dXJuIHBhY2s7DQogIH07DQoNCiAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQocGFjaywgaGllcmFyY2h5KTsNCn07DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9wYWNrU29ydChhLCBiKSB7DQogIHJldHVybiBhLnZhbHVlIC0gYi52YWx1ZTsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tJbnNlcnQoYSwgYikgew0KICB2YXIgYyA9IGEuX3BhY2tfbmV4dDsNCiAgYS5fcGFja19uZXh0ID0gYjsNCiAgYi5fcGFja19wcmV2ID0gYTsNCiAgYi5fcGFja19uZXh0ID0gYzsNCiAgYy5fcGFja19wcmV2ID0gYjsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSwgYikgew0KICBhLl9wYWNrX25leHQgPSBiOw0KICBiLl9wYWNrX3ByZXYgPSBhOw0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfcGFja0ludGVyc2VjdHMoYSwgYikgew0KICB2YXIgZHggPSBiLnggLSBhLngsDQogICAgICBkeSA9IGIueSAtIGEueSwNCiAgICAgIGRyID0gYS5yICsgYi5yOw0KICByZXR1cm4gZHIgKiBkciAtIGR4ICogZHggLSBkeSAqIGR5ID4gLjAwMTsgLy8gd2l0aGluIGVwc2lsb24NCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tDaXJjbGUobm9kZXMpIHsNCiAgdmFyIHhNaW4gPSBJbmZpbml0eSwNCiAgICAgIHhNYXggPSAtSW5maW5pdHksDQogICAgICB5TWluID0gSW5maW5pdHksDQogICAgICB5TWF4ID0gLUluZmluaXR5LA0KICAgICAgbiA9IG5vZGVzLmxlbmd0aCwNCiAgICAgIGEsIGIsIGMsIGosIGs7DQoNCiAgZnVuY3Rpb24gYm91bmQobm9kZSkgew0KICAgIHhNaW4gPSBNYXRoLm1pbihub2RlLnggLSBub2RlLnIsIHhNaW4pOw0KICAgIHhNYXggPSBNYXRoLm1heChub2RlLnggKyBub2RlLnIsIHhNYXgpOw0KICAgIHlNaW4gPSBNYXRoLm1pbihub2RlLnkgLSBub2RlLnIsIHlNaW4pOw0KICAgIHlNYXggPSBNYXRoLm1heChub2RlLnkgKyBub2RlLnIsIHlNYXgpOw0KICB9DQoNCiAgLy8gQ3JlYXRlIG5vZGUgbGlua3MuDQogIG5vZGVzLmZvckVhY2goZDNfbGF5b3V0X3BhY2tMaW5rKTsNCg0KICAvLyBDcmVhdGUgZmlyc3Qgbm9kZS4NCiAgYSA9IG5vZGVzWzBdOw0KICBhLnggPSAtYS5yOw0KICBhLnkgPSAwOw0KICBib3VuZChhKTsNCg0KICAvLyBDcmVhdGUgc2Vjb25kIG5vZGUuDQogIGlmIChuID4gMSkgew0KICAgIGIgPSBub2Rlc1sxXTsNCiAgICBiLnggPSBiLnI7DQogICAgYi55ID0gMDsNCiAgICBib3VuZChiKTsNCg0KICAgIC8vIENyZWF0ZSB0aGlyZCBub2RlIGFuZCBidWlsZCBjaGFpbi4NCiAgICBpZiAobiA+IDIpIHsNCiAgICAgIGMgPSBub2Rlc1syXTsNCiAgICAgIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYyk7DQogICAgICBib3VuZChjKTsNCiAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGEsIGMpOw0KICAgICAgYS5fcGFja19wcmV2ID0gYzsNCiAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGMsIGIpOw0KICAgICAgYiA9IGEuX3BhY2tfbmV4dDsNCg0KICAgICAgLy8gTm93IGl0ZXJhdGUgdGhyb3VnaCB0aGUgcmVzdC4NCiAgICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbjsgaSsrKSB7DQogICAgICAgIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYyA9IG5vZGVzW2ldKTsNCg0KICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBjbG9zZXN0IGludGVyc2VjdGlvbi4NCiAgICAgICAgdmFyIGlzZWN0ID0gMCwgczEgPSAxLCBzMiA9IDE7DQogICAgICAgIGZvciAoaiA9IGIuX3BhY2tfbmV4dDsgaiAhPT0gYjsgaiA9IGouX3BhY2tfbmV4dCwgczErKykgew0KICAgICAgICAgIGlmIChkM19sYXlvdXRfcGFja0ludGVyc2VjdHMoaiwgYykpIHsNCiAgICAgICAgICAgIGlzZWN0ID0gMTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNlY3QgPT0gMSkgew0KICAgICAgICAgIGZvciAoayA9IGEuX3BhY2tfcHJldjsgayAhPT0gai5fcGFja19wcmV2OyBrID0gay5fcGFja19wcmV2LCBzMisrKSB7DQogICAgICAgICAgICBpZiAoZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGssIGMpKSB7DQogICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFVwZGF0ZSBub2RlIGNoYWluLg0KICAgICAgICBpZiAoaXNlY3QpIHsNCiAgICAgICAgICBpZiAoczEgPCBzMiB8fCAoczEgPT0gczIgJiYgYi5yIDwgYS5yKSkgZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSwgYiA9IGopOw0KICAgICAgICAgIGVsc2UgZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSA9IGssIGIpOw0KICAgICAgICAgIGktLTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBkM19sYXlvdXRfcGFja0luc2VydChhLCBjKTsNCiAgICAgICAgICBiID0gYzsNCiAgICAgICAgICBib3VuZChjKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIFJlLWNlbnRlciB0aGUgY2lyY2xlcyBhbmQgcmV0dXJuIHRoZSBlbmNvbXBhc3NpbmcgcmFkaXVzLg0KICB2YXIgY3ggPSAoeE1pbiArIHhNYXgpIC8gMiwNCiAgICAgIGN5ID0gKHlNaW4gKyB5TWF4KSAvIDIsDQogICAgICBjciA9IDA7DQogIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgdmFyIG5vZGUgPSBub2Rlc1tpXTsNCiAgICBub2RlLnggLT0gY3g7DQogICAgbm9kZS55IC09IGN5Ow0KICAgIGNyID0gTWF0aC5tYXgoY3IsIG5vZGUuciArIE1hdGguc3FydChub2RlLnggKiBub2RlLnggKyBub2RlLnkgKiBub2RlLnkpKTsNCiAgfQ0KDQogIC8vIFJlbW92ZSBub2RlIGxpbmtzLg0KICBub2Rlcy5mb3JFYWNoKGQzX2xheW91dF9wYWNrVW5saW5rKTsNCg0KICByZXR1cm4gY3I7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9wYWNrTGluayhub2RlKSB7DQogIG5vZGUuX3BhY2tfbmV4dCA9IG5vZGUuX3BhY2tfcHJldiA9IG5vZGU7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9wYWNrVW5saW5rKG5vZGUpIHsNCiAgZGVsZXRlIG5vZGUuX3BhY2tfbmV4dDsNCiAgZGVsZXRlIG5vZGUuX3BhY2tfcHJldjsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tUcmVlKG5vZGUpIHsNCiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCiAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgew0KICAgIGNoaWxkcmVuLmZvckVhY2goZDNfbGF5b3V0X3BhY2tUcmVlKTsNCiAgICBub2RlLnIgPSBkM19sYXlvdXRfcGFja0NpcmNsZShjaGlsZHJlbik7DQogIH0gZWxzZSB7DQogICAgbm9kZS5yID0gTWF0aC5zcXJ0KG5vZGUudmFsdWUpOw0KICB9DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9wYWNrVHJhbnNmb3JtKG5vZGUsIHgsIHksIGspIHsNCiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCiAgbm9kZS54ID0gKHggKz0gayAqIG5vZGUueCk7DQogIG5vZGUueSA9ICh5ICs9IGsgKiBub2RlLnkpOw0KICBub2RlLnIgKj0gazsNCiAgaWYgKGNoaWxkcmVuKSB7DQogICAgdmFyIGkgPSAtMSwgbiA9IGNoaWxkcmVuLmxlbmd0aDsNCiAgICB3aGlsZSAoKytpIDwgbikgZDNfbGF5b3V0X3BhY2tUcmFuc2Zvcm0oY2hpbGRyZW5baV0sIHgsIHksIGspOw0KICB9DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYykgew0KICB2YXIgZGIgPSBhLnIgKyBjLnIsDQogICAgICBkeCA9IGIueCAtIGEueCwNCiAgICAgIGR5ID0gYi55IC0gYS55Ow0KICBpZiAoZGIgJiYgKGR4IHx8IGR5KSkgew0KICAgIHZhciBkYSA9IGIuciArIGMuciwNCiAgICAgICAgZGMgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpLA0KICAgICAgICBjb3MgPSBNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgKGRiICogZGIgKyBkYyAqIGRjIC0gZGEgKiBkYSkgLyAoMiAqIGRiICogZGMpKSksDQogICAgICAgIHRoZXRhID0gTWF0aC5hY29zKGNvcyksDQogICAgICAgIHggPSBjb3MgKiAoZGIgLz0gZGMpLA0KICAgICAgICB5ID0gTWF0aC5zaW4odGhldGEpICogZGI7DQogICAgYy54ID0gYS54ICsgeCAqIGR4ICsgeSAqIGR5Ow0KICAgIGMueSA9IGEueSArIHggKiBkeSAtIHkgKiBkeDsNCiAgfSBlbHNlIHsNCiAgICBjLnggPSBhLnggKyBkYjsNCiAgICBjLnkgPSBhLnk7DQogIH0NCn0NCi8vIEltcGxlbWVudHMgYSBoaWVyYXJjaGljYWwgbGF5b3V0IHVzaW5nIHRoZSBjbHVzdGVyIChvciBkZW5kcm9ncmFtKQ0KLy8gYWxnb3JpdGhtLg0KZDMubGF5b3V0LmNsdXN0ZXIgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLA0KICAgICAgc2VwYXJhdGlvbiA9IGQzX2xheW91dF90cmVlU2VwYXJhdGlvbiwNCiAgICAgIHNpemUgPSBbMSwgMV07IC8vIHdpZHRoLCBoZWlnaHQNCg0KICBmdW5jdGlvbiBjbHVzdGVyKGQsIGkpIHsNCiAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwNCiAgICAgICAgcm9vdCA9IG5vZGVzWzBdLA0KICAgICAgICBwcmV2aW91c05vZGUsDQogICAgICAgIHggPSAwLA0KICAgICAgICBreCwNCiAgICAgICAga3k7DQoNCiAgICAvLyBGaXJzdCB3YWxrLCBjb21wdXRpbmcgdGhlIGluaXRpYWwgeCAmIHkgdmFsdWVzLg0KICAgIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihub2RlKSB7DQogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgew0KICAgICAgICBub2RlLnggPSBkM19sYXlvdXRfY2x1c3RlclgoY2hpbGRyZW4pOw0KICAgICAgICBub2RlLnkgPSBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbm9kZS54ID0gcHJldmlvdXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwOw0KICAgICAgICBub2RlLnkgPSAwOw0KICAgICAgICBwcmV2aW91c05vZGUgPSBub2RlOw0KICAgICAgfQ0KICAgIH0pOw0KDQogICAgLy8gQ29tcHV0ZSB0aGUgbGVmdC1tb3N0LCByaWdodC1tb3N0LCBhbmQgZGVwdGgtbW9zdCBub2RlcyBmb3IgZXh0ZW50cy4NCiAgICB2YXIgbGVmdCA9IGQzX2xheW91dF9jbHVzdGVyTGVmdChyb290KSwNCiAgICAgICAgcmlnaHQgPSBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KHJvb3QpLA0KICAgICAgICB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwNCiAgICAgICAgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyOw0KDQogICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUuDQogICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBzaXplWzBdOw0KICAgICAgbm9kZS55ID0gKDEgLSAocm9vdC55ID8gbm9kZS55IC8gcm9vdC55IDogMSkpICogc2l6ZVsxXTsNCiAgICB9KTsNCg0KICAgIHJldHVybiBub2RlczsNCiAgfQ0KDQogIGNsdXN0ZXIuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzZXBhcmF0aW9uOw0KICAgIHNlcGFyYXRpb24gPSB4Ow0KICAgIHJldHVybiBjbHVzdGVyOw0KICB9Ow0KDQogIGNsdXN0ZXIuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOw0KICAgIHNpemUgPSB4Ow0KICAgIHJldHVybiBjbHVzdGVyOw0KICB9Ow0KDQogIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKGNsdXN0ZXIsIGhpZXJhcmNoeSk7DQp9Ow0KDQpmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pIHsNCiAgcmV0dXJuIDEgKyBkMy5tYXgoY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7DQogICAgcmV0dXJuIGNoaWxkLnk7DQogIH0pOw0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclgoY2hpbGRyZW4pIHsNCiAgcmV0dXJuIGNoaWxkcmVuLnJlZHVjZShmdW5jdGlvbih4LCBjaGlsZCkgew0KICAgIHJldHVybiB4ICsgY2hpbGQueDsNCiAgfSwgMCkgLyBjaGlsZHJlbi5sZW5ndGg7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyTGVmdChub2RlKSB7DQogIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47DQogIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPyBkM19sYXlvdXRfY2x1c3RlckxlZnQoY2hpbGRyZW5bMF0pIDogbm9kZTsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X2NsdXN0ZXJSaWdodChub2RlKSB7DQogIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIG47DQogIHJldHVybiBjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkgPyBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KGNoaWxkcmVuW24gLSAxXSkgOiBub2RlOw0KfQ0KLy8gTm9kZS1saW5rIHRyZWUgZGlhZ3JhbSB1c2luZyB0aGUgUmVpbmdvbGQtVGlsZm9yZCAidGlkeSIgYWxnb3JpdGhtDQpkMy5sYXlvdXQudHJlZSA9IGZ1bmN0aW9uKCkgew0KICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksDQogICAgICBzZXBhcmF0aW9uID0gZDNfbGF5b3V0X3RyZWVTZXBhcmF0aW9uLA0KICAgICAgc2l6ZSA9IFsxLCAxXTsgLy8gd2lkdGgsIGhlaWdodA0KDQogIGZ1bmN0aW9uIHRyZWUoZCwgaSkgew0KICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpLA0KICAgICAgICByb290ID0gbm9kZXNbMF07DQoNCiAgICBmdW5jdGlvbiBmaXJzdFdhbGsobm9kZSwgcHJldmlvdXNTaWJsaW5nKSB7DQogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLA0KICAgICAgICAgIGxheW91dCA9IG5vZGUuX3RyZWU7DQogICAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7DQogICAgICAgIHZhciBuLA0KICAgICAgICAgICAgZmlyc3RDaGlsZCA9IGNoaWxkcmVuWzBdLA0KICAgICAgICAgICAgcHJldmlvdXNDaGlsZCwNCiAgICAgICAgICAgIGFuY2VzdG9yID0gZmlyc3RDaGlsZCwNCiAgICAgICAgICAgIGNoaWxkLA0KICAgICAgICAgICAgaSA9IC0xOw0KICAgICAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07DQogICAgICAgICAgZmlyc3RXYWxrKGNoaWxkLCBwcmV2aW91c0NoaWxkKTsNCiAgICAgICAgICBhbmNlc3RvciA9IGFwcG9ydGlvbihjaGlsZCwgcHJldmlvdXNDaGlsZCwgYW5jZXN0b3IpOw0KICAgICAgICAgIHByZXZpb3VzQ2hpbGQgPSBjaGlsZDsNCiAgICAgICAgfQ0KICAgICAgICBkM19sYXlvdXRfdHJlZVNoaWZ0KG5vZGUpOw0KICAgICAgICB2YXIgbWlkcG9pbnQgPSAuNSAqIChmaXJzdENoaWxkLl90cmVlLnByZWxpbSArIGNoaWxkLl90cmVlLnByZWxpbSk7DQogICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHsNCiAgICAgICAgICBsYXlvdXQucHJlbGltID0gcHJldmlvdXNTaWJsaW5nLl90cmVlLnByZWxpbSArIHNlcGFyYXRpb24obm9kZSwgcHJldmlvdXNTaWJsaW5nKTsNCiAgICAgICAgICBsYXlvdXQubW9kID0gbGF5b3V0LnByZWxpbSAtIG1pZHBvaW50Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGxheW91dC5wcmVsaW0gPSBtaWRwb2ludDsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKHByZXZpb3VzU2libGluZykgew0KICAgICAgICAgIGxheW91dC5wcmVsaW0gPSBwcmV2aW91c1NpYmxpbmcuX3RyZWUucHJlbGltICsgc2VwYXJhdGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2Vjb25kV2Fsayhub2RlLCB4KSB7DQogICAgICBub2RlLnggPSBub2RlLl90cmVlLnByZWxpbSArIHg7DQogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KICAgICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgew0KICAgICAgICB2YXIgaSA9IC0xLA0KICAgICAgICAgICAgbjsNCiAgICAgICAgeCArPSBub2RlLl90cmVlLm1vZDsNCiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgICAgICBzZWNvbmRXYWxrKGNoaWxkcmVuW2ldLCB4KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGFwcG9ydGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcsIGFuY2VzdG9yKSB7DQogICAgICBpZiAocHJldmlvdXNTaWJsaW5nKSB7DQogICAgICAgIHZhciB2aXAgPSBub2RlLA0KICAgICAgICAgICAgdm9wID0gbm9kZSwNCiAgICAgICAgICAgIHZpbSA9IHByZXZpb3VzU2libGluZywNCiAgICAgICAgICAgIHZvbSA9IG5vZGUucGFyZW50LmNoaWxkcmVuWzBdLA0KICAgICAgICAgICAgc2lwID0gdmlwLl90cmVlLm1vZCwNCiAgICAgICAgICAgIHNvcCA9IHZvcC5fdHJlZS5tb2QsDQogICAgICAgICAgICBzaW0gPSB2aW0uX3RyZWUubW9kLA0KICAgICAgICAgICAgc29tID0gdm9tLl90cmVlLm1vZCwNCiAgICAgICAgICAgIHNoaWZ0Ow0KICAgICAgICB3aGlsZSAodmltID0gZDNfbGF5b3V0X3RyZWVSaWdodCh2aW0pLCB2aXAgPSBkM19sYXlvdXRfdHJlZUxlZnQodmlwKSwgdmltICYmIHZpcCkgew0KICAgICAgICAgIHZvbSA9IGQzX2xheW91dF90cmVlTGVmdCh2b20pOw0KICAgICAgICAgIHZvcCA9IGQzX2xheW91dF90cmVlUmlnaHQodm9wKTsNCiAgICAgICAgICB2b3AuX3RyZWUuYW5jZXN0b3IgPSBub2RlOw0KICAgICAgICAgIHNoaWZ0ID0gdmltLl90cmVlLnByZWxpbSArIHNpbSAtIHZpcC5fdHJlZS5wcmVsaW0gLSBzaXAgKyBzZXBhcmF0aW9uKHZpbSwgdmlwKTsNCiAgICAgICAgICBpZiAoc2hpZnQgPiAwKSB7DQogICAgICAgICAgICBkM19sYXlvdXRfdHJlZU1vdmUoZDNfbGF5b3V0X3RyZWVBbmNlc3Rvcih2aW0sIG5vZGUsIGFuY2VzdG9yKSwgbm9kZSwgc2hpZnQpOw0KICAgICAgICAgICAgc2lwICs9IHNoaWZ0Ow0KICAgICAgICAgICAgc29wICs9IHNoaWZ0Ow0KICAgICAgICAgIH0NCiAgICAgICAgICBzaW0gKz0gdmltLl90cmVlLm1vZDsNCiAgICAgICAgICBzaXAgKz0gdmlwLl90cmVlLm1vZDsNCiAgICAgICAgICBzb20gKz0gdm9tLl90cmVlLm1vZDsNCiAgICAgICAgICBzb3AgKz0gdm9wLl90cmVlLm1vZDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodmltICYmICFkM19sYXlvdXRfdHJlZVJpZ2h0KHZvcCkpIHsNCiAgICAgICAgICB2b3AuX3RyZWUudGhyZWFkID0gdmltOw0KICAgICAgICAgIHZvcC5fdHJlZS5tb2QgKz0gc2ltIC0gc29wOw0KICAgICAgICB9DQogICAgICAgIGlmICh2aXAgJiYgIWQzX2xheW91dF90cmVlTGVmdCh2b20pKSB7DQogICAgICAgICAgdm9tLl90cmVlLnRocmVhZCA9IHZpcDsNCiAgICAgICAgICB2b20uX3RyZWUubW9kICs9IHNpcCAtIHNvbTsNCiAgICAgICAgICBhbmNlc3RvciA9IG5vZGU7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBhbmNlc3RvcjsNCiAgICB9DQoNCiAgICAvLyBJbml0aWFsaXplIHRlbXBvcmFyeSBsYXlvdXQgdmFyaWFibGVzLg0KICAgIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcpIHsNCiAgICAgIG5vZGUuX3RyZWUgPSB7DQogICAgICAgIGFuY2VzdG9yOiBub2RlLA0KICAgICAgICBwcmVsaW06IDAsDQogICAgICAgIG1vZDogMCwNCiAgICAgICAgY2hhbmdlOiAwLA0KICAgICAgICBzaGlmdDogMCwNCiAgICAgICAgbnVtYmVyOiBwcmV2aW91c1NpYmxpbmcgPyBwcmV2aW91c1NpYmxpbmcuX3RyZWUubnVtYmVyICsgMSA6IDANCiAgICAgIH07DQogICAgfSk7DQoNCiAgICAvLyBDb21wdXRlIHRoZSBsYXlvdXQgdXNpbmcgQnVjaGhlaW0gZXQgYWwuJ3MgYWxnb3JpdGhtLg0KICAgIGZpcnN0V2Fsayhyb290KTsNCiAgICBzZWNvbmRXYWxrKHJvb3QsIC1yb290Ll90cmVlLnByZWxpbSk7DQoNCiAgICAvLyBDb21wdXRlIHRoZSBsZWZ0LW1vc3QsIHJpZ2h0LW1vc3QsIGFuZCBkZXB0aC1tb3N0IG5vZGVzIGZvciBleHRlbnRzLg0KICAgIHZhciBsZWZ0ID0gZDNfbGF5b3V0X3RyZWVTZWFyY2gocm9vdCwgZDNfbGF5b3V0X3RyZWVMZWZ0bW9zdCksDQogICAgICAgIHJpZ2h0ID0gZDNfbGF5b3V0X3RyZWVTZWFyY2gocm9vdCwgZDNfbGF5b3V0X3RyZWVSaWdodG1vc3QpLA0KICAgICAgICBkZWVwID0gZDNfbGF5b3V0X3RyZWVTZWFyY2gocm9vdCwgZDNfbGF5b3V0X3RyZWVEZWVwZXN0KSwNCiAgICAgICAgeDAgPSBsZWZ0LnggLSBzZXBhcmF0aW9uKGxlZnQsIHJpZ2h0KSAvIDIsDQogICAgICAgIHgxID0gcmlnaHQueCArIHNlcGFyYXRpb24ocmlnaHQsIGxlZnQpIC8gMiwNCiAgICAgICAgeTEgPSBkZWVwLmRlcHRoIHx8IDE7DQoNCiAgICAvLyBDbGVhciB0ZW1wb3JhcnkgbGF5b3V0IHZhcmlhYmxlczsgdHJhbnNmb3JtIHggYW5kIHkuDQogICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBzaXplWzBdOw0KICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAvIHkxICogc2l6ZVsxXTsNCiAgICAgIGRlbGV0ZSBub2RlLl90cmVlOw0KICAgIH0pOw0KDQogICAgcmV0dXJuIG5vZGVzOw0KICB9DQoNCiAgdHJlZS5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNlcGFyYXRpb247DQogICAgc2VwYXJhdGlvbiA9IHg7DQogICAgcmV0dXJuIHRyZWU7DQogIH07DQoNCiAgdHJlZS5zaXplID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7DQogICAgc2l6ZSA9IHg7DQogICAgcmV0dXJuIHRyZWU7DQogIH07DQoNCiAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQodHJlZSwgaGllcmFyY2h5KTsNCn07DQoNCmZ1bmN0aW9uIGQzX2xheW91dF90cmVlU2VwYXJhdGlvbihhLCBiKSB7DQogIHJldHVybiBhLnBhcmVudCA9PSBiLnBhcmVudCA/IDEgOiAyOw0KfQ0KDQovLyBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNlcGFyYXRpb25SYWRpYWwoYSwgYikgew0KLy8gICByZXR1cm4gKGEucGFyZW50ID09IGIucGFyZW50ID8gMSA6IDIpIC8gYS5kZXB0aDsNCi8vIH0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVMZWZ0KG5vZGUpIHsNCiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCiAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA/IGNoaWxkcmVuWzBdIDogbm9kZS5fdHJlZS50aHJlYWQ7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF90cmVlUmlnaHQobm9kZSkgew0KICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLA0KICAgICAgbjsNCiAgcmV0dXJuIGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSA/IGNoaWxkcmVuW24gLSAxXSA6IG5vZGUuX3RyZWUudGhyZWFkOw0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNlYXJjaChub2RlLCBjb21wYXJlKSB7DQogIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47DQogIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsNCiAgICB2YXIgY2hpbGQsDQogICAgICAgIG4sDQogICAgICAgIGkgPSAtMTsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKGNvbXBhcmUoY2hpbGQgPSBkM19sYXlvdXRfdHJlZVNlYXJjaChjaGlsZHJlbltpXSwgY29tcGFyZSksIG5vZGUpID4gMCkgew0KICAgICAgICBub2RlID0gY2hpbGQ7DQogICAgICB9DQogICAgfQ0KICB9DQogIHJldHVybiBub2RlOw0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVJpZ2h0bW9zdChhLCBiKSB7DQogIHJldHVybiBhLnggLSBiLng7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF90cmVlTGVmdG1vc3QoYSwgYikgew0KICByZXR1cm4gYi54IC0gYS54Ow0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfdHJlZURlZXBlc3QoYSwgYikgew0KICByZXR1cm4gYS5kZXB0aCAtIGIuZGVwdGg7DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihub2RlLCBjYWxsYmFjaykgew0KICBmdW5jdGlvbiB2aXNpdChub2RlLCBwcmV2aW91c1NpYmxpbmcpIHsNCiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsNCiAgICAgIHZhciBjaGlsZCwNCiAgICAgICAgICBwcmV2aW91c0NoaWxkID0gbnVsbCwNCiAgICAgICAgICBpID0gLTEsDQogICAgICAgICAgbjsNCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07DQogICAgICAgIHZpc2l0KGNoaWxkLCBwcmV2aW91c0NoaWxkKTsNCiAgICAgICAgcHJldmlvdXNDaGlsZCA9IGNoaWxkOw0KICAgICAgfQ0KICAgIH0NCiAgICBjYWxsYmFjayhub2RlLCBwcmV2aW91c1NpYmxpbmcpOw0KICB9DQogIHZpc2l0KG5vZGUsIG51bGwpOw0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNoaWZ0KG5vZGUpIHsNCiAgdmFyIHNoaWZ0ID0gMCwNCiAgICAgIGNoYW5nZSA9IDAsDQogICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sDQogICAgICBpID0gY2hpbGRyZW4ubGVuZ3RoLA0KICAgICAgY2hpbGQ7DQogIHdoaWxlICgtLWkgPj0gMCkgew0KICAgIGNoaWxkID0gY2hpbGRyZW5baV0uX3RyZWU7DQogICAgY2hpbGQucHJlbGltICs9IHNoaWZ0Ow0KICAgIGNoaWxkLm1vZCArPSBzaGlmdDsNCiAgICBzaGlmdCArPSBjaGlsZC5zaGlmdCArIChjaGFuZ2UgKz0gY2hpbGQuY2hhbmdlKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBkM19sYXlvdXRfdHJlZU1vdmUoYW5jZXN0b3IsIG5vZGUsIHNoaWZ0KSB7DQogIGFuY2VzdG9yID0gYW5jZXN0b3IuX3RyZWU7DQogIG5vZGUgPSBub2RlLl90cmVlOw0KICB2YXIgY2hhbmdlID0gc2hpZnQgLyAobm9kZS5udW1iZXIgLSBhbmNlc3Rvci5udW1iZXIpOw0KICBhbmNlc3Rvci5jaGFuZ2UgKz0gY2hhbmdlOw0KICBub2RlLmNoYW5nZSAtPSBjaGFuZ2U7DQogIG5vZGUuc2hpZnQgKz0gc2hpZnQ7DQogIG5vZGUucHJlbGltICs9IHNoaWZ0Ow0KICBub2RlLm1vZCArPSBzaGlmdDsNCn0NCg0KZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVBbmNlc3Rvcih2aW0sIG5vZGUsIGFuY2VzdG9yKSB7DQogIHJldHVybiB2aW0uX3RyZWUuYW5jZXN0b3IucGFyZW50ID09IG5vZGUucGFyZW50DQogICAgICA/IHZpbS5fdHJlZS5hbmNlc3Rvcg0KICAgICAgOiBhbmNlc3RvcjsNCn0NCi8vIFNxdWFyaWZpZWQgVHJlZW1hcHMgYnkgTWFyayBCcnVscywgS2VlcyBIdWl6aW5nLCBhbmQgSmFya2UgSi4gdmFuIFdpamsNCi8vIE1vZGlmaWVkIHRvIHN1cHBvcnQgYSB0YXJnZXQgYXNwZWN0IHJhdGlvIGJ5IEplZmYgSGVlcg0KZDMubGF5b3V0LnRyZWVtYXAgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKSwNCiAgICAgIHJvdW5kID0gTWF0aC5yb3VuZCwNCiAgICAgIHNpemUgPSBbMSwgMV0sIC8vIHdpZHRoLCBoZWlnaHQNCiAgICAgIHBhZGRpbmcgPSBudWxsLA0KICAgICAgcGFkID0gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsLA0KICAgICAgc3RpY2t5ID0gZmFsc2UsDQogICAgICBzdGlja2llcywNCiAgICAgIHJhdGlvID0gMC41ICogKDEgKyBNYXRoLnNxcnQoNSkpOyAvLyBnb2xkZW4gcmF0aW8NCg0KICAvLyBDb21wdXRlIHRoZSBhcmVhIGZvciBlYWNoIGNoaWxkIGJhc2VkIG9uIHZhbHVlICYgc2NhbGUuDQogIGZ1bmN0aW9uIHNjYWxlKGNoaWxkcmVuLCBrKSB7DQogICAgdmFyIGkgPSAtMSwNCiAgICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCwNCiAgICAgICAgY2hpbGQsDQogICAgICAgIGFyZWE7DQogICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIGFyZWEgPSAoY2hpbGQgPSBjaGlsZHJlbltpXSkudmFsdWUgKiAoayA8IDAgPyAwIDogayk7DQogICAgICBjaGlsZC5hcmVhID0gaXNOYU4oYXJlYSkgfHwgYXJlYSA8PSAwID8gMCA6IGFyZWE7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVjdXJzaXZlbHkgYXJyYW5nZXMgdGhlIHNwZWNpZmllZCBub2RlJ3MgY2hpbGRyZW4gaW50byBzcXVhcmlmaWVkIHJvd3MuDQogIGZ1bmN0aW9uIHNxdWFyaWZ5KG5vZGUpIHsNCiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsNCiAgICAgIHZhciByZWN0ID0gcGFkKG5vZGUpLA0KICAgICAgICAgIHJvdyA9IFtdLA0KICAgICAgICAgIHJlbWFpbmluZyA9IGNoaWxkcmVuLnNsaWNlKCksIC8vIGNvcHktb24td3JpdGUNCiAgICAgICAgICBjaGlsZCwNCiAgICAgICAgICBiZXN0ID0gSW5maW5pdHksIC8vIHRoZSBiZXN0IHJvdyBzY29yZSBzbyBmYXINCiAgICAgICAgICBzY29yZSwgLy8gdGhlIGN1cnJlbnQgcm93IHNjb3JlDQogICAgICAgICAgdSA9IE1hdGgubWluKHJlY3QuZHgsIHJlY3QuZHkpLCAvLyBpbml0aWFsIG9yaWVudGF0aW9uDQogICAgICAgICAgbjsNCiAgICAgIHNjYWxlKHJlbWFpbmluZywgcmVjdC5keCAqIHJlY3QuZHkgLyBub2RlLnZhbHVlKTsNCiAgICAgIHJvdy5hcmVhID0gMDsNCiAgICAgIHdoaWxlICgobiA9IHJlbWFpbmluZy5sZW5ndGgpID4gMCkgew0KICAgICAgICByb3cucHVzaChjaGlsZCA9IHJlbWFpbmluZ1tuIC0gMV0pOw0KICAgICAgICByb3cuYXJlYSArPSBjaGlsZC5hcmVhOw0KICAgICAgICBpZiAoKHNjb3JlID0gd29yc3Qocm93LCB1KSkgPD0gYmVzdCkgeyAvLyBjb250aW51ZSB3aXRoIHRoaXMgb3JpZW50YXRpb24NCiAgICAgICAgICByZW1haW5pbmcucG9wKCk7DQogICAgICAgICAgYmVzdCA9IHNjb3JlOw0KICAgICAgICB9IGVsc2UgeyAvLyBhYm9ydCwgYW5kIHRyeSBhIGRpZmZlcmVudCBvcmllbnRhdGlvbg0KICAgICAgICAgIHJvdy5hcmVhIC09IHJvdy5wb3AoKS5hcmVhOw0KICAgICAgICAgIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgZmFsc2UpOw0KICAgICAgICAgIHUgPSBNYXRoLm1pbihyZWN0LmR4LCByZWN0LmR5KTsNCiAgICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwOw0KICAgICAgICAgIGJlc3QgPSBJbmZpbml0eTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKHJvdy5sZW5ndGgpIHsNCiAgICAgICAgcG9zaXRpb24ocm93LCB1LCByZWN0LCB0cnVlKTsNCiAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5hcmVhID0gMDsNCiAgICAgIH0NCiAgICAgIGNoaWxkcmVuLmZvckVhY2goc3F1YXJpZnkpOw0KICAgIH0NCiAgfQ0KDQogIC8vIFJlY3Vyc2l2ZWx5IHJlc2l6ZXMgdGhlIHNwZWNpZmllZCBub2RlJ3MgY2hpbGRyZW4gaW50byBleGlzdGluZyByb3dzLg0KICAvLyBQcmVzZXJ2ZXMgdGhlIGV4aXN0aW5nIGxheW91dCENCiAgZnVuY3Rpb24gc3RpY2tpZnkobm9kZSkgew0KICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47DQogICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgew0KICAgICAgdmFyIHJlY3QgPSBwYWQobm9kZSksDQogICAgICAgICAgcmVtYWluaW5nID0gY2hpbGRyZW4uc2xpY2UoKSwgLy8gY29weS1vbi13cml0ZQ0KICAgICAgICAgIGNoaWxkLA0KICAgICAgICAgIHJvdyA9IFtdOw0KICAgICAgc2NhbGUocmVtYWluaW5nLCByZWN0LmR4ICogcmVjdC5keSAvIG5vZGUudmFsdWUpOw0KICAgICAgcm93LmFyZWEgPSAwOw0KICAgICAgd2hpbGUgKGNoaWxkID0gcmVtYWluaW5nLnBvcCgpKSB7DQogICAgICAgIHJvdy5wdXNoKGNoaWxkKTsNCiAgICAgICAgcm93LmFyZWEgKz0gY2hpbGQuYXJlYTsNCiAgICAgICAgaWYgKGNoaWxkLnogIT0gbnVsbCkgew0KICAgICAgICAgIHBvc2l0aW9uKHJvdywgY2hpbGQueiA/IHJlY3QuZHggOiByZWN0LmR5LCByZWN0LCAhcmVtYWluaW5nLmxlbmd0aCk7DQogICAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5hcmVhID0gMDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgY2hpbGRyZW4uZm9yRWFjaChzdGlja2lmeSk7DQogICAgfQ0KICB9DQoNCiAgLy8gQ29tcHV0ZXMgdGhlIHNjb3JlIGZvciB0aGUgc3BlY2lmaWVkIHJvdywgYXMgdGhlIHdvcnN0IGFzcGVjdCByYXRpby4NCiAgZnVuY3Rpb24gd29yc3Qocm93LCB1KSB7DQogICAgdmFyIHMgPSByb3cuYXJlYSwNCiAgICAgICAgciwNCiAgICAgICAgcm1heCA9IDAsDQogICAgICAgIHJtaW4gPSBJbmZpbml0eSwNCiAgICAgICAgaSA9IC0xLA0KICAgICAgICBuID0gcm93Lmxlbmd0aDsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKCEociA9IHJvd1tpXS5hcmVhKSkgY29udGludWU7DQogICAgICBpZiAociA8IHJtaW4pIHJtaW4gPSByOw0KICAgICAgaWYgKHIgPiBybWF4KSBybWF4ID0gcjsNCiAgICB9DQogICAgcyAqPSBzOw0KICAgIHUgKj0gdTsNCiAgICByZXR1cm4gcw0KICAgICAgICA/IE1hdGgubWF4KCh1ICogcm1heCAqIHJhdGlvKSAvIHMsIHMgLyAodSAqIHJtaW4gKiByYXRpbykpDQogICAgICAgIDogSW5maW5pdHk7DQogIH0NCg0KICAvLyBQb3NpdGlvbnMgdGhlIHNwZWNpZmllZCByb3cgb2Ygbm9kZXMuIE1vZGlmaWVzIGByZWN0YC4NCiAgZnVuY3Rpb24gcG9zaXRpb24ocm93LCB1LCByZWN0LCBmbHVzaCkgew0KICAgIHZhciBpID0gLTEsDQogICAgICAgIG4gPSByb3cubGVuZ3RoLA0KICAgICAgICB4ID0gcmVjdC54LA0KICAgICAgICB5ID0gcmVjdC55LA0KICAgICAgICB2ID0gdSA/IHJvdW5kKHJvdy5hcmVhIC8gdSkgOiAwLA0KICAgICAgICBvOw0KICAgIGlmICh1ID09IHJlY3QuZHgpIHsgLy8gaG9yaXpvbnRhbCBzdWJkaXZpc2lvbg0KICAgICAgaWYgKGZsdXNoIHx8IHYgPiByZWN0LmR5KSB2ID0gcmVjdC5keTsgLy8gb3Zlcit1bmRlcmZsb3cNCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICAgIG8gPSByb3dbaV07DQogICAgICAgIG8ueCA9IHg7DQogICAgICAgIG8ueSA9IHk7DQogICAgICAgIG8uZHkgPSB2Ow0KICAgICAgICB4ICs9IG8uZHggPSBNYXRoLm1pbihyZWN0LnggKyByZWN0LmR4IC0geCwgdiA/IHJvdW5kKG8uYXJlYSAvIHYpIDogMCk7DQogICAgICB9DQogICAgICBvLnogPSB0cnVlOw0KICAgICAgby5keCArPSByZWN0LnggKyByZWN0LmR4IC0geDsgLy8gcm91bmRpbmcgZXJyb3INCiAgICAgIHJlY3QueSArPSB2Ow0KICAgICAgcmVjdC5keSAtPSB2Ow0KICAgIH0gZWxzZSB7IC8vIHZlcnRpY2FsIHN1YmRpdmlzaW9uDQogICAgICBpZiAoZmx1c2ggfHwgdiA+IHJlY3QuZHgpIHYgPSByZWN0LmR4OyAvLyBvdmVyK3VuZGVyZmxvdw0KICAgICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgICAgbyA9IHJvd1tpXTsNCiAgICAgICAgby54ID0geDsNCiAgICAgICAgby55ID0geTsNCiAgICAgICAgby5keCA9IHY7DQogICAgICAgIHkgKz0gby5keSA9IE1hdGgubWluKHJlY3QueSArIHJlY3QuZHkgLSB5LCB2ID8gcm91bmQoby5hcmVhIC8gdikgOiAwKTsNCiAgICAgIH0NCiAgICAgIG8ueiA9IGZhbHNlOw0KICAgICAgby5keSArPSByZWN0LnkgKyByZWN0LmR5IC0geTsgLy8gcm91bmRpbmcgZXJyb3INCiAgICAgIHJlY3QueCArPSB2Ow0KICAgICAgcmVjdC5keCAtPSB2Ow0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHRyZWVtYXAoZCkgew0KICAgIHZhciBub2RlcyA9IHN0aWNraWVzIHx8IGhpZXJhcmNoeShkKSwNCiAgICAgICAgcm9vdCA9IG5vZGVzWzBdOw0KICAgIHJvb3QueCA9IDA7DQogICAgcm9vdC55ID0gMDsNCiAgICByb290LmR4ID0gc2l6ZVswXTsNCiAgICByb290LmR5ID0gc2l6ZVsxXTsNCiAgICBpZiAoc3RpY2tpZXMpIGhpZXJhcmNoeS5yZXZhbHVlKHJvb3QpOw0KICAgIHNjYWxlKFtyb290XSwgcm9vdC5keCAqIHJvb3QuZHkgLyByb290LnZhbHVlKTsNCiAgICAoc3RpY2tpZXMgPyBzdGlja2lmeSA6IHNxdWFyaWZ5KShyb290KTsNCiAgICBpZiAoc3RpY2t5KSBzdGlja2llcyA9IG5vZGVzOw0KICAgIHJldHVybiBub2RlczsNCiAgfQ0KDQogIHRyZWVtYXAuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOw0KICAgIHNpemUgPSB4Ow0KICAgIHJldHVybiB0cmVlbWFwOw0KICB9Ow0KDQogIHRyZWVtYXAucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRkaW5nOw0KDQogICAgZnVuY3Rpb24gcGFkRnVuY3Rpb24obm9kZSkgew0KICAgICAgdmFyIHAgPSB4LmNhbGwodHJlZW1hcCwgbm9kZSwgbm9kZS5kZXB0aCk7DQogICAgICByZXR1cm4gcCA9PSBudWxsDQogICAgICAgICAgPyBkM19sYXlvdXRfdHJlZW1hcFBhZE51bGwobm9kZSkNCiAgICAgICAgICA6IGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHR5cGVvZiBwID09PSAibnVtYmVyIiA/IFtwLCBwLCBwLCBwXSA6IHApOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHBhZENvbnN0YW50KG5vZGUpIHsNCiAgICAgIHJldHVybiBkM19sYXlvdXRfdHJlZW1hcFBhZChub2RlLCB4KTsNCiAgICB9DQoNCiAgICB2YXIgdHlwZTsNCiAgICBwYWQgPSAocGFkZGluZyA9IHgpID09IG51bGwgPyBkM19sYXlvdXRfdHJlZW1hcFBhZE51bGwNCiAgICAgICAgOiAodHlwZSA9IHR5cGVvZiB4KSA9PT0gImZ1bmN0aW9uIiA/IHBhZEZ1bmN0aW9uDQogICAgICAgIDogdHlwZSA9PT0gIm51bWJlciIgPyAoeCA9IFt4LCB4LCB4LCB4XSwgcGFkQ29uc3RhbnQpDQogICAgICAgIDogcGFkQ29uc3RhbnQ7DQogICAgcmV0dXJuIHRyZWVtYXA7DQogIH07DQoNCiAgdHJlZW1hcC5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByb3VuZCAhPSBOdW1iZXI7DQogICAgcm91bmQgPSB4ID8gTWF0aC5yb3VuZCA6IE51bWJlcjsNCiAgICByZXR1cm4gdHJlZW1hcDsNCiAgfTsNCg0KICB0cmVlbWFwLnN0aWNreSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGlja3k7DQogICAgc3RpY2t5ID0geDsNCiAgICBzdGlja2llcyA9IG51bGw7DQogICAgcmV0dXJuIHRyZWVtYXA7DQogIH07DQoNCiAgdHJlZW1hcC5yYXRpbyA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYXRpbzsNCiAgICByYXRpbyA9IHg7DQogICAgcmV0dXJuIHRyZWVtYXA7DQogIH07DQoNCiAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQodHJlZW1hcCwgaGllcmFyY2h5KTsNCn07DQoNCmZ1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkTnVsbChub2RlKSB7DQogIHJldHVybiB7eDogbm9kZS54LCB5OiBub2RlLnksIGR4OiBub2RlLmR4LCBkeTogbm9kZS5keX07DQp9DQoNCmZ1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHBhZGRpbmcpIHsNCiAgdmFyIHggPSBub2RlLnggKyBwYWRkaW5nWzNdLA0KICAgICAgeSA9IG5vZGUueSArIHBhZGRpbmdbMF0sDQogICAgICBkeCA9IG5vZGUuZHggLSBwYWRkaW5nWzFdIC0gcGFkZGluZ1szXSwNCiAgICAgIGR5ID0gbm9kZS5keSAtIHBhZGRpbmdbMF0gLSBwYWRkaW5nWzJdOw0KICBpZiAoZHggPCAwKSB7IHggKz0gZHggLyAyOyBkeCA9IDA7IH0NCiAgaWYgKGR5IDwgMCkgeyB5ICs9IGR5IC8gMjsgZHkgPSAwOyB9DQogIHJldHVybiB7eDogeCwgeTogeSwgZHg6IGR4LCBkeTogZHl9Ow0KfQ0KZDMuY3N2ID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgew0KICBkMy50ZXh0KHVybCwgInRleHQvY3N2IiwgZnVuY3Rpb24odGV4dCkgew0KICAgIGNhbGxiYWNrKHRleHQgJiYgZDMuY3N2LnBhcnNlKHRleHQpKTsNCiAgfSk7DQp9Ow0KZDMuY3N2LnBhcnNlID0gZnVuY3Rpb24odGV4dCkgew0KICB2YXIgaGVhZGVyOw0KICByZXR1cm4gZDMuY3N2LnBhcnNlUm93cyh0ZXh0LCBmdW5jdGlvbihyb3csIGkpIHsNCiAgICBpZiAoaSkgew0KICAgICAgdmFyIG8gPSB7fSwgaiA9IC0xLCBtID0gaGVhZGVyLmxlbmd0aDsNCiAgICAgIHdoaWxlICgrK2ogPCBtKSBvW2hlYWRlcltqXV0gPSByb3dbal07DQogICAgICByZXR1cm4gbzsNCiAgICB9IGVsc2Ugew0KICAgICAgaGVhZGVyID0gcm93Ow0KICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KICB9KTsNCn07DQoNCmQzLmNzdi5wYXJzZVJvd3MgPSBmdW5jdGlvbih0ZXh0LCBmKSB7DQogIHZhciBFT0wgPSB7fSwgLy8gc2VudGluZWwgdmFsdWUgZm9yIGVuZC1vZi1saW5lDQogICAgICBFT0YgPSB7fSwgLy8gc2VudGluZWwgdmFsdWUgZm9yIGVuZC1vZi1maWxlDQogICAgICByb3dzID0gW10sIC8vIG91dHB1dCByb3dzDQogICAgICByZSA9IC9cclxufFssXHJcbl0vZywgLy8gZmllbGQgc2VwYXJhdG9yIHJlZ2V4DQogICAgICBuID0gMCwgLy8gdGhlIGN1cnJlbnQgbGluZSBudW1iZXINCiAgICAgIHQsIC8vIHRoZSBjdXJyZW50IHRva2VuDQogICAgICBlb2w7IC8vIGlzIHRoZSBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPTD8NCg0KICByZS5sYXN0SW5kZXggPSAwOyAvLyB3b3JrLWFyb3VuZCBidWcgaW4gRkYgMy42DQoNCiAgLyoqIEBwcml2YXRlIFJldHVybnMgdGhlIG5leHQgdG9rZW4uICovDQogIGZ1bmN0aW9uIHRva2VuKCkgew0KICAgIGlmIChyZS5sYXN0SW5kZXggPj0gdGV4dC5sZW5ndGgpIHJldHVybiBFT0Y7IC8vIHNwZWNpYWwgY2FzZTogZW5kIG9mIGZpbGUNCiAgICBpZiAoZW9sKSB7IGVvbCA9IGZhbHNlOyByZXR1cm4gRU9MOyB9IC8vIHNwZWNpYWwgY2FzZTogZW5kIG9mIGxpbmUNCg0KICAgIC8vIHNwZWNpYWwgY2FzZTogcXVvdGVzDQogICAgdmFyIGogPSByZS5sYXN0SW5kZXg7DQogICAgaWYgKHRleHQuY2hhckNvZGVBdChqKSA9PT0gMzQpIHsNCiAgICAgIHZhciBpID0gajsNCiAgICAgIHdoaWxlIChpKysgPCB0ZXh0Lmxlbmd0aCkgew0KICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkpID09PSAzNCkgew0KICAgICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSArIDEpICE9PSAzNCkgYnJlYWs7DQogICAgICAgICAgaSsrOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZS5sYXN0SW5kZXggPSBpICsgMjsNCiAgICAgIHZhciBjID0gdGV4dC5jaGFyQ29kZUF0KGkgKyAxKTsNCiAgICAgIGlmIChjID09PSAxMykgew0KICAgICAgICBlb2wgPSB0cnVlOw0KICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkgKyAyKSA9PT0gMTApIHJlLmxhc3RJbmRleCsrOw0KICAgICAgfSBlbHNlIGlmIChjID09PSAxMCkgew0KICAgICAgICBlb2wgPSB0cnVlOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGogKyAxLCBpKS5yZXBsYWNlKC8iIi9nLCAiXCIiKTsNCiAgICB9DQoNCiAgICAvLyBjb21tb24gY2FzZQ0KICAgIHZhciBtID0gcmUuZXhlYyh0ZXh0KTsNCiAgICBpZiAobSkgew0KICAgICAgZW9sID0gbVswXS5jaGFyQ29kZUF0KDApICE9PSA0NDsNCiAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZyhqLCBtLmluZGV4KTsNCiAgICB9DQogICAgcmUubGFzdEluZGV4ID0gdGV4dC5sZW5ndGg7DQogICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGopOw0KICB9DQoNCiAgd2hpbGUgKCh0ID0gdG9rZW4oKSkgIT09IEVPRikgew0KICAgIHZhciBhID0gW107DQogICAgd2hpbGUgKCh0ICE9PSBFT0wpICYmICh0ICE9PSBFT0YpKSB7DQogICAgICBhLnB1c2godCk7DQogICAgICB0ID0gdG9rZW4oKTsNCiAgICB9DQogICAgaWYgKGYgJiYgIShhID0gZihhLCBuKyspKSkgY29udGludWU7DQogICAgcm93cy5wdXNoKGEpOw0KICB9DQoNCiAgcmV0dXJuIHJvd3M7DQp9Ow0KZDMuY3N2LmZvcm1hdCA9IGZ1bmN0aW9uKHJvd3MpIHsNCiAgcmV0dXJuIHJvd3MubWFwKGQzX2Nzdl9mb3JtYXRSb3cpLmpvaW4oIlxuIik7DQp9Ow0KDQpmdW5jdGlvbiBkM19jc3ZfZm9ybWF0Um93KHJvdykgew0KICByZXR1cm4gcm93Lm1hcChkM19jc3ZfZm9ybWF0VmFsdWUpLmpvaW4oIiwiKTsNCn0NCg0KZnVuY3Rpb24gZDNfY3N2X2Zvcm1hdFZhbHVlKHRleHQpIHsNCiAgcmV0dXJuIC9bIixcbl0vLnRlc3QodGV4dCkNCiAgICAgID8gIlwiIiArIHRleHQucmVwbGFjZSgvXCIvZywgIlwiXCIiKSArICJcIiINCiAgICAgIDogdGV4dDsNCn0NCmQzLmdlbyA9IHt9Ow0KDQp2YXIgZDNfZ2VvX3JhZGlhbnMgPSBNYXRoLlBJIC8gMTgwOw0KLy8gVE9ETyBjbGlwIGlucHV0IGNvb3JkaW5hdGVzIG9uIG9wcG9zaXRlIGhlbWlzcGhlcmUNCmQzLmdlby5hemltdXRoYWwgPSBmdW5jdGlvbigpIHsNCiAgdmFyIG1vZGUgPSAib3J0aG9ncmFwaGljIiwgLy8gb3Igc3RlcmVvZ3JhcGhpYywgZ25vbW9uaWMsIGVxdWlkaXN0YW50IG9yIGVxdWFsYXJlYQ0KICAgICAgb3JpZ2luLA0KICAgICAgc2NhbGUgPSAyMDAsDQogICAgICB0cmFuc2xhdGUgPSBbNDgwLCAyNTBdLA0KICAgICAgeDAsDQogICAgICB5MCwNCiAgICAgIGN5MCwNCiAgICAgIHN5MDsNCg0KICBmdW5jdGlvbiBhemltdXRoYWwoY29vcmRpbmF0ZXMpIHsNCiAgICB2YXIgeDEgPSBjb29yZGluYXRlc1swXSAqIGQzX2dlb19yYWRpYW5zIC0geDAsDQogICAgICAgIHkxID0gY29vcmRpbmF0ZXNbMV0gKiBkM19nZW9fcmFkaWFucywNCiAgICAgICAgY3gxID0gTWF0aC5jb3MoeDEpLA0KICAgICAgICBzeDEgPSBNYXRoLnNpbih4MSksDQogICAgICAgIGN5MSA9IE1hdGguY29zKHkxKSwNCiAgICAgICAgc3kxID0gTWF0aC5zaW4oeTEpLA0KICAgICAgICBjYyA9IG1vZGUgIT09ICJvcnRob2dyYXBoaWMiID8gc3kwICogc3kxICsgY3kwICogY3kxICogY3gxIDogbnVsbCwNCiAgICAgICAgYywNCiAgICAgICAgayA9IG1vZGUgPT09ICJzdGVyZW9ncmFwaGljIiA/IDEgLyAoMSArIGNjKQ0KICAgICAgICAgIDogbW9kZSA9PT0gImdub21vbmljIiA/IDEgLyBjYw0KICAgICAgICAgIDogbW9kZSA9PT0gImVxdWlkaXN0YW50IiA/IChjID0gTWF0aC5hY29zKGNjKSwgYyA/IGMgLyBNYXRoLnNpbihjKSA6IDApDQogICAgICAgICAgOiBtb2RlID09PSAiZXF1YWxhcmVhIiA/IE1hdGguc3FydCgyIC8gKDEgKyBjYykpDQogICAgICAgICAgOiAxLA0KICAgICAgICB4ID0gayAqIGN5MSAqIHN4MSwNCiAgICAgICAgeSA9IGsgKiAoc3kwICogY3kxICogY3gxIC0gY3kwICogc3kxKTsNCiAgICByZXR1cm4gWw0KICAgICAgc2NhbGUgKiB4ICsgdHJhbnNsYXRlWzBdLA0KICAgICAgc2NhbGUgKiB5ICsgdHJhbnNsYXRlWzFdDQogICAgXTsNCiAgfQ0KDQogIGF6aW11dGhhbC5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgew0KICAgIHZhciB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLA0KICAgICAgICB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdHJhbnNsYXRlWzFdKSAvIHNjYWxlLA0KICAgICAgICBwID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpLA0KICAgICAgICBjID0gbW9kZSA9PT0gInN0ZXJlb2dyYXBoaWMiID8gMiAqIE1hdGguYXRhbihwKQ0KICAgICAgICAgIDogbW9kZSA9PT0gImdub21vbmljIiA/IE1hdGguYXRhbihwKQ0KICAgICAgICAgIDogbW9kZSA9PT0gImVxdWlkaXN0YW50IiA/IHANCiAgICAgICAgICA6IG1vZGUgPT09ICJlcXVhbGFyZWEiID8gMiAqIE1hdGguYXNpbiguNSAqIHApDQogICAgICAgICAgOiBNYXRoLmFzaW4ocCksDQogICAgICAgIHNjID0gTWF0aC5zaW4oYyksDQogICAgICAgIGNjID0gTWF0aC5jb3MoYyk7DQogICAgcmV0dXJuIFsNCiAgICAgICh4MCArIE1hdGguYXRhbjIoeCAqIHNjLCBwICogY3kwICogY2MgKyB5ICogc3kwICogc2MpKSAvIGQzX2dlb19yYWRpYW5zLA0KICAgICAgTWF0aC5hc2luKGNjICogc3kwIC0gKHAgPyAoeSAqIHNjICogY3kwKSAvIHAgOiAwKSkgLyBkM19nZW9fcmFkaWFucw0KICAgIF07DQogIH07DQoNCiAgYXppbXV0aGFsLm1vZGUgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbW9kZTsNCiAgICBtb2RlID0geCArICIiOw0KICAgIHJldHVybiBhemltdXRoYWw7DQogIH07DQoNCiAgYXppbXV0aGFsLm9yaWdpbiA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmlnaW47DQogICAgb3JpZ2luID0geDsNCiAgICB4MCA9IG9yaWdpblswXSAqIGQzX2dlb19yYWRpYW5zOw0KICAgIHkwID0gb3JpZ2luWzFdICogZDNfZ2VvX3JhZGlhbnM7DQogICAgY3kwID0gTWF0aC5jb3MoeTApOw0KICAgIHN5MCA9IE1hdGguc2luKHkwKTsNCiAgICByZXR1cm4gYXppbXV0aGFsOw0KICB9Ow0KDQogIGF6aW11dGhhbC5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsNCiAgICBzY2FsZSA9ICt4Ow0KICAgIHJldHVybiBhemltdXRoYWw7DQogIH07DQoNCiAgYXppbXV0aGFsLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7DQogICAgdHJhbnNsYXRlID0gWyt4WzBdLCAreFsxXV07DQogICAgcmV0dXJuIGF6aW11dGhhbDsNCiAgfTsNCg0KICByZXR1cm4gYXppbXV0aGFsLm9yaWdpbihbMCwgMF0pOw0KfTsNCi8vIERlcml2ZWQgZnJvbSBUb20gQ2FyZGVuJ3MgQWxiZXJzIGltcGxlbWVudGF0aW9uIGZvciBQcm90b3Zpcy4NCi8vIGh0dHA6Ly9naXN0LmdpdGh1Yi5jb20vNDc2MjM4DQovLyBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0FsYmVyc0VxdWFsLUFyZWFDb25pY1Byb2plY3Rpb24uaHRtbA0KDQpkMy5nZW8uYWxiZXJzID0gZnVuY3Rpb24oKSB7DQogIHZhciBvcmlnaW4gPSBbLTk4LCAzOF0sDQogICAgICBwYXJhbGxlbHMgPSBbMjkuNSwgNDUuNV0sDQogICAgICBzY2FsZSA9IDEwMDAsDQogICAgICB0cmFuc2xhdGUgPSBbNDgwLCAyNTBdLA0KICAgICAgbG5nMCwgLy8gZDNfZ2VvX3JhZGlhbnMgKiBvcmlnaW5bMF0NCiAgICAgIG4sDQogICAgICBDLA0KICAgICAgcDA7DQoNCiAgZnVuY3Rpb24gYWxiZXJzKGNvb3JkaW5hdGVzKSB7DQogICAgdmFyIHQgPSBuICogKGQzX2dlb19yYWRpYW5zICogY29vcmRpbmF0ZXNbMF0gLSBsbmcwKSwNCiAgICAgICAgcCA9IE1hdGguc3FydChDIC0gMiAqIG4gKiBNYXRoLnNpbihkM19nZW9fcmFkaWFucyAqIGNvb3JkaW5hdGVzWzFdKSkgLyBuOw0KICAgIHJldHVybiBbDQogICAgICBzY2FsZSAqIHAgKiBNYXRoLnNpbih0KSArIHRyYW5zbGF0ZVswXSwNCiAgICAgIHNjYWxlICogKHAgKiBNYXRoLmNvcyh0KSAtIHAwKSArIHRyYW5zbGF0ZVsxXQ0KICAgIF07DQogIH0NCg0KICBhbGJlcnMuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsNCiAgICB2YXIgeCA9IChjb29yZGluYXRlc1swXSAtIHRyYW5zbGF0ZVswXSkgLyBzY2FsZSwNCiAgICAgICAgeSA9IChjb29yZGluYXRlc1sxXSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZSwNCiAgICAgICAgcDB5ID0gcDAgKyB5LA0KICAgICAgICB0ID0gTWF0aC5hdGFuMih4LCBwMHkpLA0KICAgICAgICBwID0gTWF0aC5zcXJ0KHggKiB4ICsgcDB5ICogcDB5KTsNCiAgICByZXR1cm4gWw0KICAgICAgKGxuZzAgKyB0IC8gbikgLyBkM19nZW9fcmFkaWFucywNCiAgICAgIE1hdGguYXNpbigoQyAtIHAgKiBwICogbiAqIG4pIC8gKDIgKiBuKSkgLyBkM19nZW9fcmFkaWFucw0KICAgIF07DQogIH07DQoNCiAgZnVuY3Rpb24gcmVsb2FkKCkgew0KICAgIHZhciBwaGkxID0gZDNfZ2VvX3JhZGlhbnMgKiBwYXJhbGxlbHNbMF0sDQogICAgICAgIHBoaTIgPSBkM19nZW9fcmFkaWFucyAqIHBhcmFsbGVsc1sxXSwNCiAgICAgICAgbGF0MCA9IGQzX2dlb19yYWRpYW5zICogb3JpZ2luWzFdLA0KICAgICAgICBzID0gTWF0aC5zaW4ocGhpMSksDQogICAgICAgIGMgPSBNYXRoLmNvcyhwaGkxKTsNCiAgICBsbmcwID0gZDNfZ2VvX3JhZGlhbnMgKiBvcmlnaW5bMF07DQogICAgbiA9IC41ICogKHMgKyBNYXRoLnNpbihwaGkyKSk7DQogICAgQyA9IGMgKiBjICsgMiAqIG4gKiBzOw0KICAgIHAwID0gTWF0aC5zcXJ0KEMgLSAyICogbiAqIE1hdGguc2luKGxhdDApKSAvIG47DQogICAgcmV0dXJuIGFsYmVyczsNCiAgfQ0KDQogIGFsYmVycy5vcmlnaW4gPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZ2luOw0KICAgIG9yaWdpbiA9IFsreFswXSwgK3hbMV1dOw0KICAgIHJldHVybiByZWxvYWQoKTsNCiAgfTsNCg0KICBhbGJlcnMucGFyYWxsZWxzID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBhcmFsbGVsczsNCiAgICBwYXJhbGxlbHMgPSBbK3hbMF0sICt4WzFdXTsNCiAgICByZXR1cm4gcmVsb2FkKCk7DQogIH07DQoNCiAgYWxiZXJzLnNjYWxlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOw0KICAgIHNjYWxlID0gK3g7DQogICAgcmV0dXJuIGFsYmVyczsNCiAgfTsNCg0KICBhbGJlcnMudHJhbnNsYXRlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRyYW5zbGF0ZTsNCiAgICB0cmFuc2xhdGUgPSBbK3hbMF0sICt4WzFdXTsNCiAgICByZXR1cm4gYWxiZXJzOw0KICB9Ow0KDQogIHJldHVybiByZWxvYWQoKTsNCn07DQoNCi8vIEEgY29tcG9zaXRlIHByb2plY3Rpb24gZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCA5NjB4NTAwLiBUaGUgc2V0IG9mIHN0YW5kYXJkDQovLyBwYXJhbGxlbHMgZm9yIGVhY2ggcmVnaW9uIGNvbWVzIGZyb20gVVNHUywgd2hpY2ggaXMgcHVibGlzaGVkIGhlcmU6DQovLyBodHRwOi8vZWdzYy51c2dzLmdvdi9pc2IvcHVicy9NYXBQcm9qZWN0aW9ucy9wcm9qZWN0aW9ucy5odG1sI2FsYmVycw0KLy8gVE9ETyBhbGxvdyB0aGUgY29tcG9zaXRlIHByb2plY3Rpb24gdG8gYmUgcmVzY2FsZWQ/DQpkMy5nZW8uYWxiZXJzVXNhID0gZnVuY3Rpb24oKSB7DQogIHZhciBsb3dlcjQ4ID0gZDMuZ2VvLmFsYmVycygpOw0KDQogIHZhciBhbGFza2EgPSBkMy5nZW8uYWxiZXJzKCkNCiAgICAgIC5vcmlnaW4oWy0xNjAsIDYwXSkNCiAgICAgIC5wYXJhbGxlbHMoWzU1LCA2NV0pOw0KDQogIHZhciBoYXdhaWkgPSBkMy5nZW8uYWxiZXJzKCkNCiAgICAgIC5vcmlnaW4oWy0xNjAsIDIwXSkNCiAgICAgIC5wYXJhbGxlbHMoWzgsIDE4XSk7DQoNCiAgdmFyIHB1ZXJ0b1JpY28gPSBkMy5nZW8uYWxiZXJzKCkNCiAgICAgIC5vcmlnaW4oWy02MCwgMTBdKQ0KICAgICAgLnBhcmFsbGVscyhbOCwgMThdKTsNCg0KICBmdW5jdGlvbiBhbGJlcnNVc2EoY29vcmRpbmF0ZXMpIHsNCiAgICB2YXIgbG9uID0gY29vcmRpbmF0ZXNbMF0sDQogICAgICAgIGxhdCA9IGNvb3JkaW5hdGVzWzFdOw0KICAgIHJldHVybiAobGF0ID4gNTAgPyBhbGFza2ENCiAgICAgICAgOiBsb24gPCAtMTQwID8gaGF3YWlpDQogICAgICAgIDogbGF0IDwgMjEgPyBwdWVydG9SaWNvDQogICAgICAgIDogbG93ZXI0OCkoY29vcmRpbmF0ZXMpOw0KICB9DQoNCiAgYWxiZXJzVXNhLnNjYWxlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxvd2VyNDguc2NhbGUoKTsNCiAgICBsb3dlcjQ4LnNjYWxlKHgpOw0KICAgIGFsYXNrYS5zY2FsZSh4ICogLjYpOw0KICAgIGhhd2FpaS5zY2FsZSh4KTsNCiAgICBwdWVydG9SaWNvLnNjYWxlKHggKiAxLjUpOw0KICAgIHJldHVybiBhbGJlcnNVc2EudHJhbnNsYXRlKGxvd2VyNDgudHJhbnNsYXRlKCkpOw0KICB9Ow0KDQogIGFsYmVyc1VzYS50cmFuc2xhdGUgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC50cmFuc2xhdGUoKTsNCiAgICB2YXIgZHogPSBsb3dlcjQ4LnNjYWxlKCkgLyAxMDAwLA0KICAgICAgICBkeCA9IHhbMF0sDQogICAgICAgIGR5ID0geFsxXTsNCiAgICBsb3dlcjQ4LnRyYW5zbGF0ZSh4KTsNCiAgICBhbGFza2EudHJhbnNsYXRlKFtkeCAtIDQwMCAqIGR6LCBkeSArIDE3MCAqIGR6XSk7DQogICAgaGF3YWlpLnRyYW5zbGF0ZShbZHggLSAxOTAgKiBkeiwgZHkgKyAyMDAgKiBkel0pOw0KICAgIHB1ZXJ0b1JpY28udHJhbnNsYXRlKFtkeCArIDU4MCAqIGR6LCBkeSArIDQzMCAqIGR6XSk7DQogICAgcmV0dXJuIGFsYmVyc1VzYTsNCiAgfTsNCg0KICByZXR1cm4gYWxiZXJzVXNhLnNjYWxlKGxvd2VyNDguc2NhbGUoKSk7DQp9Ow0KZDMuZ2VvLmJvbm5lID0gZnVuY3Rpb24oKSB7DQogIHZhciBzY2FsZSA9IDIwMCwNCiAgICAgIHRyYW5zbGF0ZSA9IFs0ODAsIDI1MF0sDQogICAgICB4MCwgLy8gb3JpZ2luIGxvbmdpdHVkZSBpbiByYWRpYW5zDQogICAgICB5MCwgLy8gb3JpZ2luIGxhdGl0dWRlIGluIHJhZGlhbnMNCiAgICAgIHkxLCAvLyBwYXJhbGxlbCBsYXRpdHVkZSBpbiByYWRpYW5zDQogICAgICBjMTsgLy8gY290KHkxKQ0KDQogIGZ1bmN0aW9uIGJvbm5lKGNvb3JkaW5hdGVzKSB7DQogICAgdmFyIHggPSBjb29yZGluYXRlc1swXSAqIGQzX2dlb19yYWRpYW5zIC0geDAsDQogICAgICAgIHkgPSBjb29yZGluYXRlc1sxXSAqIGQzX2dlb19yYWRpYW5zIC0geTA7DQogICAgaWYgKHkxKSB7DQogICAgICB2YXIgcCA9IGMxICsgeTEgLSB5LCBFID0geCAqIE1hdGguY29zKHkpIC8gcDsNCiAgICAgIHggPSBwICogTWF0aC5zaW4oRSk7DQogICAgICB5ID0gcCAqIE1hdGguY29zKEUpIC0gYzE7DQogICAgfSBlbHNlIHsNCiAgICAgIHggKj0gTWF0aC5jb3MoeSk7DQogICAgICB5ICo9IC0xOw0KICAgIH0NCiAgICByZXR1cm4gWw0KICAgICAgc2NhbGUgKiB4ICsgdHJhbnNsYXRlWzBdLA0KICAgICAgc2NhbGUgKiB5ICsgdHJhbnNsYXRlWzFdDQogICAgXTsNCiAgfQ0KDQogIGJvbm5lLmludmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7DQogICAgdmFyIHggPSAoY29vcmRpbmF0ZXNbMF0gLSB0cmFuc2xhdGVbMF0pIC8gc2NhbGUsDQogICAgICAgIHkgPSAoY29vcmRpbmF0ZXNbMV0gLSB0cmFuc2xhdGVbMV0pIC8gc2NhbGU7DQogICAgaWYgKHkxKSB7DQogICAgICB2YXIgYyA9IGMxICsgeSwgcCA9IE1hdGguc3FydCh4ICogeCArIGMgKiBjKTsNCiAgICAgIHkgPSBjMSArIHkxIC0gcDsNCiAgICAgIHggPSB4MCArIHAgKiBNYXRoLmF0YW4yKHgsIGMpIC8gTWF0aC5jb3MoeSk7DQogICAgfSBlbHNlIHsNCiAgICAgIHkgKj0gLTE7DQogICAgICB4IC89IE1hdGguY29zKHkpOw0KICAgIH0NCiAgICByZXR1cm4gWw0KICAgICAgeCAvIGQzX2dlb19yYWRpYW5zLA0KICAgICAgeSAvIGQzX2dlb19yYWRpYW5zDQogICAgXTsNCiAgfTsNCg0KICAvLyA5MMKwIGZvciBXZXJuZXIsIDDCsCBmb3IgU2ludXNvaWRhbA0KICBib25uZS5wYXJhbGxlbCA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MSAvIGQzX2dlb19yYWRpYW5zOw0KICAgIGMxID0gMSAvIE1hdGgudGFuKHkxID0geCAqIGQzX2dlb19yYWRpYW5zKTsNCiAgICByZXR1cm4gYm9ubmU7DQogIH07DQoNCiAgYm9ubmUub3JpZ2luID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFt4MCAvIGQzX2dlb19yYWRpYW5zLCB5MCAvIGQzX2dlb19yYWRpYW5zXTsNCiAgICB4MCA9IHhbMF0gKiBkM19nZW9fcmFkaWFuczsNCiAgICB5MCA9IHhbMV0gKiBkM19nZW9fcmFkaWFuczsNCiAgICByZXR1cm4gYm9ubmU7DQogIH07DQoNCiAgYm9ubmUuc2NhbGUgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2NhbGU7DQogICAgc2NhbGUgPSAreDsNCiAgICByZXR1cm4gYm9ubmU7DQogIH07DQoNCiAgYm9ubmUudHJhbnNsYXRlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRyYW5zbGF0ZTsNCiAgICB0cmFuc2xhdGUgPSBbK3hbMF0sICt4WzFdXTsNCiAgICByZXR1cm4gYm9ubmU7DQogIH07DQoNCiAgcmV0dXJuIGJvbm5lLm9yaWdpbihbMCwgMF0pLnBhcmFsbGVsKDQ1KTsNCn07DQpkMy5nZW8uZXF1aXJlY3Rhbmd1bGFyID0gZnVuY3Rpb24oKSB7DQogIHZhciBzY2FsZSA9IDUwMCwNCiAgICAgIHRyYW5zbGF0ZSA9IFs0ODAsIDI1MF07DQoNCiAgZnVuY3Rpb24gZXF1aXJlY3Rhbmd1bGFyKGNvb3JkaW5hdGVzKSB7DQogICAgdmFyIHggPSBjb29yZGluYXRlc1swXSAvIDM2MCwNCiAgICAgICAgeSA9IC1jb29yZGluYXRlc1sxXSAvIDM2MDsNCiAgICByZXR1cm4gWw0KICAgICAgc2NhbGUgKiB4ICsgdHJhbnNsYXRlWzBdLA0KICAgICAgc2NhbGUgKiB5ICsgdHJhbnNsYXRlWzFdDQogICAgXTsNCiAgfQ0KDQogIGVxdWlyZWN0YW5ndWxhci5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgew0KICAgIHZhciB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLA0KICAgICAgICB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdHJhbnNsYXRlWzFdKSAvIHNjYWxlOw0KICAgIHJldHVybiBbDQogICAgICAzNjAgKiB4LA0KICAgICAgLTM2MCAqIHkNCiAgICBdOw0KICB9Ow0KDQogIGVxdWlyZWN0YW5ndWxhci5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsNCiAgICBzY2FsZSA9ICt4Ow0KICAgIHJldHVybiBlcXVpcmVjdGFuZ3VsYXI7DQogIH07DQoNCiAgZXF1aXJlY3Rhbmd1bGFyLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7DQogICAgdHJhbnNsYXRlID0gWyt4WzBdLCAreFsxXV07DQogICAgcmV0dXJuIGVxdWlyZWN0YW5ndWxhcjsNCiAgfTsNCg0KICByZXR1cm4gZXF1aXJlY3Rhbmd1bGFyOw0KfTsNCmQzLmdlby5tZXJjYXRvciA9IGZ1bmN0aW9uKCkgew0KICB2YXIgc2NhbGUgPSA1MDAsDQogICAgICB0cmFuc2xhdGUgPSBbNDgwLCAyNTBdOw0KDQogIGZ1bmN0aW9uIG1lcmNhdG9yKGNvb3JkaW5hdGVzKSB7DQogICAgdmFyIHggPSBjb29yZGluYXRlc1swXSAvIDM2MCwNCiAgICAgICAgeSA9IC0oTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyBjb29yZGluYXRlc1sxXSAqIGQzX2dlb19yYWRpYW5zIC8gMikpIC8gZDNfZ2VvX3JhZGlhbnMpIC8gMzYwOw0KICAgIHJldHVybiBbDQogICAgICBzY2FsZSAqIHggKyB0cmFuc2xhdGVbMF0sDQogICAgICBzY2FsZSAqIE1hdGgubWF4KC0uNSwgTWF0aC5taW4oLjUsIHkpKSArIHRyYW5zbGF0ZVsxXQ0KICAgIF07DQogIH0NCg0KICBtZXJjYXRvci5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgew0KICAgIHZhciB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLA0KICAgICAgICB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdHJhbnNsYXRlWzFdKSAvIHNjYWxlOw0KICAgIHJldHVybiBbDQogICAgICAzNjAgKiB4LA0KICAgICAgMiAqIE1hdGguYXRhbihNYXRoLmV4cCgtMzYwICogeSAqIGQzX2dlb19yYWRpYW5zKSkgLyBkM19nZW9fcmFkaWFucyAtIDkwDQogICAgXTsNCiAgfTsNCg0KICBtZXJjYXRvci5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsNCiAgICBzY2FsZSA9ICt4Ow0KICAgIHJldHVybiBtZXJjYXRvcjsNCiAgfTsNCg0KICBtZXJjYXRvci50cmFuc2xhdGUgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdHJhbnNsYXRlOw0KICAgIHRyYW5zbGF0ZSA9IFsreFswXSwgK3hbMV1dOw0KICAgIHJldHVybiBtZXJjYXRvcjsNCiAgfTsNCg0KICByZXR1cm4gbWVyY2F0b3I7DQp9Ow0KZnVuY3Rpb24gZDNfZ2VvX3R5cGUodHlwZXMsIGRlZmF1bHRWYWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7DQogICAgcmV0dXJuIG9iamVjdCAmJiB0eXBlcy5oYXNPd25Qcm9wZXJ0eShvYmplY3QudHlwZSkgPyB0eXBlc1tvYmplY3QudHlwZV0ob2JqZWN0KSA6IGRlZmF1bHRWYWx1ZTsNCiAgfTsNCn0NCi8qKg0KICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEgR2VvSlNPTiBvYmplY3QgKGUuZy4sIGEgZmVhdHVyZSksIHJldHVybnMNCiAqIHRoZSBjb3JyZXNwb25kaW5nIFNWRyBwYXRoLiBUaGUgZnVuY3Rpb24gY2FuIGJlIGN1c3RvbWl6ZWQgYnkgb3ZlcnJpZGluZyB0aGUNCiAqIHByb2plY3Rpb24uIFBvaW50IGZlYXR1cmVzIGFyZSBtYXBwZWQgdG8gY2lyY2xlcyB3aXRoIGEgZGVmYXVsdCByYWRpdXMgb2YNCiAqIDQuNXB4OyB0aGUgcmFkaXVzIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgY29uc3RhbnQgb3IgYSBmdW5jdGlvbiB0aGF0DQogKiBpcyBldmFsdWF0ZWQgcGVyIG9iamVjdC4NCiAqLw0KZDMuZ2VvLnBhdGggPSBmdW5jdGlvbigpIHsNCiAgdmFyIHBvaW50UmFkaXVzID0gNC41LA0KICAgICAgcG9pbnRDaXJjbGUgPSBkM19wYXRoX2NpcmNsZShwb2ludFJhZGl1cyksDQogICAgICBwcm9qZWN0aW9uID0gZDMuZ2VvLmFsYmVyc1VzYSgpOw0KDQogIGZ1bmN0aW9uIHBhdGgoZCwgaSkgew0KICAgIGlmICh0eXBlb2YgcG9pbnRSYWRpdXMgPT09ICJmdW5jdGlvbiIpIHsNCiAgICAgIHBvaW50Q2lyY2xlID0gZDNfcGF0aF9jaXJjbGUocG9pbnRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7DQogICAgfQ0KICAgIHJldHVybiBwYXRoVHlwZShkKSB8fCBudWxsOw0KICB9DQoNCiAgZnVuY3Rpb24gcHJvamVjdChjb29yZGluYXRlcykgew0KICAgIHJldHVybiBwcm9qZWN0aW9uKGNvb3JkaW5hdGVzKS5qb2luKCIsIik7DQogIH0NCg0KICB2YXIgcGF0aFR5cGUgPSBkM19nZW9fdHlwZSh7DQoNCiAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24obykgew0KICAgICAgdmFyIHBhdGggPSBbXSwNCiAgICAgICAgICBmZWF0dXJlcyA9IG8uZmVhdHVyZXMsDQogICAgICAgICAgaSA9IC0xLCAvLyBmZWF0dXJlcy5pbmRleA0KICAgICAgICAgIG4gPSBmZWF0dXJlcy5sZW5ndGg7DQogICAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKHBhdGhUeXBlKGZlYXR1cmVzW2ldLmdlb21ldHJ5KSk7DQogICAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsNCiAgICB9LA0KDQogICAgRmVhdHVyZTogZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuIHBhdGhUeXBlKG8uZ2VvbWV0cnkpOw0KICAgIH0sDQoNCiAgICBQb2ludDogZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuICJNIiArIHByb2plY3Qoby5jb29yZGluYXRlcykgKyBwb2ludENpcmNsZTsNCiAgICB9LA0KDQogICAgTXVsdGlQb2ludDogZnVuY3Rpb24obykgew0KICAgICAgdmFyIHBhdGggPSBbXSwNCiAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsDQogICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcy5pbmRleA0KICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7DQogICAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJNIiwgcHJvamVjdChjb29yZGluYXRlc1tpXSksIHBvaW50Q2lyY2xlKTsNCiAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOw0KICAgIH0sDQoNCiAgICBMaW5lU3RyaW5nOiBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgcGF0aCA9IFsiTSJdLA0KICAgICAgICAgIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcywNCiAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzLmluZGV4DQogICAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsNCiAgICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2gocHJvamVjdChjb29yZGluYXRlc1tpXSksICJMIik7DQogICAgICBwYXRoLnBvcCgpOw0KICAgICAgcmV0dXJuIHBhdGguam9pbigiIik7DQogICAgfSwNCg0KICAgIE11bHRpTGluZVN0cmluZzogZnVuY3Rpb24obykgew0KICAgICAgdmFyIHBhdGggPSBbXSwNCiAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsDQogICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcy5pbmRleA0KICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsDQogICAgICAgICAgc3ViY29vcmRpbmF0ZXMsIC8vIGNvb3JkaW5hdGVzW2ldDQogICAgICAgICAgaiwgLy8gc3ViY29vcmRpbmF0ZXMuaW5kZXgNCiAgICAgICAgICBtOyAvLyBzdWJjb29yZGluYXRlcy5sZW5ndGgNCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICAgIHN1YmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXNbaV07DQogICAgICAgIGogPSAtMTsNCiAgICAgICAgbSA9IHN1YmNvb3JkaW5hdGVzLmxlbmd0aDsNCiAgICAgICAgcGF0aC5wdXNoKCJNIik7DQogICAgICAgIHdoaWxlICgrK2ogPCBtKSBwYXRoLnB1c2gocHJvamVjdChzdWJjb29yZGluYXRlc1tqXSksICJMIik7DQogICAgICAgIHBhdGgucG9wKCk7DQogICAgICB9DQogICAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsNCiAgICB9LA0KDQogICAgUG9seWdvbjogZnVuY3Rpb24obykgew0KICAgICAgdmFyIHBhdGggPSBbXSwNCiAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsDQogICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcy5pbmRleA0KICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsDQogICAgICAgICAgc3ViY29vcmRpbmF0ZXMsIC8vIGNvb3JkaW5hdGVzW2ldDQogICAgICAgICAgaiwgLy8gc3ViY29vcmRpbmF0ZXMuaW5kZXgNCiAgICAgICAgICBtOyAvLyBzdWJjb29yZGluYXRlcy5sZW5ndGgNCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICAgIHN1YmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXNbaV07DQogICAgICAgIGogPSAtMTsNCiAgICAgICAgaWYgKChtID0gc3ViY29vcmRpbmF0ZXMubGVuZ3RoIC0gMSkgPiAwKSB7DQogICAgICAgICAgcGF0aC5wdXNoKCJNIik7DQogICAgICAgICAgd2hpbGUgKCsraiA8IG0pIHBhdGgucHVzaChwcm9qZWN0KHN1YmNvb3JkaW5hdGVzW2pdKSwgIkwiKTsNCiAgICAgICAgICBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPSAiWiI7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOw0KICAgIH0sDQoNCiAgICBNdWx0aVBvbHlnb246IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBwYXRoID0gW10sDQogICAgICAgICAgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLA0KICAgICAgICAgIGkgPSAtMSwgLy8gY29vcmRpbmF0ZXMgaW5kZXgNCiAgICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoLA0KICAgICAgICAgIHN1YmNvb3JkaW5hdGVzLCAvLyBjb29yZGluYXRlc1tpXQ0KICAgICAgICAgIGosIC8vIHN1YmNvb3JkaW5hdGVzIGluZGV4DQogICAgICAgICAgbSwgLy8gc3ViY29vcmRpbmF0ZXMubGVuZ3RoDQogICAgICAgICAgc3Vic3ViY29vcmRpbmF0ZXMsIC8vIHN1YmNvb3JkaW5hdGVzW2pdDQogICAgICAgICAgaywgLy8gc3Vic3ViY29vcmRpbmF0ZXMgaW5kZXgNCiAgICAgICAgICBwOyAvLyBzdWJzdWJjb29yZGluYXRlcy5sZW5ndGgNCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICAgIHN1YmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXNbaV07DQogICAgICAgIGogPSAtMTsNCiAgICAgICAgbSA9IHN1YmNvb3JkaW5hdGVzLmxlbmd0aDsNCiAgICAgICAgd2hpbGUgKCsraiA8IG0pIHsNCiAgICAgICAgICBzdWJzdWJjb29yZGluYXRlcyA9IHN1YmNvb3JkaW5hdGVzW2pdOw0KICAgICAgICAgIGsgPSAtMTsNCiAgICAgICAgICBpZiAoKHAgPSBzdWJzdWJjb29yZGluYXRlcy5sZW5ndGggLSAxKSA+IDApIHsNCiAgICAgICAgICAgIHBhdGgucHVzaCgiTSIpOw0KICAgICAgICAgICAgd2hpbGUgKCsrayA8IHApIHBhdGgucHVzaChwcm9qZWN0KHN1YnN1YmNvb3JkaW5hdGVzW2tdKSwgIkwiKTsNCiAgICAgICAgICAgIHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9ICJaIjsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOw0KICAgIH0sDQoNCiAgICBHZW9tZXRyeUNvbGxlY3Rpb246IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBwYXRoID0gW10sDQogICAgICAgICAgZ2VvbWV0cmllcyA9IG8uZ2VvbWV0cmllcywNCiAgICAgICAgICBpID0gLTEsIC8vIGdlb21ldHJpZXMgaW5kZXgNCiAgICAgICAgICBuID0gZ2VvbWV0cmllcy5sZW5ndGg7DQogICAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKHBhdGhUeXBlKGdlb21ldHJpZXNbaV0pKTsNCiAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOw0KICAgIH0NCg0KICB9KTsNCg0KICB2YXIgYXJlYVR5cGUgPSBwYXRoLmFyZWEgPSBkM19nZW9fdHlwZSh7DQoNCiAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24obykgew0KICAgICAgdmFyIGFyZWEgPSAwLA0KICAgICAgICAgIGZlYXR1cmVzID0gby5mZWF0dXJlcywNCiAgICAgICAgICBpID0gLTEsIC8vIGZlYXR1cmVzLmluZGV4DQogICAgICAgICAgbiA9IGZlYXR1cmVzLmxlbmd0aDsNCiAgICAgIHdoaWxlICgrK2kgPCBuKSBhcmVhICs9IGFyZWFUeXBlKGZlYXR1cmVzW2ldKTsNCiAgICAgIHJldHVybiBhcmVhOw0KICAgIH0sDQoNCiAgICBGZWF0dXJlOiBmdW5jdGlvbihvKSB7DQogICAgICByZXR1cm4gYXJlYVR5cGUoby5nZW9tZXRyeSk7DQogICAgfSwNCg0KICAgIFBvbHlnb246IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHJldHVybiBwb2x5Z29uQXJlYShvLmNvb3JkaW5hdGVzKTsNCiAgICB9LA0KDQogICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgc3VtID0gMCwNCiAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsDQogICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcyBpbmRleA0KICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7DQogICAgICB3aGlsZSAoKytpIDwgbikgc3VtICs9IHBvbHlnb25BcmVhKGNvb3JkaW5hdGVzW2ldKTsNCiAgICAgIHJldHVybiBzdW07DQogICAgfSwNCg0KICAgIEdlb21ldHJ5Q29sbGVjdGlvbjogZnVuY3Rpb24obykgew0KICAgICAgdmFyIHN1bSA9IDAsDQogICAgICAgICAgZ2VvbWV0cmllcyA9IG8uZ2VvbWV0cmllcywNCiAgICAgICAgICBpID0gLTEsIC8vIGdlb21ldHJpZXMgaW5kZXgNCiAgICAgICAgICBuID0gZ2VvbWV0cmllcy5sZW5ndGg7DQogICAgICB3aGlsZSAoKytpIDwgbikgc3VtICs9IGFyZWFUeXBlKGdlb21ldHJpZXNbaV0pOw0KICAgICAgcmV0dXJuIHN1bTsNCiAgICB9DQoNCiAgfSwgMCk7DQoNCiAgZnVuY3Rpb24gcG9seWdvbkFyZWEoY29vcmRpbmF0ZXMpIHsNCiAgICB2YXIgc3VtID0gYXJlYShjb29yZGluYXRlc1swXSksIC8vIGV4dGVyaW9yIHJpbmcNCiAgICAgICAgaSA9IDAsIC8vIGNvb3JkaW5hdGVzLmluZGV4DQogICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7DQogICAgd2hpbGUgKCsraSA8IG4pIHN1bSAtPSBhcmVhKGNvb3JkaW5hdGVzW2ldKTsgLy8gaG9sZXMNCiAgICByZXR1cm4gc3VtOw0KICB9DQoNCiAgZnVuY3Rpb24gcG9seWdvbkNlbnRyb2lkKGNvb3JkaW5hdGVzKSB7DQogICAgdmFyIHBvbHlnb24gPSBkMy5nZW9tLnBvbHlnb24oY29vcmRpbmF0ZXNbMF0ubWFwKHByb2plY3Rpb24pKSwgLy8gZXh0ZXJpb3IgcmluZw0KICAgICAgICBhcmVhID0gcG9seWdvbi5hcmVhKCksDQogICAgICAgIGNlbnRyb2lkID0gcG9seWdvbi5jZW50cm9pZChhcmVhIDwgMCA/IChhcmVhICo9IC0xLCAxKSA6IC0xKSwNCiAgICAgICAgeCA9IGNlbnRyb2lkWzBdLA0KICAgICAgICB5ID0gY2VudHJvaWRbMV0sDQogICAgICAgIHogPSBhcmVhLA0KICAgICAgICBpID0gMCwgLy8gY29vcmRpbmF0ZXMgaW5kZXgNCiAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgcG9seWdvbiA9IGQzLmdlb20ucG9seWdvbihjb29yZGluYXRlc1tpXS5tYXAocHJvamVjdGlvbikpOyAvLyBob2xlcw0KICAgICAgYXJlYSA9IHBvbHlnb24uYXJlYSgpOw0KICAgICAgY2VudHJvaWQgPSBwb2x5Z29uLmNlbnRyb2lkKGFyZWEgPCAwID8gKGFyZWEgKj0gLTEsIDEpIDogLTEpOw0KICAgICAgeCAtPSBjZW50cm9pZFswXTsNCiAgICAgIHkgLT0gY2VudHJvaWRbMV07DQogICAgICB6IC09IGFyZWE7DQogICAgfQ0KICAgIHJldHVybiBbeCwgeSwgNiAqIHpdOyAvLyB3ZWlnaHRlZCBjZW50cm9pZA0KICB9DQoNCiAgdmFyIGNlbnRyb2lkVHlwZSA9IHBhdGguY2VudHJvaWQgPSBkM19nZW9fdHlwZSh7DQoNCiAgICAvLyBUT0RPIEZlYXR1cmVDb2xsZWN0aW9uDQogICAgLy8gVE9ETyBQb2ludA0KICAgIC8vIFRPRE8gTXVsdGlQb2ludA0KICAgIC8vIFRPRE8gTGluZVN0cmluZw0KICAgIC8vIFRPRE8gTXVsdGlMaW5lU3RyaW5nDQogICAgLy8gVE9ETyBHZW9tZXRyeUNvbGxlY3Rpb24NCg0KICAgIEZlYXR1cmU6IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHJldHVybiBjZW50cm9pZFR5cGUoby5nZW9tZXRyeSk7DQogICAgfSwNCg0KICAgIFBvbHlnb246IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjZW50cm9pZCA9IHBvbHlnb25DZW50cm9pZChvLmNvb3JkaW5hdGVzKTsNCiAgICAgIHJldHVybiBbY2VudHJvaWRbMF0gLyBjZW50cm9pZFsyXSwgY2VudHJvaWRbMV0gLyBjZW50cm9pZFsyXV07DQogICAgfSwNCg0KICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24obykgew0KICAgICAgdmFyIGFyZWEgPSAwLA0KICAgICAgICAgIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcywNCiAgICAgICAgICBjZW50cm9pZCwNCiAgICAgICAgICB4ID0gMCwNCiAgICAgICAgICB5ID0gMCwNCiAgICAgICAgICB6ID0gMCwNCiAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzIGluZGV4DQogICAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsNCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICAgIGNlbnRyb2lkID0gcG9seWdvbkNlbnRyb2lkKGNvb3JkaW5hdGVzW2ldKTsNCiAgICAgICAgeCArPSBjZW50cm9pZFswXTsNCiAgICAgICAgeSArPSBjZW50cm9pZFsxXTsNCiAgICAgICAgeiArPSBjZW50cm9pZFsyXTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBbeCAvIHosIHkgLyB6XTsNCiAgICB9DQoNCiAgfSk7DQoNCiAgZnVuY3Rpb24gYXJlYShjb29yZGluYXRlcykgew0KICAgIHJldHVybiBNYXRoLmFicyhkMy5nZW9tLnBvbHlnb24oY29vcmRpbmF0ZXMubWFwKHByb2plY3Rpb24pKS5hcmVhKCkpOw0KICB9DQoNCiAgcGF0aC5wcm9qZWN0aW9uID0gZnVuY3Rpb24oeCkgew0KICAgIHByb2plY3Rpb24gPSB4Ow0KICAgIHJldHVybiBwYXRoOw0KICB9Ow0KDQogIHBhdGgucG9pbnRSYWRpdXMgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iKSBwb2ludFJhZGl1cyA9IHg7DQogICAgZWxzZSB7DQogICAgICBwb2ludFJhZGl1cyA9ICt4Ow0KICAgICAgcG9pbnRDaXJjbGUgPSBkM19wYXRoX2NpcmNsZShwb2ludFJhZGl1cyk7DQogICAgfQ0KICAgIHJldHVybiBwYXRoOw0KICB9Ow0KDQogIHJldHVybiBwYXRoOw0KfTsNCg0KZnVuY3Rpb24gZDNfcGF0aF9jaXJjbGUocmFkaXVzKSB7DQogIHJldHVybiAibTAsIiArIHJhZGl1cw0KICAgICAgKyAiYSIgKyByYWRpdXMgKyAiLCIgKyByYWRpdXMgKyAiIDAgMSwxIDAsIiArICgtMiAqIHJhZGl1cykNCiAgICAgICsgImEiICsgcmFkaXVzICsgIiwiICsgcmFkaXVzICsgIiAwIDEsMSAwLCIgKyAoKzIgKiByYWRpdXMpDQogICAgICArICJ6IjsNCn0NCi8qKg0KICogR2l2ZW4gYSBHZW9KU09OIG9iamVjdCwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBib3VuZGluZyBib3guIFRoZSBib3VuZGluZw0KICogYm94IGlzIHJlcHJlc2VudGVkIGJ5IGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5OiBbW2xlZnQsIGJvdHRvbV0sIFtyaWdodCwNCiAqIHRvcF1dLCB3aGVyZSBsZWZ0IGlzIHRoZSBtaW5pbXVtIGxvbmdpdHVkZSwgYm90dG9tIGlzIHRoZSBtaW5pbXVtIGxhdGl0dWRlLA0KICogcmlnaHQgaXMgbWF4aW11bSBsb25naXR1ZGUsIGFuZCB0b3AgaXMgdGhlIG1heGltdW0gbGF0aXR1ZGUuDQogKi8NCmQzLmdlby5ib3VuZHMgPSBmdW5jdGlvbihmZWF0dXJlKSB7DQogIHZhciBsZWZ0ID0gSW5maW5pdHksDQogICAgICBib3R0b20gPSBJbmZpbml0eSwNCiAgICAgIHJpZ2h0ID0gLUluZmluaXR5LA0KICAgICAgdG9wID0gLUluZmluaXR5Ow0KICBkM19nZW9fYm91bmRzKGZlYXR1cmUsIGZ1bmN0aW9uKHgsIHkpIHsNCiAgICBpZiAoeCA8IGxlZnQpIGxlZnQgPSB4Ow0KICAgIGlmICh4ID4gcmlnaHQpIHJpZ2h0ID0geDsNCiAgICBpZiAoeSA8IGJvdHRvbSkgYm90dG9tID0geTsNCiAgICBpZiAoeSA+IHRvcCkgdG9wID0geTsNCiAgfSk7DQogIHJldHVybiBbW2xlZnQsIGJvdHRvbV0sIFtyaWdodCwgdG9wXV07DQp9Ow0KDQpmdW5jdGlvbiBkM19nZW9fYm91bmRzKG8sIGYpIHsNCiAgaWYgKGQzX2dlb19ib3VuZHNUeXBlcy5oYXNPd25Qcm9wZXJ0eShvLnR5cGUpKSBkM19nZW9fYm91bmRzVHlwZXNbby50eXBlXShvLCBmKTsNCn0NCg0KdmFyIGQzX2dlb19ib3VuZHNUeXBlcyA9IHsNCiAgRmVhdHVyZTogZDNfZ2VvX2JvdW5kc0ZlYXR1cmUsDQogIEZlYXR1cmVDb2xsZWN0aW9uOiBkM19nZW9fYm91bmRzRmVhdHVyZUNvbGxlY3Rpb24sDQogIEdlb21ldHJ5Q29sbGVjdGlvbjogZDNfZ2VvX2JvdW5kc0dlb21ldHJ5Q29sbGVjdGlvbiwNCiAgTGluZVN0cmluZzogZDNfZ2VvX2JvdW5kc0xpbmVTdHJpbmcsDQogIE11bHRpTGluZVN0cmluZzogZDNfZ2VvX2JvdW5kc011bHRpTGluZVN0cmluZywNCiAgTXVsdGlQb2ludDogZDNfZ2VvX2JvdW5kc0xpbmVTdHJpbmcsDQogIE11bHRpUG9seWdvbjogZDNfZ2VvX2JvdW5kc011bHRpUG9seWdvbiwNCiAgUG9pbnQ6IGQzX2dlb19ib3VuZHNQb2ludCwNCiAgUG9seWdvbjogZDNfZ2VvX2JvdW5kc1BvbHlnb24NCn07DQoNCmZ1bmN0aW9uIGQzX2dlb19ib3VuZHNGZWF0dXJlKG8sIGYpIHsNCiAgZDNfZ2VvX2JvdW5kcyhvLmdlb21ldHJ5LCBmKTsNCn0NCg0KZnVuY3Rpb24gZDNfZ2VvX2JvdW5kc0ZlYXR1cmVDb2xsZWN0aW9uKG8sIGYpIHsNCiAgZm9yICh2YXIgYSA9IG8uZmVhdHVyZXMsIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCiAgICBkM19nZW9fYm91bmRzKGFbaV0uZ2VvbWV0cnksIGYpOw0KICB9DQp9DQoNCmZ1bmN0aW9uIGQzX2dlb19ib3VuZHNHZW9tZXRyeUNvbGxlY3Rpb24obywgZikgew0KICBmb3IgKHZhciBhID0gby5nZW9tZXRyaWVzLCBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQogICAgZDNfZ2VvX2JvdW5kcyhhW2ldLCBmKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBkM19nZW9fYm91bmRzTGluZVN0cmluZyhvLCBmKSB7DQogIGZvciAodmFyIGEgPSBvLmNvb3JkaW5hdGVzLCBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQogICAgZi5hcHBseShudWxsLCBhW2ldKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBkM19nZW9fYm91bmRzTXVsdGlMaW5lU3RyaW5nKG8sIGYpIHsNCiAgZm9yICh2YXIgYSA9IG8uY29vcmRpbmF0ZXMsIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCiAgICBmb3IgKHZhciBiID0gYVtpXSwgaiA9IDAsIG0gPSBiLmxlbmd0aDsgaiA8IG07IGorKykgew0KICAgICAgZi5hcHBseShudWxsLCBiW2pdKTsNCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gZDNfZ2VvX2JvdW5kc011bHRpUG9seWdvbihvLCBmKSB7DQogIGZvciAodmFyIGEgPSBvLmNvb3JkaW5hdGVzLCBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQogICAgZm9yICh2YXIgYiA9IGFbaV1bMF0sIGogPSAwLCBtID0gYi5sZW5ndGg7IGogPCBtOyBqKyspIHsNCiAgICAgIGYuYXBwbHkobnVsbCwgYltqXSk7DQogICAgfQ0KICB9DQp9DQoNCmZ1bmN0aW9uIGQzX2dlb19ib3VuZHNQb2ludChvLCBmKSB7DQogIGYuYXBwbHkobnVsbCwgby5jb29yZGluYXRlcyk7DQp9DQoNCmZ1bmN0aW9uIGQzX2dlb19ib3VuZHNQb2x5Z29uKG8sIGYpIHsNCiAgZm9yICh2YXIgYSA9IG8uY29vcmRpbmF0ZXNbMF0sIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCiAgICBmLmFwcGx5KG51bGwsIGFbaV0pOw0KICB9DQp9DQovLyBUT0RPIGJyZWFrQXREYXRlTGluZT8NCg0KZDMuZ2VvLmNpcmNsZSA9IGZ1bmN0aW9uKCkgew0KICB2YXIgb3JpZ2luID0gWzAsIDBdLA0KICAgICAgZGVncmVlcyA9IDkwIC0gMWUtMiwNCiAgICAgIHJhZGlhbnMgPSBkZWdyZWVzICogZDNfZ2VvX3JhZGlhbnMsDQogICAgICBhcmMgPSBkMy5nZW8uZ3JlYXRBcmMoKS50YXJnZXQoT2JqZWN0KTsNCg0KICBmdW5jdGlvbiBjaXJjbGUoKSB7DQogICAgLy8gVE9ETyByZW5kZXIgYSBjaXJjbGUgYXMgYSBQb2x5Z29uDQogIH0NCg0KICBmdW5jdGlvbiB2aXNpYmxlKHBvaW50KSB7DQogICAgcmV0dXJuIGFyYy5kaXN0YW5jZShwb2ludCkgPCByYWRpYW5zOw0KICB9DQoNCiAgY2lyY2xlLmNsaXAgPSBmdW5jdGlvbihkKSB7DQogICAgYXJjLnNvdXJjZSh0eXBlb2Ygb3JpZ2luID09PSAiZnVuY3Rpb24iID8gb3JpZ2luLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBvcmlnaW4pOw0KICAgIHJldHVybiBjbGlwVHlwZShkKTsNCiAgfTsNCg0KICB2YXIgY2xpcFR5cGUgPSBkM19nZW9fdHlwZSh7DQoNCiAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24obykgew0KICAgICAgdmFyIGZlYXR1cmVzID0gby5mZWF0dXJlcy5tYXAoY2xpcFR5cGUpLmZpbHRlcihPYmplY3QpOw0KICAgICAgcmV0dXJuIGZlYXR1cmVzICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5mZWF0dXJlcyA9IGZlYXR1cmVzLCBvKTsNCiAgICB9LA0KDQogICAgRmVhdHVyZTogZnVuY3Rpb24obykgew0KICAgICAgdmFyIGdlb21ldHJ5ID0gY2xpcFR5cGUoby5nZW9tZXRyeSk7DQogICAgICByZXR1cm4gZ2VvbWV0cnkgJiYgKG8gPSBPYmplY3QuY3JlYXRlKG8pLCBvLmdlb21ldHJ5ID0gZ2VvbWV0cnksIG8pOw0KICAgIH0sDQoNCiAgICBQb2ludDogZnVuY3Rpb24obykgew0KICAgICAgcmV0dXJuIHZpc2libGUoby5jb29yZGluYXRlcykgJiYgbzsNCiAgICB9LA0KDQogICAgTXVsdGlQb2ludDogZnVuY3Rpb24obykgew0KICAgICAgdmFyIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcy5maWx0ZXIodmlzaWJsZSk7DQogICAgICByZXR1cm4gY29vcmRpbmF0ZXMubGVuZ3RoICYmIHsNCiAgICAgICAgdHlwZTogby50eXBlLA0KICAgICAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXMNCiAgICAgIH07DQogICAgfSwNCg0KICAgIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb29yZGluYXRlcyA9IGNsaXAoby5jb29yZGluYXRlcyk7DQogICAgICByZXR1cm4gY29vcmRpbmF0ZXMubGVuZ3RoICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzLCBvKTsNCiAgICB9LA0KDQogICAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLm1hcChjbGlwKS5maWx0ZXIoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sZW5ndGg7IH0pOw0KICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzLmxlbmd0aCAmJiAobyA9IE9iamVjdC5jcmVhdGUobyksIG8uY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcywgbyk7DQogICAgfSwNCg0KICAgIFBvbHlnb246IGZ1bmN0aW9uKG8pIHsNCiAgICAgIHZhciBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMubWFwKGNsaXApOw0KICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdLmxlbmd0aCAmJiAobyA9IE9iamVjdC5jcmVhdGUobyksIG8uY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcywgbyk7DQogICAgfSwNCg0KICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24obykgew0KICAgICAgdmFyIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcy5tYXAoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5tYXAoY2xpcCk7IH0pLmZpbHRlcihmdW5jdGlvbihkKSB7IHJldHVybiBkWzBdLmxlbmd0aDsgfSk7DQogICAgICByZXR1cm4gY29vcmRpbmF0ZXMubGVuZ3RoICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzLCBvKTsNCiAgICB9LA0KDQogICAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdGlvbihvKSB7DQogICAgICB2YXIgZ2VvbWV0cmllcyA9IG8uZ2VvbWV0cmllcy5tYXAoY2xpcFR5cGUpLmZpbHRlcihPYmplY3QpOw0KICAgICAgcmV0dXJuIGdlb21ldHJpZXMubGVuZ3RoICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5nZW9tZXRyaWVzID0gZ2VvbWV0cmllcywgbyk7DQogICAgfQ0KDQogIH0pOw0KDQogIGZ1bmN0aW9uIGNsaXAoY29vcmRpbmF0ZXMpIHsNCiAgICB2YXIgaSA9IC0xLA0KICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoLA0KICAgICAgICBjbGlwcGVkID0gW10sDQogICAgICAgIHAwLA0KICAgICAgICBwMSwNCiAgICAgICAgcDIsDQogICAgICAgIGQwLA0KICAgICAgICBkMTsNCg0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBkMSA9IGFyYy5kaXN0YW5jZShwMiA9IGNvb3JkaW5hdGVzW2ldKTsNCiAgICAgIGlmIChkMSA8IHJhZGlhbnMpIHsNCiAgICAgICAgaWYgKHAxKSBjbGlwcGVkLnB1c2goZDNfZ2VvX2dyZWF0QXJjSW50ZXJwb2xhdGUocDEsIHAyKSgoZDAgLSByYWRpYW5zKSAvIChkMCAtIGQxKSkpOw0KICAgICAgICBjbGlwcGVkLnB1c2gocDIpOw0KICAgICAgICBwMCA9IHAxID0gbnVsbDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHAxID0gcDI7DQogICAgICAgIGlmICghcDAgJiYgY2xpcHBlZC5sZW5ndGgpIHsNCiAgICAgICAgICBjbGlwcGVkLnB1c2goZDNfZ2VvX2dyZWF0QXJjSW50ZXJwb2xhdGUoY2xpcHBlZFtjbGlwcGVkLmxlbmd0aCAtIDFdLCBwMSkoKHJhZGlhbnMgLSBkMCkgLyAoZDEgLSBkMCkpKTsNCiAgICAgICAgICBwMCA9IHAxOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBkMCA9IGQxOw0KICAgIH0NCg0KICAgIGlmIChwMSAmJiBjbGlwcGVkLmxlbmd0aCkgew0KICAgICAgZDEgPSBhcmMuZGlzdGFuY2UocDIgPSBjbGlwcGVkWzBdKTsNCiAgICAgIGNsaXBwZWQucHVzaChkM19nZW9fZ3JlYXRBcmNJbnRlcnBvbGF0ZShwMSwgcDIpKChkMCAtIHJhZGlhbnMpIC8gKGQwIC0gZDEpKSk7DQogICAgfQ0KDQogICAgcmV0dXJuIHJlc2FtcGxlKGNsaXBwZWQpOw0KICB9DQoNCiAgLy8gUmVzYW1wbGUgY29vcmRpbmF0ZXMsIGNyZWF0aW5nIGdyZWF0IGFyY3MgYmV0d2VlbiBlYWNoLg0KICBmdW5jdGlvbiByZXNhbXBsZShjb29yZGluYXRlcykgew0KICAgIHZhciBpID0gMCwNCiAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCwNCiAgICAgICAgaiwNCiAgICAgICAgbSwNCiAgICAgICAgcmVzYW1wbGVkID0gbiA/IFtjb29yZGluYXRlc1swXV0gOiBjb29yZGluYXRlcywNCiAgICAgICAgcmVzYW1wbGVzLA0KICAgICAgICBvcmlnaW4gPSBhcmMuc291cmNlKCk7DQoNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgcmVzYW1wbGVzID0gYXJjLnNvdXJjZShjb29yZGluYXRlc1tpIC0gMV0pKGNvb3JkaW5hdGVzW2ldKS5jb29yZGluYXRlczsNCiAgICAgIGZvciAoaiA9IDAsIG0gPSByZXNhbXBsZXMubGVuZ3RoOyArK2ogPCBtOykgcmVzYW1wbGVkLnB1c2gocmVzYW1wbGVzW2pdKTsNCiAgICB9DQoNCiAgICBhcmMuc291cmNlKG9yaWdpbik7DQogICAgcmV0dXJuIHJlc2FtcGxlZDsNCiAgfQ0KDQogIGNpcmNsZS5vcmlnaW4gPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZ2luOw0KICAgIG9yaWdpbiA9IHg7DQogICAgcmV0dXJuIGNpcmNsZTsNCiAgfTsNCg0KICBjaXJjbGUuYW5nbGUgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZGVncmVlczsNCiAgICByYWRpYW5zID0gKGRlZ3JlZXMgPSAreCkgKiBkM19nZW9fcmFkaWFuczsNCiAgICByZXR1cm4gY2lyY2xlOw0KICB9Ow0KDQogIC8vIFByZWNpc2lvbiBpcyBzcGVjaWZpZWQgaW4gZGVncmVlcy4NCiAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBhcmMucHJlY2lzaW9uKCk7DQogICAgYXJjLnByZWNpc2lvbih4KTsNCiAgICByZXR1cm4gY2lyY2xlOw0KICB9Ow0KDQogIHJldHVybiBjaXJjbGU7DQp9DQpkMy5nZW8uZ3JlYXRBcmMgPSBmdW5jdGlvbigpIHsNCiAgdmFyIHNvdXJjZSA9IGQzX2dlb19ncmVhdEFyY1NvdXJjZSwNCiAgICAgIHRhcmdldCA9IGQzX2dlb19ncmVhdEFyY1RhcmdldCwNCiAgICAgIHByZWNpc2lvbiA9IDYgKiBkM19nZW9fcmFkaWFuczsNCg0KICBmdW5jdGlvbiBncmVhdEFyYygpIHsNCiAgICB2YXIgYSA9IHR5cGVvZiBzb3VyY2UgPT09ICJmdW5jdGlvbiIgPyBzb3VyY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNvdXJjZSwNCiAgICAgICAgYiA9IHR5cGVvZiB0YXJnZXQgPT09ICJmdW5jdGlvbiIgPyB0YXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRhcmdldCwNCiAgICAgICAgaSA9IGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKGEsIGIpLA0KICAgICAgICBkdCA9IHByZWNpc2lvbiAvIGkuZCwNCiAgICAgICAgdCA9IDAsDQogICAgICAgIGNvb3JkaW5hdGVzID0gW2FdOw0KICAgIHdoaWxlICgodCArPSBkdCkgPCAxKSBjb29yZGluYXRlcy5wdXNoKGkodCkpOw0KICAgIGNvb3JkaW5hdGVzLnB1c2goYik7DQogICAgcmV0dXJuIHsNCiAgICAgIHR5cGU6ICJMaW5lU3RyaW5nIiwNCiAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlcw0KICAgIH07DQogIH0NCg0KICAvLyBMZW5ndGggcmV0dXJuZWQgaW4gcmFkaWFuczsgbXVsdGlwbHkgYnkgcmFkaXVzIGZvciBkaXN0YW5jZS4NCiAgZ3JlYXRBcmMuZGlzdGFuY2UgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgYSA9IHR5cGVvZiBzb3VyY2UgPT09ICJmdW5jdGlvbiIgPyBzb3VyY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNvdXJjZSwNCiAgICAgICAgYiA9IHR5cGVvZiB0YXJnZXQgPT09ICJmdW5jdGlvbiIgPyB0YXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRhcmdldDsNCiAgICAgcmV0dXJuIGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKGEsIGIpLmQ7DQogIH07DQoNCiAgZ3JlYXRBcmMuc291cmNlID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTsNCiAgICBzb3VyY2UgPSB4Ow0KICAgIHJldHVybiBncmVhdEFyYzsNCiAgfTsNCg0KICBncmVhdEFyYy50YXJnZXQgPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0Ow0KICAgIHRhcmdldCA9IHg7DQogICAgcmV0dXJuIGdyZWF0QXJjOw0KICB9Ow0KDQogIC8vIFByZWNpc2lvbiBpcyBzcGVjaWZpZWQgaW4gZGVncmVlcy4NCiAgZ3JlYXRBcmMucHJlY2lzaW9uID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByZWNpc2lvbiAvIGQzX2dlb19yYWRpYW5zOw0KICAgIHByZWNpc2lvbiA9IHggKiBkM19nZW9fcmFkaWFuczsNCiAgICByZXR1cm4gZ3JlYXRBcmM7DQogIH07DQoNCiAgcmV0dXJuIGdyZWF0QXJjOw0KfTsNCg0KZnVuY3Rpb24gZDNfZ2VvX2dyZWF0QXJjU291cmNlKGQpIHsNCiAgcmV0dXJuIGQuc291cmNlOw0KfQ0KDQpmdW5jdGlvbiBkM19nZW9fZ3JlYXRBcmNUYXJnZXQoZCkgew0KICByZXR1cm4gZC50YXJnZXQ7DQp9DQoNCmZ1bmN0aW9uIGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKGEsIGIpIHsNCiAgdmFyIHgwID0gYVswXSAqIGQzX2dlb19yYWRpYW5zLCBjeDAgPSBNYXRoLmNvcyh4MCksIHN4MCA9IE1hdGguc2luKHgwKSwNCiAgICAgIHkwID0gYVsxXSAqIGQzX2dlb19yYWRpYW5zLCBjeTAgPSBNYXRoLmNvcyh5MCksIHN5MCA9IE1hdGguc2luKHkwKSwNCiAgICAgIHgxID0gYlswXSAqIGQzX2dlb19yYWRpYW5zLCBjeDEgPSBNYXRoLmNvcyh4MSksIHN4MSA9IE1hdGguc2luKHgxKSwNCiAgICAgIHkxID0gYlsxXSAqIGQzX2dlb19yYWRpYW5zLCBjeTEgPSBNYXRoLmNvcyh5MSksIHN5MSA9IE1hdGguc2luKHkxKSwNCiAgICAgIGQgPSBpbnRlcnBvbGF0ZS5kID0gTWF0aC5hY29zKE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBzeTAgKiBzeTEgKyBjeTAgKiBjeTEgKiBNYXRoLmNvcyh4MSAtIHgwKSkpKSwNCiAgICAgIHNkID0gTWF0aC5zaW4oZCk7DQoNCiAgLy8gRnJvbSBodHRwOi8vd2lsbGlhbXMuYmVzdC52d2gubmV0L2F2Zm9ybS5odG0jSW50ZXJtZWRpYXRlDQogIGZ1bmN0aW9uIGludGVycG9sYXRlKHQpIHsNCiAgICB2YXIgQSA9IE1hdGguc2luKGQgLSAodCAqPSBkKSkgLyBzZCwNCiAgICAgICAgQiA9IE1hdGguc2luKHQpIC8gc2QsDQogICAgICAgIHggPSBBICogY3kwICogY3gwICsgQiAqIGN5MSAqIGN4MSwNCiAgICAgICAgeSA9IEEgKiBjeTAgKiBzeDAgKyBCICogY3kxICogc3gxLA0KICAgICAgICB6ID0gQSAqIHN5MCAgICAgICArIEIgKiBzeTE7DQogICAgcmV0dXJuIFsNCiAgICAgIE1hdGguYXRhbjIoeSwgeCkgLyBkM19nZW9fcmFkaWFucywNCiAgICAgIE1hdGguYXRhbjIoeiwgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpKSAvIGQzX2dlb19yYWRpYW5zDQogICAgXTsNCiAgfQ0KDQogIHJldHVybiBpbnRlcnBvbGF0ZTsNCn0NCmQzLmdlby5ncmVhdENpcmNsZSA9IGQzLmdlby5jaXJjbGU7DQpkMy5nZW9tID0ge307DQovKioNCiAqIENvbXB1dGVzIGEgY29udG91ciBmb3IgYSBnaXZlbiBpbnB1dCBncmlkIGZ1bmN0aW9uIHVzaW5nIHRoZSA8YQ0KICogaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYXJjaGluZ19zcXVhcmVzIj5tYXJjaGluZw0KICogc3F1YXJlczwvYT4gYWxnb3JpdGhtLiBSZXR1cm5zIHRoZSBjb250b3VyIHBvbHlnb24gYXMgYW4gYXJyYXkgb2YgcG9pbnRzLg0KICoNCiAqIEBwYXJhbSBncmlkIGEgdHdvLWlucHV0IGZ1bmN0aW9uKHgsIHkpIHRoYXQgcmV0dXJucyB0cnVlIGZvciB2YWx1ZXMNCiAqIGluc2lkZSB0aGUgY29udG91ciBhbmQgZmFsc2UgZm9yIHZhbHVlcyBvdXRzaWRlIHRoZSBjb250b3VyLg0KICogQHBhcmFtIHN0YXJ0IGFuIG9wdGlvbmFsIHN0YXJ0aW5nIHBvaW50IFt4LCB5XSBvbiB0aGUgZ3JpZC4NCiAqIEByZXR1cm5zIHBvbHlnb24gW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQ0KICovDQpkMy5nZW9tLmNvbnRvdXIgPSBmdW5jdGlvbihncmlkLCBzdGFydCkgew0KICB2YXIgcyA9IHN0YXJ0IHx8IGQzX2dlb21fY29udG91clN0YXJ0KGdyaWQpLCAvLyBzdGFydGluZyBwb2ludA0KICAgICAgYyA9IFtdLCAgICAvLyBjb250b3VyIHBvbHlnb24NCiAgICAgIHggPSBzWzBdLCAgLy8gY3VycmVudCB4IHBvc2l0aW9uDQogICAgICB5ID0gc1sxXSwgIC8vIGN1cnJlbnQgeSBwb3NpdGlvbg0KICAgICAgZHggPSAwLCAgICAvLyBuZXh0IHggZGlyZWN0aW9uDQogICAgICBkeSA9IDAsICAgIC8vIG5leHQgeSBkaXJlY3Rpb24NCiAgICAgIHBkeCA9IE5hTiwgLy8gcHJldmlvdXMgeCBkaXJlY3Rpb24NCiAgICAgIHBkeSA9IE5hTiwgLy8gcHJldmlvdXMgeSBkaXJlY3Rpb24NCiAgICAgIGkgPSAwOw0KDQogIGRvIHsNCiAgICAvLyBkZXRlcm1pbmUgbWFyY2hpbmcgc3F1YXJlcyBpbmRleA0KICAgIGkgPSAwOw0KICAgIGlmIChncmlkKHgtMSwgeS0xKSkgaSArPSAxOw0KICAgIGlmIChncmlkKHgsICAgeS0xKSkgaSArPSAyOw0KICAgIGlmIChncmlkKHgtMSwgeSAgKSkgaSArPSA0Ow0KICAgIGlmIChncmlkKHgsICAgeSAgKSkgaSArPSA4Ow0KDQogICAgLy8gZGV0ZXJtaW5lIG5leHQgZGlyZWN0aW9uDQogICAgaWYgKGkgPT09IDYpIHsNCiAgICAgIGR4ID0gcGR5ID09PSAtMSA/IC0xIDogMTsNCiAgICAgIGR5ID0gMDsNCiAgICB9IGVsc2UgaWYgKGkgPT09IDkpIHsNCiAgICAgIGR4ID0gMDsNCiAgICAgIGR5ID0gcGR4ID09PSAxID8gLTEgOiAxOw0KICAgIH0gZWxzZSB7DQogICAgICBkeCA9IGQzX2dlb21fY29udG91ckR4W2ldOw0KICAgICAgZHkgPSBkM19nZW9tX2NvbnRvdXJEeVtpXTsNCiAgICB9DQoNCiAgICAvLyB1cGRhdGUgY29udG91ciBwb2x5Z29uDQogICAgaWYgKGR4ICE9IHBkeCAmJiBkeSAhPSBwZHkpIHsNCiAgICAgIGMucHVzaChbeCwgeV0pOw0KICAgICAgcGR4ID0gZHg7DQogICAgICBwZHkgPSBkeTsNCiAgICB9DQoNCiAgICB4ICs9IGR4Ow0KICAgIHkgKz0gZHk7DQogIH0gd2hpbGUgKHNbMF0gIT0geCB8fCBzWzFdICE9IHkpOw0KDQogIHJldHVybiBjOw0KfTsNCg0KLy8gbG9va3VwIHRhYmxlcyBmb3IgbWFyY2hpbmcgZGlyZWN0aW9ucw0KdmFyIGQzX2dlb21fY29udG91ckR4ID0gWzEsIDAsIDEsIDEsLTEsIDAsLTEsIDEsMCwgMCwwLDAsLTEsIDAsLTEsTmFOXSwNCiAgICBkM19nZW9tX2NvbnRvdXJEeSA9IFswLC0xLCAwLCAwLCAwLC0xLCAwLCAwLDEsLTEsMSwxLCAwLC0xLCAwLE5hTl07DQoNCmZ1bmN0aW9uIGQzX2dlb21fY29udG91clN0YXJ0KGdyaWQpIHsNCiAgdmFyIHggPSAwLA0KICAgICAgeSA9IDA7DQoNCiAgLy8gc2VhcmNoIGZvciBhIHN0YXJ0aW5nIHBvaW50OyBiZWdpbiBhdCBvcmlnaW4NCiAgLy8gYW5kIHByb2NlZWQgYWxvbmcgb3V0d2FyZC1leHBhbmRpbmcgZGlhZ29uYWxzDQogIHdoaWxlICh0cnVlKSB7DQogICAgaWYgKGdyaWQoeCx5KSkgew0KICAgICAgcmV0dXJuIFt4LHldOw0KICAgIH0NCiAgICBpZiAoeCA9PT0gMCkgew0KICAgICAgeCA9IHkgKyAxOw0KICAgICAgeSA9IDA7DQogICAgfSBlbHNlIHsNCiAgICAgIHggPSB4IC0gMTsNCiAgICAgIHkgPSB5ICsgMTsNCiAgICB9DQogIH0NCn0NCi8qKg0KICogQ29tcHV0ZXMgdGhlIDJEIGNvbnZleCBodWxsIG9mIGEgc2V0IG9mIHBvaW50cyB1c2luZyBHcmFoYW0ncyBzY2FubmluZw0KICogYWxnb3JpdGhtLiBUaGUgYWxnb3JpdGhtIGhhcyBiZWVuIGltcGxlbWVudGVkIGFzIGRlc2NyaWJlZCBpbiBDb3JtZW4sDQogKiBMZWlzZXJzb24sIGFuZCBSaXZlc3QncyBJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcy4gVGhlIHJ1bm5pbmcgdGltZSBvZg0KICogdGhpcyBhbGdvcml0aG0gaXMgTyhuIGxvZyBuKSwgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIGlucHV0IHBvaW50cy4NCiAqDQogKiBAcGFyYW0gdmVydGljZXMgW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQ0KICogQHJldHVybnMgcG9seWdvbiBbW3gxLCB5MV0sIFt4MiwgeTJdLCDigKZdDQogKi8NCmQzLmdlb20uaHVsbCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7DQogIGlmICh2ZXJ0aWNlcy5sZW5ndGggPCAzKSByZXR1cm4gW107DQoNCiAgdmFyIGxlbiA9IHZlcnRpY2VzLmxlbmd0aCwNCiAgICAgIHBsZW4gPSBsZW4gLSAxLA0KICAgICAgcG9pbnRzID0gW10sDQogICAgICBzdGFjayA9IFtdLA0KICAgICAgaSwgaiwgaCA9IDAsIHgxLCB5MSwgeDIsIHkyLCB1LCB2LCBhLCBzcDsNCg0KICAvLyBmaW5kIHRoZSBzdGFydGluZyByZWYgcG9pbnQ6IGxlZnRtb3N0IHBvaW50IHdpdGggdGhlIG1pbmltdW0geSBjb29yZA0KICBmb3IgKGk9MTsgaTxsZW47ICsraSkgew0KICAgIGlmICh2ZXJ0aWNlc1tpXVsxXSA8IHZlcnRpY2VzW2hdWzFdKSB7DQogICAgICBoID0gaTsNCiAgICB9IGVsc2UgaWYgKHZlcnRpY2VzW2ldWzFdID09IHZlcnRpY2VzW2hdWzFdKSB7DQogICAgICBoID0gKHZlcnRpY2VzW2ldWzBdIDwgdmVydGljZXNbaF1bMF0gPyBpIDogaCk7DQogICAgfQ0KICB9DQoNCiAgLy8gY2FsY3VsYXRlIHBvbGFyIGFuZ2xlcyBmcm9tIHJlZiBwb2ludCBhbmQgc29ydA0KICBmb3IgKGk9MDsgaTxsZW47ICsraSkgew0KICAgIGlmIChpID09PSBoKSBjb250aW51ZTsNCiAgICB5MSA9IHZlcnRpY2VzW2ldWzFdIC0gdmVydGljZXNbaF1bMV07DQogICAgeDEgPSB2ZXJ0aWNlc1tpXVswXSAtIHZlcnRpY2VzW2hdWzBdOw0KICAgIHBvaW50cy5wdXNoKHthbmdsZTogTWF0aC5hdGFuMih5MSwgeDEpLCBpbmRleDogaX0pOw0KICB9DQogIHBvaW50cy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEuYW5nbGUgLSBiLmFuZ2xlOyB9KTsNCg0KICAvLyB0b3NzIG91dCBkdXBsaWNhdGUgYW5nbGVzDQogIGEgPSBwb2ludHNbMF0uYW5nbGU7DQogIHYgPSBwb2ludHNbMF0uaW5kZXg7DQogIHUgPSAwOw0KICBmb3IgKGk9MTsgaTxwbGVuOyArK2kpIHsNCiAgICBqID0gcG9pbnRzW2ldLmluZGV4Ow0KICAgIGlmIChhID09IHBvaW50c1tpXS5hbmdsZSkgew0KICAgICAgLy8ga2VlcCBhbmdsZSBmb3IgcG9pbnQgbW9zdCBkaXN0YW50IGZyb20gdGhlIHJlZmVyZW5jZQ0KICAgICAgeDEgPSB2ZXJ0aWNlc1t2XVswXSAtIHZlcnRpY2VzW2hdWzBdOw0KICAgICAgeTEgPSB2ZXJ0aWNlc1t2XVsxXSAtIHZlcnRpY2VzW2hdWzFdOw0KICAgICAgeDIgPSB2ZXJ0aWNlc1tqXVswXSAtIHZlcnRpY2VzW2hdWzBdOw0KICAgICAgeTIgPSB2ZXJ0aWNlc1tqXVsxXSAtIHZlcnRpY2VzW2hdWzFdOw0KICAgICAgaWYgKCh4MSp4MSArIHkxKnkxKSA+PSAoeDIqeDIgKyB5Mip5MikpIHsNCiAgICAgICAgcG9pbnRzW2ldLmluZGV4ID0gLTE7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBwb2ludHNbdV0uaW5kZXggPSAtMTsNCiAgICAgICAgYSA9IHBvaW50c1tpXS5hbmdsZTsNCiAgICAgICAgdSA9IGk7DQogICAgICAgIHYgPSBqOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBhID0gcG9pbnRzW2ldLmFuZ2xlOw0KICAgICAgdSA9IGk7DQogICAgICB2ID0gajsNCiAgICB9DQogIH0NCg0KICAvLyBpbml0aWFsaXplIHRoZSBzdGFjaw0KICBzdGFjay5wdXNoKGgpOw0KICBmb3IgKGk9MCwgaj0wOyBpPDI7ICsraikgew0KICAgIGlmIChwb2ludHNbal0uaW5kZXggIT09IC0xKSB7DQogICAgICBzdGFjay5wdXNoKHBvaW50c1tqXS5pbmRleCk7DQogICAgICBpKys7DQogICAgfQ0KICB9DQogIHNwID0gc3RhY2subGVuZ3RoOw0KDQogIC8vIGRvIGdyYWhhbSdzIHNjYW4NCiAgZm9yICg7IGo8cGxlbjsgKytqKSB7DQogICAgaWYgKHBvaW50c1tqXS5pbmRleCA9PT0gLTEpIGNvbnRpbnVlOyAvLyBza2lwIHRvc3NlZCBvdXQgcG9pbnRzDQogICAgd2hpbGUgKCFkM19nZW9tX2h1bGxDQ1coc3RhY2tbc3AtMl0sIHN0YWNrW3NwLTFdLCBwb2ludHNbal0uaW5kZXgsIHZlcnRpY2VzKSkgew0KICAgICAgLS1zcDsNCiAgICB9DQogICAgc3RhY2tbc3ArK10gPSBwb2ludHNbal0uaW5kZXg7DQogIH0NCg0KICAvLyBjb25zdHJ1Y3QgdGhlIGh1bGwNCiAgdmFyIHBvbHkgPSBbXTsNCiAgZm9yIChpPTA7IGk8c3A7ICsraSkgew0KICAgIHBvbHkucHVzaCh2ZXJ0aWNlc1tzdGFja1tpXV0pOw0KICB9DQogIHJldHVybiBwb2x5Ow0KfQ0KDQovLyBhcmUgdGhyZWUgcG9pbnRzIGluIGNvdW50ZXItY2xvY2t3aXNlIG9yZGVyPw0KZnVuY3Rpb24gZDNfZ2VvbV9odWxsQ0NXKGkxLCBpMiwgaTMsIHYpIHsNCiAgdmFyIHQsIGEsIGIsIGMsIGQsIGUsIGY7DQogIHQgPSB2W2kxXTsgYSA9IHRbMF07IGIgPSB0WzFdOw0KICB0ID0gdltpMl07IGMgPSB0WzBdOyBkID0gdFsxXTsNCiAgdCA9IHZbaTNdOyBlID0gdFswXTsgZiA9IHRbMV07DQogIHJldHVybiAoKGYtYikqKGMtYSkgLSAoZC1iKSooZS1hKSkgPiAwOw0KfQ0KLy8gTm90ZTogcmVxdWlyZXMgY29vcmRpbmF0ZXMgdG8gYmUgY291bnRlcmNsb2Nrd2lzZSBhbmQgY29udmV4IQ0KZDMuZ2VvbS5wb2x5Z29uID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsNCg0KICBjb29yZGluYXRlcy5hcmVhID0gZnVuY3Rpb24oKSB7DQogICAgdmFyIGkgPSAwLA0KICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoLA0KICAgICAgICBhID0gY29vcmRpbmF0ZXNbbiAtIDFdWzBdICogY29vcmRpbmF0ZXNbMF1bMV0sDQogICAgICAgIGIgPSBjb29yZGluYXRlc1tuIC0gMV1bMV0gKiBjb29yZGluYXRlc1swXVswXTsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgYSArPSBjb29yZGluYXRlc1tpIC0gMV1bMF0gKiBjb29yZGluYXRlc1tpXVsxXTsNCiAgICAgIGIgKz0gY29vcmRpbmF0ZXNbaSAtIDFdWzFdICogY29vcmRpbmF0ZXNbaV1bMF07DQogICAgfQ0KICAgIHJldHVybiAoYiAtIGEpICogLjU7DQogIH07DQoNCiAgY29vcmRpbmF0ZXMuY2VudHJvaWQgPSBmdW5jdGlvbihrKSB7DQogICAgdmFyIGkgPSAtMSwNCiAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCwNCiAgICAgICAgeCA9IDAsDQogICAgICAgIHkgPSAwLA0KICAgICAgICBhLA0KICAgICAgICBiID0gY29vcmRpbmF0ZXNbbiAtIDFdLA0KICAgICAgICBjOw0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgayA9IC0xIC8gKDYgKiBjb29yZGluYXRlcy5hcmVhKCkpOw0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBhID0gYjsNCiAgICAgIGIgPSBjb29yZGluYXRlc1tpXTsNCiAgICAgIGMgPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdOw0KICAgICAgeCArPSAoYVswXSArIGJbMF0pICogYzsNCiAgICAgIHkgKz0gKGFbMV0gKyBiWzFdKSAqIGM7DQogICAgfQ0KICAgIHJldHVybiBbeCAqIGssIHkgKiBrXTsNCiAgfTsNCg0KICAvLyBUaGUgU3V0aGVybGFuZC1Ib2RnbWFuIGNsaXBwaW5nIGFsZ29yaXRobS4NCiAgY29vcmRpbmF0ZXMuY2xpcCA9IGZ1bmN0aW9uKHN1YmplY3QpIHsNCiAgICB2YXIgaW5wdXQsDQogICAgICAgIGkgPSAtMSwNCiAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCwNCiAgICAgICAgaiwNCiAgICAgICAgbSwNCiAgICAgICAgYSA9IGNvb3JkaW5hdGVzW24gLSAxXSwNCiAgICAgICAgYiwNCiAgICAgICAgYywNCiAgICAgICAgZDsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaW5wdXQgPSBzdWJqZWN0LnNsaWNlKCk7DQogICAgICBzdWJqZWN0Lmxlbmd0aCA9IDA7DQogICAgICBiID0gY29vcmRpbmF0ZXNbaV07DQogICAgICBjID0gaW5wdXRbKG0gPSBpbnB1dC5sZW5ndGgpIC0gMV07DQogICAgICBqID0gLTE7DQogICAgICB3aGlsZSAoKytqIDwgbSkgew0KICAgICAgICBkID0gaW5wdXRbal07DQogICAgICAgIGlmIChkM19nZW9tX3BvbHlnb25JbnNpZGUoZCwgYSwgYikpIHsNCiAgICAgICAgICBpZiAoIWQzX2dlb21fcG9seWdvbkluc2lkZShjLCBhLCBiKSkgew0KICAgICAgICAgICAgc3ViamVjdC5wdXNoKGQzX2dlb21fcG9seWdvbkludGVyc2VjdChjLCBkLCBhLCBiKSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIHN1YmplY3QucHVzaChkKTsNCiAgICAgICAgfSBlbHNlIGlmIChkM19nZW9tX3BvbHlnb25JbnNpZGUoYywgYSwgYikpIHsNCiAgICAgICAgICBzdWJqZWN0LnB1c2goZDNfZ2VvbV9wb2x5Z29uSW50ZXJzZWN0KGMsIGQsIGEsIGIpKTsNCiAgICAgICAgfQ0KICAgICAgICBjID0gZDsNCiAgICAgIH0NCiAgICAgIGEgPSBiOw0KICAgIH0NCiAgICByZXR1cm4gc3ViamVjdDsNCiAgfTsNCg0KICByZXR1cm4gY29vcmRpbmF0ZXM7DQp9Ow0KDQpmdW5jdGlvbiBkM19nZW9tX3BvbHlnb25JbnNpZGUocCwgYSwgYikgew0KICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChwWzFdIC0gYVsxXSkgPCAoYlsxXSAtIGFbMV0pICogKHBbMF0gLSBhWzBdKTsNCn0NCg0KLy8gSW50ZXJzZWN0IHR3byBpbmZpbml0ZSBsaW5lcyBjZCBhbmQgYWIuDQpmdW5jdGlvbiBkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoYywgZCwgYSwgYikgew0KICB2YXIgeDEgPSBjWzBdLCB4MiA9IGRbMF0sIHgzID0gYVswXSwgeDQgPSBiWzBdLA0KICAgICAgeTEgPSBjWzFdLCB5MiA9IGRbMV0sIHkzID0gYVsxXSwgeTQgPSBiWzFdLA0KICAgICAgeDEzID0geDEgLSB4MywNCiAgICAgIHgyMSA9IHgyIC0geDEsDQogICAgICB4NDMgPSB4NCAtIHgzLA0KICAgICAgeTEzID0geTEgLSB5MywNCiAgICAgIHkyMSA9IHkyIC0geTEsDQogICAgICB5NDMgPSB5NCAtIHkzLA0KICAgICAgdWEgPSAoeDQzICogeTEzIC0geTQzICogeDEzKSAvICh5NDMgKiB4MjEgLSB4NDMgKiB5MjEpOw0KICByZXR1cm4gW3gxICsgdWEgKiB4MjEsIHkxICsgdWEgKiB5MjFdOw0KfQ0KLy8gQWRhcHRlZCBmcm9tIE5pY29sYXMgR2FyY2lhIEJlbG1vbnRlJ3MgSklUIGltcGxlbWVudGF0aW9uOg0KLy8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy8yMDEwLzAyLzEyL3Zvcm9ub2ktdGVzc2VsbGF0aW9uLw0KLy8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9hc3NldHMvdm9yb25vaWpzL3Zvcm9ub2kuanMNCi8vIFNlZSBsaWIvaml0L0xJQ0VOU0UgZm9yIGRldGFpbHMuDQoNCi8vIE5vdGVzOg0KLy8NCi8vIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY2xpcCB0aGUgcmV0dXJuZWQgcG9seWdvbnMsIHNvIGlmIHlvdSB3YW50IHRvDQovLyBjbGlwIHRoZW0gdG8gYSBwYXJ0aWN1bGFyIHNoYXBlIHlvdSB3aWxsIG5lZWQgdG8gZG8gdGhhdCBlaXRoZXIgaW4gU1ZHIG9yIGJ5DQovLyBwb3N0LXByb2Nlc3Npbmcgd2l0aCBkMy5nZW9tLnBvbHlnb24ncyBjbGlwIG1ldGhvZC4NCi8vDQovLyBJZiBhbnkgdmVydGljZXMgYXJlIGNvaW5jaWRlbnQgb3IgaGF2ZSBOYU4gcG9zaXRpb25zLCB0aGUgYmVoYXZpb3Igb2YgdGhpcw0KLy8gbWV0aG9kIGlzIHVuZGVmaW5lZC4gTW9zdCBsaWtlbHkgaW52YWxpZCBwb2x5Z29ucyB3aWxsIGJlIHJldHVybmVkLiBZb3UNCi8vIHNob3VsZCBmaWx0ZXIgaW52YWxpZCBwb2ludHMsIGFuZCBjb25zb2xpZGF0ZSBjb2luY2lkZW50IHBvaW50cywgYmVmb3JlDQovLyBjb21wdXRpbmcgdGhlIHRlc3NlbGxhdGlvbi4NCg0KLyoqDQogKiBAcGFyYW0gdmVydGljZXMgW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQ0KICogQHJldHVybnMgcG9seWdvbnMgW1tbeDEsIHkxXSwgW3gyLCB5Ml0sIOKApl0sIOKApl0NCiAqLw0KZDMuZ2VvbS52b3Jvbm9pID0gZnVuY3Rpb24odmVydGljZXMpIHsNCiAgdmFyIHBvbHlnb25zID0gdmVydGljZXMubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pOw0KDQogIGQzX3Zvcm9ub2lfdGVzc2VsbGF0ZSh2ZXJ0aWNlcywgZnVuY3Rpb24oZSkgew0KICAgIHZhciBzMSwNCiAgICAgICAgczIsDQogICAgICAgIHgxLA0KICAgICAgICB4MiwNCiAgICAgICAgeTEsDQogICAgICAgIHkyOw0KICAgIGlmIChlLmEgPT09IDEgJiYgZS5iID49IDApIHsNCiAgICAgIHMxID0gZS5lcC5yOw0KICAgICAgczIgPSBlLmVwLmw7DQogICAgfSBlbHNlIHsNCiAgICAgIHMxID0gZS5lcC5sOw0KICAgICAgczIgPSBlLmVwLnI7DQogICAgfQ0KICAgIGlmIChlLmEgPT09IDEpIHsNCiAgICAgIHkxID0gczEgPyBzMS55IDogLTFlNjsNCiAgICAgIHgxID0gZS5jIC0gZS5iICogeTE7DQogICAgICB5MiA9IHMyID8gczIueSA6IDFlNjsNCiAgICAgIHgyID0gZS5jIC0gZS5iICogeTI7DQogICAgfSBlbHNlIHsNCiAgICAgIHgxID0gczEgPyBzMS54IDogLTFlNjsNCiAgICAgIHkxID0gZS5jIC0gZS5hICogeDE7DQogICAgICB4MiA9IHMyID8gczIueCA6IDFlNjsNCiAgICAgIHkyID0gZS5jIC0gZS5hICogeDI7DQogICAgfQ0KICAgIHZhciB2MSA9IFt4MSwgeTFdLA0KICAgICAgICB2MiA9IFt4MiwgeTJdOw0KICAgIHBvbHlnb25zW2UucmVnaW9uLmwuaW5kZXhdLnB1c2godjEsIHYyKTsNCiAgICBwb2x5Z29uc1tlLnJlZ2lvbi5yLmluZGV4XS5wdXNoKHYxLCB2Mik7DQogIH0pOw0KDQogIC8vIFJlY29ubmVjdCB0aGUgcG9seWdvbiBzZWdtZW50cyBpbnRvIGNvdW50ZXJjbG9ja3dpc2UgbG9vcHMuDQogIHJldHVybiBwb2x5Z29ucy5tYXAoZnVuY3Rpb24ocG9seWdvbiwgaSkgew0KICAgIHZhciBjeCA9IHZlcnRpY2VzW2ldWzBdLA0KICAgICAgICBjeSA9IHZlcnRpY2VzW2ldWzFdOw0KICAgIHBvbHlnb24uZm9yRWFjaChmdW5jdGlvbih2KSB7DQogICAgICB2LmFuZ2xlID0gTWF0aC5hdGFuMih2WzBdIC0gY3gsIHZbMV0gLSBjeSk7DQogICAgfSk7DQogICAgcmV0dXJuIHBvbHlnb24uc29ydChmdW5jdGlvbihhLCBiKSB7DQogICAgICByZXR1cm4gYS5hbmdsZSAtIGIuYW5nbGU7DQogICAgfSkuZmlsdGVyKGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgIHJldHVybiAhaSB8fCAoZC5hbmdsZSAtIHBvbHlnb25baSAtIDFdLmFuZ2xlID4gMWUtMTApOw0KICAgIH0pOw0KICB9KTsNCn07DQoNCnZhciBkM192b3Jvbm9pX29wcG9zaXRlID0geyJsIjogInIiLCAiciI6ICJsIn07DQoNCmZ1bmN0aW9uIGQzX3Zvcm9ub2lfdGVzc2VsbGF0ZSh2ZXJ0aWNlcywgY2FsbGJhY2spIHsNCg0KICB2YXIgU2l0ZXMgPSB7DQogICAgbGlzdDogdmVydGljZXMNCiAgICAgIC5tYXAoZnVuY3Rpb24odiwgaSkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgIGluZGV4OiBpLA0KICAgICAgICAgIHg6IHZbMF0sDQogICAgICAgICAgeTogdlsxXQ0KICAgICAgICB9Ow0KICAgICAgfSkNCiAgICAgIC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsNCiAgICAgICAgcmV0dXJuIGEueSA8IGIueSA/IC0xDQogICAgICAgICAgOiBhLnkgPiBiLnkgPyAxDQogICAgICAgICAgOiBhLnggPCBiLnggPyAtMQ0KICAgICAgICAgIDogYS54ID4gYi54ID8gMQ0KICAgICAgICAgIDogMDsNCiAgICAgIH0pLA0KICAgIGJvdHRvbVNpdGU6IG51bGwNCiAgfTsNCg0KICB2YXIgRWRnZUxpc3QgPSB7DQogICAgbGlzdDogW10sDQogICAgbGVmdEVuZDogbnVsbCwNCiAgICByaWdodEVuZDogbnVsbCwNCg0KICAgIGluaXQ6IGZ1bmN0aW9uKCkgew0KICAgICAgRWRnZUxpc3QubGVmdEVuZCA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKG51bGwsICJsIik7DQogICAgICBFZGdlTGlzdC5yaWdodEVuZCA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKG51bGwsICJsIik7DQogICAgICBFZGdlTGlzdC5sZWZ0RW5kLnIgPSBFZGdlTGlzdC5yaWdodEVuZDsNCiAgICAgIEVkZ2VMaXN0LnJpZ2h0RW5kLmwgPSBFZGdlTGlzdC5sZWZ0RW5kOw0KICAgICAgRWRnZUxpc3QubGlzdC51bnNoaWZ0KEVkZ2VMaXN0LmxlZnRFbmQsIEVkZ2VMaXN0LnJpZ2h0RW5kKTsNCiAgICB9LA0KDQogICAgY3JlYXRlSGFsZkVkZ2U6IGZ1bmN0aW9uKGVkZ2UsIHNpZGUpIHsNCiAgICAgIHJldHVybiB7DQogICAgICAgIGVkZ2U6IGVkZ2UsDQogICAgICAgIHNpZGU6IHNpZGUsDQogICAgICAgIHZlcnRleDogbnVsbCwNCiAgICAgICAgImwiOiBudWxsLA0KICAgICAgICAiciI6IG51bGwNCiAgICAgIH07DQogICAgfSwNCg0KICAgIGluc2VydDogZnVuY3Rpb24obGIsIGhlKSB7DQogICAgICBoZS5sID0gbGI7DQogICAgICBoZS5yID0gbGIucjsNCiAgICAgIGxiLnIubCA9IGhlOw0KICAgICAgbGIuciA9IGhlOw0KICAgIH0sDQoNCiAgICBsZWZ0Qm91bmQ6IGZ1bmN0aW9uKHApIHsNCiAgICAgIHZhciBoZSA9IEVkZ2VMaXN0LmxlZnRFbmQ7DQogICAgICBkbyB7DQogICAgICAgIGhlID0gaGUucjsNCiAgICAgIH0gd2hpbGUgKGhlICE9IEVkZ2VMaXN0LnJpZ2h0RW5kICYmIEdlb20ucmlnaHRPZihoZSwgcCkpOw0KICAgICAgaGUgPSBoZS5sOw0KICAgICAgcmV0dXJuIGhlOw0KICAgIH0sDQoNCiAgICBkZWw6IGZ1bmN0aW9uKGhlKSB7DQogICAgICBoZS5sLnIgPSBoZS5yOw0KICAgICAgaGUuci5sID0gaGUubDsNCiAgICAgIGhlLmVkZ2UgPSBudWxsOw0KICAgIH0sDQoNCiAgICByaWdodDogZnVuY3Rpb24oaGUpIHsNCiAgICAgIHJldHVybiBoZS5yOw0KICAgIH0sDQoNCiAgICBsZWZ0OiBmdW5jdGlvbihoZSkgew0KICAgICAgcmV0dXJuIGhlLmw7DQogICAgfSwNCg0KICAgIGxlZnRSZWdpb246IGZ1bmN0aW9uKGhlKSB7DQogICAgICByZXR1cm4gaGUuZWRnZSA9PSBudWxsDQogICAgICAgICAgPyBTaXRlcy5ib3R0b21TaXRlDQogICAgICAgICAgOiBoZS5lZGdlLnJlZ2lvbltoZS5zaWRlXTsNCiAgICB9LA0KDQogICAgcmlnaHRSZWdpb246IGZ1bmN0aW9uKGhlKSB7DQogICAgICByZXR1cm4gaGUuZWRnZSA9PSBudWxsDQogICAgICAgICAgPyBTaXRlcy5ib3R0b21TaXRlDQogICAgICAgICAgOiBoZS5lZGdlLnJlZ2lvbltkM192b3Jvbm9pX29wcG9zaXRlW2hlLnNpZGVdXTsNCiAgICB9DQogIH07DQoNCiAgdmFyIEdlb20gPSB7DQoNCiAgICBiaXNlY3Q6IGZ1bmN0aW9uKHMxLCBzMikgew0KICAgICAgdmFyIG5ld0VkZ2UgPSB7DQogICAgICAgIHJlZ2lvbjogeyJsIjogczEsICJyIjogczJ9LA0KICAgICAgICBlcDogeyJsIjogbnVsbCwgInIiOiBudWxsfQ0KICAgICAgfTsNCg0KICAgICAgdmFyIGR4ID0gczIueCAtIHMxLngsDQogICAgICAgICAgZHkgPSBzMi55IC0gczEueSwNCiAgICAgICAgICBhZHggPSBkeCA+IDAgPyBkeCA6IC1keCwNCiAgICAgICAgICBhZHkgPSBkeSA+IDAgPyBkeSA6IC1keTsNCg0KICAgICAgbmV3RWRnZS5jID0gczEueCAqIGR4ICsgczEueSAqIGR5DQogICAgICAgICAgKyAoZHggKiBkeCArIGR5ICogZHkpICogLjU7DQoNCiAgICAgIGlmIChhZHggPiBhZHkpIHsNCiAgICAgICAgbmV3RWRnZS5hID0gMTsNCiAgICAgICAgbmV3RWRnZS5iID0gZHkgLyBkeDsNCiAgICAgICAgbmV3RWRnZS5jIC89IGR4Ow0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbmV3RWRnZS5iID0gMTsNCiAgICAgICAgbmV3RWRnZS5hID0gZHggLyBkeTsNCiAgICAgICAgbmV3RWRnZS5jIC89IGR5Ow0KICAgICAgfQ0KDQogICAgICByZXR1cm4gbmV3RWRnZTsNCiAgICB9LA0KDQogICAgaW50ZXJzZWN0OiBmdW5jdGlvbihlbDEsIGVsMikgew0KICAgICAgdmFyIGUxID0gZWwxLmVkZ2UsDQogICAgICAgICAgZTIgPSBlbDIuZWRnZTsNCiAgICAgIGlmICghZTEgfHwgIWUyIHx8IChlMS5yZWdpb24uciA9PSBlMi5yZWdpb24ucikpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICB9DQogICAgICB2YXIgZCA9IChlMS5hICogZTIuYikgLSAoZTEuYiAqIGUyLmEpOw0KICAgICAgaWYgKE1hdGguYWJzKGQpIDwgMWUtMTApIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICB9DQogICAgICB2YXIgeGludCA9IChlMS5jICogZTIuYiAtIGUyLmMgKiBlMS5iKSAvIGQsDQogICAgICAgICAgeWludCA9IChlMi5jICogZTEuYSAtIGUxLmMgKiBlMi5hKSAvIGQsDQogICAgICAgICAgZTFyID0gZTEucmVnaW9uLnIsDQogICAgICAgICAgZTJyID0gZTIucmVnaW9uLnIsDQogICAgICAgICAgZWwsDQogICAgICAgICAgZTsNCiAgICAgIGlmICgoZTFyLnkgPCBlMnIueSkgfHwNCiAgICAgICAgIChlMXIueSA9PSBlMnIueSAmJiBlMXIueCA8IGUyci54KSkgew0KICAgICAgICBlbCA9IGVsMTsNCiAgICAgICAgZSA9IGUxOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgZWwgPSBlbDI7DQogICAgICAgIGUgPSBlMjsNCiAgICAgIH0NCiAgICAgIHZhciByaWdodE9mU2l0ZSA9ICh4aW50ID49IGUucmVnaW9uLnIueCk7DQogICAgICBpZiAoKHJpZ2h0T2ZTaXRlICYmIChlbC5zaWRlID09PSAibCIpKSB8fA0KICAgICAgICAoIXJpZ2h0T2ZTaXRlICYmIChlbC5zaWRlID09PSAiciIpKSkgew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgIH0NCiAgICAgIHJldHVybiB7DQogICAgICAgIHg6IHhpbnQsDQogICAgICAgIHk6IHlpbnQNCiAgICAgIH07DQogICAgfSwNCg0KICAgIHJpZ2h0T2Y6IGZ1bmN0aW9uKGhlLCBwKSB7DQogICAgICB2YXIgZSA9IGhlLmVkZ2UsDQogICAgICAgICAgdG9wc2l0ZSA9IGUucmVnaW9uLnIsDQogICAgICAgICAgcmlnaHRPZlNpdGUgPSAocC54ID4gdG9wc2l0ZS54KTsNCg0KICAgICAgaWYgKHJpZ2h0T2ZTaXRlICYmIChoZS5zaWRlID09PSAibCIpKSB7DQogICAgICAgIHJldHVybiAxOw0KICAgICAgfQ0KICAgICAgaWYgKCFyaWdodE9mU2l0ZSAmJiAoaGUuc2lkZSA9PT0gInIiKSkgew0KICAgICAgICByZXR1cm4gMDsNCiAgICAgIH0NCiAgICAgIGlmIChlLmEgPT09IDEpIHsNCiAgICAgICAgdmFyIGR5cCA9IHAueSAtIHRvcHNpdGUueSwNCiAgICAgICAgICAgIGR4cCA9IHAueCAtIHRvcHNpdGUueCwNCiAgICAgICAgICAgIGZhc3QgPSAwLA0KICAgICAgICAgICAgYWJvdmUgPSAwOw0KDQogICAgICAgIGlmICgoIXJpZ2h0T2ZTaXRlICYmIChlLmIgPCAwKSkgfHwNCiAgICAgICAgICAocmlnaHRPZlNpdGUgJiYgKGUuYiA+PSAwKSkpIHsNCiAgICAgICAgICBhYm92ZSA9IGZhc3QgPSAoZHlwID49IGUuYiAqIGR4cCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgYWJvdmUgPSAoKHAueCArIHAueSAqIGUuYikgPiBlLmMpOw0KICAgICAgICAgIGlmIChlLmIgPCAwKSB7DQogICAgICAgICAgICBhYm92ZSA9ICFhYm92ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKCFhYm92ZSkgew0KICAgICAgICAgICAgZmFzdCA9IDE7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghZmFzdCkgew0KICAgICAgICAgIHZhciBkeHMgPSB0b3BzaXRlLnggLSBlLnJlZ2lvbi5sLng7DQogICAgICAgICAgYWJvdmUgPSAoZS5iICogKGR4cCAqIGR4cCAtIGR5cCAqIGR5cCkpIDwNCiAgICAgICAgICAgIChkeHMgKiBkeXAgKiAoMSArIDIgKiBkeHAgLyBkeHMgKyBlLmIgKiBlLmIpKTsNCg0KICAgICAgICAgIGlmIChlLmIgPCAwKSB7DQogICAgICAgICAgICBhYm92ZSA9ICFhYm92ZTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSAvKiBlLmIgPT0gMSAqLyB7DQogICAgICAgIHZhciB5bCA9IGUuYyAtIGUuYSAqIHAueCwNCiAgICAgICAgICAgIHQxID0gcC55IC0geWwsDQogICAgICAgICAgICB0MiA9IHAueCAtIHRvcHNpdGUueCwNCiAgICAgICAgICAgIHQzID0geWwgLSB0b3BzaXRlLnk7DQoNCiAgICAgICAgYWJvdmUgPSAodDEgKiB0MSkgPiAodDIgKiB0MiArIHQzICogdDMpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGhlLnNpZGUgPT09ICJsIiA/IGFib3ZlIDogIWFib3ZlOw0KICAgIH0sDQoNCiAgICBlbmRQb2ludDogZnVuY3Rpb24oZWRnZSwgc2lkZSwgc2l0ZSkgew0KICAgICAgZWRnZS5lcFtzaWRlXSA9IHNpdGU7DQogICAgICBpZiAoIWVkZ2UuZXBbZDNfdm9yb25vaV9vcHBvc2l0ZVtzaWRlXV0pIHJldHVybjsNCiAgICAgIGNhbGxiYWNrKGVkZ2UpOw0KICAgIH0sDQoNCiAgICBkaXN0YW5jZTogZnVuY3Rpb24ocywgdCkgew0KICAgICAgdmFyIGR4ID0gcy54IC0gdC54LA0KICAgICAgICAgIGR5ID0gcy55IC0gdC55Ow0KICAgICAgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7DQogICAgfQ0KICB9Ow0KDQogIHZhciBFdmVudFF1ZXVlID0gew0KICAgIGxpc3Q6IFtdLA0KDQogICAgaW5zZXJ0OiBmdW5jdGlvbihoZSwgc2l0ZSwgb2Zmc2V0KSB7DQogICAgICBoZS52ZXJ0ZXggPSBzaXRlOw0KICAgICAgaGUueXN0YXIgPSBzaXRlLnkgKyBvZmZzZXQ7DQogICAgICBmb3IgKHZhciBpPTAsIGxpc3Q9RXZlbnRRdWV1ZS5saXN0LCBsPWxpc3QubGVuZ3RoOyBpPGw7IGkrKykgew0KICAgICAgICB2YXIgbmV4dCA9IGxpc3RbaV07DQogICAgICAgIGlmIChoZS55c3RhciA+IG5leHQueXN0YXIgfHwNCiAgICAgICAgICAoaGUueXN0YXIgPT0gbmV4dC55c3RhciAmJg0KICAgICAgICAgIHNpdGUueCA+IG5leHQudmVydGV4LngpKSB7DQogICAgICAgICAgY29udGludWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGxpc3Quc3BsaWNlKGksIDAsIGhlKTsNCiAgICB9LA0KDQogICAgZGVsOiBmdW5jdGlvbihoZSkgew0KICAgICAgZm9yICh2YXIgaT0wLCBscz1FdmVudFF1ZXVlLmxpc3QsIGw9bHMubGVuZ3RoOyBpPGwgJiYgKGxzW2ldICE9IGhlKTsgKytpKSB7fQ0KICAgICAgbHMuc3BsaWNlKGksIDEpOw0KICAgIH0sDQoNCiAgICBlbXB0eTogZnVuY3Rpb24oKSB7IHJldHVybiBFdmVudFF1ZXVlLmxpc3QubGVuZ3RoID09PSAwOyB9LA0KDQogICAgbmV4dEV2ZW50OiBmdW5jdGlvbihoZSkgew0KICAgICAgZm9yICh2YXIgaT0wLCBscz1FdmVudFF1ZXVlLmxpc3QsIGw9bHMubGVuZ3RoOyBpPGw7ICsraSkgew0KICAgICAgICBpZiAobHNbaV0gPT0gaGUpIHJldHVybiBsc1tpKzFdOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgfSwNCg0KICAgIG1pbjogZnVuY3Rpb24oKSB7DQogICAgICB2YXIgZWxlbSA9IEV2ZW50UXVldWUubGlzdFswXTsNCiAgICAgIHJldHVybiB7DQogICAgICAgIHg6IGVsZW0udmVydGV4LngsDQogICAgICAgIHk6IGVsZW0ueXN0YXINCiAgICAgIH07DQogICAgfSwNCg0KICAgIGV4dHJhY3RNaW46IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIEV2ZW50UXVldWUubGlzdC5zaGlmdCgpOw0KICAgIH0NCiAgfTsNCg0KICBFZGdlTGlzdC5pbml0KCk7DQogIFNpdGVzLmJvdHRvbVNpdGUgPSBTaXRlcy5saXN0LnNoaWZ0KCk7DQoNCiAgdmFyIG5ld1NpdGUgPSBTaXRlcy5saXN0LnNoaWZ0KCksIG5ld0ludFN0YXI7DQogIHZhciBsYm5kLCByYm5kLCBsbGJuZCwgcnJibmQsIGJpc2VjdG9yOw0KICB2YXIgYm90LCB0b3AsIHRlbXAsIHAsIHY7DQogIHZhciBlLCBwbTsNCg0KICB3aGlsZSAodHJ1ZSkgew0KICAgIGlmICghRXZlbnRRdWV1ZS5lbXB0eSgpKSB7DQogICAgICBuZXdJbnRTdGFyID0gRXZlbnRRdWV1ZS5taW4oKTsNCiAgICB9DQogICAgaWYgKG5ld1NpdGUgJiYgKEV2ZW50UXVldWUuZW1wdHkoKQ0KICAgICAgfHwgbmV3U2l0ZS55IDwgbmV3SW50U3Rhci55DQogICAgICB8fCAobmV3U2l0ZS55ID09IG5ld0ludFN0YXIueQ0KICAgICAgJiYgbmV3U2l0ZS54IDwgbmV3SW50U3Rhci54KSkpIHsgLy9uZXcgc2l0ZSBpcyBzbWFsbGVzdA0KICAgICAgbGJuZCA9IEVkZ2VMaXN0LmxlZnRCb3VuZChuZXdTaXRlKTsNCiAgICAgIHJibmQgPSBFZGdlTGlzdC5yaWdodChsYm5kKTsNCiAgICAgIGJvdCA9IEVkZ2VMaXN0LnJpZ2h0UmVnaW9uKGxibmQpOw0KICAgICAgZSA9IEdlb20uYmlzZWN0KGJvdCwgbmV3U2l0ZSk7DQogICAgICBiaXNlY3RvciA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKGUsICJsIik7DQogICAgICBFZGdlTGlzdC5pbnNlcnQobGJuZCwgYmlzZWN0b3IpOw0KICAgICAgcCA9IEdlb20uaW50ZXJzZWN0KGxibmQsIGJpc2VjdG9yKTsNCiAgICAgIGlmIChwKSB7DQogICAgICAgIEV2ZW50UXVldWUuZGVsKGxibmQpOw0KICAgICAgICBFdmVudFF1ZXVlLmluc2VydChsYm5kLCBwLCBHZW9tLmRpc3RhbmNlKHAsIG5ld1NpdGUpKTsNCiAgICAgIH0NCiAgICAgIGxibmQgPSBiaXNlY3RvcjsNCiAgICAgIGJpc2VjdG9yID0gRWRnZUxpc3QuY3JlYXRlSGFsZkVkZ2UoZSwgInIiKTsNCiAgICAgIEVkZ2VMaXN0Lmluc2VydChsYm5kLCBiaXNlY3Rvcik7DQogICAgICBwID0gR2VvbS5pbnRlcnNlY3QoYmlzZWN0b3IsIHJibmQpOw0KICAgICAgaWYgKHApIHsNCiAgICAgICAgRXZlbnRRdWV1ZS5pbnNlcnQoYmlzZWN0b3IsIHAsIEdlb20uZGlzdGFuY2UocCwgbmV3U2l0ZSkpOw0KICAgICAgfQ0KICAgICAgbmV3U2l0ZSA9IFNpdGVzLmxpc3Quc2hpZnQoKTsNCiAgICB9IGVsc2UgaWYgKCFFdmVudFF1ZXVlLmVtcHR5KCkpIHsgLy9pbnRlcnNlY3Rpb24gaXMgc21hbGxlc3QNCiAgICAgIGxibmQgPSBFdmVudFF1ZXVlLmV4dHJhY3RNaW4oKTsNCiAgICAgIGxsYm5kID0gRWRnZUxpc3QubGVmdChsYm5kKTsNCiAgICAgIHJibmQgPSBFZGdlTGlzdC5yaWdodChsYm5kKTsNCiAgICAgIHJyYm5kID0gRWRnZUxpc3QucmlnaHQocmJuZCk7DQogICAgICBib3QgPSBFZGdlTGlzdC5sZWZ0UmVnaW9uKGxibmQpOw0KICAgICAgdG9wID0gRWRnZUxpc3QucmlnaHRSZWdpb24ocmJuZCk7DQogICAgICB2ID0gbGJuZC52ZXJ0ZXg7DQogICAgICBHZW9tLmVuZFBvaW50KGxibmQuZWRnZSwgbGJuZC5zaWRlLCB2KTsNCiAgICAgIEdlb20uZW5kUG9pbnQocmJuZC5lZGdlLCByYm5kLnNpZGUsIHYpOw0KICAgICAgRWRnZUxpc3QuZGVsKGxibmQpOw0KICAgICAgRXZlbnRRdWV1ZS5kZWwocmJuZCk7DQogICAgICBFZGdlTGlzdC5kZWwocmJuZCk7DQogICAgICBwbSA9ICJsIjsNCiAgICAgIGlmIChib3QueSA+IHRvcC55KSB7DQogICAgICAgIHRlbXAgPSBib3Q7DQogICAgICAgIGJvdCA9IHRvcDsNCiAgICAgICAgdG9wID0gdGVtcDsNCiAgICAgICAgcG0gPSAiciI7DQogICAgICB9DQogICAgICBlID0gR2VvbS5iaXNlY3QoYm90LCB0b3ApOw0KICAgICAgYmlzZWN0b3IgPSBFZGdlTGlzdC5jcmVhdGVIYWxmRWRnZShlLCBwbSk7DQogICAgICBFZGdlTGlzdC5pbnNlcnQobGxibmQsIGJpc2VjdG9yKTsNCiAgICAgIEdlb20uZW5kUG9pbnQoZSwgZDNfdm9yb25vaV9vcHBvc2l0ZVtwbV0sIHYpOw0KICAgICAgcCA9IEdlb20uaW50ZXJzZWN0KGxsYm5kLCBiaXNlY3Rvcik7DQogICAgICBpZiAocCkgew0KICAgICAgICBFdmVudFF1ZXVlLmRlbChsbGJuZCk7DQogICAgICAgIEV2ZW50UXVldWUuaW5zZXJ0KGxsYm5kLCBwLCBHZW9tLmRpc3RhbmNlKHAsIGJvdCkpOw0KICAgICAgfQ0KICAgICAgcCA9IEdlb20uaW50ZXJzZWN0KGJpc2VjdG9yLCBycmJuZCk7DQogICAgICBpZiAocCkgew0KICAgICAgICBFdmVudFF1ZXVlLmluc2VydChiaXNlY3RvciwgcCwgR2VvbS5kaXN0YW5jZShwLCBib3QpKTsNCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgYnJlYWs7DQogICAgfQ0KICB9Ly9lbmQgd2hpbGUNCg0KICBmb3IgKGxibmQgPSBFZGdlTGlzdC5yaWdodChFZGdlTGlzdC5sZWZ0RW5kKTsNCiAgICAgIGxibmQgIT0gRWRnZUxpc3QucmlnaHRFbmQ7DQogICAgICBsYm5kID0gRWRnZUxpc3QucmlnaHQobGJuZCkpIHsNCiAgICBjYWxsYmFjayhsYm5kLmVkZ2UpOw0KICB9DQp9DQovKioNCiogQHBhcmFtIHZlcnRpY2VzIFtbeDEsIHkxXSwgW3gyLCB5Ml0sIOKApl0NCiogQHJldHVybnMgdHJpYW5nbGVzIFtbW3gxLCB5MV0sIFt4MiwgeTJdLCBbeDMsIHkzXV0sIOKApl0NCiAqLw0KZDMuZ2VvbS5kZWxhdW5heSA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7DQogIHZhciBlZGdlcyA9IHZlcnRpY2VzLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KSwNCiAgICAgIHRyaWFuZ2xlcyA9IFtdOw0KDQogIC8vIFVzZSB0aGUgVm9yb25vaSB0ZXNzZWxsYXRpb24gdG8gZGV0ZXJtaW5lIERlbGF1bmF5IGVkZ2VzLg0KICBkM192b3Jvbm9pX3Rlc3NlbGxhdGUodmVydGljZXMsIGZ1bmN0aW9uKGUpIHsNCiAgICBlZGdlc1tlLnJlZ2lvbi5sLmluZGV4XS5wdXNoKHZlcnRpY2VzW2UucmVnaW9uLnIuaW5kZXhdKTsNCiAgfSk7DQoNCiAgLy8gUmVjb25uZWN0IHRoZSBlZGdlcyBpbnRvIGNvdW50ZXJjbG9ja3dpc2UgdHJpYW5nbGVzLg0KICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2UsIGkpIHsNCiAgICB2YXIgdiA9IHZlcnRpY2VzW2ldLA0KICAgICAgICBjeCA9IHZbMF0sDQogICAgICAgIGN5ID0gdlsxXTsNCiAgICBlZGdlLmZvckVhY2goZnVuY3Rpb24odikgew0KICAgICAgdi5hbmdsZSA9IE1hdGguYXRhbjIodlswXSAtIGN4LCB2WzFdIC0gY3kpOw0KICAgIH0pOw0KICAgIGVkZ2Uuc29ydChmdW5jdGlvbihhLCBiKSB7DQogICAgICByZXR1cm4gYS5hbmdsZSAtIGIuYW5nbGU7DQogICAgfSk7DQogICAgZm9yICh2YXIgaiA9IDAsIG0gPSBlZGdlLmxlbmd0aCAtIDE7IGogPCBtOyBqKyspIHsNCiAgICAgIHRyaWFuZ2xlcy5wdXNoKFt2LCBlZGdlW2pdLCBlZGdlW2ogKyAxXV0pOw0KICAgIH0NCiAgfSk7DQoNCiAgcmV0dXJuIHRyaWFuZ2xlczsNCn07DQovLyBDb25zdHJ1Y3RzIGEgbmV3IHF1YWR0cmVlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIHBvaW50cy4gQSBxdWFkdHJlZSBpcyBhDQovLyB0d28tZGltZW5zaW9uYWwgcmVjdXJzaXZlIHNwYXRpYWwgc3ViZGl2aXNpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcw0KLy8gc3F1YXJlIHBhcnRpdGlvbnMsIGRpdmlkaW5nIGVhY2ggc3F1YXJlIGludG8gZm91ciBlcXVhbGx5LXNpemVkIHNxdWFyZXMuIEVhY2gNCi8vIHBvaW50IGV4aXN0cyBpbiBhIHVuaXF1ZSBub2RlOyBpZiBtdWx0aXBsZSBwb2ludHMgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uLA0KLy8gc29tZSBwb2ludHMgbWF5IGJlIHN0b3JlZCBvbiBpbnRlcm5hbCBub2RlcyByYXRoZXIgdGhhbiBsZWFmIG5vZGVzLiBRdWFkdHJlZXMNCi8vIGNhbiBiZSB1c2VkIHRvIGFjY2VsZXJhdGUgdmFyaW91cyBzcGF0aWFsIG9wZXJhdGlvbnMsIHN1Y2ggYXMgdGhlIEJhcm5lcy1IdXQNCi8vIGFwcHJveGltYXRpb24gZm9yIGNvbXB1dGluZyBuLWJvZHkgZm9yY2VzLCBvciBjb2xsaXNpb24gZGV0ZWN0aW9uLg0KZDMuZ2VvbS5xdWFkdHJlZSA9IGZ1bmN0aW9uKHBvaW50cywgeDEsIHkxLCB4MiwgeTIpIHsNCiAgdmFyIHAsDQogICAgICBpID0gLTEsDQogICAgICBuID0gcG9pbnRzLmxlbmd0aDsNCg0KICAvLyBUeXBlIGNvbnZlcnNpb24gZm9yIGRlcHJlY2F0ZWQgQVBJLg0KICBpZiAobiAmJiBpc05hTihwb2ludHNbMF0ueCkpIHBvaW50cyA9IHBvaW50cy5tYXAoZDNfZ2VvbV9xdWFkdHJlZVBvaW50KTsNCg0KICAvLyBBbGxvdyBib3VuZHMgdG8gYmUgc3BlY2lmaWVkIGV4cGxpY2l0bHkuDQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNSkgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7DQogICAgICB5MiA9IHgyID0geTE7DQogICAgICB5MSA9IHgxOw0KICAgIH0gZWxzZSB7DQogICAgICB4MSA9IHkxID0gSW5maW5pdHk7DQogICAgICB4MiA9IHkyID0gLUluZmluaXR5Ow0KDQogICAgICAvLyBDb21wdXRlIGJvdW5kcy4NCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICAgIHAgPSBwb2ludHNbaV07DQogICAgICAgIGlmIChwLnggPCB4MSkgeDEgPSBwLng7DQogICAgICAgIGlmIChwLnkgPCB5MSkgeTEgPSBwLnk7DQogICAgICAgIGlmIChwLnggPiB4MikgeDIgPSBwLng7DQogICAgICAgIGlmIChwLnkgPiB5MikgeTIgPSBwLnk7DQogICAgICB9DQoNCiAgICAgIC8vIFNxdWFyaWZ5IHRoZSBib3VuZHMuDQogICAgICB2YXIgZHggPSB4MiAtIHgxLA0KICAgICAgICAgIGR5ID0geTIgLSB5MTsNCiAgICAgIGlmIChkeCA+IGR5KSB5MiA9IHkxICsgZHg7DQogICAgICBlbHNlIHgyID0geDEgKyBkeTsNCiAgICB9DQogIH0NCg0KICAvLyBSZWN1cnNpdmVseSBpbnNlcnRzIHRoZSBzcGVjaWZpZWQgcG9pbnQgcCBhdCB0aGUgbm9kZSBuIG9yIG9uZSBvZiBpdHMNCiAgLy8gZGVzY2VuZGFudHMuIFRoZSBib3VuZHMgYXJlIGRlZmluZWQgYnkgW3gxLCB4Ml0gYW5kIFt5MSwgeTJdLg0KICBmdW5jdGlvbiBpbnNlcnQobiwgcCwgeDEsIHkxLCB4MiwgeTIpIHsNCiAgICBpZiAoaXNOYU4ocC54KSB8fCBpc05hTihwLnkpKSByZXR1cm47IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50cw0KICAgIGlmIChuLmxlYWYpIHsNCiAgICAgIHZhciB2ID0gbi5wb2ludDsNCiAgICAgIGlmICh2KSB7DQogICAgICAgIC8vIElmIHRoZSBwb2ludCBhdCB0aGlzIGxlYWYgbm9kZSBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgbmV3DQogICAgICAgIC8vIHBvaW50IHdlIGFyZSBhZGRpbmcsIHdlIGxlYXZlIHRoZSBwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhlDQogICAgICAgIC8vIGludGVybmFsIG5vZGUgd2hpbGUgYWRkaW5nIHRoZSBuZXcgcG9pbnQgdG8gYSBjaGlsZCBub2RlLiBUaGlzDQogICAgICAgIC8vIGF2b2lkcyBpbmZpbml0ZSByZWN1cnNpb24uDQogICAgICAgIGlmICgoTWF0aC5hYnModi54IC0gcC54KSArIE1hdGguYWJzKHYueSAtIHAueSkpIDwgLjAxKSB7DQogICAgICAgICAgaW5zZXJ0Q2hpbGQobiwgcCwgeDEsIHkxLCB4MiwgeTIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIG4ucG9pbnQgPSBudWxsOw0KICAgICAgICAgIGluc2VydENoaWxkKG4sIHYsIHgxLCB5MSwgeDIsIHkyKTsNCiAgICAgICAgICBpbnNlcnRDaGlsZChuLCBwLCB4MSwgeTEsIHgyLCB5Mik7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIG4ucG9pbnQgPSBwOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBpbnNlcnRDaGlsZChuLCBwLCB4MSwgeTEsIHgyLCB5Mik7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVjdXJzaXZlbHkgaW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBvaW50IHAgaW50byBhIGRlc2NlbmRhbnQgb2Ygbm9kZSBuLiBUaGUNCiAgLy8gYm91bmRzIGFyZSBkZWZpbmVkIGJ5IFt4MSwgeDJdIGFuZCBbeTEsIHkyXS4NCiAgZnVuY3Rpb24gaW5zZXJ0Q2hpbGQobiwgcCwgeDEsIHkxLCB4MiwgeTIpIHsNCiAgICAvLyBDb21wdXRlIHRoZSBzcGxpdCBwb2ludCwgYW5kIHRoZSBxdWFkcmFudCBpbiB3aGljaCB0byBpbnNlcnQgcC4NCiAgICB2YXIgc3ggPSAoeDEgKyB4MikgKiAuNSwNCiAgICAgICAgc3kgPSAoeTEgKyB5MikgKiAuNSwNCiAgICAgICAgcmlnaHQgPSBwLnggPj0gc3gsDQogICAgICAgIGJvdHRvbSA9IHAueSA+PSBzeSwNCiAgICAgICAgaSA9IChib3R0b20gPDwgMSkgKyByaWdodDsNCg0KICAgIC8vIFJlY3Vyc2l2ZWx5IGluc2VydCBpbnRvIHRoZSBjaGlsZCBub2RlLg0KICAgIG4ubGVhZiA9IGZhbHNlOw0KICAgIG4gPSBuLm5vZGVzW2ldIHx8IChuLm5vZGVzW2ldID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKSk7DQoNCiAgICAvLyBVcGRhdGUgdGhlIGJvdW5kcyBhcyB3ZSByZWN1cnNlLg0KICAgIGlmIChyaWdodCkgeDEgPSBzeDsgZWxzZSB4MiA9IHN4Ow0KICAgIGlmIChib3R0b20pIHkxID0gc3k7IGVsc2UgeTIgPSBzeTsNCiAgICBpbnNlcnQobiwgcCwgeDEsIHkxLCB4MiwgeTIpOw0KICB9DQoNCiAgLy8gQ3JlYXRlIHRoZSByb290IG5vZGUuDQogIHZhciByb290ID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKTsNCg0KICByb290LmFkZCA9IGZ1bmN0aW9uKHApIHsNCiAgICBpbnNlcnQocm9vdCwgcCwgeDEsIHkxLCB4MiwgeTIpOw0KICB9Ow0KDQogIHJvb3QudmlzaXQgPSBmdW5jdGlvbihmKSB7DQogICAgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIHJvb3QsIHgxLCB5MSwgeDIsIHkyKTsNCiAgfTsNCg0KICAvLyBJbnNlcnQgYWxsIHBvaW50cy4NCiAgcG9pbnRzLmZvckVhY2gocm9vdC5hZGQpOw0KICByZXR1cm4gcm9vdDsNCn07DQoNCmZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVOb2RlKCkgew0KICByZXR1cm4gew0KICAgIGxlYWY6IHRydWUsDQogICAgbm9kZXM6IFtdLA0KICAgIHBvaW50OiBudWxsDQogIH07DQp9DQoNCmZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBub2RlLCB4MSwgeTEsIHgyLCB5Mikgew0KICBpZiAoIWYobm9kZSwgeDEsIHkxLCB4MiwgeTIpKSB7DQogICAgdmFyIHN4ID0gKHgxICsgeDIpICogLjUsDQogICAgICAgIHN5ID0gKHkxICsgeTIpICogLjUsDQogICAgICAgIGNoaWxkcmVuID0gbm9kZS5ub2RlczsNCiAgICBpZiAoY2hpbGRyZW5bMF0pIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBjaGlsZHJlblswXSwgeDEsIHkxLCBzeCwgc3kpOw0KICAgIGlmIChjaGlsZHJlblsxXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzFdLCBzeCwgeTEsIHgyLCBzeSk7DQogICAgaWYgKGNoaWxkcmVuWzJdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bMl0sIHgxLCBzeSwgc3gsIHkyKTsNCiAgICBpZiAoY2hpbGRyZW5bM10pIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBjaGlsZHJlblszXSwgc3gsIHN5LCB4MiwgeTIpOw0KICB9DQp9DQoNCmZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVQb2ludChwKSB7DQogIHJldHVybiB7DQogICAgeDogcFswXSwNCiAgICB5OiBwWzFdDQogIH07DQp9DQpkMy50aW1lID0ge307DQoNCnZhciBkM190aW1lID0gRGF0ZTsNCg0KZnVuY3Rpb24gZDNfdGltZV91dGMoKSB7DQogIHRoaXMuXyA9IG5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGggPiAxDQogICAgICA/IERhdGUuVVRDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykNCiAgICAgIDogYXJndW1lbnRzWzBdKTsNCn0NCg0KZDNfdGltZV91dGMucHJvdG90eXBlID0gew0KICBnZXREYXRlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCk7IH0sDQogIGdldERheTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCk7IH0sDQogIGdldEZ1bGxZZWFyOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpOyB9LA0KICBnZXRIb3VyczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKTsgfSwNCiAgZ2V0TWlsbGlzZWNvbmRzOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKTsgfSwNCiAgZ2V0TWludXRlczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpOyB9LA0KICBnZXRNb250aDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKTsgfSwNCiAgZ2V0U2Vjb25kczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpOyB9LA0KICBnZXRUaW1lOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRUaW1lKCk7IH0sDQogIGdldFRpbWV6b25lT2Zmc2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH0sDQogIHZhbHVlT2Y6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fLnZhbHVlT2YoKTsgfSwNCiAgc2V0RGF0ZTogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9LA0KICBzZXREYXk6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENEYXkuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9LA0KICBzZXRGdWxsWWVhcjogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwNCiAgc2V0SG91cnM6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sDQogIHNldE1pbGxpc2Vjb25kczogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ01pbGxpc2Vjb25kcy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sDQogIHNldE1pbnV0ZXM6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwNCiAgc2V0TW9udGg6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sDQogIHNldFNlY29uZHM6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENTZWNvbmRzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwNCiAgc2V0VGltZTogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFRpbWUuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9DQp9Ow0KDQp2YXIgZDNfdGltZV9wcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTsNCmQzLnRpbWUuZm9ybWF0ID0gZnVuY3Rpb24odGVtcGxhdGUpIHsNCiAgdmFyIG4gPSB0ZW1wbGF0ZS5sZW5ndGg7DQoNCiAgZnVuY3Rpb24gZm9ybWF0KGRhdGUpIHsNCiAgICB2YXIgc3RyaW5nID0gW10sDQogICAgICAgIGkgPSAtMSwNCiAgICAgICAgaiA9IDAsDQogICAgICAgIGMsDQogICAgICAgIGY7DQogICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIGlmICh0ZW1wbGF0ZS5jaGFyQ29kZUF0KGkpID09IDM3KSB7DQogICAgICAgIHN0cmluZy5wdXNoKA0KICAgICAgICAgICAgdGVtcGxhdGUuc3Vic3RyaW5nKGosIGkpLA0KICAgICAgICAgICAgKGYgPSBkM190aW1lX2Zvcm1hdHNbYyA9IHRlbXBsYXRlLmNoYXJBdCgrK2kpXSkNCiAgICAgICAgICAgID8gZihkYXRlKSA6IGMpOw0KICAgICAgICBqID0gaSArIDE7DQogICAgICB9DQogICAgfQ0KICAgIHN0cmluZy5wdXNoKHRlbXBsYXRlLnN1YnN0cmluZyhqLCBpKSk7DQogICAgcmV0dXJuIHN0cmluZy5qb2luKCIiKTsNCiAgfQ0KDQogIGZvcm1hdC5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgew0KICAgIHZhciBkID0ge3k6IDE5MDAsIG06IDAsIGQ6IDEsIEg6IDAsIE06IDAsIFM6IDAsIEw6IDB9LA0KICAgICAgICBpID0gZDNfdGltZV9wYXJzZShkLCB0ZW1wbGF0ZSwgc3RyaW5nLCAwKTsNCiAgICBpZiAoaSAhPSBzdHJpbmcubGVuZ3RoKSByZXR1cm4gbnVsbDsNCg0KICAgIC8vIFRoZSBhbS1wbSBmbGFnIGlzIDAgZm9yIEFNLCBhbmQgMSBmb3IgUE0uDQogICAgaWYgKCJwIiBpbiBkKSBkLkggPSBkLkggJSAxMiArIGQucCAqIDEyOw0KDQogICAgdmFyIGRhdGUgPSBuZXcgZDNfdGltZSgpOw0KICAgIGRhdGUuc2V0RnVsbFllYXIoZC55LCBkLm0sIGQuZCk7DQogICAgZGF0ZS5zZXRIb3VycyhkLkgsIGQuTSwgZC5TLCBkLkwpOw0KICAgIHJldHVybiBkYXRlOw0KICB9Ow0KDQogIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0ZW1wbGF0ZTsNCiAgfTsNCg0KICByZXR1cm4gZm9ybWF0Ow0KfTsNCg0KZnVuY3Rpb24gZDNfdGltZV9wYXJzZShkYXRlLCB0ZW1wbGF0ZSwgc3RyaW5nLCBqKSB7DQogIHZhciBjLA0KICAgICAgcCwNCiAgICAgIGkgPSAwLA0KICAgICAgbiA9IHRlbXBsYXRlLmxlbmd0aCwNCiAgICAgIG0gPSBzdHJpbmcubGVuZ3RoOw0KICB3aGlsZSAoaSA8IG4pIHsNCiAgICBpZiAoaiA+PSBtKSByZXR1cm4gLTE7DQogICAgYyA9IHRlbXBsYXRlLmNoYXJDb2RlQXQoaSsrKTsNCiAgICBpZiAoYyA9PSAzNykgew0KICAgICAgcCA9IGQzX3RpbWVfcGFyc2Vyc1t0ZW1wbGF0ZS5jaGFyQXQoaSsrKV07DQogICAgICBpZiAoIXAgfHwgKChqID0gcChkYXRlLCBzdHJpbmcsIGopKSA8IDApKSByZXR1cm4gLTE7DQogICAgfSBlbHNlIGlmIChjICE9IHN0cmluZy5jaGFyQ29kZUF0KGorKykpIHsNCiAgICAgIHJldHVybiAtMTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIGo7DQp9DQoNCnZhciBkM190aW1lX3pmaWxsMiA9IGQzLmZvcm1hdCgiMDJkIiksDQogICAgZDNfdGltZV96ZmlsbDMgPSBkMy5mb3JtYXQoIjAzZCIpLA0KICAgIGQzX3RpbWVfemZpbGw0ID0gZDMuZm9ybWF0KCIwNGQiKSwNCiAgICBkM190aW1lX3NmaWxsMiA9IGQzLmZvcm1hdCgiMmQiKTsNCg0KdmFyIGQzX3RpbWVfZm9ybWF0cyA9IHsNCiAgYTogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV93ZWVrZGF5c1tkLmdldERheSgpXS5zdWJzdHJpbmcoMCwgMyk7IH0sDQogIEE6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfd2Vla2RheXNbZC5nZXREYXkoKV07IH0sDQogIGI6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfbW9udGhzW2QuZ2V0TW9udGgoKV0uc3Vic3RyaW5nKDAsIDMpOyB9LA0KICBCOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX21vbnRoc1tkLmdldE1vbnRoKCldOyB9LA0KICBjOiBkMy50aW1lLmZvcm1hdCgiJWEgJWIgJWUgJUg6JU06JVMgJVkiKSwNCiAgZDogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDIoZC5nZXREYXRlKCkpOyB9LA0KICBlOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3NmaWxsMihkLmdldERhdGUoKSk7IH0sDQogIEg6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0SG91cnMoKSk7IH0sDQogIEk6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyKTsgfSwNCiAgajogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDMoMSArIGQzLnRpbWUuZGF5T2ZZZWFyKGQpKTsgfSwNCiAgTDogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDMoZC5nZXRNaWxsaXNlY29uZHMoKSk7IH0sDQogIG06IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0TW9udGgoKSArIDEpOyB9LA0KICBNOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldE1pbnV0ZXMoKSk7IH0sDQogIHA6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0SG91cnMoKSA+PSAxMiA/ICJQTSIgOiAiQU0iOyB9LA0KICBTOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldFNlY29uZHMoKSk7IH0sDQogIFU6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQzLnRpbWUuc3VuZGF5T2ZZZWFyKGQpKTsgfSwNCiAgdzogZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXREYXkoKTsgfSwNCiAgVzogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDIoZDMudGltZS5tb25kYXlPZlllYXIoZCkpOyB9LA0KICB4OiBkMy50aW1lLmZvcm1hdCgiJW0vJWQvJXkiKSwNCiAgWDogZDMudGltZS5mb3JtYXQoIiVIOiVNOiVTIiksDQogIHk6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0RnVsbFllYXIoKSAlIDEwMCk7IH0sDQogIFk6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGw0KGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwKTsgfSwNCiAgWjogZDNfdGltZV96b25lLA0KICAiJSI6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuICIlIjsgfQ0KfTsNCg0KdmFyIGQzX3RpbWVfcGFyc2VycyA9IHsNCiAgYTogZDNfdGltZV9wYXJzZVdlZWtkYXlBYmJyZXYsDQogIEE6IGQzX3RpbWVfcGFyc2VXZWVrZGF5LA0KICBiOiBkM190aW1lX3BhcnNlTW9udGhBYmJyZXYsDQogIEI6IGQzX3RpbWVfcGFyc2VNb250aCwNCiAgYzogZDNfdGltZV9wYXJzZUxvY2FsZUZ1bGwsDQogIGQ6IGQzX3RpbWVfcGFyc2VEYXksDQogIGU6IGQzX3RpbWVfcGFyc2VEYXksDQogIEg6IGQzX3RpbWVfcGFyc2VIb3VyMjQsDQogIEk6IGQzX3RpbWVfcGFyc2VIb3VyMjQsDQogIC8vIGo6IGZ1bmN0aW9uKGQsIHMsIGkpIHsgLypUT0RPIGRheSBvZiB5ZWFyIFswMDEsMzY2XSAqLyByZXR1cm4gaTsgfSwNCiAgTDogZDNfdGltZV9wYXJzZU1pbGxpc2Vjb25kcywNCiAgbTogZDNfdGltZV9wYXJzZU1vbnRoTnVtYmVyLA0KICBNOiBkM190aW1lX3BhcnNlTWludXRlcywNCiAgcDogZDNfdGltZV9wYXJzZUFtUG0sDQogIFM6IGQzX3RpbWVfcGFyc2VTZWNvbmRzLA0KICAvLyBVOiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyB3ZWVrIG51bWJlciAoc3VuZGF5KSBbMDAsNTNdICovIHJldHVybiBpOyB9LA0KICAvLyB3OiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyB3ZWVrZGF5IFswLDZdICovIHJldHVybiBpOyB9LA0KICAvLyBXOiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyB3ZWVrIG51bWJlciAobW9uZGF5KSBbMDAsNTNdICovIHJldHVybiBpOyB9LA0KICB4OiBkM190aW1lX3BhcnNlTG9jYWxlRGF0ZSwNCiAgWDogZDNfdGltZV9wYXJzZUxvY2FsZVRpbWUsDQogIHk6IGQzX3RpbWVfcGFyc2VZZWFyLA0KICBZOiBkM190aW1lX3BhcnNlRnVsbFllYXINCiAgLy8gLA0KICAvLyBaOiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyB0aW1lIHpvbmUgKi8gcmV0dXJuIGk7IH0sDQogIC8vICIlIjogZnVuY3Rpb24oZCwgcywgaSkgeyAvKlRPRE8gbGl0ZXJhbCAlICovIHJldHVybiBpOyB9DQp9Ow0KDQovLyBOb3RlOiB3ZWVrZGF5IGlzIHZhbGlkYXRlZCwgYnV0IGRvZXMgbm90IHNldCB0aGUgZGF0ZS4NCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5QWJicmV2KGRhdGUsIHN0cmluZywgaSkgew0KICByZXR1cm4gZDNfdGltZV93ZWVrZGF5QWJicmV2UmUudGVzdChzdHJpbmcuc3Vic3RyaW5nKGksIGkgKz0gMykpID8gaSA6IC0xOw0KfQ0KDQovLyBOb3RlOiB3ZWVrZGF5IGlzIHZhbGlkYXRlZCwgYnV0IGRvZXMgbm90IHNldCB0aGUgZGF0ZS4NCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5KGRhdGUsIHN0cmluZywgaSkgew0KICBkM190aW1lX3dlZWtkYXlSZS5sYXN0SW5kZXggPSAwOw0KICB2YXIgbiA9IGQzX3RpbWVfd2Vla2RheVJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMTApKTsNCiAgcmV0dXJuIG4gPyBpICs9IG5bMF0ubGVuZ3RoIDogLTE7DQp9DQoNCnZhciBkM190aW1lX3dlZWtkYXlBYmJyZXZSZSA9IC9eKD86c3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLA0KICAgIGQzX3RpbWVfd2Vla2RheVJlID0gL14oPzpTdW5kYXl8TW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheSkvaTsNCiAgICBkM190aW1lX3dlZWtkYXlzID0gWyJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSJdOw0KDQpmdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGhBYmJyZXYoZGF0ZSwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gZDNfdGltZV9tb250aEFiYnJldkxvb2t1cC5nZXQoc3RyaW5nLnN1YnN0cmluZyhpLCBpICs9IDMpLnRvTG93ZXJDYXNlKCkpOw0KICByZXR1cm4gbiA9PSBudWxsID8gLTEgOiAoZGF0ZS5tID0gbiwgaSk7DQp9DQoNCnZhciBkM190aW1lX21vbnRoQWJicmV2TG9va3VwID0gZDMubWFwKHsNCiAgamFuOiAwLA0KICBmZWI6IDEsDQogIG1hcjogMiwNCiAgYXByOiAzLA0KICBtYXk6IDQsDQogIGp1bjogNSwNCiAganVsOiA2LA0KICBhdWc6IDcsDQogIHNlcDogOCwNCiAgb2N0OiA5LA0KICBub3Y6IDEwLA0KICBkZWM6IDExDQp9KTsNCg0KZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1vbnRoKGRhdGUsIHN0cmluZywgaSkgew0KICBkM190aW1lX21vbnRoUmUubGFzdEluZGV4ID0gMDsNCiAgdmFyIG4gPSBkM190aW1lX21vbnRoUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAxMikpOw0KICByZXR1cm4gbiA/IChkYXRlLm0gPSBkM190aW1lX21vbnRoTG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQp2YXIgZDNfdGltZV9tb250aFJlID0gL14oPzpKYW51YXJ5fEZlYnJ1YXJ5fE1hcmNofEFwcmlsfE1heXxKdW5lfEp1bHl8QXVndXN0fFNlcHRlbWJlcnxPY3RvYmVyfE5vdmVtYmVyfERlY2VtYmVyKS9pZzsNCg0KdmFyIGQzX3RpbWVfbW9udGhMb29rdXAgPSBkMy5tYXAoew0KICBqYW51YXJ5OiAwLA0KICBmZWJydWFyeTogMSwNCiAgbWFyY2g6IDIsDQogIGFwcmlsOiAzLA0KICBtYXk6IDQsDQogIGp1bmU6IDUsDQogIGp1bHk6IDYsDQogIGF1Z3VzdDogNywNCiAgc2VwdGVtYmVyOiA4LA0KICBvY3RvYmVyOiA5LA0KICBub3ZlbWJlcjogMTAsDQogIGRlY2VtYmVyOiAxMQ0KfSk7DQoNCnZhciBkM190aW1lX21vbnRocyA9IFsNCiAgIkphbnVhcnkiLA0KICAiRmVicnVhcnkiLA0KICAiTWFyY2giLA0KICAiQXByaWwiLA0KICAiTWF5IiwNCiAgIkp1bmUiLA0KICAiSnVseSIsDQogICJBdWd1c3QiLA0KICAiU2VwdGVtYmVyIiwNCiAgIk9jdG9iZXIiLA0KICAiTm92ZW1iZXIiLA0KICAiRGVjZW1iZXIiDQpdOw0KDQpmdW5jdGlvbiBkM190aW1lX3BhcnNlTG9jYWxlRnVsbChkYXRlLCBzdHJpbmcsIGkpIHsNCiAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLmMudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTsNCn0NCg0KZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZURhdGUoZGF0ZSwgc3RyaW5nLCBpKSB7DQogIHJldHVybiBkM190aW1lX3BhcnNlKGRhdGUsIGQzX3RpbWVfZm9ybWF0cy54LnRvU3RyaW5nKCksIHN0cmluZywgaSk7DQp9DQoNCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VMb2NhbGVUaW1lKGRhdGUsIHN0cmluZywgaSkgew0KICByZXR1cm4gZDNfdGltZV9wYXJzZShkYXRlLCBkM190aW1lX2Zvcm1hdHMuWC50b1N0cmluZygpLCBzdHJpbmcsIGkpOw0KfQ0KDQpmdW5jdGlvbiBkM190aW1lX3BhcnNlRnVsbFllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7DQogIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsNCiAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgNCkpOw0KICByZXR1cm4gbiA/IChkYXRlLnkgPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gZDNfdGltZV9wYXJzZVllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7DQogIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsNCiAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMikpOw0KICByZXR1cm4gbiA/IChkYXRlLnkgPSBkM190aW1lX2NlbnR1cnkoKSArICtuWzBdLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBkM190aW1lX2NlbnR1cnkoKSB7DQogIHJldHVybiB+fihuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLyAxMDAwKSAqIDEwMDA7DQp9DQoNCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNb250aE51bWJlcihkYXRlLCBzdHJpbmcsIGkpIHsNCiAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOw0KICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAyKSk7DQogIHJldHVybiBuID8gKGRhdGUubSA9IG5bMF0gLSAxLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBkM190aW1lX3BhcnNlRGF5KGRhdGUsIHN0cmluZywgaSkgew0KICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7DQogIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsNCiAgcmV0dXJuIG4gPyAoZGF0ZS5kID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCi8vIE5vdGU6IHdlIGRvbid0IHZhbGlkYXRlIHRoYXQgdGhlIGhvdXIgaXMgaW4gdGhlIHJhbmdlIFswLDIzXSBvciBbMSwxMl0uDQpmdW5jdGlvbiBkM190aW1lX3BhcnNlSG91cjI0KGRhdGUsIHN0cmluZywgaSkgew0KICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7DQogIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsNCiAgcmV0dXJuIG4gPyAoZGF0ZS5IID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNaW51dGVzKGRhdGUsIHN0cmluZywgaSkgew0KICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7DQogIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsNCiAgcmV0dXJuIG4gPyAoZGF0ZS5NID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VTZWNvbmRzKGRhdGUsIHN0cmluZywgaSkgew0KICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7DQogIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsNCiAgcmV0dXJuIG4gPyAoZGF0ZS5TID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNaWxsaXNlY29uZHMoZGF0ZSwgc3RyaW5nLCBpKSB7DQogIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsNCiAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMykpOw0KICByZXR1cm4gbiA/IChkYXRlLkwgPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KLy8gTm90ZTogd2UgZG9uJ3QgbG9vayBhdCB0aGUgbmV4dCBkaXJlY3RpdmUuDQp2YXIgZDNfdGltZV9udW1iZXJSZSA9IC9ccypcZCsvOw0KDQpmdW5jdGlvbiBkM190aW1lX3BhcnNlQW1QbShkYXRlLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBkM190aW1lX2FtUG1Mb29rdXAuZ2V0KHN0cmluZy5zdWJzdHJpbmcoaSwgaSArPSAyKS50b0xvd2VyQ2FzZSgpKTsNCiAgcmV0dXJuIG4gPT0gbnVsbCA/IC0xIDogKGRhdGUucCA9IG4sIGkpOw0KfQ0KDQp2YXIgZDNfdGltZV9hbVBtTG9va3VwID0gZDMubWFwKHsNCiAgYW06IDAsDQogIHBtOiAxDQp9KTsNCg0KLy8gVE9ETyB0YWJsZSBvZiB0aW1lIHpvbmUgb2Zmc2V0IG5hbWVzPw0KZnVuY3Rpb24gZDNfdGltZV96b25lKGQpIHsNCiAgdmFyIHogPSBkLmdldFRpbWV6b25lT2Zmc2V0KCksDQogICAgICB6cyA9IHogPiAwID8gIi0iIDogIisiLA0KICAgICAgemggPSB+fihNYXRoLmFicyh6KSAvIDYwKSwNCiAgICAgIHptID0gTWF0aC5hYnMoeikgJSA2MDsNCiAgcmV0dXJuIHpzICsgZDNfdGltZV96ZmlsbDIoemgpICsgZDNfdGltZV96ZmlsbDIoem0pOw0KfQ0KZDMudGltZS5mb3JtYXQudXRjID0gZnVuY3Rpb24odGVtcGxhdGUpIHsNCiAgdmFyIGxvY2FsID0gZDMudGltZS5mb3JtYXQodGVtcGxhdGUpOw0KDQogIGZ1bmN0aW9uIGZvcm1hdChkYXRlKSB7DQogICAgdHJ5IHsNCiAgICAgIGQzX3RpbWUgPSBkM190aW1lX3V0YzsNCiAgICAgIHZhciB1dGMgPSBuZXcgZDNfdGltZSgpOw0KICAgICAgdXRjLl8gPSBkYXRlOw0KICAgICAgcmV0dXJuIGxvY2FsKHV0Yyk7DQogICAgfSBmaW5hbGx5IHsNCiAgICAgIGQzX3RpbWUgPSBEYXRlOw0KICAgIH0NCiAgfQ0KDQogIGZvcm1hdC5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgew0KICAgIHRyeSB7DQogICAgICBkM190aW1lID0gZDNfdGltZV91dGM7DQogICAgICB2YXIgZGF0ZSA9IGxvY2FsLnBhcnNlKHN0cmluZyk7DQogICAgICByZXR1cm4gZGF0ZSAmJiBkYXRlLl87DQogICAgfSBmaW5hbGx5IHsNCiAgICAgIGQzX3RpbWUgPSBEYXRlOw0KICAgIH0NCiAgfTsNCg0KICBmb3JtYXQudG9TdHJpbmcgPSBsb2NhbC50b1N0cmluZzsNCg0KICByZXR1cm4gZm9ybWF0Ow0KfTsNCnZhciBkM190aW1lX2Zvcm1hdElzbyA9IGQzLnRpbWUuZm9ybWF0LnV0YygiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7DQoNCmQzLnRpbWUuZm9ybWF0LmlzbyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID8gZDNfdGltZV9mb3JtYXRJc29OYXRpdmUgOiBkM190aW1lX2Zvcm1hdElzbzsNCg0KZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRJc29OYXRpdmUoZGF0ZSkgew0KICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpOw0KfQ0KDQpkM190aW1lX2Zvcm1hdElzb05hdGl2ZS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgew0KICByZXR1cm4gbmV3IERhdGUoc3RyaW5nKTsNCn07DQoNCmQzX3RpbWVfZm9ybWF0SXNvTmF0aXZlLnRvU3RyaW5nID0gZDNfdGltZV9mb3JtYXRJc28udG9TdHJpbmc7DQpmdW5jdGlvbiBkM190aW1lX2ludGVydmFsKGxvY2FsLCBzdGVwLCBudW1iZXIpIHsNCg0KICBmdW5jdGlvbiByb3VuZChkYXRlKSB7DQogICAgdmFyIGQwID0gbG9jYWwoZGF0ZSksIGQxID0gb2Zmc2V0KGQwLCAxKTsNCiAgICByZXR1cm4gZGF0ZSAtIGQwIDwgZDEgLSBkYXRlID8gZDAgOiBkMTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGNlaWwoZGF0ZSkgew0KICAgIHN0ZXAoZGF0ZSA9IGxvY2FsKG5ldyBkM190aW1lKGRhdGUgLSAxKSksIDEpOw0KICAgIHJldHVybiBkYXRlOw0KICB9DQoNCiAgZnVuY3Rpb24gb2Zmc2V0KGRhdGUsIGspIHsNCiAgICBzdGVwKGRhdGUgPSBuZXcgZDNfdGltZSgrZGF0ZSksIGspOw0KICAgIHJldHVybiBkYXRlOw0KICB9DQoNCiAgZnVuY3Rpb24gcmFuZ2UodDAsIHQxLCBkdCkgew0KICAgIHZhciB0aW1lID0gY2VpbCh0MCksIHRpbWVzID0gW107DQogICAgaWYgKGR0ID4gMSkgew0KICAgICAgd2hpbGUgKHRpbWUgPCB0MSkgew0KICAgICAgICBpZiAoIShudW1iZXIodGltZSkgJSBkdCkpIHRpbWVzLnB1c2gobmV3IERhdGUoK3RpbWUpKTsNCiAgICAgICAgc3RlcCh0aW1lLCAxKTsNCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgd2hpbGUgKHRpbWUgPCB0MSkgdGltZXMucHVzaChuZXcgRGF0ZSgrdGltZSkpLCBzdGVwKHRpbWUsIDEpOw0KICAgIH0NCiAgICByZXR1cm4gdGltZXM7DQogIH0NCg0KICBmdW5jdGlvbiByYW5nZV91dGModDAsIHQxLCBkdCkgew0KICAgIHRyeSB7DQogICAgICBkM190aW1lID0gZDNfdGltZV91dGM7DQogICAgICB2YXIgdXRjID0gbmV3IGQzX3RpbWVfdXRjKCk7DQogICAgICB1dGMuXyA9IHQwOw0KICAgICAgcmV0dXJuIHJhbmdlKHV0YywgdDEsIGR0KTsNCiAgICB9IGZpbmFsbHkgew0KICAgICAgZDNfdGltZSA9IERhdGU7DQogICAgfQ0KICB9DQoNCiAgbG9jYWwuZmxvb3IgPSBsb2NhbDsNCiAgbG9jYWwucm91bmQgPSByb3VuZDsNCiAgbG9jYWwuY2VpbCA9IGNlaWw7DQogIGxvY2FsLm9mZnNldCA9IG9mZnNldDsNCiAgbG9jYWwucmFuZ2UgPSByYW5nZTsNCg0KICB2YXIgdXRjID0gbG9jYWwudXRjID0gZDNfdGltZV9pbnRlcnZhbF91dGMobG9jYWwpOw0KICB1dGMuZmxvb3IgPSB1dGM7DQogIHV0Yy5yb3VuZCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKHJvdW5kKTsNCiAgdXRjLmNlaWwgPSBkM190aW1lX2ludGVydmFsX3V0YyhjZWlsKTsNCiAgdXRjLm9mZnNldCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKG9mZnNldCk7DQogIHV0Yy5yYW5nZSA9IHJhbmdlX3V0YzsNCg0KICByZXR1cm4gbG9jYWw7DQp9DQoNCmZ1bmN0aW9uIGQzX3RpbWVfaW50ZXJ2YWxfdXRjKG1ldGhvZCkgew0KICByZXR1cm4gZnVuY3Rpb24oZGF0ZSwgaykgew0KICAgIHRyeSB7DQogICAgICBkM190aW1lID0gZDNfdGltZV91dGM7DQogICAgICB2YXIgdXRjID0gbmV3IGQzX3RpbWVfdXRjKCk7DQogICAgICB1dGMuXyA9IGRhdGU7DQogICAgICByZXR1cm4gbWV0aG9kKHV0YywgaykuXzsNCiAgICB9IGZpbmFsbHkgew0KICAgICAgZDNfdGltZSA9IERhdGU7DQogICAgfQ0KICB9Ow0KfQ0KZDMudGltZS5zZWNvbmQgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIG5ldyBkM190aW1lKE1hdGguZmxvb3IoZGF0ZSAvIDFlMykgKiAxZTMpOw0KfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7DQogIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDFlMyk7IC8vIERTVCBicmVha3Mgc2V0U2Vjb25kcw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRTZWNvbmRzKCk7DQp9KTsNCg0KZDMudGltZS5zZWNvbmRzID0gZDMudGltZS5zZWNvbmQucmFuZ2U7DQpkMy50aW1lLnNlY29uZHMudXRjID0gZDMudGltZS5zZWNvbmQudXRjLnJhbmdlOw0KZDMudGltZS5taW51dGUgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIG5ldyBkM190aW1lKE1hdGguZmxvb3IoZGF0ZSAvIDZlNCkgKiA2ZTQpOw0KfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7DQogIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDZlNCk7IC8vIERTVCBicmVha3Mgc2V0TWludXRlcw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRNaW51dGVzKCk7DQp9KTsNCg0KZDMudGltZS5taW51dGVzID0gZDMudGltZS5taW51dGUucmFuZ2U7DQpkMy50aW1lLm1pbnV0ZXMudXRjID0gZDMudGltZS5taW51dGUudXRjLnJhbmdlOw0KZDMudGltZS5ob3VyID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIHZhciB0aW1lem9uZSA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwOw0KICByZXR1cm4gbmV3IGQzX3RpbWUoKE1hdGguZmxvb3IoZGF0ZSAvIDM2ZTUgLSB0aW1lem9uZSkgKyB0aW1lem9uZSkgKiAzNmU1KTsNCn0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgew0KICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiAzNmU1KTsgLy8gRFNUIGJyZWFrcyBzZXRIb3Vycw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRIb3VycygpOw0KfSk7DQoNCmQzLnRpbWUuaG91cnMgPSBkMy50aW1lLmhvdXIucmFuZ2U7DQpkMy50aW1lLmhvdXJzLnV0YyA9IGQzLnRpbWUuaG91ci51dGMucmFuZ2U7DQpkMy50aW1lLmRheSA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gbmV3IGQzX3RpbWUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTsNCn0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgew0KICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBvZmZzZXQpOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgLSAxOw0KfSk7DQoNCmQzLnRpbWUuZGF5cyA9IGQzLnRpbWUuZGF5LnJhbmdlOw0KZDMudGltZS5kYXlzLnV0YyA9IGQzLnRpbWUuZGF5LnV0Yy5yYW5nZTsNCg0KZDMudGltZS5kYXlPZlllYXIgPSBmdW5jdGlvbihkYXRlKSB7DQogIHZhciB5ZWFyID0gZDMudGltZS55ZWFyKGRhdGUpOw0KICByZXR1cm4gTWF0aC5mbG9vcigoZGF0ZSAtIHllYXIpIC8gODY0ZTUgLSAoZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpIC0geWVhci5nZXRUaW1lem9uZU9mZnNldCgpKSAvIDE0NDApOw0KfTsNCmQzX3RpbWVfd2Vla2RheXMuZm9yRWFjaChmdW5jdGlvbihkYXksIGkpIHsNCiAgZGF5ID0gZGF5LnRvTG93ZXJDYXNlKCk7DQogIGkgPSA3IC0gaTsNCg0KICB2YXIgaW50ZXJ2YWwgPSBkMy50aW1lW2RheV0gPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICAoZGF0ZSA9IGQzLnRpbWUuZGF5KGRhdGUpKS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gKGRhdGUuZ2V0RGF5KCkgKyBpKSAlIDcpOw0KICAgIHJldHVybiBkYXRlOw0KICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHsNCiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiA3KTsNCiAgfSwgZnVuY3Rpb24oZGF0ZSkgew0KICAgIHZhciBkYXkgPSBkMy50aW1lLnllYXIoZGF0ZSkuZ2V0RGF5KCk7DQogICAgcmV0dXJuIE1hdGguZmxvb3IoKGQzLnRpbWUuZGF5T2ZZZWFyKGRhdGUpICsgKGRheSArIGkpICUgNykgLyA3KSAtIChkYXkgIT09IGkpOw0KICB9KTsNCg0KICBkMy50aW1lW2RheSArICJzIl0gPSBpbnRlcnZhbC5yYW5nZTsNCiAgZDMudGltZVtkYXkgKyAicyJdLnV0YyA9IGludGVydmFsLnV0Yy5yYW5nZTsNCg0KICBkMy50aW1lW2RheSArICJPZlllYXIiXSA9IGZ1bmN0aW9uKGRhdGUpIHsNCiAgICB2YXIgZGF5ID0gZDMudGltZS55ZWFyKGRhdGUpLmdldERheSgpOw0KICAgIHJldHVybiBNYXRoLmZsb29yKChkMy50aW1lLmRheU9mWWVhcihkYXRlKSArIChkYXkgKyBpKSAlIDcpIC8gNyk7DQogIH07DQp9KTsNCg0KZDMudGltZS53ZWVrID0gZDMudGltZS5zdW5kYXk7DQpkMy50aW1lLndlZWtzID0gZDMudGltZS5zdW5kYXkucmFuZ2U7DQpkMy50aW1lLndlZWtzLnV0YyA9IGQzLnRpbWUuc3VuZGF5LnV0Yy5yYW5nZTsNCmQzLnRpbWUud2Vla09mWWVhciA9IGQzLnRpbWUuc3VuZGF5T2ZZZWFyOw0KZDMudGltZS5tb250aCA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gbmV3IGQzX3RpbWUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIDEpOw0KfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7DQogIGRhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgb2Zmc2V0KTsNCn0sIGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTsNCn0pOw0KDQpkMy50aW1lLm1vbnRocyA9IGQzLnRpbWUubW9udGgucmFuZ2U7DQpkMy50aW1lLm1vbnRocy51dGMgPSBkMy50aW1lLm1vbnRoLnV0Yy5yYW5nZTsNCmQzLnRpbWUueWVhciA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gbmV3IGQzX3RpbWUoZGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAxKTsNCn0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgew0KICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIG9mZnNldCk7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7DQp9KTsNCg0KZDMudGltZS55ZWFycyA9IGQzLnRpbWUueWVhci5yYW5nZTsNCmQzLnRpbWUueWVhcnMudXRjID0gZDMudGltZS55ZWFyLnV0Yy5yYW5nZTsNCmZ1bmN0aW9uIGQzX3RpbWVfc2NhbGUobGluZWFyLCBtZXRob2RzLCBmb3JtYXQpIHsNCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgcmV0dXJuIGxpbmVhcih4KTsNCiAgfQ0KDQogIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gZDNfdGltZV9zY2FsZURhdGUobGluZWFyLmludmVydCh4KSk7DQogIH07DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmVhci5kb21haW4oKS5tYXAoZDNfdGltZV9zY2FsZURhdGUpOw0KICAgIGxpbmVhci5kb21haW4oeCk7DQogICAgcmV0dXJuIHNjYWxlOw0KICB9Ow0KDQogIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihtKSB7DQogICAgdmFyIGV4dGVudCA9IGQzX3RpbWVfc2NhbGVFeHRlbnQoc2NhbGUuZG9tYWluKCkpOw0KICAgIHJldHVybiBzY2FsZS5kb21haW4oW20uZmxvb3IoZXh0ZW50WzBdKSwgbS5jZWlsKGV4dGVudFsxXSldKTsNCiAgfTsNCg0KICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKG0sIGspIHsNCiAgICB2YXIgZXh0ZW50ID0gZDNfdGltZV9zY2FsZUV4dGVudChzY2FsZS5kb21haW4oKSk7DQogICAgaWYgKHR5cGVvZiBtICE9PSAiZnVuY3Rpb24iKSB7DQogICAgICB2YXIgc3BhbiA9IGV4dGVudFsxXSAtIGV4dGVudFswXSwNCiAgICAgICAgICB0YXJnZXQgPSBzcGFuIC8gbSwNCiAgICAgICAgICBpID0gZDMuYmlzZWN0KGQzX3RpbWVfc2NhbGVTdGVwcywgdGFyZ2V0KTsNCiAgICAgIGlmIChpID09IGQzX3RpbWVfc2NhbGVTdGVwcy5sZW5ndGgpIHJldHVybiBtZXRob2RzLnllYXIoZXh0ZW50LCBtKTsNCiAgICAgIGlmICghaSkgcmV0dXJuIGxpbmVhci50aWNrcyhtKS5tYXAoZDNfdGltZV9zY2FsZURhdGUpOw0KICAgICAgaWYgKE1hdGgubG9nKHRhcmdldCAvIGQzX3RpbWVfc2NhbGVTdGVwc1tpIC0gMV0pIDwgTWF0aC5sb2coZDNfdGltZV9zY2FsZVN0ZXBzW2ldIC8gdGFyZ2V0KSkgLS1pOw0KICAgICAgbSA9IG1ldGhvZHNbaV07DQogICAgICBrID0gbVsxXTsNCiAgICAgIG0gPSBtWzBdLnJhbmdlOw0KICAgIH0NCiAgICByZXR1cm4gbShleHRlbnRbMF0sIG5ldyBEYXRlKCtleHRlbnRbMV0gKyAxKSwgayk7IC8vIGluY2x1c2l2ZSB1cHBlciBib3VuZA0KICB9Ow0KDQogIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gZm9ybWF0Ow0KICB9Ow0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gZDNfdGltZV9zY2FsZShsaW5lYXIuY29weSgpLCBtZXRob2RzLCBmb3JtYXQpOw0KICB9Ow0KDQogIC8vIFRPT0QgZXhwb3NlIGQzX3NjYWxlX2xpbmVhcl9yZWJpbmQ/DQogIHJldHVybiBkMy5yZWJpbmQoc2NhbGUsIGxpbmVhciwgInJhbmdlIiwgInJhbmdlUm91bmQiLCAiaW50ZXJwb2xhdGUiLCAiY2xhbXAiKTsNCn0NCg0KLy8gVE9ETyBleHBvc2UgZDNfc2NhbGVFeHRlbnQ/DQpmdW5jdGlvbiBkM190aW1lX3NjYWxlRXh0ZW50KGRvbWFpbikgew0KICB2YXIgc3RhcnQgPSBkb21haW5bMF0sIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdOw0KICByZXR1cm4gc3RhcnQgPCBzdG9wID8gW3N0YXJ0LCBzdG9wXSA6IFtzdG9wLCBzdGFydF07DQp9DQoNCmZ1bmN0aW9uIGQzX3RpbWVfc2NhbGVEYXRlKHQpIHsNCiAgcmV0dXJuIG5ldyBEYXRlKHQpOw0KfQ0KDQpmdW5jdGlvbiBkM190aW1lX3NjYWxlRm9ybWF0KGZvcm1hdHMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUpIHsNCiAgICB2YXIgaSA9IGZvcm1hdHMubGVuZ3RoIC0gMSwgZiA9IGZvcm1hdHNbaV07DQogICAgd2hpbGUgKCFmWzFdKGRhdGUpKSBmID0gZm9ybWF0c1stLWldOw0KICAgIHJldHVybiBmWzBdKGRhdGUpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBkM190aW1lX3NjYWxlU2V0WWVhcih5KSB7DQogIHZhciBkID0gbmV3IERhdGUoeSwgMCwgMSk7DQogIGQuc2V0RnVsbFllYXIoeSk7IC8vIFkySyBmYWlsDQogIHJldHVybiBkOw0KfQ0KDQpmdW5jdGlvbiBkM190aW1lX3NjYWxlR2V0WWVhcihkKSB7DQogIHZhciB5ID0gZC5nZXRGdWxsWWVhcigpLA0KICAgICAgZDAgPSBkM190aW1lX3NjYWxlU2V0WWVhcih5KSwNCiAgICAgIGQxID0gZDNfdGltZV9zY2FsZVNldFllYXIoeSArIDEpOw0KICByZXR1cm4geSArIChkIC0gZDApIC8gKGQxIC0gZDApOw0KfQ0KDQp2YXIgZDNfdGltZV9zY2FsZVN0ZXBzID0gWw0KICAxZTMsICAgIC8vIDEtc2Vjb25kDQogIDVlMywgICAgLy8gNS1zZWNvbmQNCiAgMTVlMywgICAvLyAxNS1zZWNvbmQNCiAgM2U0LCAgICAvLyAzMC1zZWNvbmQNCiAgNmU0LCAgICAvLyAxLW1pbnV0ZQ0KICAzZTUsICAgIC8vIDUtbWludXRlDQogIDllNSwgICAgLy8gMTUtbWludXRlDQogIDE4ZTUsICAgLy8gMzAtbWludXRlDQogIDM2ZTUsICAgLy8gMS1ob3VyDQogIDEwOGU1LCAgLy8gMy1ob3VyDQogIDIxNmU1LCAgLy8gNi1ob3VyDQogIDQzMmU1LCAgLy8gMTItaG91cg0KICA4NjRlNSwgIC8vIDEtZGF5DQogIDE3MjhlNSwgLy8gMi1kYXkNCiAgNjA0OGU1LCAvLyAxLXdlZWsNCiAgMjU5MmU2LCAvLyAxLW1vbnRoDQogIDc3NzZlNiwgLy8gMy1tb250aA0KICAzMTUzNmU2IC8vIDEteWVhcg0KXTsNCg0KdmFyIGQzX3RpbWVfc2NhbGVMb2NhbE1ldGhvZHMgPSBbDQogIFtkMy50aW1lLnNlY29uZCwgMV0sDQogIFtkMy50aW1lLnNlY29uZCwgNV0sDQogIFtkMy50aW1lLnNlY29uZCwgMTVdLA0KICBbZDMudGltZS5zZWNvbmQsIDMwXSwNCiAgW2QzLnRpbWUubWludXRlLCAxXSwNCiAgW2QzLnRpbWUubWludXRlLCA1XSwNCiAgW2QzLnRpbWUubWludXRlLCAxNV0sDQogIFtkMy50aW1lLm1pbnV0ZSwgMzBdLA0KICBbZDMudGltZS5ob3VyLCAxXSwNCiAgW2QzLnRpbWUuaG91ciwgM10sDQogIFtkMy50aW1lLmhvdXIsIDZdLA0KICBbZDMudGltZS5ob3VyLCAxMl0sDQogIFtkMy50aW1lLmRheSwgMV0sDQogIFtkMy50aW1lLmRheSwgMl0sDQogIFtkMy50aW1lLndlZWssIDFdLA0KICBbZDMudGltZS5tb250aCwgMV0sDQogIFtkMy50aW1lLm1vbnRoLCAzXSwNCiAgW2QzLnRpbWUueWVhciwgMV0NCl07DQoNCnZhciBkM190aW1lX3NjYWxlTG9jYWxGb3JtYXRzID0gWw0KICBbZDMudGltZS5mb3JtYXQoIiVZIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHRydWU7IH1dLA0KICBbZDMudGltZS5mb3JtYXQoIiVCIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0TW9udGgoKTsgfV0sDQogIFtkMy50aW1lLmZvcm1hdCgiJWIgJWQiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXREYXRlKCkgIT0gMTsgfV0sDQogIFtkMy50aW1lLmZvcm1hdCgiJWEgJWQiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXREYXkoKSAmJiBkLmdldERhdGUoKSAhPSAxOyB9XSwNCiAgW2QzLnRpbWUuZm9ybWF0KCIlSSAlcCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldEhvdXJzKCk7IH1dLA0KICBbZDMudGltZS5mb3JtYXQoIiVJOiVNIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0TWludXRlcygpOyB9XSwNCiAgW2QzLnRpbWUuZm9ybWF0KCI6JVMiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXRTZWNvbmRzKCk7IH1dLA0KICBbZDMudGltZS5mb3JtYXQoIi4lTCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldE1pbGxpc2Vjb25kcygpOyB9XQ0KXTsNCg0KdmFyIGQzX3RpbWVfc2NhbGVMaW5lYXIgPSBkMy5zY2FsZS5saW5lYXIoKSwNCiAgICBkM190aW1lX3NjYWxlTG9jYWxGb3JtYXQgPSBkM190aW1lX3NjYWxlRm9ybWF0KGQzX3RpbWVfc2NhbGVMb2NhbEZvcm1hdHMpOw0KDQpkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLnllYXIgPSBmdW5jdGlvbihleHRlbnQsIG0pIHsNCiAgcmV0dXJuIGQzX3RpbWVfc2NhbGVMaW5lYXIuZG9tYWluKGV4dGVudC5tYXAoZDNfdGltZV9zY2FsZUdldFllYXIpKS50aWNrcyhtKS5tYXAoZDNfdGltZV9zY2FsZVNldFllYXIpOw0KfTsNCg0KZDMudGltZS5zY2FsZSA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gZDNfdGltZV9zY2FsZShkMy5zY2FsZS5saW5lYXIoKSwgZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcywgZDNfdGltZV9zY2FsZUxvY2FsRm9ybWF0KTsNCn07DQp2YXIgZDNfdGltZV9zY2FsZVVUQ01ldGhvZHMgPSBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLm1hcChmdW5jdGlvbihtKSB7DQogIHJldHVybiBbbVswXS51dGMsIG1bMV1dOw0KfSk7DQoNCnZhciBkM190aW1lX3NjYWxlVVRDRm9ybWF0cyA9IFsNCiAgW2QzLnRpbWUuZm9ybWF0LnV0YygiJVkiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gdHJ1ZTsgfV0sDQogIFtkMy50aW1lLmZvcm1hdC51dGMoIiVCIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0VVRDTW9udGgoKTsgfV0sDQogIFtkMy50aW1lLmZvcm1hdC51dGMoIiViICVkIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0VVRDRGF0ZSgpICE9IDE7IH1dLA0KICBbZDMudGltZS5mb3JtYXQudXRjKCIlYSAlZCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ0RheSgpICYmIGQuZ2V0VVRDRGF0ZSgpICE9IDE7IH1dLA0KICBbZDMudGltZS5mb3JtYXQudXRjKCIlSSAlcCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ0hvdXJzKCk7IH1dLA0KICBbZDMudGltZS5mb3JtYXQudXRjKCIlSTolTSIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ01pbnV0ZXMoKTsgfV0sDQogIFtkMy50aW1lLmZvcm1hdC51dGMoIjolUyIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ1NlY29uZHMoKTsgfV0sDQogIFtkMy50aW1lLmZvcm1hdC51dGMoIi4lTCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ01pbGxpc2Vjb25kcygpOyB9XQ0KXTsNCg0KdmFyIGQzX3RpbWVfc2NhbGVVVENGb3JtYXQgPSBkM190aW1lX3NjYWxlRm9ybWF0KGQzX3RpbWVfc2NhbGVVVENGb3JtYXRzKTsNCg0KZnVuY3Rpb24gZDNfdGltZV9zY2FsZVVUQ1NldFllYXIoeSkgew0KICB2YXIgZCA9IG5ldyBEYXRlKERhdGUuVVRDKHksIDAsIDEpKTsNCiAgZC5zZXRVVENGdWxsWWVhcih5KTsgLy8gWTJLIGZhaWwNCiAgcmV0dXJuIGQ7DQp9DQoNCmZ1bmN0aW9uIGQzX3RpbWVfc2NhbGVVVENHZXRZZWFyKGQpIHsNCiAgdmFyIHkgPSBkLmdldFVUQ0Z1bGxZZWFyKCksDQogICAgICBkMCA9IGQzX3RpbWVfc2NhbGVVVENTZXRZZWFyKHkpLA0KICAgICAgZDEgPSBkM190aW1lX3NjYWxlVVRDU2V0WWVhcih5ICsgMSk7DQogIHJldHVybiB5ICsgKGQgLSBkMCkgLyAoZDEgLSBkMCk7DQp9DQoNCmQzX3RpbWVfc2NhbGVVVENNZXRob2RzLnllYXIgPSBmdW5jdGlvbihleHRlbnQsIG0pIHsNCiAgcmV0dXJuIGQzX3RpbWVfc2NhbGVMaW5lYXIuZG9tYWluKGV4dGVudC5tYXAoZDNfdGltZV9zY2FsZVVUQ0dldFllYXIpKS50aWNrcyhtKS5tYXAoZDNfdGltZV9zY2FsZVVUQ1NldFllYXIpOw0KfTsNCg0KZDMudGltZS5zY2FsZS51dGMgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIGQzX3RpbWVfc2NhbGUoZDMuc2NhbGUubGluZWFyKCksIGQzX3RpbWVfc2NhbGVVVENNZXRob2RzLCBkM190aW1lX3NjYWxlVVRDRm9ybWF0KTsNCn07DQp9KSgpOw0K