LyoKICogbWliLmMKICoKICogJElkJAogKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqCiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRzLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtZmVhdHVyZXMuaD4KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2lmIEhBVkVfRElSRU5UX0gKIyBpbmNsdWRlIDxkaXJlbnQuaD4KIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgc3RybGVuKChkaXJlbnQpLT5kX25hbWUpCiNlbHNlCiMgZGVmaW5lIGRpcmVudCBkaXJlY3QKIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgKGRpcmVudCktPmRfbmFtbGVuCiMgaWYgSEFWRV9TWVNfTkRJUl9ICiMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+CiMgZW5kaWYKIyBpZiBIQVZFX1NZU19ESVJfSAojICBpbmNsdWRlIDxzeXMvZGlyLmg+CiMgZW5kaWYKIyBpZiBIQVZFX05ESVJfSAojICBpbmNsdWRlIDxuZGlyLmg+CiMgZW5kaWYKI2VuZGlmCgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NFTEVDVF9ICiNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9vdXRwdXRfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9jb25maWdfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC91dGlsaXRpZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2FzbjEuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbWliLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3BhcnNlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2ludDY0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfY2xpZW50Lmg+CgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobWliX2FwaSwgbGlibmV0c25tcCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKG1pYl9zdHJpbmdzX2FsbCwgbWliX2FwaSkKCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihtaWJfc25wcmludCwgbWliX3N0cmluZ3NfYWxsKQpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobWliX3NucHJpbnRfZGVzY3JpcHRpb24sIG1pYl9zdHJpbmdzX2FsbCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKG1pYl9zbnByaW50X3ZhcmlhYmxlLCBtaWJfc3RyaW5nc19hbGwpCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihtaWJfc3RyaW5nX2NvbnZlcnNpb25zLCBtaWJfc3RyaW5nc19hbGwpCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihwcmludF9taWIsIG1pYl9zdHJpbmdzX2FsbCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHNucHJpbnRfb2JqaWQsIG1pYl9zdHJpbmdzX2FsbCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHNucHJpbnRfdmFsdWUsIG1pYl9zdHJpbmdzX2FsbCkKCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihtaWJfdG9fYXNuX3R5cGUsIG1pYl9hcGkpCgovKiogQGRlZmdyb3VwIG1pYl91dGlsaXRpZXMgbWliIHBhcnNpbmcgYW5kIGRhdGF0eXBlIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KICogIEBpbmdyb3VwIGxpYnJhcnkKICoKICogIEB7CiAqLwoKc3RhdGljIGNoYXIgICAgKnVwdGltZVN0cmluZyh1X2xvbmcsIGNoYXIgKiwgc2l6ZV90KTsKCnN0YXRpYyBzdHJ1Y3QgdHJlZSAqX2dldF9yZWFsbG9jX3N5bWJvbChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBlbmRfb2Zfa25vd24pOwoKc3RhdGljIGludCAgICAgIHByaW50X3RyZWVfbm9kZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICp0cCwgaW50IHdpZHRoKTsKc3RhdGljIHZvaWQgICAgIGhhbmRsZV9taWJkaXJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpOwpzdGF0aWMgdm9pZCAgICAgaGFuZGxlX21pYnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSk7CnN0YXRpYyB2b2lkICAgICBoYW5kbGVfbWliZmlsZV9jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKTsKCnN0YXRpYyB2b2lkICAgICBfb2lkX2ZpbmlzaF9wcmludGluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3cpOwoKLyoKICogaGVscGVyIGZ1bmN0aW9ucyBmb3IgZ2V0X21vZHVsZV9ub2RlIAogKi8Kc3RhdGljIGludCAgICAgIG5vZGVfdG9fb2lkKHN0cnVjdCB0cmVlICosIG9pZCAqLCBzaXplX3QgKik7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnN0YXRpYyBpbnQgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHN0cnVjdCB0cmVlICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZWxzZQpzdGF0aWMgaW50ICAgICAgX2FkZF9zdHJpbmdzX3RvX29pZCh2b2lkICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpORVRTTk1QX0lNUE9SVCBzdHJ1Y3QgdHJlZSAqdHJlZV9oZWFkOwpzdGF0aWMgc3RydWN0IHRyZWUgKnRyZWVfdG9wOwoKTkVUU05NUF9JTVBPUlQgc3RydWN0IHRyZWUgKk1pYjsKc3RydWN0IHRyZWUgICAgKk1pYjsgICAgICAgICAgICAvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgpvaWQgICAgICAgICAgICAgUkZDMTIxM19NSUJbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSB9OwpzdGF0aWMgY2hhciAgICAgU3RhbmRhcmRfUHJlZml4W10gPSAiLjEuMy42LjEuMi4xIjsKCi8qCiAqIFNldCBkZWZhdWx0IGhlcmUgYXMgc29tZSB1c2VzIG9mIHJlYWRfb2JqaWQgcmVxdWlyZSB2YWxpZCBwb2ludGVyLiAKICovCnN0YXRpYyBjaGFyICAgICpQcmVmaXggPSAmU3RhbmRhcmRfUHJlZml4WzBdOwp0eXBlZGVmIHN0cnVjdCBfUHJlZml4TGlzdCB7CiAgICBjb25zdCBjaGFyICAgICAqc3RyOwogICAgaW50ICAgICAgICAgICAgIGxlbjsKfSAgICAgICAgICAgICAgKlByZWZpeExpc3RQdHIsIFByZWZpeExpc3Q7CgovKgogKiBIZXJlIGFyZSB0aGUgcHJlZml4IHN0cmluZ3MuCiAqIE5vdGUgdGhhdCB0aGUgZmlyc3Qgb25lIGZpbmRzIHRoZSB2YWx1ZSBvZiBQcmVmaXggb3IgU3RhbmRhcmRfUHJlZml4LgogKiBBbnkgb2YgdGhlc2UgTUFZIHN0YXJ0IHdpdGggcGVyaW9kOyBhbGwgd2lsbCBOT1QgZW5kIHdpdGggcGVyaW9kLgogKiBQZXJpb2QgaXMgYWRkZWQgd2hlcmUgbmVlZGVkLiAgU2VlIHVzZSBvZiBQcmVmaXggaW4gdGhpcyBtb2R1bGUuCiAqLwpQcmVmaXhMaXN0ICAgICAgbWliX3ByZWZpeGVzW10gPSB7CiAgICB7JlN0YW5kYXJkX1ByZWZpeFswXX0sICAgICAgLyogcGxhY2Vob2xkZXIgZm9yIFByZWZpeCBkYXRhICovCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5tZ210Lm1pYi0yIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5leHBlcmltZW50YWwifSwKICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0LnByaXZhdGUifSwKICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0LnNubXBQYXJ0aWVzIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5zbm1wU2VjcmV0cyJ9LAogICAge05VTEwsIDB9ICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBsaXN0ICovCn07CgplbnVtIGluZXRfYWRkcmVzc190eXBlIHsKICAgIElQVjQgPSAxLAogICAgSVBWNiA9IDIsCiAgICBJUFY0WiA9IDMsCiAgICBJUFY2WiA9IDQsCiAgICBETlMgPSAxNgp9OwoKCi8qKgogKiBAaW50ZXJuYWwKICogQ29udmVydHMgdGltZXRpY2tzIHRvIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIHN0cmluZy4KICoKICogQHBhcmFtIHRpbWV0aWNrcyAgICBUaGUgdGltZXRpY2tzIHRvIGNvbnZlcnQuCiAqIEBwYXJhbSBidWYgICAgICAgICAgQnVmZmVyIHRvIHdyaXRlIHRvLCBoYXMgdG8gYmUgYXQgCiAqICAgICAgICAgICAgICAgICAgICAgbGVhc3QgNDAgQnl0ZXMgbGFyZ2UuCiAqICAgICAgIAogKiBAcmV0dXJuIFRoZSBidWZmZXIuCiAqLwpzdGF0aWMgY2hhciAgICAqCnVwdGltZVN0cmluZyh1X2xvbmcgdGltZXRpY2tzLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKICAgIGludCAgICAgICAgICAgICBjZW50aXNlY3MsIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCBkYXlzOwoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTlVNRVJJQ19USU1FVElDS1MpKSB7CiAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlbHUiLCB0aW1ldGlja3MpOwogICAgICAgIHJldHVybiBidWY7CiAgICB9CgoKICAgIGNlbnRpc2VjcyA9IHRpbWV0aWNrcyAlIDEwMDsKICAgIHRpbWV0aWNrcyAvPSAxMDA7CiAgICBkYXlzID0gdGltZXRpY2tzIC8gKDYwICogNjAgKiAyNCk7CiAgICB0aW1ldGlja3MgJT0gKDYwICogNjAgKiAyNCk7CgogICAgaG91cnMgPSB0aW1ldGlja3MgLyAoNjAgKiA2MCk7CiAgICB0aW1ldGlja3MgJT0gKDYwICogNjApOwoKICAgIG1pbnV0ZXMgPSB0aW1ldGlja3MgLyA2MDsKICAgIHNlY29uZHMgPSB0aW1ldGlja3MgJSA2MDsKCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkKICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkOiVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgZWxzZSB7CiAgICAgICAgaWYgKGRheXMgPT0gMCkgewogICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgICAgICBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMgPT0gMSkgewogICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkIGRheSwgJWQ6JTAyZDolMDJkLiUwMmQiLAogICAgICAgICAgICAgICAgICAgIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWQgZGF5cywgJWQ6JTAyZDolMDJkLiUwMmQiLAogICAgICAgICAgICAgICAgICAgIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBidWY7Cn0KCgoKLyoqCiAqIEBpbnRlcm5hbAogKiBQcmludHMgdGhlIGNoYXJhY3RlciBwb2ludGVkIHRvIGlmIGluIGh1bWFuLXJlYWRhYmxlIEFTQ0lJIHJhbmdlLAogKiBvdGhlcndpc2UgcHJpbnRzIGEgZG90LgogKgogKiBAcGFyYW0gYnVmIEJ1ZmZlciB0byBwcmludCB0aGUgY2hhcmFjdGVyIHRvLgogKiBAcGFyYW0gY2ggIENoYXJhY3RlciB0byBwcmludC4KICovCnN0YXRpYyB2b2lkCnNwcmludF9jaGFyKGNoYXIgKmJ1ZiwgY29uc3QgdV9jaGFyIGNoKQp7CiAgICBpZiAoaXNwcmludChjaCkgfHwgaXNzcGFjZShjaCkpIHsKICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVjIiwgKGludCkgY2gpOwogICAgfSBlbHNlIHsKICAgICAgICBzcHJpbnRmKGJ1ZiwgIi4iKTsKICAgIH0KfQoKCgovKioKICogUHJpbnRzIGEgaGV4YWRlY2ltYWwgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSBjaGFyYWN0ZXJzIHBvaW50ZWQgYnkgKmNwIGFyZSBlbmNvZGVkIGFzIGhleGFkZWNpbWFsIHN0cmluZy4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBhZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBhZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gY3AgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gZW5jb2RlLgogKiBAcGFyYW0gbGluZV9sZW4gdGhlIGFycmF5IGxlbmd0aCBvZiBjcC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKX3NwcmludF9oZXhzdHJpbmdfbGluZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxpbmVfbGVuKQp7CiAgICBjb25zdCB1X2NoYXIgICAqdHA7CiAgICBjb25zdCB1X2NoYXIgICAqY3AyID0gY3A7CiAgICBzaXplX3QgICAgICAgICAgbGVubGVmdCA9IGxpbmVfbGVuOwoKICAgIC8qCiAgICAgKiBNYWtlIHN1cmUgdGhlcmUncyBlbm91Z2ggcm9vbSBmb3IgdGhlIGhleCBvdXRwdXQuLi4uCiAgICAgKi8KICAgIHdoaWxlICgoKm91dF9sZW4gKyBsaW5lX2xlbiozKzEpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiAuLi4uIGFuZCBkaXNwbGF5IHRoZSBoZXggdmFsdWVzIHRoZW1zZWx2ZXMuLi4uCiAgICAgKi8KICAgIGZvciAoOyBsZW5sZWZ0ID49IDg7IGxlbmxlZnQtPTgpIHsKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLAogICAgICAgICAgICAgICAgIiUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAiLCBjcFswXSwgY3BbMV0sCiAgICAgICAgICAgICAgICBjcFsyXSwgY3BbM10sIGNwWzRdLCBjcFs1XSwgY3BbNl0sIGNwWzddKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgICAgIGNwICAgICAgICs9IDg7CiAgICB9CiAgICBmb3IgKDsgbGVubGVmdCA+IDA7IGxlbmxlZnQtLSkgewogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlMDJYICIsICpjcCsrKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgfQoKICAgIC8qCiAgICAgKiAuLi4uIHBsdXMgKG9wdGlvbmFsbHkpIGRvIHRoZSBzYW1lIGZvciB0aGUgQVNDSUkgZXF1aXZhbGVudC4KICAgICAqLwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9IRVhfVEVYVCkpIHsKICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgbGluZV9sZW4rNSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIgIFsiKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgICAgIGZvciAodHAgPSBjcDI7IHRwIDwgY3A7IHRwKyspIHsKICAgICAgICAgICAgc3ByaW50X2NoYXIoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICp0cCk7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIl0iKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCmludApzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgaW50IGxpbmVfbGVuID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9IRVhfT1VUUFVUX0xFTkdUSCk7CiAgICBpZiAoIWxpbmVfbGVuKQogICAgICAgIGxpbmVfbGVuPWxlbjsKCiAgICBmb3IgKDsgKGludClsZW4gPiBsaW5lX2xlbjsgbGVuIC09IGxpbmVfbGVuKSB7CiAgICAgICAgaWYoIV9zcHJpbnRfaGV4c3RyaW5nX2xpbmUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCwgbGluZV9sZW4pKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gJ1xuJzsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgICAgIGNwICs9IGxpbmVfbGVuOwogICAgfQogICAgaWYoIV9zcHJpbnRfaGV4c3RyaW5nX2xpbmUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCwgbGVuKSkKICAgICAgICByZXR1cm4gMDsKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICByZXR1cm4gMTsKfQoKCgovKioKICogUHJpbnRzIGFuIGFzY2lpIHN0cmluZyBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgY2hhcmFjdGVycyBwb2ludGVkIGJ5ICpjcCBhcmUgZW5jb2RlZCBhcyBhbiBhc2NpaSBzdHJpbmcuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIGFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIGluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSBjcCAgICAgICB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycyB0byBlbmNvZGUuCiAqIEBwYXJhbSBsZW4gICAgICB0aGUgYXJyYXkgbGVuZ3RoIG9mIGNwLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIGludCAgICAgICAgICAgICBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSBsZW47IGkrKykgewogICAgICAgIGlmIChpc3ByaW50KCpjcCkgfHwgaXNzcGFjZSgqY3ApKSB7CiAgICAgICAgICAgIGlmICgqY3AgPT0gJ1xcJyB8fCAqY3AgPT0gJyInKSB7CiAgICAgICAgICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAgICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICgqb3V0X2xlbikrKykgPSAnXFwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gKmNwKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICooKmJ1ZiArICgqb3V0X2xlbikrKykgPSAnLic7CiAgICAgICAgICAgIGNwKys7CiAgICAgICAgfQogICAgfQogICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwogICAgcmV0dXJuIDE7Cn0KCi8qKgogKiBQcmludHMgYW4gb2N0ZXQgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBvY3RldCBzdHJpbmcuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgc2F2ZWRfb3V0X2xlbiA9ICpvdXRfbGVuOwogICAgY29uc3QgY2hhciAgICAgKnNhdmVkX2hpbnQgPSBoaW50OwogICAgaW50ICAgICAgICAgICAgIGhleCA9IDAsIHggPSAwOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQsIGNudDsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgT0NURVQgU1RSSU5HKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCgogICAgaWYgKGhpbnQpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgcmVwZWF0LCB3aWR0aCA9IDE7CiAgICAgICAgbG9uZyAgICAgICAgICAgIHZhbHVlOwogICAgICAgIGNoYXIgICAgICAgICAgICBjb2RlID0gJ2QnLCBzZXBhciA9IDAsIHRlcm0gPSAwLCBjaCwgaW50YnVmWzMyXTsKI2RlZmluZSBIRVgyRElHSVRfTkVFRF9JTklUIDMKICAgICAgICBjaGFyICAgICAgICAgICAgaGV4MmRpZ2l0ID0gSEVYMkRJR0lUX05FRURfSU5JVDsKICAgICAgICB1X2NoYXIgICAgICAgICAqZWNwOwoKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiU1RSSU5HOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3AgPSB2YXItPnZhbC5zdHJpbmc7CiAgICAgICAgZWNwID0gY3AgKyB2YXItPnZhbF9sZW47CgogICAgICAgIHdoaWxlIChjcCA8IGVjcCkgewogICAgICAgICAgICByZXBlYXQgPSAxOwogICAgICAgICAgICBpZiAoKmhpbnQpIHsKICAgICAgICAgICAgICAgIGlmICgqaGludCA9PSAnKicpIHsKICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSAqY3ArKzsKICAgICAgICAgICAgICAgICAgICBoaW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aWR0aCA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSAoJzAnIDw9ICpoaW50ICYmICpoaW50IDw9ICc5JykKICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICh3aWR0aCAqIDEwKSArICgqaGludCsrIC0gJzAnKTsKICAgICAgICAgICAgICAgIGNvZGUgPSAqaGludCsrOwogICAgICAgICAgICAgICAgaWYgKChjaCA9ICpoaW50KSAmJiBjaCAhPSAnKicgJiYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQogICAgICAgICAgICAgICAgICAgICYmICh3aWR0aCAhPSAwCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaCAhPSAneCcgJiYgY2ggIT0gJ2QnICYmIGNoICE9ICdvJykpKQogICAgICAgICAgICAgICAgICAgIHNlcGFyID0gKmhpbnQrKzsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBzZXBhciA9IDA7CiAgICAgICAgICAgICAgICBpZiAoKGNoID0gKmhpbnQpICYmIGNoICE9ICcqJyAmJiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCiAgICAgICAgICAgICAgICAgICAgJiYgKHdpZHRoICE9IDAKICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoICE9ICd4JyAmJiBjaCAhPSAnZCcgJiYgY2ggIT0gJ28nKSkpCiAgICAgICAgICAgICAgICAgICAgdGVybSA9ICpoaW50Kys7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgdGVybSA9IDA7CiAgICAgICAgICAgICAgICBpZiAod2lkdGggPT0gMCkgIC8qIEhhbmRsZSBtYWxmb3JtZWQgaGludCBzdHJpbmdzICovCiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAocmVwZWF0ICYmIGNwIDwgZWNwKSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAnYScgJiYgY29kZSAhPSAndCcpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMjU2ICsgKmNwKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgICAgICAgICBpZiAoSEVYMkRJR0lUX05FRURfSU5JVCA9PSBoZXgyZGlnaXQpCiAgICAgICAgICAgICAgICAgICAgICAgIGhleDJkaWdpdCA9IG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCXzJESUdJVF9IRVhfT1VUUFVUKTsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIGlmIHZhbHVlIGlzIDwgMTYsIGl0IHdpbGwgYmUgYSBzaW5nbGUgaGV4IGRpZ2l0LiBJZiB0aGUKICAgICAgICAgICAgICAgICAgICAgKiB3aWR0aCBpcyAxICh3ZSBhcmUgb3V0cHV0dGluZyBhIGJ5dGUgYXQgYSB0aW1lKSwgcGF0IGl0CiAgICAgICAgICAgICAgICAgICAgICogdG8gMiBkaWdpdHMgaWYgTkVUU05NUF9EU19MSUJfMkRJR0lUX0hFWF9PVVRQVVQgaXMgc2V0CiAgICAgICAgICAgICAgICAgICAgICogb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6CiAgICAgICAgICAgICAgICAgICAgICogIC0gd2UgZG8gbm90IGhhdmUgYSBzZXBhcmF0aW9uIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICAqICAtIHRoZXJlIGlzIG5vIGhpbnQgbGVmdCAob3IgdGhlcmUgbmV2ZXIgd2FzIGEgaGludCkKICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAqIGUuZy4gZm9yIHRoZSBkYXRhIDB4QUEwMUJCLCB3b3VsZCBhbnlvbmUgcmVhbGx5IGV2ZXIKICAgICAgICAgICAgICAgICAgICAgKiB3YW50IHRoZSBzdHJpbmcgIkFBMUJCIj8/CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKCgodmFsdWUgPCAxNikgJiYgKDEgPT0gd2lkdGgpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoaGV4MmRpZ2l0IHx8ICgoMCA9PSBzZXBhcikgJiYgKDAgPT0gKmhpbnQpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIwJWx4IiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx4IiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWxkIiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbyc6CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbG8iLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd0JzogLyogbmV3IGluIHJmYyAzNDExICovCiAgICAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgICAgICAgICBjbnQgPSBTTk1QX01JTih3aWR0aCwgZWNwIC0gY3ApOwogICAgICAgICAgICAgICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgY3AsIGNudCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIGNwICs9IGNudDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgKm91dF9sZW4gPSBzYXZlZF9vdXRfbGVuOwogICAgICAgICAgICAgICAgICAgIGlmIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihCYWQgaGludCBpZ25vcmVkOiAiKQogICAgICAgICAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCBzYXZlZF9oaW50KQogICAgICAgICAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAiKSAiKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNwIDwgZWNwICYmIHNlcGFyKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSBzZXBhcjsKICAgICAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcGVhdC0tOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGVybSAmJiBjcCA8IGVjcCkgewogICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gdGVybTsKICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh1bml0cykgewogICAgICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgICAgIH0KICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBvdXRwdXRfZm9ybWF0ID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfU1RSSU5HX09VVFBVVF9GT1JNQVQpOwogICAgaWYgKDAgPT0gb3V0cHV0X2Zvcm1hdCkgewogICAgICAgIG91dHB1dF9mb3JtYXQgPSBORVRTTk1QX1NUUklOR19PVVRQVVRfR1VFU1M7CiAgICB9CiAgICBzd2l0Y2ggKG91dHB1dF9mb3JtYXQpIHsKICAgIGNhc2UgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0dVRVNTOgogICAgICAgIGhleCA9IDA7CiAgICAgICAgZm9yIChjcCA9IHZhci0+dmFsLnN0cmluZywgeCA9IDA7IHggPCAoaW50KSB2YXItPnZhbF9sZW47IHgrKywgY3ArKykgewogICAgICAgICAgICBpZiAoIWlzcHJpbnQoKmNwKSAmJiAhaXNzcGFjZSgqY3ApKSB7CiAgICAgICAgICAgICAgICBoZXggPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0FTQ0lJOgogICAgICAgIGhleCA9IDA7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX1NUUklOR19PVVRQVVRfSEVYOgogICAgICAgIGhleCA9IDE7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHZhci0+dmFsX2xlbiA9PSAwKSB7CiAgICAgICAgcmV0dXJuIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlwiIik7CiAgICB9CgogICAgaWYgKGhleCkgewogICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJIZXgtU1RSSU5HOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcsIHZhci0+dmFsX2xlbikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RSSU5HOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdmFyLT52YWwuc3RyaW5nLAogICAgICAgICAgICAgdmFyLT52YWxfbGVuKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCIiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKCi8qKgogKiBQcmludHMgYSBmbG9hdCBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfZmxvYXQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRkxPQVQpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBGbG9hdCk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiT3BhcXVlOiBGbG9hdDogIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKCiAgICAvKgogICAgICogSG93IG11Y2ggc3BhY2UgbmVlZGVkIGZvciBtYXguIGxlbmd0aCBmbG9hdD8gIDEyOCBpcyBvdmVya2lsbC4gIAogICAgICovCgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDEyOCArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlZiIsICp2YXItPnZhbC5mbG9hdFZhbCk7CiAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIGRvdWJsZSBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgYSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19kb3VibGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0RPVUJMRSkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIERvdWJsZSk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiT3BhcXVlOiBGbG9hdDogIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBIb3cgbXVjaCBzcGFjZSBuZWVkZWQgZm9yIG1heC4gbGVuZ3RoIGRvdWJsZT8gIDEyOCBpcyBvdmVya2lsbC4gIAogICAgICovCgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDEyOCArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlZiIsICp2YXItPnZhbC5kb3VibGVWYWwpOwogICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwoKCi8qKgogKiBQcmludHMgYSBjb3VudGVyIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBhIGNvdW50ZXIgdmFsdWUuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2NvdW50ZXI2NCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgYTY0YnVmW0k2NENIQVJTWiArIDFdOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0NPVU5URVI2NAojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfQ09VTlRFUjY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfSTY0ICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX1U2NAojZW5kaWYKICAgICAgICApIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBDb3VudGVyNjQpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICBpZiAodmFyLT50eXBlICE9IEFTTl9DT1VOVEVSNjQpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJPcGFxdWU6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgICAgIGNhc2UgQVNOX09QQVFVRV9VNjQ6CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiVUludDY0OiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBU05fT1BBUVVFX0k2NDoKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJJbnQ2NDogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQVNOX0NPVU5URVI2NDoKICAgICAgICBjYXNlIEFTTl9PUEFRVUVfQ09VTlRFUjY0OgojZW5kaWYKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJDb3VudGVyNjQ6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgfQojZW5kaWYKICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgaWYgKHZhci0+dHlwZSA9PSBBU05fT1BBUVVFX0k2NCkgewogICAgICAgIHByaW50STY0KGE2NGJ1ZiwgdmFyLT52YWwuY291bnRlcjY0KTsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGE2NGJ1ZikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKI2VuZGlmCiAgICAgICAgcHJpbnRVNjQoYTY0YnVmLCB2YXItPnZhbC5jb3VudGVyNjQpOwogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgYTY0YnVmKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIH0KI2VuZGlmCgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIG9iamVjdCBpZGVudGlmaWVyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2Nfb3BhcXVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX09QQVFVRQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfQ09VTlRFUjY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfVTY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfSTY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRkxPQVQgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRE9VQkxFCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCiAgICAgICAgKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgT3BhcXVlKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfVTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0k2NDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFX0ZMT0FUOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19mbG9hdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUVfRE9VQkxFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19kb3VibGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09QQVFVRToKI2VuZGlmCiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJPUEFRVUU6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nLCB2YXItPnZhbF9sZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgfQojZW5kaWYKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gb2JqZWN0IGlkZW50aWZpZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX09CSkVDVF9JRCkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE9CSkVDVCBJREVOVElGSUVSKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJPSUQ6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2lkICopICh2YXItPnZhbC5vYmppZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCkpOwoKICAgIGlmIChidWZfb3ZlcmZsb3cpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgoKLyoqCiAqIFByaW50cyBhIHRpbWV0aWNrIHZhcmlhYmxlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICB0aW1lYnVmWzQwXTsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9USU1FVElDS1MpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBUaW1ldGlja3MpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUykpIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIiVsdSIsICoodV9sb25nICopIHZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiVGltZXRpY2tzOiAoJWx1KSAiLCAqKHVfbG9uZyAqKSB2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICB1cHRpbWVTdHJpbmcoKih1X2xvbmcgKikgKHZhci0+dmFsLmludGVnZXIpLCB0aW1lYnVmLCBzaXplb2YodGltZWJ1ZikpOwogICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgdGltZWJ1ZikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gaW50ZWdlciBhY2NvcmRpbmcgdG8gdGhlIGhpbnQgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFsICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGRlY2ltYWx0eXBlICdkJyBvciAndScgZGVwZW5kaW5nIG9uIGludGVnZXIgdHlwZQogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IF9OT1RfIGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB2YWwsIGNvbnN0IGNoYXIgZGVjaW1hbHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgZm10WzEwXSA9ICIlbEAiLCB0bXBbMjU2XTsKICAgIGludCAgICAgICAgICAgICBzaGlmdCA9IDAsIGxlbiwgbmVnYXRpdmUgPSAwOwoKICAgIGlmIChoaW50WzBdID09ICdkJykgewogICAgICAgIC8qCiAgICAgICAgICogV2UgbWlnaHQgKmFjdHVhbGx5KiB3YW50IGEgJ3UnIGhlcmUuICAKICAgICAgICAgKi8KICAgICAgICBpZiAoaGludFsxXSA9PSAnLScpCiAgICAgICAgICAgIHNoaWZ0ID0gYXRvaShoaW50ICsgMik7CiAgICAgICAgZm10WzJdID0gZGVjaW1hbHR5cGU7CiAgICAgICAgaWYgKHZhbCA8IDApIHsKICAgICAgICAgICAgbmVnYXRpdmUgPSAxOwogICAgICAgICAgICB2YWwgPSAtdmFsOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBESVNQTEFZLUhJTlQgY2hhcmFjdGVyIGlzICdiJywgJ28nLCBvciAneCcuICAKICAgICAgICAgKi8KICAgICAgICBmbXRbMl0gPSBoaW50WzBdOwogICAgfQoKICAgIGlmIChoaW50WzBdID09ICdiJykgewoJdW5zaWduZWQgbG9uZyBpbnQgYml0ID0gMHg4MDAwMDAwMExVOwoJY2hhciAqYnAgPSB0bXA7Cgl3aGlsZSAoYml0KSB7CgkgICAgKmJwKysgPSB2YWwgJiBiaXQgPyAnMScgOiAnMCc7CgkgICAgYml0ID4+PSAxOwoJfQoJKmJwID0gMDsKICAgIH0KICAgIGVsc2UKCXNwcmludGYodG1wLCBmbXQsIHZhbCk7CgogICAgaWYgKHNoaWZ0ICE9IDApIHsKICAgICAgICBsZW4gPSBzdHJsZW4odG1wKTsKICAgICAgICBpZiAoc2hpZnQgPD0gbGVuKSB7CiAgICAgICAgICAgIHRtcFtsZW4gKyAxXSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChzaGlmdC0tKSB7CiAgICAgICAgICAgICAgICB0bXBbbGVuXSA9IHRtcFtsZW4gLSAxXTsKICAgICAgICAgICAgICAgIGxlbi0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtcFtsZW5dID0gJy4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRtcFtzaGlmdCArIDFdID0gMDsKICAgICAgICAgICAgd2hpbGUgKHNoaWZ0KSB7CiAgICAgICAgICAgICAgICBpZiAobGVuLS0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdG1wW3NoaWZ0XSA9IHRtcFtsZW5dOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0bXBbc2hpZnRdID0gJzAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2hpZnQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0bXBbMF0gPSAnLic7CiAgICAgICAgfQogICAgfQogICAgaWYgKG5lZ2F0aXZlKSB7CiAgICAgICAgbGVuID0gc3RybGVuKHRtcCkrMTsKICAgICAgICB3aGlsZSAobGVuKSB7CiAgICAgICAgICAgIHRtcFtsZW5dID0gdG1wW2xlbi0xXTsKICAgICAgICAgICAgbGVuLS07CiAgICAgICAgfQogICAgICAgIHRtcFswXSA9ICctJzsKICAgIH0KICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICh1X2NoYXIgKil0bXApOwp9CgoKLyoqCiAqIFByaW50cyBhbiBpbnRlZ2VyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfaW50ZWdlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgKmVudW1fc3RyaW5nID0gTlVMTDsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgSU5URUdFUik6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBmb3IgKDsgZW51bXM7IGVudW1zID0gZW51bXMtPm5leHQpIHsKICAgICAgICBpZiAoZW51bXMtPnZhbHVlID09ICp2YXItPnZhbC5pbnRlZ2VyKSB7CiAgICAgICAgICAgIGVudW1fc3RyaW5nID0gZW51bXMtPmxhYmVsOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJJTlRFR0VSOiAiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGVudW1fc3RyaW5nID09IE5VTEwgfHwKICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKSkgewogICAgICAgIGlmIChoaW50KSB7CiAgICAgICAgICAgIGlmICghKHNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIsICdkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCwgdW5pdHMpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlbGQiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgc3ByaW50ZihzdHIsICIoJWxkKSIsICp2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gdW5zaWduZWQgaW50ZWdlciBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX3VpbnRlZ2VyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgKmVudW1fc3RyaW5nID0gTlVMTDsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9VSU5URUdFUikgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIFVJbnRlZ2VyMzIpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgZm9yICg7IGVudW1zOyBlbnVtcyA9IGVudW1zLT5uZXh0KSB7CiAgICAgICAgaWYgKGVudW1zLT52YWx1ZSA9PSAqdmFyLT52YWwuaW50ZWdlcikgewogICAgICAgICAgICBlbnVtX3N0cmluZyA9IGVudW1zLT5sYWJlbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChlbnVtX3N0cmluZyA9PSBOVUxMIHx8CiAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSkpIHsKICAgICAgICBpZiAoaGludCkgewogICAgICAgICAgICBpZiAoIShzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyLCAndScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQsIHVuaXRzKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWx1IiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiKCVsdSkiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgZ2F1Z2UgdmFsdWUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19nYXVnZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICB0bXBbMzJdOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0dBVUdFKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgR2F1Z2UzMiBvciBVbnNpZ25lZDMyKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJHYXVnZTMyOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmIChoaW50KSB7CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIsICd1JywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHNwcmludGYodG1wLCAiJXUiLCAodW5zaWduZWQgaW50KSgqdmFyLT52YWwuaW50ZWdlciAmIDB4ZmZmZmZmZmYpKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgdG1wKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgY291bnRlciB2YWx1ZSBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2NvdW50ZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICB0bXBbMzJdOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0NPVU5URVIpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBDb3VudGVyMzIpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIkNvdW50ZXIzMjogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBzcHJpbnRmKHRtcCwgIiV1IiwgKHVuc2lnbmVkIGludCkoKnZhci0+dmFsLmludGVnZXIgJiAweGZmZmZmZmZmKSk7CiAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSB0bXApKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgbmV0d29yayBhZGRyZXNzIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfbmV0d29ya2FkZHJlc3ModV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgaTsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9JUEFERFJFU1MpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBOZXR3b3JrQWRkcmVzcyk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiTmV0d29yayBBZGRyZXNzOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgKHZhci0+dmFsX2xlbiAqIDMpICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IHZhci0+dmFsX2xlbjsgaSsrKSB7CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiUwMlgiLCB2YXItPnZhbC5zdHJpbmdbaV0pOwogICAgICAgICpvdXRfbGVuICs9IDI7CiAgICAgICAgaWYgKGkgPCB2YXItPnZhbF9sZW4gLSAxKSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICc6JzsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiBpcC1hZGRyZXNzIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHVfY2hhciAgICAgICAgICppcCA9IHZhci0+dmFsLnN0cmluZzsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9JUEFERFJFU1MpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBJcEFkZHJlc3MpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIklwQWRkcmVzczogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMTcpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgaWYgKGlwKQogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlZC4lZC4lZC4lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBbMF0sIGlwWzFdLCBpcFsyXSwgaXBbM10pOwogICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIG51bGwgdmFsdWUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19udWxsKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9OVUxMKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgTlVMTCk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiTlVMTCI7CiAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpOwp9CgoKLyoqCiAqIFByaW50cyBhIGJpdCBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaW50ICAgICAgICAgICAgIGxlbiwgYml0OwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgY2hhciAgICAgICAgICAgKmVudW1fc3RyaW5nOwoKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0JJVF9TVFIgJiYgdmFyLT50eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBCSVRTKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIlwiIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJCSVRTOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLmJpdHN0cmluZywgdmFyLT52YWxfbGVuKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIlwiIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNwID0gdmFyLT52YWwuYml0c3RyaW5nOwogICAgICAgIGZvciAobGVuID0gMDsgbGVuIDwgKGludCkgdmFyLT52YWxfbGVuOyBsZW4rKykgewogICAgICAgICAgICBmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoKmNwICYgKDB4ODAgPj4gYml0KSkgewogICAgICAgICAgICAgICAgICAgIGVudW1fc3RyaW5nID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZW51bXM7IGVudW1zID0gZW51bXMtPm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1zLT52YWx1ZSA9PSAobGVuICogOCkgKyBiaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fc3RyaW5nID0gZW51bXMtPmxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1fc3RyaW5nID09IE5VTEwgfHwKICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWQgIiwgKGxlbiAqIDgpICsgYml0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiKCVkKSAiLCAobGVuICogOCkgKyBiaXQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3ArKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKaW50CnNwcmludF9yZWFsbG9jX25zYXBhZGRyZXNzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fTlNBUCkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE5zYXBBZGRyZXNzKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJOc2FwQWRkcmVzczogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZywgdmFyLT52YWxfbGVuKTsKfQoKCi8qKgogKiBGYWxsYmFjayByb3V0aW5lIGZvciBhIGJhZCB0eXBlLCBwcmludHMgIlZhcmlhYmxlIGhhcyBiYWQgdHlwZSIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19iYWR0eXBlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiVmFyaWFibGUgaGFzIGJhZCB0eXBlIjsKCiAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpOwp9CgoKCi8qKgogKiBVbml2ZXJzYWwgcHJpbnQgcm91dGluZSwgcHJpbnRzIGEgdmFyaWFibGUgaW50byBhIGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHZhcmlhYmxlIAogKiB0eXBlLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2J5X3R5cGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIERFQlVHTVNHVEwoKCJvdXRwdXQiLCAic3ByaW50X2J5X3R5cGUsIHR5cGUgJWRcbiIsIHZhci0+dHlwZSkpOwoKICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICBjYXNlIEFTTl9JTlRFR0VSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19pbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fQklUX1NUUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29wYXF1ZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9PQkpFQ1RfSUQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fVElNRVRJQ0tTOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY190aW1ldGlja3MoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX0dBVUdFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19nYXVnZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX0NPVU5URVI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2NvdW50ZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX0lQQUREUkVTUzoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9OVUxMOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19udWxsKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9VSU5URUdFUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfdWludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9DT1VOVEVSNjQ6CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGNhc2UgQVNOX09QQVFVRV9VNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0NPVU5URVI2NDoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGNhc2UgQVNOX09QQVFVRV9GTE9BVDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZmxvYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9PUEFRVUVfRE9VQkxFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19kb3VibGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic3ByaW50X2J5X3R5cGUiLCAiYmFkIHR5cGU6ICVkXG4iLCB2YXItPnR5cGUpKTsKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYmFkdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgfQp9CgoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoqCiAqIFJldHJpZXZlcyB0aGUgdHJlZSBoZWFkLgogKgogKiBAcmV0dXJuIHRoZSB0cmVlIGhlYWQuCiAqLwpzdHJ1Y3QgdHJlZSAgICAqCmdldF90cmVlX2hlYWQodm9pZCkKewogICAgcmV0dXJuICh0cmVlX2hlYWQpOwp9CgpzdGF0aWMgY2hhciAgICAqY29uZm1pYmRpciA9IE5VTEw7CnN0YXRpYyBjaGFyICAgICpjb25mbWlicyA9IE5VTEw7CgpzdGF0aWMgdm9pZApoYW5kbGVfbWliZGlyc19jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjaGFyICAgICAgICAgICAqY3RtcDsKCiAgICBpZiAoY29uZm1pYmRpcikgewogICAgICAgIGlmICgoKmxpbmUgPT0gJysnKSB8fCAoKmxpbmUgPT0gJy0nKSkgewogICAgICAgICAgICBjdG1wID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihjb25mbWliZGlyKSArIHN0cmxlbihsaW5lKSArIDIpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaWJkaXIgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCpsaW5lKysgPT0gJysnKQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgY29uZm1pYmRpciwgRU5WX1NFUEFSQVRPUl9DSEFSLCBsaW5lKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgbGluZSwgRU5WX1NFUEFSQVRPUl9DSEFSLCBjb25mbWliZGlyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdG1wID0gc3RyZHVwKGxpbmUpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShjb25mbWliZGlyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25mbWliZGlyID0gY3RtcDsKICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgInVzaW5nIG1pYmRpcnM6ICVzXG4iLCBjb25mbWliZGlyKSk7Cn0KCnN0YXRpYyB2b2lkCmhhbmRsZV9taWJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIGNoYXIgICAgICAgICAgICpjdG1wOwoKICAgIGlmIChjb25mbWlicykgewogICAgICAgIGlmICgoKmxpbmUgPT0gJysnKSB8fCAoKmxpbmUgPT0gJy0nKSkgewogICAgICAgICAgICBjdG1wID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihjb25mbWlicykgKyBzdHJsZW4obGluZSkgKyAyKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZigqbGluZSsrID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGNvbmZtaWJzLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGxpbmUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKGN0bXAsICIlcyVjJXMiLCBsaW5lLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGNvbmZtaWJkaXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGNvbmZtaWJzKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25mbWlicyA9IGN0bXA7CiAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJ1c2luZyBtaWJzOiAlc1xuIiwgY29uZm1pYnMpKTsKfQoKCnN0YXRpYyB2b2lkCmhhbmRsZV9taWJmaWxlX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgInJlYWRpbmcgbWliZmlsZTogJXNcbiIsIGxpbmUpKTsKICAgIHJlYWRfbWliKGxpbmUpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQKaGFuZGxlX3ByaW50X251bWVyaWMoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIGNvbnN0IGNoYXIgKnZhbHVlOwogICAgY2hhciAgICAgICAqc3Q7CgogICAgdmFsdWUgPSBzdHJ0b2tfcihsaW5lLCAiIFx0XG4iLCAmc3QpOwogICAgaWYgKHZhbHVlICYmICgKCSAgICAoc3RyY2FzZWNtcCh2YWx1ZSwgInllcyIpICA9PSAwKSB8fCAKCSAgICAoc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSA9PSAwKSB8fAoJICAgICgqdmFsdWUgPT0gJzEnKSApKSB7CgogICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDKTsKICAgIH0KfQoKY2hhciAgICAgICAgICAgKgpzbm1wX291dF90b2dnbGVfb3B0aW9ucyhjaGFyICpvcHRpb25zKQp7CiAgICB3aGlsZSAoKm9wdGlvbnMpIHsKICAgICAgICBzd2l0Y2ggKCpvcHRpb25zKyspIHsKICAgICAgICBjYXNlICcwJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfMkRJR0lUX0hFWF9PVVRQVVQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfU1RSSU5HX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9BU0NJSSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9CUkVBS0RPV05fT0lEUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfRlVMTCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdxJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnUSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQsIDEpOwogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9TVUZGSVgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdTJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnVCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9IRVhfVEVYVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX1VDRCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfQkFSRV9WQUxVRSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9TVFJJTkdfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0hFWCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1gnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVhURU5ERURfSU5ERVgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gb3B0aW9ucyAtIDE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCnZvaWQKc25tcF9vdXRfdG9nZ2xlX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqbGVhZCwgRklMRSAqIG91dGYpCnsKICAgIGZwcmludGYob3V0ZiwgIiVzMDogIHByaW50IGxlYWRpbmcgMCBmb3Igc2luZ2xlLWRpZ2l0IGhleCBjaGFyYWN0ZXJzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzYTogIHByaW50IGFsbCBzdHJpbmdzIGluIGFzY2lpIGZvcm1hdFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2I6ICBkbyBub3QgYnJlYWsgT0lEIGluZGV4ZXMgZG93blxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2U6ICBwcmludCBlbnVtcyBudW1lcmljYWxseVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc0U6ICBlc2NhcGUgcXVvdGVzIGluIHN0cmluZyBpbmRpY2VzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzZjogIHByaW50IGZ1bGwgT0lEcyBvbiBvdXRwdXRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNuOiAgcHJpbnQgT0lEcyBudW1lcmljYWxseVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3E6ICBxdWljayBwcmludCBmb3IgZWFzaWVyIHBhcnNpbmdcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNROiAgcXVpY2sgcHJpbnQgd2l0aCBlcXVhbC1zaWduc1xuIiwgbGVhZCk7ICAgIC8qIEBASkRXICovCiAgICBmcHJpbnRmKG91dGYsICIlc3M6ICBwcmludCBvbmx5IGxhc3Qgc3ltYm9saWMgZWxlbWVudCBvZiBPSURcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNTOiAgcHJpbnQgTUlCIG1vZHVsZS1pZCBwbHVzIGxhc3QgZWxlbWVudFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3Q6ICBwcmludCB0aW1ldGlja3MgdW5wYXJzZWQgYXMgbnVtZXJpYyBpbnRlZ2Vyc1xuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsCiAgICAgICAgICAgICIlc1Q6ICBwcmludCBodW1hbi1yZWFkYWJsZSB0ZXh0IGFsb25nIHdpdGggaGV4IHN0cmluZ3NcbiIsCiAgICAgICAgICAgIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXN1OiAgcHJpbnQgT0lEcyB1c2luZyBVQ0Qtc3R5bGUgcHJlZml4IHN1cHByZXNzaW9uXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzVTogIGRvbid0IHByaW50IHVuaXRzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzdjogIHByaW50IHZhbHVlcyBvbmx5IChub3QgT0lEID0gdmFsdWUpXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzeDogIHByaW50IGFsbCBzdHJpbmdzIGluIGhleCBmb3JtYXRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNYOiAgZXh0ZW5kZWQgaW5kZXggZm9ybWF0XG4iLCBsZWFkKTsKfQoKY2hhciAqCnNubXBfaW5fb3B0aW9ucyhjaGFyICpvcHRhcmcsIGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndikKewogICAgY2hhciAqY3A7CgogICAgZm9yIChjcCA9IG9wdGFyZzsgKmNwOyBjcCsrKSB7CiAgICAgICAgc3dpdGNoICgqY3ApIHsKICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFR0VYX0FDQ0VTUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkFORE9NX0FDQ0VTUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9DSEVDS19SQU5HRSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTk9fRElTUExBWV9ISU5UKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUFEX1VDRF9TVFlMRV9PSUQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgLyogV2hhdCBpZiBhcmdjL2FyZ3YgYXJlIG51bGwgPyAqLwogICAgICAgICAgICBpZiAoISooKytjcCkpCiAgICAgICAgICAgICAgICBjcCA9IGFyZ3Zbb3B0aW5kKytdOwogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEU1VGRklYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgIC8qIFdoYXQgaWYgYXJnYy9hcmd2IGFyZSBudWxsID8gKi8KICAgICAgICAgICAgaWYgKCEqKCsrY3ApKQogICAgICAgICAgICAgICAgY3AgPSBhcmd2W29wdGluZCsrXTsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX09JRFBSRUZJWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgLyoKICAgICAgICAgICAgKiAgSGVyZT8gIE9yIGluIHNubXBfcGFyc2VfYXJncz8KICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVua25vd24gaW5wdXQgb3B0aW9uIHBhc3NlZCB0byAtSTogJWMuXG4iLCAqY3ApOwogICAgICAgICAgICAqLwogICAgICAgICAgICByZXR1cm4gY3A7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCmNoYXIgICAgICAgICAgICoKc25tcF9pbl90b2dnbGVfb3B0aW9ucyhjaGFyICpvcHRpb25zKQp7CiAgICByZXR1cm4gc25tcF9pbl9vcHRpb25zKCBvcHRpb25zLCAwLCBOVUxMICk7Cn0KCgovKioKICogUHJpbnRzIG91dCBhIGhlbHAgdXNhZ2UgZm9yIHRoZSBpbiogdG9nZ2xlIG9wdGlvbnMuCiAqCiAqIEBwYXJhbSBsZWFkICAgICAgVGhlIGxlYWQgdG8gcHJpbnQgZm9yIGV2ZXJ5IGxpbmUuCiAqIEBwYXJhbSBvdXRmICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSB0by4KICogCiAqLwp2b2lkCnNubXBfaW5fdG9nZ2xlX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqbGVhZCwgRklMRSAqIG91dGYpCnsKICAgIGZwcmludGYob3V0ZiwgIiVzYjogIGRvIGJlc3QvcmVnZXggbWF0Y2hpbmcgdG8gZmluZCBhIE1JQiBub2RlXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzaDogIGRvbid0IGFwcGx5IERJU1BMQVktSElOVHNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNyOiAgZG8gbm90IGNoZWNrIHZhbHVlcyBmb3IgcmFuZ2UvdHlwZSBsZWdhbGl0eVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1I6ICBkbyByYW5kb20gYWNjZXNzIHRvIE9JRCBsYWJlbHNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXN1OiAgdG9wLWxldmVsIE9JRHMgbXVzdCBoYXZlICcuJyBwcmVmaXggKFVDRC1zdHlsZSlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXNzIFNVRkZJWDogIEFwcGVuZCBhbGwgdGV4dHVhbCBPSURzIHdpdGggU1VGRklYIGJlZm9yZSBwYXJzaW5nXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzUyBQUkVGSVg6ICBQcmVwZW5kIGFsbCB0ZXh0dWFsIE9JRHMgd2l0aCBQUkVGSVggYmVmb3JlIHBhcnNpbmdcbiIsCiAgICAgICAgICAgIGxlYWQpOwp9CgovKioqCiAqCiAqLyAKdm9pZApyZWdpc3Rlcl9taWJfaGFuZGxlcnModm9pZCkKewojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcigic25tcCIsICJtaWJkaXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX21pYmRpcnNfY29uZiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlttaWItZGlyc3wrbWliLWRpcnN8LW1pYi1kaXJzXSIpOwogICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcigic25tcCIsICJtaWJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX21pYnNfY29uZiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlttaWItdG9rZW5zfCttaWItdG9rZW5zXSIpOwogICAgcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoInNubXAiLCAibWliZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfbWliZmlsZV9jb25mLCBOVUxMLCAibWliZmlsZS10by1yZWFkIik7CiAgICAvKgogICAgICogcmVnaXN0ZXIgdGhlIHNubXAuY29uZiBjb25maWd1cmF0aW9uIGhhbmRsZXJzIGZvciBkZWZhdWx0CiAgICAgKiBwYXJzaW5nIGJlaGF2aW91ciAKICAgICAqLwoKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJzaG93TWliRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9FUlJPUlMpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImNvbW1lbnRUb0VPTCIsICAgICAvKiBEZXNjcmliZXMgYWN0dWFsIGJlaGF2aW91ciAqLwogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX0NPTU1FTlRfVEVSTSk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAic3RyaWN0Q29tbWVudFRlcm0iLCAgICAvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfQ09NTUVOVF9URVJNKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJtaWJBbGxvd1VuZGVybGluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfUEFSU0VfTEFCRUwpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgIm1pYldhcm5pbmdMZXZlbCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgIm1pYlJlcGxhY2VXaXRoTGF0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9SRVBMQUNFKTsKI2VuZGlmCgogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInByaW50TnVtZXJpY0VudW1zIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSk7CiAgICByZWdpc3Rlcl9wcmVuZXRzbm1wX21pYl9oYW5kbGVyKCJzbm1wIiwgInByaW50TnVtZXJpY09pZHMiLAogICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9wcmludF9udW1lcmljLCBOVUxMLCAiKDF8eWVzfHRydWV8MHxub3xmYWxzZSkiKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJlc2NhcGVRdW90ZXMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiZG9udEJyZWFrZG93bk9pZHMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9CUkVBS0RPV05fT0lEUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicXVpY2tQcmludGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAibnVtZXJpY1RpbWV0aWNrcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fSU5URUdFUiwgInNubXAiLCAib2lkT3V0cHV0Rm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJzdWZmaXhQcmludGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiZXh0ZW5kZWRJbmRleCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FWFRFTkRFRF9JTkRFWCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicHJpbnRIZXhUZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0hFWF9URVhUKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJwcmludFZhbHVlT25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9CQVJFX1ZBTFVFKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJkb250UHJpbnRVbml0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX1BSSU5UX1VOSVRTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJoZXhPdXRwdXRMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfSEVYX09VVFBVVF9MRU5HVEgpOwp9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKgogKiBmdW5jdGlvbiA6IG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkKICogICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgc3RyaW5nIG9mIHRoZSBkaXJlY3RvcmllcwogKiAgICAgICAgICAgICAgZnJvbSB3aGljaCB0aGUgTUlCIG1vZHVsZXMgd2lsbCBiZSBzZWFyY2hlZCBvcgogKiAgICAgICAgICAgICAgbG9hZGVkLgogKiBhcmd1bWVudHM6IGNvbnN0IGNoYXIgKmRpciwgd2hpY2ggYXJlIHRoZSBkaXJlY3RvcmllcwogKiAgICAgICAgICAgICAgZnJvbSB3aGljaCB0aGUgTUlCIG1vZHVsZXMgd2lsbCBiZSBzZWFyY2hlZCBvcgogKiAgICAgICAgICAgICAgbG9hZGVkLgogKiByZXR1cm5zICA6IC0KICovCnZvaWQKbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShjb25zdCBjaGFyICpkaXIpCnsKICAgIGNvbnN0IGNoYXIgKm5ld2RpcjsKICAgIGNoYXIgKm9sZGRpciwgKnRtcGRpciA9IE5VTEw7CgogICAgREVCVUdUUkFDRTsKICAgIGlmIChOVUxMID09IGRpcikgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgb2xkZGlyID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQkRJUlMpOwogICAgaWYgKG9sZGRpcikgewogICAgICAgIGlmICgoKmRpciA9PSAnKycpIHx8ICgqZGlyID09ICctJykpIHsKICAgICAgICAgICAgLyoqIE5ldyBkaXIgc3RhcnRzIHdpdGggJysnLCB0aHVzIHdlIGFkZCBpdC4gKi8KICAgICAgICAgICAgdG1wZGlyID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGRpcikgKyBzdHJsZW4ob2xkZGlyKSArIDIpOwogICAgICAgICAgICBpZiAoIXRtcGRpcikgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAic2V0IG1pYmRpciBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgqZGlyKysgPT0gJysnKQogICAgICAgICAgICAgICAgc3ByaW50Zih0bXBkaXIsICIlcyVjJXMiLCBvbGRkaXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgZGlyKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50Zih0bXBkaXIsICIlcyVjJXMiLCBkaXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgb2xkZGlyKTsKICAgICAgICAgICAgbmV3ZGlyID0gdG1wZGlyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld2RpciA9IGRpcjsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIC8qKiBJZiBkaXIgc3RhcnRzIHdpdGggJysnIHNraXAgJysnIGl0LiAqLwogICAgICAgIG5ld2RpciA9ICgoKmRpciA9PSAnKycpID8gKytkaXIgOiBkaXIpOwogICAgfQogICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCRElSUywKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdkaXIpOwoKICAgIC8qKiBzZXRfc3RyaW5nIGNhbGxzIHN0cmR1cCwgc28gaWYgd2UgYWxsb2NhdGVkIG1lbW9yeSwgZnJlZSBpdCAqLwogICAgaWYgKHRtcGRpciA9PSBuZXdkaXIpIHsKICAgICAgICBTTk1QX0ZSRUUodG1wZGlyKTsKICAgIH0KfQoKLyoKICogZnVuY3Rpb24gOiBuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5CiAqICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGRpcmVjdG9yaWVzCiAqICAgICAgICAgICAgICBmcm9tIHdoaWNoIHRoZSBNSUIgbW9kdWxlcyB3aWxsIGJlIHNlYXJjaGVkIG9yCiAqICAgICAgICAgICAgICBsb2FkZWQuCiAqICAgICAgICAgICAgICBJZiB0aGUgdmFsdWUgc3RpbGwgZG9lcyBub3QgZXhpc3RzLCBpdCB3aWxsIGJlIG1hZGUKICogICAgICAgICAgICAgIGZyb20gdGhlIGV2aXJvbm1lbnQgdmFyaWFibGUgJ01JQkRJUlMnIGFuZC9vciB0aGUKICogICAgICAgICAgICAgIGRlZmF1bHQuCiAqIGFyZ3VtZW50czogLQogKiByZXR1cm5zICA6IGNoYXIgKiBvZiB0aGUgZGlyZWN0b3JpZXMgaW4gd2hpY2ggdGhlIE1JQiBtb2R1bGVzCiAqICAgICAgICAgICAgd2lsbCBiZSBzZWFyY2hlZC9sb2FkZWQuCiAqLwoKY2hhciAqCm5ldHNubXBfZ2V0X21pYl9kaXJlY3Rvcnkodm9pZCkKewogICAgY2hhciAqZGlyOwoKICAgIERFQlVHVFJBQ0U7CiAgICBkaXIgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJESVJTKTsKICAgIGlmIChkaXIgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJubyBtaWIgZGlyZWN0b3JpZXMgc2V0XG4iKSk7CgogICAgICAgIC8qKiBDaGVjayBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0ICovCiAgICAgICAgZGlyID0gbmV0c25tcF9nZXRlbnYoIk1JQkRJUlMiKTsKICAgICAgICBpZiAoZGlyID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm5vIG1pYiBkaXJlY3RvcmllcyBzZXQgYnkgZW52aXJvbm1lbnRcbiIpKTsKICAgICAgICAgICAgLyoqIE5vdCBzZXQgdXNlIGhhcmQgY29kZWQgcGF0aCAqLwogICAgICAgICAgICBpZiAoY29uZm1pYmRpciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibm8gbWliIGRpcmVjdG9yaWVzIHNldCBieSBjb25maWdcbiIpKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoTkVUU05NUF9ERUZBVUxUX01JQkRJUlMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCgqY29uZm1pYmRpciA9PSAnKycpIHx8ICgqY29uZm1pYmRpciA9PSAnLScpKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCBieSBjb25maWcgKGJ1dCBhZGRlZClcbiIpKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoTkVUU05NUF9ERUZBVUxUX01JQkRJUlMpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShjb25mbWliZGlyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGNvbmZpZ1xuIikpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShjb25mbWliZGlyKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoKCpkaXIgPT0gJysnKSB8fCAoKmRpciA9PSAnLScpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGVudmlyb25tZW50IChidXQgYWRkZWQpXG4iKSk7CiAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoTkVUU05NUF9ERUZBVUxUX01JQkRJUlMpOwogICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGRpcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgZW52aXJvbm1lbnRcbiIpKTsKICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShkaXIpOwogICAgICAgIH0KICAgICAgICBkaXIgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJESVJTKTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0ICclcydcbiIsIGRpcikpOwogICAgcmV0dXJuKGRpcik7Cn0KCi8qCiAqIGZ1bmN0aW9uIDogbmV0c25tcF9maXh1cF9taWJfZGlyZWN0b3J5CiAqIGFyZ3VtZW50czogLQogKiByZXR1cm5zICA6IC0KICovCnZvaWQKbmV0c25tcF9maXh1cF9taWJfZGlyZWN0b3J5KHZvaWQpCnsKICAgIGNoYXIgKmhvbWVwYXRoID0gbmV0c25tcF9nZXRlbnYoIkhPTUUiKTsKICAgIGNoYXIgKm1pYnBhdGggPSBuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KCk7CiAgICBjaGFyICpvbGRtaWJwYXRoID0gTlVMTDsKICAgIGNoYXIgKnB0cl9ob21lOwogICAgY2hhciAqbmV3X21pYnBhdGg7CgogICAgREVCVUdUUkFDRTsKICAgIGlmIChob21lcGF0aCAmJiBtaWJwYXRoKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImZpeHVwX21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzICclcydcbiIsIG1pYnBhdGgpKTsKICAgICAgICB3aGlsZSAoKHB0cl9ob21lID0gc3Ryc3RyKG1pYnBhdGgsICIkSE9NRSIpKSkgewogICAgICAgICAgICBuZXdfbWlicGF0aCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihtaWJwYXRoKSAtIHN0cmxlbigiJEhPTUUiKSArCgkJCQkJIHN0cmxlbihob21lcGF0aCkrMSk7CiAgICAgICAgICAgIGlmIChuZXdfbWlicGF0aCkgewogICAgICAgICAgICAgICAgKnB0cl9ob21lID0gMDsgLyogbnVsbCBvdXQgdGhlIHNwb3Qgd2hlcmUgd2Ugc3RvcCBjb3B5aW5nICovCiAgICAgICAgICAgICAgICBzcHJpbnRmKG5ld19taWJwYXRoLCAiJXMlcyVzIiwgbWlicGF0aCwgaG9tZXBhdGgsCgkJCXB0cl9ob21lICsgc3RybGVuKCIkSE9NRSIpKTsKICAgICAgICAgICAgICAgIC8qKiBzd2FwIGluIHRoZSBuZXcgdmFsdWUgYW5kIHJlcGVhdCAqLwogICAgICAgICAgICAgICAgbWlicGF0aCA9IG5ld19taWJwYXRoOwoJCWlmIChvbGRtaWJwYXRoICE9IE5VTEwpIHsKCQkgICAgU05NUF9GUkVFKG9sZG1pYnBhdGgpOwoJCX0KCQlvbGRtaWJwYXRoID0gbmV3X21pYnBhdGg7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShtaWJwYXRoKTsKCQoJLyogIFRoZSBhYm92ZSBjb3BpZXMgdGhlIG1pYnBhdGggZm9yIHVzLCBzby4uLiAgKi8KCglpZiAob2xkbWlicGF0aCAhPSBOVUxMKSB7CgkgICAgU05NUF9GUkVFKG9sZG1pYnBhdGgpOwoJfQoKICAgIH0KCn0KCi8qKgogKiBJbml0aWFsaXNlcyB0aGUgbWliIHJlYWRlci4KICoKICogUmVhZHMgaW4gYWxsIHNldHRpbmdzIGZyb20gdGhlIGVudmlyb25tZW50LgogKi8Kdm9pZApuZXRzbm1wX2luaXRfbWliKHZvaWQpCnsKICAgIGNvbnN0IGNoYXIgICAgICpwcmVmaXg7CiAgICBjaGFyICAgICAgICAgICAqZW52X3ZhciwgKmVudHJ5OwogICAgUHJlZml4TGlzdFB0ciAgIHBwID0gJm1pYl9wcmVmaXhlc1swXTsKICAgIGNoYXIgICAgICAgICAgICpzdCA9IE5VTEw7CgogICAgaWYgKE1pYikKICAgICAgICByZXR1cm47CiAgICBuZXRzbm1wX2luaXRfbWliX2ludGVybmFscygpOwoKICAgIC8qCiAgICAgKiBJbml0aWFsaXNlIHRoZSBNSUIgZGlyZWN0b3J5L2llcyAKICAgICAqLwogICAgbmV0c25tcF9maXh1cF9taWJfZGlyZWN0b3J5KCk7CiAgICBlbnZfdmFyID0gc3RyZHVwKG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkoKSk7CiAgICBuZXRzbm1wX21pYmluZGV4X2xvYWQoKTsKCiAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLAogICAgICAgICAgICAgICAgIlNlZW4gTUlCRElSUzogTG9va2luZyBpbiAnJXMnIGZvciBtaWIgZGlycyAuLi5cbiIsCiAgICAgICAgICAgICAgICBlbnZfdmFyKSk7CgogICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgYWRkX21pYmRpcihlbnRyeSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgfQogICAgU05NUF9GUkVFKGVudl92YXIpOwoKICAgIGVudl92YXIgPSBuZXRzbm1wX2dldGVudigiTUlCRklMRVMiKTsKICAgIGlmIChlbnZfdmFyICE9IE5VTEwpIHsKICAgICAgICBpZiAoKmVudl92YXIgPT0gJysnKQogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIrMSwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICAgICAgYWRkX21pYmZpbGUoZW50cnksIE5VTEwsIE5VTEwpOwogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgfQogICAgfQoKICAgIG5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKCk7CgogICAgLyoKICAgICAqIFJlYWQgaW4gYW55IG1vZHVsZXMgb3IgbWlicyByZXF1ZXN0ZWQgCiAgICAgKi8KCiAgICBlbnZfdmFyID0gbmV0c25tcF9nZXRlbnYoIk1JQlMiKTsKICAgIGlmIChlbnZfdmFyID09IE5VTEwpIHsKICAgICAgICBpZiAoY29uZm1pYnMgIT0gTlVMTCkKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChjb25mbWlicyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBlbnZfdmFyID0gc3RyZHVwKE5FVFNOTVBfREVGQVVMVF9NSUJTKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZW52X3ZhciA9IHN0cmR1cChlbnZfdmFyKTsKICAgIH0KICAgIGlmIChlbnZfdmFyICYmICgoKmVudl92YXIgPT0gJysnKSB8fCAoKmVudl92YXIgPT0gJy0nKSkpIHsKICAgICAgICBlbnRyeSA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oTkVUU05NUF9ERUZBVUxUX01JQlMpICsgc3RybGVuKGVudl92YXIpICsgMik7CiAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLCAiZW52IG1pYnMgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgU05NUF9GUkVFKGVudl92YXIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCplbnZfdmFyID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYoZW50cnksICIlcyVjJXMiLCBORVRTTk1QX0RFRkFVTFRfTUlCUywgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyKzEpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgZW52X3ZhcisxLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfREVGQVVMVF9NSUJTICk7CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgICAgICBlbnZfdmFyID0gZW50cnk7CiAgICB9CgogICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICJTZWVuIE1JQlM6IExvb2tpbmcgaW4gJyVzJyBmb3IgbWliIGZpbGVzIC4uLlxuIiwKICAgICAgICAgICAgICAgIGVudl92YXIpKTsKICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgIGlmIChzdHJjYXNlY21wKGVudHJ5LCBERUJVR19BTFdBWVNfVE9LRU4pID09IDApIHsKICAgICAgICAgICAgcmVhZF9hbGxfbWlicygpOwogICAgICAgIH0gZWxzZSBpZiAoc3Ryc3RyKGVudHJ5LCAiLyIpICE9IE5VTEwpIHsKICAgICAgICAgICAgcmVhZF9taWIoZW50cnkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ldHNubXBfcmVhZF9tb2R1bGUoZW50cnkpOwogICAgICAgIH0KICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICB9CiAgICBhZG9wdF9vcnBoYW5zKCk7CiAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CgogICAgZW52X3ZhciA9IG5ldHNubXBfZ2V0ZW52KCJNSUJGSUxFUyIpOwogICAgaWYgKGVudl92YXIgIT0gTlVMTCkgewogICAgICAgIGlmICgoKmVudl92YXIgPT0gJysnKSB8fCAoKmVudl92YXIgPT0gJy0nKSkgewojaWZkZWYgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTCiAgICAgICAgICAgIGVudHJ5ID0KICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGVudl92YXIpICsgMik7CiAgICAgICAgICAgIGlmICghZW50cnkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsICJlbnYgbWliZmlsZXMgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgqZW52X3ZhcisrID09ICcrJykKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyICk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIGVudl92YXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgICAgICAgICAgZW52X3ZhciA9IGVudHJ5OwojZWxzZQogICAgICAgICAgICBlbnZfdmFyID0gc3RyZHVwKGVudl92YXIgKyAxKTsKI2VuZGlmCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChlbnZfdmFyKTsKICAgICAgICB9CiAgICB9IGVsc2UgewojaWZkZWYgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTCiAgICAgICAgZW52X3ZhciA9IHN0cmR1cChORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMpOwojZW5kaWYKICAgIH0KCiAgICBpZiAoZW52X3ZhciAhPSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICAgICAiU2VlbiBNSUJGSUxFUzogTG9va2luZyBpbiAnJXMnIGZvciBtaWIgZmlsZXMgLi4uXG4iLAogICAgICAgICAgICAgICAgICAgIGVudl92YXIpKTsKICAgICAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgICAgIHJlYWRfbWliKGVudHJ5KTsKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICB9CgogICAgcHJlZml4ID0gbmV0c25tcF9nZXRlbnYoIlBSRUZJWCIpOwoKICAgIGlmICghcHJlZml4KQogICAgICAgIHByZWZpeCA9IFN0YW5kYXJkX1ByZWZpeDsKCiAgICBQcmVmaXggPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHByZWZpeCkgKyAyKTsKICAgIGlmICghUHJlZml4KQogICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsICJQcmVmaXggbWFsbG9jIGZhaWxlZCIpKTsKICAgIGVsc2UKICAgICAgICBzdHJjcHkoUHJlZml4LCBwcmVmaXgpOwoKICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAiU2VlbiBQUkVGSVg6IExvb2tpbmcgaW4gJyVzJyBmb3IgcHJlZml4IC4uLlxuIiwgUHJlZml4KSk7CgogICAgLyoKICAgICAqIHJlbW92ZSB0cmFpbGluZyBkb3QgCiAgICAgKi8KICAgIGlmIChQcmVmaXgpIHsKICAgICAgICBlbnZfdmFyID0gJlByZWZpeFtzdHJsZW4oUHJlZml4KSAtIDFdOwogICAgICAgIGlmICgqZW52X3ZhciA9PSAnLicpCiAgICAgICAgICAgICplbnZfdmFyID0gJ1wwJzsKICAgIH0KCiAgICBwcC0+c3RyID0gUHJlZml4OyAgICAgICAgICAgLyogZml4dXAgZmlyc3QgbWliX3ByZWZpeCBlbnRyeSAqLwogICAgLyoKICAgICAqIG5vdyB0aGF0IHRoZSBsaXN0IG9mIHByZWZpeGVzIGlzIGJ1aWx0LCBzYXZlIGVhY2ggc3RyaW5nIGxlbmd0aC4gCiAgICAgKi8KICAgIHdoaWxlIChwcC0+c3RyKSB7CiAgICAgICAgcHAtPmxlbiA9IHN0cmxlbihwcC0+c3RyKTsKICAgICAgICBwcCsrOwogICAgfQoKICAgIE1pYiA9IHRyZWVfaGVhZDsgICAgICAgICAgICAvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogICAgdHJlZV90b3AgPSAoc3RydWN0IHRyZWUgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdHJlZSkpOwogICAgLyoKICAgICAqIFhYIGVycm9yIGNoZWNrID8gCiAgICAgKi8KICAgIGlmICh0cmVlX3RvcCkgewogICAgICAgIHRyZWVfdG9wLT5sYWJlbCA9IHN0cmR1cCgiKHRvcCkiKTsKICAgICAgICB0cmVlX3RvcC0+Y2hpbGRfbGlzdCA9IHRyZWVfaGVhZDsKICAgIH0KfQoKI2lmbmRlZiBORVRTTk1QX05PX0xFR0FDWV9ERUZJTklUSU9OUwp2b2lkCmluaXRfbWliKHZvaWQpCnsKICAgIG5ldHNubXBfaW5pdF9taWIoKTsKfQojZW5kaWYKCgovKgogKiBIYW5kbGUgTUlCIGluZGV4ZXMgY2VudHJhbGx5CiAqLwpzdGF0aWMgaW50IF9taWJpbmRleCAgICAgPSAwOyAgIC8qIExhc3QgaW5kZXggaW4gdXNlICovCnN0YXRpYyBpbnQgX21pYmluZGV4X21heCA9IDA7ICAgLyogU2l6ZSBvZiBpbmRleCBhcnJheSAqLwpjaGFyICAgICAqKl9taWJpbmRleGVzICAgPSBOVUxMOwoKaW50IF9taWJpbmRleF9hZGQoIGNvbnN0IGNoYXIgKmRpcm5hbWUsIGludCBpICk7CnZvaWQKbmV0c25tcF9taWJpbmRleF9sb2FkKCB2b2lkICkKewogICAgRElSICpkaXI7CiAgICBzdHJ1Y3QgZGlyZW50ICpmaWxlOwogICAgRklMRSAqZnA7CiAgICBjaGFyIHRtcGJ1ZlsgMzAwXTsKICAgIGNoYXIgdG1wYnVmMlszMDBdOwogICAgaW50ICBpOwogICAgY2hhciAqY3A7CgogICAgLyoKICAgICAqIE9wZW4gdGhlIE1JQiBpbmRleCBkaXJlY3RvcnksIG9yIGNyZWF0ZSBpdCAoZW1wdHkpCiAgICAgKi8KICAgIHNucHJpbnRmKCB0bXBidWYsIHNpemVvZih0bXBidWYpLCAiJXMvbWliX2luZGV4ZXMiLAogICAgICAgICAgICAgIGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpKTsKICAgIHRtcGJ1ZltzaXplb2YodG1wYnVmKS0xXSA9IDA7CiAgICBkaXIgPSBvcGVuZGlyKCB0bXBidWYgKTsKICAgIGlmICggZGlyID09IE5VTEwgKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgImxvYWQ6IChuZXcpXG4iKSk7CiAgICAgICAgbWtkaXJoaWVyKCB0bXBidWYsIE5FVFNOTVBfQUdFTlRfRElSRUNUT1JZX01PREUsIDApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKgogICAgICogQ3JlYXRlIGEgbGlzdCBvZiB3aGljaCBkaXJlY3RvcnkgZWFjaCBmaWxlIHJlZmVycyB0bwogICAgICovCiAgICB3aGlsZSAoKGZpbGUgPSByZWFkZGlyKCBkaXIgKSkpIHsKICAgICAgICBpZiAoICFpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKShmaWxlLT5kX25hbWVbMF0pKSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaSA9IGF0b2koIGZpbGUtPmRfbmFtZSApOwoKICAgICAgICBzbnByaW50ZiggdG1wYnVmLCBzaXplb2YodG1wYnVmKSwgIiVzL21pYl9pbmRleGVzLyVkIiwKICAgICAgICAgICAgICBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKSwgaSApOwogICAgICAgIHRtcGJ1ZltzaXplb2YodG1wYnVmKS0xXSA9IDA7CiAgICAgICAgZnAgPSBmb3BlbiggdG1wYnVmLCAiciIgKTsKICAgICAgICBpZiAoIWZwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjcCA9IGZnZXRzKCB0bXBidWYyLCBzaXplb2YodG1wYnVmMiksIGZwICk7CiAgICAgICAgaWYgKCAhY3AgKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJFbXB0eSBNSUIgaW5kZXggKCVkKVxuIiwgaSkpOwogICAgICAgICAgICBmY2xvc2UoZnApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdG1wYnVmMltzdHJsZW4odG1wYnVmMiktMV0gPSAwOwogICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJsb2FkOiAoJWQpICVzXG4iLCBpLCB0bXBidWYyKSk7CiAgICAgICAgKHZvaWQpX21pYmluZGV4X2FkZCggdG1wYnVmMis0LCBpICk7ICAvKiBTa2lwICdESVIgJyAqLwogICAgICAgIGZjbG9zZSggZnAgKTsKICAgIH0KICAgIGNsb3NlZGlyKCBkaXIgKTsKfQoKY2hhciAqCm5ldHNubXBfbWliaW5kZXhfbG9va3VwKCBjb25zdCBjaGFyICpkaXJuYW1lICkKewogICAgaW50IGk7CiAgICBzdGF0aWMgY2hhciB0bXBidWZbMzAwXTsKCiAgICBmb3IgKGk9MDsgaTxfbWliaW5kZXg7IGkrKykgewogICAgICAgIGlmICggX21pYmluZGV4ZXNbaV0gJiYKICAgICAgICAgICAgIHN0cmNtcCggX21pYmluZGV4ZXNbaV0sIGRpcm5hbWUgKSA9PSAwKSB7CiAgICAgICAgICAgICBzbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLCAiJXMvbWliX2luZGV4ZXMvJWQiLAogICAgICAgICAgICAgICAgICAgICAgZ2V0X3BlcnNpc3RlbnRfZGlyZWN0b3J5KCksIGkpOwogICAgICAgICAgICAgdG1wYnVmW3NpemVvZih0bXBidWYpLTFdID0gMDsKICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJsb29rdXA6ICVzICglZCkgJXNcbiIsIGRpcm5hbWUsIGksIHRtcGJ1ZiApKTsKICAgICAgICAgICAgIHJldHVybiB0bXBidWY7CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgImxvb2t1cDogKG5vbmUpXG4iKSk7CiAgICByZXR1cm4gTlVMTDsKfQoKaW50Cl9taWJpbmRleF9hZGQoIGNvbnN0IGNoYXIgKmRpcm5hbWUsIGludCBpICkKewogICAgY29uc3QgaW50IG9sZF9taWJpbmRleF9tYXggPSBfbWliaW5kZXhfbWF4OwoKICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJhZGQ6ICVzICglZClcbiIsIGRpcm5hbWUsIGkgKSk7CiAgICBpZiAoIGkgPT0gLTEgKQogICAgICAgIGkgPSBfbWliaW5kZXgrKzsKICAgIGlmICggaSA+PSBfbWliaW5kZXhfbWF4ICkgewogICAgICAgIC8qCiAgICAgICAgICogSWYgdGhlIGluZGV4IGFycmF5IGlzIGZ1bGwgKG9yIG5vbi1leGlzdGVudCkKICAgICAgICAgKiAgIHRoZW4gZXhwYW5kIChvciBjcmVhdGUpIGl0CiAgICAgICAgICovCiAgICAgICAgX21pYmluZGV4X21heCA9IGkgKyAxMDsKICAgICAgICBfbWliaW5kZXhlcyA9IHJlYWxsb2MoX21pYmluZGV4ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9taWJpbmRleF9tYXggKiBzaXplb2YoX21pYmluZGV4ZXNbMF0pKTsKICAgICAgICBuZXRzbm1wX2Fzc2VydChfbWliaW5kZXhlcyk7CiAgICAgICAgbWVtc2V0KF9taWJpbmRleGVzICsgb2xkX21pYmluZGV4X21heCwgMCwKICAgICAgICAgICAgICAgKF9taWJpbmRleF9tYXggLSBvbGRfbWliaW5kZXhfbWF4KSAqIHNpemVvZihfbWliaW5kZXhlc1swXSkpOwogICAgfQoKICAgIF9taWJpbmRleGVzWyBpIF0gPSBzdHJkdXAoIGRpcm5hbWUgKTsKICAgIGlmICggaSA+PSBfbWliaW5kZXggKQogICAgICAgIF9taWJpbmRleCA9IGkrMTsKCiAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAiYWRkOiAlZC8lZC8lZFxuIiwgaSwgX21pYmluZGV4LCBfbWliaW5kZXhfbWF4ICkpOwogICAgcmV0dXJuIGk7Cn0KICAgIApGSUxFICoKbmV0c25tcF9taWJpbmRleF9uZXcoIGNvbnN0IGNoYXIgKmRpcm5hbWUgKQp7CiAgICBGSUxFICpmcDsKICAgIGNoYXIgIHRtcGJ1ZlszMDBdOwogICAgY2hhciAqY3A7CiAgICBpbnQgICBpOwoKICAgIGNwID0gbmV0c25tcF9taWJpbmRleF9sb29rdXAoIGRpcm5hbWUgKTsKICAgIGlmICghY3ApIHsKICAgICAgICBpICA9IF9taWJpbmRleF9hZGQoIGRpcm5hbWUsIC0xICk7CiAgICAgICAgc25wcmludGYoIHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIlcy9taWJfaW5kZXhlcy8lZCIsCiAgICAgICAgICAgICAgICAgIGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpLCBpICk7CiAgICAgICAgdG1wYnVmW3NpemVvZih0bXBidWYpLTFdID0gMDsKICAgICAgICBjcCA9IHRtcGJ1ZjsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJuZXc6ICVzICglcylcbiIsIGRpcm5hbWUsIGNwICkpOwogICAgZnAgPSBmb3BlbiggY3AsICJ3IiApOwogICAgaWYgKGZwKQogICAgICAgIGZwcmludGYoIGZwLCAiRElSICVzXG4iLCBkaXJuYW1lICk7CiAgICByZXR1cm4gZnA7Cn0KCgovKioKICogVW5sb2FkcyBhbGwgbWlicy4KICovCnZvaWQKc2h1dGRvd25fbWliKHZvaWQpCnsKICAgIHVubG9hZF9hbGxfbWlicygpOwogICAgaWYgKHRyZWVfdG9wKSB7CiAgICAgICAgaWYgKHRyZWVfdG9wLT5sYWJlbCkKICAgICAgICAgICAgU05NUF9GUkVFKHRyZWVfdG9wLT5sYWJlbCk7CiAgICAgICAgU05NUF9GUkVFKHRyZWVfdG9wKTsKICAgIH0KICAgIHRyZWVfaGVhZCA9IE5VTEw7CiAgICBNaWIgPSBOVUxMOwogICAgaWYgKF9taWJpbmRleGVzKSB7CiAgICAgICAgaW50IGk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IF9taWJpbmRleDsgKytpKQogICAgICAgICAgICBTTk1QX0ZSRUUoX21pYmluZGV4ZXNbaV0pOwogICAgICAgIGZyZWUoX21pYmluZGV4ZXMpOwogICAgICAgIF9taWJpbmRleCA9IDA7CiAgICAgICAgX21pYmluZGV4X21heCA9IDA7CiAgICAgICAgX21pYmluZGV4ZXMgPSBOVUxMOwogICAgfQogICAgaWYgKFByZWZpeCAhPSBOVUxMICYmIFByZWZpeCAhPSAmU3RhbmRhcmRfUHJlZml4WzBdKQogICAgICAgIFNOTVBfRlJFRShQcmVmaXgpOwogICAgaWYgKFByZWZpeCkKICAgICAgICBQcmVmaXggPSBOVUxMOwogICAgU05NUF9GUkVFKGNvbmZtaWJzKTsKICAgIFNOTVBfRlJFRShjb25mbWliZGlyKTsKfQoKLyoqCiAqIFByaW50cyB0aGUgTUlCcyB0byB0aGUgZmlsZSBmcC4KICoKICogQHBhcmFtIGZwICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICovCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9QUklOVF9NSUIKdm9pZApwcmludF9taWIoRklMRSAqIGZwKQp7CiAgICBwcmludF9zdWJ0cmVlKGZwLCB0cmVlX2hlYWQsIDApOwp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1BSSU5UX01JQiAqLwoKdm9pZApwcmludF9hc2NpaV9kdW1wKEZJTEUgKiBmcCkKewogICAgZnByaW50ZihmcCwgImR1bXAgREVGSU5JVElPTlMgOjo9IEJFR0lOXG4iKTsKICAgIHByaW50X2FzY2lpX2R1bXBfdHJlZShmcCwgdHJlZV9oZWFkLCAwKTsKICAgIGZwcmludGYoZnAsICJFTkRcbiIpOwp9CgoKLyoqCiAqIFNldCdzIHRoZSBwcmludGluZyBmdW5jdGlvbiBwcmludG9tYXQgaW4gYSBzdWJ0cmVlIGFjY29yZGluZwogKiBpdCdzIHR5cGUKICoKICogQHBhcmFtIHN1YnRyZWUgICAgVGhlIHN1YnRyZWUgdG8gc2V0LgogKi8Kdm9pZApzZXRfZnVuY3Rpb24oc3RydWN0IHRyZWUgKnN1YnRyZWUpCnsKICAgIHN1YnRyZWUtPnByaW50ZXIgPSBOVUxMOwogICAgc3dpdGNoIChzdWJ0cmVlLT50eXBlKSB7CiAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2Nfb2JqZWN0X2lkZW50aWZpZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfaW50ZWdlcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfaW50ZWdlcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9ORVRBRERSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX25ldHdvcmthZGRyZXNzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19pcGFkZHJlc3M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfQ09VTlRFUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19jb3VudGVyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0dBVUdFOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2dhdWdlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY190aW1ldGlja3M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfT1BBUVVFOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX29wYXF1ZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9OVUxMOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX251bGw7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfQklUU1RSSU5HOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2JpdHN0cmluZzsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9OU0FQQUREUkVTUzoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19uc2FwYWRkcmVzczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9DT1VOVEVSNjQ6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfY291bnRlcjY0OwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX3VpbnRlZ2VyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfZ2F1Z2U7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfT1RIRVI6CiAgICBkZWZhdWx0OgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2J5X3R5cGU7CiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCi8qKgogKiBSZWFkcyBhbiBvYmplY3QgaWRlbnRpZmllciBmcm9tIGFuIGlucHV0IHN0cmluZyBpbnRvIGludGVybmFsIE9JRCBmb3JtLgogKiAKICogV2hlbiBjYWxsZWQsIG91dF9sZW4gbXVzdCBob2xkIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGFycmF5LgogKgogKiBAcGFyYW0gaW5wdXQgICAgIHRoZSBpbnB1dCBzdHJpbmcuCiAqIEBwYXJhbSBvdXRwdXQgICAgdGhlIG9pZCB3aXJ0ZS4KICogQHBhcmFtIG91dF9sZW4gICBudW1iZXIgb2Ygc3ViaWQncyBpbiBvdXRwdXQuCiAqIAogKiBAcmV0dXJuIDEgaWYgc3VjY2Vzc2Z1bC4KICogCiAqIElmIGFuIGVycm9yIG9jY3VycywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgYW5kIE1BWSBzZXQgc25tcF9lcnJuby4KICogc25tcF9lcnJubyBpcyBOT1Qgc2V0IGlmIFNFVF9TTk1QX0VSUk9SIGV2YWx1YXRlcyB0byBub3RoaW5nLgogKiBUaGlzIGNhbiBtYWtlIG11bHRpLXRocmVhZGVkIHVzZSBhIHRpbnkgYml0IG1vcmUgcm9idXN0LgogKi8KaW50CnJlYWRfb2JqaWQoY29uc3QgY2hhciAqaW5wdXQsIG9pZCAqIG91dHB1dCwgc2l6ZV90ICogb3V0X2xlbikKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3ViaWQncyBpbiAib3V0cHV0IiAqLwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgc3RydWN0IHRyZWUgICAgKnJvb3QgPSB0cmVlX3RvcDsKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgY2hhciAgICAgICAgICAgIGJ1ZltTUFJJTlRfTUFYX0xFTl07CiAgICBpbnQgICAgICAgICAgICAgcmV0LCBtYXhfb3V0X2xlbjsKICAgIGNoYXIgICAgICAgICAgICpuYW1lLCBjaDsKICAgIGNvbnN0IGNoYXIgICAgICpjcDsKCiAgICBjcCA9IGlucHV0OwogICAgd2hpbGUgKChjaCA9ICpjcCkpIHsKICAgICAgICBpZiAoKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpCiAgICAgICAgICAgIHx8ICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKQogICAgICAgICAgICB8fCAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykKICAgICAgICAgICAgfHwgY2ggPT0gJy0nKQogICAgICAgICAgICBjcCsrOwogICAgICAgIGVsc2UKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBpZiAoY2ggPT0gJzonKQogICAgICAgIHJldHVybiBnZXRfbm9kZShpbnB1dCwgb3V0cHV0LCBvdXRfbGVuKTsKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKICAgIGlmICgqaW5wdXQgPT0gJy4nKQogICAgICAgIGlucHV0Kys7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBlbHNlIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkVBRF9VQ0RfU1RZTEVfT0lEKSkgewogICAgICAgIC8qCiAgICAgICAgICogZ2V0IHBhc3QgbGVhZGluZyAnLicsIGFwcGVuZCAnLicgdG8gUHJlZml4LiAKICAgICAgICAgKi8KICAgICAgICBpZiAoKlByZWZpeCA9PSAnLicpCiAgICAgICAgICAgIHN0cmxjcHkoYnVmLCBQcmVmaXggKyAxLCBzaXplb2YoYnVmKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBzdHJsY3B5KGJ1ZiwgUHJlZml4LCBzaXplb2YoYnVmKSk7CiAgICAgICAgc3RybGNhdChidWYsICIuIiwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIHN0cmxjYXQoYnVmLCBpbnB1dCwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIGlucHV0ID0gYnVmOwogICAgfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKChyb290ID09IE5VTEwpICYmICh0cmVlX2hlYWQgIT0gTlVMTCkpIHsKICAgICAgICByb290ID0gdHJlZV9oZWFkOwogICAgfQogICAgZWxzZSBpZiAocm9vdCA9PSBOVUxMKSB7CiAgICAgICAgU0VUX1NOTVBfRVJST1IoU05NUEVSUl9OT01JQik7CiAgICAgICAgKm91dF9sZW4gPSAwOwogICAgICAgIHJldHVybiAwOwogICAgfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICBuYW1lID0gc3RyZHVwKGlucHV0KTsKICAgIG1heF9vdXRfbGVuID0gKm91dF9sZW47CiAgICAqb3V0X2xlbiA9IDA7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBpZiAoKHJldCA9CiAgICAgICAgIF9hZGRfc3RyaW5nc190b19vaWQocm9vdCwgbmFtZSwgb3V0cHV0LCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9vdXRfbGVuKSkgPD0gMCkKI2Vsc2UKICAgIGlmICgocmV0ID0KICAgICAgICAgX2FkZF9zdHJpbmdzX3RvX29pZChOVUxMLCBuYW1lLCBvdXRwdXQsIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X291dF9sZW4pKSA8PSAwKQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICB7CiAgICAgICAgaWYgKHJldCA9PSAwKQogICAgICAgICAgICByZXQgPSBTTk1QRVJSX1VOS05PV05fT0JKSUQ7CiAgICAgICAgU0VUX1NOTVBfRVJST1IocmV0KTsKICAgICAgICBTTk1QX0ZSRUUobmFtZSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBTTk1QX0ZSRUUobmFtZSk7CgogICAgcmV0dXJuIDE7Cn0KCi8qKgogKiAKICovCnZvaWQKbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsKICAgIHVfY2hhciAgICAgICAgICp0YnVmID0gTlVMTCwgKmNwID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICB0YnVmX2xlbiA9IDI1NiwgdG91dF9sZW4gPSAwOwogICAgaW50ICAgICAgICAgICAgIHRidWZfb3ZlcmZsb3cgPSAwOwogICAgaW50ICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQ7CgogICAgaWYgKCh0YnVmID0gKHVfY2hhciAqKSBjYWxsb2ModGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgdGJ1Zl9vdmVyZmxvdyA9IDE7CiAgICB9IGVsc2UgewogICAgICAgICp0YnVmID0gJy4nOwogICAgICAgIHRvdXRfbGVuID0gMTsKICAgIH0KCiAgICBfb2lkX2ZpbmlzaF9wcmludGluZyhvYmppZCwgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAmdGJ1ZiwgJnRidWZfbGVuLCAmdG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAmdGJ1Zl9vdmVyZmxvdyk7CgogICAgaWYgKHRidWZfb3ZlcmZsb3cpIHsKICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0YnVmKTsKICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRSh0YnVmKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgb3V0cHV0X2Zvcm1hdCA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUKTsKICAgIGlmICgwID09IG91dHB1dF9mb3JtYXQpIHsKICAgICAgICBvdXRwdXRfZm9ybWF0ID0gTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUM7CiAgICB9CiAgICBzd2l0Y2ggKG91dHB1dF9mb3JtYXQpIHsKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX0ZVTEw6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfU1VGRklYOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFOgogICAgICAgIGNwID0gdGJ1ZjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9OT05FOgogICAgZGVmYXVsdDoKICAgICAgICBjcCA9IE5VTEw7CiAgICB9CgogICAgaWYgKCEqYnVmX292ZXJmbG93ICYmCiAgICAgICAgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApKSB7CiAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICB9CiAgICBTTk1QX0ZSRUUodGJ1Zik7Cn0KCi8qKgogKiAKICovCiNpZmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKdm9pZApuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93LCBvYmppZCwgb2JqaWRsZW4pOwp9CiNlbHNlCnN0cnVjdCB0cmVlICAgICoKbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgdV9jaGFyICAgICAgICAgKnRidWYgPSBOVUxMLCAqY3AgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIHRidWZfbGVuID0gNTEyLCB0b3V0X2xlbiA9IDA7CiAgICBzdHJ1Y3QgdHJlZSAgICAqc3VidHJlZSA9IHRyZWVfaGVhZDsKICAgIHNpemVfdCAgICAgICAgICBtaWRwb2ludF9vZmZzZXQgPSAwOwogICAgaW50ICAgICAgICAgICAgIHRidWZfb3ZlcmZsb3cgPSAwOwogICAgaW50ICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQ7CgogICAgaWYgKCh0YnVmID0gKHVfY2hhciAqKSBjYWxsb2ModGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgdGJ1Zl9vdmVyZmxvdyA9IDE7CiAgICB9IGVsc2UgewogICAgICAgICp0YnVmID0gJy4nOwogICAgICAgIHRvdXRfbGVuID0gMTsKICAgIH0KCiAgICBzdWJ0cmVlID0gX2dldF9yZWFsbG9jX3N5bWJvbChvYmppZCwgb2JqaWRsZW4sIHN1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGJ1ZiwgJnRidWZfbGVuLCAmdG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAmdGJ1Zl9vdmVyZmxvdywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWRwb2ludF9vZmZzZXQpOwoKICAgIGlmICh0YnVmX292ZXJmbG93KSB7CiAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdGJ1Zik7CiAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUodGJ1Zik7CiAgICAgICAgcmV0dXJuIHN1YnRyZWU7CiAgICB9CgogICAgb3V0cHV0X2Zvcm1hdCA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUKTsKICAgIGlmICgwID09IG91dHB1dF9mb3JtYXQpIHsKICAgICAgICBvdXRwdXRfZm9ybWF0ID0gTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRTsKICAgIH0KICAgIHN3aXRjaCAob3V0cHV0X2Zvcm1hdCkgewogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfRlVMTDoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUM6CiAgICAgICAgY3AgPSB0YnVmOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX1NVRkZJWDoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRToKICAgICAgICBmb3IgKGNwID0gdGJ1ZjsgKmNwOyBjcCsrKTsKCiAgICAgICAgaWYgKG1pZHBvaW50X29mZnNldCAhPSAwKSB7CiAgICAgICAgICAgIGNwID0gdGJ1ZiArIG1pZHBvaW50X29mZnNldCAtIDI7ICAgIC8qICBiZXlvbmQgdGhlICcuJyAgKi8KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGlsZSAoY3AgPj0gdGJ1ZikgewogICAgICAgICAgICAgICAgaWYgKGlzYWxwaGEoKmNwKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3AtLTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKGNwID49IHRidWYpIHsKICAgICAgICAgICAgaWYgKCpjcCA9PSAnLicpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNwLS07CiAgICAgICAgfQoKICAgICAgICBjcCsrOwoKICAgICAgICBpZiAoKE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEUgPT0gb3V0cHV0X2Zvcm1hdCkKICAgICAgICAgICAgJiYgY3AgPiB0YnVmKSB7CiAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBtb2RidWZbMjU2XSA9IHsgMCB9LCAqbW9kID0KICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lKHN1YnRyZWUtPm1vZGlkLCBtb2RidWYpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRG9uJ3QgYWRkIHRoZSBtb2R1bGUgSUQgaWYgaXQncyBqdXN0IG51bWVyaWMgKGkuZS4gd2UgY291bGRuJ3QgbG9vawogICAgICAgICAgICAgKiBpdCB1cCBwcm9wZXJseS4gIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiBtb2RidWZbMF0gIT0gJyMnKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBtb2QpCiAgICAgICAgICAgICAgICAgICAgfHwgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiOjoiKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX1VDRDoKICAgIHsKICAgICAgICBQcmVmaXhMaXN0UHRyICAgcHAgPSAmbWliX3ByZWZpeGVzWzBdOwogICAgICAgIHNpemVfdCAgICAgICAgICBpbGVuLCB0bGVuOwogICAgICAgIGNvbnN0IGNoYXIgICAgICp0ZXN0Y3A7CgogICAgICAgIGNwID0gdGJ1ZjsKICAgICAgICB0bGVuID0gc3RybGVuKChjaGFyICopIHRidWYpOwoKICAgICAgICB3aGlsZSAocHAtPnN0cikgewogICAgICAgICAgICBpbGVuID0gcHAtPmxlbjsKICAgICAgICAgICAgdGVzdGNwID0gcHAtPnN0cjsKCiAgICAgICAgICAgIGlmICgodGxlbiA+IGlsZW4pICYmIG1lbWNtcCh0YnVmLCB0ZXN0Y3AsIGlsZW4pID09IDApIHsKICAgICAgICAgICAgICAgIGNwICs9IChpbGVuICsgMSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcCsrOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KCiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9OT05FOgogICAgZGVmYXVsdDoKICAgICAgICBjcCA9IE5VTEw7CiAgICB9CgogICAgaWYgKCEqYnVmX292ZXJmbG93ICYmCiAgICAgICAgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApKSB7CiAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICB9CiAgICBTTk1QX0ZSRUUodGJ1Zik7CiAgICByZXR1cm4gc3VidHJlZTsKfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgppbnQKc3ByaW50X3JlYWxsb2Nfb2JqaWQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9vdmVyZmxvdywgb2JqaWQsIG9iamlkbGVuKTsKICAgIHJldHVybiAhYnVmX292ZXJmbG93Owp9CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU1BSSU5UX09CSklECmludApzbnByaW50X29iamlkKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vYmppZCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbikpIHsKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1NQUklOVF9PQkpJRCAqLwoKLyoqCiAqIFByaW50cyBhbiBvaWQgdG8gc3Rkb3V0LgogKgogKiBAcGFyYW0gb2JqaWQgICAgICBUaGUgb2lkIHRvIHByaW50CiAqIEBwYXJhbSBvYmppZGxlbiAgIFRoZSBsZW5ndGggb2Ygb2lkaWQuCiAqLwp2b2lkCnByaW50X29iamlkKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzICovCiAgICBmcHJpbnRfb2JqaWQoc3Rkb3V0LCBvYmppZCwgb2JqaWRsZW4pOwp9CgoKLyoqCiAqIFByaW50cyBhbiBvaWQgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCiAqCiAqIEBwYXJhbSBmICAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBvYmppZCAgICAgIFRoZSBvaWQgdG8gcHJpbnQKICogQHBhcmFtIG9iamlkbGVuICAgVGhlIGxlbmd0aCBvZiBvaWRpZC4KICovCnZvaWQKZnByaW50X29iamlkKEZJTEUgKiBmLCBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyAqLwogICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IDI1Niwgb3V0X2xlbiA9IDA7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9vdmVyZmxvdywgb2JqaWQsIG9iamlkbGVuKTsKICAgICAgICBpZiAoYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIFtUUlVOQ0FURURdXG4iLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4iLCBidWYpOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUoYnVmKTsKfQoKaW50CnNwcmludF9yZWFsbG9jX3ZhcmlhYmxlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgaW50ICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdyA9IDA7CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgc3RydWN0IHRyZWUgICAgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CgogICAgc3VidHJlZSA9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgICAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAmYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4pOwoKICAgIGlmIChidWZfb3ZlcmZsb3cpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0JBUkVfVkFMVUUpKSB7CiAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiID0gIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgPSAiKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZi1lbHNlIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UICovCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGlmLWVsc2UgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UICovCiAgICB9IGVsc2UgewogICAgICAgICpvdXRfbGVuID0gMDsKICAgIH0KCiAgICBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hPQkpFQ1QpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBTdWNoIE9iamVjdCBhdmFpbGFibGUgb24gdGhpcyBhZ2VudCBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX05PU1VDSElOU1RBTkNFKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBJbnN0YW5jZSBjdXJyZW50bHkgZXhpc3RzIGF0IHRoaXMgT0lEIik7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfRU5ET0ZNSUJWSUVXKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSB2YXJpYWJsZXMgbGVmdCBpbiB0aGlzIE1JQiBWaWV3IChJdCBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIE1JQiB0cmVlKSIpOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgfSBlbHNlIGlmIChzdWJ0cmVlKSB7CiAgICAgICAgY29uc3QgY2hhciAqdW5pdHMgPSBOVUxMOwogICAgICAgIGNvbnN0IGNoYXIgKmhpbnQgPSBOVUxMOwogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMpKSB7CiAgICAgICAgICAgIHVuaXRzID0gc3VidHJlZS0+dW5pdHM7CiAgICAgICAgfQoKCQlpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9OT19ESVNQTEFZX0hJTlQpKSB7CgkJCWhpbnQgPSBzdWJ0cmVlLT5oaW50OwogICAgICAgIH0KCiAgICAgICAgaWYgKHN1YnRyZWUtPnByaW50b21hdCkgewogICAgICAgICAgICByZXR1cm4gKCpzdWJ0cmVlLT5wcmludG9tYXQpIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5lbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICAgICAgfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICB9IGVsc2UgewogICAgICAgIC8qCiAgICAgICAgICogSGFuZGxlIHJhcmUgY2FzZSB3aGVyZSB0cmVlIGlzIGVtcHR5LiAgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIH0KfQoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1NOUFJJTlRfVkFSQUJMRQppbnQKc25wcmludF92YXJpYWJsZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKCiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdmFyaWFibGUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU05QUklOVF9WQVJBQkxFICovCgovKioKICogUHJpbnRzIGEgdmFyaWFibGUgdG8gc3Rkb3V0LgogKgogKiBAcGFyYW0gb2JqaWQgICAgIFRoZSBvYmplY3QgaWQuCiAqIEBwYXJhbSBvYmppZGxlbiAgVGhlIGxlbmd0aCBvZiB0ZWggb2JqZWN0IGlkLgogKiBAcGFyYW0gdmFyaWFibGUgIFRoZSB2YXJpYWJsZSB0byBwcmludC4KICovCnZvaWQKcHJpbnRfdmFyaWFibGUoY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgICAgIHNpemVfdCBvYmppZGxlbiwgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIGZwcmludF92YXJpYWJsZShzdGRvdXQsIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpOwp9CgoKLyoqCiAqIFByaW50cyBhIHZhcmlhYmxlIHRvIGEgZmlsZSBkZXNjcmlwdG9yLgogKgogKiBAcGFyYW0gZiAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBvYmppZCAgICAgVGhlIG9iamVjdCBpZC4KICogQHBhcmFtIG9iamlkbGVuICBUaGUgbGVuZ3RoIG9mIHRlaCBvYmplY3QgaWQuCiAqIEBwYXJhbSB2YXJpYWJsZSAgVGhlIHZhcmlhYmxlIHRvIHByaW50LgogKi8Kdm9pZApmcHJpbnRfdmFyaWFibGUoRklMRSAqIGYsCiAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwKICAgICAgICAgICAgICAgIHNpemVfdCBvYmppZGxlbiwgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIHVfY2hhciAgICAgICAgICpidWYgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAyNTYsIG91dF9sZW4gPSAwOwoKICAgIGlmICgoYnVmID0gKHVfY2hhciAqKSBjYWxsb2MoYnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKGYsICJbVFJVTkNBVEVEXVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoc3ByaW50X3JlYWxsb2NfdmFyaWFibGUoJmJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKSkgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKGJ1Zik7Cn0KCmludApzcHJpbnRfcmVhbGxvY192YWx1ZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX05PU1VDSE9CSkVDVCkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggT2JqZWN0IGF2YWlsYWJsZSBvbiB0aGlzIGFnZW50IGF0IHRoaXMgT0lEIik7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNISU5TVEFOQ0UpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBTdWNoIEluc3RhbmNlIGN1cnJlbnRseSBleGlzdHMgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9FTkRPRk1JQlZJRVcpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIHZhcmlhYmxlcyBsZWZ0IGluIHRoaXMgTUlCIFZpZXcgKEl0IGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgTUlCIHRyZWUpIik7CiAgICB9IGVsc2UgewojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJlZSAqc3VidHJlZSA9IHRyZWVfaGVhZDsKCXN1YnRyZWUgPSBnZXRfdHJlZShvYmppZCwgb2JqaWRsZW4sIHN1YnRyZWUpOwogICAgICAgIGlmIChzdWJ0cmVlICYmICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9ET05UX1BSSU5UX1VOSVRTKSkgewogICAgICAgICAgICB1bml0cyA9IHN1YnRyZWUtPnVuaXRzOwogICAgICAgIH0KICAgICAgICBpZiAoc3VidHJlZSkgewoJICAgIGlmKHN1YnRyZWUtPnByaW50b21hdCkgewoJCXJldHVybiAoKnN1YnRyZWUtPnByaW50b21hdCkgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKCQkJCQkgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKCQkJCQkgICAgICBzdWJ0cmVlLT5lbnVtcywgc3VidHJlZS0+aGludCwKCQkJCQkgICAgICB1bml0cyk7CgkgICAgfSBlbHNlIHsKCQlyZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCgkJCQkJICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCgkJCQkJICAgICAgc3VidHJlZS0+ZW51bXMsIHN1YnRyZWUtPmhpbnQsCgkJCQkJICAgICAgdW5pdHMpOwoJICAgIH0KCX0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIH0KfQoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1NOUFJJTlRfVkFMVUUKLyogdXNlZCBpbiB0aGUgcGVybCBtb2R1bGUgKi8KaW50CnNucHJpbnRfdmFsdWUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CgogICAgaWYgKHNwcmludF9yZWFsbG9jX3ZhbHVlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSkpIHsKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1NOUFJJTlRfVkFMVUUgKi8KCnZvaWQKcHJpbnRfdmFsdWUoY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgIHNpemVfdCBvYmppZGxlbiwgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIGZwcmludF92YWx1ZShzdGRvdXQsIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpOwp9Cgp2b2lkCmZwcmludF92YWx1ZShGSUxFICogZiwKICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IDI1Niwgb3V0X2xlbiA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIGlmIChzcHJpbnRfcmVhbGxvY192YWx1ZSgmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4iLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIFtUUlVOQ0FURURdXG4iLCBidWYpOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUoYnVmKTsKfQoKCi8qKgogKiBUYWtlcyB0aGUgdmFsdWUgaW4gVkFSIGFuZCB0dXJucyBpdCBpbnRvIGFuIE9JRCBzZWdtZW50IGluIHZhci0+bmFtZS4KICogIAogKiBAcGFyYW0gdmFyICAgIFRoZSB2YXJpYWJsZS4KICoKICogQHJldHVybiBTTk1QRVJSX1NVQ0NFU1Mgb3IgU05NUEVSUl9HRU5FUlIgCiAqLwppbnQKYnVpbGRfb2lkX3NlZ21lbnQobmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIHVpbnQzMl90ICAgICAgICBpcGFkZHI7CgogICAgaWYgKHZhci0+bmFtZSAmJiB2YXItPm5hbWUgIT0gdmFyLT5uYW1lX2xvYykKICAgICAgICBTTk1QX0ZSRUUodmFyLT5uYW1lKTsKICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICBjYXNlIEFTTl9JTlRFR0VSOgogICAgY2FzZSBBU05fQ09VTlRFUjoKICAgIGNhc2UgQVNOX0dBVUdFOgogICAgY2FzZSBBU05fVElNRVRJQ0tTOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSAxOwogICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgdmFyLT5uYW1lWzBdID0gKih2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9JUEFERFJFU1M6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IDQ7CiAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBtZW1jcHkoJmlwYWRkciwgdmFyLT52YWwuc3RyaW5nLCBzaXplb2YoaXBhZGRyKSk7CiAgICAgICAgdmFyLT5uYW1lWzBdID0gKGlwYWRkciA+PiAyNCkgJiAweGZmOwogICAgICAgIHZhci0+bmFtZVsxXSA9IChpcGFkZHIgPj4gMTYpICYgMHhmZjsKICAgICAgICB2YXItPm5hbWVbMl0gPSAoaXBhZGRyID4+ICA4KSAmIDB4ZmY7CiAgICAgICAgdmFyLT5uYW1lWzNdID0gKGlwYWRkciA+PiAgMCkgJiAweGZmOwogICAgICAgIGJyZWFrOwogICAgICAgIAogICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09CSkVDVF9JRDoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCk7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgdmFyLT5uYW1lX2xlbmd0aDsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaV0gPSB2YXItPnZhbC5vYmppZFtpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PQkpFQ1RfSUQ6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IHZhci0+dmFsX2xlbiAvIHNpemVvZihvaWQpICsgMTsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IChzaXplb2YodmFyLT5uYW1lX2xvYykgLyBzaXplb2Yob2lkKSkpCiAgICAgICAgICAgIHZhci0+bmFtZSA9IChvaWQgKikgbWFsbG9jKHNpemVvZihvaWQpICogKHZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgaWYgKHZhci0+bmFtZSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgIHZhci0+bmFtZVswXSA9IHZhci0+bmFtZV9sZW5ndGggLSAxOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPm5hbWVfbGVuZ3RoIC0gMTsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaSArIDFdID0gdmFyLT52YWwub2JqaWRbaV07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09DVEVUX1NUUjoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+dmFsX2xlbjsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaV0gPSAob2lkKSB2YXItPnZhbC5zdHJpbmdbaV07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFOgogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW4gKyAxOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgdmFyLT5uYW1lWzBdID0gKG9pZCkgdmFyLT52YWxfbGVuOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPnZhbF9sZW47IGkrKykKICAgICAgICAgICAgdmFyLT5uYW1lW2kgKyAxXSA9IChvaWQpIHZhci0+dmFsLnN0cmluZ1tpXTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJidWlsZF9vaWRfc2VnbWVudCIsCiAgICAgICAgICAgICAgICAgICAgImludmFsaWQgYXNuIHR5cGU6ICVkXG4iLCB2YXItPnR5cGUpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CgogICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiBNQVhfT0lEX0xFTikgewogICAgICAgIERFQlVHTVNHVEwoKCJidWlsZF9vaWRfc2VnbWVudCIsCiAgICAgICAgICAgICAgICAgICAgIlNvbWV0aGluZyB0ZXJyaWJseSB3cm9uZywgbmFtZWxlbiA9ICVsdVxuIiwKICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfQoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgppbnQKYnVpbGRfb2lkX25vYWxsb2Mob2lkICogaW4sIHNpemVfdCBpbl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgIG9pZCAqIHByZWZpeCwgc2l6ZV90IHByZWZpeF9sZW4sCiAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGluZGV4ZXMpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyOwoKICAgIGlmIChwcmVmaXgpIHsKICAgICAgICBpZiAoaW5fbGVuIDwgcHJlZml4X2xlbikKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIG1lbWNweShpbiwgcHJlZml4LCBwcmVmaXhfbGVuICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpvdXRfbGVuID0gcHJlZml4X2xlbjsKICAgIH0gZWxzZSB7CiAgICAgICAgKm91dF9sZW4gPSAwOwogICAgfQoKICAgIGZvciAodmFyID0gaW5kZXhlczsgdmFyICE9IE5VTEw7IHZhciA9IHZhci0+bmV4dF92YXJpYWJsZSkgewogICAgICAgIGlmIChidWlsZF9vaWRfc2VnbWVudCh2YXIpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoICsgKm91dF9sZW4gPD0gaW5fbGVuKSB7CiAgICAgICAgICAgIG1lbWNweSgmKGluWypvdXRfbGVuXSksIHZhci0+bmFtZSwKICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogdmFyLT5uYW1lX2xlbmd0aCk7CiAgICAgICAgICAgICpvdXRfbGVuICs9IHZhci0+bmFtZV9sZW5ndGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIH0KICAgIH0KCiAgICBERUJVR01TR1RMKCgiYnVpbGRfb2lkX25vYWxsb2MiLCAiZ2VuZXJhdGVkOiAiKSk7CiAgICBERUJVR01TR09JRCgoImJ1aWxkX29pZF9ub2FsbG9jIiwgaW4sICpvdXRfbGVuKSk7CiAgICBERUJVR01TRygoImJ1aWxkX29pZF9ub2FsbG9jIiwgIlxuIikpOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKaW50CmJ1aWxkX29pZChvaWQgKiogb3V0LCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgb2lkICogcHJlZml4LCBzaXplX3QgcHJlZml4X2xlbiwgbmV0c25tcF92YXJpYWJsZV9saXN0ICogaW5kZXhlcykKewogICAgb2lkICAgICAgICAgICAgIHRtcG91dFtNQVhfT0lEX0xFTl07CgogICAgLyoKICAgICAqIHh4eC1ya3M6IGluZWZmaWNlbnQuIHRyeSBvbmx5IGJ1aWxkaW5nIHNlZ21lbnRzIHRvIGZpbmQgaW5kZXggbGVuOgogICAgICogICBmb3IgKHZhciA9IGluZGV4ZXM7IHZhciAhPSBOVUxMOyB2YXIgPSB2YXItPm5leHRfdmFyaWFibGUpIHsKICAgICAqICAgICAgaWYgKGJ1aWxkX29pZF9zZWdtZW50KHZhcikgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICogICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgKiAgICAgICpvdXRfbGVuICs9IHZhci0+bmFtZV9sZW5ndGg7CiAgICAgKgogICAgICogdGhlbiBzZWUgaWYgaXQgZml0cyBpbiBleGlzdGluZyBidWZmZXIsIG9yIHJlYWxsb2MgYnVmZmVyLgogICAgICovCiAgICBpZiAoYnVpbGRfb2lkX25vYWxsb2ModG1wb3V0LCBzaXplb2YodG1wb3V0KSwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIHByZWZpeF9sZW4sIGluZGV4ZXMpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgLyoqIHh4eC1ya3M6IHNob3VsZCBmcmVlIHByZXZpb3VzIHZhbHVlPyAqLwogICAgc25tcF9jbG9uZV9tZW0oKHZvaWQgKiopIG91dCwgKHZvaWQgKikgdG1wb3V0LCAqb3V0X2xlbiAqIHNpemVvZihvaWQpKTsKCiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgovKgogKiB2Ymxpc3Rfb3V0IG11c3QgY29udGFpbiBhIHByZS1hbGxvY2F0ZWQgc3RyaW5nIG9mIHZhcmlhYmxlcyBpbnRvCiAqIHdoaWNoIGluZGV4ZXMgY2FuIGJlIGV4dHJhY3RlZCBiYXNlZCBvbiB0aGUgcHJldmlvdXNseSBleGlzdGluZwogKiB0eXBlcyBpbiB0aGUgdmFyaWFibGUgY2hhaW4KICogcmV0dXJuczoKICogU05NUEVSUl9HRU5FUlIgIG9uIGVycm9yCiAqIFNOTVBFUlJfU1VDQ0VTUyBvbiBzdWNjZXNzCiAqLwoKaW50CnBhcnNlX29pZF9pbmRleGVzKG9pZCAqIG9pZEluZGV4LCBzaXplX3Qgb2lkTGVuLAogICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiBkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhciA9IGRhdGE7CgogICAgd2hpbGUgKHZhciAmJiBvaWRMZW4gPiAwKSB7CgogICAgICAgIGlmIChwYXJzZV9vbmVfb2lkX2luZGV4KCZvaWRJbmRleCwgJm9pZExlbiwgdmFyLCAwKSAhPQogICAgICAgICAgICBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICB2YXIgPSB2YXItPm5leHRfdmFyaWFibGU7CiAgICB9CgogICAgaWYgKHZhciAhPSBOVUxMIHx8IG9pZExlbiAhPSAwKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgppbnQKcGFyc2Vfb25lX29pZF9pbmRleChvaWQgKiogb2lkU3RhcnQsIHNpemVfdCAqIG9pZExlbiwKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiBkYXRhLCBpbnQgY29tcGxldGUpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyID0gZGF0YTsKICAgIG9pZCAgICAgICAgICAgICB0bXBvdXRbTUFYX09JRF9MRU5dOwogICAgdW5zaWduZWQgaW50ICAgIGk7CiAgICB1bnNpZ25lZCBpbnQgICAgdWl0bXAgPSAwOwoKICAgIG9pZCAgICAgICAgICAgICpvaWRJbmRleCA9ICpvaWRTdGFydDsKCiAgICBpZiAodmFyID09IE5VTEwgfHwgKCgqb2lkTGVuID09IDApICYmIChjb21wbGV0ZSA9PSAwKSkpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgZWxzZSB7CiAgICAgICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgICAgICBjYXNlIEFTTl9JTlRFR0VSOgogICAgICAgIGNhc2UgQVNOX0NPVU5URVI6CiAgICAgICAgY2FzZSBBU05fR0FVR0U6CiAgICAgICAgY2FzZSBBU05fVElNRVRJQ0tTOgogICAgICAgICAgICBpZiAoKm9pZExlbikgewogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSBvaWRJbmRleCsrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIC0tKCpvaWRMZW4pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSBvaWRMZW4sIHNpemVvZihsb25nKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBpbnQoJWQpOiAlbGRcbiIsIHZhci0+dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQVNOX0lQQUREUkVTUzoKICAgICAgICAgICAgaWYgKCg0ID4gKm9pZExlbikgJiYgKGNvbXBsZXRlID09IDApKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgaSA8ICpvaWRMZW47ICsraSkgewogICAgICAgICAgICAgICAgaWYgKG9pZEluZGV4W2ldID4gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBvaWQgaW4gaW5kZXg6ICUiIE5FVFNOTVBfUFJJbyAiZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWRJbmRleFswXSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7ICAvKiBzdWItaWRlbnRpZmllciB0b28gbGFyZ2UgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSB1aXRtcCArIChvaWRJbmRleFtpXSA8PCAoOCooMy1pKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoNCA+IChpbnQpICgqb2lkTGVuKSkgewogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gKm9pZExlbjsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvaWRJbmRleCArPSA0OwogICAgICAgICAgICAgICAgKCpvaWRMZW4pIC09IDQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdWl0bXAgPSBodG9ubCh1aXRtcCk7IC8qIHB1dCBpdCBpbiBwcm9wZXIgb3JkZXIgZm9yIGJ5dGUgY29waWVzICovCiAgICAgICAgICAgIHVpdG1wID0gCiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopICZ1aXRtcCwgNCk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJQYXJzZWQgaXBhZGRyKCVkKTogJWQuJWQuJWQuJWRcbiIsIHZhci0+dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nWzBdLCB2YXItPnZhbC5zdHJpbmdbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1syXSwgdmFyLT52YWwuc3RyaW5nWzNdKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFTTl9PQkpFQ1RfSUQ6CiAgICAgICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09CSkVDVF9JRDoKICAgICAgICAgICAgaWYgKHZhci0+dHlwZSA9PSBBU05fUFJJVl9JTVBMSUVEX09CSkVDVF9JRCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIG1pZ2h0IG5vdCBiZSBpbXBsaWVkLCBtaWdodCBiZSBmaXhlZCBsZW4uIGNoZWNrIGlmCiAgICAgICAgICAgICAgICAgKiBjYWxsZXIgc2V0IHVwIHZhbCBsZW4sIGFuZCB1c2UgaXQgaWYgdGhleSBkaWQuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICgwID09IHZhci0+dmFsX2xlbikKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9ICpvaWRMZW47CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXM6Zml4IiwgImZpeGVkIGxlbiBvaWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IHZhci0+dmFsX2xlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAqb2lkSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICAtLSgqb2lkTGVuKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCh1aXRtcCA+ICpvaWRMZW4pICYmIChjb21wbGV0ZSA9PSAwKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh1aXRtcCA+IE1BWF9PSURfTEVOKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOyAgLyogdG9vIGJpZyBhbmQgaWxsZWdhbCAqLwoKICAgICAgICAgICAgaWYgKHVpdG1wID4gKm9pZExlbikgewogICAgICAgICAgICAgICAgbWVtY3B5KHRtcG91dCwgb2lkSW5kZXgsIHNpemVvZihvaWQpICogKCpvaWRMZW4pKTsKICAgICAgICAgICAgICAgIG1lbXNldCgmdG1wb3V0WypvaWRMZW5dLCAweDAwLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogKHVpdG1wIC0gKm9pZExlbikpOwogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSB0bXBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiB1aXRtcCk7CiAgICAgICAgICAgICAgICBvaWRJbmRleCArPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgb2lkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiB1aXRtcCk7CiAgICAgICAgICAgICAgICBvaWRJbmRleCArPSB1aXRtcDsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSAtPSB1aXRtcDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwgIlBhcnNlZCBvaWQ6ICIpKTsKICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5vYmppZCwgdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCkpKTsKICAgICAgICAgICAgREVCVUdNU0coKCJwYXJzZV9vaWRfaW5kZXhlcyIsICJcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQVNOX09QQVFVRToKICAgICAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09DVEVUX1NUUjoKICAgICAgICAgICAgaWYgKHZhci0+dHlwZSA9PSBBU05fUFJJVl9JTVBMSUVEX09DVEVUX1NUUikgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIG1pZ2h0IG5vdCBiZSBpbXBsaWVkLCBtaWdodCBiZSBmaXhlZCBsZW4uIGNoZWNrIGlmCiAgICAgICAgICAgICAgICAgKiBjYWxsZXIgc2V0IHVwIHZhbCBsZW4sIGFuZCB1c2UgaXQgaWYgdGhleSBkaWQuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICgwID09IHZhci0+dmFsX2xlbikKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9ICpvaWRMZW47CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXM6Zml4IiwgImZpeGVkIGxlbiBzdHJcbiIpKTsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IHZhci0+dmFsX2xlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAqb2lkSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICAtLSgqb2lkTGVuKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCh1aXRtcCA+ICpvaWRMZW4pICYmIChjb21wbGV0ZSA9PSAwKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHdlIGhhbmRsZSB0aGlzIG9uZSBvdXJzZWx2ZXMgc2luY2Ugd2UgZG9uJ3QgaGF2ZQogICAgICAgICAgICAgKiBwcmUtYWxsb2NhdGVkIG1lbW9yeSB0byBjb3B5IGZyb20gdXNpbmcKICAgICAgICAgICAgICogc25tcF9zZXRfdmFyX3ZhbHVlKCkgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKHVpdG1wID09IDApCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogemVybyBsZW5ndGggc3RyaW5ncyBzaG91bGRuJ3QgbWFsbG9jICovCgogICAgICAgICAgICBpZiAodWl0bXAgPiBNQVhfT0lEX0xFTikKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsgIC8qIHRvbyBiaWcgYW5kIGlsbGVnYWwgKi8KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIG1hbGxvYyBieSBzaXplKzEgdG8gYWxsb3cgYSBudWxsIHRvIGJlIGFwcGVuZGVkLiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHZhci0+dmFsX2xlbiA9IHVpdG1wOwogICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcgPSAodV9jaGFyICopIGNhbGxvYygxLCB1aXRtcCArIDEpOwogICAgICAgICAgICBpZiAodmFyLT52YWwuc3RyaW5nID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgICAgICBpZiAoKHNpemVfdCl1aXRtcCA+ICgqb2lkTGVuKSkgewogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICpvaWRMZW47ICsraSkKICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbaV0gPSAodV9jaGFyKSAqIG9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAqb2lkTGVuOyBpIDwgdWl0bXA7ICsraSkKICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbaV0gPSAnXDAnOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1aXRtcDsgKytpKQogICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1tpXSA9ICh1X2NoYXIpICogb2lkSW5kZXgrKzsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSAtPSB1aXRtcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbdWl0bXBdID0gJ1wwJzsKCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJQYXJzZWQgc3RyKCVkKTogJXNcbiIsIHZhci0+dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBhc24gdHlwZTogJWRcbiIsIHZhci0+dHlwZSkpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgfQogICAgfQogICAgKCpvaWRTdGFydCkgPSBvaWRJbmRleDsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCi8qCiAqIGR1bXBfcmVhbGxvY19vaWRfdG9faW5ldGFkZHJlc3M6CiAqICAgcmV0dXJuIDAgZm9yIGZhaWx1cmUsCiAqICAgcmV0dXJuIDEgZm9yIHN1Y2Nlc3MsCiAqICAgcmV0dXJuIDIgZm9yIG5vdCBoYW5kbGVkCiAqLwoKaW50IApkdW1wX3JlYWxsb2Nfb2lkX3RvX2luZXRhZGRyZXNzKGNvbnN0IGludCBhZGRyX3R5cGUsIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcXVvdGVjaGFyKQp7CiAgICBpbnQgICAgICAgICAgICAgaSwgbGVuOwogICAgY2hhciAgICAgICAgICAgIGludGJ1Zls2NF0sICpwOwogICAgY2hhciAqY29uc3QgICAgIGVuZCA9IGludGJ1ZiArIHNpemVvZihpbnRidWYpOwogICAgdW5zaWduZWQgY2hhciAgKnpjOwogICAgdW5zaWduZWQgbG9uZyAgIHpvbmU7CgogICAgaWYgKCFidWYpCiAgICAgICAgcmV0dXJuIDE7CgogICAgZm9yIChpID0gMDsgaSA8IG9iamlkbGVuOyBpKyspCiAgICAgICAgaWYgKG9iamlkW2ldIDwgMCB8fCBvYmppZFtpXSA+IDI1NSkKICAgICAgICAgICAgcmV0dXJuIDI7CgogICAgcCA9IGludGJ1ZjsKICAgICpwKysgPSBxdW90ZWNoYXI7CgogICAgc3dpdGNoIChhZGRyX3R5cGUpIHsKICAgIGNhc2UgSVBWNDoKICAgIGNhc2UgSVBWNFo6CiAgICAgICAgaWYgKChhZGRyX3R5cGUgPT0gSVBWNCAgJiYgb2JqaWRsZW4gIT0gNCkgfHwKICAgICAgICAgICAgKGFkZHJfdHlwZSA9PSBJUFY0WiAmJiBvYmppZGxlbiAhPSA4KSkKICAgICAgICAgICAgcmV0dXJuIDI7CgogICAgICAgIGxlbiA9IHNucHJpbnRmKHAsIGVuZCAtIHAsICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1LiIKICAgICAgICAgICAgICAgICAgICAgICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1IiwKICAgICAgICAgICAgICAgICAgICAgIG9iamlkWzBdLCBvYmppZFsxXSwgb2JqaWRbMl0sIG9iamlkWzNdKTsKICAgICAgICBwICs9IGxlbjsKICAgICAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIGlmIChhZGRyX3R5cGUgPT0gSVBWNFopIHsKICAgICAgICAgICAgemMgPSAodW5zaWduZWQgY2hhciopJnpvbmU7CiAgICAgICAgICAgIHpjWzBdID0gb2JqaWRbNF07CiAgICAgICAgICAgIHpjWzFdID0gb2JqaWRbNV07CiAgICAgICAgICAgIHpjWzJdID0gb2JqaWRbNl07CiAgICAgICAgICAgIHpjWzNdID0gb2JqaWRbN107CiAgICAgICAgICAgIHpvbmUgPSBudG9obCh6b25lKTsKICAgICAgICAgICAgbGVuID0gc25wcmludGYocCwgZW5kIC0gcCwgIiUlJWx1Iiwgem9uZSk7CiAgICAgICAgICAgIHAgKz0gbGVuOwogICAgICAgICAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CgogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgSVBWNjoKICAgIGNhc2UgSVBWNlo6CiAgICAgICAgaWYgKChhZGRyX3R5cGUgPT0gSVBWNiAmJiBvYmppZGxlbiAhPSAxNikgfHwKICAgICAgICAgICAgKGFkZHJfdHlwZSA9PSBJUFY2WiAmJiBvYmppZGxlbiAhPSAyMCkpCiAgICAgICAgICAgIHJldHVybiAyOwoKICAgICAgICBsZW4gPSAwOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArKykgewogICAgICAgICAgICBsZW4gPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiJXMlMDIiIE5FVFNOTVBfUFJJbyAieCIsIGkgPyAiOiIgOiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWRbaV0pOwogICAgICAgICAgICBwICs9IGxlbjsKICAgICAgICAgICAgaWYgKHAgPj0gZW5kKQogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQoKICAgICAgICBpZiAoYWRkcl90eXBlID09IElQVjZaKSB7CiAgICAgICAgICAgIHpjID0gKHVuc2lnbmVkIGNoYXIqKSZ6b25lOwogICAgICAgICAgICB6Y1swXSA9IG9iamlkWzE2XTsKICAgICAgICAgICAgemNbMV0gPSBvYmppZFsxN107CiAgICAgICAgICAgIHpjWzJdID0gb2JqaWRbMThdOwogICAgICAgICAgICB6Y1szXSA9IG9iamlkWzE5XTsKICAgICAgICAgICAgem9uZSA9IG50b2hsKHpvbmUpOwogICAgICAgICAgICBsZW4gPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiJSUlbHUiLCB6b25lKTsKICAgICAgICAgICAgcCArPSBsZW47CiAgICAgICAgICAgIGlmIChwID49IGVuZCkKICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBETlM6CiAgICBkZWZhdWx0OiAKICAgICAgICAvKiBETlMgY2FuIGp1c3QgYmUgaGFuZGxlZCBieSBkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZygpICovCiAgICAgICAgcmV0dXJuIDI7CiAgICB9CgogICAgKnArKyA9IHF1b3RlY2hhcjsKICAgIGlmIChwID49IGVuZCkKICAgICAgICByZXR1cm4gMjsKCiAgICAqcCsrID0gJ1wwJzsKICAgIGlmIChwID49IGVuZCkKICAgICAgICByZXR1cm4gMjsKCiAgICByZXR1cm4gc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW50YnVmKTsKfQoKaW50CmR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHF1b3RlY2hhcikKewogICAgaWYgKGJ1ZikgewogICAgICAgIGludCAgICAgICAgICAgICBpLCBhbGVuOwoKICAgICAgICBmb3IgKGkgPSAwLCBhbGVuID0gMDsgaSA8IChpbnQpIG9iamlkbGVuOyBpKyspIHsKICAgICAgICAgICAgb2lkICAgICAgICAgICAgIHRzdCA9IG9iamlkW2ldOwogICAgICAgICAgICBpZiAoKHRzdCA+IDI1NCkgfHwgKCFpc3ByaW50KHRzdCkpKSB7CiAgICAgICAgICAgICAgICB0c3QgPSAob2lkKSAnLic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChhbGVuID09IDApIHsKICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUykpIHsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcXCc7CiAgICAgICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gcXVvdGVjaGFyOwogICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKGNoYXIpIHRzdDsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICBhbGVuKys7CiAgICAgICAgfQoKICAgICAgICBpZiAoYWxlbikgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXFwnOwogICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSBxdW90ZWNoYXI7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CgogICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnZvaWQKX29pZF9maW5pc2hfcHJpbnRpbmcoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsIGludCAqYnVmX292ZXJmbG93KSB7CiAgICBjaGFyICAgICAgICAgICAgaW50YnVmWzY0XTsKICAgIGlmICgqYnVmICE9IE5VTEwgJiYgKigqYnVmICsgKm91dF9sZW4gLSAxKSAhPSAnLicpIHsKICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIuIikpIHsKICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlIChvYmppZGxlbi0tID4gMCkgeyAgICAvKiBvdXRwdXQgcmVzdCBvZiBuYW1lLCB1bmludGVycHJldGVkICovCiAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUuIiwgKm9iamlkKyspOwogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgaW50YnVmKSkgewogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCpidWYgIT0gTlVMTCkgewogICAgICAgICooKmJ1ZiArICpvdXRfbGVuIC0gMSkgPSAnXDAnOyAgLyogcmVtb3ZlIHRyYWlsaW5nIGRvdCAqLwogICAgICAgICpvdXRfbGVuID0gKm91dF9sZW4gLSAxOwogICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpzdGF0aWMgc3RydWN0IHRyZWUgKgpfZ2V0X3JlYWxsb2Nfc3ltYm9sKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluZGV4X2xpc3QgKmluX2RpY2VzLCBzaXplX3QgKiBlbmRfb2Zfa25vd24pCnsKICAgIHN0cnVjdCB0cmVlICAgICpyZXR1cm5fdHJlZSA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgZXh0ZW5kZWRfaW5kZXggPQogICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FWFRFTkRFRF9JTkRFWCk7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdCA9CiAgICAgICAgbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgY2hhciAgICAgICAgICAgIGludGJ1Zls2NF07CgogICAgaWYgKCFvYmppZCB8fCAhYnVmKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgZm9yICg7IHN1YnRyZWU7IHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXIpIHsKICAgICAgICBpZiAoKm9iamlkID09IHN1YnRyZWUtPnN1YmlkKSB7CgkgICAgd2hpbGUgKHN1YnRyZWUtPm5leHRfcGVlciAmJiBzdWJ0cmVlLT5uZXh0X3BlZXItPnN1YmlkID09ICpvYmppZCkKCQlzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyOwogICAgICAgICAgICBpZiAoc3VidHJlZS0+aW5kZXhlcykgewogICAgICAgICAgICAgICAgaW5fZGljZXMgPSBzdWJ0cmVlLT5pbmRleGVzOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnRyZWUtPmF1Z21lbnRzKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqdHAyID0KICAgICAgICAgICAgICAgICAgICBmaW5kX3RyZWVfbm9kZShzdWJ0cmVlLT5hdWdtZW50cywgLTEpOwogICAgICAgICAgICAgICAgaWYgKHRwMikgewogICAgICAgICAgICAgICAgICAgIGluX2RpY2VzID0gdHAyLT5pbmRleGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXN0cm5jbXAoc3VidHJlZS0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSB8fAogICAgICAgICAgICAgICAgKE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDID09IG91dHB1dF9mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsdSIsIHN1YnRyZWUtPnN1YmlkKTsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmxhYmVsKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqaWRsZW4gPiAxKSB7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiLiIpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuX3RyZWUgPSBfZ2V0X3JlYWxsb2Nfc3ltYm9sKG9iamlkICsgMSwgb2JqaWRsZW4gLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmNoaWxkX2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93LCBpbl9kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfb2Zfa25vd24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmV0dXJuX3RyZWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybl90cmVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1YnRyZWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIGlmIChlbmRfb2Zfa25vd24pIHsKICAgICAgICAqZW5kX29mX2tub3duID0gKm91dF9sZW47CiAgICB9CgogICAgLyoKICAgICAqIFN1YnRyZWUgbm90IGZvdW5kLiAgCiAgICAgKi8KCiAgICB3aGlsZSAoaW5fZGljZXMgJiYgKG9iamlkbGVuID4gMCkgJiYKICAgICAgICAgICAoTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMgIT0gb3V0cHV0X2Zvcm1hdCkgJiYKICAgICAgICAgICAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQlJFQUtET1dOX09JRFMpKSB7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIG51bWlkczsKICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CgogICAgICAgIHRwID0gZmluZF90cmVlX25vZGUoaW5fZGljZXMtPmlsYWJlbCwgLTEpOwoKICAgICAgICBpZiAoIXRwKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIENhbid0IGZpbmQgYW4gaW5kZXggaW4gdGhlIG1pYiB0cmVlLiAgQmFpbC4gIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgaWYgKCpidWYgIT0gTlVMTCAmJiAqKCpidWYgKyAqb3V0X2xlbiAtIDEpID09ICcuJykgewogICAgICAgICAgICAgICAgKCpvdXRfbGVuKS0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiWyIpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4ICYmIHRwLT5oaW50KSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgdmFyOwogICAgICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIGJ1ZmZlclsxMDI0XTsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBpOwoKICAgICAgICAgICAgICAgIG1lbXNldCgmdmFyLCAwLCBzaXplb2YgdmFyKTsKICAgICAgICAgICAgICAgIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICAgICAgbnVtaWRzID0gb2JqaWRsZW47CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHAtPnJhbmdlcyAmJiAhdHAtPnJhbmdlcy0+bmV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cC0+cmFuZ2VzLT5sb3cgPT0gdHAtPnJhbmdlcy0+aGlnaCkgewogICAgICAgICAgICAgICAgICAgIG51bWlkcyA9IHRwLT5yYW5nZXMtPmxvdzsKICAgICAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBudW1pZHMgPSAqb2JqaWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+PSBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIG51bWlkczsgaSsrKQogICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9ICh1X2NoYXIpIG9iamlkW2ldOwogICAgICAgICAgICAgICAgdmFyLnR5cGUgPSBBU05fT0NURVRfU1RSOwogICAgICAgICAgICAgICAgdmFyLnZhbC5zdHJpbmcgPSBidWZmZXI7CiAgICAgICAgICAgICAgICB2YXIudmFsX2xlbiA9IG51bWlkczsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICAgICAgICAgIGlmICghc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAmdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHRwLT5oaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSBvYmppZGxlbjsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKCiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIChvYmppZCwgbnVtaWRzLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnXCcnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHAtPnJhbmdlcyAmJiAhdHAtPnJhbmdlcy0+bmV4dAogICAgICAgICAgICAgICAgICAgICAgICYmIHRwLT5yYW5nZXMtPmxvdyA9PSB0cC0+cmFuZ2VzLT5oaWdoKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogYSBmaXhlZC1sZW5ndGggb2N0ZXQgc3RyaW5nIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBudW1pZHMgPSB0cC0+cmFuZ2VzLT5sb3c7CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CgogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAob2JqaWQsIG51bWlkcywgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJ1wnJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbnVtaWRzID0gKHNpemVfdCkgKiBvYmppZCArIDE7CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbgogICAgICAgICAgICAgICAgICAgICAgICAoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcXCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcIiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbgogICAgICAgICAgICAgICAgICAgICAgICAoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcXCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJcIiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICogbmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9ybWFsX2hhbmRsaW5nID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BlZXIgPSB0cC0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgaGFuZGxpbmcgdGhlIEluZXRBZGRyZXNzIGluIHRoZSBPSUQsIGluIGNhc2Ugb2YgZmFpbHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICogdXNlIHRoZSBub3JtYWxfaGFuZGxpbmcuIAogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRwLT5uZXh0X3BlZXIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT50Y19pbmRleCAhPSAtMSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9wZWVyLT50Y19pbmRleCAhPSAtMSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGdldF90Y19kZXNjcmlwdG9yKHRwLT50Y19pbmRleCksICJJbmV0QWRkcmVzcyIpID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChnZXRfdGNfZGVzY3JpcHRvcihuZXh0X3BlZXItPnRjX2luZGV4KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmV0QWRkcmVzc1R5cGUiKSA9PSAwICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkcl90eXBlID0gKihvYmppZCAtIDEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGR1bXBfcmVhbGxvY19vaWRfdG9faW5ldGFkZHJlc3MoYWRkcl90eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkICsgMSwgbnVtaWRzIC0gMSwgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbF9oYW5kbGluZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxfaGFuZGxpbmcgJiYgIWR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqaWQgKyAxLCBudW1pZHMgLSAxLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJyInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQgKz0gbnVtaWRzOwogICAgICAgICAgICBvYmppZGxlbiAtPSBudW1pZHM7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgICAgIGlmICh0cC0+ZW51bXMpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwID0gdHAtPmVudW1zOwogICAgICAgICAgICAgICAgd2hpbGUgKGVwICYmIGVwLT52YWx1ZSAhPSAoaW50KSAoKm9iamlkKSkgewogICAgICAgICAgICAgICAgICAgIGVwID0gZXAtPm5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVwLT5sYWJlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidSIsICpvYmppZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1IiwgKm9iamlkKTsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICAgICAgLyogSW4gYW4gaW5kZXgsIHRoaXMgaXMgcHJvYmFibHkgYSB0aW1lZmlsdGVyICovCiAgICAgICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICAgICAgdXB0aW1lU3RyaW5nKCAqb2JqaWQsIGludGJ1Ziwgc2l6ZW9mKCBpbnRidWYgKSApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUiLCAqb2JqaWQpOwogICAgICAgICAgICB9ICAgCiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkKys7CiAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgICAgIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSBvYmppZGxlbjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IChzaXplX3QpICogb2JqaWQgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgICAgIGlmIChpbl9kaWNlcy0+aXNpbXBsaWVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtaWRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1pZHMgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIF9nZXRfcmVhbGxvY19zeW1ib2wob2JqaWQsIG51bWlkcywgTlVMTCwgYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkICs9IChudW1pZHMpOwogICAgICAgICAgICBvYmppZGxlbiAtPSAobnVtaWRzKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgICAgIGlmIChvYmppZGxlbiA8IDQpCiAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1LiIKICAgICAgICAgICAgICAgICAgICAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidSIsCiAgICAgICAgICAgICAgICAgICAgb2JqaWRbMF0sIG9iamlkWzFdLCBvYmppZFsyXSwgb2JqaWRbM10pOwogICAgICAgICAgICBvYmppZCArPSA0OwogICAgICAgICAgICBvYmppZGxlbiAtPSA0OwogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgaW50YnVmKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9ORVRBRERSOnsKICAgICAgICAgICAgICAgIG9pZCAgICAgICAgICAgICBudHlwZSA9ICpvYmppZCsrOwoKICAgICAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidS4iLCBudHlwZSk7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKG50eXBlID09IDEgJiYgb2JqaWRsZW4gPj0gNCkgewogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidS4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZFswXSwgb2JqaWRbMV0sIG9iamlkWzJdLCBvYmppZFszXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmppZCArPSA0OwogICAgICAgICAgICAgICAgICAgIG9iamlkbGVuIC09IDQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4KSB7CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXSIpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiLiIpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbl9kaWNlcyA9IGluX2RpY2VzLT5uZXh0OwogICAgfQoKICBmaW5pc2hfaXQ6CiAgICBfb2lkX2ZpbmlzaF9wcmludGluZyhvYmppZCwgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCBidWZfb3ZlcmZsb3cpOwogICAgcmV0dXJuIE5VTEw7Cn0KCnN0cnVjdCB0cmVlICAgICoKZ2V0X3RyZWUoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgc3RydWN0IHRyZWUgKnN1YnRyZWUpCnsKICAgIHN0cnVjdCB0cmVlICAgICpyZXR1cm5fdHJlZSA9IE5VTEw7CgogICAgZm9yICg7IHN1YnRyZWU7IHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXIpIHsKICAgICAgICBpZiAoKm9iamlkID09IHN1YnRyZWUtPnN1YmlkKQogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgfQoKICAgIHJldHVybiBOVUxMOwoKICBmb3VuZDoKICAgIHdoaWxlIChzdWJ0cmVlLT5uZXh0X3BlZXIgJiYgc3VidHJlZS0+bmV4dF9wZWVyLT5zdWJpZCA9PSAqb2JqaWQpCglzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyOwogICAgaWYgKG9iamlkbGVuID4gMSkKICAgICAgICByZXR1cm5fdHJlZSA9CiAgICAgICAgICAgIGdldF90cmVlKG9iamlkICsgMSwgb2JqaWRsZW4gLSAxLCBzdWJ0cmVlLT5jaGlsZF9saXN0KTsKICAgIGlmIChyZXR1cm5fdHJlZSAhPSBOVUxMKQogICAgICAgIHJldHVybiByZXR1cm5fdHJlZTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gc3VidHJlZTsKfQoKLyoqCiAqIFByaW50cyBvbiBvaWQgZGVzY3JpcHRpb24gb24gc3Rkb3V0LgogKgogKiBAc2VlIGZwcmludF9kZXNjcmlwdGlvbgogKi8Kdm9pZApwcmludF9kZXNjcmlwdGlvbihvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCAvKiBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgKi8KICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQp7CiAgICBmcHJpbnRfZGVzY3JpcHRpb24oc3Rkb3V0LCBvYmppZCwgb2JqaWRsZW4sIHdpZHRoKTsKfQoKCi8qKgogKiBQcmludHMgb24gb2lkIGRlc2NyaXB0aW9uIGludG8gYSBmaWxlIGRlc2NyaXB0b3IuCiAqIAogKiBAcGFyYW0gZiAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBvYmppZCAgICAgVGhlIG9iamVjdCBpZGVudGlmaWVyLgogKiBAcGFyYW0gb2JqaWRsZW4gIFRoZSBvYmplY3QgaWQgbGVuZ3RoLgogKiBAcGFyYW0gd2lkdGggICAgIE51bWJlciBvZiBzdWJpZGVudGlmaWVycy4KICovCnZvaWQKZnByaW50X2Rlc2NyaXB0aW9uKEZJTEUgKiBmLCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19kZXNjcmlwdGlvbigmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB3aWR0aCkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTUlCX1NOUFJJTlRfREVTQ1JJUFRJT04KaW50CnNucHJpbnRfZGVzY3JpcHRpb24oY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCBpbnQgd2lkdGgpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKCiAgICBpZiAoc3ByaW50X3JlYWxsb2NfZGVzY3JpcHRpb24oKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB3aWR0aCkpIHsKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX01JQl9TTlBSSU5UX0RFU0NSSVBUSU9OICovCgppbnQKc3ByaW50X3JlYWxsb2NfZGVzY3JpcHRpb24odV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIGludCB3aWR0aCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwID0gZ2V0X3RyZWUob2JqaWQsIG9iamlkbGVuLCB0cmVlX2hlYWQpOwogICAgc3RydWN0IHRyZWUgICAgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CiAgICBpbnQgICAgICAgICAgICAgcG9zLCBsZW47CiAgICBjaGFyICAgICAgICAgICAgdG1wYnVmWzEyOF07CiAgICBjb25zdCBjaGFyICAgICAqY3A7CgogICAgaWYgKE5VTEwgPT0gdHApCiAgICAgICAgcmV0dXJuIDA7CgogICAgaWYgKHRwLT50eXBlIDw9IFRZUEVfU0lNUExFX0xBU1QpCiAgICAgICAgY3AgPSAiIE9CSkVDVC1UWVBFIjsKICAgIGVsc2UKICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX1RSQVBUWVBFOgogICAgICAgICAgICBjcCA9ICIgVFJBUC1UWVBFIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05PVElGVFlQRToKICAgICAgICAgICAgY3AgPSAiIE5PVElGSUNBVElPTi1UWVBFIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09CSkdST1VQOgogICAgICAgICAgICBjcCA9ICIgT0JKRUNULUdST1VQIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0FHRU5UQ0FQOgogICAgICAgICAgICBjcCA9ICIgQUdFTlQtQ0FQQUJJTElUSUVTIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX01PRElEOgogICAgICAgICAgICBjcCA9ICIgTU9EVUxFLUlERU5USVRZIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09CSklERU5USVRZOgogICAgICAgICAgICBjcCA9ICIgT0JKRUNULUlERU5USVRZIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX01PRENPTVA6CiAgICAgICAgICAgIGNwID0gIiBNT0RVTEUtQ09NUExJQU5DRSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNwcmludGYodG1wYnVmLCAiIHR5cGVfJWQiLCB0cC0+dHlwZSk7CiAgICAgICAgICAgIGNwID0gdG1wYnVmOwogICAgICAgIH0KCiAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5sYWJlbCkgfHwKICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApIHx8CiAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoIXByaW50X3RyZWVfbm9kZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLCB3aWR0aCkpCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICI6Oj0geyIpKQogICAgICAgIHJldHVybiAwOwogICAgcG9zID0gNTsKICAgIHdoaWxlIChvYmppZGxlbiA+IDEpIHsKICAgICAgICBmb3IgKDsgc3VidHJlZTsgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcikgewogICAgICAgICAgICBpZiAoKm9iamlkID09IHN1YnRyZWUtPnN1YmlkKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoc3VidHJlZS0+bmV4dF9wZWVyICYmIHN1YnRyZWUtPm5leHRfcGVlci0+c3ViaWQgPT0gKm9iamlkKQogICAgICAgICAgICAgICAgICAgIHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChzdWJ0cmVlLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pKSB7CiAgICAgICAgICAgICAgICAgICAgc25wcmludGYodG1wYnVmLCBzaXplb2YodG1wYnVmKSwgIiAlcyglbHUpIiwgc3VidHJlZS0+bGFiZWwsIHN1YnRyZWUtPnN1YmlkKTsKICAgICAgICAgICAgICAgICAgICB0bXBidWZbIHNpemVvZih0bXBidWYpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcGJ1ZiwgIiAlbHUiLCBzdWJ0cmVlLT5zdWJpZCk7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4odG1wYnVmKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAiXG4gICAgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSA1OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0bXBidWYpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbjsKICAgICAgICAgICAgICAgIG9iamlkKys7CiAgICAgICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN1YnRyZWUpCiAgICAgICAgICAgIHN1YnRyZWUgPSBzdWJ0cmVlLT5jaGlsZF9saXN0OwogICAgICAgIGVsc2UKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICB3aGlsZSAob2JqaWRsZW4gPiAxKSB7CiAgICAgICAgc3ByaW50Zih0bXBidWYsICIgJSIgTkVUU05NUF9QUklvICJ1IiwgKm9iamlkKTsKICAgICAgICBsZW4gPSBzdHJsZW4odG1wYnVmKTsKICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuICAgICAiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBwb3MgPSA1OwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRtcGJ1ZikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgb2JqaWQrKzsKICAgICAgICBvYmppZGxlbi0tOwogICAgfQogICAgc3ByaW50Zih0bXBidWYsICIgJSIgTkVUU05NUF9QUklvICJ1IH0iLCAqb2JqaWQpOwogICAgbGVuID0gc3RybGVuKHRtcGJ1Zik7CiAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4gICAgICIpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBwb3MgPSA1OwogICAgfQogICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0bXBidWYpKQogICAgICAgIHJldHVybiAwOwogICAgcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQKcHJpbnRfdHJlZV9ub2RlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAqdHAsIGludCB3aWR0aCkKewogICAgY29uc3QgY2hhciAgICAgKmNwOwogICAgY2hhciAgICAgICAgICAgIHN0cltNQVhUT0tFTl07CiAgICBpbnQgICAgICAgICAgICAgaSwgcHJldm1vZCwgcG9zLCBsZW47CgogICAgaWYgKHRwKSB7CiAgICAgICAgbW9kdWxlX25hbWUodHAtPm1vZGlkLCBzdHIpOwogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAgLS0gRlJPTVx0IikgfHwKICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHBvcyA9IDE2K3N0cmxlbihzdHIpOwogICAgICAgIGZvciAoaSA9IDEsIHByZXZtb2QgPSB0cC0+bW9kaWQ7IGkgPCB0cC0+bnVtYmVyX21vZHVsZXM7IGkrKykgewogICAgICAgICAgICBpZiAocHJldm1vZCAhPSB0cC0+bW9kdWxlX2xpc3RbaV0pIHsKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lKHRwLT5tb2R1bGVfbGlzdFtpXSwgc3RyKTsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHIpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsXG4gIC0tXHRcdCIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiwgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmV2bW9kID0gdHAtPm1vZHVsZV9saXN0W2ldOwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPnRjX2luZGV4ICE9IC0xKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgLS0gVEVYVFVBTCBDT05WRU5USU9OICIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3RjX2Rlc2NyaXB0b3IodHAtPnRjX2luZGV4KSkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgICAgICBjcCA9ICJPQkpFQ1QgSURFTlRJRklFUiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICAgICAgY3AgPSAiT0NURVQgU1RSSU5HIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgICAgIGNwID0gIklOVEVHRVIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTkVUQUREUjoKICAgICAgICAgICAgY3AgPSAiTmV0d29ya0FkZHJlc3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgICAgICBjcCA9ICJJcEFkZHJlc3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQ09VTlRFUjoKICAgICAgICAgICAgY3AgPSAiQ291bnRlcjMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0dBVUdFOgogICAgICAgICAgICBjcCA9ICJHYXVnZTMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICAgICAgY3AgPSAiVGltZVRpY2tzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09QQVFVRToKICAgICAgICAgICAgY3AgPSAiT3BhcXVlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05VTEw6CiAgICAgICAgICAgIGNwID0gIk5VTEwiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQ09VTlRFUjY0OgogICAgICAgICAgICBjcCA9ICJDb3VudGVyNjQiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQklUU1RSSU5HOgogICAgICAgICAgICBjcCA9ICJCSVRTIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05TQVBBRERSRVNTOgogICAgICAgICAgICBjcCA9ICJOc2FwQWRkcmVzcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICAgICAgY3AgPSAiVUludGVnZXIzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgICAgICBjcCA9ICJVbnNpZ25lZDMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICAgICAgY3AgPSAiSW50ZWdlcjMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY3AgPSBOVUxMOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiNpZiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUKICAgICAgICBpZiAoIWNwICYmICh0cC0+cmFuZ2VzIHx8IHRwLT5lbnVtcykpIHsgLyogcmFuZ2VzIHdpdGhvdXQgdHlwZSA/ICovCiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiPzAgd2l0aCAlcyAlcyA/IiwKICAgICAgICAgICAgICAgICAgICB0cC0+cmFuZ2VzID8gIlJhbmdlIiA6ICIiLCB0cC0+ZW51bXMgPyAiRW51bSIgOiAiIik7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBTWU5UQVhcdCIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5yYW5nZXMpIHsKICAgICAgICAgICAgc3RydWN0IHJhbmdlX2xpc3QgKnJwID0gdHAtPnJhbmdlczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMTsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICgiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB3aGlsZSAocnApIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICAgICAgICAgICAgICBpZiAocnAtPmxvdyA9PSBycC0+aGlnaCkKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyVkIiwgKGZpcnN0ID8gIiIgOiAiIHwgIiksIHJwLT5sb3cgKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMlZC4uJWQiLCAoZmlyc3QgPyAiIiA6ICIgfCAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycC0+bG93LCBycC0+aGlnaCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICAgICAgICAgICAgICBpZiAocnAtPmxvdyA9PSBycC0+aGlnaCkKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyV1IiwgKGZpcnN0ID8gIiIgOiAiIHwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXJwLT5sb3cgKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMldS4uJXUiLCAoZmlyc3QgPyAiIiA6ICIgfCAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcnAtPmxvdywgKHVuc2lnbmVkKXJwLT5oaWdoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgLyogTm8gb3RoZXIgcmFuZ2UgdHlwZXMgYWxsb3dlZCAqLwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIHJwID0gcnAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiKSAiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodHAtPmVudW1zKSB7CiAgICAgICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwID0gdHAtPmVudW1zOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgeyIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIHBvcyA9IDE2ICsgc3RybGVuKGNwKSArIDI7CiAgICAgICAgICAgIHdoaWxlIChlcCkgewogICAgICAgICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlcyglZCkiLCBlcC0+bGFiZWwsIGVwLT52YWx1ZSk7CiAgICAgICAgICAgICAgICBzdHJbIHNpemVvZihzdHIpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAiXG5cdFx0ICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMjsKICAgICAgICAgICAgICAgIGVwID0gZXAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAifSAiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPmhpbnQpCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBESVNQTEFZLUhJTlRcdFwiIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+aGludCkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT51bml0cykKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFVOSVRTXHRcdFwiIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+dW5pdHMpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHN3aXRjaCAodHAtPmFjY2VzcykgewogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19SRUFET05MWToKICAgICAgICAgICAgY3AgPSAicmVhZC1vbmx5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1JFQURXUklURToKICAgICAgICAgICAgY3AgPSAicmVhZC13cml0ZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19XUklURU9OTFk6CiAgICAgICAgICAgIGNwID0gIndyaXRlLW9ubHkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfTk9BQ0NFU1M6CiAgICAgICAgICAgIGNwID0gIm5vdC1hY2Nlc3NpYmxlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX05PVElGWToKICAgICAgICAgICAgY3AgPSAiYWNjZXNzaWJsZS1mb3Itbm90aWZ5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX0NSRUFURToKICAgICAgICAgICAgY3AgPSAicmVhZC1jcmVhdGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGNwID0gTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc3ByaW50ZihzdHIsICJhY2Nlc3NfJWQiLCB0cC0+YWNjZXNzKTsKICAgICAgICAgICAgY3AgPSBzdHI7CiAgICAgICAgfQogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIE1BWC1BQ0NFU1NcdCIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBzd2l0Y2ggKHRwLT5zdGF0dXMpIHsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfTUFOREFUT1JZOgogICAgICAgICAgICBjcCA9ICJtYW5kYXRvcnkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfT1BUSU9OQUw6CiAgICAgICAgICAgIGNwID0gIm9wdGlvbmFsIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX09CU09MRVRFOgogICAgICAgICAgICBjcCA9ICJvYnNvbGV0ZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19ERVBSRUNBVEVEOgogICAgICAgICAgICBjcCA9ICJkZXByZWNhdGVkIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX0NVUlJFTlQ6CiAgICAgICAgICAgIGNwID0gImN1cnJlbnQiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGNwID0gTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc3ByaW50ZihzdHIsICJzdGF0dXNfJWQiLCB0cC0+c3RhdHVzKTsKICAgICAgICAgICAgY3AgPSBzdHI7CiAgICAgICAgfQojaWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKCFjcCAmJiAodHAtPmluZGV4ZXMpKSB7ICAgICAvKiBpbmRleCB3aXRob3V0IHN0YXR1cyA/ICovCiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiPzAgd2l0aCAlcyA/IiwgdHAtPmluZGV4ZXMgPyAiSW5kZXgiIDogIiIpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFICovCiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgU1RBVFVTXHQiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5hdWdtZW50cykKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFVR01FTlRTXHR7ICIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmF1Z21lbnRzKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgfVxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPmluZGV4ZXMpIHsKICAgICAgICAgICAgc3RydWN0IGluZGV4X2xpc3QgKmlwID0gdHAtPmluZGV4ZXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBJTkRFWFx0XHR7ICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIHBvcyA9IDE2ICsgMjsKICAgICAgICAgICAgd2hpbGUgKGlwKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiwgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiVzJXMiLAogICAgICAgICAgICAgICAgICAgICAgICBpcC0+aXNpbXBsaWVkID8gIklNUExJRUQgIiA6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICBpcC0+aWxhYmVsKTsKICAgICAgICAgICAgICAgIHN0clsgc2l6ZW9mKHN0ciktMSBdID0gMDsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHIpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuXHRcdCAgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDE2ICsgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW4gKyAyOwogICAgICAgICAgICAgICAgaXAgPSBpcC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgfVxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHRwLT52YXJiaW5kcykgewogICAgICAgICAgICBzdHJ1Y3QgdmFyYmluZF9saXN0ICp2cCA9IHRwLT52YXJiaW5kczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMTsKCiAgICAgICAgICAgIGlmICh0cC0+dHlwZSA9PSBUWVBFX1RSQVBUWVBFKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIiAgVkFSSUFCTEVTXHR7ICIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICIgIE9CSkVDVFNcdHsgIikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICB3aGlsZSAodnApIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBzdHJsY3B5KHN0ciwgdnAtPnZibGFiZWwsIHNpemVvZihzdHIpKTsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHIpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHRcdCAgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDE2ICsgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW4gKyAyOwogICAgICAgICAgICAgICAgdnAgPSB2cC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgfVxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHRwLT5kZXNjcmlwdGlvbikKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBERVNDUklQVElPTlx0XCIiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5kZXNjcmlwdGlvbikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5kZWZhdWx0VmFsdWUpCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgREVGVkFMXHR7ICIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmRlZmF1bHRWYWx1ZSkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJObyBkZXNjcmlwdGlvblxuIikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgcmV0dXJuIDE7Cn0KCmludApnZXRfbW9kdWxlX25vZGUoY29uc3QgY2hhciAqZm5hbWUsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2R1bGUsIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbikKewogICAgaW50ICAgICAgICAgICAgIG1vZGlkLCByYyA9IDA7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICBjaGFyICAgICAgICAgICAqbmFtZSwgKmNwOwoKICAgIGlmICghc3RyY21wKG1vZHVsZSwgIkFOWSIpKQogICAgICAgIG1vZGlkID0gLTE7CiAgICBlbHNlIHsKICAgICAgICBuZXRzbm1wX3JlYWRfbW9kdWxlKG1vZHVsZSk7CiAgICAgICAgbW9kaWQgPSB3aGljaF9tb2R1bGUobW9kdWxlKTsKICAgICAgICBpZiAobW9kaWQgPT0gLTEpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qCiAgICAgKiBJc29sYXRlIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIG5hbWUgLi4uIAogICAgICovCiAgICBuYW1lID0gc3RyZHVwKGZuYW1lKTsKICAgIGNwID0gc3RyY2hyKG5hbWUsICcuJyk7CiAgICBpZiAoY3AgIT0gTlVMTCkgewogICAgICAgICpjcCA9ICdcMCc7CiAgICAgICAgY3ArKzsKICAgIH0KICAgIC8qCiAgICAgKiAuLi4gYW5kIGxvY2F0ZSBpdCBpbiB0aGUgdHJlZS4gCiAgICAgKi8KICAgIHRwID0gZmluZF90cmVlX25vZGUobmFtZSwgbW9kaWQpOwogICAgaWYgKHRwKSB7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIG1heGxlbiA9ICpvYmppZGxlbjsKCiAgICAgICAgLyoKICAgICAgICAgKiBTZXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIG9iamVjdCBJRCAKICAgICAgICAgKi8KICAgICAgICBpZiAobm9kZV90b19vaWQodHAsIG9iamlkLCBvYmppZGxlbikpIHsKICAgICAgICAgICAgcmMgPSAxOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgdGhlIG5hbWUgcmVxdWVzdGVkIHdhcyBtb3JlIHRoYW4gb25lIGVsZW1lbnQsCiAgICAgICAgICAgICAqIHRhZyBvbiB0aGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChjcCAhPSBOVUxMKQogICAgICAgICAgICAgICAgcmMgPSBfYWRkX3N0cmluZ3NfdG9fb2lkKHRwLCBjcCwgb2JqaWQsIG9iamlkbGVuLCBtYXhsZW4pOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUobmFtZSk7CiAgICByZXR1cm4gKHJjKTsKfQoKCi8qKgogKiBAaW50ZXJuYWwKICoKICogUG9wdWxhdGVzIHRoZSBvYmplY3QgaWRlbnRpZmllciBmcm9tIGEgbm9kZSBpbiB0aGUgTUlCIGhpZXJhcmNoeS4KICogQnVpbGRzIHVwIHRoZSBvYmplY3QgSUQsIHdvcmtpbmcgYmFja3dhcmRzLAogKiBzdGFydGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIG9iamlkIGJ1ZmZlci4KICogV2hlbiB0aGUgdG9wIG9mIHRoZSBNSUIgdHJlZSBpcyByZWFjaGVkLCB0aGUgYnVmZmVyIGlzIGFkanVzdGVkLgogKgogKiBUaGUgYnVmZmVyIGxlbmd0aCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBzdWJpZGVudGlmaWVycwogKiBmb3IgdGhlIG9iamVjdCBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTUlCIG5vZGUuCiAqIAogKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgY29waWVkLgogKgogKiBJZiAwIGlzIHJldHVybmVkLCB0aGUgb2JqaWQgYnVmZmVyIGlzIHRvbyBzbWFsbCwKICogYW5kIHRoZSBidWZmZXIgY29udGVudHMgYXJlIGluZGV0ZXJtaW5hdGUuCiAqIFRoZSBidWZmZXIgbGVuZ3RoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGxhcmdlciBidWZmZXIuCiAqLwpzdGF0aWMgaW50Cm5vZGVfdG9fb2lkKHN0cnVjdCB0cmVlICp0cCwgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgbnVtaWRzLCBsZW5pZHM7CiAgICBvaWQgICAgICAgICAgICAqb3A7CgogICAgaWYgKCF0cCB8fCAhb2JqaWQgfHwgIW9iamlkbGVuKQogICAgICAgIHJldHVybiAwOwoKICAgIGxlbmlkcyA9IChpbnQpICpvYmppZGxlbjsKICAgIG9wID0gb2JqaWQgKyBsZW5pZHM7ICAgICAgICAvKiBwb2ludHMgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudCAqLwoKICAgIGZvciAobnVtaWRzID0gMDsgdHA7IHRwID0gdHAtPnBhcmVudCwgbnVtaWRzKyspIHsKICAgICAgICBpZiAobnVtaWRzID49IGxlbmlkcykKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgLS1vcDsKICAgICAgICAqb3AgPSB0cC0+c3ViaWQ7CiAgICB9CgogICAgKm9iamlkbGVuID0gKHNpemVfdCkgbnVtaWRzOwogICAgaWYgKG51bWlkcyA+IGxlbmlkcykgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChudW1pZHMgPCBsZW5pZHMpCiAgICAgICAgbWVtbW92ZShvYmppZCwgb3AsIG51bWlkcyAqIHNpemVvZihvaWQpKTsKCiAgICByZXR1cm4gKG51bWlkcyk7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKLyoKICogUmVwbGFjZSBceCB3aXRoIHggc3RvcCBhdCBlb3NfbWFya2VyCiAqIHJldHVybiBOVUxMIGlmIGVvc19tYXJrZXIgbm90IGZvdW5kCiAqLwpzdGF0aWMgY2hhciAqX2FwcGx5X2VzY2FwZXMoY2hhciAqc3JjLCBjaGFyIGVvc19tYXJrZXIpCnsKICAgIGNoYXIgKmRzdDsKICAgIGludCBiYWNrc2xhc2ggPSAwOwogICAgCiAgICBkc3QgPSBzcmM7CiAgICB3aGlsZSAoKnNyYykgewoJaWYgKGJhY2tzbGFzaCkgewoJICAgIGJhY2tzbGFzaCA9IDA7CgkgICAgKmRzdCsrID0gKnNyYzsKCX0gZWxzZSB7CgkgICAgaWYgKGVvc19tYXJrZXIgPT0gKnNyYykgYnJlYWs7CgkgICAgaWYgKCdcXCcgPT0gKnNyYykgewoJCWJhY2tzbGFzaCA9IDE7CgkgICAgfSBlbHNlIHsKCQkqZHN0KysgPSAqc3JjOwoJICAgIH0KCX0KCXNyYysrOwogICAgfQogICAgaWYgKCEqc3JjKSB7CgkvKiBuZXZlciBmb3VuZCBlb3NfbWFya2VyICovCglyZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CgkqZHN0ID0gMDsKCXJldHVybiBzcmM7CiAgICB9Cn0KCnN0YXRpYyBpbnQKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKX2FkZF9zdHJpbmdzX3RvX29pZChzdHJ1Y3QgdHJlZSAqdHAsIGNoYXIgKmNwLAogICAgICAgICAgICAgICAgICAgIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbiwgc2l6ZV90IG1heGxlbikKI2Vsc2UKX2FkZF9zdHJpbmdzX3RvX29pZCh2b2lkICp0cCwgY2hhciAqY3AsCiAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuLCBzaXplX3QgbWF4bGVuKQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCnsKICAgIG9pZCAgICAgICAgICAgICBzdWJpZDsKICAgIGludCAgICAgICAgICAgICBsZW5faW5kZXggPSAxMDAwMDAwOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgc3RydWN0IHRyZWUgICAgKnRwMiA9IE5VTEw7CiAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMgPSBOVUxMOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICBjaGFyICAgICAgICAgICAqZmNwLCAqZWNwLCAqY3AyID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICBkb2luZ3F1b3RlOwogICAgaW50ICAgICAgICAgICAgIGxlbiA9IC0xLCBwb3MgPSAtMTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGludCAgICAgICAgICAgICBjaGVjayA9CiAgICAgICAgIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0NIRUNLX1JBTkdFKTsKICAgIGludCAgICAgICAgICAgICBkb19oaW50ID0gIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OT19ESVNQTEFZX0hJTlQpOwoKICAgIHdoaWxlIChjcCAmJiB0cCAmJiB0cC0+Y2hpbGRfbGlzdCkgewogICAgICAgIGZjcCA9IGNwOwogICAgICAgIHRwMiA9IHRwLT5jaGlsZF9saXN0OwogICAgICAgIC8qCiAgICAgICAgICogSXNvbGF0ZSB0aGUgbmV4dCBlbnRyeSAKICAgICAgICAgKi8KICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgKmNwMisrID0gJ1wwJzsKCiAgICAgICAgLyoKICAgICAgICAgKiBTZWFyY2ggZm9yIHRoZSBhcHByb3ByaWF0ZSBjaGlsZCAKICAgICAgICAgKi8KICAgICAgICBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikoKmNwKSkpIHsKICAgICAgICAgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgd2hpbGUgKHRwMiAmJiB0cDItPnN1YmlkICE9IHN1YmlkKQogICAgICAgICAgICAgICAgdHAyID0gdHAyLT5uZXh0X3BlZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2hpbGUgKHRwMiAmJiBzdHJjbXAodHAyLT5sYWJlbCwgZmNwKSkKICAgICAgICAgICAgICAgIHRwMiA9IHRwMi0+bmV4dF9wZWVyOwogICAgICAgICAgICBpZiAoIXRwMikKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBzdWJpZCA9IHRwMi0+c3ViaWQ7CiAgICAgICAgfQogICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICBnb3RvIGJhZF9pZDsKCXdoaWxlICh0cDIgJiYgdHAyLT5uZXh0X3BlZXIgJiYgdHAyLT5uZXh0X3BlZXItPnN1YmlkID09IHN1YmlkKQoJICAgIHRwMiA9IHRwMi0+bmV4dF9wZWVyOwogICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKICAgICAgICAoKm9iamlkbGVuKSsrOwoKICAgICAgICBjcCA9IGNwMjsKICAgICAgICBpZiAoIXRwMikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgdHAgPSB0cDI7CiAgICB9CgogICAgaWYgKHRwICYmICF0cC0+Y2hpbGRfbGlzdCkgewogICAgICAgIGlmICgodHAyID0gdHAtPnBhcmVudCkpIHsKICAgICAgICAgICAgaWYgKHRwMi0+aW5kZXhlcykKICAgICAgICAgICAgICAgIGluX2RpY2VzID0gdHAyLT5pbmRleGVzOwogICAgICAgICAgICBlbHNlIGlmICh0cDItPmF1Z21lbnRzKSB7CiAgICAgICAgICAgICAgICB0cDIgPSBmaW5kX3RyZWVfbm9kZSh0cDItPmF1Z21lbnRzLCAtMSk7CiAgICAgICAgICAgICAgICBpZiAodHAyKQogICAgICAgICAgICAgICAgICAgIGluX2RpY2VzID0gdHAyLT5pbmRleGVzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRwID0gTlVMTDsKICAgIH0KCiAgICB3aGlsZSAoY3AgJiYgaW5fZGljZXMpIHsKICAgICAgICBmY3AgPSBjcDsKCiAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZShpbl9kaWNlcy0+aWxhYmVsLCAtMSk7CiAgICAgICAgaWYgKCF0cCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElzb2xhdGUgdGhlIG5leHQgZW50cnkgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAqY3AyKysgPSAnXDAnOwogICAgICAgICAgICBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikoKmNwKSkpIHsKICAgICAgICAgICAgICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICh0cC0+ZW51bXMpIHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZW51bV9saXN0ICplcCA9IHRwLT5lbnVtczsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZXAgJiYgc3RyY21wKGVwLT5sYWJlbCwgY3ApKQogICAgICAgICAgICAgICAgICAgICAgICBlcCA9IGVwLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIGlmICghZXApCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIHN1YmlkID0gZXAtPnZhbHVlOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoZWNrICYmIHRwLT5yYW5nZXMpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgb2sgPSAwOwogICAgICAgICAgICAgICAgaWYgKHRwLT50eXBlID09IFRZUEVfSU5URUdFUiB8fAogICAgICAgICAgICAgICAgICAgIHRwLT50eXBlID09IFRZUEVfSU5URUdFUjMyKSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlICghb2sgJiYgcnApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKHJwLT5sb3cgPD0gKGludCkgc3ViaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICYmICgoaW50KSBzdWJpZCA8PSBycC0+aGlnaCkpCiAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gMTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJwID0gcnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIGNoZWNrIHVuc2lnbmVkIHJhbmdlICovCiAgICAgICAgICAgICAgICAgIHdoaWxlICghb2sgJiYgcnApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKCh1bnNpZ25lZCBpbnQpcnAtPmxvdyA8PSBzdWJpZCkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN1YmlkIDw9ICh1bnNpZ25lZCBpbnQpcnAtPmhpZ2gpKQogICAgICAgICAgICAgICAgICAgICAgICBvayA9IDE7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIW9rKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICAgICAgaWYgKCpvYmppZGxlbiArIDQgPiBtYXhsZW4pCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgZm9yIChzdWJpZCA9IDA7IGNwICYmIHN1YmlkIDwgNDsgc3ViaWQrKykgewogICAgICAgICAgICAgICAgZmNwID0gY3A7CiAgICAgICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgICAgICpjcDIrKyA9IDA7CiAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgIGlmIChjaGVjayAmJiBvYmppZFsqb2JqaWRsZW5dID4gMjU1KQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgICAgIGNwID0gY3AyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICAgICAgaWYgKHRwLT5yYW5nZXMgJiYgIXRwLT5yYW5nZXMtPm5leHQKICAgICAgICAgICAgICAgICYmIHRwLT5yYW5nZXMtPmxvdyA9PSB0cC0+cmFuZ2VzLT5oaWdoKQogICAgICAgICAgICAgICAgbGVuID0gdHAtPnJhbmdlcy0+bG93OwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBsZW4gPSAtMTsKICAgICAgICAgICAgcG9zID0gMDsKICAgICAgICAgICAgaWYgKCpjcCA9PSAnIicgfHwgKmNwID09ICdcJycpIHsKICAgICAgICAgICAgICAgIGRvaW5ncXVvdGUgPSAqY3ArKzsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBpbnNlcnQgbGVuZ3RoIGlmIHJlcXVlc3RlZCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCFpbl9kaWNlcy0+aXNpbXBsaWVkICYmIGxlbiA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChkb2luZ3F1b3RlID09ICdcJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc25tcF9zZXRfZGV0YWlsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIictcXVvdGUgaXMgZm9yIGZpeGVkIGxlbmd0aCBzdHJpbmdzIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgbGVuX2luZGV4ID0gKm9iamlkbGVuOwogICAgICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvaW5ncXVvdGUgPT0gJyInKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9zZXRfZGV0YWlsCiAgICAgICAgICAgICAgICAgICAgICAgICgiXCItcXVvdGUgaXMgZm9yIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmdzIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CgoJCWNwMiA9IF9hcHBseV9lc2NhcGVzKGNwLCBkb2luZ3F1b3RlKTsKCQlpZiAoIWNwMikgZ290byBiYWRfaWQ7CgkJZWxzZSB7CgkJICAgIHVuc2lnbmVkIGNoYXIgKm5ld192YWw7CgkJICAgIGludCBuZXdfdmFsX2xlbjsKCQkgICAgaW50IHBhcnNlZF9oaW50ID0gMDsKCQkgICAgY29uc3QgY2hhciAqcGFyc2VkX3ZhbHVlOwoKCQkgICAgaWYgKGRvX2hpbnQgJiYgdHAtPmhpbnQpIHsKCQkJcGFyc2VkX3ZhbHVlID0gcGFyc2Vfb2N0ZXRfaGludCh0cC0+aGludCwgY3AsCgkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld192YWwsICZuZXdfdmFsX2xlbik7CgkJCXBhcnNlZF9oaW50ID0gcGFyc2VkX3ZhbHVlID09IE5VTEw7CgkJICAgIH0KCQkgICAgaWYgKHBhcnNlZF9oaW50KSB7CgkJCWludCBpOwoJCQlmb3IgKGkgPSAwOyBpIDwgbmV3X3ZhbF9sZW47IGkrKykgewoJCQkgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pIGdvdG8gYmFkX2lkOwoJCQkgICAgb2JqaWRbICpvYmppZGxlbiBdID0gbmV3X3ZhbFtpXTsKCQkJICAgICgqb2JqaWRsZW4pKys7CgkJCSAgICBwb3MrKzsKCQkJfQoJCQlTTk1QX0ZSRUUobmV3X3ZhbCk7CgkJICAgIH0gZWxzZSB7CgkJCXdoaWxlKCpjcCkgewoJCQkgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pIGdvdG8gYmFkX2lkOwoJCQkgICAgb2JqaWRbICpvYmppZGxlbiBdID0gKmNwKys7CgkJCSAgICAoKm9iamlkbGVuKSsrOwoJCQkgICAgcG9zKys7CgkJCX0KCQkgICAgfQoJCX0KCQkKCQljcDIrKzsKICAgICAgICAgICAgICAgIGlmICghKmNwMikKICAgICAgICAgICAgICAgICAgICBjcDIgPSBOVUxMOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoKmNwMiAhPSAnLicpCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgY3AyKys7CgkJaWYgKGNoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnAgPSB0cC0+cmFuZ2VzOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgb2sgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnAgJiYgIW9rKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJwLT5sb3cgPD0gcG9zICYmIHBvcyA8PSBycC0+aGlnaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluX2RpY2VzLT5pc2ltcGxpZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZFtsZW5faW5kZXhdID0gcG9zOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zICE9IGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CgkJfQoJCWVsc2UgaWYgKGxlbiA9PSAtMSAmJiAhaW5fZGljZXMtPmlzaW1wbGllZCkKCQkgICAgb2JqaWRbbGVuX2luZGV4XSA9IHBvczsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghaW5fZGljZXMtPmlzaW1wbGllZCAmJiBsZW4gPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBmY3AgPSBjcDsKICAgICAgICAgICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCpvYmppZGxlbiArIGxlbiArIDEgPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gbGVuOwogICAgICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgICAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAobGVuICYmIGNwKSB7CiAgICAgICAgICAgICAgICAgICAgZmNwID0gY3A7CiAgICAgICAgICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAgICAgICAgICpjcDIrKyA9IDA7CiAgICAgICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2sgJiYgb2JqaWRbKm9iamlkbGVuXSA+IDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgICAgICAgICBsZW4tLTsKICAgICAgICAgICAgICAgICAgICBjcCA9IGNwMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgICAgIGluX2RpY2VzID0gTlVMTDsKICAgICAgICAgICAgY3AyID0gY3A7CiAgICAgICAgICAgIGJyZWFrOwoJY2FzZSBUWVBFX05FVEFERFI6CgkgICAgZmNwID0gY3A7CgkgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwoJICAgIGlmIChjcDIpCgkJKmNwMisrID0gMDsKCSAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwoJICAgIGlmICgqZWNwKQoJCWdvdG8gYmFkX2lkOwoJICAgIGlmICgqb2JqaWRsZW4gKyAxID49IG1heGxlbikKCQlnb3RvIGJhZF9pZDsKCSAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CgkgICAgKCpvYmppZGxlbikrKzsKCSAgICBjcCA9IGNwMjsKCSAgICBpZiAoc3ViaWQgPT0gMSkgewoJCWZvciAobGVuID0gMDsgY3AgJiYgbGVuIDwgNDsgbGVuKyspIHsKCQkgICAgZmNwID0gY3A7CgkJICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKCQkgICAgaWYgKGNwMikKCQkJKmNwMisrID0gMDsKCQkgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKCQkgICAgaWYgKCplY3ApCgkJCWdvdG8gYmFkX2lkOwoJCSAgICBpZiAoKm9iamlkbGVuICsgMSA+PSBtYXhsZW4pCgkJCWdvdG8gYmFkX2lkOwoJCSAgICBpZiAoY2hlY2sgJiYgc3ViaWQgPiAyNTUpCgkJCWdvdG8gYmFkX2lkOwoJCSAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CgkJICAgICgqb2JqaWRsZW4pKys7CgkJICAgIGNwID0gY3AyOwoJCX0KCSAgICB9CgkgICAgZWxzZSB7CgkJaW5fZGljZXMgPSBOVUxMOwoJICAgIH0KCSAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiVW5leHBlY3RlZCBpbmRleCB0eXBlOiAlZCAlcyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgdHAtPnR5cGUsIGluX2RpY2VzLT5pbGFiZWwsIGNwKTsKICAgICAgICAgICAgaW5fZGljZXMgPSBOVUxMOwogICAgICAgICAgICBjcDIgPSBjcDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNwID0gY3AyOwogICAgICAgIGlmIChpbl9kaWNlcykKICAgICAgICAgICAgaW5fZGljZXMgPSBpbl9kaWNlcy0+bmV4dDsKICAgIH0KCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIHdoaWxlIChjcCkgewogICAgICAgIGZjcCA9IGNwOwogICAgICAgIHN3aXRjaCAoKmNwKSB7CiAgICAgICAgY2FzZSAnMCc6CiAgICAgICAgY2FzZSAnMSc6CiAgICAgICAgY2FzZSAnMic6CiAgICAgICAgY2FzZSAnMyc6CiAgICAgICAgY2FzZSAnNCc6CiAgICAgICAgY2FzZSAnNSc6CiAgICAgICAgY2FzZSAnNic6CiAgICAgICAgY2FzZSAnNyc6CiAgICAgICAgY2FzZSAnOCc6CiAgICAgICAgY2FzZSAnOSc6CiAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICpjcDIrKyA9IDA7CiAgICAgICAgICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnIic6CiAgICAgICAgY2FzZSAnXCcnOgogICAgICAgICAgICBkb2luZ3F1b3RlID0gKmNwKys7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGluc2VydCBsZW5ndGggaWYgcmVxdWVzdGVkIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGRvaW5ncXVvdGUgPT0gJyInKSB7CiAgICAgICAgICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBsZW4gPSBzdHJjaHIoY3AsIGRvaW5ncXVvdGUpIC0gY3A7CiAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNwKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIHdoaWxlICgqY3AgJiYgKmNwICE9IGRvaW5ncXVvdGUpIHsKICAgICAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9ICpjcCsrOwogICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjcDIgPSBjcCArIDE7CiAgICAgICAgICAgIGlmICghKmNwMikKICAgICAgICAgICAgICAgIGNwMiA9IE5VTEw7CiAgICAgICAgICAgIGVsc2UgaWYgKCpjcDIgPT0gJy4nKQogICAgICAgICAgICAgICAgY3AyKys7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICB9CiAgICAgICAgY3AgPSBjcDI7CiAgICB9CiAgICByZXR1cm4gMTsKCiAgYmFkX2lkOgogICAgewogICAgICAgIGNoYXIgICAgICAgICAgICBidWZbMjU2XTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICBpZiAoaW5fZGljZXMpCiAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJJbmRleCBvdXQgb2YgcmFuZ2U6ICVzICglcykiLAogICAgICAgICAgICAgICAgICAgIGZjcCwgaW5fZGljZXMtPmlsYWJlbCk7CiAgICAgICAgZWxzZSBpZiAodHApCiAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJTdWItaWQgbm90IGZvdW5kOiAlcyAtPiAlcyIsIHRwLT5sYWJlbCwgZmNwKTsKICAgICAgICBlbHNlCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgZmNwKTsKICAgICAgICBidWZbIHNpemVvZihidWYpLTEgXSA9IDA7CgogICAgICAgIHNubXBfc2V0X2RldGFpbChidWYpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKioKICogQHNlZSBjb21tZW50cyBvbiBmaW5kX2Jlc3RfdHJlZV9ub2RlIGZvciB1c2FnZSBhZnRlciBmaXJzdCB0aW1lLgogKi8KaW50CmdldF93aWxkX25vZGUoY29uc3QgY2hhciAqbmFtZSwgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAgPSBmaW5kX2Jlc3RfdHJlZV9ub2RlKG5hbWUsIHRyZWVfaGVhZCwgTlVMTCk7CiAgICBpZiAoIXRwKQogICAgICAgIHJldHVybiAwOwogICAgcmV0dXJuIGdldF9ub2RlKHRwLT5sYWJlbCwgb2JqaWQsIG9iamlkbGVuKTsKfQoKaW50CmdldF9ub2RlKGNvbnN0IGNoYXIgKm5hbWUsIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbikKewogICAgY29uc3QgY2hhciAgICAgKmNwOwogICAgY2hhciAgICAgICAgICAgIGNoOwogICAgaW50ICAgICAgICAgICAgIHJlczsKCiAgICBjcCA9IG5hbWU7CiAgICB3aGlsZSAoKGNoID0gKmNwKSkKICAgICAgICBpZiAoKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpCiAgICAgICAgICAgIHx8ICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKQogICAgICAgICAgICB8fCAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykKICAgICAgICAgICAgfHwgY2ggPT0gJy0nKQogICAgICAgICAgICBjcCsrOwogICAgICAgIGVsc2UKICAgICAgICAgICAgYnJlYWs7CiAgICBpZiAoY2ggIT0gJzonKQogICAgICAgIGlmICgqbmFtZSA9PSAnLicpCiAgICAgICAgICAgIHJlcyA9IGdldF9tb2R1bGVfbm9kZShuYW1lICsgMSwgIkFOWSIsIG9iamlkLCBvYmppZGxlbik7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXMgPSBnZXRfbW9kdWxlX25vZGUobmFtZSwgIkFOWSIsIG9iamlkLCBvYmppZGxlbik7CiAgICBlbHNlIHsKICAgICAgICBjaGFyICAgICAgICAgICAqbW9kdWxlOwogICAgICAgIC8qCiAgICAgICAgICogIHJlcXVlc3RlZCBuYW1lIGlzIG9mIHRoZSBmb3JtCiAgICAgICAgICogICAgICAibW9kdWxlOnN1YmlkZW50aWZpZXIiCiAgICAgICAgICovCiAgICAgICAgbW9kdWxlID0gKGNoYXIgKikgbWFsbG9jKChzaXplX3QpIChjcCAtIG5hbWUgKyAxKSk7CiAgICAgICAgaWYgKCFtb2R1bGUpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICBzcHJpbnRmKG1vZHVsZSwgIiUuKnMiLCAoaW50KSAoY3AgLSBuYW1lKSwgbmFtZSk7CiAgICAgICAgY3ArKzsgICAgICAgICAgICAgICAgICAgLyogY3Agbm93IHBvaW50IHRvIHRoZSBzdWJpZGVudGlmaWVyICovCiAgICAgICAgaWYgKCpjcCA9PSAnOicpCiAgICAgICAgICAgIGNwKys7CgogICAgICAgIC8qCiAgICAgICAgICogJ2NwJyBhbmQgJ25hbWUnICpkbyogZ28gdGhhdCB3YXkgcm91bmQhIAogICAgICAgICAqLwogICAgICAgIHJlcyA9IGdldF9tb2R1bGVfbm9kZShjcCwgbW9kdWxlLCBvYmppZCwgb2JqaWRsZW4pOwogICAgICAgIFNOTVBfRlJFRShtb2R1bGUpOwogICAgfQogICAgaWYgKHJlcyA9PSAwKSB7CiAgICAgICAgU0VUX1NOTVBfRVJST1IoU05NUEVSUl9VTktOT1dOX09CSklEKTsKICAgIH0KCiAgICByZXR1cm4gcmVzOwp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiNpZmRlZiB0ZXN0aW5nCgptYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIG9pZCAgICAgICAgICAgICBvYmppZFtNQVhfT0lEX0xFTl07CiAgICBpbnQgICAgICAgICAgICAgb2JqaWRsZW4gPSBNQVhfT0lEX0xFTjsKICAgIGludCAgICAgICAgICAgICBjb3VudDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCB2YXJpYWJsZTsKCiAgICBuZXRzbm1wX2luaXRfbWliKCk7CiAgICBpZiAoYXJnYyA8IDIpCiAgICAgICAgcHJpbnRfc3VidHJlZShzdGRvdXQsIHRyZWVfaGVhZCwgMCk7CiAgICB2YXJpYWJsZS50eXBlID0gQVNOX0lOVEVHRVI7CiAgICB2YXJpYWJsZS52YWwuaW50ZWdlciA9IDM7CiAgICB2YXJpYWJsZS52YWxfbGVuID0gNDsKICAgIGZvciAoYXJnYy0tOyBhcmdjOyBhcmdjLS0sIGFyZ3YrKykgewogICAgICAgIG9iamlkbGVuID0gTUFYX09JRF9MRU47CiAgICAgICAgcHJpbnRmKCJyZWFkX29iamlkKCVzKSA9ICVkXG4iLAogICAgICAgICAgICAgICBhcmd2WzFdLCByZWFkX29iamlkKGFyZ3ZbMV0sIG9iamlkLCAmb2JqaWRsZW4pKTsKICAgICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBvYmppZGxlbjsgY291bnQrKykKICAgICAgICAgICAgcHJpbnRmKCIlZC4iLCBvYmppZFtjb3VudF0pOwogICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICBwcmludF92YXJpYWJsZShvYmppZCwgb2JqaWRsZW4sICZ2YXJpYWJsZSk7CiAgICB9Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdGluZyAqLwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoKICogaW5pdGlhbGl6ZTogbm8gcGVlcnMgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4gCiAqLwp2b2lkCmNsZWFyX3RyZWVfZmxhZ3MocmVnaXN0ZXIgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBmb3IgKDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikgewogICAgICAgIHRwLT5yZXBvcnRlZCA9IDA7CiAgICAgICAgaWYgKHRwLT5jaGlsZF9saXN0KQogICAgICAgICAgICBjbGVhcl90cmVlX2ZsYWdzKHRwLT5jaGlsZF9saXN0KTsKICAgICAvKlJFQ1VSU0UqL30KfQoKLyoKICogVXBkYXRlOiAxOTk4LTA3LTE3IDxqaHlAZ3N1LmVkdT4KICogQWRkZWQgcHJpbnRfb2lkX3JlcG9ydCogZnVuY3Rpb25zLgogKi8Kc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9sYWJlbGVkb2lkID0gMDsKc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9vaWQgPSAwOwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N5bWJvbGljID0gMDsKc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9taWJjaGlsZG9pZCA9IDA7CnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3VmZml4ID0gMDsKCi8qCiAqIFRoZXNlIG1ldGhvZHMgcmVjdXJzZS4gCiAqLwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfcGFyZW50X2xhYmVsZWRvaWQoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHByaW50X3BhcmVudF9vaWQoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHByaW50X3BhcmVudF9taWJjaGlsZG9pZChGSUxFICosIHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfcGFyZW50X2xhYmVsKEZJTEUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqLCBpbnQpOwoKCnZvaWQKcHJpbnRfb2lkX3JlcG9ydChGSUxFICogZnApCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKICAgIGNsZWFyX3RyZWVfZmxhZ3ModHJlZV9oZWFkKTsKICAgIGZvciAodHAgPSB0cmVlX2hlYWQ7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpCiAgICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0KGZwLCB0cCwgMCk7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfbGFiZWxlZG9pZCh2b2lkKQp7CiAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbGFiZWxlZG9pZCA9IDE7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfb2lkKHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9vaWQgPSAxOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX3N1ZmZpeCh2b2lkKQp7CiAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3VmZml4ID0gMTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9zeW1ib2xpYyh2b2lkKQp7CiAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3ltYm9saWMgPSAxOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX21pYmNoaWxkb2lkKHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9taWJjaGlsZG9pZCA9IDE7Cn0KCi8qCiAqIGhlbHBlciBtZXRob2RzIGZvciBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoKQogKiBlYWNoIG9uZSB0cmF2ZXJzZXMgYmFjayB1cCB0aGUgbm9kZSB0cmVlCiAqIHVudGlsIHRoZXJlIGlzIG5vIHBhcmVudC4gIFRoZW4sIHRoZSBsYWJlbCBjb21iaW5hdGlvbgogKiBpcyBvdXRwdXQsIHN1Y2ggdGhhdCB0aGUgcGFyZW50IGlzIGRpc3BsYXllZCBmaXJzdC4KICoKICogV2FybmluZzogdGhlc2UgbWV0aG9kcyBhcmUgYWxsIHJlY3Vyc2l2ZS4KICovCgpzdGF0aWMgdm9pZApwcmludF9wYXJlbnRfbGFiZWxlZG9pZChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBpZiAodHApIHsKICAgICAgICBpZiAodHAtPnBhcmVudCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfbGFiZWxlZG9pZChmLCB0cC0+cGFyZW50KTsKICAgICAgICAgLypSRUNVUlNFKi99CiAgICAgICAgZnByaW50ZihmLCAiLiVzKCVsdSkiLCB0cC0+bGFiZWwsIHRwLT5zdWJpZCk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCnByaW50X3BhcmVudF9vaWQoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cCkKewogICAgaWYgKHRwKSB7CiAgICAgICAgaWYgKHRwLT5wYXJlbnQpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X29pZChmLCB0cC0+cGFyZW50KTsKICAgICAgICAgLypSRUNVUlNFKi99CiAgICAgICAgZnByaW50ZihmLCAiLiVsdSIsIHRwLT5zdWJpZCk7CiAgICB9Cn0KCgpzdGF0aWMgdm9pZCBwcmludF9wYXJlbnRfbWliY2hpbGRvaWQoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cCkKewogICAgc3RhdGljIHN0cnVjdCB0cmVlICp0ZW1wOwogICAgdW5zaWduZWQgbG9uZyBlbGVtc1sxMDBdOwogICAgaW50IGVsZW1fY250ID0gMDsKICAgIGludCBpID0gMDsKICAgIHRlbXAgPSB0cDsKICAgIGlmICh0ZW1wKSB7CiAgICAgICAgd2hpbGUgKHRlbXAtPnBhcmVudCkgewogICAgICAgICAgICAgICAgZWxlbXNbZWxlbV9jbnQrK10gPSB0ZW1wLT5zdWJpZDsKICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wLT5wYXJlbnQ7CiAgICAgICAgfQogICAgICAgIGVsZW1zW2VsZW1fY250KytdID0gdGVtcC0+c3ViaWQ7CiAgICB9CiAgICBmb3IgKGkgPSBlbGVtX2NudCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgaWYgKGkgPT0gZWxlbV9jbnQgLSAxKSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVsdSIsIGVsZW1zW2ldKTsgICAgICAgICAgIAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIuJWx1IiwgZWxlbXNbaV0pOyAgICAgICAgICAKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkCnByaW50X3BhcmVudF9sYWJlbChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBpZiAodHApIHsKICAgICAgICBpZiAodHAtPnBhcmVudCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfbGFiZWwoZiwgdHAtPnBhcmVudCk7CiAgICAgICAgIC8qUkVDVVJTRSovfQogICAgICAgIGZwcmludGYoZiwgIi4lcyIsIHRwLT5sYWJlbCk7CiAgICB9Cn0KCi8qKgogKiBAaW50ZXJuYWwKICogVGhpcyBtZXRob2RzIGdlbmVyYXRlcyB2YXJpYXRpb25zIG9uIHRoZSBvcmlnaW5hbCBwcmludF9zdWJ0cmVlKCkgcmVwb3J0LgogKiBUcmF2ZXJzZSB0aGUgdHJlZSBkZXB0aCBmaXJzdCwgZnJvbSBsZWFzdCB0byBncmVhdGVzdCBzdWItaWRlbnRpZmllci4KICogV2FybmluZzogdGhpcyBtZXRob2RzIHJlY3Vyc2VzIGFuZCBjYWxscyBtZXRob2RzIHRoYXQgcmVjdXJzZS4KICoKICogQHBhcmFtIGYgICAgICAgRmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gdHJlZSAgICA/Pz8KICogQHBhcmFtIGNvdW50ICAgPz8/CiAqLwoKc3RhdGljIHZvaWQKcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0KEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHJlZSwgaW50IGNvdW50KQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CgogICAgY291bnQrKzsKCiAgICAvKgogICAgICogc2FuaXR5IGNoZWNrIAogICAgICovCiAgICBpZiAoIXRyZWUpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyoKICAgICAqIGZpbmQgdGhlIG5vdCByZXBvcnRlZCBwZWVyIHdpdGggdGhlIGxvd2VzdCBzdWItaWRlbnRpZmllci4KICAgICAqIGlmIG5vIG1vcmUsIGJyZWFrIHRoZSBsb29wIGFuZCBjbGVhbnVwLgogICAgICogc2V0ICJyZXBvcnRlZCIgZmxhZywgYW5kIGNyZWF0ZSByZXBvcnQgZm9yIHRoaXMgcGVlci4KICAgICAqIHJlY3Vyc2UgdXNpbmcgdGhlIGNoaWxkcmVuIG9mIHRoaXMgcGVlciwgaWYgYW55LgogICAgICovCiAgICB3aGlsZSAoMSkgewogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCB0cmVlICpudHA7CgogICAgICAgIHRwID0gTlVMTDsKICAgICAgICBmb3IgKG50cCA9IHRyZWUtPmNoaWxkX2xpc3Q7IG50cDsgbnRwID0gbnRwLT5uZXh0X3BlZXIpIHsKICAgICAgICAgICAgaWYgKG50cC0+cmVwb3J0ZWQpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmICghdHAgfHwgKHRwLT5zdWJpZCA+IG50cC0+c3ViaWQpKQogICAgICAgICAgICAgICAgdHAgPSBudHA7CiAgICAgICAgfQogICAgICAgIGlmICghdHApCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICB0cC0+cmVwb3J0ZWQgPSAxOwoKICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X2xhYmVsZWRvaWQpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X2xhYmVsZWRvaWQoZiwgdHApOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X29pZCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfb2lkKGYsIHRwKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zeW1ib2xpYykgewogICAgICAgICAgICBwcmludF9wYXJlbnRfbGFiZWwoZiwgdHApOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X21pYmNoaWxkb2lkKSB7CgkgICAgZnByaW50ZihmLCAiXCIlc1wiXHQiLCB0cC0+bGFiZWwpOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcdFx0XCIiKTsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X21pYmNoaWxkb2lkKGYsIHRwKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiXCJcbiIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N1ZmZpeCkgewogICAgICAgICAgICBpbnQgICAgICAgICAgICAgaTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgICIpOwogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyglbGQpIHR5cGU9JWQiLCB0cC0+bGFiZWwsIHRwLT5zdWJpZCwgdHAtPnR5cGUpOwogICAgICAgICAgICBpZiAodHAtPnRjX2luZGV4ICE9IC0xKQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiIHRjPSVkIiwgdHAtPnRjX2luZGV4KTsKICAgICAgICAgICAgaWYgKHRwLT5oaW50KQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiIGhpbnQ9JXMiLCB0cC0+aGludCk7CiAgICAgICAgICAgIGlmICh0cC0+dW5pdHMpCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgdW5pdHM9JXMiLCB0cC0+dW5pdHMpOwoKICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0KGYsIHRwLCBjb3VudCk7CiAgICAgLypSRUNVUlNFKi99Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKCi8qKgogKiBDb252ZXJ0cyB0aW1ldGlja3MgdG8gaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgc3RyaW5nLgogKgogKiBAcGFyYW0gdGltZXRpY2tzICAgIFRoZSB0aW1ldGlja3MgdG8gY29udmVydC4KICogQHBhcmFtIGJ1ZiAgICAgICAgICBCdWZmZXIgdG8gd3JpdGUgdG8sIGhhcyB0byBiZSBhdCAKICogICAgICAgICAgICAgICAgICAgICBsZWFzdCA0MCBCeXRlcyBsYXJnZS4KICogICAgICAgCiAqIEByZXR1cm4gVGhlIGJ1ZmZlcgogKgogKiBAc2VlIHVwdGltZVN0cmluZwogKi8KY2hhciAgICAgICAgICAgKgp1cHRpbWVfc3RyaW5nKHVfbG9uZyB0aW1ldGlja3MsIGNoYXIgKmJ1ZikKewogICAgcmV0dXJuIHVwdGltZV9zdHJpbmdfbiggdGltZXRpY2tzLCBidWYsIDQwKTsKfQoKY2hhciAgICAgICAgICAgKgp1cHRpbWVfc3RyaW5nX24odV9sb25nIHRpbWV0aWNrcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CiAgICB1cHRpbWVTdHJpbmcodGltZXRpY2tzLCBidWYsIGJ1Zmxlbik7CiAgICByZXR1cm4gYnVmOwp9CgovKioKICogR2l2ZW4gYSBzdHJpbmcsIHBhcnNlcyBhbiBvaWQgb3V0IG9mIGl0IChpZiBwb3NzaWJsZSkuCiAqIEl0IHdpbGwgdHJ5IHRvIHBhcnNlIGl0IGJhc2VkIG9uIHByZWRldGVybWluZWQgY29uZmlndXJhdGlvbiBpZgogKiBwcmVzZW50IG9yIGJ5IGV2ZXJ5IG1ldGhvZCBwb3NzaWJsZSBvdGhlcndpc2UuCiAqIElmIGEgc3VmZml4IGhhcyBiZWVuIHJlZ2lzdGVyZWQgdXNpbmcgTkVUU05NUF9EU19MSUJfT0lEU1VGRklYLCBpdAogKiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBpbnB1dCBzdHJpbmcgYmVmb3JlIHByb2Nlc3NpbmcuCiAqCiAqIEBwYXJhbSBhcmd2ICAgIFRoZSBPSUQgdG8gc3RyaW5nIHBhcnNlCiAqIEBwYXJhbSByb290ICAgIEFuIE9JRCBhcnJheSB3aGVyZSB0aGUgcmVzdWx0cyBhcmUgc3RvcmVkLgogKiBAcGFyYW0gcm9vdGxlbiBUaGUgbWF4IGxlbmd0aCBvZiB0aGUgYXJyYXkgZ29pbmcgaW4gYW5kIHRoZSBkYXRhCiAqICAgICAgICAgICAgICAgIGxlbmd0aCBjb21pbmcgb3V0LgogKgogKiBAcmV0dXJuICAgICAgICBUaGUgcm9vdCBvaWQgcG9pbnRlciBpZiBzdWNjZXNzZnVsLCBvciBOVUxMIG90aGVyd2lzZS4KICovCiAKb2lkICAgICAgICAgICAgKgpzbm1wX3BhcnNlX29pZChjb25zdCBjaGFyICphcmd2LCBvaWQgKiByb290LCBzaXplX3QgKiByb290bGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgc2F2bGVuID0gKnJvb3RsZW47CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wYnVmX2xlbiA9IDA7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wYnVmOwogICAgY29uc3QgY2hhciAgICAgKnN1ZmZpeCwgKnByZWZpeDsKCiAgICBzdWZmaXggPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX09JRFNVRkZJWCk7CiAgICBwcmVmaXggPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX09JRFBSRUZJWCk7CiAgICBpZiAoKHN1ZmZpeCAmJiBzdWZmaXhbMF0pIHx8IChwcmVmaXggJiYgcHJlZml4WzBdKSkgewogICAgICAgIGlmICghc3VmZml4KQogICAgICAgICAgICBzdWZmaXggPSAiIjsKICAgICAgICBpZiAoIXByZWZpeCkKICAgICAgICAgICAgcHJlZml4ID0gIiI7CiAgICAgICAgaWYgKChzdHJsZW4oc3VmZml4KSArIHN0cmxlbihwcmVmaXgpICsgc3RybGVuKGFyZ3YpICsgMikgPiB0bXBidWZfbGVuKSB7CiAgICAgICAgICAgIHRtcGJ1Zl9sZW4gPSBzdHJsZW4oc3VmZml4KSArIHN0cmxlbihhcmd2KSArIHN0cmxlbihwcmVmaXgpICsgMjsKICAgICAgICAgICAgdG1wYnVmID0gKGNoYXIgKilyZWFsbG9jKHRtcGJ1ZiwgdG1wYnVmX2xlbik7CiAgICAgICAgfQogICAgICAgIHNucHJpbnRmKHRtcGJ1ZiwgdG1wYnVmX2xlbiwgIiVzJXMlcyVzIiwgcHJlZml4LCBhcmd2LAogICAgICAgICAgICAgICAgICgoc3VmZml4WzBdID09ICcuJyB8fCBzdWZmaXhbMF0gPT0gJ1wwJykgPyAiIiA6ICIuIiksCiAgICAgICAgICAgICAgICAgc3VmZml4KTsKICAgICAgICBhcmd2ID0gdG1wYnVmOwogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wX3BhcnNlX29pZCIsIlBhcnNpbmc6ICVzXG4iLGFyZ3YpKTsKICAgIH0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JBTkRPTV9BQ0NFU1MpCiAgICAgICAgfHwgc3RyY2hyKGFyZ3YsICc6JykpIHsKICAgICAgICBpZiAoZ2V0X25vZGUoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkVHRVhfQUNDRVNTKSkgewoJY2xlYXJfdHJlZV9mbGFncyh0cmVlX2hlYWQpOwogICAgICAgIGlmIChnZXRfd2lsZF9ub2RlKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KICAgIH0gZWxzZSB7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgICAgICBpZiAocmVhZF9vYmppZChhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICAgICAgKnJvb3RsZW4gPSBzYXZsZW47CiAgICAgICAgaWYgKGdldF9ub2RlKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KICAgICAgICAqcm9vdGxlbiA9IHNhdmxlbjsKICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkIiwgIndpbGRseSBwYXJzaW5nXG4iKSk7CgljbGVhcl90cmVlX2ZsYWdzKHRyZWVfaGVhZCk7CiAgICAgICAgaWYgKGdldF93aWxkX25vZGUoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICByZXR1cm4gTlVMTDsKfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoKICogVXNlIERJU1BMQVktSElOVCB0byBwYXJzZSBhIHZhbHVlIGludG8gYW4gb2N0ZXQgc3RyaW5nLgogKgogKiBub3RlIHRoYXQgIjFkMWQiLCAiMTEiIGNvdWxkIGhhdmUgY29tZSBmcm9tIGFuIG9jdGV0IHN0cmluZyB0aGF0CiAqIGxvb2tlZCBsaWtlIHsgMSwgMSB9IG9yIGFuIG9jdGV0IHN0cmluZyB0aGF0IGxvb2tlZCBsaWtlIHsgMTEgfQogKiBiZWNhdXNlIG9mIHRoaXMsIGl0J3MgZG91YnRmdWwgdGhhdCBhbnlvbmUgd291bGQgdXNlIHN1Y2ggYSBkaXNwbGF5CiAqIHN0cmluZy4gVGhlcmVmb3JlLCB0aGUgcGFyc2VyIGlnbm9yZXMgdGhpcyBjYXNlLgogKi8KCnN0cnVjdCBwYXJzZV9oaW50cyB7CiAgICBpbnQgbGVuZ3RoOwogICAgaW50IHJlcGVhdDsKICAgIGludCBmb3JtYXQ7CiAgICBpbnQgc2VwYXJhdG9yOwogICAgaW50IHRlcm1pbmF0b3I7CiAgICB1bnNpZ25lZCBjaGFyICpyZXN1bHQ7CiAgICBpbnQgcmVzdWx0X21heDsKICAgIGludCByZXN1bHRfbGVuOwp9OwoKc3RhdGljIHZvaWQgcGFyc2VfaGludHNfcmVzZXQoc3RydWN0IHBhcnNlX2hpbnRzICpwaCkKewogICAgcGgtPmxlbmd0aCA9IDA7CiAgICBwaC0+cmVwZWF0ID0gMDsKICAgIHBoLT5mb3JtYXQgPSAwOwogICAgcGgtPnNlcGFyYXRvciA9IDA7CiAgICBwaC0+dGVybWluYXRvciA9IDA7Cn0KCnN0YXRpYyB2b2lkIHBhcnNlX2hpbnRzX2N0b3Ioc3RydWN0IHBhcnNlX2hpbnRzICpwaCkKewogICAgcGFyc2VfaGludHNfcmVzZXQocGgpOwogICAgcGgtPnJlc3VsdCA9IE5VTEw7CiAgICBwaC0+cmVzdWx0X21heCA9IDA7CiAgICBwaC0+cmVzdWx0X2xlbiA9IDA7Cn0KCnN0YXRpYyBpbnQgcGFyc2VfaGludHNfYWRkX3Jlc3VsdF9vY3RldChzdHJ1Y3QgcGFyc2VfaGludHMgKnBoLCB1bnNpZ25lZCBjaGFyIG9jdGV0KQp7CiAgICBpZiAoIShwaC0+cmVzdWx0X2xlbiA8IHBoLT5yZXN1bHRfbWF4KSkgewoJcGgtPnJlc3VsdF9tYXggPSBwaC0+cmVzdWx0X2xlbiArIDMyOwoJaWYgKCFwaC0+cmVzdWx0KSB7CgkgICAgcGgtPnJlc3VsdCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKHBoLT5yZXN1bHRfbWF4KTsKCX0gZWxzZSB7CgkgICAgcGgtPnJlc3VsdCA9ICh1bnNpZ25lZCBjaGFyICopcmVhbGxvYyhwaC0+cmVzdWx0LCBwaC0+cmVzdWx0X21heCk7Cgl9CiAgICB9CiAgICAKICAgIGlmICghcGgtPnJlc3VsdCkgewoJcmV0dXJuIDA7CQkvKiBmYWlsZWQgKi8KICAgIH0KCiAgICBwaC0+cmVzdWx0W3BoLT5yZXN1bHRfbGVuKytdID0gb2N0ZXQ7CiAgICByZXR1cm4gMTsJCQkvKiBzdWNjZXNzICovCn0KCnN0YXRpYyBpbnQgcGFyc2VfaGludHNfcGFyc2Uoc3RydWN0IHBhcnNlX2hpbnRzICpwaCwgY29uc3QgY2hhciAqKnZfaW5fb3V0KQp7CiAgICBjb25zdCBjaGFyICp2ID0gKnZfaW5fb3V0OwogICAgY2hhciAqbnY7CiAgICBpbnQgYmFzZTsKICAgIGludCByZXBlYXRzID0gMDsKICAgIGludCByZXBlYXRfZml4dXAgPSBwaC0+cmVzdWx0X2xlbjsKICAgIAogICAgaWYgKHBoLT5yZXBlYXQpIHsKCWlmICghcGFyc2VfaGludHNfYWRkX3Jlc3VsdF9vY3RldChwaCwgMCkpIHsKCSAgICByZXR1cm4gMDsKCX0KICAgIH0KICAgIGRvIHsKCWJhc2UgPSAwOwoJc3dpdGNoIChwaC0+Zm9ybWF0KSB7CgljYXNlICd4JzogYmFzZSArPSA2OwkvKiBmYWxsIHRocm91Z2ggKi8KCWNhc2UgJ2QnOiBiYXNlICs9IDI7CS8qIGZhbGwgdGhyb3VnaCAqLwoJY2FzZSAnbyc6IGJhc2UgKz0gODsJLyogZmFsbCB0aHJvdWdoICovCgkgICAgewoJCWludCBpOwoJCXVuc2lnbmVkIGxvbmcgbnVtYmVyID0gc3RydG9sKHYsICZudiwgYmFzZSk7CgkJaWYgKG52ID09IHYpIHJldHVybiAwOwoJCXYgPSBudjsKCQlmb3IgKGkgPSAwOyBpIDwgcGgtPmxlbmd0aDsgaSsrKSB7CgkJICAgIGludCBzaGlmdCA9IDggKiAocGgtPmxlbmd0aCAtIDEgLSBpKTsKCQkgICAgaWYgKCFwYXJzZV9oaW50c19hZGRfcmVzdWx0X29jdGV0KHBoLCAodV9jaGFyKShudW1iZXIgPj4gc2hpZnQpICkpIHsKCQkJcmV0dXJuIDA7IC8qIGZhaWxlZCAqLwoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBicmVhazsKCgljYXNlICdhJzoKCSAgICB7CgkJaW50IGk7CgkJICAgIAoJCWZvciAoaSA9IDA7IGkgPCBwaC0+bGVuZ3RoICYmICp2OyBpKyspIHsKCQkgICAgaWYgKCFwYXJzZV9oaW50c19hZGRfcmVzdWx0X29jdGV0KHBoLCAqdisrKSkgewoJCQlyZXR1cm4gMDsJLyogZmFpbGVkICovCgkJICAgIH0KCQl9CgkgICAgfQoJICAgIGJyZWFrOwoJfQoKCXJlcGVhdHMrKzsKCglpZiAocGgtPnNlcGFyYXRvciAmJiAqdikgewoJICAgIGlmICgqdiA9PSBwaC0+c2VwYXJhdG9yKSB7CgkJdisrOwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIDA7CQkvKiBmYWlsZWQgKi8KCSAgICB9Cgl9CgoJaWYgKHBoLT50ZXJtaW5hdG9yKSB7CgkgICAgaWYgKCp2ID09IHBoLT50ZXJtaW5hdG9yKSB7CgkJdisrOwoJCWJyZWFrOwoJICAgIH0KCX0KICAgIH0gd2hpbGUgKHBoLT5yZXBlYXQgJiYgKnYpOwogICAgaWYgKHBoLT5yZXBlYXQpIHsKCXBoLT5yZXN1bHRbcmVwZWF0X2ZpeHVwXSA9IHJlcGVhdHM7CiAgICB9CgogICAgKnZfaW5fb3V0ID0gdjsKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgdm9pZCBwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KHN0cnVjdCBwYXJzZV9oaW50cyAqcGgsIGludCBkaWdpdCkKewogICAgcGgtPmxlbmd0aCAqPSAxMDsKICAgIHBoLT5sZW5ndGggKz0gZGlnaXQgLSAnMCc7Cn0KCmNvbnN0IGNoYXIgKnBhcnNlX29jdGV0X2hpbnQoY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdmFsdWUsIHVuc2lnbmVkIGNoYXIgKipuZXdfdmFsLCBpbnQgKm5ld192YWxfbGVuKQp7CiAgICBjb25zdCBjaGFyICpoID0gaGludDsKICAgIGNvbnN0IGNoYXIgKnYgPSB2YWx1ZTsKICAgIHN0cnVjdCBwYXJzZV9oaW50cyBwaDsKICAgIGludCByZXR2YWwgPSAxOwogICAgLyogU2VlIFJGQyAxNDQzICovCiAgICBlbnVtIHsKCUhJTlRfMV8yLAoJSElOVF8yXzMsCglISU5UXzFfMl80LAoJSElOVF8xXzJfNQogICAgfSBzdGF0ZSA9IEhJTlRfMV8yOwoKICAgIHBhcnNlX2hpbnRzX2N0b3IoJnBoKTsKICAgIHdoaWxlICgqaCAmJiAqdiAmJiByZXR2YWwpIHsKCXN3aXRjaCAoc3RhdGUpIHsKCWNhc2UgSElOVF8xXzI6CgkgICAgaWYgKCcqJyA9PSAqaCkgewoJCXBoLnJlcGVhdCA9IDE7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKCpoKSkpIHsKCQlwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KCZwaCwgKmgpOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIHsKCQlyZXR1cm4gdjsJLyogZmFpbGVkICovCgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgSElOVF8yXzM6CgkgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKCpoKSkpIHsKCQlwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KCZwaCwgKmgpOwoJCS8qIHN0YXRlID0gSElOVF8yXzMgKi8KCSAgICB9IGVsc2UgaWYgKCd4JyA9PSAqaCB8fCAnZCcgPT0gKmggfHwgJ28nID09ICpoIHx8ICdhJyA9PSAqaCkgewoJCXBoLmZvcm1hdCA9ICpoOwoJCXN0YXRlID0gSElOVF8xXzJfNDsKCSAgICB9IGVsc2UgewoJCXJldHVybiB2OwkvKiBmYWlsZWQgKi8KCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSBISU5UXzFfMl80OgoJICAgIGlmICgnKicgPT0gKmgpIHsKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoJCQoJCXBoLnJlcGVhdCA9IDE7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKCpoKSkpIHsKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoJCQoJCXBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoJnBoLCAqaCk7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgewoJCXBoLnNlcGFyYXRvciA9ICpoOwoJCXN0YXRlID0gSElOVF8xXzJfNTsKCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSBISU5UXzFfMl81OgoJICAgIGlmICgnKicgPT0gKmgpIHsKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoJCQoJCXBoLnJlcGVhdCA9IDE7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKCpoKSkpIHsKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoJCQoJCXBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoJnBoLCAqaCk7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgewoJCXBoLnRlcm1pbmF0b3IgPSAqaDsKCgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCgkJc3RhdGUgPSBISU5UXzFfMjsKCSAgICB9CgkgICAgYnJlYWs7Cgl9CgloKys7CiAgICB9CiAgICB3aGlsZSAoKnYgJiYgcmV0dmFsKSB7CglyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKICAgIH0KICAgIGlmIChyZXR2YWwpIHsKCSpuZXdfdmFsID0gcGgucmVzdWx0OwoJKm5ld192YWxfbGVuID0gcGgucmVzdWx0X2xlbjsKICAgIH0gZWxzZSB7CglpZiAocGgucmVzdWx0KSB7CgkgICAgU05NUF9GUkVFKHBoLnJlc3VsdCk7Cgl9CgkqbmV3X3ZhbCA9IE5VTEw7CgkqbmV3X3ZhbF9sZW4gPSAwOwogICAgfQogICAgcmV0dXJuIHJldHZhbCA/IE5VTEwgOiB2Owp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiNpZmRlZiB0ZXN0X2Rpc3BsYXlfaGludAoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQp7CiAgICBjb25zdCBjaGFyICpoaW50OwogICAgY29uc3QgY2hhciAqdmFsdWU7CiAgICB1bnNpZ25lZCBjaGFyICpuZXdfdmFsOwogICAgaW50IG5ld192YWxfbGVuOwogICAgY2hhciAqcjsKICAgIAogICAgaWYgKGFyZ2MgPCAzKSB7CglmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBkaCA8aGludD4gPHZhbHVlPlxuIik7CglleGl0KDIpOwogICAgfQogICAgaGludCA9IGFyZ3ZbMV07CiAgICB2YWx1ZSA9IGFyZ3ZbMl07CiAgICByID0gcGFyc2Vfb2N0ZXRfaGludChoaW50LCB2YWx1ZSwgJm5ld192YWwsICZuZXdfdmFsX2xlbik7CiAgICBwcmludGYoIntcIiVzXCIsIFwiJXNcIn06IFxuXHQiLCBoaW50LCB2YWx1ZSk7CiAgICBpZiAocikgewogICAgICAgICpyID0gMDsKICAgIAlwcmludGYoInJldHVybmVkIGZhaWxlZFxuIik7CglwcmludGYoInZhbHVlIHN5bnRheCBlcnJvciBhdDogJXNcbiIsIHZhbHVlKTsKICAgIH0KICAgIGVsc2UgewoJaW50IGk7CglwcmludGYoInJldHVybmVkIHN1Y2Nlc3NcbiIpOwoJZm9yIChpID0gMDsgaSA8IG5ld192YWxfbGVuOyBpKyspIHsKCSAgICBpbnQgYyA9IG5ld192YWxbaV0gJiAweEZGOwoJICAgIHByaW50ZigiJTAyWCglYykgIiwgYywgaXNwcmludChjKSA/IGMgOiAnICcpOwoJfQoJU05NUF9GUkVFKG5ld192YWwpOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwogICAgZXhpdCgwKTsKfQoKI2VuZGlmIC8qIHRlc3RfZGlzcGxheV9oaW50ICovCgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTUlCX1RPX0FTTl9UWVBFCnVfY2hhcgptaWJfdG9fYXNuX3R5cGUoaW50IG1pYl90eXBlKQp7CiAgICBzd2l0Y2ggKG1pYl90eXBlKSB7CiAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgcmV0dXJuIEFTTl9PQkpFQ1RfSUQ7CgogICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgIHJldHVybiBBU05fT0NURVRfU1RSOwoKICAgIGNhc2UgVFlQRV9ORVRBRERSOgogICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICByZXR1cm4gQVNOX0lQQUREUkVTUzsKCiAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgcmV0dXJuIEFTTl9JTlRFR0VSOwoKICAgIGNhc2UgVFlQRV9DT1VOVEVSOgogICAgICAgIHJldHVybiBBU05fQ09VTlRFUjsKCiAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgcmV0dXJuIEFTTl9HQVVHRTsKCiAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgIHJldHVybiBBU05fVElNRVRJQ0tTOwoKICAgIGNhc2UgVFlQRV9PUEFRVUU6CiAgICAgICAgcmV0dXJuIEFTTl9PUEFRVUU7CgogICAgY2FzZSBUWVBFX05VTEw6CiAgICAgICAgcmV0dXJuIEFTTl9OVUxMOwoKICAgIGNhc2UgVFlQRV9DT1VOVEVSNjQ6CiAgICAgICAgcmV0dXJuIEFTTl9DT1VOVEVSNjQ7CgogICAgY2FzZSBUWVBFX0JJVFNUUklORzoKICAgICAgICByZXR1cm4gQVNOX0JJVF9TVFI7CgogICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgcmV0dXJuIEFTTl9VTlNJR05FRDsKCiAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgcmV0dXJuIEFTTl9OU0FQOwoKICAgIH0KICAgIHJldHVybiAtMTsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9NSUJfVE9fQVNOX1RZUEUgKi8KCi8qKgogKiBDb252ZXJ0cyBhIHN0cmluZyB0byBpdHMgT0lEIGZvcm0uCiAqIGluIGV4YW1wbGUgICJoZWxsbyIgPSA1IC4gJ2gnIC4gJ2UnIC4gJ2wnIC4gJ2wnIC4gJ28nCiAqCiAqIEBwYXJhbSBTICAgVGhlIHN0cmluZy4KICogQHBhcmFtIE8gICBUaGUgb2lkLgogKiBAcGFyYW0gTCAgIFRoZSBsZW5ndGggb2YgdGhlIG9pZC4KICoKICogQHJldHVybiAwIG9uIFN1Y2VzcywgMSBvbiBmYWlsdXJlLgogKi8KI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX01JQl9TVFJJTkdfQ09OVkVSU0lPTlMKaW50Cm5ldHNubXBfc3RyMm9pZChjb25zdCBjaGFyICpTLCBvaWQgKiBPLCBpbnQgTCkKewogICAgY29uc3QgY2hhciAgICAgKmMgPSBTOwogICAgb2lkICAgICAgICAgICAgKm8gPSAmT1sxXTsKCiAgICAtLUw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVhdmUgcm9vbSBmb3IgbGVuZ3RoIHByZWZpeCAqLwoKICAgIGZvciAoOyAqYyAmJiBMOyAtLUwsICsrbywgKytjKQogICAgICAgICpvID0gKmM7CgogICAgLyoKICAgICAqIG1ha2Ugc3VyZSB3ZSBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIAogICAgICovCiAgICBpZiAoKmMgIT0gMCkKICAgICAgICByZXR1cm4gMTsKCiAgICAvKgogICAgICogc2V0IHRoZSBsZW5ndGggb2YgdGhlIG9pZCAKICAgICAqLwogICAgKk8gPSBjIC0gUzsKCiAgICByZXR1cm4gMDsKfQoKLyoqCiAqIENvbnZlcnRzIGFuIE9JRCB0byBpdHMgY2hhcmFjdGVyIGZvcm0uCiAqIGluIGV4YW1wbGUgIDUgLiAxIC4gMiAuIDMgLiA0IC4gNSA9IDEyMzQ1CiAqCiAqIEBwYXJhbSBDICAgVGhlIGNoYXJhY3RlciBidWZmZXIuCiAqIEBwYXJhbSBMICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLgogKiBAcGFyYW0gTyAgIFRoZSBvaWQuCiAqCiAqIEByZXR1cm4gMCBvbiBTdWNlc3MsIDEgb24gZmFpbHVyZS4KICovCmludApuZXRzbm1wX29pZDJjaGFycyhjaGFyICpDLCBpbnQgTCwgY29uc3Qgb2lkICogTykKewogICAgY2hhciAgICAgICAgICAgKmMgPSBDOwogICAgY29uc3Qgb2lkICAgICAgKm8gPSAmT1sxXTsKCiAgICBpZiAoTCA8IChpbnQpKk8pCiAgICAgICAgcmV0dXJuIDE7CgogICAgTCA9ICpPOyAvKiogbGVuZ3RoICovCiAgICBmb3IgKDsgTDsgLS1MLCArK28sICsrYykgewogICAgICAgIGlmICgqbyA+IDB4RkYpCiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICpjID0gKGNoYXIpKm87CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqCiAqIENvbnZlcnRzIGFuIE9JRCB0byBpdHMgc3RyaW5nIGZvcm0uCiAqIGluIGV4YW1wbGUgIDUgLiAnaCcgLiAnZScgLiAnbCcgLiAnbCcgLiAnbycgPSAiaGVsbG9cMCIgKG51bGwgdGVybWluYXRlZCkKICoKICogQHBhcmFtIFMgICBUaGUgY2hhcmFjdGVyIHN0cmluZyBidWZmZXIuCiAqIEBwYXJhbSBMICAgVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGJ1ZmZlci4KICogQHBhcmFtIE8gICBUaGUgb2lkLgogKgogKiBAcmV0dXJuIDAgb24gU3VjZXNzLCAxIG9uIGZhaWx1cmUuCiAqLwppbnQKbmV0c25tcF9vaWQyc3RyKGNoYXIgKlMsIGludCBMLCBvaWQgKiBPKQp7CiAgICBpbnQgICAgICAgICAgICByYzsKCiAgICBpZiAoTCA8PSAoaW50KSpPKQogICAgICAgIHJldHVybiAxOwoKICAgIHJjID0gbmV0c25tcF9vaWQyY2hhcnMoUywgTCwgTyk7CiAgICBpZiAocmMpCiAgICAgICAgcmV0dXJuIDE7CgogICAgU1sgKk8gXSA9IDA7CgogICAgcmV0dXJuIDA7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTUlCX1NUUklOR19DT05WRVJTSU9OUyAqLwoKCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9NSUJfU05QUklOVAppbnQKc25wcmludF9ieV90eXBlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYnlfdHlwZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaGV4c3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLCBsZW4pKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfYXNjaWlzdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIGNwLCBsZW4pKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfb2N0ZXRfc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X29wYXF1ZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX29wYXF1ZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9vYmplY3RfaWRlbnRpZmllcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X3RpbWV0aWNrcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX3RpbWV0aWNrcygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9oaW50ZWRfaW50ZWdlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdmFsLCBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhbCwgJ2QnLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9pbnRlZ2VyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19pbnRlZ2VyKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF91aW50ZWdlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY191aW50ZWdlcigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2dhdWdlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2dhdWdlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfY291bnRlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfY291bnRlcigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfbmV0d29ya2FkZHJlc3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19uZXR3b3JrYWRkcmVzcwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9pcGFkZHJlc3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19pcGFkZHJlc3MoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfbnVsbChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfbnVsbCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfYml0c3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X25zYXBhZGRyZXNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX25zYXBhZGRyZXNzCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2NvdW50ZXI2NChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9iYWR0eXBlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19iYWR0eXBlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCmludApzbnByaW50X2Zsb2F0KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2Zsb2F0KCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfZG91YmxlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfZG91YmxlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KI2VuZGlmCiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX01JQl9TTlBSSU5UICovCi8qKiBAfSAqLwoK