LyogY29ubmVjdGlvbi5jIC0gdGhlIGNvbm5lY3Rpb24gdHlwZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKiAKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwogKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgogKgogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiAqCiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAqLwoKI2luY2x1ZGUgImNhY2hlLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKI2luY2x1ZGUgInN0YXRlbWVudC5oIgojaW5jbHVkZSAiY3Vyc29yLmgiCiNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCiNpbmNsdWRlICJ1dGlsLmgiCiNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCIKCiNpbmNsdWRlICJweXRocmVhZC5oIgoKI2RlZmluZSBBQ1RJT05fRklOQUxJWkUgMQojZGVmaW5lIEFDVElPTl9SRVNFVCAyCgpzdGF0aWMgaW50IHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsKTsKCgpzdGF0aWMgdm9pZCBfc3FsaXRlM19yZXN1bHRfZXJyb3Ioc3FsaXRlM19jb250ZXh0KiBjdHgsIGNvbnN0IGNoYXIqIGVycm1zZywgaW50IGxlbikKewogICAgLyogaW4gb2xkZXIgU1FMaXRlIHZlcnNpb25zLCBjYWxsaW5nIHNxbGl0ZTNfcmVzdWx0X2Vycm9yIGluIGNhbGxiYWNrcwogICAgICogdHJpZ2dlcnMgYSBidWcgaW4gU1FMaXRlIHRoYXQgbGVhZHMgZWl0aGVyIHRvIGlycml0YXRpbmcgcmVzdWx0cyBvcgogICAgICogc2VnZmF1bHRzLCBkZXBlbmRpbmcgb24gdGhlIFNRTGl0ZSB2ZXJzaW9uICovCiNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMzAwMwogICAgc3FsaXRlM19yZXN1bHRfZXJyb3IoY3R4LCBlcnJtc2csIGxlbik7CiNlbHNlCiAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgZXJybXNnKTsKI2VuZGlmCn0KCmludCBweXNxbGl0ZV9jb25uZWN0aW9uX2luaXQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YWJhc2UiLCAidGltZW91dCIsICJkZXRlY3RfdHlwZXMiLCAiaXNvbGF0aW9uX2xldmVsIiwgImNoZWNrX3NhbWVfdGhyZWFkIiwgImZhY3RvcnkiLCAiY2FjaGVkX3N0YXRlbWVudHMiLCBOVUxMLCBOVUxMfTsKCiAgICBjaGFyKiBkYXRhYmFzZTsKICAgIGludCBkZXRlY3RfdHlwZXMgPSAwOwogICAgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCA9IE5VTEw7CiAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7CiAgICBpbnQgY2hlY2tfc2FtZV90aHJlYWQgPSAxOwogICAgaW50IGNhY2hlZF9zdGF0ZW1lbnRzID0gMTAwOwogICAgZG91YmxlIHRpbWVvdXQgPSA1LjA7CiAgICBpbnQgcmM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xkaU9pT2kiLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJhc2UsICZ0aW1lb3V0LCAmZGV0ZWN0X3R5cGVzLCAmaXNvbGF0aW9uX2xldmVsLCAmY2hlY2tfc2FtZV90aHJlYWQsICZmYWN0b3J5LCAmY2FjaGVkX3N0YXRlbWVudHMpKQogICAgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQgPSBOVUxMOwoKICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZSA9IE5VTEw7CiAgICBzZWxmLT5zdGF0ZW1lbnRzID0gTlVMTDsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICBzZWxmLT5yb3dfZmFjdG9yeSA9IFB5X05vbmU7CgogICAgUHlfSU5DUkVGKCZQeVVuaWNvZGVfVHlwZSk7CiAgICBzZWxmLT50ZXh0X2ZhY3RvcnkgPSAoUHlPYmplY3QqKSZQeVVuaWNvZGVfVHlwZTsKCiAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICByYyA9IHNxbGl0ZTNfb3BlbihkYXRhYmFzZSwgJnNlbGYtPmRiKTsKICAgIFB5X0VORF9BTExPV19USFJFQURTCgogICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmICghaXNvbGF0aW9uX2xldmVsKSB7CiAgICAgICAgaXNvbGF0aW9uX2xldmVsID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoIiIpOwogICAgICAgIGlmICghaXNvbGF0aW9uX2xldmVsKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIFB5X0lOQ1JFRihpc29sYXRpb25fbGV2ZWwpOwogICAgfQogICAgc2VsZi0+aXNvbGF0aW9uX2xldmVsID0gTlVMTDsKICAgIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChzZWxmLCBpc29sYXRpb25fbGV2ZWwpOwogICAgUHlfREVDUkVGKGlzb2xhdGlvbl9sZXZlbCk7CgogICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlID0gKHB5c3FsaXRlX0NhY2hlKilQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikmcHlzcWxpdGVfQ2FjaGVUeXBlLCAiT2kiLCBzZWxmLCBjYWNoZWRfc3RhdGVtZW50cyk7CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWxmLT5zdGF0ZW1lbnRzID0gUHlMaXN0X05ldygwKTsKICAgIGlmICghc2VsZi0+c3RhdGVtZW50cykgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHNlbGYtPmNyZWF0ZWRfc3RhdGVtZW50cyA9IDA7CgogICAgLyogQnkgZGVmYXVsdCwgdGhlIENhY2hlIGNsYXNzIElOQ1JFRnMgdGhlIGZhY3RvcnkgaW4gaXRzIGluaXRpYWxpemVyLCBhbmQKICAgICAqIGRlY3JlZnMgaXQgaW4gaXRzIGRlYWxsb2NhdG9yIG1ldGhvZC4gU2luY2UgdGhpcyB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhcgogICAgICogcmVmZXJlbmNlIGhlcmUsIHdlJ3JlIGJyZWFraW5nIGl0IGJ5IGRlY3JlbWVudGluZyBzZWxmLCBhbmQgdGVsbGluZyB0aGUKICAgICAqIGNhY2hlIGNsYXNzIHRvIG5vdCBkZWNyZWYgdGhlIGZhY3RvcnkgKHNlbGYpIGluIGl0cyBkZWFsbG9jYXRvci4KICAgICAqLwogICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlLT5kZWNyZWZfZmFjdG9yeSA9IDA7CiAgICBQeV9ERUNSRUYoc2VsZik7CgogICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDA7CiAgICBzZWxmLT5kZXRlY3RfdHlwZXMgPSBkZXRlY3RfdHlwZXM7CiAgICBzZWxmLT50aW1lb3V0ID0gdGltZW91dDsKICAgICh2b2lkKXNxbGl0ZTNfYnVzeV90aW1lb3V0KHNlbGYtPmRiLCAoaW50KSh0aW1lb3V0KjEwMDApKTsKI2lmZGVmIFdJVEhfVEhSRUFECiAgICBzZWxmLT50aHJlYWRfaWRlbnQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CiNlbmRpZgogICAgc2VsZi0+Y2hlY2tfc2FtZV90aHJlYWQgPSBjaGVja19zYW1lX3RocmVhZDsKCiAgICBzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCA9IFB5RGljdF9OZXcoKTsKICAgIGlmICghc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgc2VsZi0+Y29sbGF0aW9ucyA9IFB5RGljdF9OZXcoKTsKICAgIGlmICghc2VsZi0+Y29sbGF0aW9ucykgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWxmLT5XYXJuaW5nICAgICAgICAgICAgICAgPSBweXNxbGl0ZV9XYXJuaW5nOwogICAgc2VsZi0+RXJyb3IgICAgICAgICAgICAgICAgID0gcHlzcWxpdGVfRXJyb3I7CiAgICBzZWxmLT5JbnRlcmZhY2VFcnJvciAgICAgICAgPSBweXNxbGl0ZV9JbnRlcmZhY2VFcnJvcjsKICAgIHNlbGYtPkRhdGFiYXNlRXJyb3IgICAgICAgICA9IHB5c3FsaXRlX0RhdGFiYXNlRXJyb3I7CiAgICBzZWxmLT5EYXRhRXJyb3IgICAgICAgICAgICAgPSBweXNxbGl0ZV9EYXRhRXJyb3I7CiAgICBzZWxmLT5PcGVyYXRpb25hbEVycm9yICAgICAgPSBweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yOwogICAgc2VsZi0+SW50ZWdyaXR5RXJyb3IgICAgICAgID0gcHlzcWxpdGVfSW50ZWdyaXR5RXJyb3I7CiAgICBzZWxmLT5JbnRlcm5hbEVycm9yICAgICAgICAgPSBweXNxbGl0ZV9JbnRlcm5hbEVycm9yOwogICAgc2VsZi0+UHJvZ3JhbW1pbmdFcnJvciAgICAgID0gcHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvcjsKICAgIHNlbGYtPk5vdFN1cHBvcnRlZEVycm9yICAgICA9IHB5c3FsaXRlX05vdFN1cHBvcnRlZEVycm9yOwoKICAgIHJldHVybiAwOwp9CgovKiBFbXB0eSB0aGUgZW50aXJlIHN0YXRlbWVudCBjYWNoZSBvZiB0aGlzIGNvbm5lY3Rpb24gKi8Kdm9pZCBweXNxbGl0ZV9mbHVzaF9zdGF0ZW1lbnRfY2FjaGUocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikKewogICAgcHlzcWxpdGVfTm9kZSogbm9kZTsKICAgIHB5c3FsaXRlX1N0YXRlbWVudCogc3RhdGVtZW50OwoKICAgIG5vZGUgPSBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUtPmZpcnN0OwoKICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgc3RhdGVtZW50ID0gKHB5c3FsaXRlX1N0YXRlbWVudCopKG5vZGUtPmRhdGEpOwogICAgICAgICh2b2lkKXB5c3FsaXRlX3N0YXRlbWVudF9maW5hbGl6ZShzdGF0ZW1lbnQpOwogICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwogICAgfQoKICAgIFB5X0RFQ1JFRihzZWxmLT5zdGF0ZW1lbnRfY2FjaGUpOwogICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlID0gKHB5c3FsaXRlX0NhY2hlKilQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikmcHlzcWxpdGVfQ2FjaGVUeXBlLCAiTyIsIHNlbGYpOwogICAgUHlfREVDUkVGKHNlbGYpOwogICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlLT5kZWNyZWZfZmFjdG9yeSA9IDA7Cn0KCi8qIGFjdGlvbiBpbiAoQUNUSU9OX1JFU0VULCBBQ1RJT05fRklOQUxJWkUpICovCnZvaWQgcHlzcWxpdGVfZG9fYWxsX3N0YXRlbWVudHMocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgaW50IGFjdGlvbikKewogICAgaW50IGk7CiAgICBQeU9iamVjdCogd2Vha3JlZjsKICAgIFB5T2JqZWN0KiBzdGF0ZW1lbnQ7CgogICAgZm9yIChpID0gMDsgaSA8IFB5TGlzdF9TaXplKHNlbGYtPnN0YXRlbWVudHMpOyBpKyspIHsKICAgICAgICB3ZWFrcmVmID0gUHlMaXN0X0dldEl0ZW0oc2VsZi0+c3RhdGVtZW50cywgaSk7CiAgICAgICAgc3RhdGVtZW50ID0gUHlXZWFrcmVmX0dldE9iamVjdCh3ZWFrcmVmKTsKICAgICAgICBpZiAoc3RhdGVtZW50ICE9IFB5X05vbmUpIHsKICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBBQ1RJT05fUkVTRVQpIHsKICAgICAgICAgICAgICAgICh2b2lkKXB5c3FsaXRlX3N0YXRlbWVudF9yZXNldCgocHlzcWxpdGVfU3RhdGVtZW50KilzdGF0ZW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X2ZpbmFsaXplKChweXNxbGl0ZV9TdGF0ZW1lbnQqKXN0YXRlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnZvaWQgcHlzcWxpdGVfY29ubmVjdGlvbl9kZWFsbG9jKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpCnsKICAgIFB5X1hERUNSRUYoc2VsZi0+c3RhdGVtZW50X2NhY2hlKTsKCiAgICAvKiBDbGVhbiB1cCBpZiB1c2VyIGhhcyBub3QgY2FsbGVkIC5jbG9zZSgpIGV4cGxpY2l0bHkuICovCiAgICBpZiAoc2VsZi0+ZGIpIHsKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgc3FsaXRlM19jbG9zZShzZWxmLT5kYik7CiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgIH0KCiAgICBpZiAoc2VsZi0+YmVnaW5fc3RhdGVtZW50KSB7CiAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpOwogICAgfQogICAgUHlfWERFQ1JFRihzZWxmLT5pc29sYXRpb25fbGV2ZWwpOwogICAgUHlfWERFQ1JFRihzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCk7CiAgICBQeV9YREVDUkVGKHNlbGYtPnJvd19mYWN0b3J5KTsKICAgIFB5X1hERUNSRUYoc2VsZi0+dGV4dF9mYWN0b3J5KTsKICAgIFB5X1hERUNSRUYoc2VsZi0+Y29sbGF0aW9ucyk7CiAgICBQeV9YREVDUkVGKHNlbGYtPnN0YXRlbWVudHMpOwoKICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY3Vyc29yKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZhY3RvcnkiLCBOVUxMLCBOVUxMfTsKICAgIFB5T2JqZWN0KiBmYWN0b3J5ID0gTlVMTDsKICAgIFB5T2JqZWN0KiBjdXJzb3I7CgoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY3RvcnkpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoZmFjdG9yeSA9PSBOVUxMKSB7CiAgICAgICAgZmFjdG9yeSA9IChQeU9iamVjdCopJnB5c3FsaXRlX0N1cnNvclR5cGU7CiAgICB9CgogICAgY3Vyc29yID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZhY3RvcnksICJPIiwgc2VsZik7CgogICAgaWYgKGN1cnNvciAmJiBzZWxmLT5yb3dfZmFjdG9yeSAhPSBQeV9Ob25lKSB7CiAgICAgICAgUHlfWERFQ1JFRigoKHB5c3FsaXRlX0N1cnNvciopY3Vyc29yKS0+cm93X2ZhY3RvcnkpOwogICAgICAgIFB5X0lOQ1JFRihzZWxmLT5yb3dfZmFjdG9yeSk7CiAgICAgICAgKChweXNxbGl0ZV9DdXJzb3IqKWN1cnNvciktPnJvd19mYWN0b3J5ID0gc2VsZi0+cm93X2ZhY3Rvcnk7CiAgICB9CgogICAgcmV0dXJuIGN1cnNvcjsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY2xvc2UocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIGludCByYzsKCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHB5c3FsaXRlX2RvX2FsbF9zdGF0ZW1lbnRzKHNlbGYsIEFDVElPTl9GSU5BTElaRSk7CgogICAgaWYgKHNlbGYtPmRiKSB7CiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgIHJjID0gc3FsaXRlM19jbG9zZShzZWxmLT5kYik7CiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKCiAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWxmLT5kYiA9IE5VTEw7CiAgICAgICAgfQogICAgfQoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgovKgogKiBDaGVja3MgaWYgYSBjb25uZWN0aW9uIG9iamVjdCBpcyB1c2FibGUgKGkuIGUuIG5vdCBjbG9zZWQpLgogKgogKiAwID0+IGVycm9yOyAxID0+IG9rCiAqLwppbnQgcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihweXNxbGl0ZV9Db25uZWN0aW9uKiBjb24pCnsKICAgIGlmICghY29uLT5kYikgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLCAiQ2Fubm90IG9wZXJhdGUgb24gYSBjbG9zZWQgZGF0YWJhc2UuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAxOwogICAgfQp9CgpQeU9iamVjdCogX3B5c3FsaXRlX2Nvbm5lY3Rpb25fYmVnaW4ocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikKewogICAgaW50IHJjOwogICAgY29uc3QgY2hhciogdGFpbDsKICAgIHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50OwoKICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLCBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQsIC0xLCAmc3RhdGVtZW50LCAmdGFpbCk7CiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICByYyA9IHB5c3FsaXRlX3N0ZXAoc3RhdGVtZW50LCBzZWxmKTsKICAgIGlmIChyYyA9PSBTUUxJVEVfRE9ORSkgewogICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAxOwogICAgfSBlbHNlIHsKICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICB9CgogICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgfQoKZXJyb3I6CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICB9Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2NvbW1pdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgaW50IHJjOwogICAgY29uc3QgY2hhciogdGFpbDsKICAgIHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50OwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKHNlbGYtPmluVHJhbnNhY3Rpb24pIHsKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsICJDT01NSVQiLCAtMSwgJnN0YXRlbWVudCwgJnRhaWwpOwogICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgIH0KCiAgICAgICAgcmMgPSBweXNxbGl0ZV9zdGVwKHN0YXRlbWVudCwgc2VsZik7CiAgICAgICAgaWYgKHJjID09IFNRTElURV9ET05FKSB7CiAgICAgICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgc3RhdGVtZW50KTsKICAgICAgICB9CgogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICB9CgogICAgfQoKZXJyb3I6CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICB9Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX3JvbGxiYWNrKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBpbnQgcmM7CiAgICBjb25zdCBjaGFyKiB0YWlsOwogICAgc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQ7CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoc2VsZi0+aW5UcmFuc2FjdGlvbikgewogICAgICAgIHB5c3FsaXRlX2RvX2FsbF9zdGF0ZW1lbnRzKHNlbGYsIEFDVElPTl9SRVNFVCk7CgogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICByYyA9IHNxbGl0ZTNfcHJlcGFyZShzZWxmLT5kYiwgIlJPTExCQUNLIiwgLTEsICZzdGF0ZW1lbnQsICZ0YWlsKTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICB9CgogICAgICAgIHJjID0gcHlzcWxpdGVfc3RlcChzdGF0ZW1lbnQsIHNlbGYpOwogICAgICAgIGlmIChyYyA9PSBTUUxJVEVfRE9ORSkgewogICAgICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICAgICAgfQoKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgfQoKICAgIH0KCmVycm9yOgogICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgfQp9Cgp2b2lkIF9weXNxbGl0ZV9zZXRfcmVzdWx0KHNxbGl0ZTNfY29udGV4dCogY29udGV4dCwgUHlPYmplY3QqIHB5X3ZhbCkKewogICAgbG9uZyBsb25ndmFsOwogICAgY29uc3QgY2hhciogYnVmZmVyOwogICAgUHlfc3NpemVfdCBidWZsZW47CgogICAgaWYgKCghcHlfdmFsKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgc3FsaXRlM19yZXN1bHRfbnVsbChjb250ZXh0KTsKICAgIH0gZWxzZSBpZiAocHlfdmFsID09IFB5X05vbmUpIHsKICAgICAgICBzcWxpdGUzX3Jlc3VsdF9udWxsKGNvbnRleHQpOwogICAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2socHlfdmFsKSkgewogICAgICAgIGxvbmd2YWwgPSBQeUxvbmdfQXNMb25nKHB5X3ZhbCk7CiAgICAgICAgc3FsaXRlM19yZXN1bHRfaW50NjQoY29udGV4dCwgKFBZX0xPTkdfTE9ORylsb25ndmFsKTsKICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhweV92YWwpKSB7CiAgICAgICAgc3FsaXRlM19yZXN1bHRfZG91YmxlKGNvbnRleHQsIFB5RmxvYXRfQXNEb3VibGUocHlfdmFsKSk7CiAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhweV92YWwpKSB7CiAgICAgICAgc3FsaXRlM19yZXN1bHRfdGV4dChjb250ZXh0LCBfUHlVbmljb2RlX0FzU3RyaW5nKHB5X3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgIH0gZWxzZSBpZiAoUHlPYmplY3RfQ2hlY2tCdWZmZXIocHlfdmFsKSkgewogICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocHlfdmFsLCAmYnVmZmVyLCAmYnVmbGVuKSAhPSAwKSB7CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzcWxpdGUzX3Jlc3VsdF9ibG9iKGNvbnRleHQsIGJ1ZmZlciwgYnVmbGVuLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIC8qIFRPRE86IHJhaXNlIGVycm9yICovCiAgICB9Cn0KClB5T2JqZWN0KiBfcHlzcWxpdGVfYnVpbGRfcHlfcGFyYW1zKHNxbGl0ZTNfY29udGV4dCAqY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUqKiBhcmd2KQp7CiAgICBQeU9iamVjdCogYXJnczsKICAgIGludCBpOwogICAgc3FsaXRlM192YWx1ZSogY3VyX3ZhbHVlOwogICAgUHlPYmplY3QqIGN1cl9weV92YWx1ZTsKICAgIGNvbnN0IGNoYXIqIHZhbF9zdHI7CiAgICBQWV9MT05HX0xPTkcgdmFsX2ludDsKICAgIFB5X3NzaXplX3QgYnVmbGVuOwoKICAgIGFyZ3MgPSBQeVR1cGxlX05ldyhhcmdjKTsKICAgIGlmICghYXJncykgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICBjdXJfdmFsdWUgPSBhcmd2W2ldOwogICAgICAgIHN3aXRjaCAoc3FsaXRlM192YWx1ZV90eXBlKGFyZ3ZbaV0pKSB7CiAgICAgICAgICAgIGNhc2UgU1FMSVRFX0lOVEVHRVI6CiAgICAgICAgICAgICAgICB2YWxfaW50ID0gc3FsaXRlM192YWx1ZV9pbnQ2NChjdXJfdmFsdWUpOwogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKXZhbF9pbnQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgU1FMSVRFX0ZMT0FUOgogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlGbG9hdF9Gcm9tRG91YmxlKHNxbGl0ZTNfdmFsdWVfZG91YmxlKGN1cl92YWx1ZSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgU1FMSVRFX1RFWFQ6CiAgICAgICAgICAgICAgICB2YWxfc3RyID0gKGNvbnN0IGNoYXIqKXNxbGl0ZTNfdmFsdWVfdGV4dChjdXJfdmFsdWUpOwogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcodmFsX3N0cik7CiAgICAgICAgICAgICAgICAvKiBUT0RPOiBoYXZlIGEgd2F5IHRvIHNob3cgZXJyb3JzIGhlcmUgKi8KICAgICAgICAgICAgICAgIGlmICghY3VyX3B5X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlfTm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFNRTElURV9CTE9COgogICAgICAgICAgICAgICAgYnVmbGVuID0gc3FsaXRlM192YWx1ZV9ieXRlcyhjdXJfdmFsdWUpOwogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgKICAgICAgICAgICAgICAgICAgICBzcWxpdGUzX3ZhbHVlX2Jsb2IoY3VyX3ZhbHVlKSwgYnVmbGVuKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFNRTElURV9OVUxMOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlfTm9uZTsKICAgICAgICB9CgogICAgICAgIGlmICghY3VyX3B5X3ZhbHVlKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQoKICAgICAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgaSwgY3VyX3B5X3ZhbHVlKTsKCiAgICB9CgogICAgcmV0dXJuIGFyZ3M7Cn0KCnZvaWQgX3B5c3FsaXRlX2Z1bmNfY2FsbGJhY2soc3FsaXRlM19jb250ZXh0KiBjb250ZXh0LCBpbnQgYXJnYywgc3FsaXRlM192YWx1ZSoqIGFyZ3YpCnsKICAgIFB5T2JqZWN0KiBhcmdzOwogICAgUHlPYmplY3QqIHB5X2Z1bmM7CiAgICBQeU9iamVjdCogcHlfcmV0dmFsID0gTlVMTDsKCiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsKCiAgICB0aHJlYWRzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiNlbmRpZgoKICAgIHB5X2Z1bmMgPSAoUHlPYmplY3QqKXNxbGl0ZTNfdXNlcl9kYXRhKGNvbnRleHQpOwoKICAgIGFyZ3MgPSBfcHlzcWxpdGVfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIGFyZ3YpOwogICAgaWYgKGFyZ3MpIHsKICAgICAgICBweV9yZXR2YWwgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHB5X2Z1bmMsIGFyZ3MpOwogICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgIH0KCiAgICBpZiAocHlfcmV0dmFsKSB7CiAgICAgICAgX3B5c3FsaXRlX3NldF9yZXN1bHQoY29udGV4dCwgcHlfcmV0dmFsKTsKICAgICAgICBQeV9ERUNSRUYocHlfcmV0dmFsKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgewogICAgICAgICAgICBQeUVycl9QcmludCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgfQogICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGZ1bmN0aW9uIHJhaXNlZCBleGNlcHRpb24iLCAtMSk7CiAgICB9CgojaWZkZWYgV0lUSF9USFJFQUQKICAgIFB5R0lMU3RhdGVfUmVsZWFzZSh0aHJlYWRzdGF0ZSk7CiNlbmRpZgp9CgpzdGF0aWMgdm9pZCBfcHlzcWxpdGVfc3RlcF9jYWxsYmFjayhzcWxpdGUzX2NvbnRleHQgKmNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlKiogcGFyYW1zKQp7CiAgICBQeU9iamVjdCogYXJnczsKICAgIFB5T2JqZWN0KiBmdW5jdGlvbl9yZXN1bHQgPSBOVUxMOwogICAgUHlPYmplY3QqIGFnZ3JlZ2F0ZV9jbGFzczsKICAgIFB5T2JqZWN0KiogYWdncmVnYXRlX2luc3RhbmNlOwogICAgUHlPYmplY3QqIHN0ZXBtZXRob2QgPSBOVUxMOwoKI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUdJTFN0YXRlX1NUQVRFIHRocmVhZHN0YXRlOwoKICAgIHRocmVhZHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKI2VuZGlmCgogICAgYWdncmVnYXRlX2NsYXNzID0gKFB5T2JqZWN0KilzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKCiAgICBhZ2dyZWdhdGVfaW5zdGFuY2UgPSAoUHlPYmplY3QqKilzcWxpdGUzX2FnZ3JlZ2F0ZV9jb250ZXh0KGNvbnRleHQsIHNpemVvZihQeU9iamVjdCopKTsKCiAgICBpZiAoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9PSAwKSB7CiAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihhZ2dyZWdhdGVfY2xhc3MsICIiKTsKCiAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IDA7CiAgICAgICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdfX2luaXRfXycgbWV0aG9kIHJhaXNlZCBlcnJvciIsIC0xKTsKICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICB9CiAgICB9CgogICAgc3RlcG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSwgInN0ZXAiKTsKICAgIGlmICghc3RlcG1ldGhvZCkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgYXJncyA9IF9weXNxbGl0ZV9idWlsZF9weV9wYXJhbXMoY29udGV4dCwgYXJnYywgcGFyYW1zKTsKICAgIGlmICghYXJncykgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgZnVuY3Rpb25fcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChzdGVwbWV0aG9kLCBhcmdzKTsKICAgIFB5X0RFQ1JFRihhcmdzKTsKCiAgICBpZiAoIWZ1bmN0aW9uX3Jlc3VsdCkgewogICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgIH0KICAgICAgICBfc3FsaXRlM19yZXN1bHRfZXJyb3IoY29udGV4dCwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnc3RlcCcgbWV0aG9kIHJhaXNlZCBlcnJvciIsIC0xKTsKICAgIH0KCmVycm9yOgogICAgUHlfWERFQ1JFRihzdGVwbWV0aG9kKTsKICAgIFB5X1hERUNSRUYoZnVuY3Rpb25fcmVzdWx0KTsKCiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKI2VuZGlmCn0KCnZvaWQgX3B5c3FsaXRlX2ZpbmFsX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCogY29udGV4dCkKewogICAgUHlPYmplY3QqIGZ1bmN0aW9uX3Jlc3VsdCA9IE5VTEw7CiAgICBQeU9iamVjdCoqIGFnZ3JlZ2F0ZV9pbnN0YW5jZTsKICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7CgojaWZkZWYgV0lUSF9USFJFQUQKICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7CgogICAgdGhyZWFkc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwojZW5kaWYKCiAgICBhZ2dyZWdhdGVfY2xhc3MgPSAoUHlPYmplY3QqKXNxbGl0ZTNfdXNlcl9kYXRhKGNvbnRleHQpOwoKICAgIGFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IChQeU9iamVjdCoqKXNxbGl0ZTNfYWdncmVnYXRlX2NvbnRleHQoY29udGV4dCwgc2l6ZW9mKFB5T2JqZWN0KikpOwogICAgaWYgKCEqYWdncmVnYXRlX2luc3RhbmNlKSB7CiAgICAgICAgLyogdGhpcyBicmFuY2ggaXMgZXhlY3V0ZWQgaWYgdGhlcmUgd2FzIGFuIGV4Y2VwdGlvbiBpbiB0aGUgYWdncmVnYXRlJ3MKICAgICAgICAgKiBfX2luaXRfXyAqLwoKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSwgImZpbmFsaXplIiwgIiIpOwogICAgaWYgKCFmdW5jdGlvbl9yZXN1bHQpIHsKICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CiAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgX3NxbGl0ZTNfcmVzdWx0X2Vycm9yKGNvbnRleHQsICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIiwgLTEpOwogICAgfSBlbHNlIHsKICAgICAgICBfcHlzcWxpdGVfc2V0X3Jlc3VsdChjb250ZXh0LCBmdW5jdGlvbl9yZXN1bHQpOwogICAgfQoKZXJyb3I6CiAgICBQeV9YREVDUkVGKCphZ2dyZWdhdGVfaW5zdGFuY2UpOwogICAgUHlfWERFQ1JFRihmdW5jdGlvbl9yZXN1bHQpOwoKI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOwojZW5kaWYKfQoKdm9pZCBfcHlzcWxpdGVfZHJvcF91bnVzZWRfc3RhdGVtZW50X3JlZmVyZW5jZXMocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikKewogICAgUHlPYmplY3QqIG5ld19saXN0OwogICAgUHlPYmplY3QqIHdlYWtyZWY7CiAgICBpbnQgaTsKCiAgICAvKiB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBvbmNlIGluIGEgd2hpbGUgKi8KICAgIGlmIChzZWxmLT5jcmVhdGVkX3N0YXRlbWVudHMrKyA8IDIwMCkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBzZWxmLT5jcmVhdGVkX3N0YXRlbWVudHMgPSAwOwoKICAgIG5ld19saXN0ID0gUHlMaXN0X05ldygwKTsKICAgIGlmICghbmV3X2xpc3QpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IFB5TGlzdF9TaXplKHNlbGYtPnN0YXRlbWVudHMpOyBpKyspIHsKICAgICAgICB3ZWFrcmVmID0gUHlMaXN0X0dldEl0ZW0oc2VsZi0+c3RhdGVtZW50cywgaSk7CiAgICAgICAgaWYgKFB5V2Vha3JlZl9HZXRPYmplY3Qod2Vha3JlZikgIT0gUHlfTm9uZSkgewogICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChuZXdfbGlzdCwgd2Vha3JlZikgIT0gMCkgewogICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld19saXN0KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBQeV9ERUNSRUYoc2VsZi0+c3RhdGVtZW50cyk7CiAgICBzZWxmLT5zdGF0ZW1lbnRzID0gbmV3X2xpc3Q7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2NyZWF0ZV9mdW5jdGlvbihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgIm5hcmciLCAiZnVuYyIsIE5VTEwsIE5VTEx9OwoKICAgIFB5T2JqZWN0KiBmdW5jOwogICAgY2hhciogbmFtZTsKICAgIGludCBuYXJnOwogICAgaW50IHJjOwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic2lPIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsICZuYXJnLCAmZnVuYykpCiAgICB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcmMgPSBzcWxpdGUzX2NyZWF0ZV9mdW5jdGlvbihzZWxmLT5kYiwgbmFtZSwgbmFyZywgU1FMSVRFX1VURjgsICh2b2lkKilmdW5jLCBfcHlzcWxpdGVfZnVuY19jYWxsYmFjaywgTlVMTCwgTlVMTCk7CgogICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgIC8qIFdvcmthcm91bmQgZm9yIFNRTGl0ZSBidWc6IG5vIGVycm9yIGNvZGUgb3Igc3RyaW5nIGlzIGF2YWlsYWJsZSBoZXJlICovCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJFcnJvciBjcmVhdGluZyBmdW5jdGlvbiIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgZnVuYywgUHlfTm9uZSk7CgogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICByZXR1cm4gUHlfTm9uZTsKICAgIH0KfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2FnZ3JlZ2F0ZShweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIGFnZ3JlZ2F0ZV9jbGFzczsKCiAgICBpbnQgbl9hcmc7CiAgICBjaGFyKiBuYW1lOwogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyAibmFtZSIsICJuX2FyZyIsICJhZ2dyZWdhdGVfY2xhc3MiLCBOVUxMIH07CiAgICBpbnQgcmM7CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzaU86Y3JlYXRlX2FnZ3JlZ2F0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmbmFtZSwgJm5fYXJnLCAmYWdncmVnYXRlX2NsYXNzKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHJjID0gc3FsaXRlM19jcmVhdGVfZnVuY3Rpb24oc2VsZi0+ZGIsIG5hbWUsIG5fYXJnLCBTUUxJVEVfVVRGOCwgKHZvaWQqKWFnZ3JlZ2F0ZV9jbGFzcywgMCwgJl9weXNxbGl0ZV9zdGVwX2NhbGxiYWNrLCAmX3B5c3FsaXRlX2ZpbmFsX2NhbGxiYWNrKTsKICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICAvKiBXb3JrYXJvdW5kIGZvciBTUUxpdGUgYnVnOiBubyBlcnJvciBjb2RlIG9yIHN0cmluZyBpcyBhdmFpbGFibGUgaGVyZSAqLwogICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiRXJyb3IgY3JlYXRpbmcgYWdncmVnYXRlIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBhZ2dyZWdhdGVfY2xhc3MsIFB5X05vbmUpOwoKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICB9Cn0KCnN0YXRpYyBpbnQgX2F1dGhvcml6ZXJfY2FsbGJhY2sodm9pZCogdXNlcl9hcmcsIGludCBhY3Rpb24sIGNvbnN0IGNoYXIqIGFyZzEsIGNvbnN0IGNoYXIqIGFyZzIgLCBjb25zdCBjaGFyKiBkYm5hbWUsIGNvbnN0IGNoYXIqIGFjY2Vzc19hdHRlbXB0X3NvdXJjZSkKewogICAgUHlPYmplY3QgKnJldDsKICAgIGludCByYzsKI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlOwoKICAgIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKI2VuZGlmCiAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0Kil1c2VyX2FyZywgImlzc3NzIiwgYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIGFjY2Vzc19hdHRlbXB0X3NvdXJjZSk7CgogICAgaWYgKCFyZXQpIHsKICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CiAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICB9CgogICAgICAgIHJjID0gU1FMSVRFX0RFTlk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChQeUxvbmdfQ2hlY2socmV0KSkgewogICAgICAgICAgICByYyA9IChpbnQpUHlMb25nX0FzTG9uZyhyZXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJjID0gU1FMSVRFX0RFTlk7CiAgICAgICAgfQogICAgICAgIFB5X0RFQ1JFRihyZXQpOwogICAgfQoKI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsc3RhdGUpOwojZW5kaWYKICAgIHJldHVybiByYzsKfQoKc3RhdGljIGludCBfcHJvZ3Jlc3NfaGFuZGxlcih2b2lkKiB1c2VyX2FyZykKewogICAgaW50IHJjOwogICAgUHlPYmplY3QgKnJldDsKI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlOwoKICAgIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKI2VuZGlmCiAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0Kil1c2VyX2FyZywgIiIpOwoKICAgIGlmICghcmV0KSB7CiAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgewogICAgICAgICAgICBQeUVycl9QcmludCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgfQoKICAgICAgICAvKiBhYm9ydCBxdWVyeSBpZiBlcnJvciBvY2N1cnJlZCAqLwogICAgICAgIHJjID0gMTsgCiAgICB9IGVsc2UgewogICAgICAgIHJjID0gKGludClQeU9iamVjdF9Jc1RydWUocmV0KTsKICAgICAgICBQeV9ERUNSRUYocmV0KTsKICAgIH0KCiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKI2VuZGlmCiAgICByZXR1cm4gcmM7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9hdXRob3JpemVyKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBQeU9iamVjdCogYXV0aG9yaXplcl9jYjsKCiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJhdXRob3JpemVyX2NhbGxiYWNrIiwgTlVMTCB9OwogICAgaW50IHJjOwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTzpzZXRfYXV0aG9yaXplciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmYXV0aG9yaXplcl9jYikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfc2V0X2F1dGhvcml6ZXIoc2VsZi0+ZGIsIF9hdXRob3JpemVyX2NhbGxiYWNrLCAodm9pZCopYXV0aG9yaXplcl9jYik7CgogICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiRXJyb3Igc2V0dGluZyBhdXRob3JpemVyIGNhbGxiYWNrIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBhdXRob3JpemVyX2NiLCBQeV9Ob25lKTsKCiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgfQp9CgpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfcHJvZ3Jlc3NfaGFuZGxlcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIHByb2dyZXNzX2hhbmRsZXI7CiAgICBpbnQgbjsKCiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJwcm9ncmVzc19oYW5kbGVyIiwgIm4iLCBOVUxMIH07CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPaTpzZXRfcHJvZ3Jlc3NfaGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmcHJvZ3Jlc3NfaGFuZGxlciwgJm4pKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKHByb2dyZXNzX2hhbmRsZXIgPT0gUHlfTm9uZSkgewogICAgICAgIC8qIE5vbmUgY2xlYXJzIHRoZSBwcm9ncmVzcyBoYW5kbGVyIHByZXZpb3VzbHkgc2V0ICovCiAgICAgICAgc3FsaXRlM19wcm9ncmVzc19oYW5kbGVyKHNlbGYtPmRiLCAwLCAwLCAodm9pZCopMCk7CiAgICB9IGVsc2UgewogICAgICAgIHNxbGl0ZTNfcHJvZ3Jlc3NfaGFuZGxlcihzZWxmLT5kYiwgbiwgX3Byb2dyZXNzX2hhbmRsZXIsIHByb2dyZXNzX2hhbmRsZXIpOwogICAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBwcm9ncmVzc19oYW5kbGVyLCBQeV9Ob25lKTsKICAgIH0KCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKaW50IHB5c3FsaXRlX2NoZWNrX3RocmVhZChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKQp7CiNpZmRlZiBXSVRIX1RIUkVBRAogICAgaWYgKHNlbGYtPmNoZWNrX3NhbWVfdGhyZWFkKSB7CiAgICAgICAgaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBzZWxmLT50aHJlYWRfaWRlbnQpIHsKICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICJTUUxpdGUgb2JqZWN0cyBjcmVhdGVkIGluIGEgdGhyZWFkIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhhdCBzYW1lIHRocmVhZC4iCiAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb2JqZWN0IHdhcyBjcmVhdGVkIGluIHRocmVhZCBpZCAlbGQgYW5kIHRoaXMgaXMgdGhyZWFkIGlkICVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnRocmVhZF9pZGVudCwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgIH0KI2VuZGlmCiAgICByZXR1cm4gMTsKfQoKc3RhdGljIFB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2dldF9pc29sYXRpb25fbGV2ZWwocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgdm9pZCogdW51c2VkKQp7CiAgICBQeV9JTkNSRUYoc2VsZi0+aXNvbGF0aW9uX2xldmVsKTsKICAgIHJldHVybiBzZWxmLT5pc29sYXRpb25fbGV2ZWw7Cn0KCnN0YXRpYyBQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9nZXRfdG90YWxfY2hhbmdlcyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCB2b2lkKiB1bnVzZWQpCnsKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHNxbGl0ZTNfdG90YWxfY2hhbmdlcyhzZWxmLT5kYikpOwogICAgfQp9CgpzdGF0aWMgaW50IHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsKQp7CiAgICBQeU9iamVjdCogcmVzOwogICAgUHlPYmplY3QqIGJlZ2luX3N0YXRlbWVudDsKICAgIHN0YXRpYyBQeU9iamVjdCogYmVnaW5fd29yZDsKCiAgICBQeV9YREVDUkVGKHNlbGYtPmlzb2xhdGlvbl9sZXZlbCk7CgogICAgaWYgKHNlbGYtPmJlZ2luX3N0YXRlbWVudCkgewogICAgICAgIFB5TWVtX0ZyZWUoc2VsZi0+YmVnaW5fc3RhdGVtZW50KTsKICAgICAgICBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQgPSBOVUxMOwogICAgfQoKICAgIGlmIChpc29sYXRpb25fbGV2ZWwgPT0gUHlfTm9uZSkgewogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICBzZWxmLT5pc29sYXRpb25fbGV2ZWwgPSBQeV9Ob25lOwoKICAgICAgICByZXMgPSBweXNxbGl0ZV9jb25uZWN0aW9uX2NvbW1pdChzZWxmLCBOVUxMKTsKICAgICAgICBpZiAoIXJlcykgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIFB5X0RFQ1JFRihyZXMpOwoKICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgY2hhciAqc3RhdGVtZW50OwogICAgICAgIFB5X3NzaXplX3Qgc2l6ZTsKCiAgICAgICAgUHlfSU5DUkVGKGlzb2xhdGlvbl9sZXZlbCk7CiAgICAgICAgc2VsZi0+aXNvbGF0aW9uX2xldmVsID0gaXNvbGF0aW9uX2xldmVsOwoKICAgICAgICBpZiAoIWJlZ2luX3dvcmQpIHsKICAgICAgICAgICAgYmVnaW5fd29yZCA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJCRUdJTiAiKTsKICAgICAgICAgICAgaWYgKCFiZWdpbl93b3JkKSByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGJlZ2luX3N0YXRlbWVudCA9IFB5VW5pY29kZV9Db25jYXQoYmVnaW5fd29yZCwgaXNvbGF0aW9uX2xldmVsKTsKICAgICAgICBpZiAoIWJlZ2luX3N0YXRlbWVudCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoKICAgICAgICBzdGF0ZW1lbnQgPSBfUHlVbmljb2RlX0FzU3RyaW5nQW5kU2l6ZShiZWdpbl9zdGF0ZW1lbnQsICZzaXplKTsKICAgICAgICBpZiAoIXN0YXRlbWVudCkgewogICAgICAgICAgICBQeV9ERUNSRUYoYmVnaW5fc3RhdGVtZW50KTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQgPSBQeU1lbV9NYWxsb2Moc2l6ZSArIDIpOwogICAgICAgIGlmICghc2VsZi0+YmVnaW5fc3RhdGVtZW50KSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihiZWdpbl9zdGF0ZW1lbnQpOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoKICAgICAgICBzdHJjcHkoc2VsZi0+YmVnaW5fc3RhdGVtZW50LCBzdGF0ZW1lbnQpOwogICAgICAgIFB5X0RFQ1JFRihiZWdpbl9zdGF0ZW1lbnQpOwogICAgfQoKICAgIHJldHVybiAwOwp9CgpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9jYWxsKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBQeU9iamVjdCogc3FsOwogICAgcHlzcWxpdGVfU3RhdGVtZW50KiBzdGF0ZW1lbnQ7CiAgICBQeU9iamVjdCogd2Vha3JlZjsKICAgIGludCByYzsKCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSB8fCAhcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyIsICZzcWwpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgX3B5c3FsaXRlX2Ryb3BfdW51c2VkX3N0YXRlbWVudF9yZWZlcmVuY2VzKHNlbGYpOwoKICAgIHN0YXRlbWVudCA9IFB5T2JqZWN0X05ldyhweXNxbGl0ZV9TdGF0ZW1lbnQsICZweXNxbGl0ZV9TdGF0ZW1lbnRUeXBlKTsKICAgIGlmICghc3RhdGVtZW50KSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgc3RhdGVtZW50LT5kYiA9IE5VTEw7CiAgICBzdGF0ZW1lbnQtPnN0ID0gTlVMTDsKICAgIHN0YXRlbWVudC0+c3FsID0gTlVMTDsKICAgIHN0YXRlbWVudC0+aW5fdXNlID0gMDsKICAgIHN0YXRlbWVudC0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOwoKICAgIHJjID0gcHlzcWxpdGVfc3RhdGVtZW50X2NyZWF0ZShzdGF0ZW1lbnQsIHNlbGYsIHNxbCk7CgogICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgIGlmIChyYyA9PSBQWVNRTElURV9UT09fTVVDSF9TUUwpIHsKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX1dhcm5pbmcsICJZb3UgY2FuIG9ubHkgZXhlY3V0ZSBvbmUgc3RhdGVtZW50IGF0IGEgdGltZS4iKTsKICAgICAgICB9IGVsc2UgaWYgKHJjID09IFBZU1FMSVRFX1NRTF9XUk9OR19UWVBFKSB7CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9XYXJuaW5nLCAiU1FMIGlzIG9mIHdyb25nIHR5cGUuIE11c3QgYmUgc3RyaW5nIG9yIHVuaWNvZGUuIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KHN0YXRlbWVudCk7CiAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgfQoKICAgICAgICBQeV9DTEVBUihzdGF0ZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgICB3ZWFrcmVmID0gUHlXZWFrcmVmX05ld1JlZigoUHlPYmplY3QqKXN0YXRlbWVudCwgTlVMTCk7CiAgICAgICAgaWYgKCF3ZWFrcmVmKSB7CiAgICAgICAgICAgIFB5X0NMRUFSKHN0YXRlbWVudCk7CiAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgfQoKICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5zdGF0ZW1lbnRzLCB3ZWFrcmVmKSAhPSAwKSB7CiAgICAgICAgICAgIFB5X0NMRUFSKHdlYWtyZWYpOwogICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgIH0KCiAgICAgICAgUHlfREVDUkVGKHdlYWtyZWYpOwogICAgfQoKZXJyb3I6CiAgICByZXR1cm4gKFB5T2JqZWN0KilzdGF0ZW1lbnQ7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2V4ZWN1dGUocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5T2JqZWN0KiBjdXJzb3IgPSAwOwogICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7CiAgICBQeU9iamVjdCogbWV0aG9kID0gMDsKCiAgICBjdXJzb3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgImN1cnNvciIsICIiKTsKICAgIGlmICghY3Vyc29yKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGN1cnNvciwgImV4ZWN1dGUiKTsKICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgUHlfQ0xFQVIoY3Vyc29yKTsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsKICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgUHlfQ0xFQVIoY3Vyc29yKTsKICAgIH0KCmVycm9yOgogICAgUHlfWERFQ1JFRihyZXN1bHQpOwogICAgUHlfWERFQ1JFRihtZXRob2QpOwoKICAgIHJldHVybiBjdXJzb3I7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2V4ZWN1dGVtYW55KHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBQeU9iamVjdCogY3Vyc29yID0gMDsKICAgIFB5T2JqZWN0KiByZXN1bHQgPSAwOwogICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7CgogICAgY3Vyc29yID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QqKXNlbGYsICJjdXJzb3IiLCAiIik7CiAgICBpZiAoIWN1cnNvcikgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjdXJzb3IsICJleGVjdXRlbWFueSIpOwogICAgaWYgKCFtZXRob2QpIHsKICAgICAgICBQeV9DTEVBUihjdXJzb3IpOwogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChtZXRob2QsIGFyZ3MpOwogICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICBQeV9DTEVBUihjdXJzb3IpOwogICAgfQoKZXJyb3I6CiAgICBQeV9YREVDUkVGKHJlc3VsdCk7CiAgICBQeV9YREVDUkVGKG1ldGhvZCk7CgogICAgcmV0dXJuIGN1cnNvcjsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZXNjcmlwdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIGN1cnNvciA9IDA7CiAgICBQeU9iamVjdCogcmVzdWx0ID0gMDsKICAgIFB5T2JqZWN0KiBtZXRob2QgPSAwOwoKICAgIGN1cnNvciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0KilzZWxmLCAiY3Vyc29yIiwgIiIpOwogICAgaWYgKCFjdXJzb3IpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY3Vyc29yLCAiZXhlY3V0ZXNjcmlwdCIpOwogICAgaWYgKCFtZXRob2QpIHsKICAgICAgICBQeV9DTEVBUihjdXJzb3IpOwogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChtZXRob2QsIGFyZ3MpOwogICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICBQeV9DTEVBUihjdXJzb3IpOwogICAgfQoKZXJyb3I6CiAgICBQeV9YREVDUkVGKHJlc3VsdCk7CiAgICBQeV9YREVDUkVGKG1ldGhvZCk7CgogICAgcmV0dXJuIGN1cnNvcjsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT0xMQVRJT04gQ09ERSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyBpbnQKcHlzcWxpdGVfY29sbGF0aW9uX2NhbGxiYWNrKAogICAgICAgIHZvaWQqIGNvbnRleHQsCiAgICAgICAgaW50IHRleHQxX2xlbmd0aCwgY29uc3Qgdm9pZCogdGV4dDFfZGF0YSwKICAgICAgICBpbnQgdGV4dDJfbGVuZ3RoLCBjb25zdCB2b2lkKiB0ZXh0Ml9kYXRhKQp7CiAgICBQeU9iamVjdCogY2FsbGJhY2sgPSAoUHlPYmplY3QqKWNvbnRleHQ7CiAgICBQeU9iamVjdCogc3RyaW5nMSA9IDA7CiAgICBQeU9iamVjdCogc3RyaW5nMiA9IDA7CiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZTsKI2VuZGlmCiAgICBQeU9iamVjdCogcmV0dmFsID0gTlVMTDsKICAgIGludCByZXN1bHQgPSAwOwojaWZkZWYgV0lUSF9USFJFQUQKICAgIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKI2VuZGlmCgogICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgc3RyaW5nMSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciopdGV4dDFfZGF0YSwgdGV4dDFfbGVuZ3RoKTsKICAgIHN0cmluZzIgPSBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIqKXRleHQyX2RhdGEsIHRleHQyX2xlbmd0aCk7CgogICAgaWYgKCFzdHJpbmcxIHx8ICFzdHJpbmcyKSB7CiAgICAgICAgZ290byBmaW5hbGx5OyAvKiBmYWlsZWQgdG8gYWxsb2NhdGUgc3RyaW5ncyAqLwogICAgfQoKICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2FsbGJhY2ssIHN0cmluZzEsIHN0cmluZzIsIE5VTEwpOwoKICAgIGlmICghcmV0dmFsKSB7CiAgICAgICAgLyogZXhlY3V0aW9uIGZhaWxlZCAqLwogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICByZXN1bHQgPSBQeUxvbmdfQXNMb25nKHJldHZhbCk7CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgIHJlc3VsdCA9IDA7CiAgICB9CgpmaW5hbGx5OgogICAgUHlfWERFQ1JFRihzdHJpbmcxKTsKICAgIFB5X1hERUNSRUYoc3RyaW5nMik7CiAgICBQeV9YREVDUkVGKHJldHZhbCk7CiNpZmRlZiBXSVRIX1RIUkVBRAogICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKI2VuZGlmCiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgUHlPYmplY3QgKgpweXNxbGl0ZV9jb25uZWN0aW9uX2ludGVycnVwdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CgogICAgaWYgKCFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgZ290byBmaW5hbGx5OwogICAgfQoKICAgIHNxbGl0ZTNfaW50ZXJydXB0KHNlbGYtPmRiKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR2YWwgPSBQeV9Ob25lOwoKZmluYWxseToKICAgIHJldHVybiByZXR2YWw7Cn0KCi8qIEZ1bmN0aW9uIGF1dGhvcjogUGF1bCBLaXBwZXMgPGtpcHBlc3BAZ21haWwuY29tPgogKiBDbGFzcyBtZXRob2Qgb2YgQ29ubmVjdGlvbiB0byBjYWxsIHRoZSBQeXRob24gZnVuY3Rpb24gX2l0ZXJkdW1wCiAqIG9mIHRoZSBzcWxpdGUzIG1vZHVsZS4KICovCnN0YXRpYyBQeU9iamVjdCAqCnB5c3FsaXRlX2Nvbm5lY3Rpb25faXRlcmR1bXAocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOwogICAgUHlPYmplY3QqIG1vZHVsZSA9IE5VTEw7CiAgICBQeU9iamVjdCogbW9kdWxlX2RpY3Q7CiAgICBQeU9iamVjdCogcHlmbl9pdGVyZHVtcDsKCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKE1PRFVMRV9OQU1FICIuZHVtcCIpOwogICAgaWYgKCFtb2R1bGUpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CgogICAgbW9kdWxlX2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSk7CiAgICBpZiAoIW1vZHVsZV9kaWN0KSB7CiAgICAgICAgZ290byBmaW5hbGx5OwogICAgfQoKICAgIHB5Zm5faXRlcmR1bXAgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIl9pdGVyZHVtcCIpOwogICAgaWYgKCFweWZuX2l0ZXJkdW1wKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJGYWlsZWQgdG8gb2J0YWluIF9pdGVyZHVtcCgpIHJlZmVyZW5jZSIpOwogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBhcmdzID0gUHlUdXBsZV9OZXcoMSk7CiAgICBpZiAoIWFyZ3MpIHsKICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICB9CiAgICBQeV9JTkNSRUYoc2VsZik7CiAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgMCwgKFB5T2JqZWN0KilzZWxmKTsKICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGxPYmplY3QocHlmbl9pdGVyZHVtcCwgYXJncyk7CgpmaW5hbGx5OgogICAgUHlfWERFQ1JFRihhcmdzKTsKICAgIFB5X1hERUNSRUYobW9kdWxlKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyBQeU9iamVjdCAqCnB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIGNhbGxhYmxlOwogICAgUHlPYmplY3QqIHVwcGVyY2FzZV9uYW1lID0gMDsKICAgIFB5T2JqZWN0KiBuYW1lOwogICAgUHlPYmplY3QqIHJldHZhbDsKICAgIFB5X1VOSUNPREUqIGNoazsKICAgIFB5X3NzaXplX3QgaSwgbGVuOwogICAgY2hhciAqdXBwZXJjYXNlX25hbWVfc3RyOwogICAgaW50IHJjOwoKICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CiAgICAgICAgZ290byBmaW5hbGx5OwogICAgfQoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyFPOmNyZWF0ZV9jb2xsYXRpb24obmFtZSwgY2FsbGJhY2spIiwgJlB5VW5pY29kZV9UeXBlLCAmbmFtZSwgJmNhbGxhYmxlKSkgewogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICB1cHBlcmNhc2VfbmFtZSA9IFB5T2JqZWN0X0NhbGxNZXRob2QobmFtZSwgInVwcGVyIiwgIiIpOwogICAgaWYgKCF1cHBlcmNhc2VfbmFtZSkgewogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUodXBwZXJjYXNlX25hbWUpOwogICAgY2hrID0gUHlVbmljb2RlX0FTX1VOSUNPREUodXBwZXJjYXNlX25hbWUpOwogICAgZm9yIChpPTA7IGk8bGVuOyBpKyssIGNoaysrKSB7CiAgICAgICAgaWYgKCgqY2hrID49ICcwJyAmJiAqY2hrIDw9ICc5JykKICAgICAgICAgfHwgKCpjaGsgPj0gJ0EnICYmICpjaGsgPD0gJ1onKQogICAgICAgICB8fCAoKmNoayA9PSAnXycpKQogICAgICAgIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsICJpbnZhbGlkIGNoYXJhY3RlciBpbiBjb2xsYXRpb24gbmFtZSIpOwogICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICAgICAgfQogICAgfQoKICAgIHVwcGVyY2FzZV9uYW1lX3N0ciA9IF9QeVVuaWNvZGVfQXNTdHJpbmcodXBwZXJjYXNlX25hbWUpOwogICAgaWYgKCF1cHBlcmNhc2VfbmFtZV9zdHIpCiAgICAgICAgZ290byBmaW5hbGx5OwoKICAgIGlmIChjYWxsYWJsZSAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKGNhbGxhYmxlKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJwYXJhbWV0ZXIgbXVzdCBiZSBjYWxsYWJsZSIpOwogICAgICAgIGdvdG8gZmluYWxseTsKICAgIH0KCiAgICBpZiAoY2FsbGFibGUgIT0gUHlfTm9uZSkgewogICAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPmNvbGxhdGlvbnMsIHVwcGVyY2FzZV9uYW1lLCBjYWxsYWJsZSk7CiAgICB9IGVsc2UgewogICAgICAgIFB5RGljdF9EZWxJdGVtKHNlbGYtPmNvbGxhdGlvbnMsIHVwcGVyY2FzZV9uYW1lKTsKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfY3JlYXRlX2NvbGxhdGlvbihzZWxmLT5kYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyY2FzZV9uYW1lX3N0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTElURV9VVEY4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGxhYmxlICE9IFB5X05vbmUpID8gY2FsbGFibGUgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGxhYmxlICE9IFB5X05vbmUpID8gcHlzcWxpdGVfY29sbGF0aW9uX2NhbGxiYWNrIDogTlVMTCk7CiAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgUHlEaWN0X0RlbEl0ZW0oc2VsZi0+Y29sbGF0aW9ucywgdXBwZXJjYXNlX25hbWUpOwogICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgZ290byBmaW5hbGx5OwogICAgfQoKZmluYWxseToKICAgIFB5X1hERUNSRUYodXBwZXJjYXNlX25hbWUpOwoKICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgcmV0dmFsID0gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHZhbCA9IFB5X05vbmU7CiAgICB9CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyogQ2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlci4gUmV0dXJucyBpdHNlbGYgYXMgYQogKiBjb252ZW5pZW5jZSB0byB0aGUgY2FsbGVyLiAqLwpzdGF0aWMgUHlPYmplY3QgKgpweXNxbGl0ZV9jb25uZWN0aW9uX2VudGVyKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBQeV9JTkNSRUYoc2VsZik7CiAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOwp9CgovKiogQ2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlci4gSWYgdGhlcmUgd2FzIGFueQogKiBleGNlcHRpb24sIGEgcm9sbGJhY2sgdGFrZXMgcGxhY2U7IG90aGVyd2lzZSB3ZSBjb21taXQuICovCnN0YXRpYyBQeU9iamVjdCAqCnB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhpdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIGV4Y190eXBlLCAqZXhjX3ZhbHVlLCAqZXhjX3RiOwogICAgY2hhciogbWV0aG9kX25hbWU7CiAgICBQeU9iamVjdCogcmVzdWx0OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PIiwgJmV4Y190eXBlLCAmZXhjX3ZhbHVlLCAmZXhjX3RiKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmIChleGNfdHlwZSA9PSBQeV9Ob25lICYmIGV4Y192YWx1ZSA9PSBQeV9Ob25lICYmIGV4Y190YiA9PSBQeV9Ob25lKSB7CiAgICAgICAgbWV0aG9kX25hbWUgPSAiY29tbWl0IjsKICAgIH0gZWxzZSB7CiAgICAgICAgbWV0aG9kX25hbWUgPSAicm9sbGJhY2siOwogICAgfQoKICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0KilzZWxmLCBtZXRob2RfbmFtZSwgIiIpOwogICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIFB5X0RFQ1JFRihyZXN1bHQpOwoKICAgIFB5X1JFVFVSTl9GQUxTRTsKfQoKc3RhdGljIGNoYXIgY29ubmVjdGlvbl9kb2NbXSA9ClB5RG9jX1NUUigiU1FMaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24gb2JqZWN0LiIpOwoKc3RhdGljIFB5R2V0U2V0RGVmIGNvbm5lY3Rpb25fZ2V0c2V0W10gPSB7CiAgICB7Imlzb2xhdGlvbl9sZXZlbCIsICAoZ2V0dGVyKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZ2V0X2lzb2xhdGlvbl9sZXZlbCwgKHNldHRlcilweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWx9LAogICAgeyJ0b3RhbF9jaGFuZ2VzIiwgIChnZXR0ZXIpcHlzcWxpdGVfY29ubmVjdGlvbl9nZXRfdG90YWxfY2hhbmdlcywgKHNldHRlcikwfSwKICAgIHtOVUxMfQp9OwoKc3RhdGljIFB5TWV0aG9kRGVmIGNvbm5lY3Rpb25fbWV0aG9kc1tdID0gewogICAgeyJjdXJzb3IiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9jdXJzb3IsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAogICAgICAgIFB5RG9jX1NUUigiUmV0dXJuIGEgY3Vyc29yIGZvciB0aGUgY29ubmVjdGlvbi4iKX0sCiAgICB7ImNsb3NlIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fY2xvc2UsIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiQ2xvc2VzIHRoZSBjb25uZWN0aW9uLiIpfSwKICAgIHsiY29tbWl0IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fY29tbWl0LCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIkNvbW1pdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4iKX0sCiAgICB7InJvbGxiYWNrIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fcm9sbGJhY2ssIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiUm9sbCBiYWNrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiIpfSwKICAgIHsiY3JlYXRlX2Z1bmN0aW9uIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2Z1bmN0aW9uLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBuZXcgZnVuY3Rpb24uIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7ImNyZWF0ZV9hZ2dyZWdhdGUiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9jcmVhdGVfYWdncmVnYXRlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBuZXcgYWdncmVnYXRlLiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJzZXRfYXV0aG9yaXplciIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9hdXRob3JpemVyLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgICBQeURvY19TVFIoIlNldHMgYXV0aG9yaXplciBjYWxsYmFjay4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsic2V0X3Byb2dyZXNzX2hhbmRsZXIiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfcHJvZ3Jlc3NfaGFuZGxlciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCiAgICAgICAgUHlEb2NfU1RSKCJTZXRzIHByb2dyZXNzIGhhbmRsZXIgY2FsbGJhY2suIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7ImV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9leGVjdXRlLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlcyBhIFNRTCBzdGF0ZW1lbnQuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7ImV4ZWN1dGVtYW55IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZW1hbnksIE1FVEhfVkFSQVJHUywKICAgICAgICBQeURvY19TVFIoIlJlcGVhdGVkbHkgZXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJleGVjdXRlc2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZXNjcmlwdCwgTUVUSF9WQVJBUkdTLAogICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBtdWx0aXBsZSBTUUwgc3RhdGVtZW50cyBhdCBvbmNlLiBOb24tc3RhbmRhcmQuIil9LAogICAgeyJjcmVhdGVfY29sbGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbiwgTUVUSF9WQVJBUkdTLAogICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIGNvbGxhdGlvbiBmdW5jdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsiaW50ZXJydXB0IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25faW50ZXJydXB0LCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIkFib3J0IGFueSBwZW5kaW5nIGRhdGFiYXNlIG9wZXJhdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsiaXRlcmR1bXAiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9pdGVyZHVtcCwgTUVUSF9OT0FSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm5zIGl0ZXJhdG9yIHRvIHRoZSBkdW1wIG9mIHRoZSBkYXRhYmFzZSBpbiBhbiBTUUwgdGV4dCBmb3JtYXQuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2VudGVyLCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIkZvciBjb250ZXh0IG1hbmFnZXIuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7Il9fZXhpdF9fIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhpdCwgTUVUSF9WQVJBUkdTLAogICAgICAgIFB5RG9jX1NUUigiRm9yIGNvbnRleHQgbWFuYWdlci4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHtOVUxMLCBOVUxMfQp9OwoKc3RhdGljIHN0cnVjdCBQeU1lbWJlckRlZiBjb25uZWN0aW9uX21lbWJlcnNbXSA9CnsKICAgIHsiV2FybmluZyIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBXYXJuaW5nKSwgUkVBRE9OTFl9LAogICAgeyJFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBFcnJvciksIFJFQURPTkxZfSwKICAgIHsiSW50ZXJmYWNlRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgSW50ZXJmYWNlRXJyb3IpLCBSRUFET05MWX0sCiAgICB7IkRhdGFiYXNlRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgRGF0YWJhc2VFcnJvciksIFJFQURPTkxZfSwKICAgIHsiRGF0YUVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIERhdGFFcnJvciksIFJFQURPTkxZfSwKICAgIHsiT3BlcmF0aW9uYWxFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBPcGVyYXRpb25hbEVycm9yKSwgUkVBRE9OTFl9LAogICAgeyJJbnRlZ3JpdHlFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBJbnRlZ3JpdHlFcnJvciksIFJFQURPTkxZfSwKICAgIHsiSW50ZXJuYWxFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBJbnRlcm5hbEVycm9yKSwgUkVBRE9OTFl9LAogICAgeyJQcm9ncmFtbWluZ0Vycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIFByb2dyYW1taW5nRXJyb3IpLCBSRUFET05MWX0sCiAgICB7Ik5vdFN1cHBvcnRlZEVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIE5vdFN1cHBvcnRlZEVycm9yKSwgUkVBRE9OTFl9LAogICAgeyJyb3dfZmFjdG9yeSIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCByb3dfZmFjdG9yeSl9LAogICAgeyJ0ZXh0X2ZhY3RvcnkiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgdGV4dF9mYWN0b3J5KX0sCiAgICB7TlVMTH0KfTsKClB5VHlwZU9iamVjdCBweXNxbGl0ZV9Db25uZWN0aW9uVHlwZSA9IHsKICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAgICBNT0RVTEVfTkFNRSAiLkNvbm5lY3Rpb24iLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCiAgICAgICAgc2l6ZW9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24pLCAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAgICAoZGVzdHJ1Y3RvcilweXNxbGl0ZV9jb25uZWN0aW9uX2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3Jlc2VydmVkICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KICAgICAgICAodGVybmFyeWZ1bmMpcHlzcWxpdGVfY29ubmVjdGlvbl9jYWxsLCAgICAgICAgICAvKiB0cF9jYWxsICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgICAgY29ubmVjdGlvbl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KICAgICAgICBjb25uZWN0aW9uX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgICAgY29ubmVjdGlvbl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgICAgIGNvbm5lY3Rpb25fZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwogICAgICAgIChpbml0cHJvYylweXNxbGl0ZV9jb25uZWN0aW9uX2luaXQsICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KfTsKCmV4dGVybiBpbnQgcHlzcWxpdGVfY29ubmVjdGlvbl9zZXR1cF90eXBlcyh2b2lkKQp7CiAgICBweXNxbGl0ZV9Db25uZWN0aW9uVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKICAgIHJldHVybiBQeVR5cGVfUmVhZHkoJnB5c3FsaXRlX0Nvbm5lY3Rpb25UeXBlKTsKfQo=