Ci8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFxmaWxlCiAqICAgICAgbWJ1ZmZlci5oCiAqCiAqICBcYnJpZWYKICogICAgICBGcmFtZSBidWZmZXIgZnVuY3Rpb25zCiAqCiAqICBcYXV0aG9yCiAqICAgICAgTWFpbiBjb250cmlidXRvcnMgKHNlZSBjb250cmlidXRvcnMuaCBmb3IgY29weXJpZ2h0LCBhZGRyZXNzIGFuZCBhZmZpbGlhdGlvbiBkZXRhaWxzKQogKiAgICAgIC0gS2Fyc3RlbiBT/GhyaW5nICAgICAgICAgIDxzdWVocmluZ0BoaGkuZGU+CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KI2lmbmRlZiBfTUJVRkZFUl9IXwojZGVmaW5lIF9NQlVGRkVSX0hfCgojZGVmaW5lIE1BWF9MSVNUX1NJWkUgMzMKCi8vISBkZWZpbml0aW9uIGEgcGljdHVyZSAoZmllbGQgb3IgZnJhbWUpCnR5cGVkZWYgc3RydWN0IHN0b3JhYmxlX3BpY3R1cmUKewogIFBpY3R1cmVTdHJ1Y3R1cmUgc3RydWN0dXJlOwoKICBpbnQgICAgICAgICBwb2M7CiAgaW50ICAgICAgICAgdG9wX3BvYzsKICBpbnQgICAgICAgICBib3R0b21fcG9jOwogIGludCAgICAgICAgIGZyYW1lX3BvYzsKICBpbnQgICAgICAgICBvcmRlcl9udW07CiAgaW50NjQgICAgICAgcmVmX3BpY19udW1bNl1bTUFYX0xJU1RfU0laRV07CiAgaW50NjQgICAgICAgZnJtX3JlZl9waWNfbnVtWzZdW01BWF9MSVNUX1NJWkVdOwogIGludDY0ICAgICAgIHRvcF9yZWZfcGljX251bVs2XVtNQVhfTElTVF9TSVpFXTsKICBpbnQ2NCAgICAgICBib3R0b21fcmVmX3BpY19udW1bNl1bTUFYX0xJU1RfU0laRV07CiAgdW5zaWduZWQgICAgZnJhbWVfbnVtOwogIGludCAgICAgICAgIHBpY19udW07CiAgaW50ICAgICAgICAgbG9uZ190ZXJtX3BpY19udW07CiAgaW50ICAgICAgICAgbG9uZ190ZXJtX2ZyYW1lX2lkeDsKCiAgaW50ICAgICAgICAgaXNfbG9uZ190ZXJtOwogIGludCAgICAgICAgIHVzZWRfZm9yX3JlZmVyZW5jZTsKICBpbnQgICAgICAgICBpc19vdXRwdXQ7CiAgaW50ICAgICAgICAgbm9uX2V4aXN0aW5nOwoKICBpbnQgICAgICAgICBzaXplX3gsIHNpemVfeSwgc2l6ZV94X2NyLCBzaXplX3lfY3I7CiAgaW50ICAgICAgICAgc2l6ZV94X3BhZCwgc2l6ZV95X3BhZDsKICBpbnQgICAgICAgICBzaXplX3hfY3JfcGFkLCBzaXplX3lfY3JfcGFkOwogIGludCAgICAgICAgIGNocm9tYV92ZWN0b3JfYWRqdXN0bWVudDsKICBpbnQgICAgICAgICBjb2RlZF9mcmFtZTsKICBpbnQgICAgICAgICBNYmFmZkZyYW1lRmxhZzsKCiAgaW1ncGVsICoqICAgaW1nWTsgICAgICAgICAgLy8hPCBZIHBpY3R1cmUgY29tcG9uZW50CiAgaW1ncGVsICoqKiogICBpbWdZX3N1YjsgICAgICAvLyE8IFkgcGljdHVyZSBjb21wb25lbnQgdXBzYW1wbGVkIChRdWFydGVyIHBlbCkKICBpbWdwZWwgKioqKiAgIGltZ1lfc3ViX3c7ICAgIC8vITwgWSBwaWN0dXJlIGNvbXBvbmVudCB1cHNhbXBsZWQgKFF1YXJ0ZXIgcGVsKSBmb3Igd2VpZ2h0ZWQgcHJlZGljdGlvbgogIGltZ3BlbCAqKioqKiAgaW1nVVZfc3ViOyAgICAgIC8vITwgVVYgcGljdHVyZSBjb21wb25lbnQgdXBzYW1wbGVkIChRdWFydGVyL09uZS1FaWdodGggcGVsKQogIGltZ3BlbCAqKiogIGltZ1VWOyAgICAgICAgIC8vITwgVSBhbmQgViBwaWN0dXJlIGNvbXBvbmVudHMKCiAgYnl0ZSAqICAgICAgbWJfZmllbGQ7ICAgICAgLy8hPCBmaWVsZCBtYWNyb2Jsb2NrIGluZGljYXRvcgoKICBzaWduZWQgY2hhciAqKiogcmVmX2lkeDsgIC8vITwgcmVmZXJlbmNlIHBpY3R1cmUgICBbbGlzdF1bc3ViYmxvY2tfeV1bc3ViYmxvY2tfeF0KCiAgaW50NjQgKioqICAgcmVmX3BpY19pZDsgICAgLy8hPCByZWZlcmVuY2UgcGljdHVyZSBpZGVudGlmaWVyIFtsaXN0XVtzdWJibG9ja195XVtzdWJibG9ja194XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgKG5vdCAgc2ltcGx5IGluZGV4KQoKICBpbnQ2NCAqKiogICByZWZfaWQ7ICAgICAgICAvLyE8IHJlZmVyZW5jZSBwaWN0dXJlIGlkZW50aWZpZXIgW2xpc3RdW3N1YmJsb2NrX3ldW3N1YmJsb2NrX3hdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAobm90ICBzaW1wbHkgaW5kZXgpCgogIHNob3J0ICoqKiogIG12OyAgICAgICAgICAgIC8vITwgbW90aW9uIHZlY3RvciAgICAgICBbbGlzdF1bc3ViYmxvY2tfeF1bc3ViYmxvY2tfeV1bY29tcG9uZW50XQoKICBieXRlICoqICAgICBtb3ZpbmdfYmxvY2s7CiAgYnl0ZSAqKiAgICAgZmllbGRfZnJhbWU7ICAgICAgICAgLy8hPCBpbmRpY2F0ZXMgaWYgY29fbG9jYXRlZCBpcyBmaWVsZCBvciBmcmFtZS4KCiAgc3RydWN0IHN0b3JhYmxlX3BpY3R1cmUgKnRvcF9maWVsZDsgICAgIC8vIGZvciBtYiBhZmYsIGlmIGZyYW1lIGZvciByZWZlcmVuY2luZyB0aGUgdG9wIGZpZWxkCiAgc3RydWN0IHN0b3JhYmxlX3BpY3R1cmUgKmJvdHRvbV9maWVsZDsgIC8vIGZvciBtYiBhZmYsIGlmIGZyYW1lIGZvciByZWZlcmVuY2luZyB0aGUgYm90dG9tIGZpZWxkCiAgc3RydWN0IHN0b3JhYmxlX3BpY3R1cmUgKmZyYW1lOyAgICAgICAgIC8vIGZvciBtYiBhZmYsIGlmIGZpZWxkIGZvciByZWZlcmVuY2luZyB0aGUgY29tYmluZWQgZnJhbWUKCiAgaW50ICAgICAgICAgY2hyb21hX2Zvcm1hdF9pZGM7CiAgaW50ICAgICAgICAgZnJhbWVfbWJzX29ubHlfZmxhZzsKICBpbnQgICAgICAgICBmcmFtZV9jcm9wcGluZ19mbGFnOwogIGludCAgICAgICAgIGZyYW1lX2Nyb3BwaW5nX3JlY3RfbGVmdF9vZmZzZXQ7CiAgaW50ICAgICAgICAgZnJhbWVfY3JvcHBpbmdfcmVjdF9yaWdodF9vZmZzZXQ7CiAgaW50ICAgICAgICAgZnJhbWVfY3JvcHBpbmdfcmVjdF90b3Bfb2Zmc2V0OwogIGludCAgICAgICAgIGZyYW1lX2Nyb3BwaW5nX3JlY3RfYm90dG9tX29mZnNldDsKfSBTdG9yYWJsZVBpY3R1cmU7CgoKLy8hIGRlZmluaXRpb24gYSBwaWN0dXJlIChmaWVsZCBvciBmcmFtZSkKdHlwZWRlZiBzdHJ1Y3QgY29sb2NhdGVkX3BhcmFtcwp7CiAgaW50ICAgICAgICAgbWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZzsKICBpbnQgICAgICAgICBzaXplX3gsIHNpemVfeTsKCiAgaW50NjQgICAgICAgcmVmX3BpY19udW1bNl1bTUFYX0xJU1RfU0laRV07CgogIHNpZ25lZCBjaGFyICoqKiByZWZfaWR4OyAgIC8vITwgcmVmZXJlbmNlIHBpY3R1cmUgICBbbGlzdF1bc3ViYmxvY2tfeV1bc3ViYmxvY2tfeF0KICBpbnQ2NCAqKiogICByZWZfcGljX2lkOyAgICAvLyE8IHJlZmVyZW5jZSBwaWN0dXJlIGlkZW50aWZpZXIgW2xpc3RdW3N1YmJsb2NrX3ldW3N1YmJsb2NrX3hdCiAgc2hvcnQgKioqKiAgbXY7ICAgICAgICAgICAgLy8hPCBtb3Rpb24gdmVjdG9yICAgICAgIFtsaXN0XVtzdWJibG9ja194XVtzdWJibG9ja195XVtjb21wb25lbnRdCiAgYnl0ZSAqKiAgICAgbW92aW5nX2Jsb2NrOwoKICAvLyBUb3AgZmllbGQgcGFyYW1zCiAgaW50NjQgICAgICAgdG9wX3JlZl9waWNfbnVtWzZdW01BWF9MSVNUX1NJWkVdOwogIHNpZ25lZCBjaGFyICoqKiB0b3BfcmVmX2lkeDsgICAgICAgLy8hPCByZWZlcmVuY2UgcGljdHVyZSAgIFtsaXN0XVtzdWJibG9ja195XVtzdWJibG9ja194XQogIGludDY0ICoqKiAgIHRvcF9yZWZfcGljX2lkOyAgICAvLyE8IHJlZmVyZW5jZSBwaWN0dXJlIGlkZW50aWZpZXIgW2xpc3RdW3N1YmJsb2NrX3ldW3N1YmJsb2NrX3hdCiAgc2hvcnQgKioqKiAgdG9wX212OyAgICAgICAgICAgIC8vITwgbW90aW9uIHZlY3RvciAgICAgICBbbGlzdF1bc3ViYmxvY2tfeF1bc3ViYmxvY2tfeV1bY29tcG9uZW50XQogIGJ5dGUgKiogICAgIHRvcF9tb3ZpbmdfYmxvY2s7CgogIC8vIEJvdHRvbSBmaWVsZCBwYXJhbXMKICBpbnQ2NCAgICAgICBib3R0b21fcmVmX3BpY19udW1bNl1bTUFYX0xJU1RfU0laRV07CiAgc2lnbmVkIGNoYXIgKioqIGJvdHRvbV9yZWZfaWR4OyAgICAgICAvLyE8IHJlZmVyZW5jZSBwaWN0dXJlICAgW2xpc3RdW3N1YmJsb2NrX3ldW3N1YmJsb2NrX3hdCiAgaW50NjQgKioqICAgYm90dG9tX3JlZl9waWNfaWQ7ICAgIC8vITwgcmVmZXJlbmNlIHBpY3R1cmUgaWRlbnRpZmllciBbbGlzdF1bc3ViYmxvY2tfeV1bc3ViYmxvY2tfeF0KICBzaG9ydCAqKioqICBib3R0b21fbXY7ICAgICAgICAgICAgLy8hPCBtb3Rpb24gdmVjdG9yICAgICAgIFtsaXN0XVtzdWJibG9ja194XVtzdWJibG9ja195XVtjb21wb25lbnRdCiAgYnl0ZSAqKiAgICAgYm90dG9tX21vdmluZ19ibG9jazsKCiAgYnl0ZSAgICAgICAgaXNfbG9uZ190ZXJtOwogIGJ5dGUgKiogICAgIGZpZWxkX2ZyYW1lOyAgICAgICAgIC8vITwgaW5kaWNhdGVzIGlmIGNvX2xvY2F0ZWQgaXMgZmllbGQgb3IgZnJhbWUuCgp9IENvbG9jYXRlZFBhcmFtczsKCi8vISBGcmFtZSBTdG9yZXMgZm9yIERlY29kZWQgUGljdHVyZSBCdWZmZXIKdHlwZWRlZiBzdHJ1Y3QgZnJhbWVfc3RvcmUKewogIGludCAgICAgICBpc191c2VkOyAgICAgICAgICAgICAgICAvLyE8IDA9ZW1wdHk7IDE9dG9wOyAyPWJvdHRvbTsgMz1ib3RoIGZpZWxkcyAob3IgZnJhbWUpCiAgaW50ICAgICAgIGlzX3JlZmVyZW5jZTsgICAgICAgICAgIC8vITwgMD1ub3QgdXNlZCBmb3IgcmVmOyAxPXRvcCB1c2VkOyAyPWJvdHRvbSB1c2VkOyAzPWJvdGggZmllbGRzIChvciBmcmFtZSkgdXNlZAogIGludCAgICAgICBpc19sb25nX3Rlcm07ICAgICAgICAgICAvLyE8IDA9bm90IHVzZWQgZm9yIHJlZjsgMT10b3AgdXNlZDsgMj1ib3R0b20gdXNlZDsgMz1ib3RoIGZpZWxkcyAob3IgZnJhbWUpIHVzZWQKICBpbnQgICAgICAgaXNfb3JpZ19yZWZlcmVuY2U7ICAgICAgLy8hPCBvcmlnaW5hbCBtYXJraW5nIGJ5IG5hbF9yZWZfaWRjOiAwPW5vdCB1c2VkIGZvciByZWY7IDE9dG9wIHVzZWQ7IDI9Ym90dG9tIHVzZWQ7IDM9Ym90aCBmaWVsZHMgKG9yIGZyYW1lKSB1c2VkCgogIGludCAgICAgICBpc19ub25fZXhpc3RlbnQ7CgogIHVuc2lnbmVkICBmcmFtZV9udW07CiAgaW50ICAgICAgIGZyYW1lX251bV93cmFwOwogIGludCAgICAgICBsb25nX3Rlcm1fZnJhbWVfaWR4OwogIGludCAgICAgICBpc19vdXRwdXQ7CiAgaW50ICAgICAgIHBvYzsKCiAgU3RvcmFibGVQaWN0dXJlICpmcmFtZTsKICBTdG9yYWJsZVBpY3R1cmUgKnRvcF9maWVsZDsKICBTdG9yYWJsZVBpY3R1cmUgKmJvdHRvbV9maWVsZDsKCn0gRnJhbWVTdG9yZTsKCgovLyEgRGVjb2RlZCBQaWN0dXJlIEJ1ZmZlcgp0eXBlZGVmIHN0cnVjdCBkZWNvZGVkX3BpY3R1cmVfYnVmZmVyCnsKICBGcmFtZVN0b3JlICAqKmZzOwogIEZyYW1lU3RvcmUgICoqZnNfcmVmOwogIEZyYW1lU3RvcmUgICoqZnNfbHRyZWY7CiAgdW5zaWduZWQgICAgICBzaXplOwogIHVuc2lnbmVkICAgICAgdXNlZF9zaXplOwogIHVuc2lnbmVkICAgICAgcmVmX2ZyYW1lc19pbl9idWZmZXI7CiAgdW5zaWduZWQgICAgICBsdHJlZl9mcmFtZXNfaW5fYnVmZmVyOwogIGludCAgICAgICAgICAgbGFzdF9vdXRwdXRfcG9jOwogIGludCAgICAgICAgICAgbWF4X2xvbmdfdGVybV9waWNfaWR4OwoKICBpbnQgICAgICAgICAgIGluaXRfZG9uZTsKCiAgRnJhbWVTdG9yZSAgICpsYXN0X3BpY3R1cmU7Cn0gRGVjb2RlZFBpY3R1cmVCdWZmZXI7CgoKZXh0ZXJuIERlY29kZWRQaWN0dXJlQnVmZmVyIGRwYjsKZXh0ZXJuIFN0b3JhYmxlUGljdHVyZSAqKmxpc3RYWzZdOwpleHRlcm4gaW50IGxpc3RYc2l6ZVs2XTsKCnZvaWQgICAgICAgICAgICAgaW5pdF9kcGIodm9pZCk7CnZvaWQgICAgICAgICAgICAgZnJlZV9kcGIodm9pZCk7CkZyYW1lU3RvcmUqICAgICAgYWxsb2NfZnJhbWVfc3RvcmUodm9pZCk7CnZvaWQgICAgICAgICAgICAgZnJlZV9mcmFtZV9zdG9yZShGcmFtZVN0b3JlKiBmKTsKU3RvcmFibGVQaWN0dXJlKiBhbGxvY19zdG9yYWJsZV9waWN0dXJlKFBpY3R1cmVTdHJ1Y3R1cmUgdHlwZSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwgaW50IHNpemVfeF9jciwgaW50IHNpemVfeV9jcik7CnZvaWQgICAgICAgICAgICAgZnJlZV9zdG9yYWJsZV9waWN0dXJlKFN0b3JhYmxlUGljdHVyZSogcCk7CnZvaWQgICAgICAgICAgICAgc3RvcmVfcGljdHVyZV9pbl9kcGIoU3RvcmFibGVQaWN0dXJlKiBwKTsKdm9pZCAgICAgICAgICAgICByZXBsYWNlX3RvcF9waWNfd2l0aF9mcmFtZShTdG9yYWJsZVBpY3R1cmUqIHApOwp2b2lkICAgICAgICAgICAgIGZsdXNoX2RwYih2b2lkKTsKCnZvaWQgICAgICAgICAgICAgZHBiX3NwbGl0X2ZpZWxkKEZyYW1lU3RvcmUgKmZzKTsKdm9pZCAgICAgICAgICAgICBkcGJfY29tYmluZV9maWVsZChGcmFtZVN0b3JlICpmcyk7CnZvaWQgICAgICAgICAgICAgZHBiX2NvbWJpbmVfZmllbGRfeXV2KEZyYW1lU3RvcmUgKmZzKTsKCnZvaWQgICAgICAgICAgICAgaW5pdF9saXN0cyhpbnQgY3VyclNsaWNlVHlwZSwgUGljdHVyZVN0cnVjdHVyZSBjdXJyUGljU3RydWN0dXJlKTsKdm9pZCAgICAgICAgICAgICByZW9yZGVyX3JlZl9waWNfbGlzdChTdG9yYWJsZVBpY3R1cmUgKipsaXN0LCBpbnQgKmxpc3Rfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSwgaW50ICpyZW9yZGVyaW5nX29mX3BpY19udW1zX2lkYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFic19kaWZmX3BpY19udW1fbWludXMxLCBpbnQgKmxvbmdfdGVybV9waWNfaWR4KTsKCnZvaWQgICAgICAgICAgICAgaW5pdF9tYmFmZl9saXN0cyh2b2lkKTsKdm9pZCAgICAgICAgICAgICBhbGxvY19yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19idWZmZXIoU2xpY2UgKmN1cnJTbGljZSk7CnZvaWQgICAgICAgICAgICAgZnJlZV9yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19idWZmZXIoU2xpY2UgKmN1cnJTbGljZSk7Cgp2b2lkICAgICAgICAgICAgIGZpbGxfZnJhbWVfbnVtX2dhcChJbWFnZVBhcmFtZXRlcnMgKmltZyk7CgpDb2xvY2F0ZWRQYXJhbXMqIGFsbG9jX2NvbG9jYXRlZChpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LGludCBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnKTsKdm9pZCBmcmVlX2NvbG9jYXRlZChDb2xvY2F0ZWRQYXJhbXMqIHApOwp2b2lkIGNvbXB1dGVfY29sb2NhdGVkKENvbG9jYXRlZFBhcmFtcyogcCwgU3RvcmFibGVQaWN0dXJlICoqbGlzdFhbNl0pOwoKI2VuZGlmCgo=