I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPGVycm5vLmg+DQojaW5jbHVkZSA8ZmNudGwuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+DQojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+DQojaW5jbHVkZSA8bGludXgvdW4uaD4NCiNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+DQojaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4NCiNpbmNsdWRlIDx0aW1lLmg+DQojaW5jbHVkZSA8c3lzL3RpbWUuaD4NCg0KLy8jaW5jbHVkZSAiY3Bsb2FkZXIuaCINCiNpbmNsdWRlICJtYnRrX2xvZy5oIg0KI2luY2x1ZGUgIm1idGtfaWZjLmgiDQojaW5jbHVkZSAibWJ0a190eXBlLmgiDQojaW5jbHVkZSAiYXRjaGFubmVsLmgiDQojaW5jbHVkZSAiYXRfdG9rLmgiDQojaW5jbHVkZSAibWJ0a191dGlscy5oIg0KI2luY2x1ZGUgIm1idGtfdGFzay5oIg0KI2luY2x1ZGUgIm1idGtfaW5mby5oIg0KI2luY2x1ZGUgIm1idGtfbnRwLmgiDQojaW5jbHVkZSAibWJ0a19uZXRfY29udHJvbC5oIg0KI2luY2x1ZGUgImluZm9fZGF0YS5oIg0KI2luY2x1ZGUgIm1idGtfbGVkLmgiDQoNCiNpZm5kZWYgVEVNUF9GQUlMVVJFX1JFVFJZDQojZGVmaW5lIFRFTVBfRkFJTFVSRV9SRVRSWShleHApICh7ICAgICAgICAgXA0KICAgIHR5cGVvZiAoZXhwKSBfcmM7ICAgICAgICAgICAgICAgICAgICAgIFwNCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQogICAgICAgIF9yYyA9IChleHApOyAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgIH0gd2hpbGUgKF9yYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7IFwNCiAgICBfcmM7IH0pDQojZW5kaWYNCg0KI2RlZmluZSBCVUZGRVJfU0laRSAyMDQ4DQojZGVmaW5lIFVFVkVOVF9VU0lNX0RFViAiL2RldmljZXMvdmlydHVhbC91c2ltX2V2ZW50L3VzaW0wIg0KI2RlZmluZSBNQlRLX0JPT1RfU0VSVkVSX1JFQURZICIvZXRjL2luaXQuZC9tYnRrX2Jvb3Rfc2VydmVyX3JlYWR5Ig0KI2RlZmluZSBNQlRLX0JPT1RfTkVUX1JFQURZICIvZXRjL2luaXQuZC9tYnRrX2Jvb3RfbmV0X3JlYWR5Ig0KI2RlZmluZSBNQlRLX1JJTERfUElEX0ZJTEUgIi92YXIvcnVuL21idGtfcmlsZC5waWQiDQojZGVmaW5lIE1CVEtfUklMRF9URU1QX0ZJTEUgIi90bXAvbWJ0a19yaWxkLmNvdW50Ig0KDQpzdHJ1Y3QgY29vbGluZ19kZXZpY2UNCnsNCiAgICBjb25zdCBjaGFyICpuYW1lOw0KICAgIGNvbnN0IGNoYXIgKmFjdGlvbjsNCiAgICBjb25zdCBjaGFyICpwYXRoOw0KICAgIGNvbnN0IGNoYXIgKmV2ZW50Ow0KICAgIGNvbnN0IGNoYXIgKnN1YnN5c3RlbTsNCn07DQpzdGF0aWMgcHRocmVhZF90IHVldm5ldF90YXNrX2lkOw0KZXh0ZXJuIG5ldF9pbmZvX3QgbmV0X2luZm87DQpleHRlcm4gbWJ0S19jZWxsX3BhY2tfaW5mb190IGNlbGxfaW5mbzsNCmV4dGVybiBpbmZvX2NnYWN0X3dhaXRfdCBjZ2FjdF93YWl0Ow0KZXh0ZXJuIGJvb2wgYXRfcHJvY2VzczsNCmV4dGVybiBib29sIGF0X2NmdW5fY29tbWFuZDsNCnN0YXRpYyBib29sIGlzX2ZpcnN0X2Jvb3QgPSBGQUxTRTsNCg0Kdm9pZCBzZXRSYWRpb1Bvd2VyKGludCBpc09uKTsNCmludCB1cmNfbXNnX2Rpc3RyaWJ1dGUoYm9vbCBhc3luY19wcm9jZXNzLCBpbmZvX3VyY19tc2dfaWRfZW51bSBtc2csIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbik7DQppbnQgbWJ0a19zaWduYWxfbG9nKGNoYXIgKmRhdGEpOw0KDQovKiBDYWxsZWQgb24gY29tbWFuZCB0aHJlYWQgKi8NCnN0YXRpYyB2b2lkIG9uQVRUaW1lb3V0KCkNCnsNCiAgICBMT0dJKCJBVCBjaGFubmVsIHRpbWVvdXQ7IGNsb3NpbmdcbiIpOw0KICAgIGF0X2Nsb3NlKCk7DQp9DQoNCi8qIENhbGxlZCBvbiBjb21tYW5kIG9yIHJlYWRlciB0aHJlYWQgKi8NCnN0YXRpYyB2b2lkIG9uQVRSZWFkZXJDbG9zZWQoKQ0Kew0KICAgIExPR0koIkFUIGNoYW5uZWwgY2xvc2VkXG4iKTsNCiAgICBhdF9jbG9zZSgpOw0KfQ0KDQovL2ludCByZXFfdGltZV9zZXQoaW50IHR5cGUsIGNoYXIgKnRpbWUsIGludCAqY21lX2Vycik7DQpzdGF0aWMgaW50IG1ldGlzX3N0cnB0aW1lKGNoYXIgKnN0cl90aW1lKQ0Kew0KICAgIHN0cnVjdCB0bSBzdG07DQovLyAgICBjaGFyIGRhdGVUaW1lWzMwXTsNCiAgICBzdHJ1Y3QgdGltZXZhbCB0djsNCiAgICBpZihzdHJwdGltZShzdHJfdGltZSwgIiVZLSVtLSVkICVIOiVNOiVTIiwmc3RtKSAhPSBOVUxMKQ0KICAgIHsNCiAgICAgICAgdGltZV90IF90ID0gbWt0aW1lKCZzdG0pOw0KICAgICAgICB0di50dl9zZWMgPSBfdDsNCiAgICAgICAgaWYoc2V0dGltZW9mZGF5KCZ0diwgTlVMTCkpIHsNCiAgICAgICAgICAgIExPRygiU2V0IHRpbWUgZmFpbDolZCIsIGVycm5vKTsNCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIExPRygiU2V0IHRpbWUgdG8gJXMuIiwgc3RyX3RpbWUpOw0KICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBMT0coIlNldCB0aW1lIGZhaWwuIik7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQp9DQoNCnN0YXRpYyB2b2lkKiBudHBfcHRocmVhZF9ydW4odm9pZCogYXJnKQ0Kew0KICAgIC8vIFdhaXR0aW5nIGZvciBuZXR3b3JrIGNvbm5lY3RlZC4NCiAgICB3aGlsZShtYnRrX25ldF9zdGF0ZV9nZXQoKSA9PSBNQlRLX05FVF9TVEFURV9PRkYpIHsNCiAgICAgICAgc2xlZXAoMSk7DQogICAgfQ0KICAgIExPRygiTmV0d29yayBpcyBjb25uZWN0ZWQuIik7DQoNCiAgICBjaGFyIHRpbWVfdHlwZVsxMF07DQogICAgd2hpbGUoMSl7DQogICAgICAgIG1lbXNldCh0aW1lX3R5cGUsIDAsIDEwKTsNCiAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0Lm1idGsudGltZV90eXBlIiwgdGltZV90eXBlLCAiMCIpOw0KICAgIAlpZihhdG9pKHRpbWVfdHlwZSkgPT0gTUJUS19USU1FX1RZUEVfTlRQKSAvLyBOVFAgdGltZQ0KICAgIAl7DQogICAgICAgICAgICBjaGFyIHRpbWVfc3RyWzEwMF0gPSB7MH07DQogICAgICAgICAgICB0aW1lX3QgdGltZSA9IDA7DQogICAgICAgICAgICB3aGlsZSgodGltZSA9ICh0aW1lX3QpbWJ0a19hdF9zeXN0aW1lKCkpID09IDApIHsNCiAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHN0cnVjdCB0bSAqdG1fdDsNCiAgICAgICAgICAgIHRtX3QgPSBsb2NhbHRpbWUoJnRpbWUpOw0KICAgICAgICAgICAgc3RyZnRpbWUodGltZV9zdHIsMTI4LCIlRiAlVCIsdG1fdCk7DQoNCiAgICAgICAgICAgIC8vIE5UUCB0aW1lDQogICAgICAgICAgICBtZXRpc19zdHJwdGltZSh0aW1lX3N0cik7DQogICAgCX0gZWxzZSB7DQogICAgICAgICAgICBicmVhazsNCiAgICAJfQ0KDQogICAgICAgIHNsZWVwKDY0KTsgLy8gU2xlZXAgNjRzLg0KICAgIH0NCiAgICByZXR1cm4gTlVMTDsNCn0NCg0Kc3RhdGljIHZvaWQgbnRwX3RocmVhZF9zdGFydCgpDQp7DQogICAgcHRocmVhZF90IG50cF9waWQ7DQogICAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7DQogICAgcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsNCiAgICBpZihwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJnRocmVhZF9hdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCkpDQogICAgew0KICAgICAgICBMT0coInB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgpIGZhaWwuIik7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBpZihwdGhyZWFkX2NyZWF0ZSgmbnRwX3BpZCwgJnRocmVhZF9hdHRyLCBudHBfcHRocmVhZF9ydW4sIE5VTEwpKQ0KICAgIHsNCiAgICAgICAgTE9HKCJwdGhyZWFkX2NyZWF0ZSgpIGZhaWwuIik7DQogICAgfQ0KfQ0KDQpzdGF0aWMgdm9pZCBtYnRrX25ldF9yZWFkeSgpDQp7DQogICAgLy8gL2V0Yy9pbml0LmQvbWJ0a19ib290X25ldF9yZWFkeQ0KICAgIGlmKGlzX2ZpcnN0X2Jvb3QpIHsNCiAgICAgICAgaWYoYWNjZXNzKE1CVEtfQk9PVF9ORVRfUkVBRFkgLCBYX09LKSA9PSAwKSB7DQogICAgICAgICAgICBMT0dEKCJFeGVjIDogJXMiLCBNQlRLX0JPT1RfTkVUX1JFQURZKTsNCiAgICAgICAgICAgIG1idGtfc3lzdGVtKE1CVEtfQk9PVF9ORVRfUkVBRFkpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgTE9HRSgiJXMgY2FuIG5vdCBleGVjLiIsIE1CVEtfQk9PVF9ORVRfUkVBRFkpOw0KICAgICAgICB9DQogICAgICAgIGlzX2ZpcnN0X2Jvb3QgPSBGQUxTRTsgLy8gT25seSBvbmUgdGltZS4NCiAgICB9IGVsc2Ugew0KICAgICAgICBMT0dEKCJObyBleGVjIDogJXMiLCBNQlRLX0JPT1RfTkVUX1JFQURZKTsNCiAgICB9DQp9DQoNCmJvb2wgc21zX2NtdCA9IGZhbHNlOw0KbWJ0a19zaW1fY2FyZF9pbmZvIHNpbV9pbmZvX3JlZz17MH07DQpzdGF0aWMgdm9pZCBvblVuc29saWNpdGVkKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnNtc19wZHUpDQp7DQogICAgTE9HSSgiVVJDIDogJXMiLCBzKTsgIC8vTFlOUV9BU1JfQlVHMjAwMV9RLkhVQU5HXzIwMjUwNzMxX2NoYW5nZV9sZXZlbF9mcm9tX3ZfMl9pbmZvDQogICAgLy8gTUJUS19BVF9SRUFEWQ0KICAgIGlmIChzdHJTdGFydHNXaXRoKHMsICJNQlRLX0FUX1JFQURZIikpIC8vIEFUIHJlYWR5Lg0KICAgIHsNCg0KICAgIH0NCiNpZiAwDQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIqU0lNREVURUM6IikpIC8vICpTSU1ERVRFQzoxLFNJTQ0KICAgIHsNCiAgICAgICAgY29uc3QgY2hhciogcHRyID0gc3Ryc3RyKHMsICIsIik7DQogICAgICAgIGlmKHB0cikNCiAgICAgICAgew0KICAgICAgICAgICAgcHRyKys7IC8vIEp1bXAgJywnDQogICAgICAgICAgICBpZihtZW1jbXAocHRyLCAiU0lNIiwgMykgPT0gMCkNCiAgICAgICAgICAgICAgICBuZXRfaW5mby5zaW1fc3RhdGUgPSBNQlRLX1NJTV9TVEFURV9SRUFEWTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBuZXRfaW5mby5zaW1fc3RhdGUgPSBNQlRLX1NJTV9TVEFURV9BQlNFTlQ7DQogICAgICAgIH0NCiAgICB9DQojZW5kaWYNCiAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIipSQURJT1BPV0VSOiIpKSAvLyAiKlJBRElPUE9XRVI6IDEiDQogICAgew0KICAgICAgICBjb25zdCBjaGFyKiBwdHIgPSBzICsgc3RybGVuKCIqUkFESU9QT1dFUjoiKTsNCiAgICAgICAgd2hpbGUoKnB0ciAhPSAnXDAnICYmICpwdHIgPT0gJyAnICkNCiAgICAgICAgew0KICAgICAgICAgICAgcHRyKys7DQogICAgICAgIH0NCg0KICAgICAgICB1aW50OCBzdGF0ZTsNCiAgICAgICAgaWYoKnB0ciA9PSAnMScpIHsNCiAgICAgICAgICAgIC8vbmV0X2luZm8ucmFkaW9fc3RhdGUgPSBNQlRLX1JBRElPX1NUQVRFX09OOw0KICAgICAgICAgICAgLy8gbWJ0a19yYWRpb19yZWFkeV9jYigpOw0KICAgICAgICAgICAgc3RhdGUgPSAodWludDgpMTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vbmV0X2luZm8ucmFkaW9fc3RhdGUgPSBNQlRLX1JBRElPX1NUQVRFX09GRjsNCiAgICAgICAgICAgIHN0YXRlID0gKHVpbnQ4KTA7DQogICAgICAgIH0NCiAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKHRydWUsIElORk9fVVJDX01TR19SQURJT19TVEFURSwgJnN0YXRlLCBzaXplb2YodWludDgpKTsNCiAgICB9DQogICAgLy8gIkNPTk5FQ1QiDQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICJDT05ORUNUIikpDQogICAgew0KICAgICAgICBpZihjZ2FjdF93YWl0LndhaXR0aW5nICYmIGNnYWN0X3dhaXQuYWN0KSB7DQogICAgICAgICAgICBjZ2FjdF93YWl0LndhaXR0aW5nID0gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICAvL3VpbnQ4IGRhdGFfcGRwOw0KICAgICAgICAvL2RhdGFfcGRwID0gMTsgICAgICAgLy8NCiAgICAgICAgLy91cmNfbXNnX2Rpc3RyaWJ1dGUoZmFsc2UsIElORk9fVVJDX01TR19QRFBfU1RBVEUsICZkYXRhX3BkcCwgc2l6ZW9mKHVpbnQ4KSk7DQogICAgfQ0KICAgIC8vICtDR0VWOg0KICAgIC8vICtDR0VWOiBOVyBERUFDVCA8Y2lkPiw8Y2lkPg0KICAgIC8vICtDR0VWOiBNRSBERUFDVCA8Y2lkPiw8Y2lkPg0KICAgIC8vICtDR0VWOiBOVyBQRE4gREVBQ1QgPGNpZD4NCiAgICAvLyArQ0dFVjogTUUgUEROIERFQUNUIDxjaWQ+DQogICAgLy8gK0NHRVY6IE5XIERFVEFDSA0KICAgIC8vICtDR0VWOiBNRSBERVRBQ0gNCiAgICAvLw0KICAgIC8vICtDR0VWOiBOVyBBQ1QgPGNpZD4sPGNpZD4NCiAgICAvLyArQ0dFVjogTUUgQUNUIDxjaWQ+LDxjaWQ+DQogICAgLy8gK0NHRVY6IEVQUyBQRE4gQUNUIDxjaWQ+DQogICAgLy8gK0NHRVY6IE1FIFBETiBBQ1QgPGNpZD4sPHJlYXNvbj4sPGNpZD4NCiAgICAvLyArQ0dFVjogTUUgUEROIEFDVCA8Y2lkPiw8cmVhc29uPg0KICAgIC8vICtDR0VWOiBOVyBQRE4gQUNUIDxjaWQ+DQogICAgLy8gK0NHRVY6IEVQUyBBQ1QgPGNpZD4NCiAgICAvLyArQ0dFVjogTlcgTU9ESUZZIDxjaWQ+LDxyZWFzb24+DQogICAgLy8gK0NHRVY6IE5XIFJFQVRUQUNIDQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ0dFVjoiKSkNCiAgICB7DQogICAgICAgIGlmKGF0X3Byb2Nlc3MgJiYgIWF0X2NmdW5fY29tbWFuZCkNCiAgICAgICAgew0KICAgICAgICAgICAgbWJ0a19wZHBfY2JfaW5mb19zIHBkcF9jYl9pbmZvOw0KICAgICAgICAgICAgbWVtc2V0KCZwZHBfY2JfaW5mbywgMHgwMCwgc2l6ZW9mKG1idGtfcGRwX2NiX2luZm9fcykpOw0KICAgICAgICAgICAgcGRwX2NiX2luZm8uYXV0b191cmMgPSBmYWxzZTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0NHRVY6IE5XIFBETiBERUFDVCAiKSkgLy8gK0NHRVY6IE5XIFBETiBERUFDVCAxDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcGRwX2NiX2luZm8uY2lkID0gYXRvaShzICsgMjApOw0KICAgICAgICAgICAgICAgIHBkcF9jYl9pbmZvLmF1dG9fdXJjPXRydWU7DQogICAgICAgICAgICAgICAgcGRwX2NiX2luZm8uY29ubmVjdF9zdGF0ZSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHVyY19tc2dfZGlzdHJpYnV0ZSh0cnVlLCBJTkZPX1VSQ19NU0dfQ0dFViwgJnBkcF9jYl9pbmZvLCBzaXplb2YobWJ0a19wZHBfY2JfaW5mb19zKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmKGNnYWN0X3dhaXQuYWN0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKHN0clN0YXJ0c1dpdGgocywgIitDR0VWOiBNRSBQRE4gQUNUICIpKSAvLyArQ0dFVjogTUUgUEROIEFDVCAxNSw0DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZihjZ2FjdF93YWl0LmNpZCA9PSBhdG9pKHMgKyAxOCkpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNnYWN0X3dhaXQud2FpdHRpbmcgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHBkcF9jYl9pbmZvLmNpZCA9IGF0b2kocyArIDE4KTsNCiAgICAgICAgICAgICAgICAgICAgcGRwX2NiX2luZm8uY29ubmVjdF9zdGF0ZSA9IHRydWU7DQojaWYgMA0KICAgICAgICAgICAgICAgICAgICBjaGFyKiB0bXBfcyA9IG1lbWR1cChzICsgMTgsc3RybGVuKHMgKyAxOCkpOw0KICAgICAgICAgICAgICAgICAgICBjaGFyKiBmcmVlX3B0ciA9IHRtcF9zOw0KICAgICAgICAgICAgICAgICAgICBjaGFyICpsaW5lID0gdG1wX3M7DQogICAgICAgICAgICAgICAgICAgIGludCB0bXBfaW50Ow0KICAgICAgICAgICAgICAgICAgICBpZiAoYXRfdG9rX3N0YXJ0KCZsaW5lKSA8IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYXRfUERQX0NSRUdfRVhJVDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYXRfUERQX0NSRUdfRVhJVDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYXRfUERQX0NSRUdfRVhJVDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBwZHBfY2JfaW5mby5wZHBfcmVzdWx0ID0gdG1wX2ludDsNCmF0X1BEUF9DUkVHX0VYSVQ6DQogICAgICAgICAgICAgICAgICAgIGZyZWUoZnJlZV9wdHIpOw0KICAgICAgICAgICAgICAgICAgICBmcmVlX3B0ciA9IE5VTEw7DQogICAgICAgICAgICAgICAgICAgIC8vZGF0YV9wZHAgPSAodWludDgpYXRvaShzICsgMjApOyAgLy9yZWFzb24NCiAgICAgICAgICAgICAgICAgICAgaWYoY2dhY3Rfd2FpdC5jaWQgPj0gMSAmJiBjZ2FjdF93YWl0LmNpZCA8IDgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFfcGRwID09IDApDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wZHAgPSAyNTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmNfbXNnX2Rpc3RyaWJ1dGUoZmFsc2UsIElORk9fVVJDX01TR19QRFBfU1RBVEUsICZkYXRhX3BkcCwgc2l6ZW9mKHVpbnQ4KSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kYXRhX3BkcCA9IGNnYWN0X3dhaXQuY2lkICsgMjAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihkYXRhX3BkcCA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcGRwID0gMjY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfUERQX1NUQVRFLCAmZGF0YV9wZHAsIHNpemVvZih1aW50OCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihkYXRhX3BkcCA9PSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcGRwID0gMjc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfUERQX1NUQVRFLCAmZGF0YV9wZHAsIHNpemVvZih1aW50OCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihkYXRhX3BkcCA9PSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcGRwID0gMjc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfUERQX1NUQVRFLCAmZGF0YV9wZHAsIHNpemVvZih1aW50OCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZihjZ2FjdF93YWl0LmNpZCAhPSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcGRwID0gY2dhY3Rfd2FpdC5jaWQgKyAyMDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKHRydWUsIElORk9fVVJDX01TR19QRFBfU1RBVEUsICZkYXRhX3BkcCwgc2l6ZW9mKHVpbnQ4KSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiNlbmRpZg0KICAgICAgICAgICAgICAgICAgICB1cmNfbXNnX2Rpc3RyaWJ1dGUodHJ1ZSwgSU5GT19VUkNfTVNHX1BEUF9TVEFURSwgJnBkcF9jYl9pbmZvLCBzaXplb2YobWJ0a19wZHBfY2JfaW5mb19zKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0NHRVY6IE5XIE1PRElGWSAiKSkgLy8gK0NHRVY6IE5XIE1PRElGWSAxLDQNCiAgICAgICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgICAgICBpZihjZ2FjdF93YWl0LmNpZCA9PSBhdG9pKHMgKyAxNykpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNnYWN0X3dhaXQud2FpdHRpbmcgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgcGRwX2NiX2luZm8uY2lkID0gYXRvaShzICsgMTcpOw0KICAgICAgICAgICAgICAgICAgICBwZHBfY2JfaW5mby5jb25uZWN0X3N0YXRlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgLy91cmNfbXNnX2Rpc3RyaWJ1dGUodHJ1ZSwgSU5GT19VUkNfTVNHX1BEUF9TVEFURSwgJnBkcF9jYl9pbmZvLCBzaXplb2YobWJ0a19wZHBfY2JfaW5mb19zKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIExPR0koIk5vIHByb2Nlc3MgOiAlcyBpbiBjZ2FjdCB0dXJlIHByb2Nlc3MiLCBzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ0dFVjogTUUgUEROIERFQUNUICIpKSAvLyArQ0dFVjogTUUgUEROIERFQUNUIDENCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZihjZ2FjdF93YWl0LmNpZCA9PSBhdG9pKHMgKyAyMCkpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjZ2FjdF93YWl0LndhaXR0aW5nID0gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHBkcF9jYl9pbmZvLmNpZCA9IGF0b2kocyArIDIwKTsNCiAgICAgICAgICAgICAgICBwZHBfY2JfaW5mby5jb25uZWN0X3N0YXRlID0gZmFsc2U7DQogICAgICAgICAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfUERQX1NUQVRFLCAmcGRwX2NiX2luZm8sIHNpemVvZihtYnRrX3BkcF9jYl9pbmZvX3MpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBMT0dJKCJObyBwcm9jZXNzIDogJXMgaW4gQVQgcHJvY2VzcyIsIHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IA0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vICtDR0VWOiBOVyBQRE4gREVBQ1QgPGNpZD4NCiAgICAgICAgICAgIC8vICtDR0VWOiBFUFMgUEROIEFDVCAxDQogICAgICAgICAgICAvLyArQ0dFVjogTUUgUEROIEFDVCA4LDENCiAgICAgICAgICAgIC8vICtDR0VWOiBNRSBQRE4gQUNUIDIsNA0KICAgICAgICAgICAgbWJ0a19wZHBfY2JfaW5mb19zIHBkcF9jYl9pbmZvOw0KICAgICAgICAgICAgbWVtc2V0KCZwZHBfY2JfaW5mbywgMHgwMCwgc2l6ZW9mKG1idGtfcGRwX2NiX2luZm9fcykpOw0KICAgICAgICAgICAgcGRwX2NiX2luZm8uYXV0b191cmMgPSB0cnVlOw0KICAgICAgICAgICAgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0NHRVY6IE5XIFBETiBERUFDVCAiKSkgLy8gK0NHRVY6IE5XIFBETiBERUFDVCA8Y2lkPg0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBwZHBfY2JfaW5mby5jaWQgPSAodWludDgpYXRvaShzICsgMjApOw0KICAgICAgICAgICAgICAgIHBkcF9jYl9pbmZvLmNvbm5lY3Rfc3RhdGUgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB1cmNfbXNnX2Rpc3RyaWJ1dGUodHJ1ZSwgSU5GT19VUkNfTVNHX0NHRVYsICZwZHBfY2JfaW5mbywgc2l6ZW9mKG1idGtfcGRwX2NiX2luZm9fcykpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ0dFVjogRVBTIFBETiBBQ1QgIikpIC8vICtDR0VWOiBFUFMgUEROIEFDVCA8Y2lkPg0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBwZHBfY2JfaW5mby5jaWQgPSAodWludDgpYXRvaShzICsgMTkpOw0KICAgICAgICAgICAgICAgIHBkcF9jYl9pbmZvLmNvbm5lY3Rfc3RhdGUgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ0dFVjogTUUgUEROIERFQUNUICIpKSAvLyArQ0dFVjogRVBTIFBETiBERUFDVCA8Y2lkPg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHBkcF9jYl9pbmZvLmNpZCA9ICh1aW50OClhdG9pKHMgKyAyMCk7DQogICAgICAgICAgICAgICAgcGRwX2NiX2luZm8uY29ubmVjdF9zdGF0ZSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHVyY19tc2dfZGlzdHJpYnV0ZSh0cnVlLCBJTkZPX1VSQ19NU0dfQ0dFViwgJnBkcF9jYl9pbmZvLCBzaXplb2YobWJ0a19wZHBfY2JfaW5mb19zKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDR0VWOiBNRSBQRE4gQUNUICIpKSAvLyArQ0dFVjogTUUgUEROIEFDVCA8Y2lkPiwxDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcGRwX2NiX2luZm8uY2lkID0gKHVpbnQ4KWF0b2kocyArIDE4KTsNCiAgICAgICAgICAgICAgICBwZHBfY2JfaW5mby5jb25uZWN0X3N0YXRlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAvL3VyY19tc2dfZGlzdHJpYnV0ZSh0cnVlLCBJTkZPX1VSQ19NU0dfUERQX1NUQVRFLCAmcGRwX2NiX2luZm8sIHNpemVvZihtYnRrX3BkcF9jYl9pbmZvX3MpKTsNCg0KI2lmIDANCiAgICAgICAgICAgICAgICBjaGFyKiB0bXBfcyA9IG1lbWR1cChzICsgMTgsc3RybGVuKHMgKyAxOCkpOw0KICAgICAgICAgICAgICAgIGNoYXIqIGZyZWVfcHRyID0gdG1wX3M7DQogICAgICAgICAgICAgICAgY2hhciAqbGluZSA9IHRtcF9zOw0KICAgICAgICAgICAgICAgIGludCB0bXBfaW50Ow0KICAgICAgICAgICAgICAgIGlmIChhdF90b2tfc3RhcnQoJmxpbmUpIDwgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGdvdG8gUERQX0NSRUdfRVhJVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZ290byBQRFBfQ1JFR19FWElUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBnb3RvIFBEUF9DUkVHX0VYSVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGRhdGFfcGRwID0gdG1wX2ludDsNClBEUF9DUkVHX0VYSVQ6DQogICAgICAgICAgICAgICAgZnJlZShmcmVlX3B0cik7DQogICAgICAgICAgICAgICAgLy9kYXRhX3BkcCA9ICh1aW50OClhdG9pKHMgKyAyMCk7ICAvL3JlYXNvbg0KICAgICAgICAgICAgICAgIGlmKGRhdGFbMV0gPj0gMSAmJiBkYXRhWzFdIDwgOCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmKGRhdGFfcGRwID09IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcGRwID0gMjU7DQogICAgICAgICAgICAgICAgICAgICAgICB1cmNfbXNnX2Rpc3RyaWJ1dGUoZmFsc2UsIElORk9fVVJDX01TR19QRFBfU1RBVEUsICZkYXRhX3BkcCwgc2l6ZW9mKHVpbnQ4KSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihkYXRhX3BkcCA9PSAxKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3BkcCA9IDI2Ow0KICAgICAgICAgICAgICAgICAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfUERQX1NUQVRFLCAmZGF0YV9wZHAsIHNpemVvZih1aW50OCkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoZGF0YV9wZHAgPT0gMikNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wZHAgPSAyNzsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVyY19tc2dfZGlzdHJpYnV0ZShmYWxzZSwgSU5GT19VUkNfTVNHX1BEUF9TVEFURSwgJmRhdGFfcGRwLCBzaXplb2YodWludDgpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGRhdGFfcGRwID09IDMpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcGRwID0gMjc7DQogICAgICAgICAgICAgICAgICAgICAgICB1cmNfbXNnX2Rpc3RyaWJ1dGUoZmFsc2UsIElORk9fVVJDX01TR19QRFBfU1RBVEUsICZkYXRhX3BkcCwgc2l6ZW9mKHVpbnQ4KSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBkYXRhX3BkcCA9IGRhdGFbMV0gKyAyMDA7DQogICAgICAgICAgICAgICAgICAgIHVyY19tc2dfZGlzdHJpYnV0ZSh0cnVlLCBJTkZPX1VSQ19NU0dfUERQX1NUQVRFLCAmZGF0YV9wZHAsIHNpemVvZih1aW50OCkpOw0KCQkJCQlkYXRhWzFdID0gMDsNCiAgICAgICAgICAgICAgICB9DQojZW5kaWYNCg0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBMT0dJKCJObyBwcm9jZXNzIDogJXMiLCBzKTsNCiAgICAgICAgICAgIH0NCg0KCQkJLy91cmNfbXNnX2Rpc3RyaWJ1dGUodHJ1ZSwgSU5GT19VUkNfTVNHX0NHRVYsIGRhdGEsIHNpemVvZih1aW50OCkgKiAyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyArQ1JFRzogMSwgIjgwMTAiLCAiMDAwMDYwYTUiLCAwLCAyLCAwDQogICAgLy8gK0NSRUc6IDEsICI4MzMwIiwgIjA2NDQ3MzQ3IiwgNywgMiwgMA0KICAgIC8vICtDRVJFRzogMSwgIjgzMzAiLCAiMDY0NDczNDciLCA3DQogICAgLy8gJENSRUc6IDEsICI4MzMwIiwgIjA2NDQ3MzQ3IiwgNywiMGQ0IiwgMiwgMA0KICAgIC8vICRDUkVHOiAxLCAiODAxMCIsICIwMDAwNjBhNyIsIDAsLCAyLCAwDQogICAgLy8gK0NHUkVHOiAxDQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ0dSRUc6IikgICAgIC8vIEdNUy9XQ0RNQSBkYXRhIHJlZ2lzdGVkLg0KICAgICAgICAgfHwgc3RyU3RhcnRzV2l0aChzLCAiK0NFUkVHOiIpKSAgICAvLyBMVEUgZGF0YSByZWdpc3RlZC4NCiAgICB7DQogICAgICAgIGNvbnN0IGNoYXIqIHRtcF9zID0gcyArIDc7DQogICAgICAgIHN0YXRpYyBib29sIG5ldF9sZWRfZ21zX3djZG1hID0gRkFMU0U7DQogICAgICAgIHN0YXRpYyBib29sIG5ldF9sZWRfbHRlID0gRkFMU0U7DQogICAgICAgIHdoaWxlKCp0bXBfcyAmJiAqdG1wX3MgPT0gJyAnKQ0KICAgICAgICAgICAgdG1wX3MrKzsNCiAgICAgICAgdWludDggZGF0YVsyXTsNCiAgICAgICAgZGF0YVswXSA9ICh1aW50OClhdG9pKHRtcF9zKTsgLy8gUmVnIFN0YXRlLg0KDQogICAgICAgIGlmKHN0clN0YXJ0c1dpdGgocywgIitDR1JFRzoiKSkNCiAgICAgICAgew0KICAgICAgICAgICBkYXRhWzFdID0gMDsgIC8vIEdNUy9XQ0RNQQ0KICAgICAgICAgICBpZihkYXRhWzBdID09IDEpDQogICAgICAgICAgIHsNCiAgICAgICAgICAgICAgIG5ldF9sZWRfZ21zX3djZG1hID0gVFJVRTsNCiAgICAgICAgICAgfQ0KICAgICAgICAgICBlbHNlDQogICAgICAgICAgIHsNCiAgICAgICAgICAgICAgIG5ldF9sZWRfZ21zX3djZG1hID0gRkFMU0U7DQogICAgICAgICAgIH0NCg0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICBkYXRhWzFdID0gMTsgIC8vIExURQ0KICAgICAgICAgICBpZihkYXRhWzBdID09IDEpDQogICAgICAgICAgIHsNCiAgICAgICAgICAgICAgIG5ldF9sZWRfbHRlID0gVFJVRTsNCiAgICAgICAgICAgfQ0KICAgICAgICAgICBlbHNlDQogICAgICAgICAgIHsNCiAgICAgICAgICAgICAgIG5ldF9sZWRfbHRlID0gRkFMU0U7DQogICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmKEZBTFNFID09IG5ldF9sZWRfZ21zX3djZG1hICYmIEZBTFNFID09IG5ldF9sZWRfbHRlKQ0KICAgICAgICB7DQogICAgICAgICAgIG1idGtfbmV0X2xlZF9zZXQoTUJUS19ORVRfTEVEX1NFQVJDSF9ORVRXT1JLKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgbWJ0a19uZXRfbGVkX3NldChNQlRLX05FVF9MRURfTkVUX0NPTk5FQ1QpOw0KICAgICAgICAgICBtYnRrX25ldF9yZWFkeSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKHRydWUsIElORk9fVVJDX01TR19ORVRfUFNfUkVHX1NUQVRFLCBkYXRhLCBzaXplb2YoZGF0YSkpOw0KICAgICAgICB1cmNfbXNnX2Rpc3RyaWJ1dGUodHJ1ZSwgSU5GT19VUkNfTVNHX05FVF9TVEFURV9MT0csIE5VTEwsIDApOw0KICAgIH0NCiAgICAvLyArQ1JFRzogMSwgIjgwMTAiLCAiMDAwMDYwYTUiLCAwLCAyLCAwDQogICAgLy8gK0NSRUc6IDEsICI4MzMwIiwgIjA2NDQ3MzQ3IiwgNywgMiwgMA0KICAgIC8vICtDUkVHOiAwDQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ1JFRzoiKSkgICAgIC8vIEdNUy9XQ0RNQS9MVEUgQ1MgcmVnaXN0ZWQuDQogICAgew0KICAgICAgICB1aW50OCBkYXRhWzNdOw0KICAgICAgICBkYXRhWzBdID0gKHVpbnQ4KU1CVEtfTkVUX0NTX1NUQVRFOw0KICAgICAgICBjaGFyKiB0bXBfcyA9IG1lbWR1cChzLHN0cmxlbihzKSk7DQogICAgICAgIGNoYXIqIGZyZWVfcHRyID0gdG1wX3M7DQogICAgICAgIGNoYXIgKmxpbmUgPSB0bXBfczsNCiAgICAgICAgaW50IHRtcF9pbnQ7DQogICAgICAgIGNoYXIgKnRtcF9zdHI7DQogICAgICAgIGlmIChhdF90b2tfc3RhcnQoJmxpbmUpIDwgMCkNCiAgICAgICAgew0KICAgICAgICAgICAgZ290byBDUkVHX0VYSVQ7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBnb3RvIENSRUdfRVhJVDsNCiAgICAgICAgfQ0KICAgICAgICBkYXRhWzFdID0gKHVpbnQ4KXRtcF9pbnQ7IC8vIFJlZyBTdGF0ZS4NCiAgICAgICAgaWYgKGRhdGFbMV0pDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dHN0cigmbGluZSwgJnRtcF9zdHIpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIENSRUdfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dHN0cigmbGluZSwgJnRtcF9zdHIpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIENSRUdfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIENSRUdfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRhdGFbMl0gPSAodWludDgpdG1wX2ludDsgLy8gQWNUDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBkYXRhWzJdID0gKHVpbnQ4KTB4RkY7IC8vIEFjVA0KICAgICAgICB9DQojaWYgMA0KICAgICAgICBpZihkYXRhWzFdID09IDUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHVpbnQ4IGRhdGFfcGRwOw0KICAgICAgICAgICAgZGF0YV9wZHAgPSA1OyAgICAgICAvLw0KICAgICAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfUERQX1NUQVRFLCAmZGF0YV9wZHAsIHNpemVvZih1aW50OCkpOw0KICAgICAgICB9DQojZW5kaWYNCiAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfTkVUX0NTX1JFR19TVEFURSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsNCiAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKHRydWUsIElORk9fVVJDX01TR19ORVRfU1RBVEVfTE9HLCBOVUxMLCAwKTsNCkNSRUdfRVhJVDoNCiAgICAgICAgZnJlZShmcmVlX3B0cik7DQogICAgfQ0KICAgIC8vICtDTENDOiAxLCAxLCA2LCAwLCAwLCAiMTg5ODE5MTE2OTEiLCAxMjksICIiLCwgMA0KICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0NMQ0M6IikpDQogICAgew0KICAgICAgICBtYnRrX2NhbGxfaW5mb190IHJlZzsNCiAgICAgICAgcmVnLmNhbGxfd2FpdCA9IE1CVEtfQ0xDQzsNCiAgICAgICAgY2hhciogdG1wX3MgPSBtZW1kdXAocyxzdHJsZW4ocykpOw0KICAgICAgICBjaGFyKiBmcmVlX3B0ciA9IHRtcF9zOw0KICAgICAgICBjaGFyICpsaW5lID0gdG1wX3M7DQogICAgICAgIGludCB0bXBfaW50Ow0KICAgICAgICBjaGFyICp0bXBfc3RyOw0KICAgICAgICBpbnQgZXJyOw0KDQogICAgICAgIGVyciA9IGF0X3Rva19zdGFydCgmbGluZSk7DQogICAgICAgIGlmIChlcnIgPCAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBnb3RvIENMQ0NfRVhJVDsNCiAgICAgICAgfQ0KICAgICAgICBlcnIgPSBhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpOyAvLyBkaXIxDQogICAgICAgIGlmIChlcnIgPCAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBnb3RvIENMQ0NfRVhJVDsNCiAgICAgICAgfQ0KICAgICAgICByZWcuZGlyMSA9ICh1aW50OCl0bXBfaW50Ow0KICAgICAgICBlcnIgPSBhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpOy8vIGRpcg0KICAgICAgICBpZiAoZXJyIDwgMCkNCiAgICAgICAgew0KICAgICAgICAgICAgZ290byBDTENDX0VYSVQ7DQogICAgICAgIH0NCiAgICAgICAgcmVnLmRpciA9ICh1aW50OCl0bXBfaW50Ow0KICAgICAgICBlcnIgPSBhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpOy8vIHN0YXRlDQogICAgICAgIGlmIChlcnIgPCAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBnb3RvIENMQ0NfRVhJVDsNCiAgICAgICAgfQ0KICAgICAgICByZWcuc3RhdGUgPSAodWludDgpdG1wX2ludDsNCiAgICAgICAgZXJyID0gYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KTsvLyBtb2RlDQogICAgICAgIGlmIChlcnIgPCAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBnb3RvIENMQ0NfRVhJVDsNCiAgICAgICAgfQ0KICAgICAgICByZWcubW9kZSA9ICh1aW50OCl0bXBfaW50Ow0KICAgICAgICBlcnIgPSBhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpOy8vIG1wdHkNCiAgICAgICAgaWYgKGVyciA8IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIGdvdG8gQ0xDQ19FWElUOw0KICAgICAgICB9DQogICAgICAgIHJlZy5tcHR5ID0gKHVpbnQ4KXRtcF9pbnQ7DQogICAgICAgIGVyciA9IGF0X3Rva19uZXh0c3RyKCZsaW5lLCAmdG1wX3N0cik7IC8vIHBob25lX251bWJlcg0KICAgICAgICBpZiAoZXJyIDwgMCkNCiAgICAgICAgew0KICAgICAgICAgICAgZ290byBDTENDX0VYSVQ7DQogICAgICAgIH0NCg0KICAgICAgICBtZW1zZXQocmVnLnBob25lX251bWJlciwwLHNpemVvZihyZWcucGhvbmVfbnVtYmVyKSk7DQogICAgICAgIG1lbWNweShyZWcucGhvbmVfbnVtYmVyLCB0bXBfc3RyLCBzdHJsZW4odG1wX3N0cikpOw0KICAgICAgICBlcnIgPSBhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpOy8vIHRweWUNCiAgICAgICAgaWYgKGVyciA8IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIGdvdG8gQ0xDQ19FWElUOw0KICAgICAgICB9DQogICAgICAgIHJlZy50eXBlID0gKHVpbnQ4KXRtcF9pbnQ7DQoNCiAgICAgICAgaWYocmVnLnN0YXRlID09IDIgfHwgcmVnLnN0YXRlID09IDMgfHwgcmVnLnN0YXRlID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIG1idGtfbmV0X2xlZF9zZXQoTUJUS19ORVRfTEVEX0NBTExfQ09OTkVDVCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZihyZWcuc3RhdGUgPT0gNCAmJiByZWcuZGlyID09IDEpDQogICAgICAgIHsNCiAgICAgICAgICAgIG1idGtfbmV0X2xlZF9zZXQoTUJUS19ORVRfTEVEX0NBTExfQ09OTkVDVCk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHVyY19tc2dfZGlzdHJpYnV0ZSh0cnVlLCBJTkZPX1VSQ19NU0dfQ0FMTF9TVEFURSwgJnJlZywgc2l6ZW9mKG1idGtfY2FsbF9pbmZvX3QpKTsNCkNMQ0NfRVhJVDoNCiAgICAgICAgZnJlZShmcmVlX3B0cik7DQogICAgfQ0KICAgIC8vICtDUEFTOiA0DQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ1BBUzoiKSkNCiAgICB7DQogICAgICAgIG1idGtfY2FsbF9pbmZvX3QgcmVnOw0KICAgICAgICByZWcuY2FsbF93YWl0ID0gMDsNCiAgICAgICAgY2hhciogdG1wX3MgPSBtZW1kdXAocyxzdHJsZW4ocykpOw0KICAgICAgICBjaGFyKiBmcmVlX3B0ciA9IHRtcF9zOw0KICAgICAgICBjaGFyICpsaW5lID0gdG1wX3M7DQogICAgICAgIGludCB0bXBfaW50Ow0KICAgICAgICBpbnQgZXJyOw0KDQogICAgICAgIG1lbXNldCgmcmVnLDAsc2l6ZW9mKHJlZykpOw0KDQogICAgICAgIGVyciA9IGF0X3Rva19zdGFydCgmbGluZSk7DQogICAgICAgIGlmIChlcnIgPCAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBnb3RvIENQQVNfRVhJVDsNCiAgICAgICAgfQ0KICAgICAgICBlcnIgPSBhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpOw0KICAgICAgICBpZiAoZXJyIDwgMCkNCiAgICAgICAgew0KICAgICAgICAgICAgZ290byBDUEFTX0VYSVQ7DQogICAgICAgIH0NCiAgICAgICAgcmVnLnBhcyA9ICh1aW50OCl0bXBfaW50Ow0KICAgICAgICByZWcuY2FsbF93YWl0ID0gTUJUS19DUEFTOw0KICAgICAgICB1cmNfbXNnX2Rpc3RyaWJ1dGUodHJ1ZSwgSU5GT19VUkNfTVNHX0NBTExfU1RBVEUsICZyZWcsIHNpemVvZihtYnRrX2NhbGxfaW5mb190KSk7DQpDUEFTX0VYSVQ6DQogICAgICAgIGZyZWUoZnJlZV9wdHIpOw0KICAgIH0NCiAgICAvLyArQ0FMTERJU0NPTk5FQ1Q6IDENCiAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDQUxMRElTQ09OTkVDVDoiKSkNCiAgICB7DQogICAgICAgIG1idGtfY2FsbF9pbmZvX3QgcmVnOw0KICAgICAgICByZWcuY2FsbF93YWl0ID0gMDsNCiAgICAgICAgY2hhciogdG1wX3MgPSBtZW1kdXAocyxzdHJsZW4ocykpOw0KICAgICAgICBjaGFyKiBmcmVlX3B0ciA9IHRtcF9zOw0KICAgICAgICBjaGFyICpsaW5lID0gdG1wX3M7DQogICAgICAgIGludCB0bXBfaW50Ow0KICAgICAgICBpbnQgZXJyOw0KDQogICAgICAgIG1lbXNldCgmcmVnLDAsc2l6ZW9mKHJlZykpOw0KDQogICAgICAgIGVyciA9IGF0X3Rva19zdGFydCgmbGluZSk7DQogICAgICAgIGlmIChlcnIgPCAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBnb3RvIENBTExESVNDT05ORUNURURfRVhJVDsNCiAgICAgICAgfQ0KICAgICAgICBlcnIgPSBhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpOw0KICAgICAgICBpZiAoZXJyIDwgMCkNCiAgICAgICAgew0KICAgICAgICAgICAgZ290byBDQUxMRElTQ09OTkVDVEVEX0VYSVQ7DQogICAgICAgIH0NCiAgICAgICAgcmVnLmRpc2Nvbm5lY3RlZF9pZCA9IHRtcF9pbnQ7DQogICAgICAgIHJlZy5jYWxsX3dhaXQgPSBNQlRLX0RJU0NPTk5FQ1RFRDsNCg0KICAgICAgICBpZihyZWcuY2FsbF93YWl0ID09IE1CVEtfRElTQ09OTkVDVEVEKQ0KICAgICAgICB7DQogICAgICAgICAgICBtYnRrX25ldF9sZWRfc2V0KE1CVEtfTkVUX0xFRF9DQUxMX0RJU0NPTk5FQ1QpOw0KICAgICAgICB9DQoNCiAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKHRydWUsIElORk9fVVJDX01TR19DQUxMX1NUQVRFLCAmcmVnLCBzaXplb2YobWJ0a19jYWxsX2luZm9fdCkpOw0KDQpDQUxMRElTQ09OTkVDVEVEX0VYSVQ6DQogICAgICAgIGZyZWUoZnJlZV9wdHIpOw0KICAgIH0NCiAgICAvLyAqU0lNREVURUM6MSxTSU0NCiAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIipTSU1ERVRFQzoiKSkNCiAgICB7DQogICAgICAgIGlmKHN0clN0YXJ0c1dpdGgocywgIipTSU1ERVRFQzoxLE5PUyIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBuZXRfaW5mby5zaW1fc3RhdGUgPSBNQlRLX1NJTV9BQlNFTlQ7DQogICAgICAgIH0NCg0KICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gLTE7DQogICAgICAgIGlmKHN0clN0YXJ0c1dpdGgocywgIipTSU1ERVRFQzoxLE5PUyIpKQ0KICAgICAgICAgICAgc2ltX2luZm9fcmVnLnNpbSA9IDA7DQogICAgICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiKlNJTURFVEVDOjEsU0lNIikpDQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gMTsNCiNpZiAwDQogICAgICAgIGlmKHNpbV9pbmZvX3JlZy5zaW0gPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdWludDggZGF0YV9wZHA7DQogICAgICAgICAgICBkYXRhX3BkcCA9IDExOyAgICAgICAvLw0KICAgICAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfUERQX1NUQVRFLCAmZGF0YV9wZHAsIHNpemVvZih1aW50OCkpOw0KICAgICAgICB9DQojZW5kaWYNCiAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfU0lNX1NUQVRFLCAmc2ltX2luZm9fcmVnLCBzaXplb2YobWJ0a19zaW1fY2FyZF9pbmZvKSk7DQogICAgfQ0KICAgIC8vICpFVUlDQzoxDQovKjA6IFNJTQ0KMTogVVNJTQ0KMjogVEVTVCBTSU0NCjM6IFRFU1QgVVNJTQ0KNDogVU5LTk9XTg0KTm90ZTogKkVVSUNDOg0KKi8NCiAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIipFVUlDQzoiKSkNCiAgICB7DQogICAgICAgIHNpbV9pbmZvX3JlZy5zaW0gPSAtMTsNCiAgICAgICAgc2ltX2luZm9fcmVnLnNpbV9jYXJkX3R5cGUgPSAtMTsNCiAgICAgICAgaWYoc3RyU3RhcnRzV2l0aChzLCAiKkVVSUNDOiAwIikpDQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltX2NhcmRfdHlwZSA9IDE7DQogICAgICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiKkVVSUNDOiAxIikpDQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltX2NhcmRfdHlwZSA9IDI7DQogICAgICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiKkVVSUNDOiAyIikpDQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltX2NhcmRfdHlwZSA9IDE7DQogICAgICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiKkVVSUNDOiAzIikpDQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltX2NhcmRfdHlwZSA9IDI7DQogICAgICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiKkVVSUNDOiA0IikpDQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltX2NhcmRfdHlwZSA9IDA7DQogICAgICAgIHVyY19tc2dfZGlzdHJpYnV0ZShmYWxzZSwgSU5GT19VUkNfTVNHX1NJTV9TVEFURSwgJnNpbV9pbmZvX3JlZywgc2l6ZW9mKG1idGtfc2ltX2NhcmRfaW5mbykpOw0KICAgIH0NCiAgICAvLyArQ1BJTjogU0lNIFBJTg0KICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0NQSU46IikpDQogICAgew0KICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gLTE7DQogICAgICAgIGlmKHN0clN0YXJ0c1dpdGgocywgIitDUElOOiBSRUFEWSIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gMTsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX1JFQURZOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0NQSU46IFNJTSBQSU4iKSkNCiAgICAgICAgew0KICAgICAgICAgICAgc2ltX2luZm9fcmVnLnNpbSA9IDI7DQogICAgICAgICAgICBuZXRfaW5mby5zaW1fc3RhdGUgPSBNQlRLX1NJTV9QSU47DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ1BJTjogU0lNIFBVSyIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gMzsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX1BVSzsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDUElOOiBQSC1TSU1MT0NLIFBJTiIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gNDsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX0FCU0VOVDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDUElOOiBQSC1TSU1MT0NLIFBVSyIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gNTsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX0FCU0VOVDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDUElOOiBQSC1GU0lNIFBJTiIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gNjsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX0FCU0VOVDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDUElOOiBQSC1GU0lNIFBVSyIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gNzsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX0FCU0VOVDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDUElOOiBTSU0gUElOMiIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gODsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX0FCU0VOVDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDUElOOiBTSU0gUFVLMiIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gOTsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX0FCU0VOVDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDUElOOiBQSC1ORVQgUElOIikpDQogICAgICAgIHsNCiAgICAgICAgICAgIHNpbV9pbmZvX3JlZy5zaW0gPSAxMDsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX05FVFdPUktfUEVSU09OQUxJWkFUSU9OOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0NQSU46IFBILU5FVCBQVUsiKSkNCiAgICAgICAgew0KICAgICAgICAgICAgc2ltX2luZm9fcmVnLnNpbSA9IDExOw0KICAgICAgICAgICAgbmV0X2luZm8uc2ltX3N0YXRlID0gTUJUS19TSU1fQUJTRU5UOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0NQSU46IFBILU5FVFNVQiBQSU5NVCIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gMTI7DQogICAgICAgICAgICBuZXRfaW5mby5zaW1fc3RhdGUgPSBNQlRLX1NJTV9BQlNFTlQ7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ1BJTjogUEgtTkVUU1VCIFBVSyIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gMTM7DQogICAgICAgICAgICBuZXRfaW5mby5zaW1fc3RhdGUgPSBNQlRLX1NJTV9BQlNFTlQ7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ1BJTjogUEgtU1AgUElOIikpDQogICAgICAgIHsNCiAgICAgICAgICAgIHNpbV9pbmZvX3JlZy5zaW0gPSAxNDsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX0FCU0VOVDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDUElOOiBQSC1TUCBQVUsiKSkNCiAgICAgICAgew0KICAgICAgICAgICAgc2ltX2luZm9fcmVnLnNpbSA9IDE1Ow0KICAgICAgICAgICAgbmV0X2luZm8uc2ltX3N0YXRlID0gTUJUS19TSU1fQUJTRU5UOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0NQSU46IFBILUNPUlAgUElOIikpDQogICAgICAgIHsNCiAgICAgICAgICAgIHNpbV9pbmZvX3JlZy5zaW0gPSAxNjsNCiAgICAgICAgICAgIG5ldF9pbmZvLnNpbV9zdGF0ZSA9IE1CVEtfU0lNX0FCU0VOVDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDUElOOiBQSC1DT1JQIFBVSyIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1faW5mb19yZWcuc2ltID0gMTc7DQogICAgICAgICAgICBuZXRfaW5mby5zaW1fc3RhdGUgPSBNQlRLX1NJTV9BQlNFTlQ7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ1BJTjogU0lNIFJFTU9WRUQiKSkNCiAgICAgICAgew0KICAgICAgICAgICAgIHNpbV9pbmZvX3JlZy5zaW0gPSAxODsNCiAgICAgICAgICAgICBuZXRfaW5mby5zaW1fc3RhdGUgPSBNQlRLX1NJTV9BQlNFTlQ7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgc2ltX2luZm9fcmVnLnNpbSA9IDIwOw0KI2lmIDANCiAgICAgICAgaWYoc2ltX2luZm9fcmVnLnNpbSA9PSAxOCkNCiAgICAgICAgew0KICAgICAgICAgICAgdWludDggZGF0YV9wZHA7DQogICAgICAgICAgICBkYXRhX3BkcCA9IDExOyAgICAgICAvLw0KICAgICAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfUERQX1NUQVRFLCAmZGF0YV9wZHAsIHNpemVvZih1aW50OCkpOw0KICAgICAgICB9DQojZW5kaWYNCiAgICAgICAgdXJjX21zZ19kaXN0cmlidXRlKGZhbHNlLCBJTkZPX1VSQ19NU0dfU0lNX1NUQVRFLCAmc2ltX2luZm9fcmVnLCBzaXplb2YobWJ0a19zaW1fY2FyZF9pbmZvKSk7DQogICAgfQ0KICAgIC8vICtDTVQ6ICwyMw0KICAgIC8vIDA4OTE2ODMxMDgyMDA4NTVGNjI0MEQ5MTY4ODE4OTkxMTE5NkYxMDAwMDIyMTEzMDcxNzQ0NTIzMDMzMUQ5MEMNCiAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitDTVQ6IikgfHwgc21zX2NtdCkNCiAgICB7DQogICAgICAgIGlmKCFzbXNfY210KXsNCiAgICAgICAgICAgIHNtc19jbXQgPSB0cnVlOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHNtc19jbXQgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICBwcmludGYoIitDTVQoKSBzbXNfY210OiVkLCBzOiVzLCBsZW46JWRcbiIsc21zX2NtdCwgIHMsIHN0cmxlbihzKSk7DQogICAgICAgIHVyY19tc2dfZGlzdHJpYnV0ZShmYWxzZSwgSU5GT19VUkNfTVNHX1NNU19TVEFURSwgcywgc3RybGVuKHMpKTsNCiAgICB9DQojaWYgMA0KICAgIC8vIExURSBkYXRhIHJlZ2lzdGVkLg0KICAgIC8vICtDRVJFRzogMSwgIjgzMzAiLCAiMDY0NDczNDciLCA3DQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrQ0VSRUc6IikpDQogICAgew0KICAgICAgICBjaGFyKiB0bXBfcyA9IG1lbWR1cChzLHN0cmxlbihzKSk7DQogICAgICAgIGNoYXIqIGZyZWVfcHRyID0gdG1wX3M7DQogICAgICAgIGNoYXIgKmxpbmUgPSB0bXBfczsNCiAgICAgICAgaW50IHRtcF9pbnQ7DQogICAgICAgIGNoYXIgKnRtcF9zdHI7DQogICAgICAgIGlmIChhdF90b2tfc3RhcnQoJmxpbmUpIDwgMCkNCiAgICAgICAgew0KICAgICAgICAgICAgZ290byBDUkVHX0VYSVQ7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBnb3RvIENSRUdfRVhJVDsNCiAgICAgICAgfQ0KICAgICAgICB1aW50OCBkYXRhID0gKHVpbnQ4KXRtcF9pbnQ7IC8vIFJlZyBTdGF0ZS4NCg0KICAgICAgICB1cmNfbXNnX2Rpc3RyaWJ1dGUoSU5GT19VUkNfTVNHX05FVF9SRUdfU1RBVEUsICZkYXRhLCBzaXplb2YodWludDgpKTsNCkNSRUdfRVhJVDoNCiAgICAgICAgZnJlZShmcmVlX3B0cik7DQogICAgfQ0KI2VuZGlmDQogICAgLyoNCiAgICAvLyA8bWNjPiwgPGxlbmd0aCBvZiBtbmM+LCA8bW5jPiwgPHRhYz4sIDxQQ0k+LCA8ZGxFdWFyZmNuPiwgPCB1bEV1YXJmY24gPiwgPGJhbmQ+LCA8ZGxCYW5kd2lkdGg+LA0KICAgIC8vIDxyc3JwPiw8cnNycT4sIDxzaW5yPiwNCiAgICAvLyBlcnJjTW9kZVN0YXRlLGVtbVN0YXRlLHNlcnZpY2VTdGF0ZSxJc1NpbmdsZUVtbVJlamVjdENhdXNlLEVNTVJlamVjdENhdXNlLG1tZUdyb3VwSWQsbW1lQ29kZSxtVG1zaSwNCiAgICAvLyBjZWxsSWQsc3ViRnJhbWVBc3NpZ25UeXBlLHNwZWNpYWxTdWJmcmFtZVBhdHRlcm5zLHRyYW5zTW9kZQ0KICAgIC8vIG1haW5Sc3JwLGRpdmVyc2l0eVJzcnAsbWFpblJzcnEsZGl2ZXJzaXR5UnNycSxyc3NpLGNxaSxwYXRoTG9zcyx0YjBEbFRwdCx0YjFEbFRwdCx0YjBEbFBlYWtUcHQsdGIxRGxQZWFrVHB0LHRiMFVsUGVha1RwdCwNCiAgICAvLyB0YjFVbFBlYWtUcHQsZGxUaHJvdWdoUHV0LGRsUGVha1Rocm91Z2hQdXQsYXZlckRsUFJCLGF2ZXJDUUlUYjAsYXZlckNRSVRiMSxyYW5rSW5kZXgsZ3JhbnRUb3RhbCx1bFRocm91Z2hQdXQsdWxQZWFrVGhyb3VnaFB1dCxjdXJyUHVzY2hUeFBvd2VyLGF2ZXJVbFBSQiwNCiAgICAvLyBkbEJlciwgdWxCZXIsDQogICAgLy8gZGl2ZXJzaXR5U2luciwgZGl2ZXJzaXR5UnNzaQ0KICAgICtFRU1MVEVTVkM6IDExMjAsIDIsIDAsIDMzNTg0LCA0MzAsIDQwOTM2LCA0MDkzNiwgNDEsIDIwLA0KICAgIDAsIDAsIDAsDQogICAgMSwgMTAsIDAsIDEsIDAsIDEwNTksIDc4LCAzOTU5NTY2NTY1LA0KICAgIDEwNTE0OTI0OCwgMiwgNywgNywNCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxMTkwOTE5LCAwLCAwLCAwLCAxNjc3OTc3NywNCiAgICAwLCA1MTEyODY3LCAzOTU5NTY2NTY1LCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KICAgIDAsIDAsDQogICAgNywgNDQNCiAgICAqLw0KICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0VFTUxURVNWQzoiKSkgICAvLyBMVEUgU2VydmVyIENlbGwNCiAgICB7DQogICAgICAgIC8vIHRhYywgUENJLCBkbEV1YXJmY24sIHVsRXVhcmZjbiwgYmFuZA0KICAgICAgICBpZihjZWxsX2luZm8ucnVubmluZykgew0KICAgICAgICAgICAgaW50IHRtcF9pbnQ7DQogICAgICAgICAgICBpbnQgaSA9IDA7DQogICAgICAgICAgICBjaGFyKiB0bXBfcyA9IG1lbWR1cChzLHN0cmxlbihzKSk7DQogICAgICAgICAgICBjaGFyKiBmcmVlX3B0ciA9IHRtcF9zOw0KICAgICAgICAgICAgY2hhciAqbGluZSA9IHRtcF9zOw0KICAgICAgICAgICAgaWYgKGF0X3Rva19zdGFydCgmbGluZSkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUxURVNWQ19FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTYgPSAodWludDMyKXRtcF9pbnQ7ICAgIC8vbWNjDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVTVkNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUxURVNWQ19FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTcgPSAodWludDMyKXRtcF9pbnQ7ICAgIC8vbW5jDQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgLy8gSnVtcCAyIGludGVnZXIuDQogICAgICAgICAgICBpID0gMDsNCiAgICAgICAgICAgIHdoaWxlKGkgPCAyKSB7DQogICAgICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZ290byBFRU1MVEVTVkNfRVhJVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaSsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUxURVNWQ19FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTEgPSAodWludDMyKXRtcF9pbnQ7ICAgIC8vdGFjDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVTVkNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWUyID0gKHVpbnQzMil0bXBfaW50OyAgICAvL3BjaQ0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlMyA9ICh1aW50MzIpdG1wX2ludDsgICAgLy9kbCBhcmZjbg0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgLy91bCBhcmZjbg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVTVkNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU1ID0gKHVpbnQzMil0bXBfaW50OyAgICAvL2JhbmQNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUxURVNWQ19FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlOCA9ICh1aW50MzIpdG1wX2ludDsgICAgLy9yc3JwDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVTVkNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU5ID0gKHVpbnQzMil0bXBfaW50OyAgICAvL3JzcnENCg0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQoJCQkNCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWUxMSA9ICh1aW50MzIpdG1wX2ludDsgICAgLy9zaW5yDQoNCiAgICAgICAgICAgIGZvcihpID0wOyBpIDwgOTsgaSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFU1ZDX0VYSVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KCQkJY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTEwID0gKHVpbnQzMil0bXBfaW50OyAgIC8vY2VsbCBpZGVudGl5DQoNCiAgICAgICAgICAgIGZvcihpID0wOyBpIDwgMjg7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBnb3RvIEVFTUxURVNWQ19FWElUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTQgPSAodWludDMyKXRtcF9pbnQ7IC8vZGxCbGVyDQoNCiAgICAgICAgICAgIGZvcihpID0wOyBpIDwgMTQ7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBnb3RvIEVFTUxURVNWQ19FWElUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTEyID0gKHVpbnQzMil0bXBfaW50OyAvL2ZkZCBvciB0ZGQgICAvLzYzDQoNCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsX251bSsrOw0KDQogICAgICAgICAgICBMT0coIkxURVNWQyBjZWxsX251bSA6ICVkIiwgY2VsbF9pbmZvLmNlbGxfbnVtKTsNCg0KDQpFRU1MVEVTVkNfRVhJVDoNCiAgICAgICAgICAgIGZyZWUoZnJlZV9wdHIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8qDQogICAgLy8gaW5kZXgscGh5Q2VsbElkLGV1QXJmY24scnNycCxyc3JxDQogICAgK0VFTUxURUlOVEVSOiAwLCA2NTUzNSwgMzg5NTAsIDAsIDANCiAgICAqLw0KICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0VFTUxURUlOVFJBOiIpKSAvLyBMVEUgzazGtdChx/gNCiAgICB7DQogICAgICAgIC8vIHBoeUNlbGxJZCxldUFyZmNuLHJzcnAscnNycQ0KICAgICAgICBpZihjZWxsX2luZm8ucnVubmluZykgew0KICAgICAgICAgICAgaW50IHRtcF9pbnQ7DQogICAgICAgICAgICBjaGFyKiB0bXBfcyA9IG1lbWR1cChzLHN0cmxlbihzKSk7DQogICAgICAgICAgICBjaGFyKiBmcmVlX3B0ciA9IHRtcF9zOw0KICAgICAgICAgICAgY2hhciAqbGluZSA9IHRtcF9zOw0KICAgICAgICAgICAgaWYgKGF0X3Rva19zdGFydCgmbGluZSkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFSU5UUkFfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkgIC8vaW5kZXgNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUxURUlOVFJBX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDAgfHwgdG1wX2ludCA8PSAwIHx8IHRtcF9pbnQgPiA1MDMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVJTlRSQV9FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTEgPSAodWludDMyKXRtcF9pbnQ7ICAvL3BoeWNlbGxpZA0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFSU5UUkFfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWUyID0gKHVpbnQzMil0bXBfaW50OyAvL2FyZmNuDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVJTlRSQV9FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTMgPSAodWludDMyKXRtcF9pbnQ7IC8vcnNycA0KICAgICAgICAgICAgTE9HKCJjZWxsIGxpbmUgOiAlcyIsIGxpbmUpOw0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFSU5UUkFfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU0ID0gKHVpbnQzMil0bXBfaW50OyAvL3JzcnENCgkJCQ0KCQkJY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTcgPTB4N0ZGRkZGRkY7Ly9tbmMNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxfbnVtKys7DQpFRU1MVEVJTlRSQV9FWElUOg0KICAgICAgICAgICAgZnJlZShmcmVlX3B0cik7DQogICAgICAgIH0NCiAgICB9DQogICAgLy8gRG8gbm90aGluZw0KICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0VFTUxURUlOVEVSOiIpKSAvLyBMVEUg0uzGtS/Qocf4DQogICAgew0KICAgICAgICAvLyBwaHlDZWxsSWQsZXVBcmZjbixyc3JwLHJzcnENCiAgICAgICAgaWYoY2VsbF9pbmZvLnJ1bm5pbmcpIHsNCiAgICAgICAgICAgIGludCB0bXBfaW50Ow0KICAgICAgICAgICAgY2hhciogdG1wX3MgPSBtZW1kdXAocyxzdHJsZW4ocykpOw0KICAgICAgICAgICAgY2hhciogZnJlZV9wdHIgPSB0bXBfczsNCiAgICAgICAgICAgIGNoYXIgKmxpbmUgPSB0bXBfczsNCiAgICAgICAgICAgIGlmIChhdF90b2tfc3RhcnQoJmxpbmUpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUxURUlOVEVSX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApICAvL2luZGV4DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVJTlRFUl9FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwIHx8IHRtcF9pbnQgPD0gMCB8fCB0bXBfaW50ID4gNTAzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFSU5URVJfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWUxID0gKHVpbnQzMil0bXBfaW50OyAvL3BoeSBjZWxsIGlkDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVJTlRFUl9FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTIgPSAodWludDMyKXRtcF9pbnQ7IC8vYXJmY24NCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUxURUlOVEVSX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlMyA9ICh1aW50MzIpdG1wX2ludDsgIC8vcnNycA0KICAgICAgICAgICAgTE9HKCJjZWxsIGxpbmUgOiAlcyIsIGxpbmUpOw0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFSU5URVJfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU0ID0gKHVpbnQzMil0bXBfaW50OyAvL3JzcnENCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBMT0coImNlbGwgdG1wX2ludCA6ICVkIiwgdG1wX2ludCk7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVJTlRFUl9FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTUgPSAodWludDMyKXRtcF9pbnQ7ICAvL2NlbGxpZA0KICAgICAgICAgICAgTE9HKCJjZWxsIHZhbHVlNSA6ICVkIiwgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTUpOw0KDQogICAgICAgICAgICBMT0coImFmdGVyIGNlbGxpZCBjZWxsIGxpbmUgOiAlcyIsIGxpbmUpOw0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNTFRFSU5URVJfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU2ID0gKHVpbnQzMil0bXBfaW50OyAvL21jYw0KDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApICAgLy9sZW5ndGggb2YgbW5jDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgTE9HKCJleGl0Iik7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVJTlRFUl9FWElUOw0KICAgICAgICAgICAgfSAgICAgDQoNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBMT0coImV4aXQiKTsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUxURUlOVEVSX0VYSVQ7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU3ID0gKHVpbnQzMil0bXBfaW50OyAvL21uYw0KDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApICANCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBMT0coImV4aXQiKTsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUxURUlOVEVSX0VYSVQ7DQogICAgICAgICAgICB9ICAgICANCgkJCWNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU4ID0gKHVpbnQzMil0bXBfaW50OyAvL3RhYw0KICAgICAgICAgICAgTE9HKCJjZWxsIHZhbHVlOCA6ICV1IiwgKHVpbnQzMiljZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlOCk7DQoNCg0KICAgICAgICAgICAgZm9yKGludCBpID0wOyBpIDwgODsgaSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkgIC8vMSBjZWxsIGlkICAyIHJzbGV2ZWwgDQoJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMyB0aHJlc2ggbG93ICA0IHRocmVzaF9oaWdoIDUgY2VsbF9wcmlvcml0eSAgNiByZWZTaWduYWxQb3dlciA3IGJhbmR3aWR0aCA4IGJhbmQNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIExPRygiZXhpdCBpID0gJWQiLGkpOw0KICAgICAgICAgICAgICAgICAgICBnb3RvIEVFTUxURUlOVEVSX0VYSVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlOSA9ICh1aW50MzIpdG1wX2ludDsgLy9iYW5kDQogICAgICAgICAgICBMT0coImNlbGwgdmFsdWU5IDogJWQiLCBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlOSk7DQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgTE9HKCJleGl0Iik7DQogICAgICAgICAgICAgICAgZ290byBFRU1MVEVJTlRFUl9FWElUOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlMTAgPSAodWludDMyKXRtcF9pbnQ7IC8vcnNzaQ0KDQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbF9udW0rKzsNCkVFTUxURUlOVEVSX0VYSVQ6DQogICAgICAgICAgICBmcmVlKGZyZWVfcHRyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBEbyBub3RoaW5nDQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrRUVNTFRFSU5URVJSQVQ6IikpIC8vIExURSBSQVTQocf40MXPog0KICAgIHsNCiAgICAgICAgaWYoY2VsbF9pbmZvLnJ1bm5pbmcpIHsNCg0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIFdDRE1BDQogICAgLyoNCiAgICAvLyBNb2RlLCBzQ01lYXNQcmVzZW50LCBzQ1BhcmFtUHJlc2VudCwgdWVPcFN0YXR1c1ByZXNlbnQsDQoNCiAgICAvLyBpZiBzQ01lYXNQcmVzZW50ID09IDENCiAgICAvLyBjcGljaFJTQ1AsIHV0cmFSc3NpLCBjcGljaEVjTjAsIHNRdWFsLCBzUnhMZXYsIHR4UG93ZXIsDQogICAgLy8gZW5kaWYNCg0KICAgIC8vIGlmIHNDUGFyYW1QcmVzZW50ID09IDENCiAgICAvLyByYWMsIG5vbSwgbWNjLCBtbmNfbGVuLCBtbmMsIGxhYywgY2ksDQogICAgLy8gdXJhSWQsIHBzYywgYXJmY24sIHQzMjEyLCB0MzMxMiwgaGNzVXNlZCwgYXR0RGV0QWxsb3dlZCwNCiAgICAvLyBjc0RyeEN5Y2xlTGVuLCBwc0RyeEN5Y2xlTGVuLCB1dHJhbkRyeEN5Y2xlTGVuLCBIU0RQQVN1cHBvcnQsIEhTVVBBU3VwcG9ydCwNCiAgICAvLyBlbmRpZg0KDQogICAgLy8gaWYgdWVPcFN0YXR1c1ByZXNlbnQgPT0gMQ0KICAgIC8vIHJyY1N0YXRlLCBudW1MaW5rcywgc3JuY0lkLCBzUm50aSwNCiAgICAvLyBhbGdQcmVzZW50LCBjaXBoZXJBbGcsIGNpcGhlck9uLCBhbGdQcmVzZW50LCBjaXBoZXJBbGcsIGNpcGhlck9uLA0KICAgIC8vIEhTRFBBQWN0aXZlLCBIU1VQQUFjdGl2ZSwgTWNjTGFzdFJlZ2lzdGVyZWROZXR3b3JrLCBNbmNMYXN0UmVnaXN0ZXJlZE5ldHdvcmssIFRNU0ksIFBUTVNJLCBJc1NpbmdsZU1tUmVqZWN0Q2F1c2UsIElzU2luZ2xlR21tUmVqZWN0Q2F1c2UsDQogICAgLy8gTU1SZWplY3RDYXVzZSwgR01NUmVqZWN0Q2F1c2UsIG1tU3RhdGUsIGdtbVN0YXRlLCBncHJzUmVhZHlTdGF0ZSwgcmVhZHlUaW1lclZhbHVlSW5TZWNzLCBOdW1BY3RpdmVQRFBDb250ZXh0LCBVTFRocm91Z2hwdXQsIERMVGhyb3VnaHB1dCwNCiAgICAvLyBzZXJ2aWNlU3RhdHVzLCBwbW1TdGF0ZSwgTEFVX3N0YXR1cywgTEFVX2NvdW50LCBSQVVfc3RhdHVzLCBSQVVfY291bnQNCiAgICAvLyBlbmRpZg0KICAgIC8vDQogICAgK0VFTVVNVFNTVkM6IDMsIDEsIDEsIDEsDQogICAgLTgwLCAyNywgLTYsIC0xOCwgLTExNSwgLTMyNzY4LA0KICAgIDEsIDEsIDExMjAsIDIsIDEsIDYxNjk3LCAxNjg0MzI4MjEsDQogICAgMTUsIDI0LCAxMDc2MywgMCwgMCwgMCwgMCwNCiAgICAxMjgsIDEyOCwgNjU1MzUsIDAsIDAsDQogICAgMiwgMjU1LCA2NTUzNSwgNDI5NDk2NzI5NSwNCiAgICAwLCAwLCAwLCAwLCAwLCAwLA0KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsDQogICAgMjg2NzIsIDI4NjcyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KICAgIDAsIDAsIDAsIDAsIDAsIDANCiAgICAqLw0KICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0VFTVVNVFNTVkM6IikpIC8vIFdDRE1BIFNlcnZlciBDZWxsDQogICAgew0KICAgICAgICAvLyBsYWMsIGNpLCBhcmZjbg0KICAgICAgICBpZihjZWxsX2luZm8ucnVubmluZykgew0KICAgICAgICAgICAgaW50IHRtcF9pbnQ7DQogICAgICAgICAgICBpbnQgaSA9IDA7DQogICAgICAgICAgICBjaGFyKiB0bXBfcyA9IG1lbWR1cChzLHN0cmxlbihzKSk7DQogICAgICAgICAgICBjaGFyKiBmcmVlX3B0ciA9IHRtcF9zOw0KICAgICAgICAgICAgY2hhciAqbGluZSA9IHRtcF9zOw0KICAgICAgICAgICAgaWYgKGF0X3Rva19zdGFydCgmbGluZSkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNVU1UU1NWQ19FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gSnVtcCAxMiBpbnRlZ2VyLg0KICAgICAgICAgICAgaSA9IDA7DQogICAgICAgICAgICB3aGlsZShpIDwgMTIpIHsNCiAgICAgICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBnb3RvIEVFTVVNVFNTVkNfRVhJVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaSsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gbWNjDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1VTVRTU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlND0gKHVpbnQzMil0bXBfaW50Ow0KICAgICAgICAgICAgLy8gbW5jDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1VTVRTU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlNT0gKHVpbnQzMil0bXBfaW50Ow0KICAgICAgICAgICAgLy8gbGFjDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1VTVRTU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlMSA9ICh1aW50MzIpdG1wX2ludDsNCiAgICAgICAgICAgIC8vIGNpDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1VTVRTU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlMiA9ICh1aW50MzIpdG1wX2ludDsNCg0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNVU1UU1NWQ19FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gY3BpDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1VTVRTU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlNj0gKHVpbnQzMil0bXBfaW50Ow0KICAgICAgICAgICAgLyoNCiAgICAgICAgICAgIC8vIEp1bXAgMiBpbnRlZ2VyLg0KICAgICAgICAgICAgaSA9IDA7DQogICAgICAgICAgICB3aGlsZShpIDwgMikgew0KICAgICAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGdvdG8gRUVNVU1UU1NWQ19FWElUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAqLw0KICAgICAgICAgICAgLy8gYXJmY24NCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTVVNVFNTVkNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWUzID0gKHVpbnQzMil0bXBfaW50Ow0KDQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbF9udW0rKzsNCkVFTVVNVFNTVkNfRVhJVDoNCiAgICAgICAgICAgIGZyZWUoZnJlZV9wdHIpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8qDQogICAgLy8gaW5kZXgsIGNwaWNoUlNDUCwgdXRyYVJzc2ksIGNwaWNoRWNOMCwgc1F1YWwsIHNSeExldiAsbWNjLCBtbmMsIGxhYywgY2ksIGFyZmNuLCBwc2MNCiAgICArRUVNVU1UU0lOVFJBOiAwLCAtMzI3NjgsIC0xLCAtMzI3NjgsIC0xOCwgLTExNSwgMCwgMCwgNjU1MzQsIDEsIDEwNzYzLCAzMg0KICAgICovDQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrRUVNVU1UU0lOVFJBOiIpKSAvLyBXQ0RNQcHZvfzQocf4DQogICAgew0KICAgICAgICAvLyBsYWMsIGNpLCBhcmZjbg0KICAgICAgICBpZihjZWxsX2luZm8ucnVubmluZykgew0KICAgICAgICAgICAgaW50IHRtcF9pbnQ7DQogICAgICAgICAgICBpbnQgaSA9IDA7DQogICAgICAgICAgICBjaGFyKiB0bXBfcyA9IG1lbWR1cChzLHN0cmxlbihzKSk7DQogICAgICAgICAgICBjaGFyKiBmcmVlX3B0ciA9IHRtcF9zOw0KICAgICAgICAgICAgY2hhciAqbGluZSA9IHRtcF9zOw0KICAgICAgICAgICAgaWYgKGF0X3Rva19zdGFydCgmbGluZSkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNVU1UU0lOVFJBX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBKdW1wIDggaW50ZWdlci4NCiAgICAgICAgICAgIGkgPSAwOw0KICAgICAgICAgICAgd2hpbGUoaSA8IDgpIHsNCiAgICAgICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBnb3RvIEVFTVVNVFNJTlRSQV9FWElUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIGxhYw0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwIHx8IHRtcF9pbnQgPD0gMCB8fCB0bXBfaW50ID49IDY1NTM2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNVU1UU0lOVFJBX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlMSA9ICh1aW50MzIpdG1wX2ludDsNCg0KICAgICAgICAgICAgLy8gY2kNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCB8fCB0bXBfaW50IDw9IDAgfHwgdG1wX2ludCA+PSA2NTUzNikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTVVNVFNJTlRSQV9FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTIgPSAodWludDMyKXRtcF9pbnQ7DQoNCiAgICAgICAgICAgIC8vIGFyZmNuDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDAgfHwgdG1wX2ludCA8PSAwIHx8IHRtcF9pbnQgPj0gNjU1MzYpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1VTVRTSU5UUkFfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWUzID0gKHVpbnQzMil0bXBfaW50Ow0KDQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbF9udW0rKzsNCkVFTVVNVFNJTlRSQV9FWElUOg0KICAgICAgICAgICAgZnJlZShmcmVlX3B0cik7DQogICAgICAgIH0NCiAgICB9DQogICAgLyoNCiAgICAvLyBpbmRleCxnc21Sc3NpLHJ4TGV2LEMxLEMyLG1jYyxtbmMsbGFjLGNpLGFyZmNuLGJzaWMNCiAgICArRUVNVU1UU0lOVEVSUkFUOiAwLCAtMzI3NjgsIC0xMDcsIC0xLCAtMSwgMCwgMCwgNjU1MzQsIDAsIDExNywgMzYNCiAgICAqLw0KICAgIGVsc2UgaWYoc3RyU3RhcnRzV2l0aChzLCAiK0VFTVVNVFNJTlRFUlJBVDoiKSkgLy8gV0NETUEgUkFU0KHH+NDFz6INCiAgICB7DQogICAgICAgIC8vIGxhYywgY2ksIGFyZmNuDQogICAgICAgIGlmKGNlbGxfaW5mby5ydW5uaW5nKSB7DQogICAgICAgICAgICBpbnQgdG1wX2ludDsNCiAgICAgICAgICAgIGludCBpID0gMDsNCiAgICAgICAgICAgIGNoYXIqIHRtcF9zID0gbWVtZHVwKHMsc3RybGVuKHMpKTsNCiAgICAgICAgICAgIGNoYXIqIGZyZWVfcHRyID0gdG1wX3M7DQogICAgICAgICAgICBjaGFyICpsaW5lID0gdG1wX3M7DQogICAgICAgICAgICBpZiAoYXRfdG9rX3N0YXJ0KCZsaW5lKSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1VTVRTSU5URVJSQVRfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIEp1bXAgNyBpbnRlZ2VyLg0KICAgICAgICAgICAgaSA9IDA7DQogICAgICAgICAgICB3aGlsZShpIDwgNykgew0KICAgICAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGdvdG8gRUVNVU1UU0lOVEVSUkFUX0VYSVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gbGFjDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDAgfHwgdG1wX2ludCA8PSAwIHx8IHRtcF9pbnQgPj0gNjU1MzYpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1VTVRTSU5URVJSQVRfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWUxID0gKHVpbnQzMil0bXBfaW50Ow0KDQogICAgICAgICAgICAvLyBjaQ0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwIHx8IHRtcF9pbnQgPD0gMCB8fCB0bXBfaW50ID49IDY1NTM2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNVU1UU0lOVEVSUkFUX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlMiA9ICh1aW50MzIpdG1wX2ludDsNCg0KICAgICAgICAgICAgLy8gYXJmY24NCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCB8fCB0bXBfaW50IDw9IDAgfHwgdG1wX2ludCA+PSA2NTUzNikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTVVNVFNJTlRFUlJBVF9FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTMgPSAodWludDMyKXRtcF9pbnQ7DQoNCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsX251bSsrOw0KRUVNVU1UU0lOVEVSUkFUX0VYSVQ6DQogICAgICAgICAgICBmcmVlKGZyZWVfcHRyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvLyBHU00NCiAgICAvLyArRUVNR0lORk9CQVNJQzogMg0KICAgIC8vIERvIG5vdGhpbmcuDQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrRUVNR0lORk9CQVNJQzoiKSkgLy8gQmFzaWMgaW5mb3JtYXRpb24gaW4gR1NNDQogICAgICAgIC8vIDA6IE1FIGluIElkbGUgbW9kZSAgIDE6IE1FIGluIERlZGljYXRlZCBtb2RlICAgMjogTUUgaW4gUFMgUFRNIG1vZGUNCiAgICB7DQogICAgICAgIGlmKGNlbGxfaW5mby5ydW5uaW5nKSB7DQoNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvKg0KICAgIC8vIG1jYywgbW5jX2xlbiwgbW5jLCBsYWMsIGNpLCBub20sIG5jbywNCiAgICAvLyBic2ljLCBDMSwgQzIsIFRBLCBUeFB3ciwNCiAgICAvLyBSeFNpZywgUnhTaWdGdWxsLCBSeFNpZ1N1YiwgUnhRdWFsRnVsbCwgUnhRdWFsU3ViLA0KICAgIC8vIEFSRkNCX3RjaCwgaG9wcGluZ19jaG5sLCBjaG5sX3R5cGUsIFRTLCBQYWNrZXRJZGxlLCByYWMsIGFyZmNuLA0KICAgIC8vIGJzX3BhX21mcm1zLCBDMzEsIEMzMiwgdDMyMTIsIHQzMzEyLCBwYmNjaF9zdXBwb3J0LCBFREdFX3N1cHBvcnQsDQogICAgLy8gbmNjX3Blcm1pdHRlZCwgcmxfdGltZW91dCwgaG9fY291bnQsIGhvX3N1Y2MsIGNobmxfYWNjZXNzX2NvdW50LCBjaG5sX2FjY2Vzc19zdWNjX2NvdW50LA0KICAgIC8vIGdzbUJhbmQsY2hhbm5lbE1vZGUNCiAgICArRUVNR0lORk9TVkM6IDExMjAsIDIsIDAsIDMyNzg0LCAyNDc0MSwgMiwgMCwNCiAgICA2MywgMzYsIDE0NiwgMSwgNywNCiAgICA0NiwgNDIsIDQyLCA3LCAwLA0KICAgIDUzLCAwLCA4LCAwLCAxLCA2LCA1MywNCiAgICAyLCAwLCAxNDYsIDQyLCA1NCwgMCwgMSwNCiAgICAxLCAzMiwgMCwgMCwgMCwgMCwNCiAgICAwLCAwDQogICAgKi8NCiAgICBlbHNlIGlmKHN0clN0YXJ0c1dpdGgocywgIitFRU1HSU5GT1NWQzoiKSkgLy8gR1NNIFNlcnZlciBDZWxsDQogICAgew0KICAgICAgICAvLyBsYWMsIGNpLCBhcmZjbiwgYnNpYw0KICAgICAgICBMT0coIitFRU1HSU5GT1NWQzogMT0gJWRcbi4iLGNlbGxfaW5mby5ydW5uaW5nKTsNCiAgICAgICAgaWYoY2VsbF9pbmZvLnJ1bm5pbmcpIHsNCiAgICAgICAgICAgIGludCB0bXBfaW50Ow0KICAgICAgICAgICAgaW50IGkgPSAwOw0KICAgICAgICAgICAgY2hhciogdG1wX3MgPSBtZW1kdXAocyxzdHJsZW4ocykpOw0KICAgICAgICAgICAgY2hhciogZnJlZV9wdHIgPSB0bXBfczsNCiAgICAgICAgICAgIGNoYXIgKmxpbmUgPSB0bXBfczsNCiAgICAgICAgICAgIGlmIChhdF90b2tfc3RhcnQoJmxpbmUpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIG1jYw0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwIHx8IHRtcF9pbnQgPD0gMCB8fCB0bXBfaW50ID49IDY1NTM2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNR0lORk9TVkNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU1ID0gKHVpbnQzMil0bXBfaW50Ow0KDQogICAgICAgICAgICAvL21uY19sZW4NCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCB8fCB0bXBfaW50IDw9IDAgfHwgdG1wX2ludCA+PSA2NTUzNikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBtbmMNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCB8fCB0bXBfaW50IDwgMCB8fCB0bXBfaW50ID49IDY1NTM2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdvdG8gRUVNR0lORk9TVkNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU2ID0gKHVpbnQzMil0bXBfaW50Ow0KICAgICAgICAgICANCiAgICAgICAgICAgIC8vIGxhYw0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwIHx8IHRtcF9pbnQgPCAwIHx8IHRtcF9pbnQgPj0gNjU1MzYpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ290byBFRU1HSU5GT1NWQ19FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTEgPSAodWludDMyKXRtcF9pbnQ7DQoNCiAgICAgICAgICAgIC8vIGNpDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDAgfHwgdG1wX2ludCA8IDAgfHwgdG1wX2ludCA+PSA2NTUzNikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlMiA9ICh1aW50MzIpdG1wX2ludDsNCg0KICAgICAgICAgICAgLy8gSnVtcCAyIGludGVnZXIsIGdldCAzcmQgbnVtYmVyDQogICAgICAgICAgICBpID0gMDsNCiAgICAgICAgICAgIHdoaWxlKGkgPCAzKSB7DQogICAgICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZ290byBFRU1HSU5GT1NWQ19FWElUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIGJzaWMNCiAgICAgICAgICAgIGlmICggdG1wX2ludCA8IDAgfHwgdG1wX2ludCA+PSA2NTUzNikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlNCA9ICh1aW50MzIpdG1wX2ludDsNCg0KICAgICAgICAgICAgLy8gSnVtcCA0IGludGVnZXIsIGdldCA1cmQgbnVtYmVyDQogICAgICAgICAgICBpID0gMDsNCiAgICAgICAgICAgIHdoaWxlKGkgPCA1KSB7DQogICAgICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZ290byBFRU1HSU5GT1NWQ19FWElUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU3PXRtcF9pbnQ7IC8vcnhsZXYNCg0KICAgICAgICAgICAgLy8gSnVtcCAxMCBpbnRlZ2VyLCBnZXQgMTFyZCBudW1iZXINCiAgICAgICAgICAgIGkgPSAwOw0KICAgICAgICAgICAgd2hpbGUoaSA8IDExKSB7DQogICAgICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZ290byBFRU1HSU5GT1NWQ19FWElUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIGFyZmNuDQogICAgICAgICAgICBpZiAodG1wX2ludCA8IDAgfHwgdG1wX2ludCA+PSA2NTUzNikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPU1ZDX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZWxsX2luZm8uY2VsbFtjZWxsX2luZm8uY2VsbF9udW1dLnZhbHVlMyA9ICh1aW50MzIpdG1wX2ludDsNCg0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxfbnVtKys7DQpFRU1HSU5GT1NWQ19FWElUOg0KICAgICAgICAgICAgZnJlZShmcmVlX3B0cik7DQogICAgICAgIH0NCiAgICB9DQogICAgLyoNCiAgICAvLyBQU19hdHRhY2hlZCwgYXR0YWNoX3R5cGUsIHNlcnZpY2VfdHlwZSwgdHhfcG93ZXIsIGNfdmFsdWUsDQogICAgLy8gdWxfdHMsIGRsX3RzLCB1bF9jcywgZGxfY3MsIHVsX21vZHVsYXRpb24sIGRsX21vZHVsYXRpb24sDQogICAgLy8gZ21za19jdl9iZXAsIDhwc2tfY3ZfYmVwLCBnbXNrX21lYW5fYmVwLCA4cHNrX21lYW5fYmVwLCBFREdFX2JlcF9wZXJpb2QsIHNpbmdsZV9nbW1fcmVqX2NhdXNlDQogICAgLy8gcGRwX2FjdGl2ZV9udW0sIG1hY19tb2RlLCBuZXR3b3JrX2NvbnRyb2wsIG5ldHdvcmtfbW9kZSwgRURHRV9zbHFfbWVhc3VyZW1lbnRfbW9kZSwgZWRnZV9zdGF0dXMNCiAgICArRUVNR0lORk9QUzogMSwgMjU1LCAwLCAwLCAwLA0KICAgIDAsIDAsIDI2ODQzNTUwMSwgMSwgMCwgMCwNCiAgICA0LCAwLCA5NiwgMCwgMCwgMCwNCiAgICAwLCAwLCAwLCA2NTUzNSwgMCwgMTMzNTANCiAgICAqLw0KICAgIC8vIERvIG5vdGhpbmcuDQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrRUVNR0lORk9QUzoiKSkgLy8gUFPQxc+iDQogICAgew0KICAgICAgICBpZihjZWxsX2luZm8ucnVubmluZykgew0KDQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrRUVNR0lORk9OQzoiKSkgLy8gY2VsbA0KICAgIHsNCiAgICAgICAgaWYoY2VsbF9pbmZvLnJ1bm5pbmcpIHsNCiAgICAgICAgICAgIGludCB0bXBfaW50Ow0KICAgICAgICAgICAgaW50IGkgPSAwOw0KICAgICAgICAgICAgY2hhciogdG1wX3MgPSBtZW1kdXAocyxzdHJsZW4ocykpOw0KICAgICAgICAgICAgY2hhciogZnJlZV9wdHIgPSB0bXBfczsNCiAgICAgICAgICAgIGNoYXIgKmxpbmUgPSB0bXBfczsNCiAgICAgICAgICAgIGlmIChhdF90b2tfc3RhcnQoJmxpbmUpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPUFNfRVhJVDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gbmNfbnVtDQogICAgICAgICAgICBpZiAoYXRfdG9rX25leHRpbnQoJmxpbmUsICZ0bXBfaW50KSA8IDAgfHwgdG1wX2ludCA8IDAgfHwgdG1wX2ludCA+PSA2NTUzNikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBMT0coImNlbGxfaW5mby5ydW5uaW5nIDE9ICVkXG4uIixjZWxsX2luZm8ucnVubmluZyk7DQogICAgICAgICAgICAgICAgZ290byBFRU1HSU5GT1BTX0VYSVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBtY2MNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCB8fCB0bXBfaW50IDwgMCB8fCB0bXBfaW50ID49IDY1NTM2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIExPRygiY2VsbF9pbmZvLnJ1bm5pbmcgMj0gJWRcbi4iLGNlbGxfaW5mby5ydW5uaW5nKTsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPUFNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU1ID0gKHVpbnQzMil0bXBfaW50Ow0KDQogICAgICAgICAgICAvLyBtbmMNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCB8fCB0bXBfaW50IDwgMCB8fCB0bXBfaW50ID49IDY1NTM2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIExPRygiY2VsbF9pbmZvLnJ1bm5pbmcgMz0gJWRcbi4iLGNlbGxfaW5mby5ydW5uaW5nKTsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPUFNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWU2ID0gKHVpbnQzMil0bXBfaW50Ow0KDQogICAgICAgICAgICAvLyBsYWMNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCB8fCB0bXBfaW50IDwgMCB8fCB0bXBfaW50ID49IDY1NTM2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIExPRygiY2VsbF9pbmZvLnJ1bm5pbmcgND0gJWRcbi4iLGNlbGxfaW5mby5ydW5uaW5nKTsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPUFNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWUxID0gKHVpbnQzMil0bXBfaW50Ow0KDQogICAgICAgICAgICAvLyByYWMNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCB8fCB0bXBfaW50IDwgMCB8fCB0bXBfaW50ID49IDY1NTM2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIExPRygiY2VsbF9pbmZvLnJ1bm5pbmcgNT0gJWRcbi4iLGNlbGxfaW5mby5ydW5uaW5nKTsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPUFNfRVhJVDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gY2kNCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCB8fCB0bXBfaW50IDwgMCB8fCB0bXBfaW50ID49IDY1NTM2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIExPRygiY2VsbF9pbmZvLnJ1bm5pbmcgNj0gJWRcbi4iLGNlbGxfaW5mby5ydW5uaW5nKTsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPUFNfRVhJVDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsW2NlbGxfaW5mby5jZWxsX251bV0udmFsdWUyID0gKHVpbnQzMil0bXBfaW50Ow0KDQogICAgICAgICAgICAvLyByeF9sdg0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIExPRygiY2VsbF9pbmZvLnJ1bm5pbmcgNz0gJWRcbi4iLGNlbGxfaW5mby5ydW5uaW5nKTsNCiAgICAgICAgICAgICAgICBnb3RvIEVFTUdJTkZPUFNfRVhJVDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gYnNpYw0KICAgICAgICAgICAgaWYgKGF0X3Rva19uZXh0aW50KCZsaW5lLCAmdG1wX2ludCkgPCAwIHx8IHRtcF9pbnQgPCAwIHx8IHRtcF9pbnQgPj0gNjU1MzYpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgTE9HKCJjZWxsX2luZm8ucnVubmluZyA4PSAlZFxuLiIsY2VsbF9pbmZvLnJ1bm5pbmcpOw0KICAgICAgICAgICAgICAgIGdvdG8gRUVNR0lORk9QU19FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTQgPSAodWludDMyKXRtcF9pbnQ7DQoNCiAgICAgICAgICAgIC8vIEp1bXAgMiBpbnRlZ2VyLg0KICAgICAgICAgICAgaSA9IDA7DQogICAgICAgICAgICB3aGlsZShpIDwgMikgew0KICAgICAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIExPRygiY2VsbF9pbmZvLnJ1bm5pbmcgOT0gJWRcbi4iLGNlbGxfaW5mby5ydW5uaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgZ290byBFRU1HSU5GT1BTX0VYSVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gYXJmY24NCiAgICAgICAgICAgIGlmIChhdF90b2tfbmV4dGludCgmbGluZSwgJnRtcF9pbnQpIDwgMCB8fCB0bXBfaW50IDwgMCB8fCB0bXBfaW50ID49IDY1NTM2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIExPRygiY2VsbF9pbmZvLnJ1bm5pbmcgMTAgPSAlZFxuLiIsY2VsbF9pbmZvLnJ1bm5pbmcpOw0KICAgICAgICAgICAgICAgIGdvdG8gRUVNR0lORk9QU19FWElUOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2VsbF9pbmZvLmNlbGxbY2VsbF9pbmZvLmNlbGxfbnVtXS52YWx1ZTMgPSAodWludDMyKXRtcF9pbnQ7DQoNCiAgICAgICAgICAgIGNlbGxfaW5mby5jZWxsX251bSsrOw0KRUVNR0lORk9QU19FWElUOg0KICAgICAgICAgICAgZnJlZShmcmVlX3B0cik7DQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZSBpZihzdHJTdGFydHNXaXRoKHMsICIrWkdJUEROUzoiKSkgLy8gK1pHSVBETlM6IDEsIklQVjRWNiIsIjEwLjE1Ni4yMzkuMjQ1IiwiMTAuMTU2LjIzOS4yNDYiLCIyMjMuODcuMjUzLjEwMCIsIjIyMy44Ny4yNTMuMjUzIiwiZmU4MDowMDAwOjAwMDA6MDAwMDowMDAxOjAwMDE6OWI4Yzo3YzBjIiwiZmU4MDo6MToxOjliOGM6N2MwZCIsIjI0MDk6ODA2MjoyMDAwOjI6OjEiLCIyNDA5OjgwNjI6MjAwMDoyOjoyIg0KICAgIHsNCg0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBMT0dWKCJVbmtub3duIFVSQyA6ICVzIiwgcyk7DQogICAgfQ0KfQ0KDQpzdGF0aWMgaW50IG9wZW5Tb2NrZXQoY29uc3QgY2hhciogc29ja25hbWUpDQp7DQogICAgaW50IHNvY2sgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApOw0KICAgIGlmIChzb2NrIDwgMCkNCiAgICB7DQogICAgICAgIExPR0UoIkVycm9yIGNyZWF0ZSBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOw0KICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsNCiAgICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOw0KICAgIHN0cm5jcHkoYWRkci5zdW5fcGF0aCwgc29ja25hbWUsIHNpemVvZihhZGRyLnN1bl9wYXRoKSk7DQogICAgd2hpbGUgKFRFTVBfRkFJTFVSRV9SRVRSWShjb25uZWN0KHNvY2ssKGNvbnN0IHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSkpICE9IDApDQogICAgew0KICAgICAgICBMT0dFKCJFcnJvciBjb25uZWN0IHRvIHNvY2tldCAlczogJXMsIHRyeSBhZ2FpbiIsIHNvY2tuYW1lLCBzdHJlcnJvcihlcnJubykpOw0KICAgICAgICBzbGVlcCgxKTsNCiAgICB9DQoNCiNpZiAwDQogICAgaW50IHNrX2ZsYWdzID0gZmNudGwoc29jaywgRl9HRVRGTCwgMCk7DQogICAgZmNudGwoc29jaywgRl9TRVRGTCwgc2tfZmxhZ3MgfCBPX05PTkJMT0NLKTsNCiNlbmRpZg0KDQogICAgcmV0dXJuIHNvY2s7DQp9DQoNCiNpZiAwDQpzdGF0aWMgdm9pZCByaWxfZ2V0X2NncGFkZHJfaXBfcHJvY2VzcygpDQp7DQogICAgaW50IGVyciwgc2tpcDsNCiAgICBBVFJlc3BvbnNlICpwX3Jlc3BvbnNlID0gTlVMTDsNCiAgICBjaGFyICpsaW5lOw0KICAgIGNoYXIgKmlwdjQgPSBOVUxMLCAqaXB2NiA9IE5VTEw7DQogICAgZXJyID0gYXRfc2VuZF9jb21tYW5kX3NpbmdsZWxpbmUoIkFUK0NHUEFERFIiLCAiK0NHUEFERFI6IiwgJnBfcmVzcG9uc2UpOw0KICAgIGlmICgoZXJyIDwgMCkgfHwgKHBfcmVzcG9uc2UgPT0gTlVMTCkgfHwgKHBfcmVzcG9uc2UtPnN1Y2Nlc3MgPT0gMCkpDQogICAgew0KICAgICAgICBMT0dFKCIrQ0dQQUREUiBleGVjIGVycm9yLiIpOw0KICAgICAgICBnb3RvIGVycm9yOw0KICAgIH0NCg0KICAgIC8vICtDR1BBRERSOiAxLCAiMTAuNTEuNTkuMjI5IiwgIjI1NC4xMjguMC4wLjAuMC4wLjAuMC4xLjAuMC4xMTEuMTc2LjYzLjk5Ig0KICAgIC8vICtDR1BBRERSOiAxLCAiMTAuMTI0LjEzOS4xMzEiDQogICAgbGluZSA9IHBfcmVzcG9uc2UtPnBfaW50ZXJtZWRpYXRlcy0+bGluZTsNCiAgICBlcnIgPSBhdF90b2tfc3RhcnQoJmxpbmUpOw0KICAgIGlmIChlcnIgPCAwKQ0KICAgIHsNCiAgICAgICAgZ290byBlcnJvcjsNCiAgICB9DQoNCiAgICBlcnIgPSBhdF90b2tfbmV4dGludCgmbGluZSwgJnNraXApOw0KICAgIGlmIChlcnIgPCAwKQ0KICAgIHsNCiAgICAgICAgZ290byBlcnJvcjsNCiAgICB9DQoNCiAgICBpZiAoIWF0X3Rva19oYXNtb3JlKCZsaW5lKSkNCiAgICB7DQogICAgICAgIGdvdG8gZXJyb3I7DQogICAgfQ0KDQogICAgZXJyID0gYXRfdG9rX25leHRzdHIoJmxpbmUsICZpcHY0KTsNCiAgICBpZiAoZXJyIDwgMCkNCiAgICB7DQogICAgICAgIExPR0UoIkdldCBJUHY0IGZhaWwuIik7DQogICAgICAgIGdvdG8gZXJyb3I7DQogICAgfQ0KDQogICAgaWYgKGF0X3Rva19oYXNtb3JlKCZsaW5lKSkNCiAgICB7DQogICAgICAgIGVyciA9IGF0X3Rva19uZXh0c3RyKCZsaW5lLCAmaXB2Nik7DQogICAgICAgIGlmIChlcnIgPCAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBMT0dFKCJHZXQgSVB2NiBmYWlsLiIpOw0KICAgICAgICAgICAgZ290byBlcnJvcjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBMT0dEKCJObyBJUHY2IEZvdW5kLiIpOw0KICAgIH0NCg0KICAgIGlmKGlwdjYpDQogICAgew0KICAgICAgICBMT0dEKCJJUHY2IDogJXMiLCBpcHY2KTsNCiAgICB9DQoNCiAgICBpZihpcHY0KQ0KICAgIHsNCiAgICAgICAgTE9HRCgiSVB2NCA6ICVzIiwgaXB2NCk7DQoNCi8vICAgICAgICByaWxfbmV0X2Rldl9jb25maWcoImNjaW5ldDAiLCBpcHY0LCBOVUxMKTsNCiAgICB9DQplcnJvcjoNCiAgICBhdF9yZXNwb25zZV9mcmVlKHBfcmVzcG9uc2UpOw0KfQ0KI2VuZGlmDQoNCnN0YXRpYyB2b2lkIHNpbV9zdGF0ZV9jaGFuZ2UoYm9vbCBwbHVnX2luKSB7DQogICAgaWYocGx1Z19pbikgew0KICAgICAgICAvLyBJZiByYWRpbyBvbixtdXN0IG9mZiBpbiB0aGUgZmlyc3QuDQogICAgICAgIGlmKG5ldF9pbmZvLnJhZGlvX3N0YXRlID09IE1CVEtfUkFESU9fU1RBVEVfT04pIHsNCiAgICAgICAgICAgIHNldFJhZGlvUG93ZXIoMCk7DQogICAgICAgIH0NCiAgICAgICAgc2V0UmFkaW9Qb3dlcigxKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBzZXRSYWRpb1Bvd2VyKDApOw0KICAgIH0NCn0NCg0Kc3RhdGljIGludCBvcGVuX3VldmVudF9zb2NrZXQoKQ0Kew0KICAgIHN0cnVjdCBzb2NrYWRkcl9ubCBhZGRyOw0KICAgIGludCBzeiA9IDY0KjEwMjQ7DQogICAgaW50IHMgPSAwOw0KDQogICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOw0KICAgIGFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsNCiAgICBhZGRyLm5sX3BpZCA9IGdldHBpZCgpOw0KICAgIGFkZHIubmxfZ3JvdXBzID0gMHhmZmZmZmZmZjsNCg0KICAgIHMgPSBzb2NrZXQoUEZfTkVUTElOSywgU09DS19ER1JBTSwgTkVUTElOS19LT0JKRUNUX1VFVkVOVCk7DQogICAgaWYgKHMgPCAwKQ0KICAgIHsNCiAgICAgICAgTE9HRSgic29ja2V0KCkgZmFpbC5bJWRdIiwgZXJybm8pOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SQ1ZCVUZGT1JDRSwgJnN6LCBzaXplb2Yoc3opKTsNCg0KICAgIGlmIChiaW5kKHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKQ0KICAgIHsNCiAgICAgICAgY2xvc2Uocyk7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICByZXR1cm4gczsNCn0NCg0Kc3RhdGljIHZvaWQgcGFyc2VfdWV2ZW50KGNvbnN0IGNoYXIgKm1zZywgaW50IG1zZ19sZW4sIHN0cnVjdCBjb29saW5nX2RldmljZSAqY2RldikNCnsNCiAgICAvLyBjaGFuZ2VAL2RldmljZXMvdmlydHVhbC91c2ltX2V2ZW50L3VzaW0wXDANCiAgICAvLyBBQ1RJT049Y2hhbmdlXDANCiAgICAvLyBERVZQQVRIPS9kZXZpY2VzL3ZpcnR1YWwvdXNpbV9ldmVudC91c2ltMFwwDQogICAgLy8gU1VCU1lTVEVNPXVzaW1fZXZlbnRcMA0KICAgIC8vIFVTSU1fTkFNRT11c2ltMFwwDQogICAgLy8gVVNJTV9FVkVOVD1wbHVnb3V0XDANCiAgICAvLyBTRVFOVU09NzA0DQogICAgaW50IGkgPSAwOw0KICAgIHdoaWxlIChpIDwgbXNnX2xlbikNCiAgICB7DQogICAgICAgIGlmKCoobXNnICsgaSkgPT0gJ1wwJykNCiAgICAgICAgew0KICAgICAgICAgICAgaSsrOw0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFzdHJuY21wKG1zZyArIGksICJVU0lNX05BTUU9IiwgMTApKQ0KICAgICAgICB7DQogICAgICAgICAgICBpICs9IDEwOw0KICAgICAgICAgICAgY2Rldi0+bmFtZSA9IG1zZyArIGk7DQogICAgICAgICAgICBpICs9IHN0cmxlbihtc2cgKyBpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmICghc3RybmNtcChtc2cgKyBpLCAiQUNUSU9OPSIsIDcpKQ0KICAgICAgICB7DQogICAgICAgICAgICBpICs9IDc7DQogICAgICAgICAgICBjZGV2LT5hY3Rpb24gPSBtc2cgKyBpOw0KICAgICAgICAgICAgaSArPSBzdHJsZW4obXNnICsgaSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAobXNnICsgaSwgIkRFVlBBVEg9IiwgOCkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGkgKz0gODsNCiAgICAgICAgICAgIGNkZXYtPnBhdGggPSBtc2cgKyBpOw0KICAgICAgICAgICAgaSArPSBzdHJsZW4obXNnICsgaSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAobXNnICsgaSwgIlVTSU1fRVZFTlQ9IiwgMTEpKQ0KICAgICAgICB7DQogICAgICAgICAgICBpICs9IDExOw0KICAgICAgICAgICAgY2Rldi0+ZXZlbnQgPSBtc2cgKyBpOw0KICAgICAgICAgICAgaSArPSBzdHJsZW4obXNnICsgaSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAobXNnICsgaSwgIlNVQlNZU1RFTT0iLCAxMCkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGkgKz0gMTA7DQogICAgICAgICAgICBjZGV2LT5zdWJzeXN0ZW0gPSBtc2cgKyBpOw0KICAgICAgICAgICAgaSArPSBzdHJsZW4obXNnICsgaSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBpKys7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZighc3RybmNtcChjZGV2LT5wYXRoLCBVRVZFTlRfVVNJTV9ERVYsIHNpemVvZihVRVZFTlRfVVNJTV9ERVYpKQ0KICAgICAgICYmICFzdHJuY21wKGNkZXYtPmFjdGlvbiwgImNoYW5nZSIsIDUpKQ0KICAgIHsNCiAgICAgICAgTE9HRCgiZXZlbnQgeyBuYW1lPSVzLCBhY3Rpb249JXMsIHBhdGg9JXMsIHN1YnN5c3RlbT0lcywgZXZlbnQ9JXN9IiwNCiAgICAgICAgICAgICBjZGV2LT5uYW1lLCAgICBjZGV2LT5hY3Rpb24sIGNkZXYtPnBhdGgsIGNkZXYtPnN1YnN5c3RlbSwgY2Rldi0+ZXZlbnQpOw0KICAgICAgICBpZighc3RyY21wKGNkZXYtPmV2ZW50LCAicGx1Z291dCIpKQ0KICAgICAgICB7DQogICAgICAgICAgICBzaW1fc3RhdGVfY2hhbmdlKEZBTFNFKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKCFzdHJjbXAoY2Rldi0+ZXZlbnQsICJwbHVnaW4iKSkNCiAgICAgICAgew0KICAgICAgICAgICAgc2ltX3N0YXRlX2NoYW5nZShUUlVFKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIExPR0UoInVzaW0gZXZuZXQgZXJyb3IhIik7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCnN0YXRpYyB2b2lkKiB1ZXZuZXRfcnVuKHZvaWQgKnBheWxvYWQpDQp7DQogICAgaW50IHNvY2tldF9mZCA9IC0xOw0KICAgIGNoYXIgbXNnW0JVRkZFUl9TSVpFKzJdOw0KICAgIGludCBuOw0KDQogICAgc29ja2V0X2ZkID0gb3Blbl91ZXZlbnRfc29ja2V0KCk7DQogICAgaWYoc29ja2V0X2ZkID4gMCkNCiAgICB7DQogICAgICAgIHdoaWxlKDEpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKChuID0gcmVjdihzb2NrZXRfZmQsIG1zZywgQlVGRkVSX1NJWkUsIDApKSA+IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc3RydWN0IGNvb2xpbmdfZGV2aWNlIGNkZXY7DQogICAgICAgICAgICAgICAgbWVtc2V0KCZjZGV2LCAweDAsIHNpemVvZihjZGV2KSk7DQoNCiAgICAgICAgICAgICAgICBpZihuID09IEJVRkZFUl9TSVpFKQ0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICBtc2dbbl0gPSAnXDAnOw0KICAgICAgICAgICAgICAgIC8vIGNoYW5nZUAvZGV2aWNlcy92aXJ0dWFsL3VzaW1fZXZlbnQvdXNpbTBcMEFDVElPTj1jaGFuZ2VcMERFVlBBVEg9L2RldmljZXMvdmlydHVhbC91c2ltX2V2ZW50L3VzaW0wXDBTVUJTWVNURU09dXNpbV9ldmVudFwwVVNJTV9OQU1FPXVzaW0wXDBVU0lNX0VWRU5UPXBsdWdvdXRcMFNFUU5VTT03MDQNCiAgICAgICAgICAgICAgICBsb2dfaGV4KCJVRVZFTlQiLCBtc2csIG4pOw0KICAgICAgICAgICAgICAgIHBhcnNlX3VldmVudChtc2csIG4sICZjZGV2KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBMT0dFKCJyZWN2IG1zZyBlcnJvci4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIExPR0QoIlVFVkVOVCBUaHJlYWQgZXhpdCEhISIpOw0KICAgIHJldHVybiBOVUxMOw0KfQ0KDQppbnQgdWV2ZW50X21haW4oKQ0Kew0KICAgIG1idGtfdGFza19pbmZvIHRhc2s7DQogICAgdGFzay50YXNrX2lkID0gJnVldm5ldF90YXNrX2lkOw0KICAgIHRhc2sudGhyZWFkX3J1biA9IHVldm5ldF9ydW47DQogICAgdGFzay5hcmdzID0gTlVMTDsNCiAgICByZXR1cm4gbWJ0a190YXNrX3N0YXJ0KCZ0YXNrKTsNCn0NCg0KLyoNCmludCByaWxfbWFpbigpDQp7DQogICAgcmV0dXJuIG1idGtfdGFza19xdWV1ZV9zdGFydCgmcmlsX3Rhc2ssIHJpbF9tYWluX3J1bik7DQp9DQoqLw0KDQppbnQgbWJ0a19pbmZvX3NlcnZlcl9zdGFydCgpOw0KaW50IEluUHJvZHVjdGlvbl9Nb2RlKHZvaWQpOw0Kdm9pZCBzZXJ2ZXJfcmVhZHlfc2V0KHZvaWQpOw0KDQojaWYgMA0KCi8qCiAqR2V0IG10ZGJsb2NrIHdoaWNoIG5hbWUgaXMgQVNSX0ZMQUcKICpyZXR1cm4gcGF0aCBpZiBmb3VuZCwgZWxzZSByZXR1cm4gTlVMTAogKi8Kc3RhdGljIGludCBhc3JGbGFnUGF0aEdldChjaGFyICphc3JfZmxhZ19wYXRoKQ0KewoJY2hhciBidWZbMTI4XTsNCgl1bnNpZ25lZCBjaGFyIGZpbmQgPSAwOw0KCUZJTEUgKmZkID0gZm9wZW4oIi9wcm9jL210ZCIsICJyIik7DQoJaWYgKGZkID09IE5VTEwpIHsNCgkJTE9HRSgiT3BlbiBNVEQgZmFpbGVkISIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KCgltZW1zZXQoYnVmLCAnXDAnLCAxMjgpOw0KCXdoaWxlIChmZ2V0cyhidWYsIDEyOCwgZmQpICE9IE5VTEwpIHsNCgkJaWYoc3Ryc3RyKGJ1ZiwgImFzcl9mbGFnIikpIHsNCgkJCWNoYXIgKnAgPSBzdHJzdHIoYnVmLCAibXRkIik7DQoJCQlpZihwKQ0KCQkJew0KCQkJCWludCBibG47DQoJCQkJc3NjYW5mKHAsICJtdGQlZCIsICZibG4pOw0KCQkJCXNwcmludGYoYXNyX2ZsYWdfcGF0aCwgIi9kZXYvbXRkYmxvY2slZCIsIGJsbik7DQoJCQkJZmluZCA9IDE7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCX0NCgkJbWVtc2V0KGJ1ZiwgJ1wwJywgMTI4KTsNCgl9DQoKCWZjbG9zZShmZCk7DQoJcmV0dXJuICgoZmluZCA9PSAxKSA/IDAgOiAtMSk7DQp9Cg0Kc3RhdGljIGludCByZWFkRnJvbU1URChjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2b2lkICpidWYsIGludCBzaXplKQ0KewoJaW50IHJldCwgZmQ7DQoJaWYgKCFwYXRoKQ0KCQlyZXR1cm4gLTE7DQoKCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7DQoJaWYgKGZkIDwgMCkgew0KCQlMT0dFKCJyZWFkRnJvbU1URCBvcGVuIGVycm9yLCVkIiwgZXJybm8pOw0KCQlyZXR1cm4gLTE7DQoJfQ0KCglyZXQgPSBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7DQoJaWYgKHJldCA8IDApIHsNCgkJY2xvc2UoZmQpOw0KCQlMT0dFKCJyZWFkRnJvbU1URCBsc2VlayBlcnJvciwlZCIsIGVycm5vKTsNCgkJcmV0dXJuIC0xOw0KCX0NCglyZXQgPSByZWFkKGZkLCBidWYsIHNpemUpOw0KCWlmIChyZXQgPCAwKSB7DQoJCWNsb3NlKGZkKTsNCgkJTE9HRSgicmVhZEZyb21NVEQgcmVhZCBlcnJvciwlZCIsIGVycm5vKTsNCgkJcmV0dXJuIC0xOw0KCX0NCgljbG9zZShmZCk7DQoJcmV0dXJuIDA7DQp9CgpzdGF0aWMgaW50IHdyaXRlVG9NVEQoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgaW50IG9mZnNldCwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkNCnsKCWludCByZXQsIGZkOw0KCglpZiAoIXBhdGgpDQoJCXJldHVybiAtMTsNCgoJZmQgPSBvcGVuKHBhdGgsIE9fUkRXUiB8IE9fU1lOQyk7DQoJaWYgKGZkIDwgMCkNCgkJcmV0dXJuIC0xOw0KCglyZXQgPSBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7DQoJaWYgKHJldCA8IDApIHsNCgkJY2xvc2UoZmQpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KCXJldCA9IHdyaXRlKGZkLCBidWYsIHNpemUpOw0KCWlmIChyZXQgPCAwKSB7DQoJCUxPR0UoIndyaXRldG9tdGQ6d3JpdGUgZXJyb3I6JWQiLCBlcnJubyk7DQoJCWNsb3NlKGZkKTsNCgkJcmV0dXJuIC0xOw0KCX0NCgoJY2xvc2UoZmQpOw0KCXJldHVybiAwOw0KfQ0KI2VuZGlmDQpzdGF0aWMgdm9pZCBmb3RhX3Jlc3VsdF9jaGVjaygpDQp7DQojaWYgMA0KICAgIEFTUl9mbGFnIHRhZzsNCiAgICBjaGFyIGFzcl9mbGFnX3BhdGhbMzBdID0gezB9Ow0KICAgIGlmKGFzckZsYWdQYXRoR2V0KGFzcl9mbGFnX3BhdGgpKSB7DQogICAgICAgIExPR0UoImdldEFzckZsYWdQYXRoKCkgZmFpbC4iKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmKHJlYWRGcm9tTVREKGFzcl9mbGFnX3BhdGgsIEFTUl9GTEFHX09GRlNFVCwgJnRhZywgc2l6ZW9mKHRhZykpIDwgMCkNCiAgICB7DQogICAgICAgIExPR0UoIkdldCBGT1RBIHJlc3VsdCBmYWlsLiIpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBMT0dEKCJGT1RBIHJlc3VsdCA6ICVkLCAlZCIsIHRhZy5mb3RhX3Jlc3VsdFswXSwgdGFnLmZvdGFfcmVzdWx0WzFdKTsNCiAgICAgICAgdGFnLmZvdGFfcmVzdWx0WzBdID0gMDsNCiAgICAgICAgdGFnLmZvdGFfcmVzdWx0WzFdID0gMDsNCiAgICAgICAgaWYod3JpdGVUb01URChhc3JfZmxhZ19wYXRoLCBBU1JfRkxBR19PRkZTRVQsICZ0YWcsIHNpemVvZih0YWcpKSA8IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIExPR0UoIkZPVEEgcmVzdWx0IHVwZGF0ZSBmYWlsLiIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgTE9HRCgiRk9UQSByZXN1bHQgdXBkYXRlIHN1Y2Nlc3MuIik7DQogICAgICAgIH0NCiAgICB9DQojZW5kaWYNCn0NCg0Kc3RhdGljIHZvaWQgbWJ0a19yaWxfcmVhZHkoKQ0Kew0KICAgIC8vIC9ldGMvaW5pdC5kL21idGtfYm9vdF9zZXJ2ZXJfcmVhZHkNCiAgICBpZihpc19maXJzdF9ib290KSB7DQogICAgICAgIGlmKGFjY2VzcyhNQlRLX0JPT1RfU0VSVkVSX1JFQURZICwgWF9PSykgPT0gMCkgew0KICAgICAgICAgICAgTE9HRCgiRXhlYyA6ICVzIiwgTUJUS19CT09UX1NFUlZFUl9SRUFEWSk7DQogICAgICAgICAgICBtYnRrX3N5c3RlbShNQlRLX0JPT1RfU0VSVkVSX1JFQURZKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIExPR0UoIiVzIGNhbiBub3QgZXhlYy4iLCBNQlRLX0JPT1RfU0VSVkVSX1JFQURZKTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIExPR0QoIk5vIGV4ZWMgOiAlcyIsIE1CVEtfQk9PVF9TRVJWRVJfUkVBRFkpOw0KICAgIH0NCn0NCg0KI2lmIDENCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogICAgbWJ0a19sb2dfaW5pdCgicmFkaW8iLCAiTUJUS19SSUwiKTsNCg0KICAgIE1CVEtfU09VUkNFX0lORk9fUFJJTlQoIm1idGtfcmlsZCIpOw0KDQojaWZkZWYgTUJUS19EVU1QX1NVUFBPUlQNCiAgICBtYnRrX2RlYnVnX29wZW4oTlVMTCwgVFJVRSk7DQojZW5kaWYNCg0KLy8gVXNpbmcgS2lsbGFsbCx0aGUgZmlsZSBsb2NrIG1heSBiZSBub3QgcmVsZWFzZS4NCiNpZiAwDQogICAgaWYoYXBwX2FscmVhZHlfcnVubmluZyhNQlRLX1JJTERfUElEX0ZJTEUpKSB7DQogICAgICAgIExPR1coImRhZW1vbiBhbHJlYWR5IHJ1bm5pbmcuIik7DQogICAgICAgIGV4aXQoMSk7DQogICAgfQ0KI2VuZGlmDQoNCiAgICBMT0dJKCJtYnRrX3JpbCBzdGFydC4iKTsNCg0KICAgIGludCBmZCA9IG9wZW4oTUJUS19SSUxEX1RFTVBfRklMRSwgT19DUkVBVCB8IE9fUkRXUiwgMDY0NCk7DQogICAgaWYoZmQgPiAwKSB7DQogICAgICAgIGNoYXIgYnVmZlsxMDBdID0gezB9Ow0KICAgICAgICBpbnQgY291bnQgPSAwOw0KICAgICAgICBpZihyZWFkKGZkLCBidWZmLCBzaXplb2YoYnVmZikpID4gMCkgew0KICAgICAgICAgICAgY291bnQgPSBhdG9pKGJ1ZmYpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgY291bnQgPSAwOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYoY291bnQgPD0gMCkgew0KICAgICAgICAgICAgaXNfZmlyc3RfYm9vdCA9IFRSVUU7DQogICAgICAgICAgICBjb3VudCA9IDA7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpc19maXJzdF9ib290ID0gRkFMU0U7DQogICAgICAgIH0NCg0KICAgICAgICBjb3VudCsrOw0KICAgICAgICBtZW1zZXQoYnVmZiwgMCwgc2l6ZW9mKGJ1ZmYpKTsNCiAgICAgICAgc25wcmludGYoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCAiJWQiLCBjb3VudCk7DQogICAgICAgIG1idGtfd3JpdGUoZmQsIGJ1ZmYsIHN0cmxlbihidWZmKSk7DQogICAgICAgIGNsb3NlKGZkKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBpc19maXJzdF9ib290ID0gRkFMU0U7DQogICAgICAgIExPR0UoIk9wZW4gJXMgZmFpbDolZCIsIE1CVEtfUklMRF9URU1QX0ZJTEUsIGVycm5vKTsNCiAgICAgICAgTE9HVygiV2lsbCBub3QgZXhlYyAlcyBhbmQgJXMuIiwgTUJUS19CT09UX1NFUlZFUl9SRUFEWSwgTUJUS19CT09UX05FVF9SRUFEWSk7DQogICAgfQ0KDQogICAgaWYoSW5Qcm9kdWN0aW9uX01vZGUoKSkgew0KICAgICAgICBMT0dJKCJJcyBQcm9kdWN0aW9uIE1vZGUsIHdpbGwgZXhpdC4uLiIpOw0KICAgICAgICBleGl0KDApOw0KICAgIH0NCg0KICAgIGludCBhdF9zb2NrID0gb3BlblNvY2tldCgiL3RtcC9hdGNtZF9hdCIpOw0KICAgIGlmKGF0X3NvY2sgPCAwKQ0KICAgIHsNCiAgICAgICAgTE9HRSgiT3BlbiBBVCBTb2NrZXQgRmFpbFslZF0uIiwgZXJybm8pOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KICAgIGludCB1YXJ0X3NvY2sgPSBvcGVuU29ja2V0KCIvdG1wL2F0Y21kX3VyYyIpOw0KICAgIGlmKHVhcnRfc29jayA8IDApDQogICAgew0KICAgICAgICBMT0dFKCJPcGVuIFVhcnQgU29ja2V0IEZhaWxbJWRdLiIsIGVycm5vKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIGF0X3NldF9vbl9yZWFkZXJfY2xvc2VkKG9uQVRSZWFkZXJDbG9zZWQpOw0KICAgIGF0X3NldF9vbl90aW1lb3V0KG9uQVRUaW1lb3V0KTsNCg0KICAgIGlmKGF0X29wZW4oYXRfc29jaywgdWFydF9zb2NrLCBvblVuc29saWNpdGVkKSkNCiAgICB7DQogICAgICAgIExPR0UoIlN0YXJ0IEFUIHRocmVhZCBmYWlsLiIpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQojaWYgMQ0KICAgIGlmKGF0X2hhbmRzaGFrZSgpKQ0KICAgIHsNCiAgICAgICAgTE9HRSgiQVQgaGFuZHNoYWtlIGZhaWwuIik7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQojZW5kaWYNCg0KICAgIExPR0QoIkFUIE9LLiIpOw0KDQogICAgaWYobWJ0a19pbmZvX3NlcnZlcl9zdGFydCgpKQ0KICAgIHsNCiAgICAgICAgTE9HRSgibWJ0a19pbmZvX3NlcnZlcl9zdGFydCgpIGZhaWwuIik7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBjaGFyIGxlZF9lbmFibGVfc3RyWzEwXTsNCiAgICBtZW1zZXQobGVkX2VuYWJsZV9zdHIsIDAsIDEwKTsNCiAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QubWJ0ay5sZWRfZW5hYmxlIiwgbGVkX2VuYWJsZV9zdHIsICIxIik7DQogICAgaWYoYXRvaShsZWRfZW5hYmxlX3N0cikgPT0gMSkgeyAvLyBOVFAgdGltZQ0KICAgICAgICBMT0coIlN0YXJ0IExFRCB0aHJlYWQuIik7DQogICAgICAgIG1idGtfbGVkX2luaXQoKTsNCiAgICB9DQoNCiNpZiAwDQogICAgaWYodWV2ZW50X21haW4oKSkNCiAgICB7DQogICAgICAgIExPR0UoIlN0YXJ0IHVldmVudCB0aHJlYWQgZmFpbC4iKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCiNlbmRpZg0KDQogICAgY2hhciB0aW1lX3R5cGVbMTBdOw0KICAgIG1lbXNldCh0aW1lX3R5cGUsIDAsIDEwKTsNCiAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QubWJ0ay50aW1lX3R5cGUiLCB0aW1lX3R5cGUsICIwIik7DQogICAgaWYoYXRvaSh0aW1lX3R5cGUpID09IE1CVEtfVElNRV9UWVBFX05UUCkgeyAvLyBOVFAgdGltZQ0KICAgICAgICBMT0coIlN0YXJ0IE5UUCB0aHJlYWQuIik7DQogICAgICAgIG50cF90aHJlYWRfc3RhcnQoKTsNCiAgICB9DQoNCiAgICBmb3RhX3Jlc3VsdF9jaGVjaygpOw0KDQogICAgbWJ0a19yaWxfcmVhZHkoKTsNCg0KICAgIHNlcnZlcl9yZWFkeV9zZXQoKTsvL1NldCB0aGUgc2VydmVyIHJlYWRpbmVzcyBzdGF0ZQ0KICAgIHdoaWxlKDEpDQogICAgew0KICAgICAgICBzbGVlcCgyNCAqIDYwICogNjApOw0KICAgIH0NCg0KICAgIExPR0QoIiEhIW1idGtfcmlsIGV4aXQhISEiKTsNCiAgICByZXR1cm4gMDsNCn0NCg0KI2Vsc2UNCmludCBtYWluKCkNCnsNCiAgICBjaGFyIGJ1ZmZbQlVGRkVSX1NJWkUgKyAxXSA9IHswfTsNCiAgICBpZighbWJ0a19hdCgiQVQrQ0ZVTj0xIiwgYnVmZiwgQlVGRkVSX1NJWkUpKQ0KICAgIHsNCiAgICAgICAgTE9HRCgiK0NGVU4gUlNQOiVzIiwgYnVmZik7DQogICAgICAgIHdoaWxlKDEpDQogICAgICAgIHsNCiAgICAgICAgICAgIHNsZWVwKDEpOw0KICAgICAgICAgICAgbWVtc2V0KGJ1ZmYsIDB4MCwgQlVGRkVSX1NJWkUgKyAxKTsNCiAgICAgICAgICAgIGlmKCFtYnRrX2F0KCJBVCtDR1BBRERSIiwgYnVmZiwgQlVGRkVSX1NJWkUpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIExPR0QoIitDR1BBRERSIFJTUDolcyIsIGJ1ZmYpOw0KICAgICAgICAgICAgICAgIGlmKHN0cnN0cihidWZmLCAiK0NHUEFERFI6IikpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAvLyArQ0dQQUREUjogMSwgIjEwLjk5LjIyMy4xNjgiLCAiMjU0LjEyOC4wLjAuMC4wLjAuMC4wLjEuMC4wLjExNy45LjI1MC41OSINCiAgICAgICAgICAgICAgICAgICAgLy8NCiAgICAgICAgICAgICAgICAgICAgLy8gT0sNCiAgICAgICAgICAgICAgICAgICAgY2hhciAqaXBfc3RhcnQgPSBOVUxMOw0KICAgICAgICAgICAgICAgICAgICBjaGFyICppcF9lbmQgPSBOVUxMOw0KICAgICAgICAgICAgICAgICAgICBjaGFyIGlwdjRbNTBdID0gezB9Ow0KICAgICAgICAgICAgICAgICAgICBpcF9zdGFydCA9IHN0cnN0cihidWZmLCJcIiIpOw0KICAgICAgICAgICAgICAgICAgICBpZihpcF9zdGFydCkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlwX2VuZCA9IHN0cnN0cihpcF9zdGFydCArIDEsICJcIiIpOw0KICAgICAgICAgICAgICAgICAgICBpZihpcF9zdGFydCAmJiBpcF9lbmQgJiYgaXBfZW5kIC0gaXBfc3RhcnQgLSAxID4gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGlwdjQsIGlwX3N0YXJ0ICsgMSwgaXBfZW5kIC0gaXBfc3RhcnQgLSAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIExPR0QoIklQIDogJXMiLCBpcHY0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFtYnRrX2lmY19vcGVuKCkpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90IGFkZHI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5ldF9hdG9uKGlwdjQsKHN0cnVjdCBpbl9hZGRyICopJmFkZHIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0QoIklQIDogJXMgLT4gJXgiLCBpcHY0LCBhZGRyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighbWJ0a19pZmNfc2V0X2FkZHIoImNjaW5ldDAiLCBhZGRyLCAwKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1idGtfaWZjX3VwKCJjY2luZXQwIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJ0a19pZmNfY2xvc2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtKCJyb3V0ZSBhZGQgZGVmYXVsdCBkZXYgY2NpbmV0MCIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCJTZXQgSVAgc3VjY2Vzcy4iKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIExPR0QoIkdldCBJUCBmYWlsLiIpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIDA7DQp9DQojZW5kaWYNCg==