LyoKKiBDb3B5cmlnaHQgqSB7MTk5OX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDEwLzIyLzk5ICAgIGFsYW4gICAgICAgIENyZWF0aW9uLgoqICAgMTEvMTEvOTkgICAgcmdpbGxhbSAgICAgQ29tcGxldGUgcG9ydCBmcm9tIEphdmEuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgUkJCSV9ICiNkZWZpbmUgUkJCSV9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKI2luY2x1ZGUgInVuaWNvZGUvYnJraXRlci5oIgojaW5jbHVkZSAidW5pY29kZS91ZGF0YS5oIgoKY2xhc3MgUnVsZUJhc2VkQnJlYWtJdGVyYXRvclRhYmxlczsKY2xhc3MgQnJlYWtJdGVyYXRvcjsKCi8qKgogKiA8cD5BIHN1YmNsYXNzIG9mIEJyZWFrSXRlcmF0b3Igd2hvc2UgYmVoYXZpb3IgaXMgc3BlY2lmaWVkIHVzaW5nIGEgbGlzdCBvZiBydWxlcy48L3A+CiAqIAogKiA8cD5UaGVyZSBhcmUgdHdvIGtpbmRzIG9mIHJ1bGVzLCB3aGljaCBhcmUgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnM6IDxpPnN1YnN0aXR1dGlvbnM8L2k+CiAqIGFuZCA8aT5yZWd1bGFyIGV4cHJlc3Npb25zLjwvaT48L3A+CiAqIAogKiA8cD5BIHN1YnN0aXR1dGlvbiBydWxlIGRlZmluZXMgYSBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gZXhwcmVzc2lvbi4gSXQKICogY29uc2lzdHMgb2YgYSBuYW1lLCB3aGljaCBpcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGNvbnRhaW5lZCBpbiBhbmdsZSBicmFja2V0cywgYW4gZXF1YWxzCiAqIHNpZ24sIGFuZCBhbiBleHByZXNzaW9uLiAoVGhlcmUgY2FuIGJlIG5vIHdoaXRlc3BhY2Ugb24gZWl0aGVyIHNpZGUgb2YgdGhlIGVxdWFscyBzaWduLikKICogVG8ga2VlcCBpdHMgc3ludGFjdGljIG1lYW5pbmcgaW50YWN0LCB0aGUgZXhwcmVzc2lvbiBtdXN0IGJlIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzIG9yCiAqIHNxdWFyZSBicmFja2V0cy4gQSBzdWJzdGl0dXRpb24gaXMgdmlzaWJsZSBhZnRlciBpdHMgZGVmaW5pdGlvbiwgYW5kIGlzIGZpbGxlZCBpbiB1c2luZwogKiBzaW1wbGUgdGV4dHVhbCBzdWJzdGl0dXRpb24uIFN1YnN0aXR1dGlvbiBkZWZpbml0aW9ucyBjYW4gY29udGFpbiBvdGhlciBzdWJzdGl0dXRpb25zLCBhcwogKiBsb25nIGFzIHRob3NlIHN1YnN0aXR1dGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQgZmlyc3QuIFN1YnN0aXR1dGlvbnMgYXJlIGdlbmVyYWxseSB1c2VkIHRvCiAqIG1ha2UgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgKHdoaWNoIGNhbiBnZXQgcXVpdGUgY29tcGxleCkgc2hvcnRlZCBhbmQgZWFzaWVyIHRvIHJlYWQuCiAqIFRoZXkgdHlwaWNhbGx5IGRlZmluZSBlaXRoZXIgY2hhcmFjdGVyIGNhdGVnb3JpZXMgb3IgY29tbW9ubHktdXNlZCBzdWJleHByZXNzaW9ucy48L3A+CiAqIAogKiA8cD5UaGVyZSBpcyBvbmUgc3BlY2lhbCBzdWJzdGl0dXRpb24uJm5ic3A7IElmIHRoZSBkZXNjcmlwdGlvbiBkZWZpbmVzIGEgc3Vic3RpdHV0aW9uCiAqIGNhbGxlZCAmcXVvdDsmbHQ7aWdub3JlJmd0OyZxdW90OywgdGhlIGV4cHJlc3Npb24gbXVzdCBiZSBhIFtdIGV4cHJlc3Npb24sIGFuZCB0aGUKICogZXhwcmVzc2lvbiBkZWZpbmVzIGEgc2V0IG9mIGNoYXJhY3RlcnMgKHRoZSAmcXVvdDs8ZW0+aWdub3JlIGNoYXJhY3RlcnM8L2VtPiZxdW90OykgdGhhdAogKiB3aWxsIGJlIHRyYW5zcGFyZW50IHRvIHRoZSBCcmVha0l0ZXJhdG9yLiZuYnNwOyBBIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgd2lsbCBicmVhayB0aGUKICogc2FtZSB3YXkgaXQgd291bGQgaWYgYW55IGlnbm9yZSBjaGFyYWN0ZXJzIGl0IGNvbnRhaW5zIGFyZSB0YWtlbiBvdXQuJm5ic3A7IEJyZWFrCiAqIHBvc2l0aW9ucyBuZXZlciBvY2N1ciBiZWZvZXIgaWdub3JlIGNoYXJhY3RlcnMuPC9wPgogKiAKICogPHA+QSByZWd1bGFyIGV4cHJlc3Npb24gdXNlcyBhIHN1YnNldCBvZiB0aGUgbm9ybWFsIFVuaXggcmVndWxhci1leHByZXNzaW9uIHN5bnRheCwgYW5kCiAqIGRlZmluZXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRvIGJlIGtlcHQgdG9nZXRoZXIuIFdpdGggb25lIHNpZ25pZmljYW50IGV4Y2VwdGlvbiwgdGhlCiAqIGl0ZXJhdG9yIHVzZXMgYSBsb25nZXN0LXBvc3NpYmxlLW1hdGNoIGFsZ29yaXRobSB3aGVuIG1hdGNoaW5nIHRleHQgdG8gcmVndWxhcgogKiBleHByZXNzaW9ucy4gVGhlIGl0ZXJhdG9yIGFsc28gdHJlYXRzIGRlc2NyaXB0aW9ucyBjb250YWluaW5nIG11bHRpcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMKICogYXMgaWYgdGhleSB3ZXJlIE9SZWQgdG9nZXRoZXIgKGkuZS4sIGFzIGlmIHRoZXkgd2VyZSBzZXBhcmF0ZWQgYnkgfCkuPC9wPgogKiAKICogPHA+VGhlIHNwZWNpYWwgY2hhcmFjdGVycyByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyLWV4cHJlc3Npb24gcGFyc2VyIGFyZSBhcyBmb2xsb3dzOjwvcD4KICogCiAqIDxibG9ja3F1b3RlPgogKiAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIj4KICogICAgIDx0cj4KICogICAgICAgPHRkIHdpZHRoPSI2JSI+KjwvdGQ+CiAqICAgICAgIDx0ZCB3aWR0aD0iOTQlIj5TcGVjaWZpZXMgdGhhdCB0aGUgZXhwcmVzc2lvbiBwcmVjZWRpbmcgdGhlIGFzdGVyaXNrIG1heSBvY2N1ciBhbnkgbnVtYmVyCiAqICAgICAgIG9mIHRpbWVzIChpbmNsdWRpbmcgbm90IGF0IGFsbCkuPC90ZD4KICogICAgIDwvdHI+CiAqICAgICA8dHI+CiAqICAgICAgIDx0ZCB3aWR0aD0iNiUiPnt9PC90ZD4KICogICAgICAgPHRkIHdpZHRoPSI5NCUiPkVuY2xvc2VzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGlzIG9wdGlvbmFsLjwvdGQ+CiAqICAgICA8L3RyPgogKiAgICAgPHRyPgogKiAgICAgICA8dGQgd2lkdGg9IjYlIj4oKTwvdGQ+CiAqICAgICAgIDx0ZCB3aWR0aD0iOTQlIj5FbmNsb3NlcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuJm5ic3A7IElmIGZvbGxvd2VkIGJ5ICosIHRoZSBzZXF1ZW5jZQogKiAgICAgICByZXBlYXRzLiZuYnNwOyBPdGhlcndpc2UsIHRoZSBwYXJlbnRoZXNlcyBhcmUganVzdCBhIGdyb3VwaW5nIGRldmljZSBhbmQgYSB3YXkgdG8gZGVsaW1pdAogKiAgICAgICB0aGUgZW5kcyBvZiBleHByZXNzaW9ucyBjb250YWluaW5nIHwuPC90ZD4KICogICAgIDwvdHI+CiAqICAgICA8dHI+CiAqICAgICAgIDx0ZCB3aWR0aD0iNiUiPnw8L3RkPgogKiAgICAgICA8dGQgd2lkdGg9Ijk0JSI+U2VwYXJhdGVzIHR3byBhbHRlcm5hdGl2ZSBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycy4mbmJzcDsgRWl0aGVyIG9uZQogKiAgICAgICBzZXF1ZW5jZSBvciB0aGUgb3RoZXIsIGJ1dCBub3QgYm90aCwgbWF0Y2hlcyB0aGlzIGV4cHJlc3Npb24uJm5ic3A7IFRoZSB8IGNoYXJhY3RlciBjYW4KICogICAgICAgb25seSBvY2N1ciBpbnNpZGUgKCkuPC90ZD4KICogICAgIDwvdHI+CiAqICAgICA8dHI+CiAqICAgICAgIDx0ZCB3aWR0aD0iNiUiPi48L3RkPgogKiAgICAgICA8dGQgd2lkdGg9Ijk0JSI+TWF0Y2hlcyBhbnkgY2hhcmFjdGVyLjwvdGQ+CiAqICAgICA8L3RyPgogKiAgICAgPHRyPgogKiAgICAgICA8dGQgd2lkdGg9IjYlIj4qPzwvdGQ+CiAqICAgICAgIDx0ZCB3aWR0aD0iOTQlIj5TcGVjaWZpZXMgYSBub24tZ3JlZWR5IGFzdGVyaXNrLiZuYnNwOyAqPyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgKiwgZXhjZXB0CiAqICAgICAgIHdoZW4gdGhlcmUgaXMgb3ZlcmxhcCBiZXR3ZWVuIHRoZSBsYXN0IGdyb3VwIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGV4cHJlc3Npb24gcHJlY2VkaW5nIHRoZQogKiAgICAgICAqIGFuZCB0aGUgZmlyc3QgZ3JvdXAgb2YgY2hhcmFjdGVycyBmb2xsb3dpbmcgdGhlICouJm5ic3A7IFdoZW4gdGhlcmUgaXMgdGhpcyBraW5kIG9mCiAqICAgICAgIG92ZXJsYXAsICogd2lsbCBtYXRjaCB0aGUgbG9uZ2VzdCBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgbWF0Y2ggdGhlIGV4cHJlc3Npb24gYmVmb3JlCiAqICAgICAgIHRoZSAqLCBhbmQgKj8gd2lsbCBtYXRjaCB0aGUgc2hvcnRlc3Qgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBtYXRjaGluZyB0aGUgZXhwcmVzc2lvbgogKiAgICAgICBiZWZvcmUgdGhlICo/LiZuYnNwOyBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgJnF1b3Q7eHh5eHl5eXh5eHl4eHl4eXh5eSZxdW90OyBpbiB0aGUgdGV4dCwKICogICAgICAgJnF1b3Q7eFt4eV0qeCZxdW90OyB3aWxsIG1hdGNoIHRocm91Z2ggdG8gdGhlIGxhc3QgeCAoaS5lLiwgJnF1b3Q7PHN0cm9uZz54eHl4eXl5eHl4eXh4eXh5eDwvc3Ryb25nPnl5JnF1b3Q7LAogKiAgICAgICBidXQgJnF1b3Q7eFt4eV0qP3gmcXVvdDsgd2lsbCBvbmx5IG1hdGNoIHRoZSBmaXJzdCB0d28geGVzICgmcXVvdDs8c3Ryb25nPnh4PC9zdHJvbmc+eXh5eXl4eXh5eHh5eHl4eXkmcXVvdDspLjwvdGQ+CiAqICAgICA8L3RyPgogKiAgICAgPHRyPgogKiAgICAgICA8dGQgd2lkdGg9IjYlIj5bXTwvdGQ+CiAqICAgICAgIDx0ZCB3aWR0aD0iOTQlIj5TcGVjaWZpZXMgYSBncm91cCBvZiBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXJzLiZuYnNwOyBBIFtdIGV4cHJlc3Npb24gd2lsbAogKiAgICAgICBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlciB0aGF0IGlzIHNwZWNpZmllZCBpbiB0aGUgW10gZXhwcmVzc2lvbi4mbmJzcDsgRm9yIG1vcmUgb24gdGhlCiAqICAgICAgIHN5bnRheCBvZiBbXSBleHByZXNzaW9ucywgc2VlIGJlbG93LjwvdGQ+CiAqICAgICA8L3RyPgogKiAgICAgPHRyPgogKiAgICAgICA8dGQgd2lkdGg9IjYlIj4vPC90ZD4KICogICAgICAgPHRkIHdpZHRoPSI5NCUiPlNwZWNpZmllcyB3aGVyZSB0aGUgYnJlYWsgcG9zaXRpb24gc2hvdWxkIGdvIGlmIHRleHQgbWF0Y2hlcyB0aGlzCiAqICAgICAgIGV4cHJlc3Npb24uJm5ic3A7IChlLmcuLCAmcXVvdDtbYS16XSYjNDI7L1s6WnM6XSoxJnF1b3Q7IHdpbGwgbWF0Y2ggaWYgdGhlIGl0ZXJhdG9yIHNlZXMgYSBydW4KICogICAgICAgb2YgbGV0dGVycywgZm9sbG93ZWQgYnkgYSBydW4gb2Ygd2hpdGVzcGFjZSwgZm9sbG93ZWQgYnkgYSBkaWdpdCwgYnV0IHRoZSBicmVhayBwb3NpdGlvbgogKiAgICAgICB3aWxsIGFjdHVhbGx5IGdvIGJlZm9yZSB0aGUgd2hpdGVzcGFjZSkuJm5ic3A7IEV4cHJlc3Npb25zIHRoYXQgZG9uJ3QgY29udGFpbiAvIHB1dCB0aGUKICogICAgICAgYnJlYWsgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgbWF0Y2hpbmcgdGV4dC48L3RkPgogKiAgICAgPC90cj4KICogICAgIDx0cj4KICogICAgICAgPHRkIHdpZHRoPSI2JSI+XDwvdGQ+CiAqICAgICAgIDx0ZCB3aWR0aD0iOTQlIj5Fc2NhcGUgY2hhcmFjdGVyLiZuYnNwOyBUaGUgXCBpdHNlbGYgaXMgaWdub3JlZCwgYnV0IGNhdXNlcyB0aGUgbmV4dAogKiAgICAgICBjaGFyYWN0ZXIgdG8gYmUgdHJlYXRlZCBhcyBsaXRlcmFsIGNoYXJhY3Rlci4mbmJzcDsgVGhpcyBoYXMgbm8gZWZmZWN0IGZvciBtYW55CiAqICAgICAgIGNoYXJhY3RlcnMsIGJ1dCBmb3IgdGhlIGNoYXJhY3RlcnMgbGlzdGVkIGFib3ZlLCB0aGlzIGRlcHJpdmVzIHRoZW0gb2YgdGhlaXIgc3BlY2lhbAogKiAgICAgICBtZWFuaW5nLiZuYnNwOyAoVGhlcmUgYXJlIG5vIHNwZWNpYWwgZXNjYXBlIHNlcXVlbmNlcyBmb3IgVW5pY29kZSBjaGFyYWN0ZXJzLCBvciB0YWJzIGFuZAogKiAgICAgICBuZXdsaW5lczsgdGhlc2UgYXJlIGFsbCBoYW5kbGVkIGJ5IGEgaGlnaGVyLWxldmVsIHByb3RvY29sLiZuYnNwOyBJbiBhIEphdmEgc3RyaW5nLAogKiAgICAgICAmcXVvdDtcbiZxdW90OyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIGxpdGVyYWwgbmV3bGluZSBjaGFyYWN0ZXIgYnkgdGhlIHRpbWUgdGhlCiAqICAgICAgIHJlZ3VsYXItZXhwcmVzc2lvbiBwYXJzZXIgc2VlcyBpdC4mbmJzcDsgT2YgY291cnNlLCB0aGlzIG1lYW5zIHRoYXQgXCBzZXF1ZW5jZXMgdGhhdCBhcmUKICogICAgICAgdmlzaWJsZSB0byB0aGUgcmVnZXhwIHBhcnNlciBtdXN0IGJlIHdyaXR0ZW4gYXMgXFwgd2hlbiBpbnNpZGUgYSBKYXZhIHN0cmluZy4pJm5ic3A7IEFsbAogKiAgICAgICBjaGFyYWN0ZXJzIGluIHRoZSBBU0NJSSByYW5nZSBleGNlcHQgZm9yIGxldHRlcnMsIGRpZ2l0cywgYW5kIGNvbnRyb2wgY2hhcmFjdGVycyBhcmUKICogICAgICAgcmVzZXJ2ZWQgY2hhcmFjdGVycyB0byB0aGUgcGFyc2VyIGFuZCBtdXN0IGJlIHByZWNlZGVkIGJ5IFwgZXZlbiBpZiB0aGV5IGN1cnJlbnRseSBkb24ndAogKiAgICAgICBtZWFuIGFueXRoaW5nLjwvdGQ+CiAqICAgICA8L3RyPgogKiAgICAgPHRyPgogKiAgICAgICA8dGQgd2lkdGg9IjYlIj4hPC90ZD4KICogICAgICAgPHRkIHdpZHRoPSI5NCUiPklmICEgYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uLCBpdCB0ZWxscyB0aGUgcmVnZXhwCiAqICAgICAgIHBhcnNlciB0aGF0IHRoaXMgZXhwcmVzc2lvbiBzcGVjaWZpZXMgdGhlIGJhY2t3YXJkcy1pdGVyYXRpb24gYmVoYXZpb3Igb2YgdGhlIGl0ZXJhdG9yLAogKiAgICAgICBhbmQgbm90IGl0cyBub3JtYWwgaXRlcmF0aW9uIGJlaGF2aW9yLiZuYnNwOyBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IHVzZWQgaW4gc2l0dWF0aW9ucwogKiAgICAgICB3aGVyZSB0aGUgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQgYmFja3dhcmRzLWl0ZXJhdGlvbiBicmhhdmlvciBkb2Vzbid0IHByb2R1Y2UKICogICAgICAgc2F0aXNmYWN0b3J5IHJlc3VsdHMgYW5kIG11c3QgYmUgc3VwcGxlbWVudGVkIHdpdGggZXh0cmEgY2xpZW50LXNwZWNpZmllZCBydWxlcy48L3RkPgogKiAgICAgPC90cj4KICogICAgIDx0cj4KICogICAgICAgPHRkIHdpZHRoPSI2JSI+PGVtPihhbGwgb3RoZXJzKTwvZW0+PC90ZD4KICogICAgICAgPHRkIHdpZHRoPSI5NCUiPkFsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFzIGxpdGVyYWwgY2hhcmFjdGVycywgd2hpY2ggbXVzdCBtYXRjaAogKiAgICAgICB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIocykgaW4gdGhlIHRleHQgZXhhY3RseS48L3RkPgogKiAgICAgPC90cj4KICogICA8L3RhYmxlPgogKiA8L2Jsb2NrcXVvdGU+CiAqIAogKiA8cD5XaXRoaW4gYSBbXSBleHByZXNzaW9uLCBhIG51bWJlciBvZiBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQogKiBncm91cHMgb2YgY2hhcmFjdGVyczo8L3A+CiAqIAogKiA8YmxvY2txdW90ZT4KICogICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSI+CiAqICAgICA8dHI+CiAqICAgICAgIDx0ZCB3aWR0aD0iNiUiPi08L3RkPgogKiAgICAgICA8dGQgd2lkdGg9Ijk0JSI+U3BlY2lmaWVzIGEgcmFuZ2Ugb2YgbWF0Y2hpbmcgY2hhcmFjdGVycy4mbmJzcDsgRm9yIGV4YW1wbGUKICogICAgICAgJnF1b3Q7W2EtcF0mcXVvdDsgbWF0Y2hlcyBhbGwgbG93ZXJjYXNlIExhdGluIGxldHRlcnMgZnJvbSBhIHRvIHAgKGluY2x1c2l2ZSkuJm5ic3A7IFRoZSAtCiAqICAgICAgIHNpZ24gc3BlY2lmaWVzIHJhbmdlcyBvZiBjb250aW51b3VzIFVuaWNvZGUgbnVtZXJpYyB2YWx1ZXMsIG5vdCByYW5nZXMgb2YgY2hhcmFjdGVycyBpbiBhCiAqICAgICAgIGxhbmd1YWdlJ3MgYWxwaGFiZXRpY2FsIG9yZGVyOiAmcXVvdDtbYS16XSZxdW90OyBkb2Vzbid0IGluY2x1ZGUgY2FwaXRhbCBsZXR0ZXJzLCBub3IgZG9lcwogKiAgICAgICBpdCBpbmNsdWRlIGFjY2VudGVkIGxldHRlcnMgc3VjaCBhcyBhLXVtbGF1dC48L3RkPgogKiAgICAgPC90cj4KICogICAgIDx0cj4KICogICAgICAgPHRkIHdpZHRoPSI2JSI+Ojo8L3RkPgogKiAgICAgICA8dGQgd2lkdGg9Ijk0JSI+QSBwYWlyIG9mIGNvbG9ucyBjb250YWluaW5nIGEgb25lLSBvciB0d28tbGV0dGVyIGNvZGUgbWF0Y2hlcyBhbGwKICogICAgICAgY2hhcmFjdGVycyBpbiB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlIGNhdGVnb3J5LiZuYnNwOyBUaGUgdHdvLWxldHRlciBjb2RlcyBhcmUgdGhlIHNhbWUKICogICAgICAgYXMgdGhlIHR3by1sZXR0ZXIgY29kZXMgaW4gdGhlIFVuaWNvZGUgZGF0YWJhc2UgKGZvciBleGFtcGxlLCAmcXVvdDtbOlNjOjpTbTpdJnF1b3Q7CiAqICAgICAgIG1hdGNoZXMgYWxsIGN1cnJlbmN5IHN5bWJvbHMgYW5kIGFsbCBtYXRoIHN5bWJvbHMpLiZuYnNwOyBTcGVjaWZ5aW5nIGEgb25lLWxldHRlciBjb2RlIGlzCiAqICAgICAgIHRoZSBzYW1lIGFzIHNwZWNpZnlpbmcgYWxsIHR3by1sZXR0ZXIgY29kZXMgdGhhdCBiZWdpbiB3aXRoIHRoYXQgbGV0dGVyIChmb3IgZXhhbXBsZSwKICogICAgICAgJnF1b3Q7WzpMOl0mcXVvdDsgbWF0Y2hlcyBhbGwgbGV0dGVycywgYW5kIGlzIGVxdWl2YWxlbnQgdG8KICogICAgICAgJnF1b3Q7WzpMdTo6TGw6OkxvOjpMbTo6THQ6XSZxdW90OykuJm5ic3A7IEFueXRoaW5nIG90aGVyIHRoYW4gYSB2YWxpZCB0d28tbGV0dGVyIFVuaWNvZGUKICogICAgICAgY2F0ZWdvcnkgY29kZSBvciBhIHNpbmdsZSBsZXR0ZXIgdGhhdCBiZWdpbnMgYSBVbmljb2RlIGNhdGVnb3J5IGNvZGUgaXMgaWxsZWdhbCB3aXRoaW4KICogICAgICAgY29sb25zLjwvdGQ+CiAqICAgICA8L3RyPgogKiAgICAgPHRyPgogKiAgICAgICA8dGQgd2lkdGg9IjYlIj5bXTwvdGQ+CiAqICAgICAgIDx0ZCB3aWR0aD0iOTQlIj5bXSBleHByZXNzaW9ucyBjYW4gbmVzdC4mbmJzcDsgVGhpcyBoYXMgbm8gZWZmZWN0LCBleGNlcHQgd2hlbiB1c2VkIGluCiAqICAgICAgIGNvbmp1bmN0aW9uIHdpdGggdGhlIF4gdG9rZW4uPC90ZD4KICogICAgIDwvdHI+CiAqICAgICA8dHI+CiAqICAgICAgIDx0ZCB3aWR0aD0iNiUiPl48L3RkPgogKiAgICAgICA8dGQgd2lkdGg9Ijk0JSI+RXhjbHVkZXMgdGhlIGNoYXJhY3RlciAob3IgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIFtdIGV4cHJlc3Npb24pIGZvbGxvd2luZwogKiAgICAgICBpdCBmcm9tIHRoZSBncm91cCBvZiBjaGFyYWN0ZXJzLiZuYnNwOyBGb3IgZXhhbXBsZSwgJnF1b3Q7W2Etel5wXSZxdW90OyBtYXRjaGVzIGFsbCBMYXRpbgogKiAgICAgICBsb3dlcmNhc2UgbGV0dGVycyBleGNlcHQgcC4mbmJzcDsgJnF1b3Q7WzpMOl5bXHU0ZTAwLVx1OWZmZl1dJnF1b3Q7IG1hdGNoZXMgYWxsIGxldHRlcnMKICogICAgICAgZXhjZXB0IHRoZSBIYW4gaWRlb2dyYXBocy48L3RkPgogKiAgICAgPC90cj4KICogICAgIDx0cj4KICogICAgICAgPHRkIHdpZHRoPSI2JSI+PGVtPihhbGwgb3RoZXJzKTwvZW0+PC90ZD4KICogICAgICAgPHRkIHdpZHRoPSI5NCUiPkFsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFzIGxpdGVyYWwgY2hhcmFjdGVycy4mbmJzcDsgKEZvcgogKiAgICAgICBleGFtcGxlLCAmcXVvdDtbYWVpb3VdJnF1b3Q7IHNwZWNpZmllcyBqdXN0IHRoZSBsZXR0ZXJzIGEsIGUsIGksIG8sIGFuZCB1Lik8L3RkPgogKiAgICAgPC90cj4KICogICA8L3RhYmxlPgogKiA8L2Jsb2NrcXVvdGU+CiAqIAogKiA8cD5Gb3IgYSBtb3JlIGNvbXBsZXRlIGV4cGxhbmF0aW9uLCBzZWUgPGEKICogaHJlZj0iaHR0cDovL3d3dy5pYm0uY29tL2phdmEvZWR1Y2F0aW9uL2JvdW5kYXJpZXMvYm91bmRhcmllcy5odG1sIj5odHRwOi8vd3d3LmlibS5jb20vamF2YS9lZHVjYXRpb24vYm91bmRhcmllcy9ib3VuZGFyaWVzLmh0bWw8L2E+LgogKiAmbmJzcDsgRm9yIGV4YW1wbGVzLCBzZWUgdGhlIHJlc291cmNlIGRhdGEgKHdoaWNoIGlzIGFubm90YXRlZCkuPC9wPgogKgogKiBAYXV0aG9yIFJpY2hhcmQgR2lsbGFtCiAqLwpjbGFzcyBVX0kxOE5fQVBJIFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IgOiBwdWJsaWMgQnJlYWtJdGVyYXRvciB7CgpwdWJsaWM6CiAgICAvKioKICAgICAqIEEgdG9rZW4gdXNlZCBhcyBhIGNoYXJhY3Rlci1jYXRlZ29yeSB2YWx1ZSB0byBpZGVudGlmeSBpZ25vcmUgY2hhcmFjdGVycwogICAgICovCiAgICBzdGF0aWMgaW50OF90IElHTk9SRTsKCnByaXZhdGU6CiAgICAvKioKICAgICAqIFRoZSBzdGF0ZSBudW1iZXIgb2YgdGhlIHN0YXJ0aW5nIHN0YXRlCiAgICAgKi8KICAgIHN0YXRpYyBpbnQxNl90IFNUQVJUX1NUQVRFOwoKICAgIC8qKgogICAgICogVGhlIHN0YXRlLXRyYW5zaXRpb24gdmFsdWUgaW5kaWNhdGluZyAic3RvcCIKICAgICAqLwogICAgc3RhdGljIGludDE2X3QgU1RPUF9TVEFURTsKCnByb3RlY3RlZDoKICAgIC8qKgogICAgICogVGhlIGNoYXJhY3RlciBpdGVyYXRvciB0aHJvdWdoIHdoaWNoIHRoaXMgQnJlYWtJdGVyYXRvciBhY2Nlc3NlcyB0aGUgdGV4dAogICAgICovCiAgICBDaGFyYWN0ZXJJdGVyYXRvciogdGV4dDsKCiAgICAvKioKICAgICAqIFRoZSBkYXRhIHRhYmxlcyB0aGlzIGl0ZXJhdG9yIHVzZXMgdG8gZGV0ZXJtaW5lIHRoZSBicmVhayBwb3NpdGlvbnMKICAgICAqLwogICAgUnVsZUJhc2VkQnJlYWtJdGVyYXRvclRhYmxlcyogdGFibGVzOwoKcHJpdmF0ZToKICAgIC8qKgogICAgICogQ2xhc3MgSUQKICAgICAqLwogICAgc3RhdGljIGNoYXIgZmdDbGFzc0lEOwovKgogKiBIU1lTOiBUbyBiZSByZXZpc2l0ZWQsIG9uY2UgdGhlIGN0b3IgYXJlIG1hZGUgcHVibGljLgogKi8KIHByb3RlY3RlZDoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIGNvbnN0cnVjdG9ycwogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgCi8vIFRoaXMgY29uc3RydWN0b3IgdXNlcyB0aGUgdWRhdGEgaW50ZXJmYWNlIHRvIGNyZWF0ZSBhIEJyZWFrSXRlcmF0b3Igd2hvc2UKLy8gaW50ZXJuYWwgdGFibGVzIGxpdmUgaW4gYSBtZW1vcnktbWFwcGVkIGZpbGUuICAiaW1hZ2UiIGlzIGEgcG9pbnRlciB0byB0aGUKLy8gYmVnaW5uaW5nIG9mIHRoYXQgZmlsZS4KUnVsZUJhc2VkQnJlYWtJdGVyYXRvcihVRGF0YU1lbW9yeSogaW1hZ2UpOwoKIHB1YmxpYzoKICAgIC8qKgogICAgICogQ29weSBjb25zdHJ1Y3Rvci4gIFdpbGwgcHJvZHVjZSBhIGNvbGxhdG9yIHdpdGggdGhlIHNhbWUgYmVoYXZpb3IsCiAgICAgKiBhbmQgd2hpY2ggaXRlcmF0ZXMgb3ZlciB0aGUgc2FtZSB0ZXh0LCBhcyB0aGUgb25lIHBhc3NlZCBpbi4KICAgICAqLwogICAgUnVsZUJhc2VkQnJlYWtJdGVyYXRvcihjb25zdCBSdWxlQmFzZWRCcmVha0l0ZXJhdG9yJiB0aGF0KTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBib2lsZXJwbGF0ZQogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3RvcgogICAgICovCiAgICB2aXJ0dWFsIH5SdWxlQmFzZWRCcmVha0l0ZXJhdG9yKCk7CgogICAgLyoqCiAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9yLiAgU2V0cyB0aGlzIGl0ZXJhdG9yIHRvIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IsCiAgICAgKiBhbmQgaXRlcmF0ZSBvdmVyIHRoZSBzYW1lIHRleHQsIGFzIHRoZSBvbmUgcGFzc2VkIGluLgogICAgICovCiAgICBSdWxlQmFzZWRCcmVha0l0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUnVsZUJhc2VkQnJlYWtJdGVyYXRvciYgdGhhdCk7CgogICAgLyoqCiAgICAgKiBFcXVhbGl0eSBvcGVyYXRvci4gIFJldHVybnMgVFJVRSBpZiBib3RoIEJyZWFrSXRlcmF0b3JzIGFyZSBvZiB0aGUKICAgICAqIHNhbWUgY2xhc3MsIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IsIGFuZCBpdGVyYXRlIG92ZXIgdGhlIHNhbWUgdGV4dC4KICAgICAqLwogICAgdmlydHVhbCBVQm9vbCBvcGVyYXRvcj09KGNvbnN0IEJyZWFrSXRlcmF0b3ImIHRoYXQpIGNvbnN0OwoKICAgIC8qKgogICAgICogTm90LWVxdWFsIG9wZXJhdG9yLiAgSWYgb3BlcmF0b3I9PSByZXR1cm5zIFRSVUUsIHRoaXMgcmV0dXJucyBGQUxTRSwKICAgICAqIGFuZCB2aWNlIHZlcnNhLgogICAgICovCiAgICBVQm9vbCBvcGVyYXRvciE9KGNvbnN0IEJyZWFrSXRlcmF0b3ImIHRoYXQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3Igd2l0aCB0aGUgc2FtZQogICAgICogYmVoYXZpb3IsIGFuZCBpdGVyYXRpbmcgb3ZlciB0aGUgc2FtZSB0ZXh0LCBhcyB0aGlzIG9uZS4KICAgICAqLwogICAgdmlydHVhbCBCcmVha0l0ZXJhdG9yKiBjbG9uZSh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIENvbXB1dGUgYSBoYXNoIGNvZGUgZm9yIHRoaXMgQnJlYWtJdGVyYXRvcgogICAgICogQHJldHVybiBBIGhhc2ggY29kZQogICAgICovCiAgICB2aXJ0dWFsIGludDMyX3QgaGFzaENvZGUodm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiB1c2VkIHRvIGNyZWF0ZSB0aGlzIGl0ZXJhdG9yCiAgICAgKi8KICAgIHZpcnR1YWwgY29uc3QgVW5pY29kZVN0cmluZyYgZ2V0UnVsZXModm9pZCkgY29uc3Q7CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQnJlYWtJdGVyYXRvciBvdmVycmlkZXMKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIFJldHVybiBhIENoYXJhY3Rlckl0ZXJhdG9yIG92ZXIgdGhlIHRleHQgYmVpbmcgYW5hbHl6ZWQuICBUaGlzIHZlcnNpb24KICAgICAqIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFjdHVhbCBDaGFyYWN0ZXJJdGVyYXRvciB3ZSdyZSB1c2luZyBpbnRlcm5hbGx5LgogICAgICogQ2hhbmdpbmcgdGhlIHN0YXRlIG9mIHRoaXMgaXRlcmF0b3IgY2FuIGhhdmUgdW5kZWZpbmVkIGNvbnNlcXVlbmNlcy4gIElmCiAgICAgKiB5b3UgbmVlZCB0byBjaGFuZ2UgaXQsIGNsb25lIGl0IGZpcnN0LgogICAgICogQHJldHVybiBBbiBpdGVyYXRvciBvdmVyIHRoZSB0ZXh0IGJlaW5nIGFuYWx5emVkLgogICAgICovCiAgICB2aXJ0dWFsIGNvbnN0IENoYXJhY3Rlckl0ZXJhdG9yJiBnZXRUZXh0KHZvaWQpIGNvbnN0OwoKI2lmZGVmIElDVV9FTkFCTEVfREVQUkVDQVRFRF9CUkVBS0lURVJBVE9SCiAgICAvKioKICAgICAqIFJldHVybnMgYSBuZXdseS1jcmVhdGVkIENoYXJhY3Rlckl0ZXJhdG9yIHRoYXQgdGhlIGNhbGxlciBpcyB0byB0YWtlCiAgICAgKiBvd25lcnNoaXAgb2YuCiAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciAyMDAwLURlYy0zMS4KICAgICAqIFRISVMgRlVOQ1RJT04gU0hPVUxEIE5PVCBCRSBIRVJFLiAgSVQnUyBIRVJFIEJFQ0FVU0UgQnJlYWtJdGVyYXRvciBERUZJTkVTCiAgICAgKiBJVCBBUyBQVVJFIFZJUlRVQUwsIEZPUkNJTkcgUkJCSSBUTyBJTVBMRU1FTlQgSVQuICBJVCBTSE9VTEQgQkUgUkVNT1ZFRAogICAgICogRlJPTSAqQk9USCogQ0xBU1NFUy4gIFVzZSBnZXRUZXh0KCkgaW5zdGVhZC4KICAgICAqLwogICAgdmlydHVhbCBDaGFyYWN0ZXJJdGVyYXRvciogY3JlYXRlVGV4dCh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIFNldCB0aGUgaXRlcmF0b3IgdG8gYW5hbHl6ZSBhIG5ldyBwaWVjZSBvZiB0ZXh0LiAgVGhpcyBmdW5jdGlvbiByZXNldHMKICAgICAqIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBwb3NpdGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LgogICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYW5hbHl6ZS4KICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBUSElTIEZVTkNUSU9OIFNIT1VMRCBOT1QgQkUgSEVSRS4gIElUJ1MgSEVSRSBCRUNBVVNFIEJyZWFrSXRlcmF0b3IgREVGSU5FUwogICAgICogSVQgQVMgUFVSRSBWSVJUVUFMLCBGT1JDSU5HIFJCQkkgVE8gSU1QTEVNRU5UIElULiAgSVQgU0hPVUxEIEJFIFJFTU9WRUQKICAgICAqIEZST00gKkJPVEgqIENMQVNTRVMuIFVzZSB0aGUgb3RoZXIgc2V0VGV4dCgpIGluc3RlYWQuCiAgICAgKi8KICAgIHZpcnR1YWwgdm9pZCBzZXRUZXh0KGNvbnN0IFVuaWNvZGVTdHJpbmcqIG5ld1RleHQpOwojZW5kaWYKCiAgICAvKioKICAgICAqIFNldCB0aGUgaXRlcmF0b3IgdG8gYW5hbHl6ZSBhIG5ldyBwaWVjZSBvZiB0ZXh0LiAgVGhpcyBmdW5jdGlvbiByZXNldHMKICAgICAqIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBwb3NpdGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LgogICAgICogQHBhcmFtIG5ld1RleHQgQW4gaXRlcmF0b3Igb3ZlciB0aGUgdGV4dCB0byBhbmFseXplLiAgVGhlIEJyZWFrSXRlcmF0b3IKICAgICAqIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgY2hhcmFjdGVyIGl0ZXJhdG9yLiAgVGhlIGNhbGxlciBNVVNUIE5PVCBkZWxldGUgaXQhCiAgICAgKi8KICAgIHZpcnR1YWwgdm9pZCBhZG9wdFRleHQoQ2hhcmFjdGVySXRlcmF0b3IqIG5ld1RleHQpOwoKICAgIC8qKgogICAgICogU2V0IHRoZSBpdGVyYXRvciB0byBhbmFseXplIGEgbmV3IHBpZWNlIG9mIHRleHQuICBUaGlzIGZ1bmN0aW9uIHJlc2V0cwogICAgICogdGhlIGN1cnJlbnQgaXRlcmF0aW9uIHBvc2l0aW9uIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuCiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBhbmFseXplLgogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgc2V0VGV4dChjb25zdCBVbmljb2RlU3RyaW5nJiBuZXdUZXh0KTsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIHBvc2l0aW9uIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuCiAgICAgKiAoaS5lLiwgdGhlIENoYXJhY3Rlckl0ZXJhdG9yJ3Mgc3RhcnRpbmcgb2Zmc2V0KS4KICAgICAqIEByZXR1cm4gVGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LgogICAgICovCiAgICB2aXJ0dWFsIGludDMyX3QgZmlyc3Qodm9pZCk7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZSB0ZXh0LgogICAgICogKGkuZS4sIHRoZSBDaGFyYWN0ZXJJdGVyYXRvcidzIGVuZGluZyBvZmZzZXQpLgogICAgICogQHJldHVybiBUaGUgdGV4dCdzIHBhc3QtdGhlLWVuZCBvZmZzZXQuCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBsYXN0KHZvaWQpOwoKICAgIC8qKgogICAgICogQWR2YW5jZXMgdGhlIGl0ZXJhdG9yIGVpdGhlciBmb3J3YXJkIG9yIGJhY2t3YXJkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHN0ZXBzLgogICAgICogTmVnYXRpdmUgdmFsdWVzIG1vdmUgYmFja3dhcmQsIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgbW92ZSBmb3J3YXJkLiAgVGhpcyBpcwogICAgICogZXF1aXZhbGVudCB0byByZXBlYXRlZGx5IGNhbGxpbmcgbmV4dCgpIG9yIHByZXZpb3VzKCkuCiAgICAgKiBAcGFyYW0gbiBUaGUgbnVtYmVyIG9mIHN0ZXBzIHRvIG1vdmUuICBUaGUgc2lnbiBpbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbgogICAgICogKG5lZ2F0aXZlIGlzIGJhY2t3YXJkcywgYW5kIHBvc2l0aXZlIGlzIGZvcndhcmRzKS4KICAgICAqIEByZXR1cm4gVGhlIGNoYXJhY3RlciBvZmZzZXQgb2YgdGhlIGJvdW5kYXJ5IHBvc2l0aW9uIG4gYm91bmRhcmllcyBhd2F5IGZyb20KICAgICAqIHRoZSBjdXJyZW50IG9uZS4KICAgICAqLwogICAgdmlydHVhbCBpbnQzMl90IG5leHQoaW50MzJfdCBuKTsKCiAgICAvKioKICAgICAqIEFkdmFuY2VzIHRoZSBpdGVyYXRvciB0byB0aGUgbmV4dCBib3VuZGFyeSBwb3NpdGlvbi4KICAgICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBib3VuZGFyeSBhZnRlciB0aGlzIG9uZS4KICAgICAqLwogICAgdmlydHVhbCBpbnQzMl90IG5leHQodm9pZCk7CgogICAgLyoqCiAgICAgKiBBZHZhbmNlcyB0aGUgaXRlcmF0b3IgYmFja3dhcmRzLCB0byB0aGUgbGFzdCBib3VuZGFyeSBwcmVjZWRpbmcgdGhpcyBvbmUuCiAgICAgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBib3VuZGFyeSBwb3NpdGlvbiBwcmVjZWRpbmcgdGhpcyBvbmUuCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBwcmV2aW91cyh2b2lkKTsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIGl0ZXJhdG9yIHRvIHJlZmVyIHRvIHRoZSBmaXJzdCBib3VuZGFyeSBwb3NpdGlvbiBmb2xsb3dpbmcKICAgICAqIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCiAgICAgKiBAb2Zmc2V0IFRoZSBwb3NpdGlvbiBmcm9tIHdoaWNoIHRvIGJlZ2luIHNlYXJjaGluZyBmb3IgYSBicmVhayBwb3NpdGlvbi4KICAgICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBicmVhayBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAqLwogICAgdmlydHVhbCBpbnQzMl90IGZvbGxvd2luZyhpbnQzMl90IG9mZnNldCk7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBpdGVyYXRvciB0byByZWZlciB0byB0aGUgbGFzdCBib3VuZGFyeSBwb3NpdGlvbiBiZWZvcmUgdGhlCiAgICAgKiBzcGVjaWZpZWQgcG9zaXRpb24uCiAgICAgKiBAb2Zmc2V0IFRoZSBwb3NpdGlvbiB0byBiZWdpbiBzZWFyY2hpbmcgZm9yIGEgYnJlYWsgZnJvbS4KICAgICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGJvdW5kYXJ5IGJlZm9yZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24uCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBwcmVjZWRpbmcoaW50MzJfdCBvZmZzZXQpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjZmllZCBwb3NpdGlvbiBpcyBhIGJvdW5kYXJ5IHBvc2l0aW9uLiAgQXMgYSBzaWRlCiAgICAgKiBlZmZlY3QsIGxlYXZlcyB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGJvdW5kYXJ5IHBvc2l0aW9uIGF0CiAgICAgKiBvciBhZnRlciAib2Zmc2V0Ii4KICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byBjaGVjay4KICAgICAqIEByZXR1cm4gVHJ1ZSBpZiAib2Zmc2V0IiBpcyBhIGJvdW5kYXJ5IHBvc2l0aW9uLgogICAgICovCiAgICB2aXJ0dWFsIFVCb29sIGlzQm91bmRhcnkoaW50MzJfdCBvZmZzZXQpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY3VycmVudCBpdGVyYXRpb24gcG9zaXRpb24uCiAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGl0ZXJhdGlvbiBwb3NpdGlvbi4KICAgICAqLwogICAgdmlydHVhbCBpbnQzMl90IGN1cnJlbnQodm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIGNsYXNzIElEIFBPTFlNT1JQSElDQUxMWS4gIFB1cmUgdmlydHVhbCBvdmVycmlkZS4KICAgICAqIFRoaXMgbWV0aG9kIGlzIHRvIGltcGxlbWVudCBhIHNpbXBsZSB2ZXJzaW9uIG9mIFJUVEksIHNpbmNlIG5vdCBhbGwKICAgICAqIEMrKyBjb21waWxlcnMgc3VwcG9ydCBnZW51aW5lIFJUVEkuICBQb2x5bW9ycGhpYyBvcGVyYXRvcj09KCkgYW5kCiAgICAgKiBjbG9uZSgpIG1ldGhvZHMgY2FsbCB0aGlzIG1ldGhvZC4KICAgICAqCiAgICAgKiBAcmV0dXJuICAgICAgICAgIFRoZSBjbGFzcyBJRCBmb3IgdGhpcyBvYmplY3QuIEFsbCBvYmplY3RzIG9mIGEKICAgICAqICAgICAgICAgICAgICAgICAgZ2l2ZW4gY2xhc3MgaGF2ZSB0aGUgc2FtZSBjbGFzcyBJRC4gIE9iamVjdHMgb2YKICAgICAqICAgICAgICAgICAgICAgICAgb3RoZXIgY2xhc3NlcyBoYXZlIGRpZmZlcmVudCBjbGFzcyBJRHMuCiAgICAgKi8KICAgIGlubGluZSB2aXJ0dWFsIFVDbGFzc0lEIGdldER5bmFtaWNDbGFzc0lEKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY2xhc3MgSUQgZm9yIHRoaXMgY2xhc3MuICBUaGlzIGlzIHVzZWZ1bCBvbmx5IGZvcgogICAgICogY29tcGFyaW5nIHRvIGEgcmV0dXJuIHZhbHVlIGZyb20gZ2V0RHluYW1pY0NsYXNzSUQoKS4gIEZvciBleGFtcGxlOgogICAgICoKICAgICAqICAgICAgQmFzZSogcG9seW1vcnBoaWNfcG9pbnRlciA9IGNyZWF0ZVBvbHltb3JwaGljT2JqZWN0KCk7CiAgICAgKiAgICAgIGlmIChwb2x5bW9ycGhpY19wb2ludGVyLT5nZXREeW5hbWljQ2xhc3NJRCgpID09CiAgICAgKiAgICAgICAgICBEZXJpdmVkOjpnZXRTdGF0aWNDbGFzc0lEKCkpIC4uLgogICAgICoKICAgICAqIEByZXR1cm4gICAgICAgICAgVGhlIGNsYXNzIElEIGZvciBhbGwgb2JqZWN0cyBvZiB0aGlzIGNsYXNzLgogICAgICovCiAgICBpbmxpbmUgc3RhdGljIFVDbGFzc0lEIGdldFN0YXRpY0NsYXNzSUQodm9pZCk7CgoJdmlydHVhbCBCcmVha0l0ZXJhdG9yICogIGNyZWF0ZUJ1ZmZlckNsb25lKHZvaWQgKnN0YWNrQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJkJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKTsKIAoKcHJvdGVjdGVkOgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gaW1wbGVtZW50YXRpb24KICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgaXMgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmV4dCgpIG1ldGhvZC4gIEFsbCBpdGVyYXRpb24KICAgICAqIHZlY3RvcnMgdGhyb3VnaCBoZXJlLiAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIHN0YXRlIG1hY2hpbmUgdG8gc3RhdGUgMQogICAgICogYW5kIGFkdmFuY2VzIHRocm91Z2ggdGhlIHRleHQgY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciB1bnRpbCB3ZSByZWFjaCB0aGUgZW5kCiAgICAgKiBvZiB0aGUgdGV4dCBvciB0aGUgc3RhdGUgbWFjaGluZSB0cmFuc2l0aW9ucyB0byBzdGF0ZSAwLiAgV2UgdXBkYXRlIG91ciByZXR1cm4KICAgICAqIHZhbHVlIGV2ZXJ5IHRpbWUgdGhlIHN0YXRlIG1hY2hpbmUgcGFzc2VzIHRocm91Z2ggYSBwb3NzaWJsZSBlbmQgc3RhdGUuCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBoYW5kbGVOZXh0KHZvaWQpOwoKICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgYmFja3MgdGhlIGl0ZXJhdG9yIGJhY2sgdXAgdG8gYSAic2FmZSBwb3NpdGlvbiIgaW4gdGhlIHRleHQuCiAgICAgKiBUaGlzIGlzIGEgcG9zaXRpb24gdGhhdCB3ZSBrbm93LCB3aXRob3V0IGFueSBjb250ZXh0LCBtdXN0IGJlIGEgYnJlYWsgcG9zaXRpb24uCiAgICAgKiBUaGUgdmFyaW91cyBjYWxsaW5nIG1ldGhvZHMgdGhlbiBpdGVyYXRlIGZvcndhcmQgZnJvbSB0aGlzIHNhZmUgcG9zaXRpb24gdG8KICAgICAqIHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbiB0byByZXR1cm4uICAoRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZGVzY3JpcHRpb24KICAgICAqIG9mIGJ1aWxkQmFja3dhcmRzU3RhdGVUYWJsZSgpIGluIFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IuQnVpbGRlci4pCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBoYW5kbGVQcmV2aW91cyh2b2lkKTsKCiAgICAvKioKICAgICAqIER1bXBzIGNhY2hlcyBhbmQgcGVyZm9ybXMgb3RoZXIgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBjb21wbGV0ZSBjaGFuZ2UKICAgICAqIGluIHRleHQgb3IgaXRlcmF0aW9uIHBvc2l0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBhIG5vLW9wIGluIFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IsCiAgICAgKiBidXQgc3ViY2xhc3NlcyBjYW4gYW5kIGRvIG92ZXJyaWRlIGl0LgogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgcmVzZXQodm9pZCk7Cgpwcml2YXRlOgoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IgdGhhdCB1c2VzIHRoZSBhbHJlYWR5LWNyZWF0ZWQKICAgICAqIHRhYmxlcyBvYmplY3QgdGhhdCBpcyBwYXNzZWQgaW4gYXMgYSBwYXJhbWV0ZXIuCiAgICAgKi8KICAgIFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IoUnVsZUJhc2VkQnJlYWtJdGVyYXRvclRhYmxlcyogYWRvcHRUYWJsZXMpOwoKICAgIGZyaWVuZCBjbGFzcyBCcmVha0l0ZXJhdG9yOwoKfTsKCmlubGluZSBVQm9vbCBSdWxlQmFzZWRCcmVha0l0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEJyZWFrSXRlcmF0b3ImIHRoYXQpIGNvbnN0IHsKICAgIHJldHVybiAhb3BlcmF0b3I9PSh0aGF0KTsKfQoKaW5saW5lIFVDbGFzc0lEIFJ1bGVCYXNlZEJyZWFrSXRlcmF0b3I6OmdldER5bmFtaWNDbGFzc0lEKHZvaWQpIGNvbnN0IHsKICAgIHJldHVybiBSdWxlQmFzZWRCcmVha0l0ZXJhdG9yOjpnZXRTdGF0aWNDbGFzc0lEKCk7Cn0KCmlubGluZSBVQ2xhc3NJRCBSdWxlQmFzZWRCcmVha0l0ZXJhdG9yOjpnZXRTdGF0aWNDbGFzc0lEKHZvaWQpIHsKICAgIHJldHVybiAoVUNsYXNzSUQpKCZmZ0NsYXNzSUQpOwp9CgojZW5kaWYK