LyogY29ubmVjdGlvbi5jIC0gdGhlIGNvbm5lY3Rpb24gdHlwZQ0KICoNCiAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4NCiAqDQogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4NCiAqIA0KICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQNCiAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMNCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuDQogKg0KICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0DQogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQogKg0KICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QNCiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlDQogKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUNCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuDQogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQ0KICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLg0KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4NCiAqLw0KDQojaW5jbHVkZSAiY2FjaGUuaCINCiNpbmNsdWRlICJtb2R1bGUuaCINCiNpbmNsdWRlICJjb25uZWN0aW9uLmgiDQojaW5jbHVkZSAic3RhdGVtZW50LmgiDQojaW5jbHVkZSAiY3Vyc29yLmgiDQojaW5jbHVkZSAicHJlcGFyZV9wcm90b2NvbC5oIg0KI2luY2x1ZGUgInV0aWwuaCINCiNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCINCg0KI2luY2x1ZGUgInB5dGhyZWFkLmgiDQoNCiNkZWZpbmUgQUNUSU9OX0ZJTkFMSVpFIDENCiNkZWZpbmUgQUNUSU9OX1JFU0VUIDINCg0KI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAzMDA4DQojaWZuZGVmIFNRTElURV9PTUlUX0xPQURfRVhURU5TSU9ODQojZGVmaW5lIEhBVkVfTE9BRF9FWFRFTlNJT04NCiNlbmRpZg0KI2VuZGlmDQoNCnN0YXRpYyBpbnQgcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfaXNvbGF0aW9uX2xldmVsKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWwpOw0Kc3RhdGljIHZvaWQgX3B5c3FsaXRlX2Ryb3BfdW51c2VkX2N1cnNvcl9yZWZlcmVuY2VzKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpOw0KDQoNCnN0YXRpYyB2b2lkIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihzcWxpdGUzX2NvbnRleHQqIGN0eCwgY29uc3QgY2hhciogZXJybXNnLCBpbnQgbGVuKQ0Kew0KICAgIC8qIGluIG9sZGVyIFNRTGl0ZSB2ZXJzaW9ucywgY2FsbGluZyBzcWxpdGUzX3Jlc3VsdF9lcnJvciBpbiBjYWxsYmFja3MNCiAgICAgKiB0cmlnZ2VycyBhIGJ1ZyBpbiBTUUxpdGUgdGhhdCBsZWFkcyBlaXRoZXIgdG8gaXJyaXRhdGluZyByZXN1bHRzIG9yDQogICAgICogc2VnZmF1bHRzLCBkZXBlbmRpbmcgb24gdGhlIFNRTGl0ZSB2ZXJzaW9uICovDQojaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDMNCiAgICBzcWxpdGUzX3Jlc3VsdF9lcnJvcihjdHgsIGVycm1zZywgbGVuKTsNCiNlbHNlDQogICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsIGVycm1zZyk7DQojZW5kaWYNCn0NCg0KaW50IHB5c3FsaXRlX2Nvbm5lY3Rpb25faW5pdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykNCnsNCiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGFiYXNlIiwgInRpbWVvdXQiLCAiZGV0ZWN0X3R5cGVzIiwgImlzb2xhdGlvbl9sZXZlbCIsICJjaGVja19zYW1lX3RocmVhZCIsICJmYWN0b3J5IiwgImNhY2hlZF9zdGF0ZW1lbnRzIiwgTlVMTCwgTlVMTH07DQoNCiAgICBQeU9iamVjdCogZGF0YWJhc2U7DQogICAgaW50IGRldGVjdF90eXBlcyA9IDA7DQogICAgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCA9IE5VTEw7DQogICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOw0KICAgIGludCBjaGVja19zYW1lX3RocmVhZCA9IDE7DQogICAgaW50IGNhY2hlZF9zdGF0ZW1lbnRzID0gMTAwOw0KICAgIGRvdWJsZSB0aW1lb3V0ID0gNS4wOw0KICAgIGludCByYzsNCiAgICBQeU9iamVjdCogY2xhc3NfYXR0ciA9IE5VTEw7DQogICAgUHlPYmplY3QqIGNsYXNzX2F0dHJfc3RyID0gTlVMTDsNCiAgICBpbnQgaXNfYXBzd19jb25uZWN0aW9uID0gMDsNCiAgICBQeU9iamVjdCogZGF0YWJhc2VfdXRmODsNCg0KICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98ZGlPaU9pIiwga3dsaXN0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhYmFzZSwgJnRpbWVvdXQsICZkZXRlY3RfdHlwZXMsICZpc29sYXRpb25fbGV2ZWwsICZjaGVja19zYW1lX3RocmVhZCwgJmZhY3RvcnksICZjYWNoZWRfc3RhdGVtZW50cykpDQogICAgew0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgc2VsZi0+aW5pdGlhbGl6ZWQgPSAxOw0KDQogICAgc2VsZi0+YmVnaW5fc3RhdGVtZW50ID0gTlVMTDsNCg0KICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZSA9IE5VTEw7DQogICAgc2VsZi0+c3RhdGVtZW50cyA9IE5VTEw7DQogICAgc2VsZi0+Y3Vyc29ycyA9IE5VTEw7DQoNCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7DQogICAgc2VsZi0+cm93X2ZhY3RvcnkgPSBQeV9Ob25lOw0KDQogICAgUHlfSU5DUkVGKCZQeVVuaWNvZGVfVHlwZSk7DQogICAgc2VsZi0+dGV4dF9mYWN0b3J5ID0gKFB5T2JqZWN0KikmUHlVbmljb2RlX1R5cGU7DQoNCiAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGF0YWJhc2UpIHx8IFB5VW5pY29kZV9DaGVjayhkYXRhYmFzZSkpIHsNCiAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGRhdGFiYXNlKSkgew0KICAgICAgICAgICAgZGF0YWJhc2VfdXRmOCA9IGRhdGFiYXNlOw0KICAgICAgICAgICAgUHlfSU5DUkVGKGRhdGFiYXNlX3V0ZjgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZGF0YWJhc2VfdXRmOCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoZGF0YWJhc2UpOw0KICAgICAgICAgICAgaWYgKCFkYXRhYmFzZV91dGY4KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUw0KICAgICAgICByYyA9IHNxbGl0ZTNfb3BlbihQeVN0cmluZ19Bc1N0cmluZyhkYXRhYmFzZV91dGY4KSwgJnNlbGYtPmRiKTsNCiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMNCg0KICAgICAgICBQeV9ERUNSRUYoZGF0YWJhc2VfdXRmOCk7DQoNCiAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgew0KICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsNCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIC8qIENyZWF0ZSBhIHB5c3FsaXRlIGNvbm5lY3Rpb24gZnJvbSBhIEFQU1cgY29ubmVjdGlvbiAqLw0KICAgICAgICBjbGFzc19hdHRyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkYXRhYmFzZSwgIl9fY2xhc3NfXyIpOw0KICAgICAgICBpZiAoY2xhc3NfYXR0cikgew0KICAgICAgICAgICAgY2xhc3NfYXR0cl9zdHIgPSBQeU9iamVjdF9TdHIoY2xhc3NfYXR0cik7DQogICAgICAgICAgICBpZiAoY2xhc3NfYXR0cl9zdHIpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKFB5U3RyaW5nX0FzU3RyaW5nKGNsYXNzX2F0dHJfc3RyKSwgIjx0eXBlICdhcHN3LkNvbm5lY3Rpb24nPiIpID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgLyogSW4gdGhlIEFQU1cgQ29ubmVjdGlvbiBvYmplY3QsIHRoZSBmaXJzdCBlbnRyeSBhZnRlcg0KICAgICAgICAgICAgICAgICAgICAgKiBQeU9iamVjdF9IRUFEIGlzIHRoZSBzcWxpdGUzKiB3ZSB3YW50IHRvIGdldCBob2xkIG9mLg0KICAgICAgICAgICAgICAgICAgICAgKiBMdWNraWx5LCB0aGlzIGlzIHRoZSBzYW1lIGxheW91dCBhcyB3ZSBoYXZlIGluIG91cg0KICAgICAgICAgICAgICAgICAgICAgKiBweXNxbGl0ZV9Db25uZWN0aW9uICovDQogICAgICAgICAgICAgICAgICAgIHNlbGYtPmRiID0gKChweXNxbGl0ZV9Db25uZWN0aW9uKilkYXRhYmFzZSktPmRiOw0KDQogICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihkYXRhYmFzZSk7DQogICAgICAgICAgICAgICAgICAgIHNlbGYtPmFwc3dfY29ubmVjdGlvbiA9IGRhdGFiYXNlOw0KICAgICAgICAgICAgICAgICAgICBpc19hcHN3X2Nvbm5lY3Rpb24gPSAxOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBQeV9YREVDUkVGKGNsYXNzX2F0dHJfc3RyKTsNCiAgICAgICAgUHlfWERFQ1JFRihjbGFzc19hdHRyKTsNCg0KICAgICAgICBpZiAoIWlzX2Fwc3dfY29ubmVjdGlvbikgew0KICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXRhYmFzZSBwYXJhbWV0ZXIgbXVzdCBiZSBzdHJpbmcgb3IgQVBTVyBDb25uZWN0aW9uIG9iamVjdCIpOw0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKCFpc29sYXRpb25fbGV2ZWwpIHsNCiAgICAgICAgaXNvbGF0aW9uX2xldmVsID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7DQogICAgICAgIGlmICghaXNvbGF0aW9uX2xldmVsKSB7DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBQeV9JTkNSRUYoaXNvbGF0aW9uX2xldmVsKTsNCiAgICB9DQogICAgc2VsZi0+aXNvbGF0aW9uX2xldmVsID0gTlVMTDsNCiAgICBweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwoc2VsZiwgaXNvbGF0aW9uX2xldmVsKTsNCiAgICBQeV9ERUNSRUYoaXNvbGF0aW9uX2xldmVsKTsNCg0KICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZSA9IChweXNxbGl0ZV9DYWNoZSopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopJnB5c3FsaXRlX0NhY2hlVHlwZSwgIk9pIiwgc2VsZiwgY2FjaGVkX3N0YXRlbWVudHMpOw0KICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBzZWxmLT5jcmVhdGVkX3N0YXRlbWVudHMgPSAwOw0KICAgIHNlbGYtPmNyZWF0ZWRfY3Vyc29ycyA9IDA7DQoNCiAgICAvKiBDcmVhdGUgbGlzdHMgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHN0YXRlbWVudHMvY3Vyc29ycyAqLw0KICAgIHNlbGYtPnN0YXRlbWVudHMgPSBQeUxpc3RfTmV3KDApOw0KICAgIHNlbGYtPmN1cnNvcnMgPSBQeUxpc3RfTmV3KDApOw0KICAgIGlmICghc2VsZi0+c3RhdGVtZW50cyB8fCAhc2VsZi0+Y3Vyc29ycykgew0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgLyogQnkgZGVmYXVsdCwgdGhlIENhY2hlIGNsYXNzIElOQ1JFRnMgdGhlIGZhY3RvcnkgaW4gaXRzIGluaXRpYWxpemVyLCBhbmQNCiAgICAgKiBkZWNyZWZzIGl0IGluIGl0cyBkZWFsbG9jYXRvciBtZXRob2QuIFNpbmNlIHRoaXMgd291bGQgY3JlYXRlIGEgY2lyY3VsYXINCiAgICAgKiByZWZlcmVuY2UgaGVyZSwgd2UncmUgYnJlYWtpbmcgaXQgYnkgZGVjcmVtZW50aW5nIHNlbGYsIGFuZCB0ZWxsaW5nIHRoZQ0KICAgICAqIGNhY2hlIGNsYXNzIHRvIG5vdCBkZWNyZWYgdGhlIGZhY3RvcnkgKHNlbGYpIGluIGl0cyBkZWFsbG9jYXRvci4NCiAgICAgKi8NCiAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUtPmRlY3JlZl9mYWN0b3J5ID0gMDsNCiAgICBQeV9ERUNSRUYoc2VsZik7DQoNCiAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsNCiAgICBzZWxmLT5kZXRlY3RfdHlwZXMgPSBkZXRlY3RfdHlwZXM7DQogICAgc2VsZi0+dGltZW91dCA9IHRpbWVvdXQ7DQogICAgKHZvaWQpc3FsaXRlM19idXN5X3RpbWVvdXQoc2VsZi0+ZGIsIChpbnQpKHRpbWVvdXQqMTAwMCkpOw0KI2lmZGVmIFdJVEhfVEhSRUFEDQogICAgc2VsZi0+dGhyZWFkX2lkZW50ID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOw0KI2VuZGlmDQogICAgc2VsZi0+Y2hlY2tfc2FtZV90aHJlYWQgPSBjaGVja19zYW1lX3RocmVhZDsNCg0KICAgIHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkID0gUHlEaWN0X05ldygpOw0KICAgIGlmICghc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQpIHsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIHNlbGYtPmNvbGxhdGlvbnMgPSBQeURpY3RfTmV3KCk7DQogICAgaWYgKCFzZWxmLT5jb2xsYXRpb25zKSB7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBzZWxmLT5XYXJuaW5nICAgICAgICAgICAgICAgPSBweXNxbGl0ZV9XYXJuaW5nOw0KICAgIHNlbGYtPkVycm9yICAgICAgICAgICAgICAgICA9IHB5c3FsaXRlX0Vycm9yOw0KICAgIHNlbGYtPkludGVyZmFjZUVycm9yICAgICAgICA9IHB5c3FsaXRlX0ludGVyZmFjZUVycm9yOw0KICAgIHNlbGYtPkRhdGFiYXNlRXJyb3IgICAgICAgICA9IHB5c3FsaXRlX0RhdGFiYXNlRXJyb3I7DQogICAgc2VsZi0+RGF0YUVycm9yICAgICAgICAgICAgID0gcHlzcWxpdGVfRGF0YUVycm9yOw0KICAgIHNlbGYtPk9wZXJhdGlvbmFsRXJyb3IgICAgICA9IHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3I7DQogICAgc2VsZi0+SW50ZWdyaXR5RXJyb3IgICAgICAgID0gcHlzcWxpdGVfSW50ZWdyaXR5RXJyb3I7DQogICAgc2VsZi0+SW50ZXJuYWxFcnJvciAgICAgICAgID0gcHlzcWxpdGVfSW50ZXJuYWxFcnJvcjsNCiAgICBzZWxmLT5Qcm9ncmFtbWluZ0Vycm9yICAgICAgPSBweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yOw0KICAgIHNlbGYtPk5vdFN1cHBvcnRlZEVycm9yICAgICA9IHB5c3FsaXRlX05vdFN1cHBvcnRlZEVycm9yOw0KDQogICAgcmV0dXJuIDA7DQp9DQoNCi8qIEVtcHR5IHRoZSBlbnRpcmUgc3RhdGVtZW50IGNhY2hlIG9mIHRoaXMgY29ubmVjdGlvbiAqLw0Kdm9pZCBweXNxbGl0ZV9mbHVzaF9zdGF0ZW1lbnRfY2FjaGUocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikNCnsNCiAgICBweXNxbGl0ZV9Ob2RlKiBub2RlOw0KICAgIHB5c3FsaXRlX1N0YXRlbWVudCogc3RhdGVtZW50Ow0KDQogICAgbm9kZSA9IHNlbGYtPnN0YXRlbWVudF9jYWNoZS0+Zmlyc3Q7DQoNCiAgICB3aGlsZSAobm9kZSkgew0KICAgICAgICBzdGF0ZW1lbnQgPSAocHlzcWxpdGVfU3RhdGVtZW50Kikobm9kZS0+ZGF0YSk7DQogICAgICAgICh2b2lkKXB5c3FsaXRlX3N0YXRlbWVudF9maW5hbGl6ZShzdGF0ZW1lbnQpOw0KICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsNCiAgICB9DQoNCiAgICBQeV9ERUNSRUYoc2VsZi0+c3RhdGVtZW50X2NhY2hlKTsNCiAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUgPSAocHlzcWxpdGVfQ2FjaGUqKVB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSZweXNxbGl0ZV9DYWNoZVR5cGUsICJPIiwgc2VsZik7DQogICAgUHlfREVDUkVGKHNlbGYpOw0KICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZS0+ZGVjcmVmX2ZhY3RvcnkgPSAwOw0KfQ0KDQovKiBhY3Rpb24gaW4gKEFDVElPTl9SRVNFVCwgQUNUSU9OX0ZJTkFMSVpFKSAqLw0Kdm9pZCBweXNxbGl0ZV9kb19hbGxfc3RhdGVtZW50cyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBpbnQgYWN0aW9uLCBpbnQgcmVzZXRfY3Vyc29ycykNCnsNCiAgICBpbnQgaTsNCiAgICBQeU9iamVjdCogd2Vha3JlZjsNCiAgICBQeU9iamVjdCogc3RhdGVtZW50Ow0KICAgIHB5c3FsaXRlX0N1cnNvciogY3Vyc29yOw0KDQogICAgZm9yIChpID0gMDsgaSA8IFB5TGlzdF9TaXplKHNlbGYtPnN0YXRlbWVudHMpOyBpKyspIHsNCiAgICAgICAgd2Vha3JlZiA9IFB5TGlzdF9HZXRJdGVtKHNlbGYtPnN0YXRlbWVudHMsIGkpOw0KICAgICAgICBzdGF0ZW1lbnQgPSBQeVdlYWtyZWZfR2V0T2JqZWN0KHdlYWtyZWYpOw0KICAgICAgICBpZiAoc3RhdGVtZW50ICE9IFB5X05vbmUpIHsNCiAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gQUNUSU9OX1JFU0VUKSB7DQogICAgICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KChweXNxbGl0ZV9TdGF0ZW1lbnQqKXN0YXRlbWVudCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICh2b2lkKXB5c3FsaXRlX3N0YXRlbWVudF9maW5hbGl6ZSgocHlzcWxpdGVfU3RhdGVtZW50KilzdGF0ZW1lbnQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKHJlc2V0X2N1cnNvcnMpIHsNCiAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5TGlzdF9TaXplKHNlbGYtPmN1cnNvcnMpOyBpKyspIHsNCiAgICAgICAgICAgIHdlYWtyZWYgPSBQeUxpc3RfR2V0SXRlbShzZWxmLT5jdXJzb3JzLCBpKTsNCiAgICAgICAgICAgIGN1cnNvciA9IChweXNxbGl0ZV9DdXJzb3IqKVB5V2Vha3JlZl9HZXRPYmplY3Qod2Vha3JlZik7DQogICAgICAgICAgICBpZiAoKFB5T2JqZWN0KiljdXJzb3IgIT0gUHlfTm9uZSkgew0KICAgICAgICAgICAgICAgIGN1cnNvci0+cmVzZXQgPSAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQp2b2lkIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZGVhbGxvYyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKQ0Kew0KICAgIFB5T2JqZWN0KiByZXQgPSBOVUxMOw0KDQogICAgUHlfWERFQ1JFRihzZWxmLT5zdGF0ZW1lbnRfY2FjaGUpOw0KDQogICAgLyogQ2xlYW4gdXAgaWYgdXNlciBoYXMgbm90IGNhbGxlZCAuY2xvc2UoKSBleHBsaWNpdGx5LiAqLw0KICAgIGlmIChzZWxmLT5kYikgew0KICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTDQogICAgICAgIHNxbGl0ZTNfY2xvc2Uoc2VsZi0+ZGIpOw0KICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUw0KICAgIH0gZWxzZSBpZiAoc2VsZi0+YXBzd19jb25uZWN0aW9uKSB7DQogICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+YXBzd19jb25uZWN0aW9uLCAiY2xvc2UiLCAiIik7DQogICAgICAgIFB5X1hERUNSRUYocmV0KTsNCiAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5hcHN3X2Nvbm5lY3Rpb24pOw0KICAgIH0NCg0KICAgIGlmIChzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpIHsNCiAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpOw0KICAgIH0NCiAgICBQeV9YREVDUkVGKHNlbGYtPmlzb2xhdGlvbl9sZXZlbCk7DQogICAgUHlfWERFQ1JFRihzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCk7DQogICAgUHlfWERFQ1JFRihzZWxmLT5yb3dfZmFjdG9yeSk7DQogICAgUHlfWERFQ1JFRihzZWxmLT50ZXh0X2ZhY3RvcnkpOw0KICAgIFB5X1hERUNSRUYoc2VsZi0+Y29sbGF0aW9ucyk7DQogICAgUHlfWERFQ1JFRihzZWxmLT5zdGF0ZW1lbnRzKTsNCiAgICBQeV9YREVDUkVGKHNlbGYtPmN1cnNvcnMpOw0KDQogICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOw0KfQ0KDQovKg0KICogUmVnaXN0ZXJzIGEgY3Vyc29yIHdpdGggdGhlIGNvbm5lY3Rpb24uDQogKg0KICogMCA9PiBlcnJvcjsgMSA9PiBvaw0KICovDQppbnQgcHlzcWxpdGVfY29ubmVjdGlvbl9yZWdpc3Rlcl9jdXJzb3IocHlzcWxpdGVfQ29ubmVjdGlvbiogY29ubmVjdGlvbiwgUHlPYmplY3QqIGN1cnNvcikNCnsNCiAgICBQeU9iamVjdCogd2Vha3JlZjsNCg0KICAgIHdlYWtyZWYgPSBQeVdlYWtyZWZfTmV3UmVmKChQeU9iamVjdCopY3Vyc29yLCBOVUxMKTsNCiAgICBpZiAoIXdlYWtyZWYpIHsNCiAgICAgICAgZ290byBlcnJvcjsNCiAgICB9DQoNCiAgICBpZiAoUHlMaXN0X0FwcGVuZChjb25uZWN0aW9uLT5jdXJzb3JzLCB3ZWFrcmVmKSAhPSAwKSB7DQogICAgICAgIFB5X0NMRUFSKHdlYWtyZWYpOw0KICAgICAgICBnb3RvIGVycm9yOw0KICAgIH0NCg0KICAgIFB5X0RFQ1JFRih3ZWFrcmVmKTsNCg0KICAgIHJldHVybiAxOw0KZXJyb3I6DQogICAgcmV0dXJuIDA7DQp9DQoNClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2N1cnNvcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykNCnsNCiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZhY3RvcnkiLCBOVUxMLCBOVUxMfTsNCiAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7DQogICAgUHlPYmplY3QqIGN1cnNvcjsNCg0KICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPIiwga3dsaXN0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWN0b3J5KSkgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSB8fCAhcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBpZiAoZmFjdG9yeSA9PSBOVUxMKSB7DQogICAgICAgIGZhY3RvcnkgPSAoUHlPYmplY3QqKSZweXNxbGl0ZV9DdXJzb3JUeXBlOw0KICAgIH0NCg0KICAgIGN1cnNvciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmYWN0b3J5LCAiTyIsIHNlbGYpOw0KDQogICAgX3B5c3FsaXRlX2Ryb3BfdW51c2VkX2N1cnNvcl9yZWZlcmVuY2VzKHNlbGYpOw0KDQogICAgaWYgKGN1cnNvciAmJiBzZWxmLT5yb3dfZmFjdG9yeSAhPSBQeV9Ob25lKSB7DQogICAgICAgIFB5X1hERUNSRUYoKChweXNxbGl0ZV9DdXJzb3IqKWN1cnNvciktPnJvd19mYWN0b3J5KTsNCiAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnJvd19mYWN0b3J5KTsNCiAgICAgICAgKChweXNxbGl0ZV9DdXJzb3IqKWN1cnNvciktPnJvd19mYWN0b3J5ID0gc2VsZi0+cm93X2ZhY3Rvcnk7DQogICAgfQ0KDQogICAgcmV0dXJuIGN1cnNvcjsNCn0NCg0KUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY2xvc2UocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpDQp7DQogICAgUHlPYmplY3QqIHJldDsNCiAgICBpbnQgcmM7DQoNCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSkgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBweXNxbGl0ZV9kb19hbGxfc3RhdGVtZW50cyhzZWxmLCBBQ1RJT05fRklOQUxJWkUsIDEpOw0KDQogICAgaWYgKHNlbGYtPmRiKSB7DQogICAgICAgIGlmIChzZWxmLT5hcHN3X2Nvbm5lY3Rpb24pIHsNCiAgICAgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+YXBzd19jb25uZWN0aW9uLCAiY2xvc2UiLCAiIik7DQogICAgICAgICAgICBQeV9YREVDUkVGKHJldCk7DQogICAgICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmFwc3dfY29ubmVjdGlvbik7DQogICAgICAgICAgICBzZWxmLT5hcHN3X2Nvbm5lY3Rpb24gPSBOVUxMOw0KICAgICAgICAgICAgc2VsZi0+ZGIgPSBOVUxMOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUw0KICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2Nsb3NlKHNlbGYtPmRiKTsNCiAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTDQoNCiAgICAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsNCiAgICAgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOw0KICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBzZWxmLT5kYiA9IE5VTEw7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7DQogICAgcmV0dXJuIFB5X05vbmU7DQp9DQoNCi8qDQogKiBDaGVja3MgaWYgYSBjb25uZWN0aW9uIG9iamVjdCBpcyB1c2FibGUgKGkuIGUuIG5vdCBjbG9zZWQpLg0KICoNCiAqIDAgPT4gZXJyb3I7IDEgPT4gb2sNCiAqLw0KaW50IHB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24ocHlzcWxpdGVfQ29ubmVjdGlvbiogY29uKQ0Kew0KICAgIGlmICghY29uLT5pbml0aWFsaXplZCkgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIkJhc2UgQ29ubmVjdGlvbi5fX2luaXRfXyBub3QgY2FsbGVkLiIpOw0KICAgICAgICByZXR1cm4gMDsNCiAgICB9DQoNCiAgICBpZiAoIWNvbi0+ZGIpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsICJDYW5ub3Qgb3BlcmF0ZSBvbiBhIGNsb3NlZCBkYXRhYmFzZS4iKTsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIDE7DQogICAgfQ0KfQ0KDQpQeU9iamVjdCogX3B5c3FsaXRlX2Nvbm5lY3Rpb25fYmVnaW4ocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikNCnsNCiAgICBpbnQgcmM7DQogICAgY29uc3QgY2hhciogdGFpbDsNCiAgICBzcWxpdGUzX3N0bXQqIHN0YXRlbWVudDsNCg0KICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMNCiAgICByYyA9IHNxbGl0ZTNfcHJlcGFyZShzZWxmLT5kYiwgc2VsZi0+YmVnaW5fc3RhdGVtZW50LCAtMSwgJnN0YXRlbWVudCwgJnRhaWwpOw0KICAgIFB5X0VORF9BTExPV19USFJFQURTDQoNCiAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7DQogICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgc3RhdGVtZW50KTsNCiAgICAgICAgZ290byBlcnJvcjsNCiAgICB9DQoNCiAgICByYyA9IHB5c3FsaXRlX3N0ZXAoc3RhdGVtZW50LCBzZWxmKTsNCiAgICBpZiAocmMgPT0gU1FMSVRFX0RPTkUpIHsNCiAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDE7DQogICAgfSBlbHNlIHsNCiAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBzdGF0ZW1lbnQpOw0KICAgIH0NCg0KICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMNCiAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsNCiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUw0KDQogICAgaWYgKHJjICE9IFNRTElURV9PSyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgew0KICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOw0KICAgIH0NCg0KZXJyb3I6DQogICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfSBlbHNlIHsNCiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOw0KICAgICAgICByZXR1cm4gUHlfTm9uZTsNCiAgICB9DQp9DQoNClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2NvbW1pdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykNCnsNCiAgICBpbnQgcmM7DQogICAgY29uc3QgY2hhciogdGFpbDsNCiAgICBzcWxpdGUzX3N0bXQqIHN0YXRlbWVudDsNCg0KICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIGlmIChzZWxmLT5pblRyYW5zYWN0aW9uKSB7DQogICAgICAgIHB5c3FsaXRlX2RvX2FsbF9zdGF0ZW1lbnRzKHNlbGYsIEFDVElPTl9SRVNFVCwgMCk7DQoNCiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUw0KICAgICAgICByYyA9IHNxbGl0ZTNfcHJlcGFyZShzZWxmLT5kYiwgIkNPTU1JVCIsIC0xLCAmc3RhdGVtZW50LCAmdGFpbCk7DQogICAgICAgIFB5X0VORF9BTExPV19USFJFQURTDQogICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsNCiAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7DQogICAgICAgICAgICBnb3RvIGVycm9yOw0KICAgICAgICB9DQoNCiAgICAgICAgcmMgPSBweXNxbGl0ZV9zdGVwKHN0YXRlbWVudCwgc2VsZik7DQogICAgICAgIGlmIChyYyA9PSBTUUxJVEVfRE9ORSkgew0KICAgICAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDA7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7DQogICAgICAgIH0NCg0KICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTDQogICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOw0KICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUw0KICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LICYmICFQeUVycl9PY2N1cnJlZCgpKSB7DQogICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOw0KICAgICAgICB9DQoNCiAgICB9DQoNCmVycm9yOg0KICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0gZWxzZSB7DQogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsNCiAgICAgICAgcmV0dXJuIFB5X05vbmU7DQogICAgfQ0KfQ0KDQpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9yb2xsYmFjayhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykNCnsNCiAgICBpbnQgcmM7DQogICAgY29uc3QgY2hhciogdGFpbDsNCiAgICBzcWxpdGUzX3N0bXQqIHN0YXRlbWVudDsNCg0KICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIGlmIChzZWxmLT5pblRyYW5zYWN0aW9uKSB7DQogICAgICAgIHB5c3FsaXRlX2RvX2FsbF9zdGF0ZW1lbnRzKHNlbGYsIEFDVElPTl9SRVNFVCwgMSk7DQoNCiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUw0KICAgICAgICByYyA9IHNxbGl0ZTNfcHJlcGFyZShzZWxmLT5kYiwgIlJPTExCQUNLIiwgLTEsICZzdGF0ZW1lbnQsICZ0YWlsKTsNCiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMNCiAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgew0KICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsNCiAgICAgICAgICAgIGdvdG8gZXJyb3I7DQogICAgICAgIH0NCg0KICAgICAgICByYyA9IHB5c3FsaXRlX3N0ZXAoc3RhdGVtZW50LCBzZWxmKTsNCiAgICAgICAgaWYgKHJjID09IFNRTElURV9ET05FKSB7DQogICAgICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgc3RhdGVtZW50KTsNCiAgICAgICAgfQ0KDQogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMNCiAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7DQogICAgICAgIFB5X0VORF9BTExPV19USFJFQURTDQogICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsNCiAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7DQogICAgICAgIH0NCg0KICAgIH0NCg0KZXJyb3I6DQogICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfSBlbHNlIHsNCiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOw0KICAgICAgICByZXR1cm4gUHlfTm9uZTsNCiAgICB9DQp9DQoNCnZvaWQgX3B5c3FsaXRlX3NldF9yZXN1bHQoc3FsaXRlM19jb250ZXh0KiBjb250ZXh0LCBQeU9iamVjdCogcHlfdmFsKQ0Kew0KICAgIGxvbmcgbG9uZ3ZhbDsNCiAgICBjb25zdCBjaGFyKiBidWZmZXI7DQogICAgUHlfc3NpemVfdCBidWZsZW47DQogICAgUHlPYmplY3QqIHN0cmluZ3ZhbDsNCg0KICAgIGlmICgoIXB5X3ZhbCkgfHwgUHlFcnJfT2NjdXJyZWQoKSkgew0KICAgICAgICBzcWxpdGUzX3Jlc3VsdF9udWxsKGNvbnRleHQpOw0KICAgIH0gZWxzZSBpZiAocHlfdmFsID09IFB5X05vbmUpIHsNCiAgICAgICAgc3FsaXRlM19yZXN1bHRfbnVsbChjb250ZXh0KTsNCiAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHB5X3ZhbCkpIHsNCiAgICAgICAgbG9uZ3ZhbCA9IFB5SW50X0FzTG9uZyhweV92YWwpOw0KICAgICAgICBzcWxpdGUzX3Jlc3VsdF9pbnQ2NChjb250ZXh0LCAoUFlfTE9OR19MT05HKWxvbmd2YWwpOw0KICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhweV92YWwpKSB7DQogICAgICAgIHNxbGl0ZTNfcmVzdWx0X2RvdWJsZShjb250ZXh0LCBQeUZsb2F0X0FzRG91YmxlKHB5X3ZhbCkpOw0KICAgIH0gZWxzZSBpZiAoUHlCdWZmZXJfQ2hlY2socHlfdmFsKSkgew0KICAgICAgICBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHB5X3ZhbCwgJmJ1ZmZlciwgJmJ1ZmxlbikgIT0gMCkgew0KICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJjb3VsZCBub3QgY29udmVydCBCTE9CIHRvIGJ1ZmZlciIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgc3FsaXRlM19yZXN1bHRfYmxvYihjb250ZXh0LCBidWZmZXIsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7DQogICAgICAgIH0NCiAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHB5X3ZhbCkpIHsNCiAgICAgICAgc3FsaXRlM19yZXN1bHRfdGV4dChjb250ZXh0LCBQeVN0cmluZ19Bc1N0cmluZyhweV92YWwpLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7DQogICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2socHlfdmFsKSkgew0KICAgICAgICBzdHJpbmd2YWwgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHB5X3ZhbCk7DQogICAgICAgIGlmIChzdHJpbmd2YWwpIHsNCiAgICAgICAgICAgIHNxbGl0ZTNfcmVzdWx0X3RleHQoY29udGV4dCwgUHlTdHJpbmdfQXNTdHJpbmcoc3RyaW5ndmFsKSwgLTEsIFNRTElURV9UUkFOU0lFTlQpOw0KICAgICAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICAvKiBUT0RPOiByYWlzZSBlcnJvciAqLw0KICAgIH0NCn0NCg0KUHlPYmplY3QqIF9weXNxbGl0ZV9idWlsZF9weV9wYXJhbXMoc3FsaXRlM19jb250ZXh0ICpjb250ZXh0LCBpbnQgYXJnYywgc3FsaXRlM192YWx1ZSoqIGFyZ3YpDQp7DQogICAgUHlPYmplY3QqIGFyZ3M7DQogICAgaW50IGk7DQogICAgc3FsaXRlM192YWx1ZSogY3VyX3ZhbHVlOw0KICAgIFB5T2JqZWN0KiBjdXJfcHlfdmFsdWU7DQogICAgY29uc3QgY2hhciogdmFsX3N0cjsNCiAgICBQWV9MT05HX0xPTkcgdmFsX2ludDsNCiAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsNCiAgICB2b2lkKiByYXdfYnVmZmVyOw0KDQogICAgYXJncyA9IFB5VHVwbGVfTmV3KGFyZ2MpOw0KICAgIGlmICghYXJncykgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQogICAgICAgIGN1cl92YWx1ZSA9IGFyZ3ZbaV07DQogICAgICAgIHN3aXRjaCAoc3FsaXRlM192YWx1ZV90eXBlKGFyZ3ZbaV0pKSB7DQogICAgICAgICAgICBjYXNlIFNRTElURV9JTlRFR0VSOg0KICAgICAgICAgICAgICAgIHZhbF9pbnQgPSBzcWxpdGUzX3ZhbHVlX2ludDY0KGN1cl92YWx1ZSk7DQogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdmFsX2ludCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIFNRTElURV9GTE9BVDoNCiAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeUZsb2F0X0Zyb21Eb3VibGUoc3FsaXRlM192YWx1ZV9kb3VibGUoY3VyX3ZhbHVlKSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIFNRTElURV9URVhUOg0KICAgICAgICAgICAgICAgIHZhbF9zdHIgPSAoY29uc3QgY2hhciopc3FsaXRlM192YWx1ZV90ZXh0KGN1cl92YWx1ZSk7DQogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlVbmljb2RlX0RlY29kZVVURjgodmFsX3N0ciwgc3RybGVuKHZhbF9zdHIpLCBOVUxMKTsNCiAgICAgICAgICAgICAgICAvKiBUT0RPOiBoYXZlIGEgd2F5IHRvIHNob3cgZXJyb3JzIGhlcmUgKi8NCiAgICAgICAgICAgICAgICBpZiAoIWN1cl9weV92YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOw0KICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7DQogICAgICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5X05vbmU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSBTUUxJVEVfQkxPQjoNCiAgICAgICAgICAgICAgICBidWZsZW4gPSBzcWxpdGUzX3ZhbHVlX2J5dGVzKGN1cl92YWx1ZSk7DQogICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlCdWZmZXJfTmV3KGJ1Zmxlbik7DQogICAgICAgICAgICAgICAgaWYgKCFjdXJfcHlfdmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKGN1cl9weV92YWx1ZSwgJnJhd19idWZmZXIsICZidWZsZW4pKSB7DQogICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJfcHlfdmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBOVUxMOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbWVtY3B5KHJhd19idWZmZXIsIHNxbGl0ZTNfdmFsdWVfYmxvYihjdXJfdmFsdWUpLCBidWZsZW4pOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSBTUUxJVEVfTlVMTDoNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOw0KICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5X05vbmU7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWN1cl9weV92YWx1ZSkgew0KICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOw0KICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgICAgIH0NCg0KICAgICAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgaSwgY3VyX3B5X3ZhbHVlKTsNCg0KICAgIH0NCg0KICAgIHJldHVybiBhcmdzOw0KfQ0KDQp2b2lkIF9weXNxbGl0ZV9mdW5jX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCogY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUqKiBhcmd2KQ0Kew0KICAgIFB5T2JqZWN0KiBhcmdzOw0KICAgIFB5T2JqZWN0KiBweV9mdW5jOw0KICAgIFB5T2JqZWN0KiBweV9yZXR2YWwgPSBOVUxMOw0KDQojaWZkZWYgV0lUSF9USFJFQUQNCiAgICBQeUdJTFN0YXRlX1NUQVRFIHRocmVhZHN0YXRlOw0KDQogICAgdGhyZWFkc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOw0KI2VuZGlmDQoNCiAgICBweV9mdW5jID0gKFB5T2JqZWN0KilzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsNCg0KICAgIGFyZ3MgPSBfcHlzcWxpdGVfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIGFyZ3YpOw0KICAgIGlmIChhcmdzKSB7DQogICAgICAgIHB5X3JldHZhbCA9IFB5T2JqZWN0X0NhbGxPYmplY3QocHlfZnVuYywgYXJncyk7DQogICAgICAgIFB5X0RFQ1JFRihhcmdzKTsNCiAgICB9DQoNCiAgICBpZiAocHlfcmV0dmFsKSB7DQogICAgICAgIF9weXNxbGl0ZV9zZXRfcmVzdWx0KGNvbnRleHQsIHB5X3JldHZhbCk7DQogICAgICAgIFB5X0RFQ1JFRihweV9yZXR2YWwpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsNCiAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBQeUVycl9DbGVhcigpOw0KICAgICAgICB9DQogICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGZ1bmN0aW9uIHJhaXNlZCBleGNlcHRpb24iLCAtMSk7DQogICAgfQ0KDQojaWZkZWYgV0lUSF9USFJFQUQNCiAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOw0KI2VuZGlmDQp9DQoNCnN0YXRpYyB2b2lkIF9weXNxbGl0ZV9zdGVwX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCAqY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUqKiBwYXJhbXMpDQp7DQogICAgUHlPYmplY3QqIGFyZ3M7DQogICAgUHlPYmplY3QqIGZ1bmN0aW9uX3Jlc3VsdCA9IE5VTEw7DQogICAgUHlPYmplY3QqIGFnZ3JlZ2F0ZV9jbGFzczsNCiAgICBQeU9iamVjdCoqIGFnZ3JlZ2F0ZV9pbnN0YW5jZTsNCiAgICBQeU9iamVjdCogc3RlcG1ldGhvZCA9IE5VTEw7DQoNCiNpZmRlZiBXSVRIX1RIUkVBRA0KICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7DQoNCiAgICB0aHJlYWRzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7DQojZW5kaWYNCg0KICAgIGFnZ3JlZ2F0ZV9jbGFzcyA9IChQeU9iamVjdCopc3FsaXRlM191c2VyX2RhdGEoY29udGV4dCk7DQoNCiAgICBhZ2dyZWdhdGVfaW5zdGFuY2UgPSAoUHlPYmplY3QqKilzcWxpdGUzX2FnZ3JlZ2F0ZV9jb250ZXh0KGNvbnRleHQsIHNpemVvZihQeU9iamVjdCopKTsNCg0KICAgIGlmICgqYWdncmVnYXRlX2luc3RhbmNlID09IDApIHsNCiAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihhZ2dyZWdhdGVfY2xhc3MsICIiKTsNCg0KICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgew0KICAgICAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IDA7DQogICAgICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7DQogICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdfX2luaXRfXycgbWV0aG9kIHJhaXNlZCBlcnJvciIsIC0xKTsNCiAgICAgICAgICAgIGdvdG8gZXJyb3I7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBzdGVwbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygqYWdncmVnYXRlX2luc3RhbmNlLCAic3RlcCIpOw0KICAgIGlmICghc3RlcG1ldGhvZCkgew0KICAgICAgICBnb3RvIGVycm9yOw0KICAgIH0NCg0KICAgIGFyZ3MgPSBfcHlzcWxpdGVfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIHBhcmFtcyk7DQogICAgaWYgKCFhcmdzKSB7DQogICAgICAgIGdvdG8gZXJyb3I7DQogICAgfQ0KDQogICAgZnVuY3Rpb25fcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChzdGVwbWV0aG9kLCBhcmdzKTsNCiAgICBQeV9ERUNSRUYoYXJncyk7DQoNCiAgICBpZiAoIWZ1bmN0aW9uX3Jlc3VsdCkgew0KICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7DQogICAgICAgICAgICBQeUVycl9QcmludCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsNCiAgICAgICAgfQ0KICAgICAgICBfc3FsaXRlM19yZXN1bHRfZXJyb3IoY29udGV4dCwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnc3RlcCcgbWV0aG9kIHJhaXNlZCBlcnJvciIsIC0xKTsNCiAgICB9DQoNCmVycm9yOg0KICAgIFB5X1hERUNSRUYoc3RlcG1ldGhvZCk7DQogICAgUHlfWERFQ1JFRihmdW5jdGlvbl9yZXN1bHQpOw0KDQojaWZkZWYgV0lUSF9USFJFQUQNCiAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOw0KI2VuZGlmDQp9DQoNCnZvaWQgX3B5c3FsaXRlX2ZpbmFsX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCogY29udGV4dCkNCnsNCiAgICBQeU9iamVjdCogZnVuY3Rpb25fcmVzdWx0ID0gTlVMTDsNCiAgICBQeU9iamVjdCoqIGFnZ3JlZ2F0ZV9pbnN0YW5jZTsNCg0KI2lmZGVmIFdJVEhfVEhSRUFEDQogICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsNCg0KICAgIHRocmVhZHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsNCiNlbmRpZg0KDQogICAgYWdncmVnYXRlX2luc3RhbmNlID0gKFB5T2JqZWN0Kiopc3FsaXRlM19hZ2dyZWdhdGVfY29udGV4dChjb250ZXh0LCBzaXplb2YoUHlPYmplY3QqKSk7DQogICAgaWYgKCEqYWdncmVnYXRlX2luc3RhbmNlKSB7DQogICAgICAgIC8qIHRoaXMgYnJhbmNoIGlzIGV4ZWN1dGVkIGlmIHRoZXJlIHdhcyBhbiBleGNlcHRpb24gaW4gdGhlIGFnZ3JlZ2F0ZSdzDQogICAgICAgICAqIF9faW5pdF9fICovDQoNCiAgICAgICAgZ290byBlcnJvcjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKCphZ2dyZWdhdGVfaW5zdGFuY2UsICJmaW5hbGl6ZSIsICIiKTsNCiAgICBpZiAoIWZ1bmN0aW9uX3Jlc3VsdCkgew0KICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7DQogICAgICAgICAgICBQeUVycl9QcmludCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsNCiAgICAgICAgfQ0KICAgICAgICBfc3FsaXRlM19yZXN1bHRfZXJyb3IoY29udGV4dCwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiLCAtMSk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgX3B5c3FsaXRlX3NldF9yZXN1bHQoY29udGV4dCwgZnVuY3Rpb25fcmVzdWx0KTsNCiAgICB9DQoNCmVycm9yOg0KICAgIFB5X1hERUNSRUYoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSk7DQogICAgUHlfWERFQ1JFRihmdW5jdGlvbl9yZXN1bHQpOw0KDQojaWZkZWYgV0lUSF9USFJFQUQNCiAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOw0KI2VuZGlmDQp9DQoNCnN0YXRpYyB2b2lkIF9weXNxbGl0ZV9kcm9wX3VudXNlZF9zdGF0ZW1lbnRfcmVmZXJlbmNlcyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKQ0Kew0KICAgIFB5T2JqZWN0KiBuZXdfbGlzdDsNCiAgICBQeU9iamVjdCogd2Vha3JlZjsNCiAgICBpbnQgaTsNCg0KICAgIC8qIHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UgaW4gYSB3aGlsZSAqLw0KICAgIGlmIChzZWxmLT5jcmVhdGVkX3N0YXRlbWVudHMrKyA8IDIwMCkgew0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgc2VsZi0+Y3JlYXRlZF9zdGF0ZW1lbnRzID0gMDsNCg0KICAgIG5ld19saXN0ID0gUHlMaXN0X05ldygwKTsNCiAgICBpZiAoIW5ld19saXN0KSB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X1NpemUoc2VsZi0+c3RhdGVtZW50cyk7IGkrKykgew0KICAgICAgICB3ZWFrcmVmID0gUHlMaXN0X0dldEl0ZW0oc2VsZi0+c3RhdGVtZW50cywgaSk7DQogICAgICAgIGlmIChQeVdlYWtyZWZfR2V0T2JqZWN0KHdlYWtyZWYpICE9IFB5X05vbmUpIHsNCiAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKG5ld19saXN0LCB3ZWFrcmVmKSAhPSAwKSB7DQogICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld19saXN0KTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBQeV9ERUNSRUYoc2VsZi0+c3RhdGVtZW50cyk7DQogICAgc2VsZi0+c3RhdGVtZW50cyA9IG5ld19saXN0Ow0KfQ0KDQpzdGF0aWMgdm9pZCBfcHlzcWxpdGVfZHJvcF91bnVzZWRfY3Vyc29yX3JlZmVyZW5jZXMocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikNCnsNCiAgICBQeU9iamVjdCogbmV3X2xpc3Q7DQogICAgUHlPYmplY3QqIHdlYWtyZWY7DQogICAgaW50IGk7DQoNCiAgICAvKiB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBvbmNlIGluIGEgd2hpbGUgKi8NCiAgICBpZiAoc2VsZi0+Y3JlYXRlZF9jdXJzb3JzKysgPCAyMDApIHsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIHNlbGYtPmNyZWF0ZWRfY3Vyc29ycyA9IDA7DQoNCiAgICBuZXdfbGlzdCA9IFB5TGlzdF9OZXcoMCk7DQogICAgaWYgKCFuZXdfbGlzdCkgew0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgZm9yIChpID0gMDsgaSA8IFB5TGlzdF9TaXplKHNlbGYtPmN1cnNvcnMpOyBpKyspIHsNCiAgICAgICAgd2Vha3JlZiA9IFB5TGlzdF9HZXRJdGVtKHNlbGYtPmN1cnNvcnMsIGkpOw0KICAgICAgICBpZiAoUHlXZWFrcmVmX0dldE9iamVjdCh3ZWFrcmVmKSAhPSBQeV9Ob25lKSB7DQogICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChuZXdfbGlzdCwgd2Vha3JlZikgIT0gMCkgew0KICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdfbGlzdCk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgUHlfREVDUkVGKHNlbGYtPmN1cnNvcnMpOw0KICAgIHNlbGYtPmN1cnNvcnMgPSBuZXdfbGlzdDsNCn0NCg0KUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2Z1bmN0aW9uKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQ0Kew0KICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJuYXJnIiwgImZ1bmMiLCBOVUxMLCBOVUxMfTsNCg0KICAgIFB5T2JqZWN0KiBmdW5jOw0KICAgIGNoYXIqIG5hbWU7DQogICAgaW50IG5hcmc7DQogICAgaW50IHJjOw0KDQogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic2lPIiwga3dsaXN0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCAmbmFyZywgJmZ1bmMpKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgcmMgPSBzcWxpdGUzX2NyZWF0ZV9mdW5jdGlvbihzZWxmLT5kYiwgbmFtZSwgbmFyZywgU1FMSVRFX1VURjgsICh2b2lkKilmdW5jLCBfcHlzcWxpdGVfZnVuY19jYWxsYmFjaywgTlVMTCwgTlVMTCk7DQoNCiAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7DQogICAgICAgIC8qIFdvcmthcm91bmQgZm9yIFNRTGl0ZSBidWc6IG5vIGVycm9yIGNvZGUgb3Igc3RyaW5nIGlzIGF2YWlsYWJsZSBoZXJlICovDQogICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiRXJyb3IgY3JlYXRpbmcgZnVuY3Rpb24iKTsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBmdW5jLCBQeV9Ob25lKSA9PSAtMSkNCiAgICAgICAgICAgIHJldHVybiBOVUxMOw0KDQogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsNCiAgICAgICAgcmV0dXJuIFB5X05vbmU7DQogICAgfQ0KfQ0KDQpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9jcmVhdGVfYWdncmVnYXRlKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQ0Kew0KICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7DQoNCiAgICBpbnQgbl9hcmc7DQogICAgY2hhciogbmFtZTsNCiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJuYW1lIiwgIm5fYXJnIiwgImFnZ3JlZ2F0ZV9jbGFzcyIsIE5VTEwgfTsNCiAgICBpbnQgcmM7DQoNCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSB8fCAhcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzaU86Y3JlYXRlX2FnZ3JlZ2F0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm5hbWUsICZuX2FyZywgJmFnZ3JlZ2F0ZV9jbGFzcykpIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgcmMgPSBzcWxpdGUzX2NyZWF0ZV9mdW5jdGlvbihzZWxmLT5kYiwgbmFtZSwgbl9hcmcsIFNRTElURV9VVEY4LCAodm9pZCopYWdncmVnYXRlX2NsYXNzLCAwLCAmX3B5c3FsaXRlX3N0ZXBfY2FsbGJhY2ssICZfcHlzcWxpdGVfZmluYWxfY2FsbGJhY2spOw0KICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsNCiAgICAgICAgLyogV29ya2Fyb3VuZCBmb3IgU1FMaXRlIGJ1Zzogbm8gZXJyb3IgY29kZSBvciBzdHJpbmcgaXMgYXZhaWxhYmxlIGhlcmUgKi8NCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJFcnJvciBjcmVhdGluZyBhZ2dyZWdhdGUiKTsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBhZ2dyZWdhdGVfY2xhc3MsIFB5X05vbmUpID09IC0xKQ0KICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQoNCiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOw0KICAgICAgICByZXR1cm4gUHlfTm9uZTsNCiAgICB9DQp9DQoNCnN0YXRpYyBpbnQgX2F1dGhvcml6ZXJfY2FsbGJhY2sodm9pZCogdXNlcl9hcmcsIGludCBhY3Rpb24sIGNvbnN0IGNoYXIqIGFyZzEsIGNvbnN0IGNoYXIqIGFyZzIgLCBjb25zdCBjaGFyKiBkYm5hbWUsIGNvbnN0IGNoYXIqIGFjY2Vzc19hdHRlbXB0X3NvdXJjZSkNCnsNCiAgICBQeU9iamVjdCAqcmV0Ow0KICAgIGludCByYzsNCiNpZmRlZiBXSVRIX1RIUkVBRA0KICAgIFB5R0lMU3RhdGVfU1RBVEUgZ2lsc3RhdGU7DQoNCiAgICBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7DQojZW5kaWYNCiAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0Kil1c2VyX2FyZywgImlzc3NzIiwgYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIGFjY2Vzc19hdHRlbXB0X3NvdXJjZSk7DQoNCiAgICBpZiAoIXJldCkgew0KICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7DQogICAgICAgICAgICBQeUVycl9QcmludCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJjID0gU1FMSVRFX0RFTlk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJldCkpIHsNCiAgICAgICAgICAgIHJjID0gKGludClQeUludF9Bc0xvbmcocmV0KTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJjID0gU1FMSVRFX0RFTlk7DQogICAgICAgIH0NCiAgICAgICAgUHlfREVDUkVGKHJldCk7DQogICAgfQ0KDQojaWZkZWYgV0lUSF9USFJFQUQNCiAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsc3RhdGUpOw0KI2VuZGlmDQogICAgcmV0dXJuIHJjOw0KfQ0KDQpzdGF0aWMgaW50IF9wcm9ncmVzc19oYW5kbGVyKHZvaWQqIHVzZXJfYXJnKQ0Kew0KICAgIGludCByYzsNCiAgICBQeU9iamVjdCAqcmV0Ow0KI2lmZGVmIFdJVEhfVEhSRUFEDQogICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZTsNCg0KICAgIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsNCiNlbmRpZg0KICAgIHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKXVzZXJfYXJnLCAiIik7DQoNCiAgICBpZiAoIXJldCkgew0KICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7DQogICAgICAgICAgICBQeUVycl9QcmludCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qIGFib3J0IHF1ZXJ5IGlmIGVycm9yIG9jY3VycmVkICovDQogICAgICAgIHJjID0gMTsgDQogICAgfSBlbHNlIHsNCiAgICAgICAgcmMgPSAoaW50KVB5T2JqZWN0X0lzVHJ1ZShyZXQpOw0KICAgICAgICBQeV9ERUNSRUYocmV0KTsNCiAgICB9DQoNCiNpZmRlZiBXSVRIX1RIUkVBRA0KICAgIFB5R0lMU3RhdGVfUmVsZWFzZShnaWxzdGF0ZSk7DQojZW5kaWYNCiAgICByZXR1cm4gcmM7DQp9DQoNCnN0YXRpYyBQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfYXV0aG9yaXplcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykNCnsNCiAgICBQeU9iamVjdCogYXV0aG9yaXplcl9jYjsNCg0KICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsgImF1dGhvcml6ZXJfY2FsbGJhY2siLCBOVUxMIH07DQogICAgaW50IHJjOw0KDQogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTzpzZXRfYXV0aG9yaXplciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmF1dGhvcml6ZXJfY2IpKSB7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIHJjID0gc3FsaXRlM19zZXRfYXV0aG9yaXplcihzZWxmLT5kYiwgX2F1dGhvcml6ZXJfY2FsbGJhY2ssICh2b2lkKilhdXRob3JpemVyX2NiKTsNCg0KICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJFcnJvciBzZXR0aW5nIGF1dGhvcml6ZXIgY2FsbGJhY2siKTsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBhdXRob3JpemVyX2NiLCBQeV9Ob25lKSA9PSAtMSkNCiAgICAgICAgICAgIHJldHVybiBOVUxMOw0KDQogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsNCiAgICAgICAgcmV0dXJuIFB5X05vbmU7DQogICAgfQ0KfQ0KDQpzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X3Byb2dyZXNzX2hhbmRsZXIocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpDQp7DQogICAgUHlPYmplY3QqIHByb2dyZXNzX2hhbmRsZXI7DQogICAgaW50IG47DQoNCiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJwcm9ncmVzc19oYW5kbGVyIiwgIm4iLCBOVUxMIH07DQoNCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSB8fCAhcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPaTpzZXRfcHJvZ3Jlc3NfaGFuZGxlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJnByb2dyZXNzX2hhbmRsZXIsICZuKSkgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBpZiAocHJvZ3Jlc3NfaGFuZGxlciA9PSBQeV9Ob25lKSB7DQogICAgICAgIC8qIE5vbmUgY2xlYXJzIHRoZSBwcm9ncmVzcyBoYW5kbGVyIHByZXZpb3VzbHkgc2V0ICovDQogICAgICAgIHNxbGl0ZTNfcHJvZ3Jlc3NfaGFuZGxlcihzZWxmLT5kYiwgMCwgMCwgKHZvaWQqKTApOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHNxbGl0ZTNfcHJvZ3Jlc3NfaGFuZGxlcihzZWxmLT5kYiwgbiwgX3Byb2dyZXNzX2hhbmRsZXIsIHByb2dyZXNzX2hhbmRsZXIpOw0KICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIHByb2dyZXNzX2hhbmRsZXIsIFB5X05vbmUpID09IC0xKQ0KICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgUHlfSU5DUkVGKFB5X05vbmUpOw0KICAgIHJldHVybiBQeV9Ob25lOw0KfQ0KDQojaWZkZWYgSEFWRV9MT0FEX0VYVEVOU0lPTg0Kc3RhdGljIFB5T2JqZWN0KiBweXNxbGl0ZV9lbmFibGVfbG9hZF9leHRlbnNpb24ocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpDQp7DQogICAgaW50IHJjOw0KICAgIGludCBvbm9mZjsNCg0KICAgIGlmICghcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHNlbGYpKSB7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZvbm9mZikpIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgcmMgPSBzcWxpdGUzX2VuYWJsZV9sb2FkX2V4dGVuc2lvbihzZWxmLT5kYiwgb25vZmYpOw0KDQogICAgaWYgKHJjICE9IFNRTElURV9PSykgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIGVuYWJsaW5nIGxvYWQgZXh0ZW5zaW9uIik7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0gZWxzZSB7DQogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsNCiAgICAgICAgcmV0dXJuIFB5X05vbmU7DQogICAgfQ0KfQ0KDQpzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2xvYWRfZXh0ZW5zaW9uKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQ0Kew0KICAgIGludCByYzsNCiAgICBjaGFyKiBleHRlbnNpb25fbmFtZTsNCiAgICBjaGFyKiBlcnJtc2c7DQoNCiAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSB8fCAhcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmZXh0ZW5zaW9uX25hbWUpKSB7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIHJjID0gc3FsaXRlM19sb2FkX2V4dGVuc2lvbihzZWxmLT5kYiwgZXh0ZW5zaW9uX25hbWUsIDAsICZlcnJtc2cpOw0KICAgIGlmIChyYyAhPSAwKSB7DQogICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCBlcnJtc2cpOw0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9IGVsc2Ugew0KICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7DQogICAgICAgIHJldHVybiBQeV9Ob25lOw0KICAgIH0NCn0NCiNlbmRpZg0KDQppbnQgcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpDQp7DQojaWZkZWYgV0lUSF9USFJFQUQNCiAgICBpZiAoc2VsZi0+Y2hlY2tfc2FtZV90aHJlYWQpIHsNCiAgICAgICAgaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBzZWxmLT50aHJlYWRfaWRlbnQpIHsNCiAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlNRTGl0ZSBvYmplY3RzIGNyZWF0ZWQgaW4gYSB0aHJlYWQgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGF0IHNhbWUgdGhyZWFkLiINCiAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb2JqZWN0IHdhcyBjcmVhdGVkIGluIHRocmVhZCBpZCAlbGQgYW5kIHRoaXMgaXMgdGhyZWFkIGlkICVsZCIsDQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT50aHJlYWRfaWRlbnQsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSk7DQogICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgfQ0KDQogICAgfQ0KI2VuZGlmDQogICAgcmV0dXJuIDE7DQp9DQoNCnN0YXRpYyBQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9nZXRfaXNvbGF0aW9uX2xldmVsKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIHZvaWQqIHVudXNlZCkNCnsNCiAgICBQeV9JTkNSRUYoc2VsZi0+aXNvbGF0aW9uX2xldmVsKTsNCiAgICByZXR1cm4gc2VsZi0+aXNvbGF0aW9uX2xldmVsOw0KfQ0KDQpzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZ2V0X3RvdGFsX2NoYW5nZXMocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgdm9pZCogdW51c2VkKQ0Kew0KICAgIGlmICghcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHNxbGl0ZTNfdG90YWxfY2hhbmdlcyhzZWxmLT5kYikpOw0KICAgIH0NCn0NCg0Kc3RhdGljIGludCBweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCkNCnsNCiAgICBQeU9iamVjdCogcmVzOw0KICAgIFB5T2JqZWN0KiBiZWdpbl9zdGF0ZW1lbnQ7DQogICAgY2hhciogYmVnaW5fc3RhdGVtZW50X3N0cjsNCg0KICAgIFB5X1hERUNSRUYoc2VsZi0+aXNvbGF0aW9uX2xldmVsKTsNCg0KICAgIGlmIChzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpIHsNCiAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpOw0KICAgICAgICBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQgPSBOVUxMOw0KICAgIH0NCg0KICAgIGlmIChpc29sYXRpb25fbGV2ZWwgPT0gUHlfTm9uZSkgew0KICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7DQogICAgICAgIHNlbGYtPmlzb2xhdGlvbl9sZXZlbCA9IFB5X05vbmU7DQoNCiAgICAgICAgcmVzID0gcHlzcWxpdGVfY29ubmVjdGlvbl9jb21taXQoc2VsZiwgTlVMTCk7DQogICAgICAgIGlmICghcmVzKSB7DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH0NCiAgICAgICAgUHlfREVDUkVGKHJlcyk7DQoNCiAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDA7DQogICAgfSBlbHNlIHsNCiAgICAgICAgUHlfSU5DUkVGKGlzb2xhdGlvbl9sZXZlbCk7DQogICAgICAgIHNlbGYtPmlzb2xhdGlvbl9sZXZlbCA9IGlzb2xhdGlvbl9sZXZlbDsNCg0KICAgICAgICBiZWdpbl9zdGF0ZW1lbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJCRUdJTiAiKTsNCiAgICAgICAgaWYgKCFiZWdpbl9zdGF0ZW1lbnQpIHsNCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfQ0KICAgICAgICBQeVN0cmluZ19Db25jYXQoJmJlZ2luX3N0YXRlbWVudCwgaXNvbGF0aW9uX2xldmVsKTsNCiAgICAgICAgaWYgKCFiZWdpbl9zdGF0ZW1lbnQpIHsNCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfQ0KDQogICAgICAgIGJlZ2luX3N0YXRlbWVudF9zdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhiZWdpbl9zdGF0ZW1lbnQpOw0KICAgICAgICBpZiAoIWJlZ2luX3N0YXRlbWVudF9zdHIpIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihiZWdpbl9zdGF0ZW1lbnQpOw0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9DQogICAgICAgIHNlbGYtPmJlZ2luX3N0YXRlbWVudCA9IFB5TWVtX01hbGxvYyhzdHJsZW4oYmVnaW5fc3RhdGVtZW50X3N0cikgKyAyKTsNCiAgICAgICAgaWYgKCFzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihiZWdpbl9zdGF0ZW1lbnQpOw0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9DQoNCiAgICAgICAgc3RyY3B5KHNlbGYtPmJlZ2luX3N0YXRlbWVudCwgYmVnaW5fc3RhdGVtZW50X3N0cik7DQogICAgICAgIFB5X0RFQ1JFRihiZWdpbl9zdGF0ZW1lbnQpOw0KICAgIH0NCg0KICAgIHJldHVybiAwOw0KfQ0KDQpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9jYWxsKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQ0Kew0KICAgIFB5T2JqZWN0KiBzcWw7DQogICAgcHlzcWxpdGVfU3RhdGVtZW50KiBzdGF0ZW1lbnQ7DQogICAgUHlPYmplY3QqIHdlYWtyZWY7DQogICAgaW50IHJjOw0KDQogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIiwgJnNxbCkpIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgX3B5c3FsaXRlX2Ryb3BfdW51c2VkX3N0YXRlbWVudF9yZWZlcmVuY2VzKHNlbGYpOw0KDQogICAgc3RhdGVtZW50ID0gUHlPYmplY3RfTmV3KHB5c3FsaXRlX1N0YXRlbWVudCwgJnB5c3FsaXRlX1N0YXRlbWVudFR5cGUpOw0KICAgIGlmICghc3RhdGVtZW50KSB7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIHN0YXRlbWVudC0+ZGIgPSBOVUxMOw0KICAgIHN0YXRlbWVudC0+c3QgPSBOVUxMOw0KICAgIHN0YXRlbWVudC0+c3FsID0gTlVMTDsNCiAgICBzdGF0ZW1lbnQtPmluX3VzZSA9IDA7DQogICAgc3RhdGVtZW50LT5pbl93ZWFrcmVmbGlzdCA9IE5VTEw7DQoNCiAgICByYyA9IHB5c3FsaXRlX3N0YXRlbWVudF9jcmVhdGUoc3RhdGVtZW50LCBzZWxmLCBzcWwpOw0KDQogICAgaWYgKHJjICE9IFNRTElURV9PSykgew0KICAgICAgICBpZiAocmMgPT0gUFlTUUxJVEVfVE9PX01VQ0hfU1FMKSB7DQogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfV2FybmluZywgIllvdSBjYW4gb25seSBleGVjdXRlIG9uZSBzdGF0ZW1lbnQgYXQgYSB0aW1lLiIpOw0KICAgICAgICB9IGVsc2UgaWYgKHJjID09IFBZU1FMSVRFX1NRTF9XUk9OR19UWVBFKSB7DQogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfV2FybmluZywgIlNRTCBpcyBvZiB3cm9uZyB0eXBlLiBNdXN0IGJlIHN0cmluZyBvciB1bmljb2RlLiIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KHN0YXRlbWVudCk7DQogICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOw0KICAgICAgICB9DQoNCiAgICAgICAgUHlfQ0xFQVIoc3RhdGVtZW50KTsNCiAgICB9IGVsc2Ugew0KICAgICAgICB3ZWFrcmVmID0gUHlXZWFrcmVmX05ld1JlZigoUHlPYmplY3QqKXN0YXRlbWVudCwgTlVMTCk7DQogICAgICAgIGlmICghd2Vha3JlZikgew0KICAgICAgICAgICAgUHlfQ0xFQVIoc3RhdGVtZW50KTsNCiAgICAgICAgICAgIGdvdG8gZXJyb3I7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5zdGF0ZW1lbnRzLCB3ZWFrcmVmKSAhPSAwKSB7DQogICAgICAgICAgICBQeV9DTEVBUih3ZWFrcmVmKTsNCiAgICAgICAgICAgIGdvdG8gZXJyb3I7DQogICAgICAgIH0NCg0KICAgICAgICBQeV9ERUNSRUYod2Vha3JlZik7DQogICAgfQ0KDQplcnJvcjoNCiAgICByZXR1cm4gKFB5T2JqZWN0KilzdGF0ZW1lbnQ7DQp9DQoNClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2V4ZWN1dGUocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpDQp7DQogICAgUHlPYmplY3QqIGN1cnNvciA9IDA7DQogICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7DQogICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7DQoNCiAgICBjdXJzb3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgImN1cnNvciIsICIiKTsNCiAgICBpZiAoIWN1cnNvcikgew0KICAgICAgICBnb3RvIGVycm9yOw0KICAgIH0NCg0KICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY3Vyc29yLCAiZXhlY3V0ZSIpOw0KICAgIGlmICghbWV0aG9kKSB7DQogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7DQogICAgICAgIGdvdG8gZXJyb3I7DQogICAgfQ0KDQogICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChtZXRob2QsIGFyZ3MpOw0KICAgIGlmICghcmVzdWx0KSB7DQogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7DQogICAgfQ0KDQplcnJvcjoNCiAgICBQeV9YREVDUkVGKHJlc3VsdCk7DQogICAgUHlfWERFQ1JFRihtZXRob2QpOw0KDQogICAgcmV0dXJuIGN1cnNvcjsNCn0NCg0KUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZW1hbnkocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpDQp7DQogICAgUHlPYmplY3QqIGN1cnNvciA9IDA7DQogICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7DQogICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7DQoNCiAgICBjdXJzb3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgImN1cnNvciIsICIiKTsNCiAgICBpZiAoIWN1cnNvcikgew0KICAgICAgICBnb3RvIGVycm9yOw0KICAgIH0NCg0KICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY3Vyc29yLCAiZXhlY3V0ZW1hbnkiKTsNCiAgICBpZiAoIW1ldGhvZCkgew0KICAgICAgICBQeV9DTEVBUihjdXJzb3IpOw0KICAgICAgICBnb3RvIGVycm9yOw0KICAgIH0NCg0KICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsNCiAgICBpZiAoIXJlc3VsdCkgew0KICAgICAgICBQeV9DTEVBUihjdXJzb3IpOw0KICAgIH0NCg0KZXJyb3I6DQogICAgUHlfWERFQ1JFRihyZXN1bHQpOw0KICAgIFB5X1hERUNSRUYobWV0aG9kKTsNCg0KICAgIHJldHVybiBjdXJzb3I7DQp9DQoNClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2V4ZWN1dGVzY3JpcHQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpDQp7DQogICAgUHlPYmplY3QqIGN1cnNvciA9IDA7DQogICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7DQogICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7DQoNCiAgICBjdXJzb3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgImN1cnNvciIsICIiKTsNCiAgICBpZiAoIWN1cnNvcikgew0KICAgICAgICBnb3RvIGVycm9yOw0KICAgIH0NCg0KICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY3Vyc29yLCAiZXhlY3V0ZXNjcmlwdCIpOw0KICAgIGlmICghbWV0aG9kKSB7DQogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7DQogICAgICAgIGdvdG8gZXJyb3I7DQogICAgfQ0KDQogICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChtZXRob2QsIGFyZ3MpOw0KICAgIGlmICghcmVzdWx0KSB7DQogICAgICAgIFB5X0NMRUFSKGN1cnNvcik7DQogICAgfQ0KDQplcnJvcjoNCiAgICBQeV9YREVDUkVGKHJlc3VsdCk7DQogICAgUHlfWERFQ1JFRihtZXRob2QpOw0KDQogICAgcmV0dXJuIGN1cnNvcjsNCn0NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT0xMQVRJT04gQ09ERSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0Kc3RhdGljIGludA0KcHlzcWxpdGVfY29sbGF0aW9uX2NhbGxiYWNrKA0KICAgICAgICB2b2lkKiBjb250ZXh0LA0KICAgICAgICBpbnQgdGV4dDFfbGVuZ3RoLCBjb25zdCB2b2lkKiB0ZXh0MV9kYXRhLA0KICAgICAgICBpbnQgdGV4dDJfbGVuZ3RoLCBjb25zdCB2b2lkKiB0ZXh0Ml9kYXRhKQ0Kew0KICAgIFB5T2JqZWN0KiBjYWxsYmFjayA9IChQeU9iamVjdCopY29udGV4dDsNCiAgICBQeU9iamVjdCogc3RyaW5nMSA9IDA7DQogICAgUHlPYmplY3QqIHN0cmluZzIgPSAwOw0KI2lmZGVmIFdJVEhfVEhSRUFEDQogICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZTsNCiNlbmRpZg0KICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOw0KICAgIGludCByZXN1bHQgPSAwOw0KI2lmZGVmIFdJVEhfVEhSRUFEDQogICAgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOw0KI2VuZGlmDQoNCiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgew0KICAgICAgICBnb3RvIGZpbmFsbHk7DQogICAgfQ0KDQogICAgc3RyaW5nMSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyKil0ZXh0MV9kYXRhLCB0ZXh0MV9sZW5ndGgpOw0KICAgIHN0cmluZzIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciopdGV4dDJfZGF0YSwgdGV4dDJfbGVuZ3RoKTsNCg0KICAgIGlmICghc3RyaW5nMSB8fCAhc3RyaW5nMikgew0KICAgICAgICBnb3RvIGZpbmFsbHk7IC8qIGZhaWxlZCB0byBhbGxvY2F0ZSBzdHJpbmdzICovDQogICAgfQ0KDQogICAgcmV0dmFsID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjYWxsYmFjaywgc3RyaW5nMSwgc3RyaW5nMiwgTlVMTCk7DQoNCiAgICBpZiAoIXJldHZhbCkgew0KICAgICAgICAvKiBleGVjdXRpb24gZmFpbGVkICovDQogICAgICAgIGdvdG8gZmluYWxseTsNCiAgICB9DQoNCiAgICByZXN1bHQgPSBQeUludF9Bc0xvbmcocmV0dmFsKTsNCiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgew0KICAgICAgICByZXN1bHQgPSAwOw0KICAgIH0NCg0KZmluYWxseToNCiAgICBQeV9YREVDUkVGKHN0cmluZzEpOw0KICAgIFB5X1hERUNSRUYoc3RyaW5nMik7DQogICAgUHlfWERFQ1JFRihyZXR2YWwpOw0KI2lmZGVmIFdJVEhfVEhSRUFEDQogICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsNCiNlbmRpZg0KICAgIHJldHVybiByZXN1bHQ7DQp9DQoNCnN0YXRpYyBQeU9iamVjdCAqDQpweXNxbGl0ZV9jb25uZWN0aW9uX2ludGVycnVwdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykNCnsNCiAgICBQeU9iamVjdCogcmV0dmFsID0gTlVMTDsNCg0KICAgIGlmICghcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgew0KICAgICAgICBnb3RvIGZpbmFsbHk7DQogICAgfQ0KDQogICAgc3FsaXRlM19pbnRlcnJ1cHQoc2VsZi0+ZGIpOw0KDQogICAgUHlfSU5DUkVGKFB5X05vbmUpOw0KICAgIHJldHZhbCA9IFB5X05vbmU7DQoNCmZpbmFsbHk6DQogICAgcmV0dXJuIHJldHZhbDsNCn0NCg0KLyogRnVuY3Rpb24gYXV0aG9yOiBQYXVsIEtpcHBlcyA8a2lwcGVzcEBnbWFpbC5jb20+DQogKiBDbGFzcyBtZXRob2Qgb2YgQ29ubmVjdGlvbiB0byBjYWxsIHRoZSBQeXRob24gZnVuY3Rpb24gX2l0ZXJkdW1wDQogKiBvZiB0aGUgc3FsaXRlMyBtb2R1bGUuDQogKi8NCnN0YXRpYyBQeU9iamVjdCAqDQpweXNxbGl0ZV9jb25uZWN0aW9uX2l0ZXJkdW1wKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQ0Kew0KICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOw0KICAgIFB5T2JqZWN0KiBtb2R1bGUgPSBOVUxMOw0KICAgIFB5T2JqZWN0KiBtb2R1bGVfZGljdDsNCiAgICBQeU9iamVjdCogcHlmbl9pdGVyZHVtcDsNCg0KICAgIGlmICghcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgew0KICAgICAgICBnb3RvIGZpbmFsbHk7DQogICAgfQ0KDQogICAgbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKE1PRFVMRV9OQU1FICIuZHVtcCIpOw0KICAgIGlmICghbW9kdWxlKSB7DQogICAgICAgIGdvdG8gZmluYWxseTsNCiAgICB9DQoNCiAgICBtb2R1bGVfZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsNCiAgICBpZiAoIW1vZHVsZV9kaWN0KSB7DQogICAgICAgIGdvdG8gZmluYWxseTsNCiAgICB9DQoNCiAgICBweWZuX2l0ZXJkdW1wID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJfaXRlcmR1bXAiKTsNCiAgICBpZiAoIXB5Zm5faXRlcmR1bXApIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJGYWlsZWQgdG8gb2J0YWluIF9pdGVyZHVtcCgpIHJlZmVyZW5jZSIpOw0KICAgICAgICBnb3RvIGZpbmFsbHk7DQogICAgfQ0KDQogICAgYXJncyA9IFB5VHVwbGVfTmV3KDEpOw0KICAgIGlmICghYXJncykgew0KICAgICAgICBnb3RvIGZpbmFsbHk7DQogICAgfQ0KICAgIFB5X0lOQ1JFRihzZWxmKTsNCiAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgMCwgKFB5T2JqZWN0KilzZWxmKTsNCiAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHB5Zm5faXRlcmR1bXAsIGFyZ3MpOw0KDQpmaW5hbGx5Og0KICAgIFB5X1hERUNSRUYoYXJncyk7DQogICAgUHlfWERFQ1JFRihtb2R1bGUpOw0KICAgIHJldHVybiByZXR2YWw7DQp9DQoNCnN0YXRpYyBQeU9iamVjdCAqDQpweXNxbGl0ZV9jb25uZWN0aW9uX2NyZWF0ZV9jb2xsYXRpb24ocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpDQp7DQogICAgUHlPYmplY3QqIGNhbGxhYmxlOw0KICAgIFB5T2JqZWN0KiB1cHBlcmNhc2VfbmFtZSA9IDA7DQogICAgUHlPYmplY3QqIG5hbWU7DQogICAgUHlPYmplY3QqIHJldHZhbDsNCiAgICBjaGFyKiBjaGs7DQogICAgaW50IHJjOw0KDQogICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsNCiAgICAgICAgZ290byBmaW5hbGx5Ow0KICAgIH0NCg0KICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyFPOmNyZWF0ZV9jb2xsYXRpb24obmFtZSwgY2FsbGJhY2spIiwgJlB5U3RyaW5nX1R5cGUsICZuYW1lLCAmY2FsbGFibGUpKSB7DQogICAgICAgIGdvdG8gZmluYWxseTsNCiAgICB9DQoNCiAgICB1cHBlcmNhc2VfbmFtZSA9IFB5T2JqZWN0X0NhbGxNZXRob2QobmFtZSwgInVwcGVyIiwgIiIpOw0KICAgIGlmICghdXBwZXJjYXNlX25hbWUpIHsNCiAgICAgICAgZ290byBmaW5hbGx5Ow0KICAgIH0NCg0KICAgIGNoayA9IFB5U3RyaW5nX0FzU3RyaW5nKHVwcGVyY2FzZV9uYW1lKTsNCiAgICB3aGlsZSAoKmNoaykgew0KICAgICAgICBpZiAoKCpjaGsgPj0gJzAnICYmICpjaGsgPD0gJzknKQ0KICAgICAgICAgfHwgKCpjaGsgPj0gJ0EnICYmICpjaGsgPD0gJ1onKQ0KICAgICAgICAgfHwgKCpjaGsgPT0gJ18nKSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2hrKys7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgImludmFsaWQgY2hhcmFjdGVyIGluIGNvbGxhdGlvbiBuYW1lIik7DQogICAgICAgICAgICBnb3RvIGZpbmFsbHk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAoY2FsbGFibGUgIT0gUHlfTm9uZSAmJiAhUHlDYWxsYWJsZV9DaGVjayhjYWxsYWJsZSkpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBhcmFtZXRlciBtdXN0IGJlIGNhbGxhYmxlIik7DQogICAgICAgIGdvdG8gZmluYWxseTsNCiAgICB9DQoNCiAgICBpZiAoY2FsbGFibGUgIT0gUHlfTm9uZSkgew0KICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+Y29sbGF0aW9ucywgdXBwZXJjYXNlX25hbWUsIGNhbGxhYmxlKSA9PSAtMSkNCiAgICAgICAgICAgIGdvdG8gZmluYWxseTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oc2VsZi0+Y29sbGF0aW9ucywgdXBwZXJjYXNlX25hbWUpID09IC0xKQ0KICAgICAgICAgICAgZ290byBmaW5hbGx5Ow0KICAgIH0NCg0KICAgIHJjID0gc3FsaXRlM19jcmVhdGVfY29sbGF0aW9uKHNlbGYtPmRiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHVwcGVyY2FzZV9uYW1lKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUxJVEVfVVRGOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsbGFibGUgIT0gUHlfTm9uZSkgPyBjYWxsYWJsZSA6IE5VTEwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGxhYmxlICE9IFB5X05vbmUpID8gcHlzcWxpdGVfY29sbGF0aW9uX2NhbGxiYWNrIDogTlVMTCk7DQogICAgaWYgKHJjICE9IFNRTElURV9PSykgew0KICAgICAgICBQeURpY3RfRGVsSXRlbShzZWxmLT5jb2xsYXRpb25zLCB1cHBlcmNhc2VfbmFtZSk7DQogICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7DQogICAgICAgIGdvdG8gZmluYWxseTsNCiAgICB9DQoNCmZpbmFsbHk6DQogICAgUHlfWERFQ1JFRih1cHBlcmNhc2VfbmFtZSk7DQoNCiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgew0KICAgICAgICByZXR2YWwgPSBOVUxMOw0KICAgIH0gZWxzZSB7DQogICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsNCiAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsNCiAgICB9DQoNCiAgICByZXR1cm4gcmV0dmFsOw0KfQ0KDQovKiBDYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyLiBSZXR1cm5zIGl0c2VsZiBhcyBhDQogKiBjb252ZW5pZW5jZSB0byB0aGUgY2FsbGVyLiAqLw0Kc3RhdGljIFB5T2JqZWN0ICoNCnB5c3FsaXRlX2Nvbm5lY3Rpb25fZW50ZXIocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpDQp7DQogICAgUHlfSU5DUkVGKHNlbGYpOw0KICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7DQp9DQoNCi8qKiBDYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyLiBJZiB0aGVyZSB3YXMgYW55DQogKiBleGNlcHRpb24sIGEgcm9sbGJhY2sgdGFrZXMgcGxhY2U7IG90aGVyd2lzZSB3ZSBjb21taXQuICovDQpzdGF0aWMgUHlPYmplY3QgKg0KcHlzcWxpdGVfY29ubmVjdGlvbl9leGl0KHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQ0Kew0KICAgIFB5T2JqZWN0KiBleGNfdHlwZSwgKmV4Y192YWx1ZSwgKmV4Y190YjsNCiAgICBjaGFyKiBtZXRob2RfbmFtZTsNCiAgICBQeU9iamVjdCogcmVzdWx0Ow0KDQogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT08iLCAmZXhjX3R5cGUsICZleGNfdmFsdWUsICZleGNfdGIpKSB7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIGlmIChleGNfdHlwZSA9PSBQeV9Ob25lICYmIGV4Y192YWx1ZSA9PSBQeV9Ob25lICYmIGV4Y190YiA9PSBQeV9Ob25lKSB7DQogICAgICAgIG1ldGhvZF9uYW1lID0gImNvbW1pdCI7DQogICAgfSBlbHNlIHsNCiAgICAgICAgbWV0aG9kX25hbWUgPSAicm9sbGJhY2siOw0KICAgIH0NCg0KICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0KilzZWxmLCBtZXRob2RfbmFtZSwgIiIpOw0KICAgIGlmICghcmVzdWx0KSB7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCiAgICBQeV9ERUNSRUYocmVzdWx0KTsNCg0KICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7DQogICAgcmV0dXJuIFB5X0ZhbHNlOw0KfQ0KDQpzdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0NClB5RG9jX1NUUigiU1FMaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24gb2JqZWN0LiIpOw0KDQpzdGF0aWMgUHlHZXRTZXREZWYgY29ubmVjdGlvbl9nZXRzZXRbXSA9IHsNCiAgICB7Imlzb2xhdGlvbl9sZXZlbCIsICAoZ2V0dGVyKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZ2V0X2lzb2xhdGlvbl9sZXZlbCwgKHNldHRlcilweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWx9LA0KICAgIHsidG90YWxfY2hhbmdlcyIsICAoZ2V0dGVyKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZ2V0X3RvdGFsX2NoYW5nZXMsIChzZXR0ZXIpMH0sDQogICAge05VTEx9DQp9Ow0KDQpzdGF0aWMgUHlNZXRob2REZWYgY29ubmVjdGlvbl9tZXRob2RzW10gPSB7DQogICAgeyJjdXJzb3IiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9jdXJzb3IsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLA0KICAgICAgICBQeURvY19TVFIoIlJldHVybiBhIGN1cnNvciBmb3IgdGhlIGNvbm5lY3Rpb24uIil9LA0KICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9jbG9zZSwgTUVUSF9OT0FSR1MsDQogICAgICAgIFB5RG9jX1NUUigiQ2xvc2VzIHRoZSBjb25uZWN0aW9uLiIpfSwNCiAgICB7ImNvbW1pdCIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2NvbW1pdCwgTUVUSF9OT0FSR1MsDQogICAgICAgIFB5RG9jX1NUUigiQ29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiIpfSwNCiAgICB7InJvbGxiYWNrIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fcm9sbGJhY2ssIE1FVEhfTk9BUkdTLA0KICAgICAgICBQeURvY19TVFIoIlJvbGwgYmFjayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4iKX0sDQogICAgeyJjcmVhdGVfZnVuY3Rpb24iLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9jcmVhdGVfZnVuY3Rpb24sIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLA0KICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBuZXcgZnVuY3Rpb24uIE5vbi1zdGFuZGFyZC4iKX0sDQogICAgeyJjcmVhdGVfYWdncmVnYXRlIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2FnZ3JlZ2F0ZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsDQogICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIG5ldyBhZ2dyZWdhdGUuIE5vbi1zdGFuZGFyZC4iKX0sDQogICAgeyJzZXRfYXV0aG9yaXplciIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9hdXRob3JpemVyLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywNCiAgICAgICAgUHlEb2NfU1RSKCJTZXRzIGF1dGhvcml6ZXIgY2FsbGJhY2suIE5vbi1zdGFuZGFyZC4iKX0sDQogICAgI2lmZGVmIEhBVkVfTE9BRF9FWFRFTlNJT04NCiAgICB7ImVuYWJsZV9sb2FkX2V4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9lbmFibGVfbG9hZF9leHRlbnNpb24sIE1FVEhfVkFSQVJHUywNCiAgICAgICAgUHlEb2NfU1RSKCJFbmFibGUgZHluYW1pYyBsb2FkaW5nIG9mIFNRTGl0ZSBleHRlbnNpb24gbW9kdWxlcy4gTm9uLXN0YW5kYXJkLiIpfSwNCiAgICB7ImxvYWRfZXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2xvYWRfZXh0ZW5zaW9uLCBNRVRIX1ZBUkFSR1MsDQogICAgICAgIFB5RG9jX1NUUigiTG9hZCBTUUxpdGUgZXh0ZW5zaW9uIG1vZHVsZS4gTm9uLXN0YW5kYXJkLiIpfSwNCiAgICAjZW5kaWYNCiAgICB7InNldF9wcm9ncmVzc19oYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X3Byb2dyZXNzX2hhbmRsZXIsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLA0KICAgICAgICBQeURvY19TVFIoIlNldHMgcHJvZ3Jlc3MgaGFuZGxlciBjYWxsYmFjay4gTm9uLXN0YW5kYXJkLiIpfSwNCiAgICB7ImV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9leGVjdXRlLCBNRVRIX1ZBUkFSR1MsDQogICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LiBOb24tc3RhbmRhcmQuIil9LA0KICAgIHsiZXhlY3V0ZW1hbnkiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9leGVjdXRlbWFueSwgTUVUSF9WQVJBUkdTLA0KICAgICAgICBQeURvY19TVFIoIlJlcGVhdGVkbHkgZXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LiBOb24tc3RhbmRhcmQuIil9LA0KICAgIHsiZXhlY3V0ZXNjcmlwdCIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2V4ZWN1dGVzY3JpcHQsIE1FVEhfVkFSQVJHUywNCiAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlcyBhIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzIGF0IG9uY2UuIE5vbi1zdGFuZGFyZC4iKX0sDQogICAgeyJjcmVhdGVfY29sbGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbiwgTUVUSF9WQVJBUkdTLA0KICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBjb2xsYXRpb24gZnVuY3Rpb24uIE5vbi1zdGFuZGFyZC4iKX0sDQogICAgeyJpbnRlcnJ1cHQiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9pbnRlcnJ1cHQsIE1FVEhfTk9BUkdTLA0KICAgICAgICBQeURvY19TVFIoIkFib3J0IGFueSBwZW5kaW5nIGRhdGFiYXNlIG9wZXJhdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwNCiAgICB7Iml0ZXJkdW1wIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25faXRlcmR1bXAsIE1FVEhfTk9BUkdTLA0KICAgICAgICBQeURvY19TVFIoIlJldHVybnMgaXRlcmF0b3IgdG8gdGhlIGR1bXAgb2YgdGhlIGRhdGFiYXNlIGluIGFuIFNRTCB0ZXh0IGZvcm1hdC4gTm9uLXN0YW5kYXJkLiIpfSwNCiAgICB7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2VudGVyLCBNRVRIX05PQVJHUywNCiAgICAgICAgUHlEb2NfU1RSKCJGb3IgY29udGV4dCBtYW5hZ2VyLiBOb24tc3RhbmRhcmQuIil9LA0KICAgIHsiX19leGl0X18iLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9leGl0LCBNRVRIX1ZBUkFSR1MsDQogICAgICAgIFB5RG9jX1NUUigiRm9yIGNvbnRleHQgbWFuYWdlci4gTm9uLXN0YW5kYXJkLiIpfSwNCiAgICB7TlVMTCwgTlVMTH0NCn07DQoNCnN0YXRpYyBzdHJ1Y3QgUHlNZW1iZXJEZWYgY29ubmVjdGlvbl9tZW1iZXJzW10gPQ0Kew0KICAgIHsiV2FybmluZyIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBXYXJuaW5nKSwgUk99LA0KICAgIHsiRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgRXJyb3IpLCBST30sDQogICAgeyJJbnRlcmZhY2VFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBJbnRlcmZhY2VFcnJvciksIFJPfSwNCiAgICB7IkRhdGFiYXNlRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgRGF0YWJhc2VFcnJvciksIFJPfSwNCiAgICB7IkRhdGFFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBEYXRhRXJyb3IpLCBST30sDQogICAgeyJPcGVyYXRpb25hbEVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIE9wZXJhdGlvbmFsRXJyb3IpLCBST30sDQogICAgeyJJbnRlZ3JpdHlFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCBJbnRlZ3JpdHlFcnJvciksIFJPfSwNCiAgICB7IkludGVybmFsRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgSW50ZXJuYWxFcnJvciksIFJPfSwNCiAgICB7IlByb2dyYW1taW5nRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgUHJvZ3JhbW1pbmdFcnJvciksIFJPfSwNCiAgICB7Ik5vdFN1cHBvcnRlZEVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24sIE5vdFN1cHBvcnRlZEVycm9yKSwgUk99LA0KICAgIHsicm93X2ZhY3RvcnkiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHlzcWxpdGVfQ29ubmVjdGlvbiwgcm93X2ZhY3RvcnkpfSwNCiAgICB7InRleHRfZmFjdG9yeSIsIFRfT0JKRUNULCBvZmZzZXRvZihweXNxbGl0ZV9Db25uZWN0aW9uLCB0ZXh0X2ZhY3RvcnkpfSwNCiAgICB7TlVMTH0NCn07DQoNClB5VHlwZU9iamVjdCBweXNxbGl0ZV9Db25uZWN0aW9uVHlwZSA9IHsNCiAgICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApDQogICAgICAgIE1PRFVMRV9OQU1FICIuQ29ubmVjdGlvbiIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8NCiAgICAgICAgc2l6ZW9mKHB5c3FsaXRlX0Nvbm5lY3Rpb24pLCAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovDQogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovDQogICAgICAgICh0ZXJuYXJ5ZnVuYylweXNxbGl0ZV9jb25uZWN0aW9uX2NhbGwsICAgICAgICAgIC8qIHRwX2NhbGwgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLw0KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLw0KICAgICAgICBjb25uZWN0aW9uX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLw0KICAgICAgICBjb25uZWN0aW9uX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovDQogICAgICAgIGNvbm5lY3Rpb25fbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8NCiAgICAgICAgY29ubmVjdGlvbl9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8NCiAgICAgICAgKGluaXRwcm9jKXB5c3FsaXRlX2Nvbm5lY3Rpb25faW5pdCwgICAgICAgICAgICAgLyogdHBfaW5pdCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8NCiAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLw0KfTsNCg0KZXh0ZXJuIGludCBweXNxbGl0ZV9jb25uZWN0aW9uX3NldHVwX3R5cGVzKHZvaWQpDQp7DQogICAgcHlzcWxpdGVfQ29ubmVjdGlvblR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7DQogICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfQ29ubmVjdGlvblR5cGUpOw0KfQ0K