PGh0bWw+CiAgPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxwPkxpYlJhdyBDKysgQVBJPGEgaHJlZj0iaW5kZXguaHRtbCI+W2JhY2sgdG8gSW5kZXhdPC9hPjwvcD4KICAgIDxoMT5MaWJSYXcgQysrIEFQSTwvaDE+CiAgICA8cD5Db250ZW50czwvcD4KICAgIDxvbD4KICAgICAgPGxpPjxhIGhyZWY9IiNMaWJSYXciPkxpYlJhdyBPYmplY3RzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjcmV0dXJuIj5SZXR1cm5lZCB2YWx1ZXM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNkYXRhbG9hZCI+TWV0aG9kcyBMb2FkaW5nIERhdGEgZnJvbSBhIEZpbGU8L2E+CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPjxhIGhyZWY9IiNvcGVuX2RhdGFzdHJlYW0iPmludAogICAgICAgICAgICAgIExpYlJhdzo6b3Blbl9kYXRhc3RyZWFtKExpYlJhd19hYnN0cmFjdF9kYXRhc3RyZWFtICpzdHJlYW0pPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI29wZW5fZmlsZSI+aW50IExpYlJhdzo6b3Blbl9maWxlKGNvbnN0IGNoYXIKICAgICAgICAgICAgICAqcmF3ZmlsZVssSU5UNjQgYmlnZmlsZV9zaXplXSk8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjb3Blbl9idWZmZXIiPmludCBMaWJSYXc6Om9wZW5fYnVmZmVyKHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICBzaXplX3QgYnVmc2l6ZSk8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjb3Blbl9iYXllciI+aW50IExpYlJhdzo6b3Blbl9iYXllciguLi4pPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI3VucGFjayI+aW50IExpYlJhdzo6dW5wYWNrKHZvaWQpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI3VucGFja190aHVtYiI+aW50IExpYlJhdzo6dW5wYWNrX3RodW1iKHZvaWQpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI3VucGFja190aHVtYl9leCI+aW50IExpYlJhdzo6dW5wYWNrX3RodW1iX2V4KGludCk8L2E+PC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iI3V0aWxpdHkiPkF1eGlsaWFyeSBGdW5jdGlvbnM8L2E+CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPkxpYnJhcnkgdmVyc2lvbiBpbmZvCiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3ZlcnNpb24iPmNvbnN0IGNoYXIqIExpYlJhdzo6dmVyc2lvbigpPC9hPjwvbGk+CiAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiN2ZXJzaW9uTnVtYmVyIj5pbnQgTGliUmF3Ojp2ZXJzaW9uTnVtYmVyKCk8L2E+PC9saT4KICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI0xJQlJBV19DSEVDS19WRVJTSU9OIj5ib29sCiAgICAgICAgICAgICAgICAgIExJQlJBV19DSEVDS19WRVJTSU9OKG1ham9yLG1pbm9yLHBhdGNoKTwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT5MaXN0IG9mIHN1cHBvcnRlZCBjYW1lcmFzCiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2NhbWVyYUNvdW50Ij5pbnQgTGliUmF3OjpjYW1lcmFDb3VudCgpPC9hPjwvbGk+CiAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNjYW1lcmFMaXN0Ij5jb25zdCBjaGFyKiogTGliUmF3OjpjYW1lcmFMaXN0KCk8L2E+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI3NldF9yYXdzcGVlZF9jYW1lcmFmaWxlIj5pbnQKICAgICAgICAgICAgICBMaWJSYXc6OnNldF9yYXdzcGVlZF9jYW1lcmFmaWxlKGNoYXIgKnBhdGhfdG9fY2FtZXJhc194bWwpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI2dldF9kZWNvZGVyX2luZm8iPmludAogICAgICAgICAgICAgIExpYlJhdzo6Z2V0X2RlY29kZXJfaW5mbyhsaWJyYXdfZGVjb2Rlcl9pbmZvX3QgKik8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjdW5wYWNrX2Z1bmN0aW9uX25hbWUiPmNvbnN0IGNoYXIqCiAgICAgICAgICAgICAgTGliUmF3Ojp1bnBhY2tfZnVuY3Rpb25fbmFtZSgpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI0NPTE9SIj5pbnQgTGliUmF3OjpDT0xPUigpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI2Vycm9yX2NvdW50Ij5pbnQgTGliUmF3OjplcnJvcl9jb3VudCgpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI3NldENhbmNlbEZsYWciPnZvaWQgTGliUmF3OjpzZXRDYW5jZWxGbGFnKCk8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjY2xlYXJDYW5jZWxGbGFnIj52b2lkIExpYlJhdzo6Y2xlYXJDYW5jZWxGbGFnKCk8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjc3VidHJhY3RfYmxhY2siPmludCBMaWJSYXc6OnN1YnRyYWN0X2JsYWNrKCk8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjYWRqdXN0X3RvX3Jhd19pbnNldF9jcm9wIj5pbnQKICAgICAgICAgICAgICBMaWJSYXc6OmFkanVzdF90b19yYXdfaW5zZXRfY3JvcCgpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI2Zsb2F0aW5ncG9pbnQiPlN1cHBvcnQgZm9yIEZsb2F0aW5nIFBvaW50IGRhdGE8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjeWNjIj5TdXBwb3J0IGZvciBZQ0MgZm9ybWF0czwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGhyZWY9IiNyZWN5Y2xlIj52b2lkIExpYlJhdzo6cmVjeWNsZV9kYXRhc3RyZWFtKHZvaWQpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI3JlY3ljbGUiPnZvaWQgTGliUmF3OjpyZWN5Y2xlKHZvaWQpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iIyU3RUxpYlJhdyI+TGliUmF3Ojp+TGliUmF3KCk8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjc3RycHJvZ3Jlc3MiPmNvbnN0IGNoYXIqIExpYlJhdzo6c3RycHJvZ3Jlc3MoZW51bQogICAgICAgICAgICAgIExpYlJhd19wcm9ncmVzcyBjb2RlKTwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGhyZWY9IiNsaWJyYXdfc3RyZXJyb3IiPmNvbnN0IGNoYXIqIExpYlJhdzo6c3RyZXJyb3IoaW50CiAgICAgICAgICAgICAgZXJyb3Jjb2RlKTwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGhyZWY9IiNzaW1wbGlmeV9tYWtlX21vZGVsIj5zdGF0aWMgTGliUmFhdzo6c2ltcGxpZnlfbWFrZV9tb2RlbDwvYT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjY2FsbGJhY2tzIj5TZXR0aW5nIEVycm9yIE5vdGlmaWNhdGlvbiBGdW5jdGlvbnMgYW5kCiAgICAgICAgICAgICAgb3RoZXIgY2FsbGJhY2tzPC9hPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNwcm9ncmVzcyI+VXNlciBjYWxsYmFjayBmb3IgcHJvZ3Jlc3MKICAgICAgICAgICAgICAgICAgaW5kaWNhdGlvbi9pbnRlcnJ1cHRpb248L2E+PC9saT4KICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2V4aWYiPlVzZXIgY2FsbGJhY2sgZm9yIGV4aWYvbWFrZXJub3RlcyBwYXJzZXIKICAgICAgICAgICAgICAgICAgcm91dGluZXM8L2E+PC9saT4KICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RhdGFlcnJvciI+RmlsZSBSZWFkIEVycm9yIE5vdGlmaWVyPC9hPjwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjZGNyYXdlbXUiPkRhdGEgUG9zdHByb2Nlc3Npbmc6IEVtdWxhdGlvbiBvZiBkY3JhdyBCZWhhdmlvcjwvYT4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RjcmF3X3BhcmFtcyI+UGFyYW1ldGVyIFNldHRpbmc8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjcmF3MmltYWdlIj5pbnQgTGliUmF3OjpyYXcyaW1hZ2U8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjZnJlZV9pbWFnZSI+dm9pZCBMaWJSYXc6OmZyZWVfaW1hZ2U8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjYWRqdXN0X3NpemVzX2luZm9fb25seSI+aW50CiAgICAgICAgICAgICAgTGliUmF3OjphZGp1c3Rfc2l6ZXNfaW5mb19vbmx5KHZvaWQpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RjcmF3X3Byb2Nlc3MiPmludCBMaWJSYXc6OmRjcmF3X3Byb2Nlc3Modm9pZCk8L2E+PC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iI2RjcmF3cml0ZSI+RGF0YSBPdXRwdXQgdG8gRmlsZXM6IEVtdWxhdGlvbiBvZiBkY3JhdyBCZWhhdmlvcjwvYT4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RjcmF3X3BwbV90aWZmX3dyaXRlciI+aW50CiAgICAgICAgICAgICAgTGliUmF3OjpkY3Jhd19wcG1fdGlmZl93cml0ZXIoY29uc3QgY2hhciAqb3V0ZmlsZSk8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjZGNyYXdfdGh1bWJfd3JpdGVyIj5pbnQgTGliUmF3OjpkY3Jhd190aHVtYl93cml0ZXIoY29uc3QKICAgICAgICAgICAgICBjaGFyICp0aHVtYmZpbGUpPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNtZW13cml0ZSI+Q29weWluZyB1bnBhY2tlZCBkYXRhIGludG8gbWVtb3J5IGJ1ZmZlcjwvYT4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI2dldF9tZW1faW1hZ2VfZm9ybWF0Ij52b2lkIGdldF9tZW1faW1hZ2VfZm9ybWF0KGludAogICAgICAgICAgICAgICp3aWR0aHAsIGludCAqaGVpZ2h0cCwgaW50ICpjb2xvcnNwLCBpbnQgKmJwcCk8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjY29weV9tZW1faW1hZ2UiPmludCBMaWJSYXc6OmNvcHlfbWVtX2ltYWdlKHZvaWQqIHNjYW4wLAogICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBiZ3IpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RjcmF3X21ha2VfbWVtX2ltYWdlIj5saWJyYXdfcHJvY2Vzc2VkX2ltYWdlX3QKICAgICAgICAgICAgICAqZGNyYXdfbWFrZV9tZW1faW1hZ2UoaW50ICplcnJvcmNvZGUpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RjcmF3X21ha2VfbWVtX3RodW1iIj5saWJyYXdfcHJvY2Vzc2VkX2ltYWdlX3QKICAgICAgICAgICAgICAqZGNyYXdfbWFrZV9tZW1fdGh1bWIoaW50ICplcnJvcmNvZGUpPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RjcmF3X2NsZWFyX21lbSI+dm9pZAogICAgICAgICAgICAgIExpYlJhdzo6ZGNyYXdfY2xlYXJfbWVtKGxpYnJhd19wcm9jZXNzZWRfaW1hZ2VfdCAqKTwvYT48L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjZGF0YXN0cmVhbSI+SW5wdXQgbGF5ZXIgYWJzdHJhY3Rpb248L2E+CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPjxhIGhyZWY9IkxpYlJhd19hYnN0cmFjdF9kYXRhc3RyZWFtIj5jbGFzcwogICAgICAgICAgICAgIExpYlJhd19hYnN0cmFjdF9kYXRhc3RyZWFtIC0gYWJzdHJhY3QgUkFXIHJlYWQgaW50ZXJmYWNlPC9hPjxhIGhyZWY9IiNkYXRhc3RyZWFtX21ldGhvZHMiPkxpYlJhd19hYnN0cmFjdF9kYXRhc3RyZWFtCiAgICAgICAgICAgICAgY2xhc3MgbWV0aG9kczwvYT4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZGF0YXN0cmVhbV9tZXRob2RzX3V0aWxpdHkiPk9iamVjdCB2ZXJpZmljYXRpb248L2E+PC9saT4KICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RhdGFzdHJlYW1fbWV0aG9kc19yZWFkIj5TdHJlYW0gcmVhZCBhbmQgcG9zaXRpb25pbmc8L2E+PC9saT4KICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RhdGFzdHJlYW1fbWV0aG9kc19vdGhlciI+T3RoZXIgbWV0aG9kczwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjZGF0YXN0cmVhbV9kZXJpdmVkIj5EZXJpdmVkIGlucHV0IGNsYXNzZXMgaW5jbHVkZWQgaW4KICAgICAgICAgICAgICBMaWJSYXc8L2E+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2ZpbGVfZGF0YXN0cmVhbSI+Y2xhc3MgTGliUmF3X2ZpbGVfZGF0YXN0cmVhbSAtIGZpbGUKICAgICAgICAgICAgICAgICAgaW5wdXQgaW50ZXJmYWNlPC9hPjwvbGk+CiAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNiaWdmaWxlX2RhdGFzdHJlYW0iPmNsYXNzIExpYlJhd19maWxlX2RhdGFzdHJlYW0gLQogICAgICAgICAgICAgICAgICBmaWxlIGlucHV0IGludGVyZmFjZSBmb3IgbGFyZ2UgZmlsZXM8L2E+PC9saT4KICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2J1ZmZlcl9kYXRhc3RyZWFtIj5jbGFzcyBMaWJSYXdfYnVmZmVyX2RhdGFzdHJlYW0gLQogICAgICAgICAgICAgICAgICBpbnB1dCBmcm9tIG1lbW9yeSBidWZmZXI8L2E+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iI293bl9kYXRhc3RyZWFtcyI+T3duIGRhdGFzdHJlYW0gZGVyaXZlZCBjbGFzc2VzPC9hPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNzdWJzdHJlYW0iPnN1YnN0cmVhbSBmaWVsZDogc2Vjb25kYXJ5IGlucHV0IHN0cmVhbTwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2xpPgogICAgPC9vbD4KICAgIDxwPjxhIG5hbWU9IkxpYlJhdyI+PC9hPjwvcD4KICAgIDxoMj5MaWJSYXcgT2JqZWN0czwvaDI+CiAgICA8cD5UaGUgbWFpbiBMaWJSYXcgb2JqZWN0IChjbGFzcykgaXMgY3JlYXRlZCBlaXRoZXIgd2l0aG91dCBwYXJhbWV0ZXJzIG9yCiAgICAgIHdpdGggZmxhZ3MgZGV0ZXJtaW5pbmcgdGhlIG9iamVjdCBiZWhhdmlvci48L3A+CiAgICA8cHJlPiNpbmNsdWRlICJsaWJyYXcvbGlicmF3LmgiPGJyPi4uLjxicj48YnI+ICAgTGliUmF3IEltYWdlUHJvY2Vzc29yKHVuc2lnbmVkIGludCBmbGFncz0wKTs8YnI+Li4uPGJyPiAgICA8L3ByZT4KICAgIDxwPkZsYWdzIChzZXZlcmFsIGZsYWdzIGFyZSBjb21iaW5lZCB2aWEgb3BlcmF0b3IgfCwgaS5lLiwgYml0d2lzZSBPUik6PC9wPgogICAgPHVsPgogICAgICA8bGk+PHN0cm9uZz5MSUJSQVdfT1BUSU9OU19OT19EQVRBRVJSX0NBTExCQUNLPC9zdHJvbmc+OiBkbyBub3Qgc2V0IHRoZQogICAgICAgIHN0YW5kYXJkIDxhIGhyZWY9IiNjYWxsYmFja3MiPmZpbGUgcmVhZCBlcnJvciBoYW5kbGVyPC9hPiAoc3RhbmRhcmQKICAgICAgICBoYW5kbGVyIG91dHB1dHMgdGhlIGVycm9yIHJlcG9ydCBpbiBzdGRlcnIpLjwvbGk+CiAgICA8L3VsPgogICAgPHA+VGhyZWUgZ3JvdXBzIG9mIG1ldGhvZHMgYXJlIHVzZWQgZm9yIGltYWdlIHByb2Nlc3Npbmc8L3A+CiAgICA8dWw+CiAgICAgIDxsaT48YSBocmVmPSIjZGF0YWxvYWQiPkRhdGEgbG9hZGluZyBmcm9tIHRoZSBSQVcgZmlsZTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iI2RjcmF3ZW11Ij5Qb3N0cHJvY2Vzc2luZyBmdW5jdGlvbnMgZW11bGF0aW5nIHRoZSBkY3JhdwogICAgICAgICAgYmVoYXZpb3I8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNkY3Jhd3JpdGUiPkZpbGUgb3V0cHV0IGZ1bmN0aW9ucyBlbXVsYXRpbmcgdGhlIGRjcmF3CiAgICAgICAgICBiZWhhdmlvcjwvYT4uPC9saT4KICAgIDwvdWw+CiAgICA8cD5UaGUgcmVzdWx0cyBvZiBwcm9jZXNzaW5nIGFyZSBwbGFjZWQgaW4gdGhlIGltZ2RhdGEgZmllbGQgb2YgdHlwZSA8YSBocmVmPSJBUEktZGF0YXN0cnVjdC5odG1sIj5saWJyYXdfZGF0YV90PC9hPjsKICAgICAgdGhlIHNhbWUgZGF0YSBzZXQgY29udGFpbnMgZmllbGRzIHRoYXQgY29udHJvbCB0aGUgcG9zdHByb2Nlc3NpbmcgYW5kCiAgICAgIG91dHB1dC48L3A+CiAgICA8cD48YSBuYW1lPSJyZXR1cm4iPjwvYT48L3A+CiAgICA8aDI+UmV0dXJuZWQgVmFsdWVzPC9oMj4KICAgIDxwPkFsbCBMaWJSYXcgQVBJIGZ1bmN0aW9ucyByZXR1cm4gYW4gaW50ZWdlciBudW1iZXIgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQogICAgICA8YSBocmVmPSJBUEktbm90ZXMuaHRtbCNlcnJvcnMiPnJldHVybiBjb2RlIGNvbnZlbnRpb248L2E+LiBQbGVhc2UgcmVhZAogICAgICB0aGUgZGVzY3JpcHRpb25zIG9mIDxhIGhyZWY9IkFQSS1ub3Rlcy5odG1sI2Vycm9ycyI+dGhpcyBjb252ZW50aW9uPC9hPgogICAgICBhbmQgPGEgaHJlZj0iI2NhbGxiYWNrcyI+TGliUmF3IGJlaGF2aW9yIGluIGNhc2VzIG9mIGZhdGFsIGVycm9yczwvYT4uPC9wPgogICAgPHA+PGEgbmFtZT0iZGF0YWxvYWQiPjwvYT48L3A+CiAgICA8aDI+TWV0aG9kcyBMb2FkaW5nIERhdGEgZnJvbSBhIEZpbGU8L2gyPgogICAgPHA+PGEgbmFtZT0ib3Blbl9kYXRhc3RyZWFtIj48L2E+PC9wPgogICAgPGgzPmludCBMaWJSYXc6Om9wZW5fZGF0YXN0cmVhbShMaWJSYXdfYWJzdHJhY3RfZGF0YXN0cmVhbSAqc3RyZWFtKTwvaDM+CiAgICA8cD5PcGVucyBhIGRhdGFzdHJlYW0gd2l0aCBSQVcgZGF0YSwgcmVhZHMgbWV0YWRhdGEgKEVYSUYpIGZyb20gaXQsIGFuZAogICAgICBmaWxscyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZXM6PC9wPgogICAgPHVsPgogICAgICA8bGk+aW1nZGF0YS5pZGF0YSAoPGEgaHJlZj0iQVBJLWRhdGFzdHJ1Y3QuaHRtbCNsaWJyYXdfaXBhcmFtc190Ij5saWJyYXdfaXBhcmFtc190PC9hPiksPC9saT4KICAgICAgPGxpPmltZ2RhdGEuc2l6ZXMgKDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjbGlicmF3X2ltYWdlX3NpemVzX3QiPmxpYnJhd19pbWFnZV9zaXplc190PC9hPiksPC9saT4KICAgICAgPGxpPmltZ2RhdGEuY29sb3IgKDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjbGlicmF3X2NvbG9yZGF0YV90Ij5saWJyYXdfY29sb3JkYXRhX3Q8L2E+KSw8L2xpPgogICAgICA8bGk+aW1nZGF0YS5vdGhlciAoPGEgaHJlZj0iQVBJLWRhdGFzdHJ1Y3QuaHRtbCNsaWJyYXdfaW1nb3RoZXJfdCI+bGlicmF3X2ltZ290aGVyX3Q8L2E+KSwKICAgICAgICBhbmQ8L2xpPgogICAgICA8bGk+aW1nZGF0YS50aHVtYm5haWwgKDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjbGlicmF3X3RodW1ibmFpbF90Ij5saWJyYXdfdGh1bWJuYWlsX3Q8L2E+KS48L2xpPgogICAgPC91bD4KICAgIDxwPlRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGludGVnZXIgbnVtYmVyIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgPGEgaHJlZj0iQVBJLW5vdGVzLmh0bWwjZXJyb3JzIj5yZXR1cm4KICAgICAgICBjb2RlIGNvbnZlbnRpb248L2E+OiBwb3NpdGl2ZSBpZiBhbnkgc3lzdGVtIGNhbGwgaGFzIHJldHVybmVkIGFuIGVycm9yLAogICAgICBuZWdhdGl2ZSAoZnJvbSB0aGUgPGEgaHJlZj0iQVBJLWRhdGFzdHJ1Y3QuaHRtbCNMaWJSYXdfZXJyb3JzIj5MaWJSYXcKICAgICAgICBlcnJvciBsaXN0PC9hPikgaWYgdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3Igc2l0dWF0aW9uIHdpdGhpbiBMaWJSYXcuPC9wPgogICAgPHA+QmVmb3JlIGZpbGUgb3BlbmluZywgPGEgaHJlZj0iI3JlY3ljbGUiPnJlY3ljbGUoKTwvYT4gaXMgYWx3YXlzIGNhbGxlZDsKICAgICAgaGVuY2UsIGlmIHNldmVyYWwgaW1hZ2VzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIGJhdGNoIG1vZGUsIHRoZXJlIGlzIG5vIG5lZWQKICAgICAgdG8gY2FsbCByZWN5Y2xlKCkgYXQgdGhlIGVuZCBvZiBlYWNoIHByb2Nlc3NpbmcgY3ljbGUuPC9wPgogICAgPHA+PHN0cm9uZz5JbnB1dCBkYXRhPC9zdHJvbmc+OiBwb2ludGVyIHRvIG9iamVjdCwgZGVyaXZlZCBmcm9tIDxhIGhyZWY9IiNkYXRhc3RyZWFtIj5MaWJSYXdfYWJzdHJhY3RfZGF0YXN0cmVhbTwvYT4KICAgICAgY2xhc3MuIFRoaXMgb2JqZWN0IHNob3VsZCBiZSBpbml0aWFsaXplZCBhbmQgcmVhZHkgdG8gcmVhZC4gVGhpcyBvYmplY3QKICAgICAgc2hvdWxkIGJlIGRlc3Ryb3llZCBpbiBjYWxsaW5nIGFwcGxpY2F0aW9uIGFmdGVyIHVzZS48L3A+CiAgICA8cD48YSBuYW1lPSJvcGVuX2ZpbGUiPjwvYT48L3A+CiAgICA8aDM+aW50IExpYlJhdzo6b3Blbl9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lWyxJTlQ2NCBiaWdmaWxlX3NpemVdKTwvaDM+CiAgICA8aDM+V2luMzIgb25seTogaW50IExpYlJhdzo6b3Blbl9maWxlKGNvbnN0IHdjaGFyX3QgKmZpbGVuYW1lWyxJTlQ2NAogICAgICBiaWdmaWxlX3NpemVdKTwvaDM+CiAgICA8cD5DcmVhdGVzIGFuIDxhIGhyZWY9IiNmaWxlX2RhdGFzdHJlYW0iPkxpYlJhd19maWxlX2RhdGFzdHJlYW08L2E+IG9iamVjdCwKICAgICAgY2FsbHMgPGEgaHJlZj0iI29wZW5fZGF0YXN0cmVhbSI+b3Blbl9kYXRhc3RyZWFtKCk8L2E+LiBJZiBzdWNjZWVkLCBzZXRzCiAgICAgIGludGVybmFsIGZsYWcgd2hpY2ggc2lnbmFscyB0byBkZXN0cm95IGludGVybmFsIGRhdGFzdHJlYW0gb2JqZWN0IG9uIDxhIGhyZWY9IiNyZWN5Y2xlIj5yZWN5Y2xlKCk8L2E+LgogICAgICBPbiBmYWlsdXJlLCBqdXN0IGNyZWF0ZWQgZmlsZV9kYXRhc3RyZWFtIGRlc3Ryb3llZCBpbW1lZGlhdGVseS48L3A+CiAgICA8cD5TZWNvbmQgb3B0aW9uYWwgcGFyYW1ldGVyIDxzdHJvbmc+YmlnZmlsZV9zaXplPC9zdHJvbmc+IGNvbnRyb2xzCiAgICAgIGJhY2tncm91bmQgSS9PIGludGVyZmFjZSB1c2VkIGZvciBmaWxlIG9wZXJhdGlvbnMuIEZvciBmaWxlcyBzbWFsbGVyIHRoYW4KICAgICAgYmlnZmlsZV9zaXplIHRoZSA8YSBocmVmPSIjZmlsZV9kYXRhc3RyZWFtIj5MaWJSYXdfZmlsZV9kYXRhc3RyZWFtPC9hPgogICAgICB3aWxsIGJlIHVzZWQgYW5kIHRoZSA8YSBocmVmPSIjYmlnZmlsZV9kYXRhc3RyZWFtIj5MaWJSYXdfYmlnZmlsZV9kYXRhc3RyZWFtPC9hPgogICAgICBvdGhlcndpc2UuPC9wPgogICAgPHA+VGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlciBudW1iZXIgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSA8YSBocmVmPSJBUEktbm90ZXMuaHRtbCNlcnJvcnMiPnJldHVybgogICAgICAgIGNvZGUgY29udmVudGlvbjwvYT46IHBvc2l0aXZlIGlmIGFueSBzeXN0ZW0gY2FsbCBoYXMgcmV0dXJuZWQgYW4gZXJyb3IsCiAgICAgIG5lZ2F0aXZlIChmcm9tIHRoZSA8YSBocmVmPSJBUEktZGF0YXN0cnVjdC5odG1sI0xpYlJhd19lcnJvcnMiPkxpYlJhdwogICAgICAgIGVycm9yIGxpc3Q8L2E+KSBpZiB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBzaXR1YXRpb24gd2l0aGluIExpYlJhdy48L3A+CiAgICA8cD48YSBuYW1lPSJvcGVuX2J1ZmZlciI+PC9hPjwvcD4KICAgIDxoMz5pbnQgTGliUmF3OjpvcGVuX2J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBidWZzaXplKTwvaDM+CiAgICA8cD5DcmVhdGVkIGFuIDxhIGhyZWY9IiNidWZmZXJfZGF0YXN0cmVhbSI+TGliUmF3X2J1ZmZlcl9kYXRhc3RyZWFtPC9hPgogICAgICBvYmplY3QsIGNhbGxzIDxhIGhyZWY9IiNvcGVuX2RhdGFzdHJlYW0iPm9wZW5fZGF0YXN0cmVhbSgpPC9hPi4gSWYKICAgICAgc3VjY2VlZCwgc2V0cyBpbnRlcm5hbCBmbGFnIHdoaWNoIHNpZ25hbHMgdG8gZGVzdHJveSBpbnRlcm5hbCBkYXRhc3RyZWFtCiAgICAgIG9iamVjdCBvbiA8YSBocmVmPSIjcmVjeWNsZSI+cmVjeWNsZSgpPC9hPi4gT24gZmFpbHVyZSwganVzdCBjcmVhdGVkCiAgICAgIGZpbGVfZGF0YXN0cmVhbSBkZXN0cm95ZWQgaW1tZWRpYXRlbHkuPC9wPgogICAgPHA+VGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlciBudW1iZXIgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSA8YSBocmVmPSJBUEktbm90ZXMuaHRtbCNlcnJvcnMiPnJldHVybgogICAgICAgIGNvZGUgY29udmVudGlvbjwvYT46IHBvc2l0aXZlIGlmIGFueSBzeXN0ZW0gY2FsbCBoYXMgcmV0dXJuZWQgYW4gZXJyb3IsCiAgICAgIG5lZ2F0aXZlIChmcm9tIHRoZSA8YSBocmVmPSJBUEktZGF0YXN0cnVjdC5odG1sI0xpYlJhd19lcnJvcnMiPkxpYlJhdwogICAgICAgIGVycm9yIGxpc3Q8L2E+KSBpZiB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBzaXR1YXRpb24gd2l0aGluIExpYlJhdy48L3A+CiAgICA8cD48YSBuYW1lPSJvcGVuX2JheWVyIj48L2E+PC9wPgogICAgPGgzPmludCBMaWJSYXc6Om9wZW5fYmF5ZXIodW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgZGF0YWxlbiwgdXNob3J0CiAgICAgIF9yYXdfd2lkdGgsIHVzaG9ydCBfcmF3X2hlaWdodCwgdXNob3J0IF9sZWZ0X21hcmdpbiwgdXNob3J0IF90b3BfbWFyZ2luLAogICAgICB1c2hvcnQgX3JpZ2h0X21hcmdpbiwgdXNob3J0IF9ib3R0b21fbWFyZ2luLCB1bnNpZ25lZCBjaGFyIHByb2NmbGFncywKICAgICAgdW5zaWduZWQgY2hhciBiYXllcl9wYXR0ZXJuLCB1bnNpZ25lZCB1bnVzZWRfYml0cywgdW5zaWduZWQgb3RoZXJmbGFncywKICAgICAgdW5zaWduZWQgYmxhY2tfbGV2ZWwpPC9oMz4KICAgIDxwPlBhcmFtZXRlcnM6IDwvcD4KICAgIDx1bD4KICAgICAgPGxpPmRhdGEsIGRhdGFsZW4gLSBidWZmZXIgcGFzc2VkIDwvbGk+CiAgICAgIDxsaT5fcmF3X3dpZHRoL19yYXdfaGVpZ2h0LyptYXJnaW4gLSBpbWFnZSBzaXplIGFuZCBtYXJnaW5zIDwvbGk+CiAgICAgIDxsaT4gcHJvY2ZsYWdzOgogICAgICAgIDx1bD4KICAgICAgICAgIDxsaT5mb3IgMTAtYml0IGZvcm1hdDoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4xOiAiNCBwaXhlbHMgaW4gNSBieXRlcyIgcGFja2luZyBpcyB1c2VkIDwvbGk+CiAgICAgICAgICAgICAgPGxpPjA6ICI2IHBpeGVscyBpbiA4IGJ5dGVzIiBwYWNraW5nIGlzIHVzZWQgPC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+Zm9yIDE2LWJpdCBmb3JtYXQ6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+MTogQmlnLWVuZGlhbiBkYXRhIDwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvbGk+CiAgICAgIDxsaT5iYXllcl9wYXR0ZXJuOiBvbmUgb2YgTElCUkFXX09QRU5CQVlFUl9SR0dCLExJQlJBV19PUEVOQkFZRVJfQkdHUiwKICAgICAgICBMSUJSQVdfT1BFTkJBWUVSX0dSQkcsTElCUkFXX09QRU5CQVlFUl9HQlJHIDwvbGk+CiAgICAgIDxsaT51bnVzZWRfYml0czogY291bnQgb2YgdXBwZXIgemVybyBiaXRzIDwvbGk+CiAgICAgIDxsaT5vdGhlcmZsYWdzOgogICAgICAgIDx1bD4KICAgICAgICAgIDxsaT5CaXQgMSAtIGZpbHRlciAoYXZlcmFnZSBuZWlnaGJvcnMpIGZvciBwaXhlbHMgd2l0aCB2YWx1ZXMgb2YgemVybwogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT5CaXRzIDItNCAtIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgaW1hZ2UgKDA9ZG8gbm90IHJvdGF0ZSwgMz0xODAsCiAgICAgICAgICAgIDU9OTBDQ1csIDY9OTBDVykgPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2xpPgogICAgICA8bGk+YmxhY2tfbGV2ZWw6IGZpbGUgYmxhY2sgbGV2ZWwgKGl0IGFsc28gbWF5IGJlIHNwZWNpZmllZCB2aWEKICAgICAgICBpbWdkYXRhLnBhcmFtcykgPC9saT4KICAgIDwvdWw+CiAgICBTZWUgc2FtcGxlcy9vcGVuYmF5ZXJfc2FtcGxlLmNwcCBmb3IgdXNhZ2Ugc2FtcGxlIChub3RlLCB0aGlzIHNhbXBsZSBpcwogICAgJ3NhbXBsZSBvbmx5Jywgc3VpdGVkIGZvciBLb2RhayBLQUktMDM0MCBzZW5zb3IsIHlvdSdsbCBuZWVkIGNoYW5nZQogICAgb3Blbl9iYXllcigpIHBhcmFtcyBmb3IgeW91ciBkYXRhKS4KICAgIDxwPjxhIG5hbWU9InVucGFjayI+PC9hPjwvcD4KICAgIDxoMz5pbnQgTGliUmF3Ojp1bnBhY2sodm9pZCk8L2gzPgogICAgPHA+VW5wYWNrcyB0aGUgUkFXIGZpbGVzIG9mIHRoZSBpbWFnZSwgY2FsY3VsYXRlcyB0aGUgYmxhY2sgbGV2ZWwgKG5vdCBmb3IKICAgICAgYWxsIGZvcm1hdHMpLiBUaGUgcmVzdWx0cyBhcmUgcGxhY2VkIGluIGltZ2RhdGEuaW1hZ2UuPC9wPgogICAgPHA+RGF0YSByZWFkaW5nIGlzIHNvbWV0aW1lcyAobm90IGZyZXF1ZW50bHkpIGFmZmVjdGVkIGJ5IHNldHRpbmdzIG1hZGUgaW4KICAgICAgaW1nZGF0YS5wYXJhbXMgKDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjbGlicmF3X291dHB1dF9wYXJhbXNfdCI+bGlicmF3X291dHB1dF9wYXJhbXNfdDwvYT4pOwogICAgICBzZWUgPGEgaHJlZj0iQVBJLW5vdGVzLmh0bWwiPkFQSSBub3RlczwvYT4gZm9yIGRldGFpbHMuPC9wPgogICAgPHA+VGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlciBudW1iZXIgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSA8YSBocmVmPSJBUEktbm90ZXMuaHRtbCNlcnJvcnMiPnJldHVybgogICAgICAgIGNvZGUgY29udmVudGlvbjwvYT46IHBvc2l0aXZlIGlmIGFueSBzeXN0ZW0gY2FsbCBoYXMgcmV0dXJuZWQgYW4gZXJyb3IsCiAgICAgIG5lZ2F0aXZlIChmcm9tIHRoZSA8YSBocmVmPSJBUEktZGF0YXN0cnVjdC5odG1sI0xpYlJhd19lcnJvcnMiPkxpYlJhdwogICAgICAgIGVycm9yIGxpc3Q8L2E+KSBpZiB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBzaXR1YXRpb24gd2l0aGluIExpYlJhdy48L3A+CiAgICA8cD48YSBuYW1lPSJ1bnBhY2tfdGh1bWIiPjwvYT48YSBuYW1lPSJ1bnBhY2tfdGh1bWJfZXgiPjwvYT48L3A+CiAgICA8aDM+aW50IExpYlJhdzo6dW5wYWNrX3RodW1iKHZvaWQpPC9oMz4KICAgIDxoMz5pbnQgTGliUmF3Ojp1bnBhY2tfdGh1bWJfZXgoaW50IGkpPC9oMz4KICAgIDxwPjwvcD4KICAgIDxwPnVucGFja190aHVtYigpOiByZWFkcyAob3IgdW5wYWNrcykgdGhlIGRlZmF1bHQgKGxhcmdlc3QpIGltYWdlIHByZXZpZXcKICAgICAgKHRodW1ibmFpbCksIHBsYWNpbmcgdGhlIHJlc3VsdCBpbnRvIHRoZSBpbWdkYXRhLnRodW1ibmFpbC50aHVtYiBidWZmZXIuPC9wPgogICAgPHA+dW5wYWNrX3RodW1iX2V4KGludCBpKTogcmVhZHMgaS10aCB0aHVtYm5haWwgKHRodW1ibmFpbHMgbGlzdCBpcwogICAgICBhdmFpbGFibGUgaW4gaW1nZGF0YS50aHVtYnNfbGlzdCBzdHJ1Y3R1cmUpLjwvcD4KICAgIDxwPiBKUEVHIHByZXZpZXdzIGFyZSBwbGFjZWQgaW50byB0aGlzIGJ1ZmZlciB3aXRob3V0IGFueSBjaGFuZ2VzICh3aXRoIHRoZQogICAgICBoZWFkZXIgZXRjLikuIE90aGVyIHByZXZpZXcgZm9ybWF0cyBhcmUgcGxhY2VkIGludG8gdGhlIGJ1ZmZlciBpbiB0aGUgZm9ybQogICAgICBvZiB0aGUgdW5wYWNrZWQgYml0bWFwIGltYWdlICh0aHJlZSBjb21wb25lbnRzLCA4IGJpdHMgcGVyIGNvbXBvbmVudCkuPGJyPgogICAgICBUaGUgdGh1bWJuYWlsIGZvcm1hdCBpcyB3cml0dGVuIHRvIHRoZSBpbWdkYXRhLnRodW1ibmFpbC50Zm9ybWF0IGZpZWxkOwogICAgICBmb3IgdGhlIHBvc3NpYmxlIHZhbHVlcywgc2VlIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjTGliUmF3X3RodW1ibmFpbF9mb3JtYXRzIj5kZXNjcmlwdGlvbgogICAgICAgIG9mIGNvbnN0YW50cyBhbmQgZGF0YSBzdHJ1Y3R1cmVzPC9hPi48L3A+CiAgICA8cD5UaGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyIG51bWJlciBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIDxhIGhyZWY9IkFQSS1ub3Rlcy5odG1sI2Vycm9ycyI+cmV0dXJuCiAgICAgICAgY29kZSBjb252ZW50aW9uPC9hPjogcG9zaXRpdmUgaWYgYW55IHN5c3RlbSBjYWxsIGhhcyByZXR1cm5lZCBhbiBlcnJvciwKICAgICAgbmVnYXRpdmUgKGZyb20gdGhlIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjTGliUmF3X2Vycm9ycyI+TGliUmF3CiAgICAgICAgZXJyb3IgbGlzdDwvYT4pIGlmIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIHNpdHVhdGlvbiB3aXRoaW4gTGliUmF3LjwvcD4KICAgIDxoMz48L2gzPgogICAgPHA+PC9wPgogICAgPHA+PGEgbmFtZT0idXRpbGl0eSI+PC9hPjwvcD4KICAgIDxoMj5BdXhpbGlhcnkgRnVuY3Rpb25zPC9oMj4KICAgIDxoMz5MaWJyYXJ5IHZlcnNpb24gY2hlY2s8L2gzPgogICAgPHA+PGEgbmFtZT0idmVyc2lvbiI+PC9hPjwvcD4KICAgIDxoND5jb25zdCBjaGFyKiBMaWJSYXc6OnZlcnNpb24oKTwvaDQ+CiAgICA8cD5SZXR1cm5zIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBMaWJSYXcgdmVyc2lvbiBpbgogICAgICBNQUpPUi5NSU5PUi5QQVRDSC1TdGF0dXMgZm9ybWF0IChpLmUuIDAuNi4wLUFscGhhMiBvciAwLjYuMS1SZWxlYXNlKS48L3A+CiAgICA8cD48YSBuYW1lPSJ2ZXJzaW9uTnVtYmVyIj48L2E+PC9wPgogICAgPGg0PmludCBMaWJSYXc6OnZlcnNpb25OdW1iZXIoKTwvaDQ+CiAgICA8cD5SZXR1cm5zIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgTGliUmF3IHZlcnNpb24uIER1cmluZyBMaWJSYXcKICAgICAgZGV2ZWxvcG1lbnQsIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBhbHdheXMgaW5jcmVhc2UgLjwvcD4KICAgIDxwPjxhIG5hbWU9IkxJQlJBV19DSEVDS19WRVJTSU9OIj48L2E+PC9wPgogICAgPGg0PmJvb2wgTElCUkFXX0NIRUNLX1ZFUlNJT04obWFqb3IsbWlub3IscGF0Y2gpPC9oND4KICAgIDxwPk1hY3JvIGZvciB2ZXJzaW9uIGNoZWNrIGluIGNhbGxlciBhcHBsaWNhdGlvbnMuIFJldHVybnMgJ3RydWUnIGlmIGN1cnJlbnQKICAgICAgbGlicmFyeSB2ZXJzaW9uIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gc2V0IGluIG1hY3JvIHBhcmFtZXRlcnMuIFRoaXMgbWFjcm8KICAgICAgZXhlY3V0ZXMgYXQgcnVudGltZSAobm90IGF0IGNvbXBpbGUgdGltZSkgYW5kIG1heSBiZSB1c2VkIGZvciBjaGVja2luZwogICAgICB2ZXJzaW9uIG9mIGR5bmFtaWNhbGx5IGxvYWRlZCBMaWJSYXcgKGZyb20gRExML3NoYXJlZCBsaWJyYXJ5KS48L3A+CiAgICA8aDM+TGlzdCBvZiBzdXBwb3J0ZWQgUkFXIGZvcm1hdHMgKGNhbWVyYXMpPC9oMz4KICAgIDxwPjxhIG5hbWU9ImNhbWVyYUNvdW50Ij48L2E+PC9wPgogICAgPGg0PmludCBMaWJSYXc6OmNhbWVyYUNvdW50KCk8L2g0PgogICAgPHA+UmV0dXJucyBjb3VudCBvZiBjYW1lcmFzIHN1cHBvcnRlZC48L3A+CiAgICA8cD48YSBuYW1lPSJjYW1lcmFMaXN0Ij48L2E+PC9wPgogICAgPGg0PmNvbnN0IGNoYXIqKiBMaWJSYXc6OmNhbWVyYUxpc3QoKTwvaDQ+CiAgICA8cD5SZXR1cm5zIGxpc3Qgb2Ygc3VwcG9ydGVkIGNhbWVyYXMuIExhdGVzdCBpdGVtIG9mIGxpc3QgaXMgc2V0IHRvIE5VTEwKICAgICAgKGZvciBlYXN5IHByaW50aW5nKS48L3A+CiAgICA8cD48YSBuYW1lPSIjc2V0X3Jhd3NwZWVkX2NhbWVyYWZpbGUiPjwvYT48L3A+CiAgICA8aDQ+aW50IExpYlJhdzo6c2V0X3Jhd3NwZWVkX2NhbWVyYWZpbGUoY2hhciAqcGF0aF90b19jYW1lcmFzX3htbCk8L2g0PgogICAgPHA+KE9ubHkgaWYgTGliUmF3IHdhcyBidWlsdCB3aXRoIFJhd1NwZWVkIHN1cHBvcnQpLjwvcD4KICAgIDxwPkxvYWRzIFhNTCBmaWxlIHdpdGggUmF3U3BlZWQgY2FtZXJhIGRlc2NyaXB0aW9uIGRhdGEgKGNhbWVyYXMueG1sKQogICAgICBzcGVjaWZpZWQgYnkgcGF0aF90b19jYW1lcmFzX3htbC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCiAgICAgIDxhIG5hbWU9ImdldF9kZWNvZGVyX2luZm8iPjwvYT48L3A+CiAgICA8aDQ+aW50IExpYlJhdzo6Z2V0X2RlY29kZXJfaW5mbyhsaWJyYXdfZGVjb2Rlcl9pbmZvX3QgKik8L2g0PgogICAgPHA+VGhlIGZ1bmN0aW9uIGZpbGxzIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjbGlicmF3X2RlY29kZXJfaW5mb190Ij5saWJyYXdfZGVjb2Rlcl9pbmZvX3Q8L2E+CiAgICAgIHN0cnVjdHVyZSBieSBwYXNzZWQgcG9pbnRlciB3aXRoIGN1cnJlbnQgcmF3IGRlY29kZXIgZGF0YS48L3A+CiAgICA8cD5UaGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyIG51bWJlciBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIDxhIGhyZWY9IkFQSS1ub3Rlcy5odG1sI2Vycm9ycyI+cmV0dXJuCiAgICAgICAgY29kZSBjb252ZW50aW9uPC9hPjogcG9zaXRpdmUgaWYgYW55IHN5c3RlbSBjYWxsIGhhcyByZXR1cm5lZCBhbiBlcnJvciwKICAgICAgbmVnYXRpdmUgKGZyb20gdGhlIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjTGliUmF3X2Vycm9ycyI+TGliUmF3CiAgICAgICAgZXJyb3IgbGlzdDwvYT4pIGlmIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIHNpdHVhdGlvbiB3aXRoaW4gTGliUmF3LjwvcD4KICAgIDxwPjxhIG5hbWU9InVucGFja19mdW5jdGlvbl9uYW1lIj48L2E+PC9wPgogICAgPGgzPmNvbnN0IGNoYXIqIExpYlJhdzo6dW5wYWNrX2Z1bmN0aW9uX25hbWUoKTwvaDM+CiAgICA8cD5SZXR1cm5zIGZ1bmN0aW9uIG5hbWUgb2YgZmlsZSB1bnBhY2tpbmcgZnVuY3Rpb24uIEludGVuZGVkIG9ubHkgZm9yCiAgICAgIExpYlJhdyB0ZXN0IHN1aXRlIGRlc2lnbmVycyB0byB1c2UgaW4gdGVzdCBjb3ZlcmFnZSBldmFsdWF0aW9uLjwvcD4KICAgIDxwPjxhIG5hbWU9InNldENhbmNlbEZsYWciPjwvYT48L3A+CiAgICA8aDQ+dm9pZCBMaWJSYXc6OnNldENhbmNlbEZsYWcoKTwvaDQ+CiAgICA8cD5UaGlzIGNhbGwgc2V0cyBpbnRlcm5hbCBmYXN0IGNhbmNlbCBmbGFncy4gSWYgc2V0LCBjdXJyZW50IFJhdyBkZWNvZGVyCiAgICAgIHdpbGwgYmUgdGVybWluYXRlZCBBU0FQLiBUaGlzIGNhbGwgaXMgdXNlZnVsIGlmIHlvdSBuZWVkIHRvIGNhbmNlbCBhbGwKICAgICAgTGliUmF3IGRlY29kZXJzIGluIG11bHRpdGhyZWFkZWQgcHJvZ3JhbSAoZS5nLiBmb3IgZmFzdCBwcm9ncmFtCiAgICAgIHRlcm1pbmF0aW9uIG9yIGp1c3QgZm9yIGNhbmNlbCBjdXJyZW50IHByb2Nlc3NpbmcpLjwvcD4KICAgIDxwPjxhIG5hbWU9ImNsZWFyQ2FuY2VsRmxhZyI+PC9hPjwvcD4KICAgIDxoND52b2lkIExpYlJhdzo6Y2xlYXJDYW5jZWxGbGFnKCk8L2g0PgogICAgPHA+VGhpcyBjYWxsIGNsZWFycyBpbnRlcm5hbCBmYXN0IGNhbmNlbCBmbGFncywgc28gKGVhcmx5KSB0ZXJtaW5hdGVkIExpYlJhdwogICAgICBkZWNvZGVyIG1heSB3b3JrIGFnYWluLjwvcD4KICAgIDxwPjxhIG5hbWU9IkNPTE9SIj48L2E+PC9wPgogICAgPGg0PmludCBMaWJSYXc6OkNPTE9SKGludCByb3csIGludCBjb2wpPC9oND4KICAgIDxwPlRoaXMgY2FsbCByZXR1cm5zIHBpeGVsIGNvbG9yIChjb2xvciBjb21wb25lbnQgbnVtYmVyKSBpbiBiYXllciBwYXR0ZXJuCiAgICAgIGF0IHJvdyxjb2wuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBpbiAwLi4zIHJhbmdlIGZvciA0LWNvbXBvbmVudCBCYXllcgogICAgICAoUkdCRzIsIENNWUcgYW5kIHNvIG9uKSBhbmQgaW4gMC4uMiByYW5nZSBmb3IgMy1jb2xvciBkYXRhLjwvcD4KICAgIDxwPkNvbG9yIGluZGV4ZXMgcmV0dXJuZWQgY291bGQgYmUgdXNlZCBhcyBpbmRleCBpbiBpbWdkYXRhLmlkYXRhLmNkZXNjCiAgICAgIHN0cmluZyB0byBnZXQgY29sb3IgJ25hbWUnLjwvcD4KICAgIDxwPjxhIG5hbWU9ImVycm9yX2NvdW50Ij48L2E+PC9wPgogICAgPGg0PmludCBMaWJSYXc6OmVycm9yX2NvdW50KCk8L2g0PgogICAgPHA+VGhpcyBjYWxsIHJldHVybnMgY291bnQgb2Ygbm9uLWZhdGFsIGRhdGEgZXJyb3JzIChvdXQgb2YgcmFuZ2UsIGV0YykKICAgICAgb2NjdXJyZWQgaW4gdW5wYWNrKCkgc3RhZ2UuPC9wPgogICAgPHA+PGEgbmFtZT0ic3VidHJhY3RfYmxhY2siPjwvYT48L3A+CiAgICA8aDQ+aW50IExpYlJhdzo6c3VidHJhY3RfYmxhY2soKTwvaDQ+CiAgICA8cD5UaGlzIGNhbGwgd2lsbCBzdWJ0cmFjdCBibGFjayBsZXZlbCB2YWx1ZXMgZnJvbSBSQVcgZGF0YSAoZm9yIHN1aXRhYmxlCiAgICAgIFJBVyBkYXRhKS4gPGEgaHJlZj0iQVBJLWRhdGFzdHJ1Y3QuaHRtbCNsaWJyYXdfY29sb3JkYXRhX3QiPmNvbG9yZGF0YS5kYXRhX21heGltdW08L2E+CiAgICAgIGFuZCA8c3Ryb25nPmNvbG9yZGF0YS5tYXhpbXVtPC9zdHJvbmc+IGFuZCBibGFjayBsZXZlbCBkYXRhICg8YSBocmVmPSJBUEktZGF0YXN0cnVjdC5odG1sI2xpYnJhd19jb2xvcmRhdGFfdCI+Y29sb3JkYXRhLmJsYWNrPC9hPgogICAgICBhbmQgY29sb3JkYXRhLmNibGFjaykgd2lsbCBiZSBhZGp1c3RlZCB0b28uPC9wPgogICAgPHA+VGhpcyBjYWxsIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBwb3N0cHJvY2VzcyBSQVcgZGF0YSBieSB5b3VyIG93biBjb2RlLgogICAgICBMaWJSYXcgPGEgaHJlZj0iI2RjcmF3ZW11Ij5wb3N0cHJvY2Vzc2luZyBmdW5jdGlvbnM8L2E+IHdpbGwgY2FsbCA8c3Ryb25nPnN1YnRyYWN0X2JsYWNrKCk8L3N0cm9uZz4KICAgICAgYnkgb25lc2VsZi48L3A+CiAgICA8cD5UaGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyIG51bWJlciBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIDxhIGhyZWY9IkFQSS1ub3Rlcy5odG1sI2Vycm9ycyI+cmV0dXJuCiAgICAgICAgY29kZSBjb252ZW50aW9uPC9hPjogcG9zaXRpdmUgaWYgYW55IHN5c3RlbSBjYWxsIGhhcyByZXR1cm5lZCBhbiBlcnJvciwKICAgICAgbmVnYXRpdmUgKGZyb20gdGhlIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjTGliUmF3X2Vycm9ycyI+TGliUmF3CiAgICAgICAgZXJyb3IgbGlzdDwvYT4pIGlmIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIHNpdHVhdGlvbiB3aXRoaW4gTGliUmF3LjwvcD4KICAgIDxhIG5hbWU9ImFkanVzdF90b19yYXdfaW5zZXRfY3JvcCI+PC9hPgogICAgPGg0PmludCBMaWJSYXc6OmFkanVzdF90b19yYXdfaW5zZXRfY3JvcCh1bnNpZ25lZCBtYXNrLCBmbG9hdCBtYXhjcm9wID0KICAgICAgMC41NWYpPC9oND4KICAgIDxwPiBQcm9tb3RlcyBpbWdkYXRhLnNpemVzLnJhd19pbnNldF9jcm9wc1tdIHZhbHVlcyB0byBpbWdkYXRhLnNpemVzLiptYXJnaW4KICAgICAgYW5kIGltZ2RhdGEuc2l6ZXMud2lkdGgvaGVpZ2h0IGZpZWxkczwvcD4KICAgIDxwPiBQYXJhbWV0ZXJzPGJyPgogICAgICBtYXNrOiA8L3A+CiAgICA8dWw+CiAgICAgIDxsaT5pZiBiaXQgMSBpcyBzZXQ6IHByZWZlciByYXdfaW5zZXRfY3JvcHNbMV0gPC9saT4KICAgICAgPGxpPmlmIGJpdCAwIGlzIHNldDogcHJlZmVyIHJhd19pbnNldF9jcm9wc1swXSA8L2xpPgogICAgPC91bD4KICAgIDxwPm1heGNyb3A6IGxpbWl0cyBjcm9wIHRvIG5vdCBsZXNzIHRoYW4gKG9yaWdpbmFsIHdpZHRoL2hlaWdodCkqbWF4Y3JvcDsgaWYKICAgICAgcmF3X2luc2V0X2Nyb3BzW2ldIGRhdGEgcmVzdWx0cyBpbiB0aWdodGVyIGNyb3AsIHRoYW4gdGhpcyBpdGVtIGlzCiAgICAgIGlnbm9yZWQuIDwvcD4KICAgIDxwPnJldHVybiB2YWx1ZTogaW5kZXggaW4gcmF3X2luc2V0X2Nyb3BzW10gdXNlZCBpbmNyZWFzZWQgYnkgb25lLCBzbyA8L3A+CiAgICA8dWw+CiAgICAgIDxsaT4wOiBubyBjaGFuZ2VzIG1hZGUgPC9saT4KICAgICAgPGxpPjE6IFswXXRoIGRhdGEgdXNlZCA8L2xpPgogICAgICA8bGk+MjogWzFddGggZGF0YSB1c2VkIDwvbGk+CiAgICA8L3VsPgogICAgPHA+Tm90ZTogdGhpcyBjYWxsIFNIT1VMRCBiZSB1c2VkIGFmdGVyIExpYlJhdzo6dW5wYWNrKCksIG90aGVyd2lzZSBibGFjawogICAgICBsZXZlbCBjYWxjdWxhdGlvbiBmcm9tIG1hc2tlZCBhcmVhIG1heSBiZSBmb29sZWQgcmVzdWx0aW5nIGluIHdyb25nIGJsYWNrCiAgICAgIGxldmVscy4gPC9wPgogICAgPHA+PGEgbmFtZT0iZmxvYXRpbmdwb2ludCI+PC9hPjwvcD4KICAgIDxoND5TdXBwb3J0IGZvciBmbG9hdGluZyBwb2ludCBkYXRhPC9oND4KICAgIDxwPkxpYnJhdyBjYW4gcmVhZCBmbG9hdGluZyBwb2ludCBETkcgZmlsZXMgKG5vIG90aGVyIFJBVyBmb3JtYXRzIG1heSB1c2UKICAgICAgZmxvYXRpbmcgcG9pbnQpIHdpdGggb3Igd2l0aG91dCBjb252ZXJzaW9uIHRvIGludGVnZXIgZGF0YS4gRmxvYXRpbmcgcG9pbnQKICAgICAgdmFsdWVzIGFyZSBzdG9yZWQgaW4gaW1nZGF0YS5yYXdkYXRhIGJ1ZmZlcnM6PC9wPgogICAgPHVsPgogICAgICA8bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5mbG9hdCAqIGZsb2F0X2ltYWdlPC9zcGFuPiAoaWYKICAgICAgICBub3QgTlVMTCkgcG9pbnRzIHRvIGZsb2F0aW5nIHBvaW50IGJheWVyIGRhdGE8L2xpPgogICAgICA8bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5mbG9hdCAoKmZsb2F0M19pbWFnZSlbM108L3NwYW4+CiAgICAgICAgKGlmIG5vdCBOVUxMKSBwb2ludHMgdG8gZmxvYXRpbmcgcG9pbnQgMy1jaGFubmVsIGJ1ZmZlcjwvbGk+CiAgICAgIDxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmZsb2F0ICgqZmxvYXQ0X2ltYWdlKVs0XTwvc3Bhbj4KICAgICAgICAoaWYgbm90IE5VTEwpIHBvaW50cyB0byBmbG9hdGluZyBwb2ludCA0LWNoYW5uZWwgYnVmZmVyPC9saT4KICAgIDwvdWw+CiAgICA8cD5GdW5jdGlvbiBjYWxscyBmb3IgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydDo8L3A+CiAgICA8dWw+CiAgICAgIDxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmludCBMaWJSYXc6OmlzX2Zsb2F0aW5nX3BvaW50KCk7CiAgICAgICAgPC9zcGFuPmZ1bmN0aW9uIHdpbGwgcmV0dXJuIDEgaWYgZmlsZSBjb250YWlucyBmbG9hdGluZyBwb2ludCBkYXRhPC9saT4KICAgICAgPGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+aW50IExpYlJhdzo6aGF2ZV9mcGRhdGEoKTs8L3NwYW4+CiAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gMSBpZiBGUCBkYXRhIGhhcyByZWFkIChkZWNvZGVkKSBpbnRvIG1lbW9yeSBhbmQgbm90CiAgICAgICAgY29udmVydGVkIHRvIGludGVnZXIgZGF0YTwvbGk+CiAgICAgIDxsaT5pbnQgTGliUmF3Ojpjb252ZXJ0RmxvYXRUb0ludChmbG9hdCBkbWluPTQwOTYuZiwgZmxvYXQgZG1heD0zMjc2Ny5mLAogICAgICAgIGZsb2F0IGR0YXJnZXQgPSAxNjM4My5mKSBjb252ZXJ0cyBmbG9hdGluZyBwb2ludCBkYXRhIHRvIGludGVnZXIuIElmCiAgICAgICAgZGF0YSBtYXhpbXVtIGlzIG91dCBvZiBkbWluLi5kbWF4IHJhbmdlLCB0aGFuIGRhdGEgc2NhbGVkIHRvIHNldCBtYXhpbXVtCiAgICAgICAgdG8gZHRhcmdldDwvbGk+CiAgICA8L3VsPgogICAgPHA+PGEgbmFtZT0ieWNjIj48L2E+PC9wPgogICAgPGg0PlN1cHBvcnQgZm9yIFlDQyBmb3JtYXRzIChDYW5vbiBzUkFXL21SQVcgYW5kIE5pa29uIFNtYWxsIE5FRik8L2g0PgogICAgPHByZT4gICAgICAgaW50IExpYlJhdzo6aXNfc3JhdygpOzxicj4gICAgICAgaW50IExpYlJhdzo6aXNfbmlrb25fc3JhdygpOzxicj4gICAgICAgaW50IExpYlJhdzo6c3Jhd19taWRwb2ludCgpPC9wcmU+CiAgICA8dWw+CiAgICAgIDxsaT5pc19zcmF3KCkgY2FsbCByZXR1cm5zIG5vbnplcm8gaWYgY3VycmVudCBpbWFnZSBpcyBZQ0MtYmFzZWQuPC9saT4KICAgICAgPGxpPmlzX25pa29uX3NyYXcoKSBjYWxsIHJldHVybnMgbm9uemVybyBmb3IgTmlrb24gU21hbGwgTkVGIGZpbGVzPC9saT4KICAgICAgPGxpPnNyYXdfbWlkcG9pbnQoKSBjYWxsIHJldHVybnMgbmV1dHJhbCAoZ3JheSkgcG9pbnQgZm9yIGNvbG9yIGNoYW5uZWxzPC9saT4KICAgIDwvdWw+CiAgICA8cD48YSBuYW1lPSJyZWN5Y2xlX2RhdGFzdHJlYW0iPjwvYT48L3A+CiAgICA8aDQ+dm9pZCBMaWJSYXc6OnNldF9kbmdfaG9zdCh2b2lkKiBwKTwvaDQ+CiAgICA8cD5JZiBMaWJSYXcgaXMgY29tcGlsZWQgd2l0aCBBZG9iZSBETkcgU0RLIHN1cHBvcnQgYW5kIHlvdSB3aXNoIHRvIHVzZSB0aGlzCiAgICAgIHN1cHBvcnQ6PC9wPgogICAgPHVsPgogICAgICA8bGk+eW91IG5lZWQgdG8gY3JlYXRlIG93biBkbmdfaG9zdCBvYmplY3Q8L2xpPgogICAgICA8bGk+YW5kIHBhc3MgaXQgdG8gTGliUmF3IG9iamVjdCB1c2luZyB0aGlzIGZ1bmN0aW9uPC9saT4KICAgIDwvdWw+CiAgICA8aDQ+dm9pZCBMaWJSYXc6OnJlY3ljbGVfZGF0YXN0cmVhbSh2b2lkKTwvaDQ+CiAgICA8cD5UaGlzIGNhbGwgY2xvc2VzIGlucHV0IGRhdGFzdHJlYW0gd2l0aCBhc3NvY2lhdGVkIGRhdGEgYnVmZmVyIGFuZAogICAgICB1bmJsb2NrcyBvcGVuZWQgZmlsZS4gPGEgbmFtZT0icmVjeWNsZSI+PC9hPjwvcD4KICAgIDxoMz52b2lkIExpYlJhdzo6cmVjeWNsZSh2b2lkKTwvaDM+CiAgICA8cD5GcmVlcyB0aGUgYWxsb2NhdGVkIGRhdGEgb2YgTGliUmF3IGluc3RhbmNlLCBlbmFibGluZyBvbmUgdG8gcHJvY2VzcyB0aGUKICAgICAgbmV4dCBmaWxlIHVzaW5nIHRoZSBzYW1lIHByb2Nlc3Nvci4gUmVwZWF0ZWQgY2FsbHMgb2YgcmVjeWNsZSgpIGFyZSBxdWl0ZQogICAgICBwb3NzaWJsZSBhbmQgZG8gbm90IGNvbmZsaWN0IHdpdGggYW55dGhpbmcuPC9wPgogICAgPHA+PGEgbmFtZT0ifkxpYlJhdyI+PC9hPjwvcD4KICAgIDxoMz5MaWJSYXc6On5MaWJSYXcoKTwvaDM+CiAgICA8cD5EZXN0cnVjdG9yLCB3aGljaCBjb25zaXN0cyBpbiBjYWxsaW5nIHJlY3ljbGUoKS48L3A+CiAgICA8cD48YSBuYW1lPSJzdHJwcm9ncmVzcyI+PC9hPjwvcD4KICAgIDxoMz5jb25zdCBjaGFyKiBMaWJSYXc6OnN0cnByb2dyZXNzKGVudW0gTGliUmF3X3Byb2dyZXNzIGNvZGUpPC9oMz4KICAgIDxwPkNvbnZlcnRzIHByb2dyZXNzIHN0YWdlIGNvZGUgdG8gZGVzY3JpcHRpb24gc3RyaW5nIChpbiBFbmdsaXNoKS48L3A+CiAgICA8cD48YSBuYW1lPSJsaWJyYXdfc3RyZXJyb3IiPjwvYT48L3A+CiAgICA8aDM+Y29uc3QgY2hhciogTGliUmF3OjpzdHJlcnJvcihpbnQgZXJyb3Jjb2RlKTwvaDM+CiAgICA8cD5BbmFsb2cgb2Ygc3RyZXJyb3IoMykgZnVuY3Rpb246IG91dHB1dHMgdGhlIHRleHQgZGVzY3JpcHRpb25zIG9mIExpYlJhdwogICAgICBlcnJvciBjb2RlcyAoaW4gRW5nbGlzaCkuPC9wPgogICAgICAgIDxwPjxhIG5hbWU9InNpbXBsaWZ5X21ha2VfbW9kZWwiPjwvYT48L3A+CiAgICA8aDM+c3RhdGljIHZvaWQgTGliUmF3OjpzaW1wbGlmeV9tYWtlX21vZGVsKHVuc2lnbmVkICogbWtpbmRleCwgY2hhciAqbWtidWYsCiAgICAgIHVuc2lnbmVkIG1rYnVmX3NpemUsIGNoYXIgKm1vZGVsYnVmLCB1bnNpZ25lZCBtb2RlbGJ1Zl9zaXplKTwvaDM+CiAgICBUaGlzIGNhbGwgY2FuIGJlIHVzZWQgdG8gc2ltcGxpZnkvc3RhbmRhcmRpemUgdmVuZG9yIG5hbWUvbW9kZWwgcmVjZWl2ZWQKICAgIGZyb20gZXh0ZXJuYWwgc291cmNlIChlLmcuIEVYSUYgYmxvY2sgaW4gSlBFRyBmaWxlKS4KICAgIDxwPjwvcD4KICAgIFBhcmFtZXRlcnM6CiAgICA8dWw+CiAgICAgIDxsaT5ta2luZGV4OiBwb2ludGVyIHRvIHJlY2VpdmVkIG1ha2VyIGluZGV4IChMaWJSYXdfQ0FNRVJBTUFLRVJfLi4uKSA8L2xpPgogICAgICA8bGk+bWtidWYsIG1rYnVmX3NpemU6IGJ1ZmZlciB3aXRoIG1ha2Ugc3RyaW5nLCBidWZmZXIgc2l6ZSA8L2xpPgogICAgICA8bGk+bW9kZWxidWYsIG1vZGVsYnVmX3NpemU6IGJ1ZmZlciB3aXRoIG1vZGVsIHN0cmluZy4gPC9saT4KICAgIDwvdWw+CiAgICBzaW1wbGlmeV9tYWtlX21vZGVsKC4uKSBzaW1wbGlmaWVzL3JlLXdyaXRlcyB2ZW5kb3IgbmFtZS9tb2RlbCBpbiBwbGFjZSwgaW4KICAgIHByb3ZpZGVkIGJ1ZmZlcnMuCiAgICA8cD4gcmV0dXJuIHZhbHVlczogPC9wPgogICAgPHVsPgogICAgICA8bGk+MCAtIG1raW5kZXggaXMgc2V0IChpZiBub24tbnVsbCBwb2ludGVyIHByb3ZpZGVkKSwgZGF0YSBzaW1wbGlmaWVkOyA8L2xpPgogICAgICA8bGk+MSAtIG1raW5kZXggaXMgbm90IHNldCwgd2hpbGUgc29tZSBkYXRhIHByb2Nlc3NpbmcgaXMgZG9uZTsgPC9saT4KICAgICAgPGxpPi0xIC0gaW5jb3JyZWN0IHBhcmFtZXRlcnM7IDwvbGk+CiAgICA8L3VsPgoKICAgIDxwPjxhIG5hbWU9ImNhbGxiYWNrcyI+PC9hPjwvcD4KICAgIDxoMz5TZXR0aW5nIEVycm9yIE5vdGlmaWNhdGlvbiBGdW5jdGlvbnM8L2gzPgogICAgPHA+SW4gcHJvY2VzcyBvZiBSQVcgY29udmVyc2lvbiBMaWJSYXcgY2FuIGNhbGwgdXNlci1zZXR0ZWQgY2FsbGJhY2suIFRoaXMKICAgICAgY2FsbGJhY2sgY2FuIGJlIHVzZWQgZm9yOjwvcD4KICAgIDx1bD4KICAgICAgPGxpPkR5bmFtaWMgc3RhdHVzIHVwZGF0ZSAocHJvZ3Jlc3MgYmFyIGFuZCBzbyBvbikuPC9saT4KICAgICAgPGxpPkNhbmNlbCBvZiBwcm9jZXNzaW5nIChmb3IgZXhhbXBsZSwgdXNlciBwcmVzc2VkIENhbmNlbCBidXR0b24pLjwvbGk+CiAgICA8L3VsPgogICAgPHA+QWxzbywgd29yayBvZiB0aGUgbGlicmFyeSBtYXkgY2F1c2UgdHdvIHR5cGVzIG9mIGV4Y2VwdGlvbmFsIHNpdHVhdGlvbnMKICAgICAgdGhhdCByZXF1aXJlIG5vdGlmaWNhdGlvbiBvZiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbjo8L3A+CiAgICA8dWw+CiAgICAgIDxsaT5NZW1vcnkgc2hvcnRhZ2U8L2xpPgogICAgICA8bGk+RGF0YSByZWFkIGVycm9yLjwvbGk+CiAgICA8L3VsPgogICAgPHA+QW4gYXBwbGljYXRpb24gbWF5IHNldCBpdHMgb3duIGNhbGxiYWNrcyB0aGF0IHdpbGwgYmUgY2FsbGVkIGluIHRoZSBjYXNlcwogICAgICBtZW50aW9uZWQgYWJvdmUgdG8gbm90aWZ5IHRoZSB1c2VyIChvciB0aGUgY2FsbGluZyBwcm9ncmFtKS48L3A+CiAgICA8cD48YSBuYW1lPSJwcm9ncmVzcyI+PC9hPjwvcD4KICAgIDxoND5Qcm9ncmVzcyBpbmRpY2F0aW9uL3Byb2Nlc3NpbmcgdGVybWluYXRpb248L2g0PgogICAgPHByZT4gICAgICAgIHR5cGVkZWYgaW50ICgqcHJvZ3Jlc3NfY2FsbGJhY2spKHZvaWQgKmNhbGxiYWNrX2RhdGEsZW51bSBMaWJSYXdfcHJvZ3Jlc3Mgc3RhZ2UsIGludCBpdGVyYXRpb24sIGludCBleHBlY3RlZCk7PGJyPiAgICAgICAgdm9pZCBMaWJSYXc6OnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzX2NhbGxiYWNrIGZ1bmMsdm9pZCAqY2FsbGJhY2tfZGF0YSk7PGJyPiAgICA8L3ByZT4KICAgIDxwPkxpYlJhdyB1c2VyIGNhbiBzZXQgb3duIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgY2FsbGVkIDEwLTUwIHRpbWVzIGR1cmluZwogICAgICBSQVcgcG9zdHByb2Nlc3NpbmcgYnkgZGNyYXdfcHJvY2VzcygpLjwvcD4KICAgIDxwPlRoaXMgY2FsbGJhY2sgbWF5IHRlcm1pbmF0ZSBjdXJyZW50IGltYWdlIHByb2Nlc3NpbmcgYnkgcmV0dXJuaW5nIG9mCiAgICAgIG5vbi16ZXJvIHZhbHVlLiBJbiBzdWNoIGNhc2UgYWxsIHByb2Nlc3Npbmcgd2lsbCBiZSBjYW5jZWxsZWQgaW1tZWRpYXRlbHkKICAgICAgYW5kIGFsbCByZXNvdXJjZXMgd2lsbCBiZSByZXR1cm5lZCB0byBzeXN0ZW0gYnkgcmVjeWNsZSgpIGNhbGwuIEN1cnJlbnQKICAgICAgY2FsbCBvZiBkY3Jhd19wcm9jZXNzKCkgd2lsbCByZXR1cm4gZXJyb3IgY29kZQogICAgICBMSUJSQVdfQ0FOQ0VMTEVEX0JZX0NBTExCQUNLLjwvcD4KICAgIDxwPkNhbGxiYWNrIHBhcmFtZXRlcnM6PC9wPgogICAgPGRsPgogICAgICA8ZHQ+dm9pZCAqY2FsbGJhY2tfZGF0YTwvZHQ+CiAgICAgIDxkZD52b2lkKi1wb2ludGVyLCBwYXNzZWQgYXMgMm5kIGFyZ3VtZW50IHRvIHNldF9wcm9ncmVzc19oYW5kbGVyKCkuIFRoaXMKICAgICAgICBwb2ludGVyIHNob3VsZCBiZSB1c2VkIHRvIHBhc3MgYWRkaXRpb25hbCBkYXRhIHRvIGNhbGxiYWNrIChpLmUuIHRocmVhZAogICAgICAgIGxvY2FsIGRhdGEgYW5kIHNvIG9uKS48L2RkPgogICAgICA8ZHQ+ZW51bSBMaWJSYXdfcHJvZ3Jlc3Mgc3RhZ2U8L2R0PgogICAgICA8ZGQ+Q3VycmVudCBwcm9jZXNzaW5nIHN0YWdlLiBUaGlzIG51bWJlciBjYW4gYmUgY29udmVydGVkIHRvIHN0cmluZyBieQogICAgICAgIGNhbGwgdG8gPGEgaHJlZj0iI3N0cnByb2dyZXNzIj5MaWJSYXc6OnN0cnByb2dyZXNzPC9hPi4gTm90IGFsbAogICAgICAgIHByb2Nlc3Npbmcgc3RhZ2VzIGFyZSBjb3ZlcmVkIGJ5IGNhbGxiYWNrIGNhbGxzLjwvZGQ+CiAgICAgIDxkdD5pbnQgaXRlcmF0aW9uPC9kdD4KICAgICAgPGRkPkl0ZXJhdGlvbiBudW1iZXIgd2l0aGluIGN1cnJlbnQgc3RhZ2UgKGZyb20gMCB0byBleHBlY3RlZC0xKS48L2RkPgogICAgICA8ZHQ+aW50IGV4cGVjdGVkPC9kdD4KICAgICAgPGRkPkV4cGVjdGVkIG51bWJlciBvZiBpdGVyYXRpb25zIG9uIGN1cnJlbnQgc3RhZ2UuPC9kZD4KICAgIDwvZGw+CiAgICA8cD5DYWxsYmFjayBzaG91bGQgcmV0dXJuIHZhbHVlIG9mOiA8c3Ryb25nPjA8L3N0cm9uZz4gZm9yIGNvbnRpbnVlCiAgICAgIHByb2Nlc3NpbmcgYW5kIDxzdHJvbmc+bm9uLXplcm88L3N0cm9uZz4gZm9yIGltbWVkaWF0ZSBjYW5jZWwgb2YKICAgICAgcHJvY2Vzc2luZy48L3A+CiAgICA8cD4mbmJzcDs8L3A+CiAgICA8cD5JZiBMaWJSYXcgY29tcGlsZWQgd2l0aCBPcGVuTVAgc3VwcG9ydCwgaXRlcmF0aW9uIHBhcmFtZXRlciBtYXkgbm90CiAgICAgIGFsd2F5cyBpbmNyZWFzZSB3aXRoaW4gb25lIHN0YWdlLiBPdXQgb2Ygb3JkZXIgY2FsbGJhY2sgY2FsbHMgYXJlCiAgICAgIHBvc3NpYmxlLjwvcD4KICAgIDxwPkNhbGxiYWNrIGNvZGUgc2FtcGxlOjwvcD4KICAgIDxwcmU+aW50IG15X3Byb2dyZXNzX2NhbGxiYWNrKHZvaWQgKmRhdGEsZW51bSBMaWJSYXdfcHJvZ3Jlc3MgcCxpbnQgaXRlcmF0aW9uLCBpbnQgZXhwZWN0ZWQpPGJyPns8YnI+ICAgIGNoYXIgKnBhc3NlZF9zdHJpbmcgPSAoY2hhciAqZGF0YSk7PGJyPiAgICBwcmludGYoIkNhbGxiYWNrOiAlcyAgcGFzcyAlZCBvZiAlZCwgZGF0YSBwYXNzZWQ6ICVzXG4iLGxpYnJhd19zdHJwcm9ncmVzcyhwKSxpdGVyYXRpb24sZXhwZWN0ZWQscGFzc2VkX3N0cmluZyk7PGJyPiAgICBpZih0aW1lb3V0IHx8IGtleV9wcmVzc2VkICk8YnI+ICAgICAgICByZXR1cm4gMTsgLy8gY2FuY2VsIHByb2Nlc3NpbmcgaW1tZWRpYXRlbHk8YnI+ICAgIGVsc2U8YnI+ICAgICAgICByZXR1cm4gMDsgLy8gY2FuIGNvbnRpbnVlPGJyPn08L3ByZT4KICAgIDxwPjxhIG5hbWU9ImV4aWYiPjwvYT48L3A+CiAgICA8aDQ+VXNlci1zcGVjaWZpZWQgZXhpZiB0YWcgcGFyc2VyIGNhbGxiYWNrPC9oND4KICAgIDxwcmU+ICAgICAgIHR5cGVkZWYgdm9pZCAoKmV4aWZfcGFyc2VyX2NhbGxiYWNrKSAodm9pZCAqY29udGV4dCwgaW50IHRhZywgaW50IHR5cGUsIGludCBsZW4sdW5zaWduZWQgaW50IG9yZCwgdm9pZCAqaWZwKTs8YnI+ICAgICAgIHZvaWQgICAgTGliUmF3OjpzZXRfZXhpZnBhcnNlcl9oYW5kbGVyKCBleGlmX3BhcnNlcl9jYWxsYmFjayBjYix2b2lkICpjb250ZXh0KTs8YnI+ICAgICAgIHZvaWQgICAgTGliUmF3OjpzZXRfbWFrZXJub3Rlc19oYW5kbGVyKCBleGlmX3BhcnNlcl9jYWxsYmFjayBjYix2b2lkICpjb250ZXh0KTs8L3ByZT4KICAgIDxwPkNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBlYWNoIHBhcnNlZCBFWElGL01ha2Vybm90ZXMgdGFnIHdpdGggcGFyYW1ldGVyczo8L3A+CiAgICA8dWw+CiAgICAgIDxsaT5jb250ZXh0IC0gcG9pbnRlciB0byBjb250ZXh0IHBhc3NlZCB0byBzZXRfZXhpZnBhcnNlcl9oYW5kbGVyKCk7PC9saT4KICAgICAgPGxpPnRhZyAtIEVYSUYvTWFrZXJub3RlcyB0YWcgdmFsdWU8L2xpPgogICAgICA8bGk+dHlwZSAtIFRJRkYoRVhJRikgdGFnIHR5cGU8L2xpPgogICAgICA8bGk+bGVuIC0gdGFnIGxlbmd0aDwvbGk+CiAgICAgIDxsaT5vcmQgLSBieXRlIG9yZGVyIChJSSBvciBNTSk8L2xpPgogICAgICA8bGk+dm9pZCAqaWZwIC0gcG9pbnRlciB0byBMaWJSYXdfYWJzdHJhY3RfZGF0YXN0cmVhbSwgcG9zaXRpb25lZCB0byB0YWcKICAgICAgICBkYXRhPC9saT4KICAgIDwvdWw+CiAgICA8cD48YSBuYW1lPSJkYXRhZXJyb3IiPjwvYT48L3A+CiAgICA8aDQ+RmlsZSBSZWFkIEVycm9yIE5vdGlmaWVyPC9oND4KICAgIDxwcmU+ICAgICAgICB0eXBlZGVmIHZvaWQgKCpkYXRhX2NhbGxiYWNrKSh2b2lkICpjYWxsYmFja19kYXRhLGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGludCBvZmZzZXQpOzxicj4gICAgICAgIHZvaWQgTGliUmF3OjpzZXRfZGF0YWVycm9yX2hhbmRsZXIoZGF0YV9jYWxsYmFjayBmdW5jLCB2b2lkICpjYWxsYmFja19kYXRhKTsgPGJyPiAgICA8L3ByZT4KICAgIDxwPlRoZSB1c2VyIGNhbiBkZWZpbmUgaGlzIG9yIGhlciBvd24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHRoZSBjYXNlIG9mCiAgICAgIGVycm9yIGluIHRoZSBpbnB1dCBkYXRhLiBJdCBpcyBhIHZvaWQgZnVuY3Rpb24gcmVjZWl2aW5nIHR3byBwYXJhbWV0ZXJzOjwvcD4KICAgIDx1bD4KICAgICAgPGxpPjxzdHJvbmc+dm9pZCAqY2FsbGJhY2tfZGF0YTwvc3Ryb25nPiAtIHZvaWQqLXBvaW50ZXIsIHBhc3NlZCBhcyAybmQKICAgICAgICBhcmd1bWVudCB0byBzZXRfcHJvZ3Jlc3NfaGFuZGxlcigpLiBUaGlzIHBvaW50ZXIgc2hvdWxkIGJlIHVzZWQgdG8gcGFzcwogICAgICAgIGFkZGl0aW9uYWwgZGF0YSB0byBjYWxsYmFjayAoaS5lLiB0aHJlYWQgbG9jYWwgZGF0YSBhbmQgc28gb24pLjwvbGk+CiAgICAgIDxsaT48c3Ryb25nPmZpbGU8L3N0cm9uZz4gaXMgdGhlIG5hbWUgb2YgdGhlIFJBVyBmaWxlIHdob3NlIHByb2Nlc3NpbmcKICAgICAgICBldm9rZWQgdGhlIGZpbGUgcmVhZCBlcnJvci4gVGhpcyBuYW1lIDxzdHJvbmc+Y2FuIGJlIE5VTEw8L3N0cm9uZz4gaWYKICAgICAgICB1bmRlcmx5aW5nIGRhdGEgaW5wdXQgbGF5ZXIgZG9lcyBub3Qga25vdyB0aGUgbmFtZS4gU28sIGlmIGNhbGxpbmcKICAgICAgICBhcHBsaWNhdGlvbiBzZXRzIG93biBjYWxsYmFjaywgdGhpcyBjYWxsYmFjayBzaG91bGQgd29yayB3aXRoIE5VTEwgZmlsZQogICAgICAgIG5hbWUuPC9saT4KICAgICAgPGxpPjxzdHJvbmc+b2Zmc2V0PC9zdHJvbmc+IGlzIC0xIGF0IGVuZC1vZi1maWxlIChpZiBMaWJSYXcgZXhwZWN0cyBtb3JlCiAgICAgICAgZGF0YSkgb3IgYSBwb3NpdGl2ZSBudW1iZXIgZXF1YWwgdG8gdGhlIGZpbGUgcG9zaXRpb24gKGJ5dGVzIGZyb20gZmlsZQogICAgICAgIGJlZ2lubmluZykgd2hlcmUgdGhlIHVucGFja2luZyBlcnJvciBvY2N1cnJlZC48L2xpPgogICAgPC91bD4KICAgIDxwPlRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXM6IGl0IG5vdGlmaWVzCiAgICAgIHRoZSB1c2VyIG9yIHRoZSBwcm9ncmFtIGNvZGUgdGhhdCBwcm9jZXNzaW5nIGlzIGltcG9zc2libGUuPC9wPgogICAgPHA+SWYgdGhlIHVzZXIgZG9lcyBub3Qgc2V0IGhpcyBvciBoZXIgb3duIGhhbmRsZXIsIHRoZSBzdGFuZGFyZCBvbmUgKG91dHB1dAogICAgICBvZiBlcnJvciBtZXNzYWdlIGluIHN0ZGVycikgd2lsbCBiZSB1c2VkLjwvcD4KICAgIDxwPk9uZSBjYW4gc2V0IHRoZSBudWxsIGhhbmRsZXIgYnkgcGFzc2luZyBOVUxMIHRvIHNldF9kYXRhZXJyb3JfaGFuZGxlcjsKICAgICAgdGhlbiBubyBub3RpZmllciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZC4gVGhlIHNhbWUgZWZmZWN0IGNhbiBiZSBhY2hpZXZlZAogICAgICBieSBjcmVhdGluZyBhIExpYlJhdyBvYmplY3Qgd2l0aCB0aGUgTElCUkFXX09QVElPTlNfTk9fREFUQUVSUl9DQUxMQkFDSwogICAgICBmbGFnIGluIHRoZSBjb25zdHJ1Y3Rvci48L3A+CiAgICA8cD5JbiB0aGUgY2FzZSBvZiBlcnJvciBpbiB0aGUgaW5wdXQgZGF0YSwgcHJvY2Vzc2luZyBvZiB0aGUgY3VycmVudCBmaWxlIGlzCiAgICAgIHRlcm1pbmF0ZWQgYW5kIGEgbm90aWZpZXIgaXMgY2FsbGVkOyBhbGwgYWxsb2NhdGVkIHJlc291cmNlcyBhcmUgZnJlZWQsCiAgICAgIGFuZCA8YSBocmVmPSIjcmVjeWNsZSI+cmVjeWNsZSgpPC9hPiBpcyBwZXJmb3JtZWQuIFRoZSBjdXJyZW50IGNhbGwgd2lsbAogICAgICByZXR1cm4gTElCUkFXX0lPX0VSUk9SLiA8YnI+CiAgICAgIEF0IGFuIGF0dGVtcHQgdG8gY29udGludWUgZGF0YSBwcm9jZXNzaW5nLCBhbGwgc3Vic2VxdWVudCBjYWxscyB3aWxsCiAgICAgIHJldHVybiBMSUJSQVdfT1VUX09GX09SREVSX0NBTEwuIFByb2Nlc3Npbmcgb2YgYSBuZXcgZmlsZSBtYXkgYmUgc3RhcnRlZAogICAgICBpbiB0aGUgdXN1YWwgd2F5LCBieSBjYWxsaW5nIExpYlJhdzo6b3Blbl9maWxlKCkuPC9wPgogICAgPHA+PGEgbmFtZT0iZGNyYXdlbXUiPjwvYT48L3A+CiAgICA8aDI+RGF0YSBQb3N0cHJvY2Vzc2luZzogRW11bGF0aW9uIG9mIGRjcmF3IEJlaGF2aW9yPC9oMj4KICAgIDxwPkluc3RlYWQgb2Ygd3JpdGluZyBvbmUncyBvd24gQmF5ZXIgcGF0dGVybiBwb3N0cHJvY2Vzc2luZywgb25lIGNhbiB1c2UKICAgICAgdGhlIGRjcmF3IGZ1bmN0aW9ucywgd2hpY2ggYXJlIGNhbGxlZCBhZnRlciB0aGUgY2FsbHMgb2Ygb3Blbl9maWxlKCkgKwogICAgICB1bnBhY2soKSAvKyB1bnBhY2tfdGh1bWIoKS88L3A+CiAgICA8cD48YSBuYW1lPSJkY3Jhd19wYXJhbXMiPjwvYT48L3A+CiAgICA8aDM+UGFyYW1ldGVyIFNldHRpbmc8L2gzPgogICAgPHA+VmlydHVhbGx5IGFsbCBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB0aHJvdWdoIHRoZSBkY3JhdyBjb21tYW5kIGxpbmUKICAgICAgYXJlIHNwZWNpZmllZCBieSBhc3NpZ25pbmcgdmFsdWVzIHRvIGZpZWxkcyBvZiB0aGUgPHN0cm9uZz5MaWJSYXc6OmltZ2RhdGEucGFyYW1zPC9zdHJvbmc+CiAgICAgIHN0cnVjdHVyZS4gVGhlIHR5cGUgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgPHN0cm9uZz5saWJyYXdfb3V0cHV0X3BhcmFtc190PC9zdHJvbmc+OwogICAgICBhbGwgZmllbGRzIGFyZSBsaXN0ZWQgYW5kIGRlc2NyaWJlZCBpbiBzdWZmaWNpZW50IGRldGFpbCBpbiB0aGUgPGEgaHJlZj0iQVBJLWRhdGFzdHJ1Y3QuaHRtbCNsaWJyYXdfb3V0cHV0X3BhcmFtc190Ij5kZXNjcmlwdGlvbgogICAgICAgIG9mIGRhdGEgc3RydWN0dXJlczwvYT4uPC9wPgogICAgPHA+PGEgbmFtZT0icmF3MmltYWdlIj48L2E+PC9wPgogICAgPGgzPmludCBMaWJSYXc6OnJhdzJpbWFnZTwvaDM+CiAgICA8cD5UaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBidWZmZXIgZm9yIHBvc3Rwcm9jZXNzaW5nIChpbWdkYXRhLmltYWdlKSBhbmQKICAgICAgZmlsbHMgaXQgd2l0aCBkYXRhIGxheW91dCBjb21wYXRpYmxlIHdpdGggTGliUmF3IDAuMTMvMC4xNCBhbmQgYmVsb3cuIElmCiAgICAgIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIGl0IHdpbGwgYmUgZnJlZSgpZWQgYW5kIGFsbG9jYXRlZCBhZ2Fpbi48L3A+CiAgICA8cD5UaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBpZiB5b3VyIGNvZGUgZG8gcG9zdHByb2Nlc3Npbmcgc3RhZ2UuCiAgICAgIElmIHlvdSB1c2UgTGliUmF3J3MgcG9zdHByb2Nlc3NpbmcgY2FsbHMgKHNlZSBiZWxvdykgeW91IGRvbid0IG5lZWQgdG8KICAgICAgY2FsbCByYXcyaW1hZ2UoKS48L3A+CiAgICA8cD5UaGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyIG51bWJlciBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIDxhIGhyZWY9IkFQSS1ub3Rlcy5odG1sI2Vycm9ycyI+cmV0dXJuCiAgICAgICAgY29kZSBjb252ZW50aW9uPC9hPjogcG9zaXRpdmUgaWYgYW55IHN5c3RlbSBjYWxsIGhhcyByZXR1cm5lZCBhbiBlcnJvciwKICAgICAgbmVnYXRpdmUgKGZyb20gdGhlIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjTGliUmF3X2Vycm9ycyI+TGliUmF3CiAgICAgICAgZXJyb3IgbGlzdDwvYT4pIGlmIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIHNpdHVhdGlvbiB3aXRoaW4gTGliUmF3LjwvcD4KICAgIDxwPjxhIG5hbWU9ImZyZWVfaW1hZ2UiPjwvYT48L3A+CiAgICA8aDM+dm9pZCBMaWJSYXc6OmZyZWVfaW1hZ2U8L2gzPgogICAgPHA+VGhpcyBmdW5jdGlvbiByZWxlYXNlcyB0aGUgaW1nZGF0YS5pbWFnZSBidWZmZXIgYWxsb2NhdGVkIGJ5IHJhdzJpbWFnZSgpOzwvcD4KICAgIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaWYgY3VycmVudCBwb3N0cHJvY2Vzc2luZyByZXN1bHRzIGFyZSBub3QKICAgICAgbmVlZGVkIGJ5IHRoZSBwcm9ncmFtIChlLmcuIGFscmVhZHkgY29waWVkIHNvbWV3aGVyZSksIGJ1dCBuZXcKICAgICAgcG9zdHByb2Nlc3NpbmcgY2FsbHMgKHdpdGggYW5vdGhlciBzZXR0aW5ncykgYXJlIHBvc3NpYmxlLCBzbyBpdCBpcyB0bwogICAgICBlYXJseSB0byBjYWxsIDxhIGhyZWY9IiNyZWN5Y2xlIj5yZWN5Y2xlKCk8L2E+LjwvcD4KICAgIDxwPjxhIG5hbWU9ImFkanVzdF9zaXplc19pbmZvX29ubHkiPjwvYT48L3A+CiAgICA8aDM+aW50IExpYlJhdzo6YWRqdXN0X3NpemVzX2luZm9fb25seSh2b2lkKTwvaDM+CiAgICA8cD5UaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29ycmVjdCBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UKICAgICAgKGltZ2RhdGEuc2l6ZXMuaXdpZHRoIGFuZCBpbWdkYXRhLnNpemVzLmloZWlnaHQpIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOjwvcD4KICAgIDx1bD4KICAgICAgPGxpPkZpbGVzIGZyb20gRnVqaSBjYW1lcmFzICh3aXRoIGEgNDUtZGVncmVlIHJvdGF0aW9uKTwvbGk+CiAgICAgIDxsaT5GaWxlcyBmcm9tIGNhbWVyYXMgd2l0aCBub24tc3F1YXJlIHBpeGVsczwvbGk+CiAgICAgIDxsaT5JbWFnZXMgc2hvdCBieSBhIHJvdGF0ZWQgY2FtZXJhLjwvbGk+CiAgICA8L3VsPgogICAgPHA+SW4gdGhlIGFmb3JlbWVudGlvbmVkIGNhc2VzLCB0aGUgZnVuY3Rpb24gY2hhbmdlcyB0aGUgZmllbGRzIG9mIHRoZSBpbWFnZQogICAgICBvdXRwdXQgc2l6ZTsgbm90ZSB0aGF0IHRoaXMgY2hhbmdlIGNhbm5vdCBiZSByZXBlYXRlZCBhZ2Fpbi48L3A+CiAgICA8cD48YSBuYW1lPSJkY3Jhd19wcm9jZXNzIj48L2E+PC9wPgogICAgPGgzPmludCBMaWJSYXc6OmRjcmF3X3Byb2Nlc3Modm9pZCk8L2gzPgogICAgPHA+VGhlIGZ1bmN0aW9uIGVtdWxhdGVzIHRoZSBwb3N0cHJvY2Vzc2luZyBjYXBhYmlsaXRpZXMgYXZhaWxhYmxlIGluIDxzdHJvbmc+ZGNyYXc8L3N0cm9uZz4uPGJyPgogICAgICBDYWxsZWQgYWZ0ZXIgY2FsbGluZyBMaWJSYXc6OnVucGFjaygpOzwvcD4KICAgIDxwPlRoZSBlbnRpcmUgZnVuY3Rpb25hbGl0eSBvZiBkY3JhdyAoc2V0IHZpYSB0aGUgZmllbGQgdmFsdWVzIGluIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjbGlicmF3X291dHB1dF9wYXJhbXNfdCI+aW1nZGF0YS5wYXJhbXM8L2E+KQogICAgICBpcyBzdXBwb3J0ZWQsIGV4Y2VwdCBmb3I8L3A+CiAgICA8dWw+CiAgICAgIDxsaT5EYXJrIGZyYW1lIHN1YnRyYWN0aW9uPC9saT4KICAgICAgPGxpPldvcmsgd2l0aCBiYWQgcGl4ZWxzLjwvbGk+CiAgICA8L3VsPgogICAgPHA+VGhlIGZ1bmN0aW9uIGlzIGludGVuZGVkIHNvbGVseSBmb3IgZGVtb25zdHJhdGlvbiBhbmQgdGVzdGluZyBwdXJwb3NlczsKICAgICAgaXQgaXMgYXNzdW1lZCB0aGF0IGl0cyBzb3VyY2UgY29kZSB3aWxsIGJlIHVzZWQgaW4gbW9zdCByZWFsIGFwcGxpY2F0aW9ucwogICAgICBhcyB0aGUgcmVmZXJlbmNlIG1hdGVyaWFsIGNvbmNlcm5pbmcgdGhlIG9yZGVyIG9mIFJBVyBkYXRhIHByb2Nlc3NpbmcuPC9wPgogICAgPHA+VGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlciBudW1iZXIgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSA8YSBocmVmPSJBUEktbm90ZXMuaHRtbCNlcnJvcnMiPmVycm9yCiAgICAgICAgY29kZSBjb252ZW50aW9uPC9hPjogcG9zaXRpdmUgaWYgYW55IHN5c3RlbSBjYWxsIGhhcyByZXR1cm5lZCBhbiBlcnJvciwKICAgICAgbmVnYXRpdmUgKGZyb20gdGhlIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjTGliUmF3X2Vycm9ycyI+TGliUmF3CiAgICAgICAgZXJyb3IgbGlzdDwvYT4pIGlmIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIHNpdHVhdGlvbiB3aXRoaW4gTGliUmF3LjwvcD4KICAgIDxwPjxhIG5hbWU9ImRjcmF3cml0ZSI+PC9hPjwvcD4KICAgIDxoMj5EYXRhIE91dHB1dCB0byBGaWxlczogRW11bGF0aW9uIG9mIGRjcmF3IEJlaGF2aW9yPC9oMj4KICAgIDxwPkluIHNwaXRlIG9mIHRoZSBhYnVuZGFuY2Ugb2YgbGlicmFyaWVzIGZvciBmaWxlIG91dHB1dCBpbiBhbnkgZm9ybWF0cywKICAgICAgTGliUmF3IGluY2x1ZGVzIGNhbGxzIHRoYXQgZW11bGF0ZSB0aGUgZmlsZSBvdXRwdXQgcHJvdmlkZWQgYnkgZGNyYXcuIFRoaXMKICAgICAgaXMgZG9uZSBwcmltYXJpbHkgZm9yIGVhc2llciB2ZXJpZmljYXRpb24gb2YgbGlicmFyeSB3b3JrOiB0aGUgcmVzdWx0YW50CiAgICAgIGZpbGVzIG11c3QgYmUgYmluYXJ5IGlkZW50aWNhbC48L3A+CiAgICA8cD48YSBuYW1lPSJkY3Jhd19wcG1fdGlmZl93cml0ZXIiPjwvYT48L3A+CiAgICA8aDM+aW50IExpYlJhdzo6ZGNyYXdfcHBtX3RpZmZfd3JpdGVyKGNvbnN0IGNoYXIgKm91dGZpbGUpPC9oMz4KICAgIDxwPlRoZSBmdW5jdGlvbiBvdXRwdXRzIHRoZSBwb3N0cHJvY2Vzc2luZyByZXN1bHRzIHRvIGEgZmlsZSBpbiB0aGUgUFBNL1BHTQogICAgICBvciBUSUZGIGZvcm1hdCAodGhlIGZvcm1hdCBpcyBzZXQgdmlhIGltZ2RhdGEucGFyYW1zLm91dHB1dF90aWZmKS4gVGhlCiAgICAgIHJlc3VsdHMgYXJlIGJpbmFyeSBpZGVudGljYWwgdG8gdGhvc2UgcHJvdmlkZWQgYnkgZGNyYXcuPC9wPgogICAgPHA+SWYgIi0iIGlzIHBhc3NlZCBhcyBvdXRmaWxlLCB0aGUgZnVuY3Rpb24gd2lsbCB3cml0ZSB0byBzdGFuZGFyZCBvdXRwdXQKICAgICAgKHN0ZG91dCkuPC9wPgogICAgPHA+VGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlciBudW1iZXIgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSA8YSBocmVmPSJBUEktbm90ZXMuaHRtbCNlcnJvcnMiPmVycm9yCiAgICAgICAgY29kZSBjb252ZW50aW9uPC9hPjogcG9zaXRpdmUgaWYgYW55IHN5c3RlbSBjYWxsIGhhcyByZXR1cm5lZCBhbiBlcnJvciwKICAgICAgbmVnYXRpdmUgKGZyb20gdGhlIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjTGliUmF3X2Vycm9ycyI+TGliUmF3CiAgICAgICAgZXJyb3IgbGlzdDwvYT4pIGlmIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIHNpdHVhdGlvbiB3aXRoaW4gTGliUmF3LjwvcD4KICAgIDxwPjxhIG5hbWU9ImRjcmF3X3RodW1iX3dyaXRlciI+PC9hPjwvcD4KICAgIDxoMz5pbnQgTGliUmF3OjpkY3Jhd190aHVtYl93cml0ZXIoY29uc3QgY2hhciAqdGh1bWJmaWxlKTwvaDM+CiAgICA8cD5Xcml0ZXMgdGhlIHRodW1ibmFpbCB0byBhIGZpbGUgaW4gdGhlIFBQTSBmb3JtYXQgZm9yIGJpdG1hcCB0aHVtYm5haWxzCiAgICAgIGFuZCBpbiB0aGUgSlBFRyBmb3JtYXQgZm9yIEpQRUcgdGh1bWJuYWlscywgaS5lLiwgaW4gdGhlIGZvcm1hdCBjb21wbGV0ZWx5CiAgICAgIGlkZW50aWNhbCB0byB0aGUgcmVzdWx0cyBwcm92aWRlZCBieSBkY3Jhdy48L3A+CiAgICA8cD5UaGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyIG51bWJlciBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIDxhIGhyZWY9IkFQSS1ub3Rlcy5odG1sI2Vycm9ycyI+ZXJyb3IKICAgICAgICBjb2RlIGNvbnZlbnRpb248L2E+OiBwb3NpdGl2ZSBpZiBhbnkgc3lzdGVtIGNhbGwgaGFzIHJldHVybmVkIGFuIGVycm9yLAogICAgICBuZWdhdGl2ZSAoZnJvbSB0aGUgPGEgaHJlZj0iQVBJLWRhdGFzdHJ1Y3QuaHRtbCNMaWJSYXdfZXJyb3JzIj5MaWJSYXcKICAgICAgICBlcnJvciBsaXN0PC9hPikgaWYgdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3Igc2l0dWF0aW9uIHdpdGhpbiBMaWJSYXcuPC9wPgogICAgPHA+PGEgbmFtZT0ibWVtd3JpdGUiPjwvYT48L3A+CiAgICA8aDI+Q29weWluZyB1bnBhY2tlZCBkYXRhIGludG8gbWVtb3J5IGJ1ZmZlcjwvaDI+CiAgICA8cD5UaGVyZSBpcyBzZXZlcmFsIGZ1bmN0aW9uIGNhbGxzIGZvciBzdG9yZSB1bnBhY2tlZCBkYXRhIGludG8gbWVtb3J5CiAgICAgIGJ1ZmZlciAoYWZ0ZXIgdXNpbmcgZGNyYXdfcHJvY2VzcygpIGFuZCBzbyBvbik6PC9wPgogICAgPHVsPgogICAgICA8bGk+PHN0cm9uZz5nZXRfbWVtX2ltYWdlX2Zvcm1hdDwvc3Ryb25nPiAtIGdldCByZXN1bHRpbmcgYml0bWFwIHNpemUgYW5kCiAgICAgICAgYml0IGRlcHRoLjwvbGk+CiAgICAgIDxsaT48c3Ryb25nPmNvcHlfbWVtX2ltYWdlPC9zdHJvbmc+IC0gY29weSBwb3N0cHJvY2Vzc2VkIGRhdGEgaW50byBzb21lCiAgICAgICAgbWVtb3J5IGJ1ZmZlciB3aXRoIGRpZmZlcmVudCBjb2xvciBvcmRlciBhbmQgbGluZSBzdHJpZGUuPC9saT4KICAgICAgPGxpPjxzdHJvbmc+ZGNyYXdfbWFrZV9tZW1faW1hZ2U8L3N0cm9uZz4gLSBzdG9yZSBwcm9jZXNzZWQgaW1hZ2UgZGF0YQogICAgICAgIGludG8gYWxsb2NhdGVkIGJ1ZmZlcjs8L2xpPgogICAgICA8bGk+PHN0cm9uZz5kY3Jhd19tYWtlX21lbV90aHVtYjwvc3Ryb25nPiAtIHN0b3JlIGV4dHJhY3RlZCB0aHVtYm5haWwgaW50bwogICAgICAgIGJ1ZmZlciBhcyBKUEVHLWZpbGUgaW1hZ2UgKGZvciBtb3N0IGNhbWVyYXMpIG9yIGFzIFJHQi1iaXRtYXAuPC9saT4KICAgIDwvdWw+CiAgICA8cD5Gb3IgdXNhZ2UgcHJpbWVyIHNlZSBzYW1wbGVzL21lbV9pbWFnZS5jIHNhbXBsZS48L3A+CiAgICA8cD48YSBuYW1lPSJnZXRfbWVtX2ltYWdlX2Zvcm1hdCI+PC9hPjwvcD4KICAgIDxoMz52b2lkIGdldF9tZW1faW1hZ2VfZm9ybWF0KGludCAqd2lkdGhwLCBpbnQgKmhlaWdodHAsIGludCAqY29sb3JzcCwgaW50CiAgICAgICpicHApIGNvbnN0IC0gcmV0dXJuIHByb2Nlc3NpbmcgYml0bWFwIHNpemU8L2gzPgogICAgPHA+VGhpcyBmdW5jdGlvbiByZXR1cm5zIHNpemUgb2YgcG9zdHByb2Nlc3NlZCBpbWFnZTo8L3A+CiAgICA8dWw+CiAgICAgIDxsaT5JbWFnZSB3aWR0aCBpcyByZXR1cm5lZCBpbiAqd2lkdGhwOzwvbGk+CiAgICAgIDxsaT5CaXRtYXAgaGVpZ2h0IGlzIHJldHVybmVkIGluICpoZWlnaHRwOzwvbGk+CiAgICAgIDxsaT5JbWFnZSBjb2xvciBjb3VudCBpcyByZXR1cm5lZCBpbiAqY29sb3JzcDs8L2xpPgogICAgICA8bGk+Qml0cyBwZXIgcGl4ZWwgKDggb3IgMTYpIGlzIHJldHVybmVkIGluICpicHA7PC9saT4KICAgIDwvdWw+CiAgICA8cD48YSBuYW1lPSJjb3B5X21lbV9pbWFnZSI+PC9hPjwvcD4KICAgIDxoMz5pbnQgTGliUmF3Ojpjb3B5X21lbV9pbWFnZSh2b2lkKiBzY2FuMCwgaW50IHN0cmlkZSwgaW50IGJncikgLSBjb3BpZXMKICAgICAgcG9zdHByb2Nlc3NlZCBiaXRtYXAgZGF0YSBpbnRvIGJ1ZmZlcjwvaDM+CiAgICA8cD5GdW5jdGlvbiBwYXJhbWV0ZXJzOjwvcD4KICAgIDx1bD4KICAgICAgPGxpPnZvaWQgKnNjYW4wIC0gcG9pbnRlciB0byBidWZmZXIgdG8gY29weSBkYXRhIHRvLiBUaGUgYnVmZmVyIHNob3VsZCBiZQogICAgICAgIGF0IGxlYXN0IHN0cmlkZSppbWFnZV9oZWlnaHQgYnl0ZXM7PC9saT4KICAgICAgPGxpPmludCBzdHJpZGUgLSBzdHJpZGUgb2YgZWFjaCBvdGhlciBpbWFnZSBsaW5lIChyb3cpIGluIGJ5dGVzLiBVc3VhbGx5CiAgICAgICAgaW1hZ2Vfd2lkdGgqKGJpdF9wZXJfcGl4ZWwvOCkqaW1hZ2VfY29sb3JzLCBidXQgbWF5IGJlIG1vcmUgaWYgeW91IHdpc2gKICAgICAgICB0byBhbGlnbiBpbWFnZSByb3dzIHRvLCBmb3IgZXhhbXBsZSwgOCBvciAxNiBvciAzMiBieXRlcyB0byBtYWtlIENQVQogICAgICAgIG1vcmUgaGFwcHkuPC9saT4KICAgICAgPGxpPmludCBiZ3IgLSBwaXhlbCBjb3B5IG9yZGVyLiBSR0IgaWYgYmdyPT0wIGFuZCBCR1Igb3RoZXJ3aXNlLjwvbGk+CiAgICA8L3VsPgogICAgPHA+VGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlciBudW1iZXIgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSA8YSBocmVmPSJBUEktbm90ZXMuaHRtbCNlcnJvcnMiPmVycm9yCiAgICAgICAgY29kZSBjb252ZW50aW9uPC9hPjogcG9zaXRpdmUgaWYgYW55IHN5c3RlbSBjYWxsIGhhcyByZXR1cm5lZCBhbiBlcnJvciwKICAgICAgbmVnYXRpdmUgKGZyb20gdGhlIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjTGliUmF3X2Vycm9ycyI+TGliUmF3CiAgICAgICAgZXJyb3IgbGlzdDwvYT4pIGlmIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIHNpdHVhdGlvbiB3aXRoaW4gTGliUmF3LjwvcD4KICAgIDxwPjxhIG5hbWU9ImRjcmF3X21ha2VfbWVtX2ltYWdlIj48L2E+PC9wPgogICAgPGgzPmxpYnJhd19wcm9jZXNzZWRfaW1hZ2VfdCAqZGNyYXdfbWFrZV9tZW1faW1hZ2UoaW50ICplcnJvcmNvZGU9TlVMTCkgLQogICAgICBzdG9yZSB1bnBhY2tlZCBhbmQgcHJvY2Vzc2VkIGltYWdlIGludG8gbWVtb3J5IGJ1ZmZlciBhcyBSR0ItYml0bWFwPC9oMz4KICAgIDxwPlRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBidWZmZXIgYW5kIHN0b3JlcyB1bnBhY2tlZC1wcmVwcm9jZXNzZWQKICAgICAgaW1hZ2UgaW50byB0aGlzIGJ1ZmZlci4gRnVuY3Rpb24gcmV0dXJucyBhbGxvY2F0ZWQgc3RydWN0dXJlIDxhIGhyZWY9IkFQSS1kYXRhc3RydWN0Lmh0bWwjbGlicmF3X3Byb2Nlc3NlZF9pbWFnZV90Ij5saWJyYXdfcHJvY2Vzc2VkX2ltYWdlX3Q8L2E+CiAgICAgIHdpdGggZmlsbGVkIGZpZWxkcy4gQWx3YXlzIHJldHVybnMgZGF0YSBhcyBSR0IgYml0bWFwIChpLmUuIDxzdHJvbmc+dHlwZTwvc3Ryb25nPgogICAgICBmaWVsZCBpcyBlcXVhbCB0byBMSUJSQVdfSU1BR0VfQklUTUFQKS48L3A+CiAgICA8cD5kY3Jhd19wcm9jZXNzKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgZGNyYXdfbWFrZV9tZW1faW1hZ2UoKTs8L3A+CiAgICA8cD5SZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBhbiBlcnJvci4gSWYgY2FsbGVyIGhhcyBwYXNzZWQgbm90LU5VTEwgdmFsdWUgYXMKICAgICAgZXJyb3Jjb2RlIHBhcmFtZXRlciwgdGhhbiAqZXJyb3Jjb2RlIHdpbGwgYmUgc2V0IHRvIGVycm9yIGNvZGUgYWNjb3JkaW5nCiAgICAgIHRvIDxhIGhyZWY9IkFQSS1ub3Rlcy5odG1sI2Vycm9ycyI+ZXJyb3IgY29kZSBjb252ZW50aW9uPC9hPi48L3A+CiAgICA8cD48c3Ryb25nPk5PVEUhPC9zdHJvbmc+IE1lbW9yeSwgYWxsb2NhdGVkIGZvciByZXR1cm4gdmFsdWUgd2lsbCBub3QgYmUKICAgICAgZnJpZWQgYXQgZGVzdHJ1Y3RvciBvciA8c3Ryb25nPkxpYlJhdzo6cmVjeWNsZTwvc3Ryb25nPiBjYWxscy4gQ2FsbGVyIG9mCiAgICAgIGRjcmF3X21ha2VfbWVtX2ltYWdlIHNob3VsZCBmcmVlIHRoaXMgbWVtb3J5IGJ5IGNhbGwgdG8gPGEgaHJlZj0iI2RjcmF3X2NsZWFyX21lbSI+TGliUmF3OjpkY3Jhd19jbGVhcl9tZW0oKTwvYT4uPC9wPgogICAgPHA+PGEgbmFtZT0iZGNyYXdfbWFrZV9tZW1fdGh1bWIiPjwvYT48L3A+CiAgICA8aDM+bGlicmF3X3Byb2Nlc3NlZF9pbWFnZV90ICpkY3Jhd19tYWtlX21lbV90aHVtYihpbnQgKmVycm9yY29kZT1OVUxMKSAtCiAgICAgIHN0b3JlIHVucGFja2VkIHRodW1ibmFpbCBpbnRvIG1lbW9yeSBidWZmZXI8L2gzPgogICAgPHA+VGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGJ1ZmZlciBhbmQgc3RvcmVzIHRodW1ibmFpbCBkYXRhIGluIGl0LgogICAgICBGdW5jdGlvbiByZXR1cm5zIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgPGEgaHJlZj0iQVBJLWRhdGFzdHJ1Y3QuaHRtbCNsaWJyYXdfcHJvY2Vzc2VkX2ltYWdlX3QiPmxpYnJhd19wcm9jZXNzZWRfaW1hZ2VfdDwvYT4KICAgICAgd2l0aCBmaWxsZWQgZmllbGRzLiBGb3IgbW9zdCBSQVcgaW1hZ2VzIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgd2lsbCBjb250YWlucwogICAgICBKUEVHIGltYWdlIChpLmUuIDxzdHJvbmc+dHlwZTwvc3Ryb25nPiBmaWVsZCBpcyBlcXVhbCB0bwogICAgICBMSUJSQVdfSU1BR0VfSlBFRykuIEZvciBzb21lIGNhbWVyYXMgd2l0aCBSR0ItYml0bWFwIHRodW1ibmFpbCAoS29kYWsKICAgICAgU0xScykgcmV0dXJuZWQgc3RydWN0dXJlIGNvbnRhaW5zIFJHQiBiaXRtYXAgKDxzdHJvbmc+dHlwZTwvc3Ryb25nPiBmaWVsZAogICAgICBpcyBlcXVhbCB0byBMSUJSQVdfSU1BR0VfSlBFRywgc2VlIHN0cnVjdHVyZSBkZXNjcmlwdGlvbiBmb3IgZGV0YWlscykuPC9wPgogICAgPHA+dW5wYWNrX3RodW1iKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgZGNyYXdfbWFrZV9tZW1fdGh1bWIoKTs8L3A+CiAgICA8cD5SZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBhbiBlcnJvci4gSWYgY2FsbGVyIGhhcyBwYXNzZWQgbm90LU5VTEwgdmFsdWUgYXMKICAgICAgZXJyb3Jjb2RlIHBhcmFtZXRlciwgdGhhbiAqZXJyb3Jjb2RlIHdpbGwgYmUgc2V0IHRvIGVycm9yIGNvZGUgYWNjb3JkaW5nCiAgICAgIHRvIPEgPGEgaHJlZj0iQVBJLW5vdGVzLmh0bWwjZXJyb3JzIj5lcnJvciBjb2RlIGNvbnZlbnRpb248L2E+LjwvcD4KICAgIDxwPjxzdHJvbmc+Tk9URSE8L3N0cm9uZz4gTWVtb3J5LCBhbGxvY2F0ZWQgZm9yIHJldHVybiB2YWx1ZSB3aWxsIG5vdCBiZQogICAgICBmcmllZCBhdCBkZXN0cnVjdG9yIG9yIDxzdHJvbmc+TGliUmF3OjpyZWN5Y2xlPC9zdHJvbmc+IGNhbGxzLiBDYWxsZXIgb2YKICAgICAgZGNyYXdfbWFrZV9tZW1faW1hZ2Ugc2hvdWxkIGZyZWUgdGhpcyBtZW1vcnkgYnkgY2FsbCB0byA8YSBocmVmPSIjZGNyYXdfY2xlYXJfbWVtIj5MaWJSYXc6OmRjcmF3X2NsZWFyX21lbSgpPC9hPi48L3A+CiAgICA8aDM+dm9pZCBMaWJSYXc6OmRjcmF3X2NsZWFyX21lbShsaWJyYXdfcHJvY2Vzc2VkX2ltYWdlX3QgKik8L2gzPgogICAgPHA+VGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgPHN0cm9uZz5kY3Jhd19tYWtlX21lbV9pbWFnZTwvc3Ryb25nPgogICAgICBvciA8c3Ryb25nPmRjcmF3X21ha2VfbWVtX3RodW1iPC9zdHJvbmc+LjwvcD4KICAgIDxwPlRoaXMgaXMgc3RhdGljIGNsYXNzIG1lbWJlciwgc28gY2FsbCBzeW50YXggc2hvdWxkIGJlCiAgICAgIExpYlJhdzo6ZGNyYXdfY2xlYXJfbWVtKC4uLikuPC9wPgogICAgPHA+VGhpcyBjYWxsIHRyYW5zbGF0ZXMgZGlyZWN0bHkgdG8gZnJlZSgpIHN5c3RlbSBmdW5jdGlvbiwgYnV0IGl0IGlzIGJldHRlcgogICAgICB0byB1c2UgZGNyYXdfY2xlYXJfbWVtIGJlY2F1c2UgTGliUmF3IChETEwpIG1heSBiZSBjb21waWxlZCB3aXRoIG1lbW9yeQogICAgICBtYW5hZ2VyIG90aGVyIHRoYW4gaW4gY2FsbGluZyBhcHBsaWNhdGlvbi48L3A+CiAgICA8cD48YSBuYW1lPSJkYXRhc3RyZWFtIj48L2E+PC9wPgogICAgPGgyPklucHV0IGxheWVyIGFic3RyYWN0aW9uPC9oMj4KICAgIDxwPjxhIG5hbWU9IkxpYlJhd19hYnN0cmFjdF9kYXRhc3RyZWFtIj48L2E+PC9wPgogICAgPGgzPmNsYXNzIExpYlJhd19hYnN0cmFjdF9kYXRhc3RyZWFtIC0gYWJzdHJhY3QgUkFXIHJlYWQgaW50ZXJmYWNlPC9oMz4KICAgIDxwPkxpYlJhdyByZWFkcyBSQVctZGF0YSBieSBjYWxsaW5nICh2aXJ0dWFsKSBtZXRob2RzIG9mIEMrKyBvYmplY3QgZGVyaXZlZAogICAgICBmcm9tIDxzdHJvbmc+TGliUmF3X2Fic3RyYWN0X2RhdGFzdHJlYW08L3N0cm9uZz4uIFRoaXMgQysrIGNsYXNzIGRvZXMgbm90CiAgICAgIGltcGxlbWVudCBhbnkgcmVhZCwgYnV0IGRlZmluZXMgaW50ZXJmYWNlIHRvIGJlIGNhbGxlZC4gQ2FsbCB0byBiYXNlIGNsYXNzCiAgICAgIG1ldGhvZHMgYWx3YXlzIHJlc3VsdHMgaW4gZXJyb3IuPC9wPgogICAgPHA+PGEgbmFtZT0iZGF0YXN0cmVhbV9tZXRob2RzIj48L2E+PC9wPgogICAgPGg0PkxpYlJhd19hYnN0cmFjdF9kYXRhc3RyZWFtIGNsYXNzIG1ldGhvZHM8L2g0PgogICAgPHA+PGEgbmFtZT0iZGF0YXN0cmVhbV9tZXRob2RzX3V0aWxpdHkiPjwvYT48L3A+CiAgICA8aDU+T2JqZWN0IHZlcmlmaWNhdGlvbjwvaDU+CiAgICA8ZGw+CiAgICAgIDxkdD48c3Ryb25nPiB2aXJ0dWFsIGludCB2YWxpZCgpPC9zdHJvbmc+PC9kdD4KICAgICAgPGRkPkNoZWNrcyBpbnB1dCBkYXRhc3RyZWFtIHZhbGlkaXR5LiBSZXR1cm5zIDEgb24gdmFsaWQgc3RyZWFtIGFuZCAwIGlmCiAgICAgICAgZGF0YXN0cmVhbSB3YXMgY3JlYXRlZCBvbiBub24tdmFsaWQgaW5wdXQgcGFyYW1ldGVycyAod3JvbmcgZmlsZW5hbWUgZm9yCiAgICAgICAgZmlsZSBzdHJlYW0gYW5kIHNvIG9uKS48L2RkPgogICAgPC9kbD4KICAgIDxwPjxhIG5hbWU9ImRhdGFzdHJlYW1fbWV0aG9kc19yZWFkIj48L2E+PC9wPgogICAgPGg1PlN0cmVhbSByZWFkIGFuZCBwb3NpdGlvbmluZzwvaDU+CiAgICA8cD5UaGlzIGdyb3VwIG9mIG1ldGhvZHMgaW1wbGVtZW50cyBmaWxlIG9iamVjdCAoRklMRSopIHNlbWFudGljcy48L3A+CiAgICA8ZGw+CiAgICAgIDxkdD48c3Ryb25nPnZpcnR1YWwgaW50IHJlYWQodm9pZCAqIHB0cixzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iKTwvc3Ryb25nPjwvZHQ+CiAgICAgIDxkZD5TaW1pbGFyIHRvIGZyZWFkKHB0cixzaXplLG5tZW1iLGZpbGUpLjwvZGQ+CiAgICAgIDxkdD48c3Ryb25nPnZpcnR1YWwgaW50IHNlZWsob2ZmX3QgbywgaW50IHdoZW5jZSk8L3N0cm9uZz48L2R0PgogICAgICA8ZGQ+U2ltaWxhciB0byBmc2VlayhmaWxlLG8sd2hlbmNlKS48L2RkPgogICAgICA8ZHQ+PHN0cm9uZz52aXJ0dWFsIGludCB0ZWxsKDwvc3Ryb25nPjwvZHQ+CiAgICAgIDxkZD5TaW1pbGFyIHRvIGZ0ZWxsKGZpbGUpLjwvZGQ+CiAgICAgIDxkdD48c3Ryb25nPnZpcnR1YWwgaW50IGdldF9jaGFyKCk8L3N0cm9uZz48L2R0PgogICAgICA8ZGQ+U2ltaWxhciB0byBnZXRjKGZpbGUpL2ZnZXRjKGZpbGUpLjwvZGQ+CiAgICAgIDxkdD48c3Ryb25nPnZpcnR1YWwgY2hhciogZ2V0cyhjaGFyICpzLCBpbnQgbik8L3N0cm9uZz48L2R0PgogICAgICA8ZGQ+U2ltaWxhciB0byBmZ2V0cyhzLG4sZmlsZSkuPC9kZD4KICAgICAgPGR0PjxzdHJvbmc+dmlydHVhbCBpbnQgZW9mKCk8L3N0cm9uZz48L2R0PgogICAgICA8ZGQ+U2ltaWxhciB0byBmZW9mKGZpbGUpLjwvZGQ+CiAgICAgIDxkdD48c3Ryb25nPnZpcnR1YWwgaW50IHNjYW5mX29uZShjb25zdCBjaGFyICpmbXQsIHZvaWQgKnZhbCk8L3N0cm9uZz48L2R0PgogICAgICA8ZGQ+U2ltcGxpZmllZCB2YXJpYW50IG9mIGZzY2FuZihmaWxlLGZtdCx2YWwpOiBmb3JtYXQgc3RyaW5nIGlzIGFsd2F5cwogICAgICAgIGNvbnRhaW5zIG9uZSBhcmd1bWVudCB0byByZWFkLiBTbywgdmFyaWFibGUgYXJncyBjYWxsIGlzIG5vdCBuZWVkZWQgYW5kCiAgICAgICAgb25seSBvbmUgcG9pbnRlciB0byBkYXRhIHBhc3NlZC48L2RkPgogICAgICA8ZHQ+PHN0cm9uZz4gdmlydHVhbCBpbnQganBlZ19zcmModm9pZCAqIHApOzwvc3Ryb25nPjwvZHQ+CiAgICAgIDxkZD5Jbml0aWFsaXplcyByZWFkIHN0cnVjdHVyZXMgaW4gal9kZWNvbXByZXNzX3B0ciBvYmplY3QgcGFzc2VkIGFzICpwLgogICAgICAgIFRoaXMgb2JqZWN0IGlzIHVzZWQgYnkgbGlianBlZyBmb3IgSlBFRyBkYXRhIHJlYWRpbmcgZnJvbSBkYXRhc3RyZWFtLgogICAgICAgIDxwPlJldHVybnMgLTEgb24gZXJyb3IgYW5kIDAgb24gc3VjY2Vzcy48L3A+CiAgICAgIDwvZGQ+CiAgICA8L2RsPgogICAgPHA+PGEgbmFtZT0iZGF0YXN0cmVhbV9tZXRob2RzX290aGVyIj48L2E+PC9wPgogICAgPGg1Pk90aGVyIG1ldGhvZHM8L2g1PgogICAgPHA+VGhpcyBncm91cCBvZiBtZXRob2RzIGluY2x1ZGVzIHNldmVyYWwgc3VwcGxlbWVudGFyeSBjYWxscy4gVGhlc2UgY2FsbHMKICAgICAgYXJlIHVzZWQgdG8gdGVtcG9yYXJ5IHN3aXRjaCB0byBhbm90aGVyIGRhdGEgc3RyZWFtIChmaWxlIGFuZC9vciBtZW1vcnkKICAgICAgYnVmZmVyKS48L3A+CiAgICA8ZGw+CiAgICAgIDxkdD48c3Ryb25nPnZpcnR1YWwgY29uc3QgY2hhciogZm5hbWUoKTwvc3Ryb25nPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIG5hbWUgb2Ygb3BlbmVkIGZpbGUgaWYgZGF0YXN0cmVhbSBvYmplY3Qga25vd3MgaXQgKGZvcgogICAgICAgIGV4YW1wbGUsIDxzdHJvbmc+TGliUmF3X2ZpbGVfZGF0YXN0cmVhbTwvc3Ryb25nPiB1c2VkKS4gRmlsZW5hbWUgdXNlZAogICAgICAgIGluOgogICAgICAgIDx1bD4KICAgICAgICAgIDxsaT5lcnJvciBub3RpZmljYXRpb24gY2FsbGJhY2tzOzwvbGk+CiAgICAgICAgICA8bGk+Z2VuZXJhdGlvbiBvZiBmaWxlbmFtZSBvZiBKUEVHLWZpbGUgd2l0aCBtZXRhZGF0YSB3aGVuIG5lZWRlZAogICAgICAgICAgICAoaS5lLiBjYW1lcmFzIHdpdGggJ0RpYWcgUkFXIGhhY2snKS48L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGQ+CiAgICAgIDxkdD48c3Ryb25nPnZpcnR1YWwgYm9vbCBpc19idWZmZXJlZCgpOzwvc3Ryb25nPjxicj4KICAgICAgICA8c3Ryb25nPnZpcnR1YWwgYm9vbCBidWZmZXJpbmdfb24oKTs8L3N0cm9uZz48YnI+CiAgICAgICAgPHN0cm9uZz52aXJ0dWFsIGJvb2wgYnVmZmVyaW5nX29mZigpOzwvc3Ryb25nPiA8L2R0PgogICAgICA8ZGQ+Q2hlY2tzLCB0dXJucyBvbi9vZmYgaW50ZXJuYWwgYnVmZmVyaW5nIChpZiBpbXBsZW1lbnRlZCBieQogICAgICAgIGltcGxlbWVudGF0aW9uKSA8L2RkPgogICAgPC9kbD4KICAgIDxwPjxhIG5hbWU9ImRhdGFzdHJlYW1fZGVyaXZlZCI+PC9hPjwvcD4KICAgIDxoMz5EZXJpdmVkIGlucHV0IGNsYXNzZXMgaW5jbHVkZWQgaW4gTGliUmF3PC9oMz4KICAgIDxwPlRoZXJlIGlzIHRocmVlICJzdGFuZGFyZCIgaW5wdXQgY2xhc3NlcyBpbiBMaWJSYXcgZGlzdHJpYnV0aW9uOjwvcD4KICAgIDx1bD4KICAgICAgPGxpPjxhIGhyZWY9IiNmaWxlX2RhdGFzdHJlYW0iPkxpYlJhd19maWxlX2RhdGFzdHJlYW08L2E+IGltcGxlbWVudHMgaW5wdXQKICAgICAgICBmcm9tIGZpbGUgKGluIGZpbGVzeXN0ZW0pLjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjYmlnZmlsZV9kYXRhc3RyZWFtIj5MaWJSYXdfYmlnZmlsZV9kYXRhc3RyZWFtPC9hPiBzbG93ZXIKICAgICAgICBJL08sIGJ1dCBmaWxlcyBsYXJnZXIgdGhhbiAyR2IgYXJlIHN1cHBvcnRlZC48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iI2J1ZmZlcl9kYXRhc3RyZWFtIj5MaWJSYXdfYnVmZmVyX2RhdGFzdHJlYW08L2E+IGltcGxlbWVudHMKICAgICAgICBpbnB1dCBmcm9tIG1lbW9yeSBidWZmZXIuPC9saT4KICAgIDwvdWw+CiAgICA8cD5MaWJSYXcgQysrIGludGVyZmFjZSB1c2VycyBjYW4gaW1wbGVtZW50IHRoZWlyIG93biBpbnB1dCBjbGFzc2VzIGFuZCB1c2UKICAgICAgdGhlbSB2aWEgPGEgaHJlZj0iI29wZW5fZGF0YXN0cmVhbSI+TGliUmF3OjpvcGVuX2RhdGFzdHJlYW08L2E+IGNhbGwuCiAgICAgIFJlcXVpcmVtZW50cyBhbmQgaW1wbGVtZW50YXRpb24gc3BlY2lmaWNzIGFyZSBkZXNjcmliZWQgYmVsb3cuPC9wPgogICAgPHA+PGEgbmFtZT0iZmlsZV9kYXRhc3RyZWFtIj48L2E+PC9wPgogICAgPGg0PmNsYXNzIExpYlJhd19maWxlX2RhdGFzdHJlYW0gLSBmaWxlIGlucHV0IGludGVyZmFjZTwvaDQ+CiAgICA8cD5UaGlzIGNsYXNzIGltcGxlbWVudHMgaW5wdXQgZnJvbSBmaWxlLjwvcD4KICAgIDxwPjxzdHJvbmc+Q2xhc3MgbWV0aG9kczo8L3N0cm9uZz48L3A+CiAgICA8ZGw+CiAgICAgIDxkdD48c3Ryb25nPiBMaWJSYXdfZmlsZV9kYXRhc3RyZWFtKGNvbnN0IGNoYXIgKmZuYW1lKSA8L3N0cm9uZz48L2R0PgogICAgICA8ZGQ+VGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIDxzdHJvbmc+TGliUmF3X2ZpbGVfZGF0YXN0cmVhbTwvc3Ryb25nPgogICAgICAgIG9iamVjdCBmcm9tIGZpbGUgPHN0cm9uZz5mbmFtZTwvc3Ryb25nPi48YnI+CiAgICAgICAgVW5mb3J0dW5hdGVseSwgQysrIGNvbnN0cnVjdG9yIGNhbm5vdCByZXR1cm4gYW4gZXJyb3IuIFNvIGlmIGJhZAogICAgICAgIGZpbGVuYW1lIHBhc3NlZCAoZS5nLiBub25leGlzdGVudCBmaWxlKSBvYmplY3QgaXMgY3JlYXRlZCBhcyBub24tdmFsaWQKICAgICAgICAodmFsaWQoKSBjYWxsIHJldHVybnMgemVybykuPC9kZD4KICAgIDwvZGw+CiAgICA8cD5BbGwgb3RoZXIgY2xhc3MgbWV0aG9kcyBhcmUgPGEgaHJlZj0iI2RhdGFzdHJlYW1fbWV0aG9kcyI+ZGVzY3JpYmVkCiAgICAgICAgYWJvdmU8L2E+Ljxicj4KICAgICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGFsbCBwb3NzaWJsZSBtZXRob2RzLCBpbmNsdWRpbmcgZm5hbWUoKSBhbmQKICAgICAgc3ViZmlsZV9vcGVuKCkuPC9wPgogICAgPHA+PGEgbmFtZT0iYmlnZmlsZV9kYXRhc3RyZWFtIj48L2E+PC9wPgogICAgPGg0PmNsYXNzIExpYlJhd19iaWdmaWxlX2RhdGFzdHJlYW0gLSBmaWxlIGlucHV0IGludGVyZmFjZTwvaDQ+CiAgICA8cD5UaGlzIGNsYXNzIGltcGxlbWVudHMgaW5wdXQgZnJvbSBmaWxlLjwvcD4KICAgIDxwPjxzdHJvbmc+Q2xhc3MgbWV0aG9kczo8L3N0cm9uZz48L3A+CiAgICA8ZGw+CiAgICAgIDxkdD48c3Ryb25nPiBMaWJSYXdfYmlnZmlsZV9kYXRhc3RyZWFtKGNvbnN0IGNoYXIgKmZuYW1lKSA8L3N0cm9uZz48L2R0PgogICAgICA8ZGQ+VGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIDxzdHJvbmc+TGliUmF3X2JpZ2ZpbGVfZGF0YXN0cmVhbTwvc3Ryb25nPgogICAgICAgIG9iamVjdCBmcm9tIGZpbGUgPHN0cm9uZz5mbmFtZTwvc3Ryb25nPi48YnI+CiAgICAgICAgVW5mb3J0dW5hdGVseSwgQysrIGNvbnN0cnVjdG9yIGNhbm5vdCByZXR1cm4gYW4gZXJyb3IuIFNvIGlmIGJhZAogICAgICAgIGZpbGVuYW1lIHBhc3NlZCAoZS5nLiBub25leGlzdGVudCBmaWxlKSBvYmplY3QgaXMgY3JlYXRlZCBhcyBub24tdmFsaWQKICAgICAgICAodmFsaWQoKSBjYWxsIHJldHVybnMgemVybykuPC9kZD4KICAgIDwvZGw+CiAgICA8cD5UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDxzdHJvbmc+ZmlsZTwvc3Ryb25nPiBhbmQgPHN0cm9uZz5iaWdmaWxlPC9zdHJvbmc+CiAgICAgIGRhdGFzdHJlYW1zIGFyZSBvYnZpb3VzIGZyb20gY2xhc3MgbmFtZTogYmlnZmlsZSBvbmUgc3VwcG9ydHMgbGFyZ2UgZmlsZXMKICAgICAgKG1vcmUgdGhhbiAyR2IpIG9uIGFsbCBzdXBwb3J0ZWQgc3lzdGVtcy4gRmlsZSBvbmUgdXNlcyBzdHJlYW1idWYKICAgICAgaW50ZXJmYWNlIHdoaWNoIGlzIGxpbWl0ZWQgdG8gMkdiIG9uIG1hbnkgc3lzdGVtcy48L3A+CiAgICA8cD5BbGwgb3RoZXIgY2xhc3MgbWV0aG9kcyBhcmUgPGEgaHJlZj0iI2RhdGFzdHJlYW1fbWV0aG9kcyI+ZGVzY3JpYmVkCiAgICAgICAgYWJvdmU8L2E+Ljxicj4KICAgICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGFsbCBwb3NzaWJsZSBtZXRob2RzLCBpbmNsdWRpbmcgZm5hbWUoKSBhbmQKICAgICAgc3ViZmlsZV9vcGVuKCkuPC9wPgogICAgPHA+PGEgbmFtZT0iYnVmZmVyX2RhdGFzdHJlYW0iPjwvYT48L3A+CiAgICA8aDQ+Y2xhc3MgTGliUmF3X2J1ZmZlcl9kYXRhc3RyZWFtIC0gbWVtb3J5IGJ1ZmZlciBpbnB1dCBpbnRlcmZhY2U8L2g0PgogICAgPHA+VGhpcyBjbGFzcyBpbXBsZW1lbnRzIGlucHV0IGZyb20gbWVtb3J5IGJ1ZmZlci48L3A+CiAgICA8cD48c3Ryb25nPkNsYXNzIG1ldGhvZHM6PC9zdHJvbmc+PC9wPgogICAgPGRsPgogICAgICA8ZHQ+PHN0cm9uZz4gTGliUmF3X2J1ZmZlcl9kYXRhc3RyZWFtKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJzaXplKTwvc3Ryb25nPjwvZHQ+CiAgICAgIDxkZD5UaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgZGF0YXN0cmVhbSBvYmplY3QgZnJvbSA8c3Ryb25nPmJ1ZmZlcjwvc3Ryb25nPgogICAgICAgIHdpdGggc2l6ZSA8c3Ryb25nPmJzaXplPC9zdHJvbmc+Ljxicj4KICAgICAgICBJdCBpcyBub3QgcG9zc2libHkgdG8gdmVyaWZ5IHRoZSBwb2ludGVyIHBhc3NlZCwgc28gYnVmZmVyIGFkZHJlc3MgaXMKICAgICAgICBjaGVja2VkIGFnYWluc3QgMCBhbmQgLTEgb25seS48L2RkPgogICAgPC9kbD4KICAgIDxwPkFsbCBvdGhlciBjbGFzcyBtZXRob2RzIGFyZSA8YSBocmVmPSIjZGF0YXN0cmVhbV9tZXRob2RzIj5kZXNjcmliZWQKICAgICAgICBhYm92ZTwvYT4uPGJyPgogICAgICBUaGlzIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudCBmbmFtZSgpIGFuZCBzdWJmaWxlX29wZW4oKSBjYWxscywgc28KICAgICAgZXh0ZXJuYWwgSlBFRyBtZXRhZGF0YSBwYXJzaW5nIGlzIG5vdCBwb3NzaWJsZS48L3A+CiAgICA8cD48YSBuYW1lPSJvd25fZGF0YXN0cmVhbXMiPjwvYT48L3A+CiAgICA8aDM+T3duIGRhdGFzdHJlYW0gZGVyaXZlZCBjbGFzc2VzPC9oMz4KICAgIDxwPlRvIGNyZWF0ZSBvd24gcmVhZCBpbnRlcmZhY2UgTGliUmF3IHVzZXIgc2hvdWxkIGltcGxlbWVudCBDKysgY2xhc3MKICAgICAgZGVyaXZlZCBmcm9tIDxzdHJvbmc+TGliUmF3X2Fic3RyYWN0X2RhdGFzdHJlYW08L3N0cm9uZz4gd2l0aCBhbGwgcmVhZAogICAgICBtZXRob2RzLjxicj4KICAgICAgTGliUmF3IHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBtYXkgYmUgdXNlZCBhcyByZWZlcmVuY2UuIFNlZSA8c3Ryb25nPmxpYnJhdy9saWJyYXdfZGF0YXN0cmVhbS5oPC9zdHJvbmc+CiAgICAgIGZpbGUgZm9yIGRldGFpbHMgKGFsbCBzdGFuZGFyZCBMaWJSYXcgaW5wdXQgY2xhc3NlcyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcKICAgICAgaW5saW5lIGZ1bmN0aW9ucyBvbmx5KS48L3A+CiAgICA8cD48YSBuYW1lPSJzdWJzdHJlYW0iPjwvYT48L3A+CiAgICA8cD48YSBocmVmPSJpbmRleC5odG1sIj5bYmFjayB0byBJbmRleF08L2E+PC9wPgogIDwvYm9keT4KPC9odG1sPgo=