LyoKICogIENGSSBwYXJhbGxlbCBmbGFzaCB3aXRoIEFNRCBjb21tYW5kIHNldCBlbXVsYXRpb24KICogCiAqICBDb3B5cmlnaHQgKGMpIDIwMDUgSm9jZWx5biBNYXllcgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKLyoKICogRm9yIG5vdywgdGhpcyBjb2RlIGNhbiBlbXVsYXRlIGZsYXNoZXMgb2YgMSwgMiBvciA0IGJ5dGVzIHdpZHRoLgogKiBTdXBwb3J0ZWQgY29tbWFuZHMvbW9kZXMgYXJlOgogKiAtIGZsYXNoIHJlYWQKICogLSBmbGFzaCB3cml0ZQogKiAtIGZsYXNoIElEIHJlYWQKICogLSBzZWN0b3IgZXJhc2UKICogLSBjaGlwIGVyYXNlCiAqIC0gdW5sb2NrIGJ5cGFzcyBjb21tYW5kCiAqIC0gQ0ZJIHF1ZXJpZXMKICoKICogSXQgZG9lcyBub3Qgc3VwcG9ydCBmbGFzaCBpbnRlcmxlYXZpbmcuCiAqIEl0IGRvZXMgbm90IGltcGxlbWVudCBib290IGJsb2NzIHdpdGggcmVkdWNlZCBzaXplCiAqIEl0IGRvZXMgbm90IGltcGxlbWVudCBzb2Z0d2FyZSBkYXRhIHByb3RlY3Rpb24gYXMgZm91bmQgaW4gbWFueSByZWFsIGNoaXBzCiAqIEl0IGRvZXMgbm90IGltcGxlbWVudCBlcmFzZSBzdXNwZW5kL3Jlc3VtZSBjb21tYW5kcwogKiBJdCBkb2VzIG5vdCBpbXBsZW1lbnQgbXVsdGlwbGUgc2VjdG9ycyBlcmFzZQogKi8KCiNpbmNsdWRlICJ2bC5oIgoKLy8jZGVmaW5lIFBGTEFTSF9ERUJVRwojaWZkZWYgUEZMQVNIX0RFQlVHCiNkZWZpbmUgRFBSSU5URihmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgIFwKZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHByaW50ZigiUEZMQVNIOiAiIGZtdCAsICMjYXJncyk7ICAgICAgICAgICBcCn0gd2hpbGUgKDApCiNlbHNlCiNkZWZpbmUgRFBSSU5URihmbXQsIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSAoMCkKI2VuZGlmCgpzdHJ1Y3QgcGZsYXNoX3QgewogICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnM7CiAgICB0YXJnZXRfdWxvbmcgYmFzZTsKICAgIHRhcmdldF91bG9uZyBzZWN0b3JfbGVuOwogICAgdGFyZ2V0X3Vsb25nIHRvdGFsX2xlbjsKICAgIGludCB3aWR0aDsKICAgIGludCB3Y3ljbGU7IC8qIGlmIDAsIHRoZSBmbGFzaCBpcyByZWFkIG5vcm1hbGx5ICovCiAgICBpbnQgYnlwYXNzOwogICAgaW50IHJvOwogICAgdWludDhfdCBjbWQ7CiAgICB1aW50OF90IHN0YXR1czsKICAgIHVpbnQxNl90IGlkZW50WzRdOwogICAgdWludDhfdCBjZmlfbGVuOwogICAgdWludDhfdCBjZmlfdGFibGVbMHg1Ml07CiAgICBRRU1VVGltZXIgKnRpbWVyOwogICAgcmFtX2FkZHJfdCBvZmY7CiAgICBpbnQgZmxfbWVtOwogICAgdm9pZCAqc3RvcmFnZTsKfTsKCnN0YXRpYyB2b2lkIHBmbGFzaF90aW1lciAodm9pZCAqb3BhcXVlKQp7CiAgICBwZmxhc2hfdCAqcGZsID0gb3BhcXVlOwoKICAgIERQUklOVEYoIiVzOiBjb21tYW5kICUwMnggZG9uZVxuIiwgX19mdW5jX18sIHBmbC0+Y21kKTsKICAgIC8qIFJlc2V0IGZsYXNoICovCiAgICBwZmwtPnN0YXR1cyBePSAweDgwOwogICAgaWYgKHBmbC0+YnlwYXNzKSB7CiAgICAgICAgcGZsLT53Y3ljbGUgPSAyOwogICAgfSBlbHNlIHsKICAgICAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KHBmbC0+YmFzZSwgcGZsLT50b3RhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmwtPm9mZiB8IElPX01FTV9ST01EIHwgcGZsLT5mbF9tZW0pOwogICAgICAgIHBmbC0+d2N5Y2xlID0gMDsKICAgIH0KICAgIHBmbC0+Y21kID0gMDsKfQoKc3RhdGljIHVpbnQzMl90IHBmbGFzaF9yZWFkIChwZmxhc2hfdCAqcGZsLCB0YXJnZXRfdWxvbmcgb2Zmc2V0LCBpbnQgd2lkdGgpCnsKICAgIHRhcmdldF91bG9uZyBib2ZmOwogICAgdWludDMyX3QgcmV0OwogICAgdWludDhfdCAqcDsKCiAgICBEUFJJTlRGKCIlczogb2Zmc2V0ICIgVEFSR0VUX0ZNVF9seCAiXG4iLCBfX2Z1bmNfXywgb2Zmc2V0KTsKICAgIHJldCA9IC0xOwogICAgb2Zmc2V0IC09IHBmbC0+YmFzZTsKICAgIGJvZmYgPSBvZmZzZXQgJiAweEZGOwogICAgaWYgKHBmbC0+d2lkdGggPT0gMikKICAgICAgICBib2ZmID0gYm9mZiA+PiAxOwogICAgZWxzZSBpZiAocGZsLT53aWR0aCA9PSA0KQogICAgICAgIGJvZmYgPSBib2ZmID4+IDI7CiAgICBzd2l0Y2ggKHBmbC0+Y21kKSB7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiA6IHJlc2V0IHN0YXRlICYgdHJlYXQgaXQgYXMgYSByZWFkKi8KICAgICAgICBEUFJJTlRGKCIlczogdW5rbm93biBjb21tYW5kIHN0YXRlOiAleFxuIiwgX19mdW5jX18sIHBmbC0+Y21kKTsKICAgICAgICBwZmwtPndjeWNsZSA9IDA7CiAgICAgICAgcGZsLT5jbWQgPSAwOwogICAgY2FzZSAweDgwOgogICAgICAgIC8qIFdlIGFjY2VwdCByZWFkcyBkdXJpbmcgc2Vjb25kIHVubG9jayBzZXF1ZW5jZS4uLiAqLwogICAgY2FzZSAweDAwOgogICAgZmxhc2hfcmVhZDoKICAgICAgICAvKiBGbGFzaCBhcmVhIHJlYWQgKi8KICAgICAgICBwID0gcGZsLT5zdG9yYWdlOwogICAgICAgIHN3aXRjaCAod2lkdGgpIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHJldCA9IHBbb2Zmc2V0XTsKLy8gICAgICAgICAgICBEUFJJTlRGKCIlczogZGF0YSBvZmZzZXQgJTA4eCAlMDJ4XG4iLCBfX2Z1bmNfXywgb2Zmc2V0LCByZXQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiNpZiBkZWZpbmVkKFRBUkdFVF9XT1JEU19CSUdFTkRJQU4pCiAgICAgICAgICAgIHJldCA9IHBbb2Zmc2V0XSA8PCA4OwogICAgICAgICAgICByZXQgfD0gcFtvZmZzZXQgKyAxXTsKI2Vsc2UKICAgICAgICAgICAgcmV0ID0gcFtvZmZzZXRdOwogICAgICAgICAgICByZXQgfD0gcFtvZmZzZXQgKyAxXSA8PCA4OwojZW5kaWYKLy8gICAgICAgICAgICBEUFJJTlRGKCIlczogZGF0YSBvZmZzZXQgJTA4eCAlMDR4XG4iLCBfX2Z1bmNfXywgb2Zmc2V0LCByZXQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiNpZiBkZWZpbmVkKFRBUkdFVF9XT1JEU19CSUdFTkRJQU4pCiAgICAgICAgICAgIHJldCA9IHBbb2Zmc2V0XSA8PCAyNDsKICAgICAgICAgICAgcmV0IHw9IHBbb2Zmc2V0ICsgMV0gPDwgMTY7CiAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDJdIDw8IDg7CiAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDNdOwojZWxzZQogICAgICAgICAgICByZXQgPSBwW29mZnNldF07CiAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDFdIDw8IDg7CiAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDJdIDw8IDE2OwogICAgICAgICAgICByZXQgfD0gcFtvZmZzZXQgKyAzXSA8PCAyNDsKI2VuZGlmCi8vICAgICAgICAgICAgRFBSSU5URigiJXM6IGRhdGEgb2Zmc2V0ICUwOHggJTA4eFxuIiwgX19mdW5jX18sIG9mZnNldCwgcmV0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSAweDkwOgogICAgICAgIC8qIGZsYXNoIElEIHJlYWQgKi8KICAgICAgICBzd2l0Y2ggKGJvZmYpIHsKICAgICAgICBjYXNlIDB4MDA6CiAgICAgICAgY2FzZSAweDAxOgogICAgICAgICAgICByZXQgPSBwZmwtPmlkZW50W2JvZmYgJiAweDAxXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAyOgogICAgICAgICAgICByZXQgPSAweDAwOyAvKiBQcmV0ZW5kIGFsbCBzZWN0b3JzIGFyZSB1bnByb3RlY3RlZCAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MEU6CiAgICAgICAgY2FzZSAweDBGOgogICAgICAgICAgICBpZiAocGZsLT5pZGVudFsyICsgKGJvZmYgJiAweDAxKV0gPT0gKHVpbnQ4X3QpLTEpCiAgICAgICAgICAgICAgICBnb3RvIGZsYXNoX3JlYWQ7CiAgICAgICAgICAgIHJldCA9IHBmbC0+aWRlbnRbMiArIChib2ZmICYgMHgwMSldOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBnb3RvIGZsYXNoX3JlYWQ7CiAgICAgICAgfQogICAgICAgIERQUklOVEYoIiVzOiBJRCAiIFRBUkdFVF9GTVRfbGQgIiAleFxuIiwgX19mdW5jX18sIGJvZmYsIHJldCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDB4QTA6CiAgICBjYXNlIDB4MTA6CiAgICBjYXNlIDB4MzA6CiAgICAgICAgLyogU3RhdHVzIHJlZ2lzdGVyIHJlYWQgKi8KICAgICAgICByZXQgPSBwZmwtPnN0YXR1czsKICAgICAgICBEUFJJTlRGKCIlczogc3RhdHVzICV4XG4iLCBfX2Z1bmNfXywgcmV0KTsKICAgICAgICAvKiBUb2dnbGUgYml0IDYgKi8KICAgICAgICBwZmwtPnN0YXR1cyBePSAweDQwOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAweDk4OgogICAgICAgIC8qIENGSSBxdWVyeSBtb2RlICovCiAgICAgICAgaWYgKGJvZmYgPiBwZmwtPmNmaV9sZW4pCiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXQgPSBwZmwtPmNmaV90YWJsZVtib2ZmXTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovKiB1cGRhdGUgZmxhc2ggY29udGVudCBvbiBkaXNrICovCnN0YXRpYyB2b2lkIHBmbGFzaF91cGRhdGUocGZsYXNoX3QgKnBmbCwgaW50IG9mZnNldCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCnsKICAgIGludCBvZmZzZXRfZW5kOwogICAgaWYgKHBmbC0+YnMpIHsKICAgICAgICBvZmZzZXRfZW5kID0gb2Zmc2V0ICsgc2l6ZTsKICAgICAgICAvKiByb3VuZCB0byBzZWN0b3JzICovCiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+IDk7CiAgICAgICAgb2Zmc2V0X2VuZCA9IChvZmZzZXRfZW5kICsgNTExKSA+PiA5OwogICAgICAgIGJkcnZfd3JpdGUocGZsLT5icywgb2Zmc2V0LCBwZmwtPnN0b3JhZ2UgKyAob2Zmc2V0IDw8IDkpLCAKICAgICAgICAgICAgICAgICAgIG9mZnNldF9lbmQgLSBvZmZzZXQpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBwZmxhc2hfd3JpdGUgKHBmbGFzaF90ICpwZmwsIHRhcmdldF91bG9uZyBvZmZzZXQsIHVpbnQzMl90IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkKewogICAgdGFyZ2V0X3Vsb25nIGJvZmY7CiAgICB1aW50OF90ICpwOwogICAgdWludDhfdCBjbWQ7CgogICAgLyogV0FSTklORzogd2hlbiB0aGUgbWVtb3J5IGFyZWEgaXMgaW4gUk9NRCBtb2RlLCB0aGUgb2Zmc2V0IGlzIGEKICAgICAgIHJhbSBvZmZzZXQsIG5vdCBhIHBoeXNpY2FsIGFkZHJlc3MgKi8KICAgIGNtZCA9IHZhbHVlOwogICAgaWYgKHBmbC0+Y21kICE9IDB4QTAgJiYgY21kID09IDB4RjApIHsKI2lmIDAKICAgICAgICBEUFJJTlRGKCIlczogZmxhc2ggcmVzZXQgYXNrZWQgKCUwMnggJTAyeClcbiIsCiAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGZsLT5jbWQsIGNtZCk7CiNlbmRpZgogICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CiAgICB9CiAgICBEUFJJTlRGKCIlczogb2Zmc2V0ICIgVEFSR0VUX0ZNVF9seCAiICUwOHggJWQgJWRcbiIsIF9fZnVuY19fLAogICAgICAgICAgICBvZmZzZXQsIHZhbHVlLCB3aWR0aCwgcGZsLT53Y3ljbGUpOwogICAgaWYgKHBmbC0+d2N5Y2xlID09IDApCiAgICAgICAgb2Zmc2V0IC09ICh0YXJnZXRfdWxvbmcpKGxvbmcpcGZsLT5zdG9yYWdlOwogICAgZWxzZQogICAgICAgIG9mZnNldCAtPSBwZmwtPmJhc2U7CiAgICAgICAgCiAgICBEUFJJTlRGKCIlczogb2Zmc2V0ICIgVEFSR0VUX0ZNVF9seCAiICUwOHggJWRcbiIsIF9fZnVuY19fLAogICAgICAgICAgICBvZmZzZXQsIHZhbHVlLCB3aWR0aCk7CiAgICAvKiBTZXQgdGhlIGRldmljZSBpbiBJL08gYWNjZXNzIG1vZGUgKi8KICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkocGZsLT5iYXNlLCBwZmwtPnRvdGFsX2xlbiwgcGZsLT5mbF9tZW0pOwogICAgYm9mZiA9IG9mZnNldCAmIChwZmwtPnNlY3Rvcl9sZW4gLSAxKTsKICAgIGlmIChwZmwtPndpZHRoID09IDIpCiAgICAgICAgYm9mZiA9IGJvZmYgPj4gMTsKICAgIGVsc2UgaWYgKHBmbC0+d2lkdGggPT0gNCkKICAgICAgICBib2ZmID0gYm9mZiA+PiAyOwogICAgc3dpdGNoIChwZmwtPndjeWNsZSkgewogICAgY2FzZSAwOgogICAgICAgIC8qIFdlJ3JlIGluIHJlYWQgbW9kZSAqLwogICAgY2hlY2tfdW5sb2NrMDoKICAgICAgICBpZiAoYm9mZiA9PSAweDU1ICYmIGNtZCA9PSAweDk4KSB7CiAgICAgICAgZW50ZXJfQ0ZJX21vZGU6CiAgICAgICAgICAgIC8qIEVudGVyIENGSSBxdWVyeSBtb2RlICovCiAgICAgICAgICAgIHBmbC0+d2N5Y2xlID0gNzsKICAgICAgICAgICAgcGZsLT5jbWQgPSAweDk4OwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChib2ZmICE9IDB4NTU1IHx8IGNtZCAhPSAweEFBKSB7CiAgICAgICAgICAgIERQUklOVEYoIiVzOiB1bmxvY2swIGZhaWxlZCAiIFRBUkdFVF9GTVRfbHggIiAlMDJ4ICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJvZmYsIGNtZCwgMHg1NTUpOwogICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgIH0KICAgICAgICBEUFJJTlRGKCIlczogdW5sb2NrIHNlcXVlbmNlIHN0YXJ0ZWRcbiIsIF9fZnVuY19fKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgMToKICAgICAgICAvKiBXZSBzdGFydGVkIGFuIHVubG9jayBzZXF1ZW5jZSAqLwogICAgY2hlY2tfdW5sb2NrMToKICAgICAgICBpZiAoYm9mZiAhPSAweDJBQSB8fCBjbWQgIT0gMHg1NSkgewogICAgICAgICAgICBEUFJJTlRGKCIlczogdW5sb2NrMSBmYWlsZWQgIiBUQVJHRVRfRk1UX2x4ICIgJTAyeFxuIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgYm9mZiwgY21kKTsKICAgICAgICAgICAgZ290byByZXNldF9mbGFzaDsKICAgICAgICB9CiAgICAgICAgRFBSSU5URigiJXM6IHVubG9jayBzZXF1ZW5jZSBkb25lXG4iLCBfX2Z1bmNfXyk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICAgICAgLyogV2UgZmluaXNoZWQgYW4gdW5sb2NrIHNlcXVlbmNlICovCiAgICAgICAgaWYgKCFwZmwtPmJ5cGFzcyAmJiBib2ZmICE9IDB4NTU1KSB7CiAgICAgICAgICAgIERQUklOVEYoIiVzOiBjb21tYW5kIGZhaWxlZCAiIFRBUkdFVF9GTVRfbHggIiAlMDJ4XG4iLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICBib2ZmLCBjbWQpOwogICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGNtZCkgewogICAgICAgIGNhc2UgMHgyMDoKICAgICAgICAgICAgcGZsLT5ieXBhc3MgPSAxOwogICAgICAgICAgICBnb3RvIGRvX2J5cGFzczsKICAgICAgICBjYXNlIDB4ODA6CiAgICAgICAgY2FzZSAweDkwOgogICAgICAgIGNhc2UgMHhBMDoKICAgICAgICAgICAgcGZsLT5jbWQgPSBjbWQ7CiAgICAgICAgICAgIERQUklOVEYoIiVzOiBzdGFydGluZyBjb21tYW5kICUwMnhcbiIsIF9fZnVuY19fLCBjbWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBEUFJJTlRGKCIlczogdW5rbm93biBjb21tYW5kICUwMnhcbiIsIF9fZnVuY19fLCBjbWQpOwogICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgICBzd2l0Y2ggKHBmbC0+Y21kKSB7CiAgICAgICAgY2FzZSAweDgwOgogICAgICAgICAgICAvKiBXZSBuZWVkIGFub3RoZXIgdW5sb2NrIHNlcXVlbmNlICovCiAgICAgICAgICAgIGdvdG8gY2hlY2tfdW5sb2NrMDsKICAgICAgICBjYXNlIDB4QTA6CiAgICAgICAgICAgIERQUklOVEYoIiVzOiB3cml0ZSBkYXRhIG9mZnNldCAiIFRBUkdFVF9GTVRfbHggIiAlMDh4ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBvZmZzZXQsIHZhbHVlLCB3aWR0aCk7CiAgICAgICAgICAgIHAgPSBwZmwtPnN0b3JhZ2U7CiAgICAgICAgICAgIHN3aXRjaCAod2lkdGgpIHsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgcFtvZmZzZXRdICY9IHZhbHVlOwogICAgICAgICAgICAgICAgcGZsYXNoX3VwZGF0ZShwZmwsIG9mZnNldCwgMSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgojaWYgZGVmaW5lZChUQVJHRVRfV09SRFNfQklHRU5ESUFOKQogICAgICAgICAgICAgICAgcFtvZmZzZXRdICY9IHZhbHVlID4+IDg7CiAgICAgICAgICAgICAgICBwW29mZnNldCArIDFdICY9IHZhbHVlOwojZWxzZQogICAgICAgICAgICAgICAgcFtvZmZzZXRdICY9IHZhbHVlOwogICAgICAgICAgICAgICAgcFtvZmZzZXQgKyAxXSAmPSB2YWx1ZSA+PiA4OwojZW5kaWYKICAgICAgICAgICAgICAgIHBmbGFzaF91cGRhdGUocGZsLCBvZmZzZXQsIDIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNDoKI2lmIGRlZmluZWQoVEFSR0VUX1dPUkRTX0JJR0VORElBTikKICAgICAgICAgICAgICAgIHBbb2Zmc2V0XSAmPSB2YWx1ZSA+PiAyNDsKICAgICAgICAgICAgICAgIHBbb2Zmc2V0ICsgMV0gJj0gdmFsdWUgPj4gMTY7CiAgICAgICAgICAgICAgICBwW29mZnNldCArIDJdICY9IHZhbHVlID4+IDg7CiAgICAgICAgICAgICAgICBwW29mZnNldCArIDNdICY9IHZhbHVlOwojZWxzZQogICAgICAgICAgICAgICAgcFtvZmZzZXRdICY9IHZhbHVlOwogICAgICAgICAgICAgICAgcFtvZmZzZXQgKyAxXSAmPSB2YWx1ZSA+PiA4OwogICAgICAgICAgICAgICAgcFtvZmZzZXQgKyAyXSAmPSB2YWx1ZSA+PiAxNjsKICAgICAgICAgICAgICAgIHBbb2Zmc2V0ICsgM10gJj0gdmFsdWUgPj4gMjQ7CiNlbmRpZgogICAgICAgICAgICAgICAgcGZsYXNoX3VwZGF0ZShwZmwsIG9mZnNldCwgNCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBwZmwtPnN0YXR1cyA9IDB4MDAgfCB+KHZhbHVlICYgMHg4MCk7CiAgICAgICAgICAgIC8qIExldCdzIHByZXRlbmQgd3JpdGUgaXMgaW1tZWRpYXRlICovCiAgICAgICAgICAgIGlmIChwZmwtPmJ5cGFzcykKICAgICAgICAgICAgICAgIGdvdG8gZG9fYnlwYXNzOwogICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgIGNhc2UgMHg5MDoKICAgICAgICAgICAgaWYgKHBmbC0+YnlwYXNzICYmIGNtZCA9PSAweDAwKSB7CiAgICAgICAgICAgICAgICAvKiBVbmxvY2sgYnlwYXNzIHJlc2V0ICovCiAgICAgICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIFdlIGNhbiBlbnRlciBDRkkgcXVlcnkgbW9kZSBmcm9tIGF1dG9zZWxlY3QgbW9kZSAqLwogICAgICAgICAgICBpZiAoYm9mZiA9PSAweDU1ICYmIGNtZCA9PSAweDk4KQogICAgICAgICAgICAgICAgZ290byBlbnRlcl9DRklfbW9kZTsKICAgICAgICAgICAgLyogTm8gYnJlYWsgaGVyZSAqLwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERQUklOVEYoIiVzOiBpbnZhbGlkIHdyaXRlIGZvciBjb21tYW5kICUwMnhcbiIsCiAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBmbC0+Y21kKTsKICAgICAgICAgICAgZ290byByZXNldF9mbGFzaDsKICAgICAgICB9CiAgICBjYXNlIDQ6CiAgICAgICAgc3dpdGNoIChwZmwtPmNtZCkgewogICAgICAgIGNhc2UgMHhBMDoKICAgICAgICAgICAgLyogSWdub3JlIHdyaXRlcyB3aGlsZSBmbGFzaCBkYXRhIHdyaXRlIGlzIG9jY3VyaW5nICovCiAgICAgICAgICAgIC8qIEFzIHdlIHN1cHBvc2Ugd3JpdGUgaXMgaW1tZWRpYXRlLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgMHg4MDoKICAgICAgICAgICAgZ290byBjaGVja191bmxvY2sxOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KICAgICAgICAgICAgRFBSSU5URigiJXM6IGludmFsaWQgY29tbWFuZCBzdGF0ZSAlMDJ4ICh3YyA0KVxuIiwKICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGZsLT5jbWQpOwogICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgNToKICAgICAgICBzd2l0Y2ggKGNtZCkgewogICAgICAgIGNhc2UgMHgxMDoKICAgICAgICAgICAgaWYgKGJvZmYgIT0gMHg1NTUpIHsKICAgICAgICAgICAgICAgIERQUklOVEYoIiVzOiBjaGlwIGVyYXNlOiBpbnZhbGlkIGFkZHJlc3MgIiBUQVJHRVRfRk1UX2x4ICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBvZmZzZXQpOwogICAgICAgICAgICAgICAgZ290byByZXNldF9mbGFzaDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBDaGlwIGVyYXNlICovCiAgICAgICAgICAgIERQUklOVEYoIiVzOiBzdGFydCBjaGlwIGVyYXNlXG4iLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgIG1lbXNldChwZmwtPnN0b3JhZ2UsIDB4RkYsIHBmbC0+dG90YWxfbGVuKTsKICAgICAgICAgICAgcGZsLT5zdGF0dXMgPSAweDAwOwogICAgICAgICAgICBwZmxhc2hfdXBkYXRlKHBmbCwgMCwgcGZsLT50b3RhbF9sZW4pOwogICAgICAgICAgICAvKiBMZXQncyB3YWl0IDUgc2Vjb25kcyBiZWZvcmUgY2hpcCBlcmFzZSBpcyBkb25lICovCiAgICAgICAgICAgIHFlbXVfbW9kX3RpbWVyKHBmbC0+dGltZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBxZW11X2dldF9jbG9jayh2bV9jbG9jaykgKyAodGlja3NfcGVyX3NlYyAqIDUpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDMwOgogICAgICAgICAgICAvKiBTZWN0b3IgZXJhc2UgKi8KICAgICAgICAgICAgcCA9IHBmbC0+c3RvcmFnZTsKICAgICAgICAgICAgb2Zmc2V0ICY9IH4ocGZsLT5zZWN0b3JfbGVuIC0gMSk7CiAgICAgICAgICAgIERQUklOVEYoIiVzOiBzdGFydCBzZWN0b3IgZXJhc2UgYXQgIiBUQVJHRVRfRk1UX2x4ICJcbiIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CiAgICAgICAgICAgIG1lbXNldChwICsgb2Zmc2V0LCAweEZGLCBwZmwtPnNlY3Rvcl9sZW4pOwogICAgICAgICAgICBwZmxhc2hfdXBkYXRlKHBmbCwgb2Zmc2V0LCBwZmwtPnNlY3Rvcl9sZW4pOwogICAgICAgICAgICBwZmwtPnN0YXR1cyA9IDB4MDA7CiAgICAgICAgICAgIC8qIExldCdzIHdhaXQgMS8yIHNlY29uZCBiZWZvcmUgc2VjdG9yIGVyYXNlIGlzIGRvbmUgKi8KICAgICAgICAgICAgcWVtdV9tb2RfdGltZXIocGZsLT50aW1lciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfZ2V0X2Nsb2NrKHZtX2Nsb2NrKSArICh0aWNrc19wZXJfc2VjIC8gMikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBEUFJJTlRGKCIlczogaW52YWxpZCBjb21tYW5kICUwMnggKHdjIDUpXG4iLCBfX2Z1bmNfXywgY21kKTsKICAgICAgICAgICAgZ290byByZXNldF9mbGFzaDsKICAgICAgICB9CiAgICAgICAgcGZsLT5jbWQgPSBjbWQ7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDY6CiAgICAgICAgc3dpdGNoIChwZmwtPmNtZCkgewogICAgICAgIGNhc2UgMHgxMDoKICAgICAgICAgICAgLyogSWdub3JlIHdyaXRlcyBkdXJpbmcgY2hpcCBlcmFzZSAqLwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSAweDMwOgogICAgICAgICAgICAvKiBJZ25vcmUgd3JpdGVzIGR1cmluZyBzZWN0b3IgZXJhc2UgKi8KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KICAgICAgICAgICAgRFBSSU5URigiJXM6IGludmFsaWQgY29tbWFuZCBzdGF0ZSAlMDJ4ICh3YyA2KVxuIiwKICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGZsLT5jbWQpOwogICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgNzogLyogU3BlY2lhbCB2YWx1ZSBmb3IgQ0ZJIHF1ZXJpZXMgKi8KICAgICAgICBEUFJJTlRGKCIlczogaW52YWxpZCB3cml0ZSBpbiBDRkkgcXVlcnkgbW9kZVxuIiwgX19mdW5jX18pOwogICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KICAgICAgICBEUFJJTlRGKCIlczogaW52YWxpZCB3cml0ZSBzdGF0ZSAod2MgNylcbiIsICBfX2Z1bmNfXyk7CiAgICAgICAgZ290byByZXNldF9mbGFzaDsKICAgIH0KICAgIHBmbC0+d2N5Y2xlKys7CgogICAgcmV0dXJuOwoKICAgIC8qIFJlc2V0IGZsYXNoICovCiByZXNldF9mbGFzaDoKICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkocGZsLT5iYXNlLCBwZmwtPnRvdGFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZsLT5vZmYgfCBJT19NRU1fUk9NRCB8IHBmbC0+ZmxfbWVtKTsKICAgIHBmbC0+YnlwYXNzID0gMDsKICAgIHBmbC0+d2N5Y2xlID0gMDsKICAgIHBmbC0+Y21kID0gMDsKICAgIHJldHVybjsKCiBkb19ieXBhc3M6CiAgICBwZmwtPndjeWNsZSA9IDI7CiAgICBwZmwtPmNtZCA9IDA7CiAgICByZXR1cm47Cn0KCgpzdGF0aWMgdWludDMyX3QgcGZsYXNoX3JlYWRiICh2b2lkICpvcGFxdWUsIHRhcmdldF9waHlzX2FkZHJfdCBhZGRyKQp7CiAgICByZXR1cm4gcGZsYXNoX3JlYWQob3BhcXVlLCBhZGRyLCAxKTsKfQoKc3RhdGljIHVpbnQzMl90IHBmbGFzaF9yZWFkdyAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkcikKewogICAgcGZsYXNoX3QgKnBmbCA9IG9wYXF1ZTsKCiAgICByZXR1cm4gcGZsYXNoX3JlYWQocGZsLCBhZGRyLCAyKTsKfQoKc3RhdGljIHVpbnQzMl90IHBmbGFzaF9yZWFkbCAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkcikKewogICAgcGZsYXNoX3QgKnBmbCA9IG9wYXF1ZTsKCiAgICByZXR1cm4gcGZsYXNoX3JlYWQocGZsLCBhZGRyLCA0KTsKfQoKc3RhdGljIHZvaWQgcGZsYXNoX3dyaXRlYiAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCnsKICAgIHBmbGFzaF93cml0ZShvcGFxdWUsIGFkZHIsIHZhbHVlLCAxKTsKfQoKc3RhdGljIHZvaWQgcGZsYXNoX3dyaXRldyAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCnsKICAgIHBmbGFzaF90ICpwZmwgPSBvcGFxdWU7CgogICAgcGZsYXNoX3dyaXRlKHBmbCwgYWRkciwgdmFsdWUsIDIpOwp9CgpzdGF0aWMgdm9pZCBwZmxhc2hfd3JpdGVsICh2b2lkICpvcGFxdWUsIHRhcmdldF9waHlzX2FkZHJfdCBhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKewogICAgcGZsYXNoX3QgKnBmbCA9IG9wYXF1ZTsKCiAgICBwZmxhc2hfd3JpdGUocGZsLCBhZGRyLCB2YWx1ZSwgNCk7Cn0KCnN0YXRpYyBDUFVXcml0ZU1lbW9yeUZ1bmMgKnBmbGFzaF93cml0ZV9vcHNbXSA9IHsKICAgICZwZmxhc2hfd3JpdGViLAogICAgJnBmbGFzaF93cml0ZXcsCiAgICAmcGZsYXNoX3dyaXRlbCwKfTsKCnN0YXRpYyBDUFVSZWFkTWVtb3J5RnVuYyAqcGZsYXNoX3JlYWRfb3BzW10gPSB7CiAgICAmcGZsYXNoX3JlYWRiLAogICAgJnBmbGFzaF9yZWFkdywKICAgICZwZmxhc2hfcmVhZGwsCn07CgovKiBDb3VudCB0cmFpbGluZyB6ZXJvZXMgb2YgYSAzMiBiaXRzIHF1YW50aXR5ICovCnN0YXRpYyBpbnQgY3R6MzIgKHVpbnQzMl90IG4pCnsKICAgIGludCByZXQ7CgogICAgcmV0ID0gMDsKICAgIGlmICghKG4gJiAweEZGRkYpKSB7CiAgICAgICAgcmV0ICs9IDE2OwogICAgICAgIG4gPSBuID4+IDE2OwogICAgfQogICAgaWYgKCEobiAmIDB4RkYpKSB7CiAgICAgICAgcmV0ICs9IDg7CiAgICAgICAgbiA9IG4gPj4gODsKICAgIH0KICAgIGlmICghKG4gJiAweEYpKSB7CiAgICAgICAgcmV0ICs9IDQ7CiAgICAgICAgbiA9IG4gPj4gNDsKICAgIH0KICAgIGlmICghKG4gJiAweDMpKSB7CiAgICAgICAgcmV0ICs9IDI7CiAgICAgICAgbiA9IG4gPj4gMjsKICAgIH0KICAgIGlmICghKG4gJiAweDEpKSB7CiAgICAgICAgcmV0Kys7CiAgICAgICAgbiA9IG4gPj4gMTsKICAgIH0KI2lmIDAgLyogVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGFzIG4gaXMgbmV2ZXIgMCAqLwogICAgaWYgKCFuKQogICAgICAgIHJldCsrOwojZW5kaWYKCiAgICByZXR1cm4gcmV0Owp9CgpwZmxhc2hfdCAqcGZsYXNoX3JlZ2lzdGVyICh0YXJnZXRfdWxvbmcgYmFzZSwgcmFtX2FkZHJfdCBvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgc2VjdG9yX2xlbiwgaW50IG5iX2Jsb2NzLCBpbnQgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGlkMCwgdWludDE2X3QgaWQxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaWQyLCB1aW50MTZfdCBpZDMpCnsKICAgIHBmbGFzaF90ICpwZmw7CiAgICB0YXJnZXRfbG9uZyB0b3RhbF9sZW47CgogICAgdG90YWxfbGVuID0gc2VjdG9yX2xlbiAqIG5iX2Jsb2NzOwogICAgLyogWFhYOiB0byBiZSBmaXhlZCAqLwojaWYgMAogICAgaWYgKHRvdGFsX2xlbiAhPSAoOCAqIDEwMjQgKiAxMDI0KSAmJiB0b3RhbF9sZW4gIT0gKDE2ICogMTAyNCAqIDEwMjQpICYmCiAgICAgICAgdG90YWxfbGVuICE9ICgzMiAqIDEwMjQgKiAxMDI0KSAmJiB0b3RhbF9sZW4gIT0gKDY0ICogMTAyNCAqIDEwMjQpKQogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgIHBmbCA9IHFlbXVfbWFsbG9jeihzaXplb2YocGZsYXNoX3QpKTsKICAgIGlmIChwZmwgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIHBmbC0+c3RvcmFnZSA9IHBoeXNfcmFtX2Jhc2UgKyBvZmY7CiAgICBwZmwtPmZsX21lbSA9IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkoMCwgcGZsYXNoX3JlYWRfb3BzLCBwZmxhc2hfd3JpdGVfb3BzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmbCk7CiAgICBwZmwtPm9mZiA9IG9mZjsKICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoYmFzZSwgdG90YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgfCBwZmwtPmZsX21lbSB8IElPX01FTV9ST01EKTsKICAgIHBmbC0+YnMgPSBiczsKICAgIGlmIChwZmwtPmJzKSB7CiAgICAgICAgLyogcmVhZCB0aGUgaW5pdGlhbCBmbGFzaCBjb250ZW50ICovCiAgICAgICAgYmRydl9yZWFkKHBmbC0+YnMsIDAsIHBmbC0+c3RvcmFnZSwgdG90YWxfbGVuID4+IDkpOwogICAgfQojaWYgMCAvKiBYWFg6IHRoZXJlIHNob3VsZCBiZSBhIGJpdCB0byBzZXQgdXAgcmVhZC1vbmx5LAogICAgICAgKiAgICAgIHRoZSBzYW1lIHdheSB0aGUgaGFyZHdhcmUgZG9lcyAod2l0aCBXUCBwaW4pLgogICAgICAgKi8KICAgIHBmbC0+cm8gPSAxOwojZWxzZQogICAgcGZsLT5ybyA9IDA7CiNlbmRpZgogICAgcGZsLT50aW1lciA9IHFlbXVfbmV3X3RpbWVyKHZtX2Nsb2NrLCBwZmxhc2hfdGltZXIsIHBmbCk7CiAgICBwZmwtPmJhc2UgPSBiYXNlOwogICAgcGZsLT5zZWN0b3JfbGVuID0gc2VjdG9yX2xlbjsKICAgIHBmbC0+dG90YWxfbGVuID0gdG90YWxfbGVuOwogICAgcGZsLT53aWR0aCA9IHdpZHRoOwogICAgcGZsLT53Y3ljbGUgPSAwOwogICAgcGZsLT5jbWQgPSAwOwogICAgcGZsLT5zdGF0dXMgPSAwOwogICAgcGZsLT5pZGVudFswXSA9IGlkMDsKICAgIHBmbC0+aWRlbnRbMV0gPSBpZDE7CiAgICBwZmwtPmlkZW50WzJdID0gaWQyOwogICAgcGZsLT5pZGVudFszXSA9IGlkMzsKICAgIC8qIEhhcmRjb2RlZCBDRkkgdGFibGUgKG1vc3RseSBmcm9tIFNHMjkgU3BhbnNpb24gZmxhc2gpICovCiAgICBwZmwtPmNmaV9sZW4gPSAweDUyOwogICAgLyogU3RhbmRhcmQgIlFSWSIgc3RyaW5nICovCiAgICBwZmwtPmNmaV90YWJsZVsweDEwXSA9ICdRJzsKICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MTFdID0gJ1InOwogICAgcGZsLT5jZmlfdGFibGVbMHgxMl0gPSAnWSc7CiAgICAvKiBDb21tYW5kIHNldCAoQU1EL0Z1aml0c3UpICovCiAgICBwZmwtPmNmaV90YWJsZVsweDEzXSA9IDB4MDI7CiAgICBwZmwtPmNmaV90YWJsZVsweDE0XSA9IDB4MDA7CiAgICAvKiBQcmltYXJ5IGV4dGVuZGVkIHRhYmxlIGFkZHJlc3MgKG5vbmUpICovCiAgICBwZmwtPmNmaV90YWJsZVsweDE1XSA9IDB4MDA7CiAgICBwZmwtPmNmaV90YWJsZVsweDE2XSA9IDB4MDA7CiAgICAvKiBBbHRlcm5hdGUgY29tbWFuZCBzZXQgKG5vbmUpICovCiAgICBwZmwtPmNmaV90YWJsZVsweDE3XSA9IDB4MDA7CiAgICBwZmwtPmNmaV90YWJsZVsweDE4XSA9IDB4MDA7CiAgICAvKiBBbHRlcm5hdGUgZXh0ZW5kZWQgdGFibGUgKG5vbmUpICovCiAgICBwZmwtPmNmaV90YWJsZVsweDE5XSA9IDB4MDA7CiAgICBwZmwtPmNmaV90YWJsZVsweDFBXSA9IDB4MDA7CiAgICAvKiBWY2MgbWluICovCiAgICBwZmwtPmNmaV90YWJsZVsweDFCXSA9IDB4Mjc7CiAgICAvKiBWY2MgbWF4ICovCiAgICBwZmwtPmNmaV90YWJsZVsweDFDXSA9IDB4MzY7CiAgICAvKiBWcHAgbWluIChubyBWcHAgcGluKSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgxRF0gPSAweDAwOwogICAgLyogVnBwIG1heCAobm8gVnBwIHBpbikgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MUVdID0gMHgwMDsKICAgIC8qIFJlc2VydmVkICovCiAgICBwZmwtPmNmaV90YWJsZVsweDFGXSA9IDB4MDc7CiAgICAvKiBUaW1lb3V0IGZvciBtaW4gc2l6ZSBidWZmZXIgd3JpdGUgKDE2ILVzKSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgyMF0gPSAweDA0OwogICAgLyogVHlwaWNhbCB0aW1lb3V0IGZvciBibG9jayBlcmFzZSAoNTEyIG1zKSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgyMV0gPSAweDA5OwogICAgLyogVHlwaWNhbCB0aW1lb3V0IGZvciBmdWxsIGNoaXAgZXJhc2UgKDQwOTYgbXMpICovCiAgICBwZmwtPmNmaV90YWJsZVsweDIyXSA9IDB4MEM7CiAgICAvKiBSZXNlcnZlZCAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgyM10gPSAweDAxOwogICAgLyogTWF4IHRpbWVvdXQgZm9yIGJ1ZmZlciB3cml0ZSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgyNF0gPSAweDA0OwogICAgLyogTWF4IHRpbWVvdXQgZm9yIGJsb2NrIGVyYXNlICovCiAgICBwZmwtPmNmaV90YWJsZVsweDI1XSA9IDB4MEE7CiAgICAvKiBNYXggdGltZW91dCBmb3IgY2hpcCBlcmFzZSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgyNl0gPSAweDBEOwogICAgLyogRGV2aWNlIHNpemUgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MjddID0gY3R6MzIodG90YWxfbGVuKSArIDE7CiAgICAvKiBGbGFzaCBkZXZpY2UgaW50ZXJmYWNlICg4ICYgMTYgYml0cykgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MjhdID0gMHgwMjsKICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MjldID0gMHgwMDsKICAgIC8qIE1heCBudW1iZXIgb2YgYnl0ZXMgaW4gbXVsdGktYnl0ZXMgd3JpdGUgKi8KICAgIC8qIFhYWDogZGlzYWJsZSBidWZmZXJlZCB3cml0ZSBhcyBpdCdzIG5vdCBzdXBwb3J0ZWQgKi8KICAgIC8vICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MkFdID0gMHgwNTsKICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MkFdID0gMHgwMDsKICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MkJdID0gMHgwMDsKICAgIC8qIE51bWJlciBvZiBlcmFzZSBibG9jayByZWdpb25zICh1bmlmb3JtKSAqLwogICAgcGZsLT5jZmlfdGFibGVbMHgyQ10gPSAweDAxOwogICAgLyogRXJhc2UgYmxvY2sgcmVnaW9uIDEgKi8KICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MkRdID0gbmJfYmxvY3MgLSAxOwogICAgcGZsLT5jZmlfdGFibGVbMHgyRV0gPSAobmJfYmxvY3MgLSAxKSA+PiA4OwogICAgcGZsLT5jZmlfdGFibGVbMHgyRl0gPSBzZWN0b3JfbGVuID4+IDg7CiAgICBwZmwtPmNmaV90YWJsZVsweDMwXSA9IHNlY3Rvcl9sZW4gPj4gMTY7CgogICAgcmV0dXJuIHBmbDsKfQo=