LyogbW9kdWxlLmMgLSB0aGUgbW9kdWxlIGl0c2VsZgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAiY29ubmVjdGlvbi5oIgojaW5jbHVkZSAic3RhdGVtZW50LmgiCiNpbmNsdWRlICJjdXJzb3IuaCIKI2luY2x1ZGUgImNhY2hlLmgiCiNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCiNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgojaW5jbHVkZSAicm93LmgiCgojaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDMKI2RlZmluZSBIQVZFX1NIQVJFRF9DQUNIRQojZW5kaWYKCi8qIHN0YXRpYyBvYmplY3RzIGF0IG1vZHVsZS1sZXZlbCAqLwoKUHlPYmplY3QqIHB5c3FsaXRlX0Vycm9yLCAqcHlzcWxpdGVfV2FybmluZywgKnB5c3FsaXRlX0ludGVyZmFjZUVycm9yLCAqcHlzcWxpdGVfRGF0YWJhc2VFcnJvciwKICAgICpweXNxbGl0ZV9JbnRlcm5hbEVycm9yLCAqcHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgKnB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsCiAgICAqcHlzcWxpdGVfSW50ZWdyaXR5RXJyb3IsICpweXNxbGl0ZV9EYXRhRXJyb3IsICpweXNxbGl0ZV9Ob3RTdXBwb3J0ZWRFcnJvciwgKnB5c3FsaXRlX09wdGltaXplZFVuaWNvZGU7CgpQeU9iamVjdCogY29udmVydGVyczsKaW50IF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrczsKaW50IHB5c3FsaXRlX0Jhc2VUeXBlQWRhcHRlZDsKCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX2Nvbm5lY3QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKICAgICAgICBrd2FyZ3MpCnsKICAgIC8qIFB5dGhvbiBzZWVtcyB0byBoYXZlIG5vIHdheSBvZiBleHRyYWN0aW5nIGEgc2luZ2xlIGtleXdvcmQtYXJnIGF0CiAgICAgKiBDLWxldmVsLCBzbyB0aGlzIGNvZGUgaXMgcmVkdW5kYW50IHdpdGggdGhlIG9uZSBpbiBjb25uZWN0aW9uX2luaXQgaW4KICAgICAqIGNvbm5lY3Rpb24uYyBhbmQgbXVzdCBhbHdheXMgYmUgY29waWVkIGZyb20gdGhlcmUgLi4uICovCgogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhYmFzZSIsICJ0aW1lb3V0IiwgImRldGVjdF90eXBlcyIsICJpc29sYXRpb25fbGV2ZWwiLCAiY2hlY2tfc2FtZV90aHJlYWQiLCAiZmFjdG9yeSIsICJjYWNoZWRfc3RhdGVtZW50cyIsIE5VTEwsIE5VTEx9OwogICAgY2hhciogZGF0YWJhc2U7CiAgICBpbnQgZGV0ZWN0X3R5cGVzID0gMDsKICAgIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWw7CiAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7CiAgICBpbnQgY2hlY2tfc2FtZV90aHJlYWQgPSAxOwogICAgaW50IGNhY2hlZF9zdGF0ZW1lbnRzOwogICAgZG91YmxlIHRpbWVvdXQgPSA1LjA7CgogICAgUHlPYmplY3QqIHJlc3VsdDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzfGRpT2lPaSIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhYmFzZSwgJnRpbWVvdXQsICZkZXRlY3RfdHlwZXMsICZpc29sYXRpb25fbGV2ZWwsICZjaGVja19zYW1lX3RocmVhZCwgJmZhY3RvcnksICZjYWNoZWRfc3RhdGVtZW50cykpCiAgICB7CiAgICAgICAgcmV0dXJuIE5VTEw7IAogICAgfQoKICAgIGlmIChmYWN0b3J5ID09IE5VTEwpIHsKICAgICAgICBmYWN0b3J5ID0gKFB5T2JqZWN0KikmcHlzcWxpdGVfQ29ubmVjdGlvblR5cGU7CiAgICB9CgogICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmYWN0b3J5LCBhcmdzLCBrd2FyZ3MpOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX2NvbXBsZXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqCiAgICAgICAga3dhcmdzKQp7CiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InN0YXRlbWVudCIsIE5VTEwsIE5VTEx9OwogICAgY2hhciogc3RhdGVtZW50OwoKICAgIFB5T2JqZWN0KiByZXN1bHQ7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyIsIGt3bGlzdCwgJnN0YXRlbWVudCkpCiAgICB7CiAgICAgICAgcmV0dXJuIE5VTEw7IAogICAgfQoKICAgIGlmIChzcWxpdGUzX2NvbXBsZXRlKHN0YXRlbWVudCkpIHsKICAgICAgICByZXN1bHQgPSBQeV9UcnVlOwogICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSBQeV9GYWxzZTsKICAgIH0KCiAgICBQeV9JTkNSRUYocmVzdWx0KTsKCiAgICByZXR1cm4gcmVzdWx0Owp9CgojaWZkZWYgSEFWRV9TSEFSRURfQ0FDSEUKc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfZW5hYmxlX3NoYXJlZF9jYWNoZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KgogICAgICAgIGt3YXJncykKewogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkb19lbmFibGUiLCBOVUxMLCBOVUxMfTsKICAgIGludCBkb19lbmFibGU7CiAgICBpbnQgcmM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaSIsIGt3bGlzdCwgJmRvX2VuYWJsZSkpCiAgICB7CiAgICAgICAgcmV0dXJuIE5VTEw7IAogICAgfQoKICAgIHJjID0gc3FsaXRlM19lbmFibGVfc2hhcmVkX2NhY2hlKGRvX2VuYWJsZSk7CgogICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiQ2hhbmdpbmcgdGhlIHNoYXJlZF9jYWNoZSBmbGFnIGZhaWxlZCIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICB9Cn0KI2VuZGlmIC8qIEhBVkVfU0hBUkVEX0NBQ0hFICovCgpzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlUeXBlT2JqZWN0KiB0eXBlOwogICAgUHlPYmplY3QqIGNhc3RlcjsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJnR5cGUsICZjYXN0ZXIpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyogYSBiYXNpYyB0eXBlIGlzIGFkYXB0ZWQ7IHRoZXJlJ3MgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaWYgdGhhdCdzIG5vdCB0aGUgY2FzZQogICAgICogKDk5ICUgb2YgYWxsIHVzYWdlcykgKi8KICAgIGlmICh0eXBlID09ICZQeUxvbmdfVHlwZSB8fCB0eXBlID09ICZQeUZsb2F0X1R5cGUKICAgICAgICAgICAgfHwgdHlwZSA9PSAmUHlVbmljb2RlX1R5cGUgfHwgdHlwZSA9PSAmUHlCeXRlc19UeXBlKSB7CiAgICAgICAgcHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkID0gMTsKICAgIH0KCiAgICBtaWNyb3Byb3RvY29sc19hZGQodHlwZSwgKFB5T2JqZWN0KikmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSwgY2FzdGVyKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfcmVnaXN0ZXJfY29udmVydGVyKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIG9yaWdfbmFtZTsKICAgIFB5T2JqZWN0KiBuYW1lID0gTlVMTDsKICAgIFB5T2JqZWN0KiBjYWxsYWJsZTsKICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVU8iLCAmb3JpZ19uYW1lLCAmY2FsbGFibGUpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyogY29udmVydCB0aGUgbmFtZSB0byB1cHBlciBjYXNlICovCiAgICBuYW1lID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvcmlnX25hbWUsICJ1cHBlciIsICIiKTsKICAgIGlmICghbmFtZSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgaWYgKFB5RGljdF9TZXRJdGVtKGNvbnZlcnRlcnMsIG5hbWUsIGNhbGxhYmxlKSAhPSAwKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR2YWwgPSBQeV9Ob25lOwplcnJvcjoKICAgIFB5X1hERUNSRUYobmFtZSk7CiAgICByZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgUHlPYmplY3QqIGVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJl9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIHZvaWQgY29udmVydGVyc19pbml0KFB5T2JqZWN0KiBkaWN0KQp7CiAgICBjb252ZXJ0ZXJzID0gUHlEaWN0X05ldygpOwogICAgaWYgKCFjb252ZXJ0ZXJzKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJjb252ZXJ0ZXJzIiwgY29udmVydGVycyk7Cn0KCnN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewogICAgeyJjb25uZWN0IiwgIChQeUNGdW5jdGlvbiltb2R1bGVfY29ubmVjdCwgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBQeURvY19TVFIoIkNyZWF0ZXMgYSBjb25uZWN0aW9uLiIpfSwKICAgIHsiY29tcGxldGVfc3RhdGVtZW50IiwgIChQeUNGdW5jdGlvbiltb2R1bGVfY29tcGxldGUsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgUHlEb2NfU1RSKCJDaGVja3MgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBjb21wbGV0ZSBTUUwgc3RhdGVtZW50LiBOb24tc3RhbmRhcmQuIil9LAojaWZkZWYgSEFWRV9TSEFSRURfQ0FDSEUKICAgIHsiZW5hYmxlX3NoYXJlZF9jYWNoZSIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGUsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgUHlEb2NfU1RSKCJFbmFibGUgb3IgZGlzYWJsZSBzaGFyZWQgY2FjaGUgbW9kZSBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkLiBFeHBlcmltZW50YWwvTm9uLXN0YW5kYXJkLiIpfSwKI2VuZGlmCiAgICB7InJlZ2lzdGVyX2FkYXB0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2FkYXB0ZXIsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKCJSZWdpc3RlcnMgYW4gYWRhcHRlciB3aXRoIHB5c3FsaXRlJ3MgYWRhcHRlciByZWdpc3RyeS4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsicmVnaXN0ZXJfY29udmVydGVyIiwgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9yZWdpc3Rlcl9jb252ZXJ0ZXIsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKCJSZWdpc3RlcnMgYSBjb252ZXJ0ZXIgd2l0aCBweXNxbGl0ZS4gTm9uLXN0YW5kYXJkLiIpfSwKICAgIHsiYWRhcHQiLCAgKFB5Q0Z1bmN0aW9uKXBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0LCBNRVRIX1ZBUkFSR1MsIHBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0X2RvY30sCiAgICB7ImVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzIiwgIChQeUNGdW5jdGlvbillbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcywgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoIkVuYWJsZSBvciBkaXNhYmxlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aHJvd2luZyBlcnJvcnMgdG8gc3RkZXJyLiIpfSwKICAgIHtOVUxMLCBOVUxMfQp9OwoKc3RydWN0IF9JbnRDb25zdGFudFBhaXIgewogICAgY2hhciogY29uc3RhbnRfbmFtZTsKICAgIGludCBjb25zdGFudF92YWx1ZTsKfTsKCnR5cGVkZWYgc3RydWN0IF9JbnRDb25zdGFudFBhaXIgSW50Q29uc3RhbnRQYWlyOwoKc3RhdGljIEludENvbnN0YW50UGFpciBfaW50X2NvbnN0YW50c1tdID0gewogICAgeyJQQVJTRV9ERUNMVFlQRVMiLCBQQVJTRV9ERUNMVFlQRVN9LAogICAgeyJQQVJTRV9DT0xOQU1FUyIsIFBBUlNFX0NPTE5BTUVTfSwKCiAgICB7IlNRTElURV9PSyIsIFNRTElURV9PS30sCiAgICB7IlNRTElURV9ERU5ZIiwgU1FMSVRFX0RFTll9LAogICAgeyJTUUxJVEVfSUdOT1JFIiwgU1FMSVRFX0lHTk9SRX0sCiAgICB7IlNRTElURV9DUkVBVEVfSU5ERVgiLCBTUUxJVEVfQ1JFQVRFX0lOREVYfSwKICAgIHsiU1FMSVRFX0NSRUFURV9UQUJMRSIsIFNRTElURV9DUkVBVEVfVEFCTEV9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfSU5ERVgiLCBTUUxJVEVfQ1JFQVRFX1RFTVBfSU5ERVh9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfVEFCTEUiLCBTUUxJVEVfQ1JFQVRFX1RFTVBfVEFCTEV9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfVFJJR0dFUiIsIFNRTElURV9DUkVBVEVfVEVNUF9UUklHR0VSfSwKICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX1ZJRVciLCBTUUxJVEVfQ1JFQVRFX1RFTVBfVklFV30sCiAgICB7IlNRTElURV9DUkVBVEVfVFJJR0dFUiIsIFNRTElURV9DUkVBVEVfVFJJR0dFUn0sCiAgICB7IlNRTElURV9DUkVBVEVfVklFVyIsIFNRTElURV9DUkVBVEVfVklFV30sCiAgICB7IlNRTElURV9ERUxFVEUiLCBTUUxJVEVfREVMRVRFfSwKICAgIHsiU1FMSVRFX0RST1BfSU5ERVgiLCBTUUxJVEVfRFJPUF9JTkRFWH0sCiAgICB7IlNRTElURV9EUk9QX1RBQkxFIiwgU1FMSVRFX0RST1BfVEFCTEV9LAogICAgeyJTUUxJVEVfRFJPUF9URU1QX0lOREVYIiwgU1FMSVRFX0RST1BfVEVNUF9JTkRFWH0sCiAgICB7IlNRTElURV9EUk9QX1RFTVBfVEFCTEUiLCBTUUxJVEVfRFJPUF9URU1QX1RBQkxFfSwKICAgIHsiU1FMSVRFX0RST1BfVEVNUF9UUklHR0VSIiwgU1FMSVRFX0RST1BfVEVNUF9UUklHR0VSfSwKICAgIHsiU1FMSVRFX0RST1BfVEVNUF9WSUVXIiwgU1FMSVRFX0RST1BfVEVNUF9WSUVXfSwKICAgIHsiU1FMSVRFX0RST1BfVFJJR0dFUiIsIFNRTElURV9EUk9QX1RSSUdHRVJ9LAogICAgeyJTUUxJVEVfRFJPUF9WSUVXIiwgU1FMSVRFX0RST1BfVklFV30sCiAgICB7IlNRTElURV9JTlNFUlQiLCBTUUxJVEVfSU5TRVJUfSwKICAgIHsiU1FMSVRFX1BSQUdNQSIsIFNRTElURV9QUkFHTUF9LAogICAgeyJTUUxJVEVfUkVBRCIsIFNRTElURV9SRUFEfSwKICAgIHsiU1FMSVRFX1NFTEVDVCIsIFNRTElURV9TRUxFQ1R9LAogICAgeyJTUUxJVEVfVFJBTlNBQ1RJT04iLCBTUUxJVEVfVFJBTlNBQ1RJT059LAogICAgeyJTUUxJVEVfVVBEQVRFIiwgU1FMSVRFX1VQREFURX0sCiAgICB7IlNRTElURV9BVFRBQ0giLCBTUUxJVEVfQVRUQUNIfSwKICAgIHsiU1FMSVRFX0RFVEFDSCIsIFNRTElURV9ERVRBQ0h9LAojaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDIwMDEKICAgIHsiU1FMSVRFX0FMVEVSX1RBQkxFIiwgU1FMSVRFX0FMVEVSX1RBQkxFfSwKICAgIHsiU1FMSVRFX1JFSU5ERVgiLCBTUUxJVEVfUkVJTkRFWH0sCiNlbmRpZgojaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDAKICAgIHsiU1FMSVRFX0FOQUxZWkUiLCBTUUxJVEVfQU5BTFlaRX0sCiNlbmRpZgogICAgeyhjaGFyKilOVUxMLCAwfQp9OwoKUHlNT0RJTklUX0ZVTkMgaW5pdF9zcWxpdGUzKHZvaWQpCnsKICAgIFB5T2JqZWN0ICptb2R1bGUsICpkaWN0OwogICAgUHlPYmplY3QgKnRtcF9vYmo7CiAgICBpbnQgaTsKCiAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlKCJfc3FsaXRlMyIsIG1vZHVsZV9tZXRob2RzKTsKCiAgICBpZiAoIW1vZHVsZSB8fAogICAgICAgIChweXNxbGl0ZV9yb3dfc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHB5c3FsaXRlX2N1cnNvcl9zZXR1cF90eXBlcygpIDwgMCkgfHwKICAgICAgICAocHlzcWxpdGVfY29ubmVjdGlvbl9zZXR1cF90eXBlcygpIDwgMCkgfHwKICAgICAgICAocHlzcWxpdGVfY2FjaGVfc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHB5c3FsaXRlX3N0YXRlbWVudF9zZXR1cF90eXBlcygpIDwgMCkgfHwKICAgICAgICAocHlzcWxpdGVfcHJlcGFyZV9wcm90b2NvbF9zZXR1cF90eXBlcygpIDwgMCkKICAgICAgICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBQeV9JTkNSRUYoJnB5c3FsaXRlX0Nvbm5lY3Rpb25UeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJDb25uZWN0aW9uIiwgKFB5T2JqZWN0KikgJnB5c3FsaXRlX0Nvbm5lY3Rpb25UeXBlKTsKICAgIFB5X0lOQ1JFRigmcHlzcWxpdGVfQ3Vyc29yVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ3Vyc29yIiwgKFB5T2JqZWN0KikgJnB5c3FsaXRlX0N1cnNvclR5cGUpOwogICAgUHlfSU5DUkVGKCZweXNxbGl0ZV9DYWNoZVR5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlN0YXRlbWVudCIsIChQeU9iamVjdCopJnB5c3FsaXRlX1N0YXRlbWVudFR5cGUpOwogICAgUHlfSU5DUkVGKCZweXNxbGl0ZV9TdGF0ZW1lbnRUeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJDYWNoZSIsIChQeU9iamVjdCopICZweXNxbGl0ZV9DYWNoZVR5cGUpOwogICAgUHlfSU5DUkVGKCZweXNxbGl0ZV9QcmVwYXJlUHJvdG9jb2xUeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJQcmVwYXJlUHJvdG9jb2wiLCAoUHlPYmplY3QqKSAmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSk7CiAgICBQeV9JTkNSRUYoJnB5c3FsaXRlX1Jvd1R5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlJvdyIsIChQeU9iamVjdCopICZweXNxbGl0ZV9Sb3dUeXBlKTsKCiAgICBpZiAoIShkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2R1bGUpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgLyoqKiBDcmVhdGUgREItQVBJIEV4Y2VwdGlvbiBoaWVyYXJjaHkgKi8KCiAgICBpZiAoIShweXNxbGl0ZV9FcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkVycm9yIiwgUHlFeGNfRXhjZXB0aW9uLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkVycm9yIiwgcHlzcWxpdGVfRXJyb3IpOwoKICAgIGlmICghKHB5c3FsaXRlX1dhcm5pbmcgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5XYXJuaW5nIiwgUHlFeGNfRXhjZXB0aW9uLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIldhcm5pbmciLCBweXNxbGl0ZV9XYXJuaW5nKTsKCiAgICAvKiBFcnJvciBzdWJjbGFzc2VzICovCgogICAgaWYgKCEocHlzcWxpdGVfSW50ZXJmYWNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlcmZhY2VFcnJvciIsIHB5c3FsaXRlX0Vycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkludGVyZmFjZUVycm9yIiwgcHlzcWxpdGVfSW50ZXJmYWNlRXJyb3IpOwoKICAgIGlmICghKHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5EYXRhYmFzZUVycm9yIiwgcHlzcWxpdGVfRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiRGF0YWJhc2VFcnJvciIsIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IpOwoKICAgIC8qIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3Igc3ViY2xhc3NlcyAqLwoKICAgIGlmICghKHB5c3FsaXRlX0ludGVybmFsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlcm5hbEVycm9yIiwgcHlzcWxpdGVfRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJJbnRlcm5hbEVycm9yIiwgcHlzcWxpdGVfSW50ZXJuYWxFcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLk9wZXJhdGlvbmFsRXJyb3IiLCBweXNxbGl0ZV9EYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk9wZXJhdGlvbmFsRXJyb3IiLCBweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yKTsKCiAgICBpZiAoIShweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuUHJvZ3JhbW1pbmdFcnJvciIsIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUHJvZ3JhbW1pbmdFcnJvciIsIHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IpOwoKICAgIGlmICghKHB5c3FsaXRlX0ludGVncml0eUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuSW50ZWdyaXR5RXJyb3IiLCBweXNxbGl0ZV9EYXRhYmFzZUVycm9yLE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiSW50ZWdyaXR5RXJyb3IiLCBweXNxbGl0ZV9JbnRlZ3JpdHlFcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfRGF0YUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuRGF0YUVycm9yIiwgcHlzcWxpdGVfRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJEYXRhRXJyb3IiLCBweXNxbGl0ZV9EYXRhRXJyb3IpOwoKICAgIGlmICghKHB5c3FsaXRlX05vdFN1cHBvcnRlZEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuTm90U3VwcG9ydGVkRXJyb3IiLCBweXNxbGl0ZV9EYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk5vdFN1cHBvcnRlZEVycm9yIiwgcHlzcWxpdGVfTm90U3VwcG9ydGVkRXJyb3IpOwoKICAgIC8qIFdlIGp1c3QgbmVlZCAic29tZXRoaW5nIiB1bmlxdWUgZm9yIHB5c3FsaXRlX09wdGltaXplZFVuaWNvZGUuIEl0IGRvZXMgbm90IHJlYWxseQogICAgICogbmVlZCB0byBiZSBhIHN0cmluZyBzdWJjbGFzcy4gSnVzdCBhbnl0aGluZyB0aGF0IGNhbiBhY3QgYXMgYSBzcGVjaWFsCiAgICAgKiBtYXJrZXIgZm9yIHVzLiBTbyBJIHB1bGxlZCBQeUNlbGxfVHlwZSBvdXQgb2YgbXkgbWFnaWMgaGF0LgogICAgICovCiAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KikmUHlDZWxsX1R5cGUpOwogICAgcHlzcWxpdGVfT3B0aW1pemVkVW5pY29kZSA9IChQeU9iamVjdCopJlB5Q2VsbF9UeXBlOwogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk9wdGltaXplZFVuaWNvZGUiLCBweXNxbGl0ZV9PcHRpbWl6ZWRVbmljb2RlKTsKCiAgICAvKiBTZXQgaW50ZWdlciBjb25zdGFudHMgKi8KICAgIGZvciAoaSA9IDA7IF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X25hbWUgIT0gMDsgaSsrKSB7CiAgICAgICAgdG1wX29iaiA9IFB5TG9uZ19Gcm9tTG9uZyhfaW50X2NvbnN0YW50c1tpXS5jb25zdGFudF92YWx1ZSk7CiAgICAgICAgaWYgKCF0bXBfb2JqKSB7CiAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgfQogICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X25hbWUsIHRtcF9vYmopOwogICAgICAgIFB5X0RFQ1JFRih0bXBfb2JqKTsKICAgIH0KCiAgICBpZiAoISh0bXBfb2JqID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoUFlTUUxJVEVfVkVSU0lPTikpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJ2ZXJzaW9uIiwgdG1wX29iaik7CiAgICBQeV9ERUNSRUYodG1wX29iaik7CgogICAgaWYgKCEodG1wX29iaiA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHNxbGl0ZTNfbGlidmVyc2lvbigpKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgInNxbGl0ZV92ZXJzaW9uIiwgdG1wX29iaik7CiAgICBQeV9ERUNSRUYodG1wX29iaik7CgogICAgLyogaW5pdGlhbGl6ZSBtaWNyb3Byb3RvY29scyBsYXllciAqLwogICAgbWljcm9wcm90b2NvbHNfaW5pdChkaWN0KTsKCiAgICAvKiBpbml0aWFsaXplIHRoZSBkZWZhdWx0IGNvbnZlcnRlcnMgKi8KICAgIGNvbnZlcnRlcnNfaW5pdChkaWN0KTsKCiAgICBfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MgPSAwOwoKICAgIHB5c3FsaXRlX0Jhc2VUeXBlQWRhcHRlZCA9IDA7CgogICAgLyogT3JpZ2luYWwgY29tbWVudCBmb3JtIF9ic2RkYi5jIGluIHRoZSBQeXRob24gY29yZS4gVGhpcyBpcyBhbHNvIHN0aWxsCiAgICAgKiBuZWVkZWQgbm93YWRheXMgZm9yIFB5dGhvbiAyLjMvMi40LgogICAgICogCiAgICAgKiBQeUV2YWxfSW5pdFRocmVhZHMgaXMgY2FsbGVkIGhlcmUgZHVlIHRvIGEgcXVpcmsgaW4gcHl0aG9uIDEuNQogICAgICogLSAyLjIuMSAoYXQgbGVhc3QpIGFjY29yZGluZyB0byBSdXNzZWxsIFdpbGxpYW1zb24gPG1lcmVsQHd0Lm5ldD46CiAgICAgKiBUaGUgZ2xvYmFsIGludGVyZXByZXRlciBsb2NrIGlzIG5vdCBpbml0aWFsaXplZCB1bnRpbCB0aGUgZmlyc3QKICAgICAqIHRocmVhZCBpcyBjcmVhdGVkIHVzaW5nIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKCkgb3IgZm9yaygpIGlzCiAgICAgKiBjYWxsZWQuICB0aGF0IHdvdWxkIGNhdXNlIHRoZSBBTExPV19USFJFQURTIGhlcmUgdG8gc2VnZmF1bHQgZHVlCiAgICAgKiB0byBhIG51bGwgcG9pbnRlciByZWZlcmVuY2UgaWYgbm8gdGhyZWFkcyBvciBjaGlsZCBwcm9jZXNzZXMKICAgICAqIGhhdmUgYmVlbiBjcmVhdGVkLiAgVGhpcyB3b3JrcyBhcm91bmQgdGhhdCBhbmQgaXMgYSBuby1vcCBpZgogICAgICogdGhyZWFkcyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KICAgICAqICAoc2VlIHB5YnNkZGItdXNlcnMgbWFpbGluZyBsaXN0IHBvc3Qgb24gMjAwMi0wOC0wNykKICAgICAqLwogICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7CgplcnJvcjoKICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgTU9EVUxFX05BTUUgIjogaW5pdCBmYWlsZWQiKTsKICAgIH0KfQo=